Merge remote branch 'origin/master' into radeon-rewrite
[mesa.git] / src / mesa / drivers / dri / r300 / r300_state.c
index c192fecca498651b5644a7e84ea2bd2ad41d05c9..93ef06fb268675d5ee8b678c81fe80b7d44a1b77 100644 (file)
@@ -53,8 +53,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "vbo/vbo.h"
 #include "tnl/tnl.h"
 
-#include "radeon_ioctl.h"
-#include "radeon_state.h"
 #include "r300_context.h"
 #include "r300_ioctl.h"
 #include "r300_state.h"
@@ -590,7 +588,7 @@ static void r300SetStencilState(GLcontext * ctx, GLboolean state)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
 
-       if (r300->state.stencil.hw_stencil) {
+       if (r300->radeon.state.stencil.hwBuffer) {
                R300_STATECHANGE(r300, zs);
                if (state) {
                        r300->hw.zs.cmd[R300_ZS_CNTL_0] |=
@@ -1068,10 +1066,10 @@ static void r300UpdateWindow(GLcontext * ctx)
        GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;
        GLfloat sy = -v[MAT_SY];
        GLfloat ty = (-v[MAT_TY]) + yoffset + SUBPIXEL_Y;
-       GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale;
-       GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale;
+       GLfloat sz = v[MAT_SZ] * rmesa->radeon.state.depth.scale;
+       GLfloat tz = v[MAT_TZ] * rmesa->radeon.state.depth.scale;
 
-       R300_FIREVERTICES(rmesa);
+       radeon_firevertices(&rmesa->radeon);
        R300_STATECHANGE(rmesa, vpt);
 
        rmesa->hw.vpt.cmd[R300_VPT_XSCALE] = r300PackFloat32(sx);
@@ -1085,10 +1083,19 @@ static void r300UpdateWindow(GLcontext * ctx)
 static void r300Viewport(GLcontext * ctx, GLint x, GLint y,
                         GLsizei width, GLsizei height)
 {
+       r300ContextPtr rmesa = R300_CONTEXT(ctx);
+    __DRIcontext *driContext = rmesa->radeon.dri.context;
        /* Don't pipeline viewport changes, conflict with window offset
         * setting below.  Could apply deltas to rescue pipelined viewport
         * values, or keep the originals hanging around.
         */
+    if (rmesa->radeon.radeonScreen->driScreen->dri2.enabled) {
+        radeon_update_renderbuffers(driContext, driContext->driDrawablePriv);
+        if (driContext->driDrawablePriv != driContext->driReadablePriv) {
+            radeon_update_renderbuffers(driContext,
+                                        driContext->driReadablePriv);
+        }
+    }
        r300UpdateWindow(ctx);
 }
 
@@ -1129,55 +1136,25 @@ void r300UpdateViewportOffset(GLcontext * ctx)
 void r300UpdateDrawBuffer(GLcontext * ctx)
 {
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
-       r300ContextPtr r300 = rmesa;
        struct gl_framebuffer *fb = ctx->DrawBuffer;
-       driRenderbuffer *drb;
+       struct radeon_renderbuffer *rrb;
 
        if (fb->_ColorDrawBufferIndexes[0] == BUFFER_FRONT_LEFT) {
                /* draw to front */
-               drb =
-                   (driRenderbuffer *) fb->Attachment[BUFFER_FRONT_LEFT].
-                   Renderbuffer;
+               rrb =
+                   (void *) fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
        } else if (fb->_ColorDrawBufferIndexes[0] == BUFFER_BACK_LEFT) {
                /* draw to back */
-               drb =
-                   (driRenderbuffer *) fb->Attachment[BUFFER_BACK_LEFT].
-                   Renderbuffer;
+               rrb = (void *) fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
        } else {
                /* drawing to multiple buffers, or none */
                return;
        }
 
-       assert(drb);
-       assert(drb->flippedPitch);
+       assert(rrb);
+       assert(rrb->pitch);
 
        R300_STATECHANGE(rmesa, cb);
-
-       r300->hw.cb.cmd[R300_CB_OFFSET] = drb->flippedOffset +  //r300->radeon.state.color.drawOffset +
-           r300->radeon.radeonScreen->fbLocation;
-       r300->hw.cb.cmd[R300_CB_PITCH] = drb->flippedPitch;     //r300->radeon.state.color.drawPitch;
-
-       if (r300->radeon.radeonScreen->cpp == 4)
-               r300->hw.cb.cmd[R300_CB_PITCH] |= R300_COLOR_FORMAT_ARGB8888;
-       else
-               r300->hw.cb.cmd[R300_CB_PITCH] |= R300_COLOR_FORMAT_RGB565;
-
-       if (r300->radeon.sarea->tiling_enabled)
-               r300->hw.cb.cmd[R300_CB_PITCH] |= R300_COLOR_TILE_ENABLE;
-#if 0
-       R200_STATECHANGE(rmesa, ctx);
-
-       /* Note: we used the (possibly) page-flipped values */
-       rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET]
-           = ((drb->flippedOffset + rmesa->r200Screen->fbLocation)
-              & R200_COLOROFFSET_MASK);
-       rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = drb->flippedPitch;
-
-       if (rmesa->sarea->tiling_enabled) {
-               rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |=
-                   R200_COLOR_TILE_ENABLE;
-       }
-#endif
 }
 
 static void
@@ -1397,7 +1374,8 @@ static void r300SetupFragmentShaderTextures(GLcontext *ctx, int *tmu_mappings)
        }
 
        r300->hw.fpt.cmd[R300_FPT_CMD_0] =
-               cmdpacket0(R300_US_TEX_INST_0, code->tex.length);
+               cmdpacket0(r300->radeon.radeonScreen,
+                   R300_US_TEX_INST_0, code->tex.length);
 }
 
 static void r500SetupFragmentShaderTextures(GLcontext *ctx, int *tmu_mappings)
@@ -1448,7 +1426,7 @@ static GLuint translate_lod_bias(GLfloat bias)
 static void r300SetupTextures(GLcontext * ctx)
 {
        int i, mtu;
-       struct r300_tex_obj *t;
+       struct radeon_tex_obj *t;
        r300ContextPtr r300 = R300_CONTEXT(ctx);
        int hw_tmu = 0;
        int last_hw_tmu = -1;   /* -1 translates into no setup costs for fields */
@@ -1482,21 +1460,16 @@ static void r300SetupTextures(GLcontext * ctx)
        /* We cannot let disabled tmu offsets pass DRM */
        for (i = 0; i < mtu; i++) {
                if (ctx->Texture.Unit[i]._ReallyEnabled) {
-
-#if 0                          /* Enables old behaviour */
-                       hw_tmu = i;
-#endif
                        tmu_mappings[i] = hw_tmu;
 
-                       t = r300->state.texture.unit[i].texobj;
-                       /* XXX questionable fix for bug 9170: */
+                       t = radeon_tex_obj(ctx->Texture.Unit[i]._Current);
                        if (!t)
                                continue;
 
-                       if ((t->format & 0xffffff00) == 0xffffff00) {
+                       if ((t->pp_txformat & 0xffffff00) == 0xffffff00) {
                                WARN_ONCE
                                    ("unknown texture format (entry %x) encountered. Help me !\n",
-                                    t->format & 0xff);
+                                    t->pp_txformat & 0xff);
                        }
 
                        if (RADEON_DEBUG & DEBUG_STATE)
@@ -1507,29 +1480,28 @@ static void r300SetupTextures(GLcontext * ctx)
 
                        r300->hw.tex.filter.cmd[R300_TEX_VALUE_0 +
                                                hw_tmu] =
-                           gen_fixed_filter(t->filter) | (hw_tmu << 28);
+                           gen_fixed_filter(t->pp_txfilter) | (hw_tmu << 28);
                        /* Note: There is a LOD bias per texture unit and a LOD bias
                         * per texture object. We add them here to get the correct behaviour.
                         * (The per-texture object LOD bias was introduced in OpenGL 1.4
                         * and is not present in the EXT_texture_object extension).
                         */
                        r300->hw.tex.filter_1.cmd[R300_TEX_VALUE_0 + hw_tmu] =
-                               t->filter_1 |
-                               translate_lod_bias(ctx->Texture.Unit[i].LodBias + t->base.tObj->LodBias);
+                               t->pp_txfilter_1 |
+                               translate_lod_bias(ctx->Texture.Unit[i].LodBias + t->base.LodBias);
                        r300->hw.tex.size.cmd[R300_TEX_VALUE_0 + hw_tmu] =
-                           t->size;
+                           t->pp_txsize;
                        r300->hw.tex.format.cmd[R300_TEX_VALUE_0 +
-                                               hw_tmu] = t->format;
+                                               hw_tmu] = t->pp_txformat;
                        r300->hw.tex.pitch.cmd[R300_TEX_VALUE_0 + hw_tmu] =
-                           t->pitch_reg;
-                       r300->hw.tex.offset.cmd[R300_TEX_VALUE_0 +
-                                               hw_tmu] = t->offset;
+                         t->pp_txpitch;
+                       r300->hw.textures[hw_tmu] = t;
 
-                       if (t->offset & R300_TXO_MACRO_TILE) {
+                       if (t->tile_bits & R300_TXO_MACRO_TILE) {
                                WARN_ONCE("macro tiling enabled!\n");
                        }
 
-                       if (t->offset & R300_TXO_MICRO_TILE) {
+                       if (t->tile_bits & R300_TXO_MICRO_TILE) {
                                WARN_ONCE("micro tiling enabled!\n");
                        }
 
@@ -1546,21 +1518,21 @@ static void r300SetupTextures(GLcontext * ctx)
        }
 
        r300->hw.tex.filter.cmd[R300_TEX_CMD_0] =
-           cmdpacket0(R300_TX_FILTER0_0, last_hw_tmu + 1);
+           cmdpacket0(r300->radeon.radeonScreen, R300_TX_FILTER0_0, last_hw_tmu + 1);
        r300->hw.tex.filter_1.cmd[R300_TEX_CMD_0] =
-           cmdpacket0(R300_TX_FILTER1_0, last_hw_tmu + 1);
+           cmdpacket0(r300->radeon.radeonScreen, R300_TX_FILTER1_0, last_hw_tmu + 1);
        r300->hw.tex.size.cmd[R300_TEX_CMD_0] =
-           cmdpacket0(R300_TX_SIZE_0, last_hw_tmu + 1);
+           cmdpacket0(r300->radeon.radeonScreen, R300_TX_SIZE_0, last_hw_tmu + 1);
        r300->hw.tex.format.cmd[R300_TEX_CMD_0] =
-           cmdpacket0(R300_TX_FORMAT_0, last_hw_tmu + 1);
+           cmdpacket0(r300->radeon.radeonScreen, R300_TX_FORMAT_0, last_hw_tmu + 1);
        r300->hw.tex.pitch.cmd[R300_TEX_CMD_0] =
-           cmdpacket0(R300_TX_FORMAT2_0, last_hw_tmu + 1);
+           cmdpacket0(r300->radeon.radeonScreen, R300_TX_FORMAT2_0, last_hw_tmu + 1);
        r300->hw.tex.offset.cmd[R300_TEX_CMD_0] =
-           cmdpacket0(R300_TX_OFFSET_0, last_hw_tmu + 1);
+           cmdpacket0(r300->radeon.radeonScreen, R300_TX_OFFSET_0, last_hw_tmu + 1);
        r300->hw.tex.chroma_key.cmd[R300_TEX_CMD_0] =
-           cmdpacket0(R300_TX_CHROMA_KEY_0, last_hw_tmu + 1);
+           cmdpacket0(r300->radeon.radeonScreen, R300_TX_CHROMA_KEY_0, last_hw_tmu + 1);
        r300->hw.tex.border_color.cmd[R300_TEX_CMD_0] =
-           cmdpacket0(R300_TX_BORDER_COLOR_0, last_hw_tmu + 1);
+           cmdpacket0(r300->radeon.radeonScreen, R300_TX_BORDER_COLOR_0, last_hw_tmu + 1);
 
        if (!fp)                /* should only happenen once, just after context is created */
                return;
@@ -1572,7 +1544,7 @@ static void r300SetupTextures(GLcontext * ctx)
                        r300->hw.txe.cmd[R300_TXE_ENABLE] |= 1;
                        r300->hw.tex.filter.cmd[R300_TEX_VALUE_0] = 0;
                        r300->hw.tex.filter.cmd[R300_TEX_CMD_0] =
-                               cmdpacket0(R300_TX_FILTER0_0, 1);
+                               cmdpacket0(r300->radeon.radeonScreen, R300_TX_FILTER0_0, 1);
                }
                r300SetupFragmentShaderTextures(ctx, tmu_mappings);
        } else
@@ -1741,7 +1713,7 @@ static void r300SetupRSUnit(GLcontext * ctx)
          | R300_HIRES_EN;
 
        assert(high_rr >= 0);
-       r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(R300_RS_INST_0, high_rr + 1);
+       r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R300_RS_INST_0, high_rr + 1);
        r300->hw.rc.cmd[2] = high_rr;
 
        if (InputsRead)
@@ -1901,7 +1873,7 @@ static void r500SetupRSUnit(GLcontext * ctx)
          | R300_HIRES_EN;
 
        assert(high_rr >= 0);
-       r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(R500_RS_INST_0, high_rr + 1);
+       r300->hw.rr.cmd[R300_RR_CMD_0] = cmdpacket0(r300->radeon.radeonScreen, R500_RS_INST_0, high_rr + 1);
        r300->hw.rc.cmd[2] = 0xC0 | high_rr;
 
        if (InputsRead)
@@ -2099,6 +2071,7 @@ static void r300SetupRealVertexProgram(r300ContextPtr rmesa)
          (inst_count << R300_PVS_LAST_VTX_SRC_INST_SHIFT);
 }
 
+
 static void r300SetupVertexProgram(r300ContextPtr rmesa)
 {
        GLcontext *ctx = rmesa->radeon.glCtx;
@@ -2128,6 +2101,7 @@ static void r300SetupVertexProgram(r300ContextPtr rmesa)
  */
 static void r300Enable(GLcontext * ctx, GLenum cap, GLboolean state)
 {
+       r300ContextPtr rmesa = R300_CONTEXT(ctx);
        if (RADEON_DEBUG & DEBUG_STATE)
                fprintf(stderr, "%s( %s = %s )\n", __FUNCTION__,
                        _mesa_lookup_enum_by_nr(cap),
@@ -2173,8 +2147,12 @@ static void r300Enable(GLcontext * ctx, GLenum cap, GLboolean state)
        case GL_POLYGON_OFFSET_FILL:
                r300SetPolygonOffsetState(ctx, state);
                break;
+       case GL_SCISSOR_TEST:
+               radeon_firevertices(&rmesa->radeon);
+               rmesa->radeon.state.scissor.enabled = state;
+               radeonUpdateScissor( ctx );
+               break;
        default:
-               radeonEnable(ctx, cap, state);
                break;
        }
 }
@@ -2185,6 +2163,7 @@ static void r300Enable(GLcontext * ctx, GLenum cap, GLboolean state)
 static void r300ResetHwState(r300ContextPtr r300)
 {
        GLcontext *ctx = r300->radeon.glCtx;
+       struct radeon_renderbuffer *rrb;
        int has_tcl = 1;
 
        if (!(r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
@@ -2215,8 +2194,6 @@ static void r300ResetHwState(r300ContextPtr r300)
 
        r300UpdateCulling(ctx);
 
-       r300UpdateTextureState(ctx);
-
        r300SetBlendState(ctx);
        r300SetLogicOpState(ctx);
 
@@ -2363,20 +2340,6 @@ static void r300ResetHwState(r300ContextPtr r300)
 
        r300BlendColor(ctx, ctx->Color.BlendColor);
 
-       /* Again, r300ClearBuffer uses this */
-       r300->hw.cb.cmd[R300_CB_OFFSET] =
-           r300->radeon.state.color.drawOffset +
-           r300->radeon.radeonScreen->fbLocation;
-       r300->hw.cb.cmd[R300_CB_PITCH] = r300->radeon.state.color.drawPitch;
-
-       if (r300->radeon.radeonScreen->cpp == 4)
-               r300->hw.cb.cmd[R300_CB_PITCH] |= R300_COLOR_FORMAT_ARGB8888;
-       else
-               r300->hw.cb.cmd[R300_CB_PITCH] |= R300_COLOR_FORMAT_RGB565;
-
-       if (r300->radeon.sarea->tiling_enabled)
-               r300->hw.cb.cmd[R300_CB_PITCH] |= R300_COLOR_TILE_ENABLE;
-
        r300->hw.rb3d_dither_ctl.cmd[1] = 0;
        r300->hw.rb3d_dither_ctl.cmd[2] = 0;
        r300->hw.rb3d_dither_ctl.cmd[3] = 0;
@@ -2392,12 +2355,8 @@ static void r300ResetHwState(r300ContextPtr r300)
        r300->hw.rb3d_discard_src_pixel_lte_threshold.cmd[1] = 0x00000000;
        r300->hw.rb3d_discard_src_pixel_lte_threshold.cmd[2] = 0xffffffff;
 
-       r300->hw.zb.cmd[R300_ZB_OFFSET] =
-           r300->radeon.radeonScreen->depthOffset +
-           r300->radeon.radeonScreen->fbLocation;
-       r300->hw.zb.cmd[R300_ZB_PITCH] = r300->radeon.radeonScreen->depthPitch;
-
-       if (r300->radeon.sarea->tiling_enabled) {
+       rrb = r300->radeon.state.depth.rrb;
+       if (rrb && rrb->bo && (rrb->bo->flags & RADEON_BO_FLAGS_MACRO_TILE)) {
                /* XXX: Turn off when clearing buffers ? */
                r300->hw.zb.cmd[R300_ZB_PITCH] |= R300_DEPTHMACROTILE_ENABLE;
 
@@ -2440,7 +2399,7 @@ static void r300ResetHwState(r300ContextPtr r300)
                r300->hw.vps.cmd[R300_VPS_ZERO_3] = 0;
        }
 
-       r300->hw.all_dirty = GL_TRUE;
+       r300->radeon.hw.all_dirty = GL_TRUE;
 }
 
 void r300UpdateShaders(r300ContextPtr rmesa)
@@ -2451,8 +2410,8 @@ void r300UpdateShaders(r300ContextPtr rmesa)
 
        ctx = rmesa->radeon.glCtx;
 
-       if (rmesa->NewGLState && hw_tcl_on) {
-               rmesa->NewGLState = 0;
+       if (rmesa->radeon.NewGLState && hw_tcl_on) {
+               rmesa->radeon.NewGLState = 0;
 
                for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
                        rmesa->temp_attrib[i] =
@@ -2531,10 +2490,10 @@ static void r300SetupPixelShader(r300ContextPtr rmesa)
        R300_STATECHANGE(rmesa, fpi[1]);
        R300_STATECHANGE(rmesa, fpi[2]);
        R300_STATECHANGE(rmesa, fpi[3]);
-       rmesa->hw.fpi[0].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_US_ALU_RGB_INST_0, code->alu.length);
-       rmesa->hw.fpi[1].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_US_ALU_RGB_ADDR_0, code->alu.length);
-       rmesa->hw.fpi[2].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_US_ALU_ALPHA_INST_0, code->alu.length);
-       rmesa->hw.fpi[3].cmd[R300_FPI_CMD_0] = cmdpacket0(R300_US_ALU_ALPHA_ADDR_0, code->alu.length);
+       rmesa->hw.fpi[0].cmd[R300_FPI_CMD_0] = cmdpacket0(rmesa->radeon.radeonScreen, R300_US_ALU_RGB_INST_0, code->alu.length);
+       rmesa->hw.fpi[1].cmd[R300_FPI_CMD_0] = cmdpacket0(rmesa->radeon.radeonScreen, R300_US_ALU_RGB_ADDR_0, code->alu.length);
+       rmesa->hw.fpi[2].cmd[R300_FPI_CMD_0] = cmdpacket0(rmesa->radeon.radeonScreen, R300_US_ALU_ALPHA_INST_0, code->alu.length);
+       rmesa->hw.fpi[3].cmd[R300_FPI_CMD_0] = cmdpacket0(rmesa->radeon.radeonScreen, R300_US_ALU_ALPHA_ADDR_0, code->alu.length);
        for (i = 0; i < code->alu.length; i++) {
                rmesa->hw.fpi[0].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst0;
                rmesa->hw.fpi[1].cmd[R300_FPI_INSTR_0 + i] = code->alu.inst[i].inst1;
@@ -2565,7 +2524,7 @@ static void r300SetupPixelShader(r300ContextPtr rmesa)
        }
 
        R300_STATECHANGE(rmesa, fpp);
-       rmesa->hw.fpp.cmd[R300_FPP_CMD_0] = cmdpacket0(R300_PFS_PARAM_0_X, code->const_nr * 4);
+       rmesa->hw.fpp.cmd[R300_FPP_CMD_0] = cmdpacket0(rmesa->radeon.radeonScreen, R300_PFS_PARAM_0_X, code->const_nr * 4);
        for (i = 0; i < code->const_nr; i++) {
                const GLfloat *constant = get_fragmentprogram_constant(ctx,
                        &fp->mesa_program.Base, code->constant[i]);
@@ -2667,7 +2626,6 @@ void r300UpdateShaderStates(r300ContextPtr rmesa)
        GLcontext *ctx;
        ctx = rmesa->radeon.glCtx;
 
-       r300UpdateTextureState(ctx);
        r300SetEarlyZState(ctx);
 
        GLuint fgdepthsrc = R300_FG_DEPTH_SRC_SCAN;
@@ -2712,7 +2670,7 @@ static void r300InvalidateState(GLcontext * ctx, GLuint new_state)
 
        r300UpdateStateParameters(ctx, new_state);
 
-       r300->NewGLState |= new_state;
+       r300->radeon.NewGLState |= new_state;
 }
 
 /**
@@ -2725,15 +2683,13 @@ void r300InitState(r300ContextPtr r300)
        GLcontext *ctx = r300->radeon.glCtx;
        GLuint depth_fmt;
 
-       radeonInitState(&r300->radeon);
-
        switch (ctx->Visual.depthBits) {
        case 16:
-               r300->state.depth.scale = 1.0 / (GLfloat) 0xffff;
+               r300->radeon.state.depth.scale = 1.0 / (GLfloat) 0xffff;
                depth_fmt = R300_DEPTHFORMAT_16BIT_INT_Z;
                break;
        case 24:
-               r300->state.depth.scale = 1.0 / (GLfloat) 0xffffff;
+               r300->radeon.state.depth.scale = 1.0 / (GLfloat) 0xffffff;
                depth_fmt = R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
                break;
        default:
@@ -2743,8 +2699,8 @@ void r300InitState(r300ContextPtr r300)
        }
 
        /* Only have hw stencil when depth buffer is 24 bits deep */
-       r300->state.stencil.hw_stencil = (ctx->Visual.stencilBits > 0 &&
-                                         ctx->Visual.depthBits == 24);
+       r300->radeon.state.stencil.hwBuffer = (ctx->Visual.stencilBits > 0 &&
+                                              ctx->Visual.depthBits == 24);
 
        memset(&(r300->state.texture), 0, sizeof(r300->state.texture));
 
@@ -2776,12 +2732,32 @@ void r300UpdateClipPlanes( GLcontext *ctx )
        }
 }
 
+static void r300DrawBuffer( GLcontext *ctx, GLenum mode )
+{
+       r300ContextPtr rmesa = R300_CONTEXT(ctx);
+       if (RADEON_DEBUG & DEBUG_DRI)
+               fprintf(stderr, "%s %s\n", __FUNCTION__,
+                       _mesa_lookup_enum_by_nr( mode ));
+
+       radeon_firevertices(&rmesa->radeon);    /* don't pipeline cliprect changes */
+
+       radeonSetCliprects( &rmesa->radeon );
+       radeonUpdatePageFlipping(&rmesa->radeon);
+}
+
+static void r300ReadBuffer( GLcontext *ctx, GLenum mode )
+{
+       if (RADEON_DEBUG & DEBUG_DRI)
+               fprintf(stderr, "%s %s\n", __FUNCTION__,
+                       _mesa_lookup_enum_by_nr( mode ));
+
+};
+
 /**
  * Initialize driver's state callback functions
  */
 void r300InitStateFuncs(struct dd_function_table *functions)
 {
-       radeonInitStateFuncs(functions);
 
        functions->UpdateState = r300InvalidateState;
        functions->AlphaFunc = r300AlphaFunc;
@@ -2818,4 +2794,8 @@ void r300InitStateFuncs(struct dd_function_table *functions)
        functions->RenderMode = r300RenderMode;
 
        functions->ClipPlane = r300ClipPlane;
+       functions->Scissor = radeonScissor;
+
+       functions->DrawBuffer           = r300DrawBuffer;
+       functions->ReadBuffer           = r300ReadBuffer;
 }