Finish up some of the gl_renderbuffer work.
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 1 Sep 2005 04:03:44 +0000 (04:03 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 1 Sep 2005 04:03:44 +0000 (04:03 +0000)
Use driRenderbuffer's offset, pitch fields in the span routines.
Remove the SetBuffer driver function.
Consolidate the code for setting CTX_RB3D_COLOROFFSET and CTX_RB3D_COLORPITCH
state in new radeonUpdateDrawBuffer() function.
Old code is surrounded by #if 000 / #endif, temporarily.

src/mesa/drivers/dri/r200/r200_context.c
src/mesa/drivers/dri/r200/r200_context.h
src/mesa/drivers/dri/r200/r200_ioctl.c
src/mesa/drivers/dri/r200/r200_lock.c
src/mesa/drivers/dri/r200/r200_pixel.c
src/mesa/drivers/dri/r200/r200_span.c
src/mesa/drivers/dri/r200/r200_state.c
src/mesa/drivers/dri/r200/r200_state.h
src/mesa/drivers/dri/r200/r200_state_init.c

index 6f8f78ef57aeb9209c764852c94f4d87a8bbbd62..d8a17e7e33de66870bae1014980137f0ef6a16dc 100644 (file)
@@ -75,7 +75,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define need_GL_NV_vertex_program
 #include "extension_helper.h"
 
-#define DRIVER_DATE    "20041207"
+#define DRIVER_DATE    "20050831"
 
 #include "vblank.h"
 #include "utils.h"
index 89b0b35a8a4c11d0c8ada8c40bfb7805137ac0b0..d2902f9e6ab03b06ca94eed92df14c4dafa34d43 100644 (file)
@@ -92,7 +92,9 @@ typedef void (*r200_point_func)( r200ContextPtr,
 
 struct r200_colorbuffer_state {
    GLuint clear;
+#if 000
    GLint drawOffset, drawPitch;
+#endif
    int roundEnable;
 };
 
@@ -102,9 +104,11 @@ struct r200_depthbuffer_state {
    GLfloat scale;
 };
 
+#if 000
 struct r200_pixel_state {
    GLint readOffset, readPitch;
 };
+#endif
 
 struct r200_scissor_state {
    drm_clip_rect_t rect;
@@ -539,7 +543,9 @@ struct r200_state {
     */
    struct r200_colorbuffer_state color;
    struct r200_depthbuffer_state depth;
+#if 00
    struct r200_pixel_state pixel;
+#endif
    struct r200_scissor_state scissor;
    struct r200_stencilbuffer_state stencil;
    struct r200_stipple_state stipple;
index a2336ce4f3dae8723ed0305d9cfe271a18773045..bf2d091759148baca0060f54c2708da42c132356 100644 (file)
@@ -556,6 +556,7 @@ void r200PageFlip( const __DRIdrawablePrivate *dPriv )
    rmesa->swap_count++;
    (void) (*dri_interface->getUST)( & rmesa->swap_ust );
 
+#if 000
    if ( rmesa->sarea->pfCurrentPage == 1 ) {
         rmesa->state.color.drawOffset = rmesa->r200Screen->frontOffset;
         rmesa->state.color.drawPitch  = rmesa->r200Screen->frontPitch;
@@ -571,6 +572,9 @@ void r200PageFlip( const __DRIdrawablePrivate *dPriv )
    if (rmesa->sarea->tiling_enabled) {
       rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= R200_COLOR_TILE_ENABLE;
    }
+#else
+   r200UpdateDrawBuffer(rmesa->glCtx);
+#endif
 }
 
 
index 9b82c18d1fe30cd1e8b0f99bc7d35a9f20980446..f0858f2c313b3a39e3e932ca057f6c8b1cdc9b6d 100644 (file)
@@ -39,6 +39,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r200_tex.h"
 #include "r200_state.h"
 #include "r200_ioctl.h"
+#include "drirenderbuffer.h"
 
 #if DEBUG_LOCKING
 char *prevLockFile = NULL;
@@ -50,6 +51,7 @@ int prevLockLine = 0;
 static void
 r200UpdatePageFlipping( r200ContextPtr rmesa )
 {
+#if 000
    int use_back;
    rmesa->doPageFlip = rmesa->sarea->pfState;
 
@@ -68,6 +70,43 @@ r200UpdatePageFlipping( r200ContextPtr rmesa )
    rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = rmesa->state.color.drawOffset
                                           + rmesa->r200Screen->fbLocation;
    rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH]  = rmesa->state.color.drawPitch;
+#else
+   if (rmesa->doPageFlip != rmesa->sarea->pfState
+       || rmesa->sarea->pfState) {
+      /* If page flipping is on, re we're turning it on/off now we need
+       * to update the flipped buffer info.
+       */
+     struct gl_framebuffer *fb = rmesa->glCtx->WinSysDrawBuffer;
+     driRenderbuffer *front_drb
+        = (driRenderbuffer *) fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
+     driRenderbuffer *back_drb
+        = (driRenderbuffer *) fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
+
+     if (rmesa->sarea->pfState && rmesa->sarea->pfCurrentPage == 1) {
+        /* flipped buffers */
+        front_drb->flippedOffset = back_drb->offset;
+       front_drb->flippedPitch  = back_drb->pitch;
+       back_drb->flippedOffset  = front_drb->offset;
+       back_drb->flippedPitch   = front_drb->pitch;
+     }
+     else {
+        /* unflipped buffers */
+        front_drb->flippedOffset = front_drb->offset;
+       front_drb->flippedPitch  = front_drb->pitch;
+       if (back_drb) {
+          /* back buffer is non-existant when single buffered */
+          back_drb->flippedOffset  = back_drb->offset;
+          back_drb->flippedPitch   = back_drb->pitch;
+       }
+     }
+
+     /* update local state */
+     rmesa->doPageFlip = rmesa->sarea->pfState;
+
+     /* set hw.ctx.cmd state here */
+     r200UpdateDrawBuffer(rmesa->glCtx);
+   }
+#endif
 }
 
 
index ad3ec20b4e9a2ac32d1eb8183d1b0756ec314175..c3489b6c621a20afa523757b63a041c8eaa4fa87 100644 (file)
@@ -43,6 +43,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r200_pixel.h"
 #include "r200_swtcl.h"
 
+#include "drirenderbuffer.h"
 
 
 static GLboolean
@@ -213,10 +214,11 @@ r200TryReadPixels( GLcontext *ctx,
 
    {
       __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
+      driRenderbuffer *drb = (driRenderbuffer *) ctx->ReadBuffer->_ColorReadBuffer;
       int nbox = dPriv->numClipRects;
-      int src_offset = rmesa->state.color.drawOffset
+      int src_offset = drb->offset
                     + rmesa->r200Screen->fbLocation;
-      int src_pitch = rmesa->state.color.drawPitch * rmesa->r200Screen->cpp;
+      int src_pitch = drb->pitch * drb->cpp;
       int dst_offset = r200GartOffsetFromVirtual( rmesa, pixels );
       int dst_pitch = pitch * rmesa->r200Screen->cpp;
       drm_clip_rect_t *box = dPriv->pClipRects;
@@ -293,6 +295,8 @@ static void do_draw_pix( GLcontext *ctx,
    r200ContextPtr rmesa = R200_CONTEXT(ctx);
    __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;
    drm_clip_rect_t *box = dPriv->pClipRects;
+   struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorDrawBuffers[0][0];
+   driRenderbuffer *drb = (driRenderbuffer *) rb;
    int nbox = dPriv->numClipRects;
    int i;
    int blit_format;
@@ -353,8 +357,8 @@ static void do_draw_pix( GLcontext *ctx,
       r200EmitBlit( rmesa,
                    blit_format,
                    src_pitch, src_offset,
-                   rmesa->state.color.drawPitch * rmesa->r200Screen->cpp,
-                   rmesa->state.color.drawOffset + rmesa->r200Screen->fbLocation,
+                   drb->pitch * drb->cpp,
+                   drb->offset + rmesa->r200Screen->fbLocation,
                    bx - x, by - y,
                    bx, by,
                    bw, bh );
@@ -384,6 +388,10 @@ r200TryDrawPixels( GLcontext *ctx,
    if (R200_DEBUG & DEBUG_PIXEL)
       fprintf(stderr, "%s\n", __FUNCTION__);
 
+   /* check that we're drawing to exactly one color buffer */
+   if (ctx->DrawBuffer->_NumColorDrawBuffers[0] != 1)
+     return GL_FALSE;
+
    switch (format) {
    case GL_RGB:
    case GL_RGBA:
index 024e89461ed06236843c4b813694187e1164487e..898ff61e76a4b6422f3bf5cd13c3e967a8440542 100644 (file)
@@ -46,6 +46,10 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #define DBG 0
 
+#define GET_PTR(X,Y) (sPriv->pFB + drb->flippedOffset          \
+     + ((dPriv->y + (Y)) * drb->flippedPitch + (dPriv->x + (X))) * drb->cpp)
+
+#if 000
 #define LOCAL_VARS                                                     \
    r200ContextPtr rmesa = R200_CONTEXT(ctx);                           \
    r200ScreenPtr r200Screen = rmesa->r200Screen;                       \
@@ -63,17 +67,26 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
                             (dPriv->y * pitch));                       \
    GLuint p;                                                           \
    (void) read_buf; (void) buf; (void) p
+#else
+#define LOCAL_VARS                                                     \
+   r200ContextPtr rmesa = R200_CONTEXT(ctx);                           \
+   __DRIscreenPrivate *sPriv = rmesa->dri.screen;                      \
+   __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;                  \
+   driRenderbuffer *drb = (driRenderbuffer *) rb;                      \
+   GLuint height = dPriv->h;                                           \
+   GLuint p;                                                           \
+   (void) p;
+#endif
 
 #define LOCAL_DEPTH_VARS                                               \
    r200ContextPtr rmesa = R200_CONTEXT(ctx);                           \
-   r200ScreenPtr r200Screen = rmesa->r200Screen;                       \
    __DRIscreenPrivate *sPriv = rmesa->dri.screen;                      \
    __DRIdrawablePrivate *dPriv = rmesa->dri.drawable;                  \
+   driRenderbuffer *drb = (driRenderbuffer *) rb;                      \
    GLuint height = dPriv->h;                                           \
    GLuint xo = dPriv->x;                                               \
    GLuint yo = dPriv->y;                                               \
-   char *buf = (char *)(sPriv->pFB + r200Screen->depthOffset);         \
-   (void) buf
+   char *buf = (char *)(sPriv->pFB + drb->offset);
 
 #define LOCAL_STENCIL_VARS     LOCAL_DEPTH_VARS
 
@@ -96,6 +109,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #define TAG(x)    r200##x##_RGB565
 #define TAG2(x,y) r200##x##_RGB565##y
+#define GET_SRC_PTR(X,Y) GET_PTR(X,Y)
+#define GET_DST_PTR(X,Y) GET_PTR(X,Y)
 #include "spantmp2.h"
 
 /* 32 bit, ARGB8888 color spanline and pixel functions
@@ -105,6 +120,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #define TAG(x)    r200##x##_ARGB8888
 #define TAG2(x,y) r200##x##_ARGB8888##y
+#define GET_SRC_PTR(X,Y) GET_PTR(X,Y)
+#define GET_DST_PTR(X,Y) GET_PTR(X,Y)
 #include "spantmp2.h"
 
 
@@ -122,12 +139,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
 
 #define BIT(x,b) ((x & (1<<b))>>b)
-static GLuint r200_mba_z32( r200ContextPtr rmesa,
-                                      GLint x, GLint y )
+
+static GLuint
+r200_mba_z32( driRenderbuffer *drb, GLint x, GLint y )
 {
-   GLuint pitch = rmesa->r200Screen->frontPitch;
-   if (rmesa->r200Screen->depthHasSurface) {
-      return 4*(x + y*pitch);
+   GLuint pitch = drb->pitch;
+   if (drb->depthHasSurface) {
+      return 4 * (x + y * pitch);
    }
    else {
       GLuint b = ((y & 0x7FF) >> 4) * ((pitch & 0xFFF) >> 5) + ((x & 0x7FF) >> 5);
@@ -147,11 +165,12 @@ static GLuint r200_mba_z32( r200ContextPtr rmesa,
    }
 }
 
-static GLuint r200_mba_z16( r200ContextPtr rmesa, GLint x, GLint y )
+static GLuint
+r200_mba_z16( driRenderbuffer *drb, GLint x, GLint y )
 {
-   GLuint pitch = rmesa->r200Screen->frontPitch;
-   if (rmesa->r200Screen->depthHasSurface) {
-      return 2*(x + y*pitch);
+   GLuint pitch = drb->pitch;
+   if (drb->depthHasSurface) {
+      return 2 * (x + y * pitch);
    }
    else {
       GLuint b = ((y & 0x7FF) >> 4) * ((pitch & 0xFFF) >> 6) + ((x & 0x7FF) >> 6);
@@ -177,10 +196,10 @@ static GLuint r200_mba_z16( r200ContextPtr rmesa, GLint x, GLint y )
  */
 
 #define WRITE_DEPTH( _x, _y, d )                                       \
-   *(GLushort *)(buf + r200_mba_z16( rmesa, _x + xo, _y + yo )) = d;
+   *(GLushort *)(buf + r200_mba_z16( drb, _x + xo, _y + yo )) = d;
 
 #define READ_DEPTH( d, _x, _y )                                                \
-   d = *(GLushort *)(buf + r200_mba_z16( rmesa, _x + xo, _y + yo ));
+   d = *(GLushort *)(buf + r200_mba_z16( drb, _x + xo, _y + yo ));
 
 #define TAG(x) r200##x##_16
 #include "depthtmp.h"
@@ -191,7 +210,7 @@ static GLuint r200_mba_z16( r200ContextPtr rmesa, GLint x, GLint y )
 
 #define WRITE_DEPTH( _x, _y, d )                                       \
 do {                                                                   \
-   GLuint offset = r200_mba_z32( rmesa, _x + xo, _y + yo );            \
+   GLuint offset = r200_mba_z32( drb, _x + xo, _y + yo );              \
    GLuint tmp = *(GLuint *)(buf + offset);                             \
    tmp &= 0xff000000;                                                  \
    tmp |= ((d) & 0x00ffffff);                                          \
@@ -199,7 +218,7 @@ do {                                                                        \
 } while (0)
 
 #define READ_DEPTH( d, _x, _y )                                                \
-   d = *(GLuint *)(buf + r200_mba_z32( rmesa, _x + xo,         \
+   d = *(GLuint *)(buf + r200_mba_z32( drb, _x + xo,                   \
                                         _y + yo )) & 0x00ffffff;
 
 #define TAG(x) r200##x##_24_8
@@ -214,7 +233,7 @@ do {                                                                        \
  */
 #define WRITE_STENCIL( _x, _y, d )                                     \
 do {                                                                   \
-   GLuint offset = r200_mba_z32( rmesa, _x + xo, _y + yo );            \
+   GLuint offset = r200_mba_z32( drb, _x + xo, _y + yo );              \
    GLuint tmp = *(GLuint *)(buf + offset);                             \
    tmp &= 0x00ffffff;                                                  \
    tmp |= (((d) & 0xff) << 24);                                                \
@@ -223,7 +242,7 @@ do {                                                                        \
 
 #define READ_STENCIL( d, _x, _y )                                      \
 do {                                                                   \
-   GLuint offset = r200_mba_z32( rmesa, _x + xo, _y + yo );            \
+   GLuint offset = r200_mba_z32( drb, _x + xo, _y + yo );              \
    GLuint tmp = *(GLuint *)(buf + offset);                             \
    tmp &= 0xff000000;                                                  \
    d = tmp >> 24;                                                      \
@@ -233,6 +252,7 @@ do {                                                                        \
 #include "stenciltmp.h"
 
 
+#if 000
 /*
  * This function is called to specify which buffer to read and write
  * for software rasterization (swrast) fallbacks.  This doesn't necessarily
@@ -276,6 +296,7 @@ static void r200SetBuffer( GLcontext *ctx,
       break;
    }
 }
+#endif
 
 /* Move locking out to get reasonable span performance (10x better
  * than doing this in HW_LOCK above).  WaitForIdle() is the main
@@ -301,8 +322,10 @@ static void r200SpanRenderStart( GLcontext *ctx )
     */
    {
       int p;
-      volatile int *read_buf = (volatile int *)(rmesa->dri.screen->pFB + 
-                                               rmesa->state.pixel.readOffset);
+      driRenderbuffer *drb =
+        (driRenderbuffer *) ctx->WinSysDrawBuffer->_ColorDrawBuffers[0][0];
+      volatile int *read_buf =
+        (volatile int *)(rmesa->dri.screen->pFB + drb->offset);
       p = *read_buf;
       *read_buf = p;
    }
@@ -319,7 +342,9 @@ void r200InitSpanFuncs( GLcontext *ctx )
 {
    struct swrast_device_driver *swdd = _swrast_GetDeviceDriverReference(ctx);
 
+#if 000
    swdd->SetBuffer = r200SetBuffer;
+#endif
    swdd->SpanRenderStart          = r200SpanRenderStart;
    swdd->SpanRenderFinish         = r200SpanRenderFinish; 
 }
index 93f6dfc6d7ab23f948f6e740edc193d59bde4362..36dd9ca8870314ad161423bec3662efbb484b5d9 100644 (file)
@@ -48,7 +48,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "tnl/t_pipeline.h"
 #include "swrast_setup/swrast_setup.h"
 
-
 #include "r200_context.h"
 #include "r200_ioctl.h"
 #include "r200_state.h"
@@ -57,6 +56,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r200_swtcl.h"
 #include "r200_vtxfmt.h"
 
+#include "drirenderbuffer.h"
+
 
 /* =============================================================
  * Alpha blending
@@ -1794,7 +1795,8 @@ static void r200DrawBuffer( GLcontext *ctx, GLenum mode )
    R200_FIREVERTICES(rmesa);   /* don't pipeline cliprect changes */
 
    /*
-    * _DrawDestMask is easier to cope with than <mode>.
+    * _ColorDrawBufferMask is easier to cope with than <mode>.
+    * Check for software fallback, update cliprects.
     */
    switch ( ctx->DrawBuffer->_ColorDrawBufferMask[0] ) {
    case BUFFER_BIT_FRONT_LEFT:
@@ -1811,6 +1813,7 @@ static void r200DrawBuffer( GLcontext *ctx, GLenum mode )
       return;
    }
 
+#if 000
    /* We want to update the s/w rast state too so that r200SetBuffer()
     * gets called.
     */
@@ -1824,6 +1827,11 @@ static void r200DrawBuffer( GLcontext *ctx, GLenum mode )
    if (rmesa->sarea->tiling_enabled) {
       rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= R200_COLOR_TILE_ENABLE;
    }
+#else
+   /* We'll set the drawing engine's offset/pitch parameters later
+    * when we update other state.
+    */
+#endif
 }
 
 
@@ -2218,11 +2226,56 @@ static void update_texturematrix( GLcontext *ctx )
 
 
 
+/**
+ * Tell the card where to render (offset, pitch).
+ * Effected by glDrawBuffer, etc
+ */
+void
+r200UpdateDrawBuffer(GLcontext *ctx)
+{
+   r200ContextPtr rmesa = R200_CONTEXT(ctx);
+   struct gl_framebuffer *fb = ctx->DrawBuffer;
+   driRenderbuffer *drb;
+
+   if (fb->_ColorDrawBufferMask[0] == BUFFER_BIT_FRONT_LEFT) {
+      /* draw to front */
+      drb = (driRenderbuffer *) fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer;
+   }
+   else if (fb->_ColorDrawBufferMask[0] == BUFFER_BIT_BACK_LEFT) {
+      /* draw to back */
+      drb = (driRenderbuffer *) fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer;
+   }
+   else {
+      /* drawing to multiple buffers, or none */
+      return;
+   }
+
+   assert(drb);
+   assert(drb->flippedPitch);
+
+   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;
+   }
+}
+
+
+
 void r200ValidateState( GLcontext *ctx )
 {
    r200ContextPtr rmesa = R200_CONTEXT(ctx);
    GLuint new_state = rmesa->NewGLState;
 
+   if (new_state & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) {
+     r200UpdateDrawBuffer(ctx);
+   }
+
    if (new_state & _NEW_TEXTURE) {
       r200UpdateTextureState( ctx );
       new_state |= rmesa->NewGLState; /* may add TEXTURE_MATRIX */
index d467d73bd80e945a1503f4e44433e1f451faaf4b..98c6fbe40bb1cf3b510274ad03521de7df45e042 100644 (file)
@@ -48,6 +48,7 @@ extern void r200SetCliprects( r200ContextPtr rmesa, GLenum mode );
 extern void r200RecalcScissorRects( r200ContextPtr rmesa );
 extern void r200UpdateViewportOffset( GLcontext *ctx );
 extern void r200UpdateWindow( GLcontext *ctx );
+extern void r200UpdateDrawBuffer(GLcontext *ctx);
 
 extern void r200ValidateState( GLcontext *ctx );
 
index 30e0dfa46163c21ff14ec9e5baff5d86b3385c2e..27c0b946b1ef2670a362ec84ac25a4e798a5ad1d 100644 (file)
@@ -155,6 +155,7 @@ void r200InitState( r200ContextPtr rmesa )
 {
    GLcontext *ctx = rmesa->glCtx;
    GLuint color_fmt, depth_fmt, i;
+   GLint drawPitch, drawOffset;
 
    switch ( rmesa->r200Screen->cpp ) {
    case 2:
@@ -195,6 +196,14 @@ void r200InitState( r200ContextPtr rmesa )
 
    rmesa->Fallback = 0;
 
+   if ( ctx->Visual.doubleBufferMode && rmesa->sarea->pfCurrentPage == 0 ) {
+      drawOffset = rmesa->r200Screen->backOffset;
+      drawPitch  = rmesa->r200Screen->backPitch;
+   } else {
+      drawOffset = rmesa->r200Screen->frontOffset;
+      drawPitch  = rmesa->r200Screen->frontPitch;
+   }
+#if 000
    if ( ctx->Visual.doubleBufferMode && rmesa->sarea->pfCurrentPage == 0 ) {
       rmesa->state.color.drawOffset = rmesa->r200Screen->backOffset;
       rmesa->state.color.drawPitch  = rmesa->r200Screen->backPitch;
@@ -205,6 +214,7 @@ void r200InitState( r200ContextPtr rmesa )
 
    rmesa->state.pixel.readOffset = rmesa->state.color.drawOffset;
    rmesa->state.pixel.readPitch  = rmesa->state.color.drawPitch;
+#endif
 
    rmesa->hw.max_state_size = 0;
 
@@ -502,6 +512,7 @@ void r200InitState( r200ContextPtr rmesa )
    else
       rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->state.color.roundEnable;
 
+#if 000
    rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = ((rmesa->state.color.drawOffset +
                                               rmesa->r200Screen->fbLocation)
                                              & R200_COLOROFFSET_MASK);
@@ -509,6 +520,15 @@ void r200InitState( r200ContextPtr rmesa )
    rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = ((rmesa->state.color.drawPitch &
                                              R200_COLORPITCH_MASK) |
                                             R200_COLOR_ENDIAN_NO_SWAP);
+#else
+   rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = ((drawOffset +
+                                              rmesa->r200Screen->fbLocation)
+                                             & R200_COLOROFFSET_MASK);
+
+   rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] = ((drawPitch &
+                                             R200_COLORPITCH_MASK) |
+                                            R200_COLOR_ENDIAN_NO_SWAP);
+#endif
    /* (fixed size) sarea is initialized to zero afaics so can omit version check. Phew! */
    if (rmesa->sarea->tiling_enabled) {
       rmesa->hw.ctx.cmd[CTX_RB3D_COLORPITCH] |= R200_COLOR_TILE_ENABLE;