i965: defined BRW_MAX_MRF
[mesa.git] / src / mesa / drivers / x11 / xm_span.c
index 3ebca32bcfe3523619066fd819236684ef082e47..309cefcb8e8152dc7b6afdafa4afa0a93c866bfd 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  5.1
+ * Version:  6.3
  *
- * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
-/* $XFree86: xc/extras/Mesa/src/X/xm_span.c,v 1.3 2002/02/27 21:07:54 tsi Exp $ */
 
 #include "glxheader.h"
-#include "colormac.h"
-#include "context.h"
-#include "depth.h"
-#include "drawpix.h"
-#include "extensions.h"
-#include "macros.h"
-#include "imports.h"
-#include "mtypes.h"
-#include "state.h"
+#include "main/colormac.h"
+#include "main/context.h"
+#include "main/depth.h"
+#include "main/drawpix.h"
+#include "main/extensions.h"
+#include "main/macros.h"
+#include "main/imports.h"
+#include "main/mtypes.h"
+#include "main/state.h"
 #include "xmesaP.h"
 
 #include "swrast/swrast.h"
@@ -148,7 +147,7 @@ static unsigned long read_pixel( XMesaDisplay *dpy,
  *
  * The function naming convention is:
  *
- *   write_[span|pixels]_[mono]_[format]_[pixmap|ximage]
+ *   [put|get]_[mono]_[row|values]_[format]_[pixmap|ximage]
  *
  * New functions optimized for specific cases can be added without too much
  * trouble.  An example might be the 24-bit TrueColor mode 8A8R8G8B which is
@@ -163,30 +162,37 @@ static unsigned long read_pixel( XMesaDisplay *dpy,
 /**********************************************************************/
 
 
-#define RGBA_SPAN_ARGS const GLcontext *ctx,                           \
-                       GLuint n, GLint x, GLint y,                     \
-                       CONST GLubyte rgba[][4], const GLubyte mask[]
+#define PUT_ROW_ARGS \
+       GLcontext *ctx,                                 \
+       struct gl_renderbuffer *rb,                     \
+       GLuint n, GLint x, GLint y,                     \
+       const void *values, const GLubyte mask[]
 
-#define RGB_SPAN_ARGS  const GLcontext *ctx,                           \
-                       GLuint n, GLint x, GLint y,                     \
-                       CONST GLubyte rgb[][3], const GLubyte mask[]
+#define RGB_SPAN_ARGS \
+       GLcontext *ctx,                                 \
+       struct gl_renderbuffer *rb,                     \
+       GLuint n, GLint x, GLint y,                     \
+       const void *values, const GLubyte mask[]
 
 
-/* NOTE: if mask==NULL, draw all pixels */
+#define GET_XRB(XRB) \
+   struct xmesa_renderbuffer *XRB = xmesa_renderbuffer(rb)
 
 
 /*
  * Write a span of PF_TRUECOLOR pixels to a pixmap.
  */
-static void write_span_TRUECOLOR_pixmap( RGBA_SPAN_ARGS )
+static void put_row_TRUECOLOR_pixmap( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   GET_XRB(xrb);
+   XMesaDisplay *dpy = XMESA_BUFFER(ctx->DrawBuffer)->display;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
 
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -199,7 +205,7 @@ static void write_span_TRUECOLOR_pixmap( RGBA_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       for (i=0;i<n;i++) {
          unsigned long p;
          PACK_TRUECOLOR( p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
@@ -213,14 +219,16 @@ static void write_span_TRUECOLOR_pixmap( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_TRUECOLOR pixels to a pixmap.
  */
-static void write_span_rgb_TRUECOLOR_pixmap( RGB_SPAN_ARGS )
+static void put_row_rgb_TRUECOLOR_pixmap( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -233,7 +241,7 @@ static void write_span_rgb_TRUECOLOR_pixmap( RGB_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       for (i=0;i<n;i++) {
          unsigned long p;
          PACK_TRUECOLOR( p, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP] );
@@ -243,18 +251,19 @@ static void write_span_rgb_TRUECOLOR_pixmap( RGB_SPAN_ARGS )
    }
 }
 
-
 /*
  * Write a span of PF_TRUEDITHER pixels to a pixmap.
  */
-static void write_span_TRUEDITHER_pixmap( RGBA_SPAN_ARGS )
+static void put_row_TRUEDITHER_pixmap( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -266,7 +275,7 @@ static void write_span_TRUEDITHER_pixmap( RGBA_SPAN_ARGS )
       }
    }
    else {
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       for (i=0;i<n;i++) {
          unsigned long p;
          PACK_TRUEDITHER(p, x+i, y, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
@@ -280,14 +289,16 @@ static void write_span_TRUEDITHER_pixmap( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_TRUEDITHER pixels to a pixmap (no alpha).
  */
-static void write_span_rgb_TRUEDITHER_pixmap( RGB_SPAN_ARGS )
+static void put_row_rgb_TRUEDITHER_pixmap( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -299,7 +310,7 @@ static void write_span_rgb_TRUEDITHER_pixmap( RGB_SPAN_ARGS )
       }
    }
    else {
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       for (i=0;i<n;i++) {
          unsigned long p;
          PACK_TRUEDITHER(p, x+i, y, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
@@ -310,18 +321,19 @@ static void write_span_rgb_TRUEDITHER_pixmap( RGB_SPAN_ARGS )
 }
 
 
-
 /*
  * Write a span of PF_8A8B8G8R pixels to a pixmap.
  */
-static void write_span_8A8B8G8R_pixmap( RGBA_SPAN_ARGS )
+static void put_row_8A8B8G8R_pixmap( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -333,7 +345,7 @@ static void write_span_8A8B8G8R_pixmap( RGBA_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       register GLuint *ptr4 = (GLuint *) rowimg->data;
       for (i=0;i<n;i++) {
          *ptr4++ = PACK_8A8B8G8R( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] );
@@ -346,14 +358,16 @@ static void write_span_8A8B8G8R_pixmap( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_8A8B8G8R pixels to a pixmap (no alpha).
  */
-static void write_span_rgb_8A8B8G8R_pixmap( RGB_SPAN_ARGS )
+static void put_row_rgb_8A8B8G8R_pixmap( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -365,7 +379,7 @@ static void write_span_rgb_8A8B8G8R_pixmap( RGB_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       register GLuint *ptr4 = (GLuint *) rowimg->data;
       for (i=0;i<n;i++) {
          *ptr4++ = PACK_8B8G8R(rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
@@ -374,29 +388,115 @@ static void write_span_rgb_8A8B8G8R_pixmap( RGB_SPAN_ARGS )
    }
 }
 
+/*
+ * Write a span of PF_8A8R8G8B pixels to a pixmap.
+ */
+static void put_row_8A8R8G8B_pixmap( PUT_ROW_ARGS )
+{
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
+   XMesaDisplay *dpy = xmesa->xm_visual->display;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
+   register GLuint i;
+   y = YFLIP(xrb, y);
+   if (mask) {
+      for (i=0;i<n;i++,x++) {
+         if (mask[i]) {
+            XMesaSetForeground( dpy, gc,
+                         PACK_8A8R8G8B(rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP]) );
+            XMesaDrawPoint( dpy, buffer, gc, (int) x, (int) y );
+         }
+      }
+   }
+   else {
+      /* draw all pixels */
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
+      register GLuint *ptr4 = (GLuint *) rowimg->data;
+      for (i=0;i<n;i++) {
+         *ptr4++ = PACK_8A8R8G8B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] );
+      }
+      XMesaPutImage( dpy, buffer, gc, rowimg, 0, 0, x, y, n, 1 );
+   }
+}
+
+
+/*
+ * Write a span of PF_8A8R8G8B pixels to a pixmap (no alpha).
+ */
+static void put_row_rgb_8A8R8G8B_pixmap( RGB_SPAN_ARGS )
+{
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
+   XMesaDisplay *dpy = xmesa->xm_visual->display;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
+   register GLuint i;
+   y = YFLIP(xrb, y);
+   if (mask) {
+      for (i=0;i<n;i++,x++) {
+         if (mask[i]) {
+            XMesaSetForeground( dpy, gc,
+                   PACK_8R8G8B(rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]) );
+            XMesaDrawPoint( dpy, buffer, gc, (int) x, (int) y );
+         }
+      }
+   }
+   else {
+      /* draw all pixels */
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
+      register GLuint *ptr4 = (GLuint *) rowimg->data;
+      for (i=0;i<n;i++) {
+         *ptr4++ = PACK_8R8G8B(rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]);
+      }
+      XMesaPutImage( dpy, buffer, gc, rowimg, 0, 0, x, y, n, 1 );
+   }
+}
 
 /*
  * Write a span of PF_8R8G8B pixels to a pixmap.
  */
-static void write_span_8R8G8B_pixmap( RGBA_SPAN_ARGS )
+static void put_row_8R8G8B_pixmap( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
+#if 1
+            /*
+             * XXX Something funny is going on here.
+             * If we're drawing into a window that uses a depth 32 TrueColor
+             * visual, we see the right pixels on screen, but when we read
+             * them back with XGetImage() we get random colors.
+             * The alternative code below which uses XPutImage() instead
+             * seems to mostly fix the problem, but not always.
+             * We don't normally create windows with this visual, but glean
+             * does and we're seeing some failures there.
+             */
             XMesaSetForeground( dpy, gc, PACK_8R8G8B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] ));
             XMesaDrawPoint( dpy, buffer, gc, (int) x, (int) y );
+#else
+            /* This code works more often, but not always */
+            XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
+            GLuint *ptr4 = (GLuint *) rowimg->data;
+            *ptr4 = PACK_8R8G8B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
+            XMesaPutImage( dpy, buffer, gc, rowimg, 0, 0, x, y, 1, 1 );
+#endif
          }
       }
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       register GLuint *ptr4 = (GLuint *) rowimg->data;
       for (i=0;i<n;i++) {
          *ptr4++ = PACK_8R8G8B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
@@ -409,13 +509,15 @@ static void write_span_8R8G8B_pixmap( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_8R8G8B24 pixels to a pixmap.
  */
-static void write_span_8R8G8B24_pixmap( RGBA_SPAN_ARGS )
+static void put_row_8R8G8B24_pixmap( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
-   y = FLIP(xmesa->xm_buffer, y);
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
+   y = YFLIP(xrb, y);
    if (mask) {
       register GLuint i;
       for (i=0;i<n;i++,x++) {
@@ -428,7 +530,7 @@ static void write_span_8R8G8B24_pixmap( RGBA_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       register GLuint *ptr4 = (GLuint *) rowimg->data;
       register GLuint pixel;
       static const GLuint shift[4] = {0, 8, 16, 24};
@@ -503,14 +605,16 @@ static void write_span_8R8G8B24_pixmap( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_8R8G8B pixels to a pixmap (no alpha).
  */
-static void write_span_rgb_8R8G8B_pixmap( RGB_SPAN_ARGS )
+static void put_row_rgb_8R8G8B_pixmap( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -521,7 +625,7 @@ static void write_span_rgb_8R8G8B_pixmap( RGB_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       register GLuint *ptr4 = (GLuint *) rowimg->data;
       for (i=0;i<n;i++) {
          *ptr4++ = PACK_8R8G8B( rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP] );
@@ -530,17 +634,18 @@ static void write_span_rgb_8R8G8B_pixmap( RGB_SPAN_ARGS )
    }
 }
 
-
 /*
  * Write a span of PF_8R8G8B24 pixels to a pixmap (no alpha).
  */
-static void write_span_rgb_8R8G8B24_pixmap( RGB_SPAN_ARGS )
+static void put_row_rgb_8R8G8B24_pixmap( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
-   y = FLIP(xmesa->xm_buffer, y);
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
+   y = YFLIP(xrb, y);
    if (mask) {
       register GLuint i;
       for (i=0;i<n;i++,x++) {
@@ -553,7 +658,7 @@ static void write_span_rgb_8R8G8B24_pixmap( RGB_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       register GLuint *ptr4 = (GLuint *) rowimg->data;
       register GLuint pixel;
       static const GLuint shift[4] = {0, 8, 16, 24};
@@ -633,14 +738,16 @@ static void write_span_rgb_8R8G8B24_pixmap( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_5R6G5B pixels to a pixmap.
  */
-static void write_span_5R6G5B_pixmap( RGBA_SPAN_ARGS )
+static void put_row_5R6G5B_pixmap( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -651,7 +758,7 @@ static void write_span_5R6G5B_pixmap( RGBA_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       register GLushort *ptr2 = (GLushort *) rowimg->data;
       for (i=0;i<n;i++) {
          ptr2[i] = PACK_5R6G5B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
@@ -664,14 +771,16 @@ static void write_span_5R6G5B_pixmap( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_DITHER_5R6G5B pixels to a pixmap.
  */
-static void write_span_DITHER_5R6G5B_pixmap( RGBA_SPAN_ARGS )
+static void put_row_DITHER_5R6G5B_pixmap( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -684,7 +793,7 @@ static void write_span_DITHER_5R6G5B_pixmap( RGBA_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       register GLushort *ptr2 = (GLushort *) rowimg->data;
       for (i=0;i<n;i++) {
          PACK_TRUEDITHER( ptr2[i], x+i, y, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
@@ -697,14 +806,16 @@ static void write_span_DITHER_5R6G5B_pixmap( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_5R6G5B pixels to a pixmap (no alpha).
  */
-static void write_span_rgb_5R6G5B_pixmap( RGB_SPAN_ARGS )
+static void put_row_rgb_5R6G5B_pixmap( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -715,7 +826,7 @@ static void write_span_rgb_5R6G5B_pixmap( RGB_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       register GLushort *ptr2 = (GLushort *) rowimg->data;
       for (i=0;i<n;i++) {
          ptr2[i] = PACK_5R6G5B( rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP] );
@@ -728,14 +839,16 @@ static void write_span_rgb_5R6G5B_pixmap( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_DITHER_5R6G5B pixels to a pixmap (no alpha).
  */
-static void write_span_rgb_DITHER_5R6G5B_pixmap( RGB_SPAN_ARGS )
+static void put_row_rgb_DITHER_5R6G5B_pixmap( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -748,7 +861,7 @@ static void write_span_rgb_DITHER_5R6G5B_pixmap( RGB_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       register GLushort *ptr2 = (GLushort *) rowimg->data;
       for (i=0;i<n;i++) {
          PACK_TRUEDITHER( ptr2[i], x+i, y, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP] );
@@ -758,19 +871,20 @@ static void write_span_rgb_DITHER_5R6G5B_pixmap( RGB_SPAN_ARGS )
 }
 
 
-
 /*
  * Write a span of PF_DITHER pixels to a pixmap.
  */
-static void write_span_DITHER_pixmap( RGBA_SPAN_ARGS )
+static void put_row_DITHER_pixmap( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    XDITHER_SETUP(y);
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -781,7 +895,7 @@ static void write_span_DITHER_pixmap( RGBA_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       for (i=0;i<n;i++) {
          XMesaPutPixel( rowimg, i, 0, XDITHER(x+i, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]) );
       }
@@ -793,15 +907,17 @@ static void write_span_DITHER_pixmap( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_DITHER pixels to a pixmap (no alpha).
  */
-static void write_span_rgb_DITHER_pixmap( RGB_SPAN_ARGS )
+static void put_row_rgb_DITHER_pixmap( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    XDITHER_SETUP(y);
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -812,7 +928,7 @@ static void write_span_rgb_DITHER_pixmap( RGB_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       for (i=0;i<n;i++) {
          XMesaPutPixel( rowimg, i, 0, XDITHER(x+i, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]) );
       }
@@ -824,15 +940,17 @@ static void write_span_rgb_DITHER_pixmap( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_1BIT pixels to a pixmap.
  */
-static void write_span_1BIT_pixmap( RGBA_SPAN_ARGS )
+static void put_row_1BIT_pixmap( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    SETUP_1BIT;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -844,7 +962,7 @@ static void write_span_1BIT_pixmap( RGBA_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       for (i=0;i<n;i++) {
          XMesaPutPixel( rowimg, i, 0,
                     DITHER_1BIT( x+i, y, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] ) );
@@ -857,15 +975,17 @@ static void write_span_1BIT_pixmap( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_1BIT pixels to a pixmap (no alpha).
  */
-static void write_span_rgb_1BIT_pixmap( RGB_SPAN_ARGS )
+static void put_row_rgb_1BIT_pixmap( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    SETUP_1BIT;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -877,7 +997,7 @@ static void write_span_rgb_1BIT_pixmap( RGB_SPAN_ARGS )
    }
    else {
       /* draw all pixels */
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       for (i=0;i<n;i++) {
          XMesaPutPixel( rowimg, i, 0,
           DITHER_1BIT(x+i, y, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP]) );
@@ -890,14 +1010,16 @@ static void write_span_rgb_1BIT_pixmap( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_HPCR pixels to a pixmap.
  */
-static void write_span_HPCR_pixmap( RGBA_SPAN_ARGS )
+static void put_row_HPCR_pixmap( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -908,8 +1030,8 @@ static void write_span_HPCR_pixmap( RGBA_SPAN_ARGS )
       }
    }
    else {
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
-      register GLubyte *ptr = (GLubyte *) xmesa->xm_buffer->rowimage->data;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
+      register GLubyte *ptr = (GLubyte *) XMESA_BUFFER(ctx->DrawBuffer)->rowimage->data;
       for (i=0;i<n;i++) {
          ptr[i] = DITHER_HPCR( (x+i), y, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
       }
@@ -921,14 +1043,16 @@ static void write_span_HPCR_pixmap( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_HPCR pixels to a pixmap (no alpha).
  */
-static void write_span_rgb_HPCR_pixmap( RGB_SPAN_ARGS )
+static void put_row_rgb_HPCR_pixmap( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -939,8 +1063,8 @@ static void write_span_rgb_HPCR_pixmap( RGB_SPAN_ARGS )
       }
    }
    else {
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
-      register GLubyte *ptr = (GLubyte *) xmesa->xm_buffer->rowimage->data;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
+      register GLubyte *ptr = (GLubyte *) XMESA_BUFFER(ctx->DrawBuffer)->rowimage->data;
       for (i=0;i<n;i++) {
          ptr[i] = DITHER_HPCR( (x+i), y, rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP] );
       }
@@ -948,19 +1072,20 @@ static void write_span_rgb_HPCR_pixmap( RGB_SPAN_ARGS )
    }
 }
 
-
 /*
  * Write a span of PF_LOOKUP pixels to a pixmap.
  */
-static void write_span_LOOKUP_pixmap( RGBA_SPAN_ARGS )
+static void put_row_LOOKUP_pixmap( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    LOOKUP_SETUP;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -970,7 +1095,7 @@ static void write_span_LOOKUP_pixmap( RGBA_SPAN_ARGS )
       }
    }
    else {
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       for (i=0;i<n;i++) {
          XMesaPutPixel( rowimg, i, 0, LOOKUP(rgba[i][RCOMP],rgba[i][GCOMP],rgba[i][BCOMP]) );
       }
@@ -982,15 +1107,17 @@ static void write_span_LOOKUP_pixmap( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_LOOKUP pixels to a pixmap (no alpha).
  */
-static void write_span_rgb_LOOKUP_pixmap( RGB_SPAN_ARGS )
+static void put_row_rgb_LOOKUP_pixmap( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    LOOKUP_SETUP;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1000,7 +1127,7 @@ static void write_span_rgb_LOOKUP_pixmap( RGB_SPAN_ARGS )
       }
    }
    else {
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       for (i=0;i<n;i++) {
          XMesaPutPixel( rowimg, i, 0, LOOKUP(rgb[i][RCOMP],rgb[i][GCOMP],rgb[i][BCOMP]) );
       }
@@ -1009,18 +1136,19 @@ static void write_span_rgb_LOOKUP_pixmap( RGB_SPAN_ARGS )
 }
 
 
-
 /*
  * Write a span of PF_GRAYSCALE pixels to a pixmap.
  */
-static void write_span_GRAYSCALE_pixmap( RGBA_SPAN_ARGS )
+static void put_row_GRAYSCALE_pixmap( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1030,7 +1158,7 @@ static void write_span_GRAYSCALE_pixmap( RGBA_SPAN_ARGS )
       }
    }
    else {
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       for (i=0;i<n;i++) {
          XMesaPutPixel( rowimg, i, 0, GRAY_RGB(rgba[i][RCOMP],rgba[i][GCOMP],rgba[i][BCOMP]) );
       }
@@ -1042,14 +1170,16 @@ static void write_span_GRAYSCALE_pixmap( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_GRAYSCALE pixels to a pixmap (no alpha).
  */
-static void write_span_rgb_GRAYSCALE_pixmap( RGB_SPAN_ARGS )
+static void put_row_rgb_GRAYSCALE_pixmap( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1059,7 +1189,7 @@ static void write_span_rgb_GRAYSCALE_pixmap( RGB_SPAN_ARGS )
       }
    }
    else {
-      XMesaImage *rowimg = xmesa->xm_buffer->rowimage;
+      XMesaImage *rowimg = XMESA_BUFFER(ctx->DrawBuffer)->rowimage;
       for (i=0;i<n;i++) {
          XMesaPutPixel( rowimg, i, 0, GRAY_RGB(rgb[i][RCOMP],rgb[i][GCOMP],rgb[i][BCOMP]) );
       }
@@ -1067,16 +1197,17 @@ static void write_span_rgb_GRAYSCALE_pixmap( RGB_SPAN_ARGS )
    }
 }
 
-
 /*
  * Write a span of PF_TRUECOLOR pixels to an XImage.
  */
-static void write_span_TRUECOLOR_ximage( RGBA_SPAN_ARGS )
+static void put_row_TRUECOLOR_ximage( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1100,12 +1231,14 @@ static void write_span_TRUECOLOR_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_TRUECOLOR pixels to an XImage (no alpha).
  */
-static void write_span_rgb_TRUECOLOR_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_TRUECOLOR_ximage( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1129,12 +1262,14 @@ static void write_span_rgb_TRUECOLOR_ximage( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_TRUEDITHER pixels to an XImage.
  */
-static void write_span_TRUEDITHER_ximage( RGBA_SPAN_ARGS )
+static void put_row_TRUEDITHER_ximage( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1158,12 +1293,14 @@ static void write_span_TRUEDITHER_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_TRUEDITHER pixels to an XImage (no alpha).
  */
-static void write_span_rgb_TRUEDITHER_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_TRUEDITHER_ximage( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1187,11 +1324,13 @@ static void write_span_rgb_TRUEDITHER_ximage( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_8A8B8G8R-format pixels to an ximage.
  */
-static void write_span_8A8B8G8R_ximage( RGBA_SPAN_ARGS )
+static void put_row_8A8B8G8R_ximage( PUT_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLuint *ptr = PIXELADDR4( xmesa->xm_buffer, x, y );
+   register GLuint *ptr = PIXEL_ADDR4(xrb, x, y);
+   (void) ctx;
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -1211,11 +1350,12 @@ static void write_span_8A8B8G8R_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_8A8B8G8R-format pixels to an ximage (no alpha).
  */
-static void write_span_rgb_8A8B8G8R_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_8A8B8G8R_ximage( RGB_SPAN_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLuint *ptr = PIXELADDR4( xmesa->xm_buffer, x, y );
+   register GLuint *ptr = PIXEL_ADDR4(xrb, x, y);
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -1231,15 +1371,65 @@ static void write_span_rgb_8A8B8G8R_ximage( RGB_SPAN_ARGS )
    }
 }
 
+/*
+ * Write a span of PF_8A8R8G8B-format pixels to an ximage.
+ */
+static void put_row_8A8R8G8B_ximage( PUT_ROW_ARGS )
+{
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
+   register GLuint i;
+   register GLuint *ptr = PIXEL_ADDR4(xrb, x, y);
+   if (mask) {
+      for (i=0;i<n;i++) {
+         if (mask[i]) {
+            ptr[i] = PACK_8A8R8G8B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] );
+         }
+      }
+   }
+   else {
+      /* draw all pixels */
+      for (i=0;i<n;i++) {
+         ptr[i] = PACK_8A8R8G8B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] );
+      }
+   }
+}
+
+
+/*
+ * Write a span of PF_8A8R8G8B-format pixels to an ximage (no alpha).
+ */
+static void put_row_rgb_8A8R8G8B_ximage( RGB_SPAN_ARGS )
+{
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
+   register GLuint i;
+   register GLuint *ptr = PIXEL_ADDR4(xrb, x, y);
+   if (mask) {
+      for (i=0;i<n;i++) {
+         if (mask[i]) {
+            ptr[i] = PACK_8A8R8G8B( rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255 );
+         }
+      }
+   }
+   else {
+      /* draw all pixels */
+      for (i=0;i<n;i++) {
+         ptr[i] = PACK_8A8R8G8B( rgb[i][RCOMP], rgb[i][GCOMP], rgb[i][BCOMP], 255 );
+      }
+   }
+}
+
 
 /*
  * Write a span of PF_8R8G8B-format pixels to an ximage.
  */
-static void write_span_8R8G8B_ximage( RGBA_SPAN_ARGS )
+static void put_row_8R8G8B_ximage( PUT_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLuint *ptr = PIXELADDR4( xmesa->xm_buffer, x, y );
+   register GLuint *ptr = PIXEL_ADDR4(xrb, x, y);
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -1258,11 +1448,12 @@ static void write_span_8R8G8B_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_8R8G8B24-format pixels to an ximage.
  */
-static void write_span_8R8G8B24_ximage( RGBA_SPAN_ARGS )
+static void put_row_8R8G8B24_ximage( PUT_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLubyte *ptr = (GLubyte *) PIXELADDR3( xmesa->xm_buffer, x, y );
+   register GLubyte *ptr = (GLubyte *) PIXEL_ADDR3(xrb, x, y );
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -1280,7 +1471,7 @@ static void write_span_8R8G8B24_ximage( RGBA_SPAN_ARGS )
                   pixel &= 0x00ffffff;
                   pixel |= rgba[i][BCOMP] << 24;
                   *ptr4++ = pixel;
-                  pixel = *ptr4 && 0xffff0000;
+                  pixel = *ptr4 & 0xffff0000;
                   pixel |= rgba[i][GCOMP];
                   pixel |= rgba[i][RCOMP] << 8;
                   *ptr4 = pixel;
@@ -1290,7 +1481,7 @@ static void write_span_8R8G8B24_ximage( RGBA_SPAN_ARGS )
                   pixel |= rgba[i][BCOMP] << 16;
                   pixel |= rgba[i][GCOMP] << 24;
                   *ptr4++ = pixel;
-                  pixel = *ptr4 && 0xffffff00;
+                  pixel = *ptr4 & 0xffffff00;
                   pixel |= rgba[i][RCOMP];
                   *ptr4 = pixel;
                   break;
@@ -1320,7 +1511,7 @@ static void write_span_8R8G8B24_ximage( RGBA_SPAN_ARGS )
             pixel &= 0x00ffffff;
             pixel |= rgba[i][BCOMP] << 24;
             *ptr4++ = pixel;
-            pixel = *ptr4 && 0xffff0000;
+            pixel = *ptr4 & 0xffff0000;
             pixel |= rgba[i][GCOMP];
             pixel |= rgba[i++][RCOMP] << 8;
             *ptr4 = pixel;
@@ -1331,7 +1522,7 @@ static void write_span_8R8G8B24_ximage( RGBA_SPAN_ARGS )
             pixel |= rgba[i][BCOMP] << 16;
             pixel |= rgba[i][GCOMP] << 24;
             *ptr4++ = pixel;
-            pixel = *ptr4 && 0xffffff00;
+            pixel = *ptr4 & 0xffffff00;
             pixel |= rgba[i++][RCOMP];
             *ptr4 = pixel;
             if (0 == --w)
@@ -1408,11 +1599,12 @@ static void write_span_8R8G8B24_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_8R8G8B-format pixels to an ximage (no alpha).
  */
-static void write_span_rgb_8R8G8B_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_8R8G8B_ximage( RGB_SPAN_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLuint *ptr = PIXELADDR4( xmesa->xm_buffer, x, y );
+   register GLuint *ptr = PIXEL_ADDR4(xrb, x, y);
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -1432,11 +1624,12 @@ static void write_span_rgb_8R8G8B_ximage( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_8R8G8B24-format pixels to an ximage (no alpha).
  */
-static void write_span_rgb_8R8G8B24_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_8R8G8B24_ximage( RGB_SPAN_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLubyte *ptr = (GLubyte *) PIXELADDR3( xmesa->xm_buffer, x, y );
+   register GLubyte *ptr = (GLubyte *) PIXEL_ADDR3(xrb, x, y);
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -1463,11 +1656,12 @@ static void write_span_rgb_8R8G8B24_ximage( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_5R6G5B-format pixels to an ximage.
  */
-static void write_span_5R6G5B_ximage( RGBA_SPAN_ARGS )
+static void put_row_5R6G5B_ximage( PUT_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLushort *ptr = PIXELADDR2( xmesa->xm_buffer, x, y );
+   register GLushort *ptr = PIXEL_ADDR2(xrb, x, y);
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -1502,12 +1696,14 @@ static void write_span_5R6G5B_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_DITHER_5R6G5B-format pixels to an ximage.
  */
-static void write_span_DITHER_5R6G5B_ximage( RGBA_SPAN_ARGS )
+static void put_row_DITHER_5R6G5B_ximage( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint i;
-   register GLushort *ptr = PIXELADDR2( xmesa->xm_buffer, x, y );
-   const GLint y2 = FLIP(xmesa->xm_buffer, y);
+   register GLushort *ptr = PIXEL_ADDR2(xrb, x, y);
+   const GLint y2 = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1542,11 +1738,12 @@ static void write_span_DITHER_5R6G5B_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_5R6G5B-format pixels to an ximage (no alpha).
  */
-static void write_span_rgb_5R6G5B_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_5R6G5B_ximage( RGB_SPAN_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLushort *ptr = PIXELADDR2( xmesa->xm_buffer, x, y );
+   register GLushort *ptr = PIXEL_ADDR2(xrb, x, y);
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -1581,11 +1778,13 @@ static void write_span_rgb_5R6G5B_ximage( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_DITHER_5R6G5B-format pixels to an ximage (no alpha).
  */
-static void write_span_rgb_DITHER_5R6G5B_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_DITHER_5R6G5B_ximage( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint i;
-   register GLushort *ptr = PIXELADDR2( xmesa->xm_buffer, x, y );
+   register GLushort *ptr = PIXEL_ADDR2(xrb, x, y );
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1620,12 +1819,13 @@ static void write_span_rgb_DITHER_5R6G5B_ximage( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_DITHER pixels to an XImage.
  */
-static void write_span_DITHER_ximage( RGBA_SPAN_ARGS )
+static void put_row_DITHER_ximage( PUT_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
-   int yy = FLIP(xmesa->xm_buffer, y);
+   int yy = YFLIP(xrb, y);
    XDITHER_SETUP(yy);
    if (mask) {
       for (i=0;i<n;i++,x++) {
@@ -1646,12 +1846,13 @@ static void write_span_DITHER_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_DITHER pixels to an XImage (no alpha).
  */
-static void write_span_rgb_DITHER_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_DITHER_ximage( RGB_SPAN_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
-   int yy = FLIP(xmesa->xm_buffer, y);
+   int yy = YFLIP(xrb, y);
    XDITHER_SETUP(yy);
    if (mask) {
       for (i=0;i<n;i++,x++) {
@@ -1673,11 +1874,12 @@ static void write_span_rgb_DITHER_ximage( RGB_SPAN_ARGS )
 /*
  * Write a span of 8-bit PF_DITHER pixels to an XImage.
  */
-static void write_span_DITHER8_ximage( RGBA_SPAN_ARGS )
+static void put_row_DITHER8_ximage( PUT_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer, x, y );
+   register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    XDITHER_SETUP(y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
@@ -1694,11 +1896,12 @@ static void write_span_DITHER8_ximage( RGBA_SPAN_ARGS )
 }
 
 
-static void write_span_rgb_DITHER8_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_DITHER8_ximage( RGB_SPAN_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer, x, y );
+   register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    XDITHER_SETUP(y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
@@ -1721,13 +1924,15 @@ static void write_span_rgb_DITHER8_ximage( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_1BIT pixels to an XImage.
  */
-static void write_span_1BIT_ximage( RGBA_SPAN_ARGS )
+static void put_row_1BIT_ximage( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    SETUP_1BIT;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1746,13 +1951,15 @@ static void write_span_1BIT_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_1BIT pixels to an XImage (no alpha).
  */
-static void write_span_rgb_1BIT_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_1BIT_ximage( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    SETUP_1BIT;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1771,11 +1978,13 @@ static void write_span_rgb_1BIT_ximage( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_HPCR pixels to an XImage.
  */
-static void write_span_HPCR_ximage( RGBA_SPAN_ARGS )
+static void put_row_HPCR_ximage( PUT_ROW_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint i;
-   register GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer, x, y );
+   register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1795,11 +2004,13 @@ static void write_span_HPCR_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_HPCR pixels to an XImage (no alpha).
  */
-static void write_span_rgb_HPCR_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_HPCR_ximage( RGB_SPAN_ARGS )
 {
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint i;
-   register GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer, x, y );
+   register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1819,13 +2030,14 @@ static void write_span_rgb_HPCR_ximage( RGB_SPAN_ARGS )
 /*
  * Write a span of PF_LOOKUP pixels to an XImage.
  */
-static void write_span_LOOKUP_ximage( RGBA_SPAN_ARGS )
+static void put_row_LOOKUP_ximage( PUT_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    LOOKUP_SETUP;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1845,13 +2057,14 @@ static void write_span_LOOKUP_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_LOOKUP pixels to an XImage (no alpha).
  */
-static void write_span_rgb_LOOKUP_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_LOOKUP_ximage( RGB_SPAN_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    LOOKUP_SETUP;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1871,11 +2084,12 @@ static void write_span_rgb_LOOKUP_ximage( RGB_SPAN_ARGS )
 /*
  * Write a span of 8-bit PF_LOOKUP pixels to an XImage.
  */
-static void write_span_LOOKUP8_ximage( RGBA_SPAN_ARGS )
+static void put_row_LOOKUP8_ximage( PUT_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer, x, y );
+   register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    LOOKUP_SETUP;
    if (mask) {
       for (i=0;i<n;i++,x++) {
@@ -1893,14 +2107,12 @@ static void write_span_LOOKUP8_ximage( RGBA_SPAN_ARGS )
 }
 
 
-static void write_rgb_LOOKUP8_ximage( const GLcontext *ctx,
-                                      GLuint n, GLint x, GLint y,
-                                      CONST GLubyte rgb[][3],
-                                      const GLubyte mask[] )
+static void put_row_rgb_LOOKUP8_ximage( RGB_SPAN_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer, x, y );
+   register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    LOOKUP_SETUP;
    if (mask) {
       for (i=0;i<n;i++,x++) {
@@ -1923,12 +2135,13 @@ static void write_rgb_LOOKUP8_ximage( const GLcontext *ctx,
 /*
  * Write a span of PF_GRAYSCALE pixels to an XImage.
  */
-static void write_span_GRAYSCALE_ximage( RGBA_SPAN_ARGS )
+static void put_row_GRAYSCALE_ximage( PUT_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1948,12 +2161,13 @@ static void write_span_GRAYSCALE_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of PF_GRAYSCALE pixels to an XImage (no alpha).
  */
-static void write_span_rgb_GRAYSCALE_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_GRAYSCALE_ximage( RGB_SPAN_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -1973,11 +2187,12 @@ static void write_span_rgb_GRAYSCALE_ximage( RGB_SPAN_ARGS )
 /*
  * Write a span of 8-bit PF_GRAYSCALE pixels to an XImage.
  */
-static void write_span_GRAYSCALE8_ximage( RGBA_SPAN_ARGS )
+static void put_row_GRAYSCALE8_ximage( PUT_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer, x, y );
+   register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -1997,11 +2212,12 @@ static void write_span_GRAYSCALE8_ximage( RGBA_SPAN_ARGS )
 /*
  * Write a span of 8-bit PF_GRAYSCALE pixels to an XImage (no alpha).
  */
-static void write_span_rgb_GRAYSCALE8_ximage( RGB_SPAN_ARGS )
+static void put_row_rgb_GRAYSCALE8_ximage( RGB_SPAN_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer, x, y );
+   register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -2025,27 +2241,30 @@ static void write_span_rgb_GRAYSCALE8_ximage( RGB_SPAN_ARGS )
 /**********************************************************************/
 
 
-#define RGBA_PIXEL_ARGS   const GLcontext *ctx,                                \
-                         GLuint n, const GLint x[], const GLint y[],   \
-                         CONST GLubyte rgba[][4], const GLubyte mask[]
+#define PUT_VALUES_ARGS \
+       GLcontext *ctx, struct gl_renderbuffer *rb,     \
+       GLuint n, const GLint x[], const GLint y[],     \
+       const void *values, const GLubyte mask[]
 
 
 /*
  * Write an array of PF_TRUECOLOR pixels to a pixmap.
  */
-static void write_pixels_TRUECOLOR_pixmap( RGBA_PIXEL_ARGS )
+static void put_values_TRUECOLOR_pixmap( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
          unsigned long p;
          PACK_TRUECOLOR( p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
         XMesaSetForeground( dpy, gc, p );
-        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2054,19 +2273,21 @@ static void write_pixels_TRUECOLOR_pixmap( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_TRUEDITHER pixels to a pixmap.
  */
-static void write_pixels_TRUEDITHER_pixmap( RGBA_PIXEL_ARGS )
+static void put_values_TRUEDITHER_pixmap( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
          unsigned long p;
          PACK_TRUEDITHER(p, x[i], y[i], rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
          XMesaSetForeground( dpy, gc, p );
-         XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+         XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2075,37 +2296,61 @@ static void write_pixels_TRUEDITHER_pixmap( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_8A8B8G8R pixels to a pixmap.
  */
-static void write_pixels_8A8B8G8R_pixmap( RGBA_PIXEL_ARGS )
+static void put_values_8A8B8G8R_pixmap( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
         XMesaSetForeground( dpy, gc,
                          PACK_8A8B8G8R( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] ));
-        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
 
+/*
+ * Write an array of PF_8A8R8G8B pixels to a pixmap.
+ */
+static void put_values_8A8R8G8B_pixmap( PUT_VALUES_ARGS )
+{
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
+   XMesaDisplay *dpy = xmesa->xm_visual->display;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
+   register GLuint i;
+   for (i=0;i<n;i++) {
+      if (mask[i]) {
+        XMesaSetForeground( dpy, gc,
+                         PACK_8A8R8G8B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] ));
+        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
+      }
+   }
+}
 
 /*
  * Write an array of PF_8R8G8B pixels to a pixmap.
  */
-static void write_pixels_8R8G8B_pixmap( RGBA_PIXEL_ARGS )
+static void put_values_8R8G8B_pixmap( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
         XMesaSetForeground( dpy, gc, PACK_8R8G8B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] ) );
-        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2114,17 +2359,19 @@ static void write_pixels_8R8G8B_pixmap( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_8R8G8B24 pixels to a pixmap.
  */
-static void write_pixels_8R8G8B24_pixmap( RGBA_PIXEL_ARGS )
+static void put_values_8R8G8B24_pixmap( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
         XMesaSetForeground( dpy, gc, PACK_8R8G8B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] ) );
-        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2133,17 +2380,19 @@ static void write_pixels_8R8G8B24_pixmap( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_5R6G5B pixels to a pixmap.
  */
-static void write_pixels_5R6G5B_pixmap( RGBA_PIXEL_ARGS )
+static void put_values_5R6G5B_pixmap( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
         XMesaSetForeground( dpy, gc, PACK_5R6G5B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] ) );
-        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2152,19 +2401,21 @@ static void write_pixels_5R6G5B_pixmap( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_DITHER_5R6G5B pixels to a pixmap.
  */
-static void write_pixels_DITHER_5R6G5B_pixmap( RGBA_PIXEL_ARGS )
+static void put_values_DITHER_5R6G5B_pixmap( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
          unsigned long p;
          PACK_TRUEDITHER(p, x[i], y[i], rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
         XMesaSetForeground( dpy, gc, p );
-        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2173,19 +2424,21 @@ static void write_pixels_DITHER_5R6G5B_pixmap( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_DITHER pixels to a pixmap.
  */
-static void write_pixels_DITHER_pixmap( RGBA_PIXEL_ARGS )
+static void put_values_DITHER_pixmap( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    DITHER_SETUP;
    for (i=0;i<n;i++) {
       if (mask[i]) {
         XMesaSetForeground( dpy, gc,
                          DITHER(x[i], y[i], rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]) );
-        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2194,19 +2447,21 @@ static void write_pixels_DITHER_pixmap( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_1BIT pixels to a pixmap.
  */
-static void write_pixels_1BIT_pixmap( RGBA_PIXEL_ARGS )
+static void put_values_1BIT_pixmap( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    SETUP_1BIT;
    for (i=0;i<n;i++) {
       if (mask[i]) {
         XMesaSetForeground( dpy, gc,
                          DITHER_1BIT( x[i], y[i], rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] ));
-        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2215,18 +2470,20 @@ static void write_pixels_1BIT_pixmap( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_HPCR pixels to a pixmap.
  */
-static void write_pixels_HPCR_pixmap( RGBA_PIXEL_ARGS )
+static void put_values_HPCR_pixmap( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
          XMesaSetForeground( dpy, gc,
                          DITHER_HPCR( x[i], y[i], rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] ));
-         XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+         XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2235,18 +2492,20 @@ static void write_pixels_HPCR_pixmap( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_LOOKUP pixels to a pixmap.
  */
-static void write_pixels_LOOKUP_pixmap( RGBA_PIXEL_ARGS )
+static void put_values_LOOKUP_pixmap( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    LOOKUP_SETUP;
    for (i=0;i<n;i++) {
       if (mask[i]) {
          XMesaSetForeground( dpy, gc, LOOKUP( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] ) );
-         XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+         XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2255,17 +2514,19 @@ static void write_pixels_LOOKUP_pixmap( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_GRAYSCALE pixels to a pixmap.
  */
-static void write_pixels_GRAYSCALE_pixmap( RGBA_PIXEL_ARGS )
+static void put_values_GRAYSCALE_pixmap( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
          XMesaSetForeground( dpy, gc, GRAY_RGB( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] ) );
-         XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+         XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2274,16 +2535,18 @@ static void write_pixels_GRAYSCALE_pixmap( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_TRUECOLOR pixels to an ximage.
  */
-static void write_pixels_TRUECOLOR_ximage( RGBA_PIXEL_ARGS )
+static void put_values_TRUECOLOR_ximage( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
          unsigned long p;
          PACK_TRUECOLOR( p, rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
-        XMesaPutPixel( img, x[i], FLIP(xmesa->xm_buffer, y[i]), p );
+        XMesaPutPixel( img, x[i], YFLIP(xrb, y[i]), p );
       }
    }
 }
@@ -2292,16 +2555,18 @@ static void write_pixels_TRUECOLOR_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_TRUEDITHER pixels to an XImage.
  */
-static void write_pixels_TRUEDITHER_ximage( RGBA_PIXEL_ARGS )
+static void put_values_TRUEDITHER_ximage( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
          unsigned long p;
          PACK_TRUEDITHER(p, x[i], y[i], rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
-        XMesaPutPixel( img, x[i], FLIP(xmesa->xm_buffer, y[i]), p );
+        XMesaPutPixel( img, x[i], YFLIP(xrb, y[i]), p );
       }
    }
 }
@@ -2310,29 +2575,47 @@ static void write_pixels_TRUEDITHER_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_8A8B8G8R pixels to an ximage.
  */
-static void write_pixels_8A8B8G8R_ximage( RGBA_PIXEL_ARGS )
+static void put_values_8A8B8G8R_ximage( PUT_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLuint *ptr = PIXELADDR4( xmesa->xm_buffer, x[i], y[i] );
+        GLuint *ptr = PIXEL_ADDR4(xrb, x[i], y[i] );
          *ptr = PACK_8A8B8G8R( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] );
       }
    }
 }
 
+/*
+ * Write an array of PF_8A8R8G8B pixels to an ximage.
+ */
+static void put_values_8A8R8G8B_ximage( PUT_VALUES_ARGS )
+{
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
+   register GLuint i;
+   for (i=0;i<n;i++) {
+      if (mask[i]) {
+        GLuint *ptr = PIXEL_ADDR4(xrb, x[i], y[i]);
+         *ptr = PACK_8A8R8G8B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP], rgba[i][ACOMP] );
+      }
+   }
+}
+
 
 /*
  * Write an array of PF_8R8G8B pixels to an ximage.
  */
-static void write_pixels_8R8G8B_ximage( RGBA_PIXEL_ARGS )
+static void put_values_8R8G8B_ximage( PUT_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLuint *ptr = PIXELADDR4( xmesa->xm_buffer, x[i], y[i] );
+        GLuint *ptr = PIXEL_ADDR4(xrb, x[i], y[i]);
          *ptr = PACK_8R8G8B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
       }
    }
@@ -2342,13 +2625,14 @@ static void write_pixels_8R8G8B_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_8R8G8B24 pixels to an ximage.
  */
-static void write_pixels_8R8G8B24_ximage( RGBA_PIXEL_ARGS )
+static void put_values_8R8G8B24_ximage( PUT_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        bgr_t *ptr = PIXELADDR3( xmesa->xm_buffer, x[i], y[i] );
+        bgr_t *ptr = PIXEL_ADDR3(xrb, x[i], y[i] );
          ptr->r = rgba[i][RCOMP];
          ptr->g = rgba[i][GCOMP];
          ptr->b = rgba[i][BCOMP];
@@ -2360,13 +2644,14 @@ static void write_pixels_8R8G8B24_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_5R6G5B pixels to an ximage.
  */
-static void write_pixels_5R6G5B_ximage( RGBA_PIXEL_ARGS )
+static void put_values_5R6G5B_ximage( PUT_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLushort *ptr = PIXELADDR2( xmesa->xm_buffer, x[i], y[i] );
+        GLushort *ptr = PIXEL_ADDR2(xrb, x[i], y[i] );
          *ptr = PACK_5R6G5B( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
       }
    }
@@ -2376,13 +2661,15 @@ static void write_pixels_5R6G5B_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_DITHER_5R6G5B pixels to an ximage.
  */
-static void write_pixels_DITHER_5R6G5B_ximage( RGBA_PIXEL_ARGS )
+static void put_values_DITHER_5R6G5B_ximage( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLushort *ptr = PIXELADDR2( xmesa->xm_buffer, x[i], y[i] );
+        GLushort *ptr = PIXEL_ADDR2(xrb, x[i], y[i] );
          PACK_TRUEDITHER( *ptr, x[i], y[i], rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
       }
    }
@@ -2392,15 +2679,16 @@ static void write_pixels_DITHER_5R6G5B_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_DITHER pixels to an XImage.
  */
-static void write_pixels_DITHER_ximage( RGBA_PIXEL_ARGS )
+static void put_values_DITHER_ximage( PUT_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    DITHER_SETUP;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        XMesaPutPixel( img, x[i], FLIP(xmesa->xm_buffer, y[i]),
+        XMesaPutPixel( img, x[i], YFLIP(xrb, y[i]),
                     DITHER( x[i], y[i], rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] ) );
       }
    }
@@ -2410,14 +2698,15 @@ static void write_pixels_DITHER_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of 8-bit PF_DITHER pixels to an XImage.
  */
-static void write_pixels_DITHER8_ximage( RGBA_PIXEL_ARGS )
+static void put_values_DITHER8_ximage( PUT_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
    DITHER_SETUP;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer,x[i],y[i]);
+        GLubyte *ptr = PIXEL_ADDR1(xrb, x[i], y[i]);
         *ptr = (GLubyte) DITHER( x[i], y[i], rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
       }
    }
@@ -2427,15 +2716,17 @@ static void write_pixels_DITHER8_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_1BIT pixels to an XImage.
  */
-static void write_pixels_1BIT_ximage( RGBA_PIXEL_ARGS )
+static void put_values_1BIT_ximage( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    SETUP_1BIT;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        XMesaPutPixel( img, x[i], FLIP(xmesa->xm_buffer, y[i]),
+        XMesaPutPixel( img, x[i], YFLIP(xrb, y[i]),
                     DITHER_1BIT( x[i], y[i], rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] ));
       }
    }
@@ -2445,13 +2736,15 @@ static void write_pixels_1BIT_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_HPCR pixels to an XImage.
  */
-static void write_pixels_HPCR_ximage( RGBA_PIXEL_ARGS )
+static void put_values_HPCR_ximage( PUT_VALUES_ARGS )
 {
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-         GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer,x[i],y[i]);
+         GLubyte *ptr = PIXEL_ADDR1(xrb, x[i], y[i]);
          *ptr = (GLubyte) DITHER_HPCR( x[i], y[i], rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
       }
    }
@@ -2461,15 +2754,16 @@ static void write_pixels_HPCR_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_LOOKUP pixels to an XImage.
  */
-static void write_pixels_LOOKUP_ximage( RGBA_PIXEL_ARGS )
+static void put_values_LOOKUP_ximage( PUT_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    LOOKUP_SETUP;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        XMesaPutPixel( img, x[i], FLIP(xmesa->xm_buffer, y[i]), LOOKUP(rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]) );
+        XMesaPutPixel( img, x[i], YFLIP(xrb, y[i]), LOOKUP(rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]) );
       }
    }
 }
@@ -2478,14 +2772,15 @@ static void write_pixels_LOOKUP_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of 8-bit PF_LOOKUP pixels to an XImage.
  */
-static void write_pixels_LOOKUP8_ximage( RGBA_PIXEL_ARGS )
+static void put_values_LOOKUP8_ximage( PUT_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
    LOOKUP_SETUP;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer,x[i],y[i]);
+        GLubyte *ptr = PIXEL_ADDR1(xrb, x[i], y[i]);
         *ptr = (GLubyte) LOOKUP( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
       }
    }
@@ -2495,14 +2790,15 @@ static void write_pixels_LOOKUP8_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of PF_GRAYSCALE pixels to an XImage.
  */
-static void write_pixels_GRAYSCALE_ximage( RGBA_PIXEL_ARGS )
+static void put_values_GRAYSCALE_ximage( PUT_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        XMesaPutPixel( img, x[i], FLIP(xmesa->xm_buffer, y[i]),
+        XMesaPutPixel( img, x[i], YFLIP(xrb, y[i]),
                     GRAY_RGB( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] ) );
       }
    }
@@ -2512,13 +2808,14 @@ static void write_pixels_GRAYSCALE_ximage( RGBA_PIXEL_ARGS )
 /*
  * Write an array of 8-bit PF_GRAYSCALE pixels to an XImage.
  */
-static void write_pixels_GRAYSCALE8_ximage( RGBA_PIXEL_ARGS )
+static void put_values_GRAYSCALE8_ximage( PUT_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer, x[i], y[i] );
+        GLubyte *ptr = PIXEL_ADDR1(xrb, x[i], y[i] );
         *ptr = (GLubyte) GRAY_RGB( rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP] );
       }
    }
@@ -2531,25 +2828,29 @@ static void write_pixels_GRAYSCALE8_ximage( RGBA_PIXEL_ARGS )
 /*** Write MONO COLOR SPAN functions                                ***/
 /**********************************************************************/
 
-#define MONO_SPAN_ARGS const GLcontext *ctx,   \
-                       GLuint n, GLint x, GLint y, const GLchan color[4], \
-                        const GLubyte mask[]
+#define PUT_MONO_ROW_ARGS \
+       GLcontext *ctx, struct gl_renderbuffer *rb,     \
+       GLuint n, GLint x, GLint y, const void *value,  \
+       const GLubyte mask[]
+
 
 
 /*
  * Write a span of identical pixels to a pixmap.
  */
-static void write_span_mono_pixmap( MONO_SPAN_ARGS )
+static void put_mono_row_pixmap( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
-   const unsigned long pixel = xmesa_color_to_pixel(xmesa, color[RCOMP],
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
+   const unsigned long pixel = xmesa_color_to_pixel(ctx, color[RCOMP],
                color[GCOMP], color[BCOMP], color[ACOMP], xmesa->pixelformat);
    register GLuint i;
    XMesaSetForeground( xmesa->display, gc, pixel );
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
 
    /* New code contributed by Jeff Epler and cleaned up by Keith
     * Whitwell.  
@@ -2576,24 +2877,25 @@ static void write_span_mono_pixmap( MONO_SPAN_ARGS )
 
 
 
-static void write_span_mono_index_pixmap( const GLcontext *ctx, GLuint n,
-                                          GLint x, GLint y, GLuint colorIndex,
-                                          const GLubyte mask[] )
+static void
+put_mono_row_ci_pixmap( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GLuint colorIndex = *((GLuint *) value);
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    XMesaSetForeground( xmesa->display, gc, colorIndex );
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
 
    for (i = 0 ; i < n ;) {
       GLuint start = i;
       
       /* Identify and emit contiguous rendered pixels 
        */
-      while (i < n && mask[i])
+      while (i < n && (!mask || mask[i]))
         i++;
 
       if (start < i) 
@@ -2613,17 +2915,19 @@ static void write_span_mono_index_pixmap( const GLcontext *ctx, GLuint n,
 /*
  * Write a span of PF_TRUEDITHER pixels to a pixmap.
  */
-static void write_span_mono_TRUEDITHER_pixmap( MONO_SPAN_ARGS )
+static void put_mono_row_TRUEDITHER_pixmap( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLuint i;
-   int yy = FLIP(xmesa->xm_buffer, y);
+   int yy = YFLIP(xrb, y);
    for (i=0;i<n;i++,x++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
          unsigned long p;
          PACK_TRUEDITHER(p, x, yy, r, g, b);
          XMesaSetForeground( dpy, gc, p );
@@ -2636,18 +2940,20 @@ static void write_span_mono_TRUEDITHER_pixmap( MONO_SPAN_ARGS )
 /*
  * Write a span of PF_DITHER pixels to a pixmap.
  */
-static void write_span_mono_DITHER_pixmap( MONO_SPAN_ARGS )
+static void put_mono_row_DITHER_pixmap( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLuint i;
-   int yy = FLIP(xmesa->xm_buffer, y);
+   int yy = YFLIP(xrb, y);
    XDITHER_SETUP(yy);
    for (i=0;i<n;i++,x++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
          XMesaSetForeground( dpy, gc, XDITHER( x, r, g, b ) );
          XMesaDrawPoint( dpy, buffer, gc, (int) x, (int) yy );
       }
@@ -2658,18 +2964,20 @@ static void write_span_mono_DITHER_pixmap( MONO_SPAN_ARGS )
 /*
  * Write a span of PF_1BIT pixels to a pixmap.
  */
-static void write_span_mono_1BIT_pixmap( MONO_SPAN_ARGS )
+static void put_mono_row_1BIT_pixmap( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLuint i;
    SETUP_1BIT;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    for (i=0;i<n;i++,x++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
          XMesaSetForeground( dpy, gc, DITHER_1BIT( x, y, r, g, b ) );
          XMesaDrawPoint( dpy, buffer, gc, (int) x, (int) y );
       }
@@ -2680,33 +2988,34 @@ static void write_span_mono_1BIT_pixmap( MONO_SPAN_ARGS )
 /*
  * Write a span of identical pixels to an XImage.
  */
-static void write_span_mono_ximage( MONO_SPAN_ARGS )
+static void put_mono_row_ximage( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
-   const unsigned long pixel = xmesa_color_to_pixel(xmesa, color[RCOMP],
+   const unsigned long pixel = xmesa_color_to_pixel(ctx, color[RCOMP],
                color[GCOMP], color[BCOMP], color[ACOMP], xmesa->pixelformat);
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    for (i=0;i<n;i++,x++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
         XMesaPutPixel( img, x, y, pixel );
       }
    }
 }
 
 
-static void write_span_mono_index_ximage( const GLcontext *ctx, GLuint n,
-                                          GLint x, GLint y,
-                                          GLuint colorIndex,
-                                          const GLubyte mask[] )
+static void
+put_mono_row_ci_ximage( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLuint colorIndex = *((GLuint *) value);
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    for (i=0;i<n;i++,x++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
         XMesaPutPixel( img, x, y, colorIndex );
       }
    }
@@ -2716,15 +3025,17 @@ static void write_span_mono_index_ximage( const GLcontext *ctx, GLuint n,
 /*
  * Write a span of identical PF_TRUEDITHER pixels to an XImage.
  */
-static void write_span_mono_TRUEDITHER_ximage( MONO_SPAN_ARGS )
+static void put_mono_row_TRUEDITHER_ximage( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   XMesaImage *img = xrb->ximage;
    const GLint r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    for (i=0;i<n;i++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
          unsigned long p;
          PACK_TRUEDITHER( p, x+i, y, r, g, b);
         XMesaPutPixel( img, x+i, y, p );
@@ -2736,15 +3047,36 @@ static void write_span_mono_TRUEDITHER_ximage( MONO_SPAN_ARGS )
 /*
  * Write a span of identical 8A8B8G8R pixels to an XImage.
  */
-static void write_span_mono_8A8B8G8R_ximage( MONO_SPAN_ARGS )
+static void put_mono_row_8A8B8G8R_ximage( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
    GLuint i, *ptr;
-   const unsigned long pixel = xmesa_color_to_pixel(xmesa, color[RCOMP],
+   const unsigned long pixel = xmesa_color_to_pixel(ctx, color[RCOMP],
                color[GCOMP], color[BCOMP], color[ACOMP], xmesa->pixelformat);
-   ptr = PIXELADDR4( xmesa->xm_buffer, x, y );
+   ptr = PIXEL_ADDR4(xrb, x, y );
    for (i=0;i<n;i++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
+        ptr[i] = pixel;
+      }
+   }
+}
+
+/*
+ * Write a span of identical 8A8R8G8B pixels to an XImage.
+ */
+static void put_mono_row_8A8R8G8B_ximage( PUT_MONO_ROW_ARGS )
+{
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
+   GLuint i, *ptr;
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const unsigned long pixel = xmesa_color_to_pixel(ctx, color[RCOMP],
+               color[GCOMP], color[BCOMP], color[ACOMP], xmesa->pixelformat);
+   ptr = PIXEL_ADDR4(xrb, x, y );
+   for (i=0;i<n;i++) {
+      if (!mask || mask[i]) {
         ptr[i] = pixel;
       }
    }
@@ -2754,11 +3086,12 @@ static void write_span_mono_8A8B8G8R_ximage( MONO_SPAN_ARGS )
 /*
  * Write a span of identical 8R8G8B pixels to an XImage.
  */
-static void write_span_mono_8R8G8B_ximage( MONO_SPAN_ARGS )
+static void put_mono_row_8R8G8B_ximage( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const GLuint pixel = PACK_8R8G8B(color[RCOMP], color[GCOMP], color[BCOMP]);
-   GLuint *ptr = PIXELADDR4( xmesa->xm_buffer, x, y );
+   GLuint *ptr = PIXEL_ADDR4(xrb, x, y );
    GLuint i;
    for (i=0;i<n;i++) {
       if (!mask || mask[i]) {
@@ -2771,16 +3104,17 @@ static void write_span_mono_8R8G8B_ximage( MONO_SPAN_ARGS )
 /*
  * Write a span of identical 8R8G8B pixels to an XImage.
  */
-static void write_span_mono_8R8G8B24_ximage( MONO_SPAN_ARGS )
+static void put_mono_row_8R8G8B24_ximage( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP];
    const GLubyte g = color[GCOMP];
    const GLubyte b = color[BCOMP];
    GLuint i;
-   bgr_t *ptr = PIXELADDR3( xmesa->xm_buffer, x, y );
+   bgr_t *ptr = PIXEL_ADDR3(xrb, x, y );
    for (i=0;i<n;i++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
          ptr[i].r = r;
          ptr[i].g = g;
          ptr[i].b = b;
@@ -2792,16 +3126,17 @@ static void write_span_mono_8R8G8B24_ximage( MONO_SPAN_ARGS )
 /*
  * Write a span of identical DITHER pixels to an XImage.
  */
-static void write_span_mono_DITHER_ximage( MONO_SPAN_ARGS )
+static void put_mono_row_DITHER_ximage( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
-   XMesaImage *img = xmesa->xm_buffer->backimage;
-   int yy = FLIP(xmesa->xm_buffer, y);
+   XMesaImage *img = xrb->ximage;
+   int yy = YFLIP(xrb, y);
    register GLuint i;
    XDITHER_SETUP(yy);
    for (i=0;i<n;i++,x++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
         XMesaPutPixel( img, x, yy, XDITHER( x, r, g, b ) );
       }
    }
@@ -2811,15 +3146,16 @@ static void write_span_mono_DITHER_ximage( MONO_SPAN_ARGS )
 /*
  * Write a span of identical 8-bit DITHER pixels to an XImage.
  */
-static void write_span_mono_DITHER8_ximage( MONO_SPAN_ARGS )
+static void put_mono_row_DITHER8_ximage( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
-   register GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer,x,y);
+   register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    register GLuint i;
    XDITHER_SETUP(y);
    for (i=0;i<n;i++,x++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
         ptr[i] = (GLubyte) XDITHER( x, r, g, b );
       }
    }
@@ -2829,16 +3165,17 @@ static void write_span_mono_DITHER8_ximage( MONO_SPAN_ARGS )
 /*
  * Write a span of identical 8-bit LOOKUP pixels to an XImage.
  */
-static void write_span_mono_LOOKUP8_ximage( MONO_SPAN_ARGS )
+static void put_mono_row_LOOKUP8_ximage( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    register GLuint i;
-   register GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer,x,y);
+   register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    GLubyte pixel;
    LOOKUP_SETUP;
    pixel = LOOKUP(color[RCOMP], color[GCOMP], color[BCOMP]);
    for (i=0;i<n;i++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
         ptr[i] = pixel;
       }
    }
@@ -2848,16 +3185,18 @@ static void write_span_mono_LOOKUP8_ximage( MONO_SPAN_ARGS )
 /*
  * Write a span of identical PF_1BIT pixels to an XImage.
  */
-static void write_span_mono_1BIT_ximage( MONO_SPAN_ARGS )
+static void put_mono_row_1BIT_ximage( PUT_MONO_ROW_ARGS )
 {
+   const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    SETUP_1BIT;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    for (i=0;i<n;i++,x++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
         XMesaPutPixel( img, x, y, DITHER_1BIT( x, y, r, g, b ) );
       }
    }
@@ -2867,14 +3206,16 @@ static void write_span_mono_1BIT_ximage( MONO_SPAN_ARGS )
 /*
  * Write a span of identical HPCR pixels to an XImage.
  */
-static void write_span_mono_HPCR_ximage( MONO_SPAN_ARGS )
+static void put_mono_row_HPCR_ximage( PUT_MONO_ROW_ARGS )
 {
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
-   register GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer,x,y);
+   register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    register GLuint i;
    for (i=0;i<n;i++,x++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
          ptr[i] = DITHER_HPCR( x, y, r, g, b );
       }
    }
@@ -2884,14 +3225,15 @@ static void write_span_mono_HPCR_ximage( MONO_SPAN_ARGS )
 /*
  * Write a span of identical 8-bit GRAYSCALE pixels to an XImage.
  */
-static void write_span_mono_GRAYSCALE8_ximage( MONO_SPAN_ARGS )
+static void put_mono_row_GRAYSCALE8_ximage( PUT_MONO_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const GLubyte p = GRAY_RGB(color[RCOMP], color[GCOMP], color[BCOMP]);
-   GLubyte *ptr = (GLubyte *) PIXELADDR1( xmesa->xm_buffer,x,y);
+   GLubyte *ptr = (GLubyte *) PIXEL_ADDR1(xrb, x, y);
    GLuint i;
    for (i=0;i<n;i++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
         ptr[i] = p;
       }
    }
@@ -2902,15 +3244,17 @@ static void write_span_mono_GRAYSCALE8_ximage( MONO_SPAN_ARGS )
 /*
  * Write a span of identical PF_DITHER_5R6G5B pixels to an XImage.
  */
-static void write_span_mono_DITHER_5R6G5B_ximage( MONO_SPAN_ARGS )
+static void put_mono_row_DITHER_5R6G5B_ximage( PUT_MONO_ROW_ARGS )
 {
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   register GLushort *ptr = PIXELADDR2( xmesa->xm_buffer, x, y );
+   register GLushort *ptr = PIXEL_ADDR2(xrb, x, y );
    const GLint r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    for (i=0;i<n;i++) {
-      if (mask[i]) {
+      if (!mask || mask[i]) {
          PACK_TRUEDITHER(ptr[i], x+i, y, r, g, b);
       }
    }
@@ -2922,48 +3266,52 @@ static void write_span_mono_DITHER_5R6G5B_ximage( MONO_SPAN_ARGS )
 /*** Write MONO COLOR PIXELS functions                              ***/
 /**********************************************************************/
 
-#define MONO_PIXEL_ARGS        const GLcontext *ctx,                           \
-                       GLuint n, const GLint x[], const GLint y[],     \
-                       const GLchan color[4], const GLubyte mask[]
+#define PUT_MONO_VALUES_ARGS \
+       GLcontext *ctx, struct gl_renderbuffer *rb,     \
+       GLuint n, const GLint x[], const GLint y[],     \
+       const void *value, const GLubyte mask[]
+
+
 
 /*
  * Write an array of identical pixels to a pixmap.
  */
-static void write_pixels_mono_pixmap( MONO_PIXEL_ARGS )
+static void put_mono_values_pixmap( PUT_MONO_VALUES_ARGS )
 {
+   const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   const unsigned long pixel = xmesa_color_to_pixel(xmesa, color[RCOMP],
+   const unsigned long pixel = xmesa_color_to_pixel(ctx, color[RCOMP],
                color[GCOMP], color[BCOMP], color[ACOMP], xmesa->pixelformat);
    XMesaSetForeground( xmesa->display, gc, pixel );
    for (i=0;i<n;i++) {
       if (mask[i]) {
         XMesaDrawPoint( dpy, buffer, gc,
-                         (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+                         (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
 
 
-static void write_pixels_mono_index_pixmap(const GLcontext *ctx,
-                                           GLuint n,
-                                           const GLint x[], const GLint y[],
-                                           GLuint colorIndex,
-                                           const GLubyte mask[] )
+static void
+put_mono_values_ci_pixmap( PUT_MONO_VALUES_ARGS )
 {
+   const GLuint colorIndex = *((GLuint *) value);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    XMesaSetForeground( xmesa->display, gc, colorIndex );
    for (i=0;i<n;i++) {
       if (mask[i]) {
         XMesaDrawPoint( dpy, buffer, gc,
-                         (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+                         (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2972,12 +3320,14 @@ static void write_pixels_mono_index_pixmap(const GLcontext *ctx,
 /*
  * Write an array of PF_TRUEDITHER pixels to a pixmap.
  */
-static void write_pixels_mono_TRUEDITHER_pixmap( MONO_PIXEL_ARGS )
+static void put_mono_values_TRUEDITHER_pixmap( PUT_MONO_VALUES_ARGS )
 {
+   const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    for (i=0;i<n;i++) {
@@ -2986,7 +3336,7 @@ static void write_pixels_mono_TRUEDITHER_pixmap( MONO_PIXEL_ARGS )
          PACK_TRUEDITHER(p, x[i], y[i], r, g, b);
          XMesaSetForeground( dpy, gc, p );
         XMesaDrawPoint( dpy, buffer, gc,
-                         (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+                         (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -2995,19 +3345,21 @@ static void write_pixels_mono_TRUEDITHER_pixmap( MONO_PIXEL_ARGS )
 /*
  * Write an array of PF_DITHER pixels to a pixmap.
  */
-static void write_pixels_mono_DITHER_pixmap( MONO_PIXEL_ARGS )
+static void put_mono_values_DITHER_pixmap( PUT_MONO_VALUES_ARGS )
 {
+   const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    DITHER_SETUP;
    for (i=0;i<n;i++) {
       if (mask[i]) {
          XMesaSetForeground( dpy, gc, DITHER( x[i], y[i], r, g, b ) );
-        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -3016,19 +3368,21 @@ static void write_pixels_mono_DITHER_pixmap( MONO_PIXEL_ARGS )
 /*
  * Write an array of PF_1BIT pixels to a pixmap.
  */
-static void write_pixels_mono_1BIT_pixmap( MONO_PIXEL_ARGS )
+static void put_mono_values_1BIT_pixmap( PUT_MONO_VALUES_ARGS )
 {
+   const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    SETUP_1BIT;
    for (i=0;i<n;i++) {
       if (mask[i]) {
          XMesaSetForeground( dpy, gc, DITHER_1BIT( x[i], y[i], r, g, b ) );
-        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -3037,32 +3391,33 @@ static void write_pixels_mono_1BIT_pixmap( MONO_PIXEL_ARGS )
 /*
  * Write an array of identical pixels to an XImage.
  */
-static void write_pixels_mono_ximage( MONO_PIXEL_ARGS )
+static void put_mono_values_ximage( PUT_MONO_VALUES_ARGS )
 {
+   const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
-   const unsigned long pixel = xmesa_color_to_pixel(xmesa, color[RCOMP],
+   const unsigned long pixel = xmesa_color_to_pixel(ctx, color[RCOMP],
                color[GCOMP], color[BCOMP], color[ACOMP], xmesa->pixelformat);
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        XMesaPutPixel( img, x[i], FLIP(xmesa->xm_buffer, y[i]), pixel );
+        XMesaPutPixel( img, x[i], YFLIP(xrb, y[i]), pixel );
       }
    }
 }
 
 
-static void write_pixels_mono_index_ximage( const GLcontext *ctx, GLuint n,
-                                            const GLint x[], const GLint y[],
-                                            GLuint colorIndex,
-                                            const GLubyte mask[] )
+static void
+put_mono_values_ci_ximage( PUT_MONO_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLuint colorIndex = *((GLuint *) value);
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        XMesaPutPixel( img, x[i], FLIP(xmesa->xm_buffer, y[i]), colorIndex );
+        XMesaPutPixel( img, x[i], YFLIP(xrb, y[i]), colorIndex );
       }
    }
 }
@@ -3071,17 +3426,19 @@ static void write_pixels_mono_index_ximage( const GLcontext *ctx, GLuint n,
 /*
  * Write an array of identical TRUEDITHER pixels to an XImage.
  */
-static void write_pixels_mono_TRUEDITHER_ximage( MONO_PIXEL_ARGS )
+static void put_mono_values_TRUEDITHER_ximage( PUT_MONO_VALUES_ARGS )
 {
+   const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    const int r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    for (i=0;i<n;i++) {
       if (mask[i]) {
          unsigned long p;
-         PACK_TRUEDITHER(p, x[i], FLIP(xmesa->xm_buffer, y[i]), r, g, b);
-        XMesaPutPixel( img, x[i], FLIP(xmesa->xm_buffer, y[i]), p );
+         PACK_TRUEDITHER(p, x[i], YFLIP(xrb, y[i]), r, g, b);
+        XMesaPutPixel( img, x[i], YFLIP(xrb, y[i]), p );
       }
    }
 }
@@ -3091,32 +3448,51 @@ static void write_pixels_mono_TRUEDITHER_ximage( MONO_PIXEL_ARGS )
 /*
  * Write an array of identical 8A8B8G8R pixels to an XImage
  */
-static void write_pixels_mono_8A8B8G8R_ximage( MONO_PIXEL_ARGS )
+static void put_mono_values_8A8B8G8R_ximage( PUT_MONO_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const GLuint p = PACK_8A8B8G8R(color[RCOMP], color[GCOMP],
                                   color[BCOMP], color[ACOMP]);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLuint *ptr = PIXELADDR4( xmesa->xm_buffer, x[i], y[i] );
+        GLuint *ptr = PIXEL_ADDR4(xrb, x[i], y[i] );
         *ptr = p;
       }
    }
 }
 
+/*
+ * Write an array of identical 8A8R8G8B pixels to an XImage
+ */
+static void put_mono_values_8A8R8G8B_ximage( PUT_MONO_VALUES_ARGS )
+{
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
+   const GLuint p = PACK_8A8R8G8B(color[RCOMP], color[GCOMP],
+                                  color[BCOMP], color[ACOMP]);
+   register GLuint i;
+   for (i=0;i<n;i++) {
+      if (mask[i]) {
+        GLuint *ptr = PIXEL_ADDR4(xrb, x[i], y[i] );
+        *ptr = p;
+      }
+   }
+}
 
 /*
  * Write an array of identical 8R8G8B pixels to an XImage.
  */
-static void write_pixels_mono_8R8G8B_ximage( MONO_PIXEL_ARGS )
+static void put_mono_values_8R8G8B_ximage( PUT_MONO_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    register GLuint i;
    const GLuint p = PACK_8R8G8B(color[RCOMP], color[GCOMP], color[BCOMP]);
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLuint *ptr = PIXELADDR4( xmesa->xm_buffer, x[i], y[i] );
+        GLuint *ptr = PIXEL_ADDR4(xrb, x[i], y[i] );
         *ptr = p;
       }
    }
@@ -3126,14 +3502,15 @@ static void write_pixels_mono_8R8G8B_ximage( MONO_PIXEL_ARGS )
 /*
  * Write an array of identical 8R8G8B pixels to an XImage.
  */
-static void write_pixels_mono_8R8G8B24_ximage( MONO_PIXEL_ARGS )
+static void put_mono_values_8R8G8B24_ximage( PUT_MONO_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        bgr_t *ptr = PIXELADDR3( xmesa->xm_buffer, x[i], y[i] );
+        bgr_t *ptr = PIXEL_ADDR3(xrb, x[i], y[i] );
          ptr->r = r;
          ptr->g = g;
          ptr->b = b;
@@ -3145,16 +3522,17 @@ static void write_pixels_mono_8R8G8B24_ximage( MONO_PIXEL_ARGS )
 /*
  * Write an array of identical PF_DITHER pixels to an XImage.
  */
-static void write_pixels_mono_DITHER_ximage( MONO_PIXEL_ARGS )
+static void put_mono_values_DITHER_ximage( PUT_MONO_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    DITHER_SETUP;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        XMesaPutPixel( img, x[i], FLIP(xmesa->xm_buffer, y[i]), DITHER( x[i], y[i], r, g, b ) );
+        XMesaPutPixel( img, x[i], YFLIP(xrb, y[i]), DITHER( x[i], y[i], r, g, b ) );
       }
    }
 }
@@ -3163,15 +3541,16 @@ static void write_pixels_mono_DITHER_ximage( MONO_PIXEL_ARGS )
 /*
  * Write an array of identical 8-bit PF_DITHER pixels to an XImage.
  */
-static void write_pixels_mono_DITHER8_ximage( MONO_PIXEL_ARGS )
+static void put_mono_values_DITHER8_ximage( PUT_MONO_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLuint i;
    DITHER_SETUP;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer,x[i],y[i]);
+        GLubyte *ptr = PIXEL_ADDR1(xrb, x[i], y[i]);
         *ptr = (GLubyte) DITHER( x[i], y[i], r, g, b );
       }
    }
@@ -3181,16 +3560,17 @@ static void write_pixels_mono_DITHER8_ximage( MONO_PIXEL_ARGS )
 /*
  * Write an array of identical 8-bit PF_LOOKUP pixels to an XImage.
  */
-static void write_pixels_mono_LOOKUP8_ximage( MONO_PIXEL_ARGS )
+static void put_mono_values_LOOKUP8_ximage( PUT_MONO_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    register GLuint i;
    GLubyte pixel;
    LOOKUP_SETUP;
    pixel = LOOKUP(color[RCOMP], color[GCOMP], color[BCOMP]);
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer,x[i],y[i]);
+        GLubyte *ptr = PIXEL_ADDR1(xrb, x[i], y[i]);
         *ptr = pixel;
       }
    }
@@ -3201,16 +3581,18 @@ static void write_pixels_mono_LOOKUP8_ximage( MONO_PIXEL_ARGS )
 /*
  * Write an array of identical PF_1BIT pixels to an XImage.
  */
-static void write_pixels_mono_1BIT_ximage( MONO_PIXEL_ARGS )
+static void put_mono_values_1BIT_ximage( PUT_MONO_VALUES_ARGS )
 {
+   const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    SETUP_1BIT;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        XMesaPutPixel( img, x[i], FLIP(xmesa->xm_buffer, y[i]),
+        XMesaPutPixel( img, x[i], YFLIP(xrb, y[i]),
                         DITHER_1BIT( x[i], y[i], r, g, b ));
       }
    }
@@ -3220,14 +3602,16 @@ static void write_pixels_mono_1BIT_ximage( MONO_PIXEL_ARGS )
 /*
  * Write an array of identical PF_HPCR pixels to an XImage.
  */
-static void write_pixels_mono_HPCR_ximage( MONO_PIXEL_ARGS )
+static void put_mono_values_HPCR_ximage( PUT_MONO_VALUES_ARGS )
 {
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-         GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer,x[i],y[i]);
+         GLubyte *ptr = PIXEL_ADDR1(xrb, x[i], y[i]);
          *ptr = DITHER_HPCR( x[i], y[i], r, g, b );
       }
    }
@@ -3237,14 +3621,15 @@ static void write_pixels_mono_HPCR_ximage( MONO_PIXEL_ARGS )
 /*
  * Write an array of identical 8-bit PF_GRAYSCALE pixels to an XImage.
  */
-static void write_pixels_mono_GRAYSCALE8_ximage( MONO_PIXEL_ARGS )
+static void put_mono_values_GRAYSCALE8_ximage( PUT_MONO_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    register GLuint i;
    register GLubyte p = GRAY_RGB(color[RCOMP], color[GCOMP], color[BCOMP]);
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLubyte *ptr = PIXELADDR1( xmesa->xm_buffer,x[i],y[i]);
+        GLubyte *ptr = PIXEL_ADDR1(xrb, x[i], y[i]);
         *ptr = p;
       }
    }
@@ -3254,14 +3639,16 @@ static void write_pixels_mono_GRAYSCALE8_ximage( MONO_PIXEL_ARGS )
 /*
  * Write an array of identical PF_DITHER_5R6G5B pixels to an XImage.
  */
-static void write_pixels_mono_DITHER_5R6G5B_ximage( MONO_PIXEL_ARGS )
+static void put_mono_values_DITHER_5R6G5B_ximage( PUT_MONO_VALUES_ARGS )
 {
+   const GLubyte *color = (const GLubyte *) value;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    const int r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        GLushort *ptr = PIXELADDR2( xmesa->xm_buffer, x[i], y[i] );
+        GLushort *ptr = PIXEL_ADDR2(xrb, x[i], y[i] );
          PACK_TRUEDITHER(*ptr, x[i], y[i], r, g, b);
       }
    }
@@ -3273,26 +3660,19 @@ static void write_pixels_mono_DITHER_5R6G5B_ximage( MONO_PIXEL_ARGS )
 /*** Write INDEX SPAN functions                                     ***/
 /**********************************************************************/
 
-#define INDEX_SPAN_ARGS        const GLcontext *ctx,                           \
-                       GLuint n, GLint x, GLint y, const GLuint index[], \
-                       const GLubyte mask[]
-
-#define INDEX8_SPAN_ARGS const GLcontext *ctx,                         \
-                        GLuint n, GLint x, GLint y, const GLubyte index[], \
-                        const GLubyte mask[]
-
-
 /*
  * Write a span of CI pixels to a Pixmap.
  */
-static void write_span_index_pixmap( INDEX_SPAN_ARGS )
+static void put_row_ci_pixmap( PUT_ROW_ARGS )
 {
+   const GLuint *index = (GLuint *) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
@@ -3311,124 +3691,50 @@ static void write_span_index_pixmap( INDEX_SPAN_ARGS )
 
 
 /*
- * Write a span of 8-bit CI pixels to a Pixmap.
+ * Write a span of CI pixels to an XImage.
  */
-static void write_span_index8_pixmap( INDEX8_SPAN_ARGS )
+static void put_row_ci_ximage( PUT_ROW_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   const GLuint *index = (const GLuint *) values;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
+   y = YFLIP(xrb, y);
    if (mask) {
       for (i=0;i<n;i++,x++) {
          if (mask[i]) {
-            XMesaSetForeground( dpy, gc, (unsigned long) index[i] );
-            XMesaDrawPoint( dpy, buffer, gc, (int) x, (int) y );
+            XMesaPutPixel( img, x, y, (unsigned long) index[i] );
          }
       }
    }
    else {
       for (i=0;i<n;i++,x++) {
-         XMesaSetForeground( dpy, gc, (unsigned long) index[i] );
-         XMesaDrawPoint( dpy, buffer, gc, (int) x, (int) y );
+         XMesaPutPixel( img, x, y, (unsigned long) index[i] );
       }
    }
 }
 
 
+/**********************************************************************/
+/*** Write INDEX PIXELS functions                                   ***/
+/**********************************************************************/
+
 /*
- * Write a span of CI pixels to an XImage.
+ * Write an array of CI pixels to a Pixmap.
  */
-static void write_span_index_ximage( INDEX_SPAN_ARGS )
-{
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
-   register GLuint i;
-   y = FLIP(xmesa->xm_buffer, y);
-   if (mask) {
-      for (i=0;i<n;i++,x++) {
-         if (mask[i]) {
-            XMesaPutPixel( img, x, y, (unsigned long) index[i] );
-         }
-      }
-   }
-   else {
-      for (i=0;i<n;i++,x++) {
-         XMesaPutPixel( img, x, y, (unsigned long) index[i] );
-      }
-   }
-}
-
-
-/*
- * Write a span of 8-bit CI pixels to a non 8-bit XImage.
- */
-static void write_span_index8_ximage( INDEX8_SPAN_ARGS )
-{
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   if (mask) {
-      GLuint i;
-      for (i=0;i<n;i++) {
-         if (mask[i]) {
-            XMesaPutPixel(xmesa->xm_buffer->backimage, x+i, y, index[i]);
-         }
-      }
-   }
-   else {
-      GLuint i;
-      for (i=0;i<n;i++) {
-         XMesaPutPixel(xmesa->xm_buffer->backimage, x+i, y, index[i]);
-      }
-   }
-}
-
-/*
- * Write a span of 8-bit CI pixels to an 8-bit XImage.
- */
-static void write_span_index8_ximage8( INDEX8_SPAN_ARGS )
-{
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   GLubyte *dst = PIXELADDR1( xmesa->xm_buffer,x,y);
-   if (mask) {
-      GLuint i;
-      for (i=0;i<n;i++) {
-         if (mask[i]) {
-            dst[i] = index[i];
-         }
-      }
-   }
-   else {
-      MEMCPY( dst, index, n );
-   }
-}
-
-
-
-/**********************************************************************/
-/*** Write INDEX PIXELS functions                                   ***/
-/**********************************************************************/
-
-#define INDEX_PIXELS_ARGS      const GLcontext *ctx,                   \
-                               GLuint n, const GLint x[], const GLint y[], \
-                               const GLuint index[], const GLubyte mask[]
-
-
-/*
- * Write an array of CI pixels to a Pixmap.
- */
-static void write_pixels_index_pixmap( INDEX_PIXELS_ARGS )
+static void put_values_ci_pixmap( PUT_VALUES_ARGS )
 {
+   const GLuint *index = (const GLuint *) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xmesa->xm_buffer->buffer;
-   XMesaGC gc = xmesa->xm_buffer->gc;
+   XMesaDrawable buffer = xrb->drawable;
+   XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
         XMesaSetForeground( dpy, gc, (unsigned long) index[i] );
-        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) FLIP(xmesa->xm_buffer, y[i]) );
+        XMesaDrawPoint( dpy, buffer, gc, (int) x[i], (int) YFLIP(xrb, y[i]) );
       }
    }
 }
@@ -3437,14 +3743,15 @@ static void write_pixels_index_pixmap( INDEX_PIXELS_ARGS )
 /*
  * Write an array of CI pixels to an XImage.
  */
-static void write_pixels_index_ximage( INDEX_PIXELS_ARGS )
+static void put_values_ci_ximage( PUT_VALUES_ARGS )
 {
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaImage *img = xmesa->xm_buffer->backimage;
+   const GLuint *index = (const GLuint *) values;
+   GET_XRB(xrb);
+   XMesaImage *img = xrb->ximage;
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
-        XMesaPutPixel( img, x[i], FLIP(xmesa->xm_buffer, y[i]), (unsigned long) index[i] );
+        XMesaPutPixel(img, x[i], YFLIP(xrb, y[i]), (unsigned long) index[i]);
       }
    }
 }
@@ -3466,14 +3773,17 @@ static void write_pixels_index_ximage( INDEX_PIXELS_ARGS )
  *          else return number of pixels to skip in the destination array.
  */
 static int
-clip_for_xgetimage(XMesaContext xmesa, GLuint *n, GLint *x, GLint *y)
+clip_for_xgetimage(GLcontext *ctx, GLuint *n, GLint *x, GLint *y)
 {
-   XMesaBuffer source = xmesa->xm_buffer;
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
+   XMesaBuffer source = XMESA_BUFFER(ctx->DrawBuffer);
    Window rootWin = RootWindow(xmesa->display, 0);
    Window child;
    GLint screenWidth = WidthOfScreen(DefaultScreenOfDisplay(xmesa->display));
    GLint dx, dy;
-   XTranslateCoordinates(xmesa->display, source->buffer, rootWin,
+   if (source->type == PBUFFER || source->type == PIXMAP)
+      return 0;
+   XTranslateCoordinates(xmesa->display, source->frontxrb->pixmap, rootWin,
                          *x, *y, &dx, &dy, &child);
    if (dx >= screenWidth) {
       /* totally clipped on right */
@@ -3502,26 +3812,28 @@ clip_for_xgetimage(XMesaContext xmesa, GLuint *n, GLint *x, GLint *y)
 /*
  * Read a horizontal span of color-index pixels.
  */
-static void read_index_span( const GLcontext *ctx,
-                            GLuint n, GLint x, GLint y, GLuint index[] )
+static void
+get_row_ci(GLcontext *ctx, struct gl_renderbuffer *rb,
+           GLuint n, GLint x, GLint y, void *values)
 {
+   GLuint *index = (GLuint *) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaBuffer source = xmesa->xm_buffer;
+   GET_XRB(xrb);
    GLuint i;
 
-   y = FLIP(source, y);
+   y = YFLIP(xrb, y);
 
-   if (source->buffer) {
+   if (xrb->pixmap) {
 #ifndef XFree86Server
       XMesaImage *span = NULL;
       int error;
-      int k = clip_for_xgetimage(xmesa, &n, &x, &y);
+      int k = clip_for_xgetimage(ctx, &n, &x, &y);
       if (k < 0)
          return;
       index += k;
 
       catch_xgetimage_errors( xmesa->display );
-      span = XGetImage( xmesa->display, source->buffer,
+      span = XGetImage( xmesa->display, xrb->pixmap,
                        x, y, n, 1, AllPlanes, ZPixmap );
       error = check_xgetimage_errors();
       if (span && !error) {
@@ -3539,13 +3851,13 @@ static void read_index_span( const GLcontext *ctx,
         XMesaDestroyImage( span );
       }
 #else
-      (*xmesa->display->GetImage)(source->buffer,
+      (*xmesa->display->GetImage)(xrb->drawable,
                                  x, y, n, 1, ZPixmap,
                                  ~0L, (pointer)index);
 #endif
    }
-   else if (source->backimage) {
-      XMesaImage *img = source->backimage;
+   else if (xrb->ximage) {
+      XMesaImage *img = xrb->ximage;
       for (i=0;i<n;i++,x++) {
         index[i] = (GLuint) XMesaGetPixel( img, x, y );
       }
@@ -3557,14 +3869,16 @@ static void read_index_span( const GLcontext *ctx,
 /*
  * Read a horizontal span of color pixels.
  */
-static void read_color_span( const GLcontext *ctx,
-                            GLuint n, GLint x, GLint y,
-                             GLubyte rgba[][4] )
+static void
+get_row_rgba(GLcontext *ctx, struct gl_renderbuffer *rb,
+             GLuint n, GLint x, GLint y, void *values)
 {
+   GLubyte (*rgba)[4] = (GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   XMesaBuffer source = xmesa->xm_buffer;
+   GET_XRB(xrb);
+   XMesaBuffer source = XMESA_BUFFER(ctx->DrawBuffer);
 
-   if (source->buffer) {
+   if (xrb->pixmap) {
       /* Read from Pixmap or Window */
       XMesaImage *span = NULL;
       int error;
@@ -3572,18 +3886,18 @@ static void read_color_span( const GLcontext *ctx,
       span = XMesaCreateImage(xmesa->xm_visual->BitsPerPixel, n, 1, NULL);
       span->data = (char *)MALLOC(span->height * span->bytes_per_line);
       error = (!span->data);
-      (*xmesa->display->GetImage)(source->buffer,
-                                 x, FLIP(source, y), n, 1, ZPixmap,
+      (*xmesa->display->GetImage)(xrb->drawable,
+                                 x, YFLIP(xrb, y), n, 1, ZPixmap,
                                  ~0L, (pointer)span->data);
 #else
       int k;
-      y = FLIP(source, y);
-      k = clip_for_xgetimage(xmesa, &n, &x, &y);
+      y = YFLIP(xrb, y);
+      k = clip_for_xgetimage(ctx, &n, &x, &y);
       if (k < 0)
          return;
       rgba += k;
       catch_xgetimage_errors( xmesa->display );
-      span = XGetImage( xmesa->display, source->buffer,
+      span = XGetImage( xmesa->display, xrb->pixmap,
                        x, y, n, 1, AllPlanes, ZPixmap );
       error = check_xgetimage_errors();
 #endif
@@ -3646,6 +3960,19 @@ static void read_color_span( const GLcontext *ctx,
                   }
               }
               break;
+            case PF_8A8R8G8B:
+               {
+                  const GLuint *ptr4 = (GLuint *) span->data;
+                  GLuint i;
+                  for (i=0;i<n;i++) {
+                     GLuint p4 = *ptr4++;
+                     rgba[i][RCOMP] = (GLubyte) ((p4 >> 16) & 0xff);
+                     rgba[i][GCOMP] = (GLubyte) ((p4 >> 8)  & 0xff);
+                     rgba[i][BCOMP] = (GLubyte) ( p4        & 0xff);
+                     rgba[i][ACOMP] = (GLubyte) ((p4 >> 24) & 0xff);
+                  }
+              }
+              break;
             case PF_8R8G8B:
                {
                   const GLuint *ptr4 = (GLuint *) span->data;
@@ -3744,7 +4071,7 @@ static void read_color_span( const GLcontext *ctx,
         XMesaDestroyImage( span );
       }
    }
-   else if (source->backimage) {
+   else if (xrb->ximage) {
       /* Read from XImage back buffer */
       switch (xmesa->pixelformat) {
          case PF_Truecolor:
@@ -3759,9 +4086,9 @@ static void read_color_span( const GLcontext *ctx,
                GLint rShift = xmesa->xm_visual->rshift;
                GLint gShift = xmesa->xm_visual->gshift;
                GLint bShift = xmesa->xm_visual->bshift;
-               XMesaImage *img = source->backimage;
+               XMesaImage *img = xrb->ximage;
                GLuint i;
-               y = FLIP(source, y);
+               y = YFLIP(xrb, y);
                for (i=0;i<n;i++) {
                   unsigned long p;
                  p = XMesaGetPixel( img, x+i, y );
@@ -3778,7 +4105,7 @@ static void read_color_span( const GLcontext *ctx,
                const GLubyte *pixelToR = xmesa->xm_visual->PixelToR;
                const GLubyte *pixelToG = xmesa->xm_visual->PixelToG;
                const GLubyte *pixelToB = xmesa->xm_visual->PixelToB;
-               const GLushort *ptr2 = PIXELADDR2( source, x, y );
+               const GLushort *ptr2 = PIXEL_ADDR2(xrb, x, y);
                GLuint i;
 #if defined(__i386__) /* word stores don't have to be on 4-byte boundaries */
                const GLuint *ptr4 = (const GLuint *) ptr2;
@@ -3822,7 +4149,7 @@ static void read_color_span( const GLcontext *ctx,
             break;
         case PF_8A8B8G8R:
             {
-               const GLuint *ptr4 = PIXELADDR4( source, x, y );
+               const GLuint *ptr4 = PIXEL_ADDR4(xrb, x, y);
                GLuint i;
                for (i=0;i<n;i++) {
                   GLuint p4 = *ptr4++;
@@ -3833,9 +4160,22 @@ static void read_color_span( const GLcontext *ctx,
                }
             }
            break;
+        case PF_8A8R8G8B:
+            {
+               const GLuint *ptr4 = PIXEL_ADDR4(xrb, x, y);
+               GLuint i;
+               for (i=0;i<n;i++) {
+                  GLuint p4 = *ptr4++;
+                  rgba[i][RCOMP] = (GLubyte) ((p4 >> 16) & 0xff);
+                  rgba[i][GCOMP] = (GLubyte) ((p4 >> 8)  & 0xff);
+                  rgba[i][BCOMP] = (GLubyte) ( p4        & 0xff);
+                  rgba[i][ACOMP] = (GLint)   ((p4 >> 24) & 0xff);
+               }
+            }
+           break;
         case PF_8R8G8B:
             {
-               const GLuint *ptr4 = PIXELADDR4( source, x, y );
+               const GLuint *ptr4 = PIXEL_ADDR4(xrb, x, y);
                GLuint i;
                for (i=0;i<n;i++) {
                   GLuint p4 = *ptr4++;
@@ -3848,7 +4188,7 @@ static void read_color_span( const GLcontext *ctx,
            break;
         case PF_8R8G8B24:
             {
-               const bgr_t *ptr3 = PIXELADDR3( source, x, y );
+               const bgr_t *ptr3 = PIXEL_ADDR3(xrb, x, y);
                GLuint i;
                for (i=0;i<n;i++) {
                   rgba[i][RCOMP] = ptr3[i].r;
@@ -3860,7 +4200,7 @@ static void read_color_span( const GLcontext *ctx,
            break;
          case PF_HPCR:
             {
-               const GLubyte *ptr1 = PIXELADDR1( source, x, y );
+               const GLubyte *ptr1 = PIXEL_ADDR1(xrb, x, y);
                GLuint i;
                for (i=0;i<n;i++) {
                   GLubyte p = *ptr1++;
@@ -3879,7 +4219,7 @@ static void read_color_span( const GLcontext *ctx,
                const GLubyte *gTable = source->pixel_to_g;
                const GLubyte *bTable = source->pixel_to_b;
                if (GET_VISUAL_DEPTH(xmesa->xm_visual)==8) {
-                  GLubyte *ptr1 = PIXELADDR1( source, x, y );
+                  GLubyte *ptr1 = PIXEL_ADDR1(xrb, x, y);
                   GLuint i;
                   for (i=0;i<n;i++) {
                      unsigned long p = *ptr1++;
@@ -3890,9 +4230,9 @@ static void read_color_span( const GLcontext *ctx,
                   }
                }
                else {
-                  XMesaImage *img = source->backimage;
+                  XMesaImage *img = xrb->ximage;
                   GLuint i;
-                  y = FLIP(source, y);
+                  y = YFLIP(xrb, y);
                   for (i=0;i<n;i++,x++) {
                      unsigned long p = XMesaGetPixel( img, x, y );
                      rgba[i][RCOMP] = rTable[p];
@@ -3905,10 +4245,10 @@ static void read_color_span( const GLcontext *ctx,
            break;
         case PF_1Bit:
             {
-               XMesaImage *img = source->backimage;
+               XMesaImage *img = xrb->ximage;
                int bitFlip = xmesa->xm_visual->bitFlip;
                GLuint i;
-               y = FLIP(source, y);
+               y = YFLIP(xrb, y);
                for (i=0;i<n;i++,x++) {
                   unsigned long p;
                  p = XMesaGetPixel( img, x, y ) ^ bitFlip;
@@ -3931,46 +4271,43 @@ static void read_color_span( const GLcontext *ctx,
 /*
  * Read an array of color index pixels.
  */
-static void read_index_pixels( const GLcontext *ctx,
-                              GLuint n, const GLint x[], const GLint y[],
-                               GLuint indx[], const GLubyte mask[] )
+static void
+get_values_ci(GLcontext *ctx, struct gl_renderbuffer *rb,
+              GLuint n, const GLint x[], const GLint y[], void *values)
 {
+   GLuint *indx = (GLuint *) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   register GLuint i;
-   XMesaBuffer source = xmesa->xm_buffer;
-
-   if (source->buffer) {
+   GET_XRB(xrb);
+   GLuint i;
+   if (xrb->pixmap) {
       for (i=0;i<n;i++) {
-         if (mask[i]) {
-            indx[i] = (GLuint) read_pixel( xmesa->display,
-                                           source->buffer,
-                                           x[i], FLIP(source, y[i]) );
-         }
+         indx[i] = (GLuint) read_pixel( xmesa->display, xrb->drawable,
+                                        x[i], YFLIP(xrb, y[i]) );
       }
    }
-   else if (source->backimage) {
-      XMesaImage *img = source->backimage;
+   else if (xrb->ximage) {
+      XMesaImage *img = xrb->ximage;
       for (i=0;i<n;i++) {
-         if (mask[i]) {
-            indx[i] = (GLuint) XMesaGetPixel( img, x[i], FLIP(source, y[i]) );
-         }
+         indx[i] = (GLuint) XMesaGetPixel( img, x[i], YFLIP(xrb, y[i]) );
       }
    }
 }
 
 
 
-static void read_color_pixels( const GLcontext *ctx,
-                              GLuint n, const GLint x[], const GLint y[],
-                               GLubyte rgba[][4], const GLubyte mask[] )
+static void
+get_values_rgba(GLcontext *ctx, struct gl_renderbuffer *rb,
+                GLuint n, const GLint x[], const GLint y[], void *values)
 {
+   GLubyte (*rgba)[4] = (GLubyte (*)[4]) values;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
+   XMesaBuffer source = XMESA_BUFFER(ctx->DrawBuffer);
    register GLuint i;
-   XMesaBuffer source = xmesa->xm_buffer;
-   XMesaDrawable buffer = source->buffer;  /* the X drawable */
 
-   if (source->buffer) {
+   if (xrb->pixmap) {
+      XMesaDrawable buffer = xrb->drawable;
       switch (xmesa->pixelformat) {
         case PF_Truecolor:
          case PF_Dither_True:
@@ -3987,65 +4324,63 @@ static void read_color_pixels( const GLcontext *ctx,
                GLint gShift = xmesa->xm_visual->gshift;
                GLint bShift = xmesa->xm_visual->bshift;
                for (i=0;i<n;i++) {
-                  if (mask[i]) {
-                     unsigned long p = read_pixel( dpy, buffer,
-                                                   x[i], FLIP(source, y[i]) );
-                     rgba[i][RCOMP] = pixelToR[(p & rMask) >> rShift];
-                     rgba[i][GCOMP] = pixelToG[(p & gMask) >> gShift];
-                     rgba[i][BCOMP] = pixelToB[(p & bMask) >> bShift];
-                     rgba[i][ACOMP] = 255;
-                  }
+                  unsigned long p = read_pixel( dpy, buffer,
+                                                x[i], YFLIP(xrb, y[i]) );
+                  rgba[i][RCOMP] = pixelToR[(p & rMask) >> rShift];
+                  rgba[i][GCOMP] = pixelToG[(p & gMask) >> gShift];
+                  rgba[i][BCOMP] = pixelToB[(p & bMask) >> bShift];
+                  rgba[i][ACOMP] = 255;
                }
             }
             break;
         case PF_8A8B8G8R:
            for (i=0;i<n;i++) {
-               if (mask[i]) {
-                  unsigned long p = read_pixel( dpy, buffer,
-                                                x[i], FLIP(source, y[i]) );
-                  rgba[i][RCOMP] = (GLubyte) ( p        & 0xff);
-                  rgba[i][GCOMP] = (GLubyte) ((p >> 8)  & 0xff);
-                  rgba[i][BCOMP] = (GLubyte) ((p >> 16) & 0xff);
-                  rgba[i][ACOMP] = (GLubyte) ((p >> 24) & 0xff);
-               }
+               unsigned long p = read_pixel( dpy, buffer,
+                                             x[i], YFLIP(xrb, y[i]) );
+               rgba[i][RCOMP] = (GLubyte) ( p        & 0xff);
+               rgba[i][GCOMP] = (GLubyte) ((p >> 8)  & 0xff);
+               rgba[i][BCOMP] = (GLubyte) ((p >> 16) & 0xff);
+               rgba[i][ACOMP] = (GLubyte) ((p >> 24) & 0xff);
+           }
+           break;
+        case PF_8A8R8G8B:
+           for (i=0;i<n;i++) {
+               unsigned long p = read_pixel( dpy, buffer,
+                                             x[i], YFLIP(xrb, y[i]) );
+               rgba[i][RCOMP] = (GLubyte) ((p >> 16) & 0xff);
+               rgba[i][GCOMP] = (GLubyte) ((p >> 8)  & 0xff);
+               rgba[i][BCOMP] = (GLubyte) ( p        & 0xff);
+               rgba[i][ACOMP] = (GLubyte) ((p >> 24) & 0xff);
            }
            break;
         case PF_8R8G8B:
            for (i=0;i<n;i++) {
-               if (mask[i]) {
-                  unsigned long p = read_pixel( dpy, buffer,
-                                                x[i], FLIP(source, y[i]) );
-                  rgba[i][RCOMP] = (GLubyte) ((p >> 16) & 0xff);
-                  rgba[i][GCOMP] = (GLubyte) ((p >> 8)  & 0xff);
-                  rgba[i][BCOMP] = (GLubyte) ( p        & 0xff);
-                  rgba[i][ACOMP] = 255;
-               }
+               unsigned long p = read_pixel( dpy, buffer,
+                                             x[i], YFLIP(xrb, y[i]) );
+               rgba[i][RCOMP] = (GLubyte) ((p >> 16) & 0xff);
+               rgba[i][GCOMP] = (GLubyte) ((p >> 8)  & 0xff);
+               rgba[i][BCOMP] = (GLubyte) ( p        & 0xff);
+               rgba[i][ACOMP] = 255;
            }
            break;
         case PF_8R8G8B24:
            for (i=0;i<n;i++) {
-               if (mask[i]) {
-                  unsigned long p = read_pixel( dpy, buffer,
-                                                x[i], FLIP(source, y[i]) );
-                  rgba[i][RCOMP] = (GLubyte) ((p >> 16) & 0xff);
-                  rgba[i][GCOMP] = (GLubyte) ((p >> 8)  & 0xff);
-                  rgba[i][BCOMP] = (GLubyte) ( p        & 0xff);
-                  rgba[i][ACOMP] = 255;
-               }
+               unsigned long p = read_pixel( dpy, buffer,
+                                             x[i], YFLIP(xrb, y[i]) );
+               rgba[i][RCOMP] = (GLubyte) ((p >> 16) & 0xff);
+               rgba[i][GCOMP] = (GLubyte) ((p >> 8)  & 0xff);
+               rgba[i][BCOMP] = (GLubyte) ( p        & 0xff);
+               rgba[i][ACOMP] = 255;
            }
            break;
          case PF_HPCR:
-            {
-               for (i=0;i<n;i++) {
-                  if (mask[i]) {
-                     unsigned long p = read_pixel( dpy, buffer,
-                                                   x[i], FLIP(source, y[i]) );
-                     rgba[i][RCOMP] = (GLubyte) ( p & 0xE0      );
-                     rgba[i][GCOMP] = (GLubyte) ((p & 0x1C) << 3);
-                     rgba[i][BCOMP] = (GLubyte) ((p & 0x03) << 6);
-                     rgba[i][ACOMP] = (GLubyte) 255;
-                  }
-               }
+            for (i=0;i<n;i++) {
+               unsigned long p = read_pixel( dpy, buffer,
+                                             x[i], YFLIP(xrb, y[i]) );
+               rgba[i][RCOMP] = (GLubyte) ( p & 0xE0      );
+               rgba[i][GCOMP] = (GLubyte) ((p & 0x1C) << 3);
+                  rgba[i][BCOMP] = (GLubyte) ((p & 0x03) << 6);
+                  rgba[i][ACOMP] = (GLubyte) 255;
             }
             break;
         case PF_Dither:
@@ -4056,14 +4391,12 @@ static void read_color_pixels( const GLcontext *ctx,
                GLubyte *gTable = source->pixel_to_g;
                GLubyte *bTable = source->pixel_to_b;
                for (i=0;i<n;i++) {
-                  if (mask[i]) {
-                     unsigned long p = read_pixel( dpy, buffer,
-                                                   x[i], FLIP(source, y[i]) );
-                     rgba[i][RCOMP] = rTable[p];
-                     rgba[i][GCOMP] = gTable[p];
-                     rgba[i][BCOMP] = bTable[p];
-                     rgba[i][ACOMP] = 255;
-                  }
+                  unsigned long p = read_pixel( dpy, buffer,
+                                                x[i], YFLIP(xrb, y[i]) );
+                  rgba[i][RCOMP] = rTable[p];
+                  rgba[i][GCOMP] = gTable[p];
+                  rgba[i][BCOMP] = bTable[p];
+                  rgba[i][ACOMP] = 255;
                }
            }
            break;
@@ -4071,14 +4404,12 @@ static void read_color_pixels( const GLcontext *ctx,
             {
                int bitFlip = xmesa->xm_visual->bitFlip;
                for (i=0;i<n;i++) {
-                  if (mask[i]) {
-                     unsigned long p = read_pixel( dpy, buffer,
-                                     x[i], FLIP(source, y[i])) ^ bitFlip;
-                     rgba[i][RCOMP] = (GLubyte) (p * 255);
-                     rgba[i][GCOMP] = (GLubyte) (p * 255);
-                     rgba[i][BCOMP] = (GLubyte) (p * 255);
-                     rgba[i][ACOMP] = 255;
-                  }
+                  unsigned long p = read_pixel( dpy, buffer,
+                                           x[i], YFLIP(xrb, y[i])) ^ bitFlip;
+                  rgba[i][RCOMP] = (GLubyte) (p * 255);
+                  rgba[i][GCOMP] = (GLubyte) (p * 255);
+                  rgba[i][BCOMP] = (GLubyte) (p * 255);
+                  rgba[i][ACOMP] = 255;
                }
            }
            break;
@@ -4087,7 +4418,8 @@ static void read_color_pixels( const GLcontext *ctx,
             return;
       }
    }
-   else if (source->backimage) {
+   else if (xrb->ximage) {
+      /* Read from XImage back buffer */
       switch (xmesa->pixelformat) {
         case PF_Truecolor:
          case PF_Dither_True:
@@ -4103,64 +4435,64 @@ static void read_color_pixels( const GLcontext *ctx,
                GLint rShift = xmesa->xm_visual->rshift;
                GLint gShift = xmesa->xm_visual->gshift;
                GLint bShift = xmesa->xm_visual->bshift;
-               XMesaImage *img = source->backimage;
+               XMesaImage *img = xrb->ximage;
                for (i=0;i<n;i++) {
-                  if (mask[i]) {
-                     unsigned long p;
-                     p = XMesaGetPixel( img, x[i], FLIP(source, y[i]) );
-                     rgba[i][RCOMP] = pixelToR[(p & rMask) >> rShift];
-                     rgba[i][GCOMP] = pixelToG[(p & gMask) >> gShift];
-                     rgba[i][BCOMP] = pixelToB[(p & bMask) >> bShift];
-                     rgba[i][ACOMP] = 255;
-                  }
+                  unsigned long p;
+                  p = XMesaGetPixel( img, x[i], YFLIP(xrb, y[i]) );
+                  rgba[i][RCOMP] = pixelToR[(p & rMask) >> rShift];
+                  rgba[i][GCOMP] = pixelToG[(p & gMask) >> gShift];
+                  rgba[i][BCOMP] = pixelToB[(p & bMask) >> bShift];
+                  rgba[i][ACOMP] = 255;
                }
             }
             break;
         case PF_8A8B8G8R:
            for (i=0;i<n;i++) {
-              if (mask[i]) {
-                  GLuint *ptr4 = PIXELADDR4( source, x[i], y[i] );
-                  GLuint p4 = *ptr4;
-                  rgba[i][RCOMP] = (GLubyte) ( p4        & 0xff);
-                  rgba[i][GCOMP] = (GLubyte) ((p4 >> 8)  & 0xff);
-                  rgba[i][BCOMP] = (GLubyte) ((p4 >> 16) & 0xff);
-                  rgba[i][ACOMP] = (GLubyte) ((p4 >> 24) & 0xff);
-               }
+               GLuint *ptr4 = PIXEL_ADDR4(xrb, x[i], y[i]);
+               GLuint p4 = *ptr4;
+               rgba[i][RCOMP] = (GLubyte) ( p4        & 0xff);
+               rgba[i][GCOMP] = (GLubyte) ((p4 >> 8)  & 0xff);
+               rgba[i][BCOMP] = (GLubyte) ((p4 >> 16) & 0xff);
+               rgba[i][ACOMP] = (GLubyte) ((p4 >> 24) & 0xff);
+           }
+           break;
+        case PF_8A8R8G8B:
+           for (i=0;i<n;i++) {
+               GLuint *ptr4 = PIXEL_ADDR4(xrb, x[i], y[i]);
+               GLuint p4 = *ptr4;
+               rgba[i][RCOMP] = (GLubyte) ((p4 >> 16) & 0xff);
+               rgba[i][GCOMP] = (GLubyte) ((p4 >> 8)  & 0xff);
+               rgba[i][BCOMP] = (GLubyte) ( p4        & 0xff);
+               rgba[i][ACOMP] = (GLubyte) ((p4 >> 24) & 0xff);
            }
            break;
         case PF_8R8G8B:
            for (i=0;i<n;i++) {
-              if (mask[i]) {
-                  GLuint *ptr4 = PIXELADDR4( source, x[i], y[i] );
-                  GLuint p4 = *ptr4;
-                  rgba[i][RCOMP] = (GLubyte) ((p4 >> 16) & 0xff);
-                  rgba[i][GCOMP] = (GLubyte) ((p4 >> 8)  & 0xff);
-                  rgba[i][BCOMP] = (GLubyte) ( p4        & 0xff);
-                  rgba[i][ACOMP] = 255;
-               }
+               GLuint *ptr4 = PIXEL_ADDR4(xrb, x[i], y[i]);
+               GLuint p4 = *ptr4;
+               rgba[i][RCOMP] = (GLubyte) ((p4 >> 16) & 0xff);
+               rgba[i][GCOMP] = (GLubyte) ((p4 >> 8)  & 0xff);
+               rgba[i][BCOMP] = (GLubyte) ( p4        & 0xff);
+               rgba[i][ACOMP] = 255;
            }
            break;
         case PF_8R8G8B24:
            for (i=0;i<n;i++) {
-              if (mask[i]) {
-                  bgr_t *ptr3 = PIXELADDR3( source, x[i], y[i] );
-                  rgba[i][RCOMP] = ptr3->r;
-                  rgba[i][GCOMP] = ptr3->g;
-                  rgba[i][BCOMP] = ptr3->b;
-                  rgba[i][ACOMP] = 255;
-               }
+               bgr_t *ptr3 = PIXEL_ADDR3(xrb, x[i], y[i]);
+               rgba[i][RCOMP] = ptr3->r;
+               rgba[i][GCOMP] = ptr3->g;
+               rgba[i][BCOMP] = ptr3->b;
+               rgba[i][ACOMP] = 255;
            }
            break;
          case PF_HPCR:
             for (i=0;i<n;i++) {
-               if (mask[i]) {
-                  GLubyte *ptr1 = PIXELADDR1( source, x[i], y[i] );
-                  GLubyte p = *ptr1;
-                  rgba[i][RCOMP] =  p & 0xE0;
-                  rgba[i][GCOMP] = (p & 0x1C) << 3;
-                  rgba[i][BCOMP] = (p & 0x03) << 6;
-                  rgba[i][ACOMP] = 255;
-               }
+               GLubyte *ptr1 = PIXEL_ADDR1(xrb, x[i], y[i]);
+               GLubyte p = *ptr1;
+               rgba[i][RCOMP] =  p & 0xE0;
+               rgba[i][GCOMP] = (p & 0x1C) << 3;
+               rgba[i][BCOMP] = (p & 0x03) << 6;
+               rgba[i][ACOMP] = 255;
             }
             break;
         case PF_Dither:
@@ -4170,32 +4502,28 @@ static void read_color_pixels( const GLcontext *ctx,
                GLubyte *rTable = source->pixel_to_r;
                GLubyte *gTable = source->pixel_to_g;
                GLubyte *bTable = source->pixel_to_b;
-               XMesaImage *img = source->backimage;
+               XMesaImage *img = xrb->ximage;
                for (i=0;i<n;i++) {
-                  if (mask[i]) {
-                     unsigned long p;
-                     p = XMesaGetPixel( img, x[i], FLIP(source, y[i]) );
-                     rgba[i][RCOMP] = rTable[p];
-                     rgba[i][GCOMP] = gTable[p];
-                     rgba[i][BCOMP] = bTable[p];
-                     rgba[i][ACOMP] = 255;
-                  }
+                  unsigned long p;
+                  p = XMesaGetPixel( img, x[i], YFLIP(xrb, y[i]) );
+                  rgba[i][RCOMP] = rTable[p];
+                  rgba[i][GCOMP] = gTable[p];
+                  rgba[i][BCOMP] = bTable[p];
+                  rgba[i][ACOMP] = 255;
                }
            }
            break;
         case PF_1Bit:
             {
-               XMesaImage *img = source->backimage;
+               XMesaImage *img = xrb->ximage;
                int bitFlip = xmesa->xm_visual->bitFlip;
                for (i=0;i<n;i++) {
-                  if (mask[i]) {
-                     unsigned long p;
-                     p = XMesaGetPixel( img, x[i], FLIP(source, y[i]) ) ^ bitFlip;
-                     rgba[i][RCOMP] = (GLubyte) (p * 255);
-                     rgba[i][GCOMP] = (GLubyte) (p * 255);
-                     rgba[i][BCOMP] = (GLubyte) (p * 255);
-                     rgba[i][ACOMP] = 255;
-                  }
+                  unsigned long p;
+                  p = XMesaGetPixel( img, x[i], YFLIP(xrb, y[i]) ) ^ bitFlip;
+                  rgba[i][RCOMP] = (GLubyte) (p * 255);
+                  rgba[i][GCOMP] = (GLubyte) (p * 255);
+                  rgba[i][BCOMP] = (GLubyte) (p * 255);
+                  rgba[i][ACOMP] = 255;
                }
            }
            break;
@@ -4207,329 +4535,285 @@ static void read_color_pixels( const GLcontext *ctx,
 }
 
 
-static void
-clear_color_HPCR_ximage( GLcontext *ctx, const GLfloat color[4] )
-{
-   int i;
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-
-   CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[0], color[0]);
-   CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[1], color[1]);
-   CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[2], color[2]);
-   CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[3], color[3]);
-
-   if (color[0] == 0.0 && color[1] == 0.0 && color[2] == 0.0) {
-      /* black is black */
-      MEMSET( xmesa->xm_visual->hpcr_clear_ximage_pattern, 0x0 ,
-              sizeof(xmesa->xm_visual->hpcr_clear_ximage_pattern));
-   }
-   else {
-      /* build clear pattern */
-      for (i=0; i<16; i++) {
-         xmesa->xm_visual->hpcr_clear_ximage_pattern[0][i] =
-            DITHER_HPCR(i, 0,
-                        xmesa->clearcolor[0],
-                        xmesa->clearcolor[1],
-                        xmesa->clearcolor[2]);
-         xmesa->xm_visual->hpcr_clear_ximage_pattern[1][i]    =
-            DITHER_HPCR(i, 1,
-                        xmesa->clearcolor[0],
-                        xmesa->clearcolor[1],
-                        xmesa->clearcolor[2]);
+/**
+ * Initialize the renderbuffer's PutRow, GetRow, etc. functions.
+ * This would generally only need to be called once when the renderbuffer
+ * is created.  However, we can change pixel formats on the fly if dithering
+ * is enabled/disabled.  Therefore, we may call this more often than that.
+ */
+void
+xmesa_set_renderbuffer_funcs(struct xmesa_renderbuffer *xrb,
+                             enum pixel_format pixelformat, GLint depth)
+{
+   const GLboolean pixmap = xrb->pixmap ? GL_TRUE : GL_FALSE;
+
+   switch (pixelformat) {
+   case PF_Index:
+      ASSERT(xrb->Base.DataType == GL_UNSIGNED_INT);
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_ci_pixmap;
+         xrb->Base.PutRowRGB     = NULL;
+         xrb->Base.PutMonoRow    = put_mono_row_ci_pixmap;
+         xrb->Base.PutValues     = put_values_ci_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_ci_pixmap;
       }
-   }
-}
-
-
-static void
-clear_color_HPCR_pixmap( GLcontext *ctx, const GLfloat color[4] )
-{
-   int i;
-   const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-
-   CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[0], color[0]);
-   CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[1], color[1]);
-   CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[2], color[2]);
-   CLAMPED_FLOAT_TO_UBYTE(xmesa->clearcolor[3], color[3]);
-
-   if (color[0] == 0.0 && color[1] == 0.0 && color[2] == 0.0) {
-      /* black is black */
-      for (i=0; i<16; i++) {
-         XMesaPutPixel(xmesa->xm_visual->hpcr_clear_ximage, i, 0, 0);
-         XMesaPutPixel(xmesa->xm_visual->hpcr_clear_ximage, i, 1, 0);
+      else {
+         xrb->Base.PutRow        = put_row_ci_ximage;
+         xrb->Base.PutRowRGB     = NULL;
+         xrb->Base.PutMonoRow    = put_mono_row_ci_ximage;
+         xrb->Base.PutValues     = put_values_ci_ximage;
+         xrb->Base.PutMonoValues = put_mono_values_ci_ximage;
+      }
+      break;
+   case PF_Truecolor:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_TRUECOLOR_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_TRUECOLOR_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_pixmap;
+         xrb->Base.PutValues     = put_values_TRUECOLOR_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_pixmap;
       }
-   }
-   else {
-      for (i=0; i<16; i++) {
-         XMesaPutPixel(xmesa->xm_visual->hpcr_clear_ximage, i, 0,
-                       DITHER_HPCR(i, 0,
-                                   xmesa->clearcolor[0],
-                                   xmesa->clearcolor[1],
-                                   xmesa->clearcolor[2]));
-         XMesaPutPixel(xmesa->xm_visual->hpcr_clear_ximage, i, 1,
-                       DITHER_HPCR(i, 1,
-                                   xmesa->clearcolor[0],
-                                   xmesa->clearcolor[1],
-                                   xmesa->clearcolor[2]));
+      else {
+         xrb->Base.PutRow        = put_row_TRUECOLOR_ximage;
+         xrb->Base.PutRowRGB     = put_row_rgb_TRUECOLOR_ximage;
+         xrb->Base.PutMonoRow    = put_mono_row_ximage;
+         xrb->Base.PutValues     = put_values_TRUECOLOR_ximage;
+         xrb->Base.PutMonoValues = put_mono_values_ximage;
+      }
+      break;
+   case PF_Dither_True:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_TRUEDITHER_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_TRUEDITHER_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_TRUEDITHER_pixmap;
+         xrb->Base.PutValues     = put_values_TRUEDITHER_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_TRUEDITHER_pixmap;
+      }
+      else {
+         xrb->Base.PutRow        = put_row_TRUEDITHER_ximage;
+         xrb->Base.PutRowRGB     = put_row_rgb_TRUEDITHER_ximage;
+         xrb->Base.PutMonoRow    = put_mono_row_TRUEDITHER_ximage;
+         xrb->Base.PutValues     = put_values_TRUEDITHER_ximage;
+         xrb->Base.PutMonoValues = put_mono_values_TRUEDITHER_ximage;
+      }
+      break;
+   case PF_8A8B8G8R:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_8A8B8G8R_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_8A8B8G8R_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_pixmap;
+         xrb->Base.PutValues     = put_values_8A8B8G8R_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_pixmap;
+      }
+      else {
+         xrb->Base.PutRow        = put_row_8A8B8G8R_ximage;
+         xrb->Base.PutRowRGB     = put_row_rgb_8A8B8G8R_ximage;
+         xrb->Base.PutMonoRow    = put_mono_row_8A8B8G8R_ximage;
+         xrb->Base.PutValues     = put_values_8A8B8G8R_ximage;
+         xrb->Base.PutMonoValues = put_mono_values_8A8B8G8R_ximage;
+      }
+      break;
+   case PF_8A8R8G8B:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_8A8R8G8B_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_8A8R8G8B_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_pixmap;
+         xrb->Base.PutValues     = put_values_8A8R8G8B_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_pixmap;
+      }
+      else {
+         xrb->Base.PutRow        = put_row_8A8R8G8B_ximage;
+         xrb->Base.PutRowRGB     = put_row_rgb_8A8R8G8B_ximage;
+         xrb->Base.PutMonoRow    = put_mono_row_8A8R8G8B_ximage;
+         xrb->Base.PutValues     = put_values_8A8R8G8B_ximage;
+         xrb->Base.PutMonoValues = put_mono_values_8A8R8G8B_ximage;
+      }
+      break;
+   case PF_8R8G8B:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_8R8G8B_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_8R8G8B_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_pixmap;
+         xrb->Base.PutValues     = put_values_8R8G8B_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_pixmap;
+      }
+      else {
+         xrb->Base.PutRow        = put_row_8R8G8B_ximage;
+         xrb->Base.PutRowRGB     = put_row_rgb_8R8G8B_ximage;
+         xrb->Base.PutMonoRow    = put_mono_row_8R8G8B_ximage;
+         xrb->Base.PutValues     = put_values_8R8G8B_ximage;
+         xrb->Base.PutMonoValues = put_mono_values_8R8G8B_ximage;
+      }
+      break;
+   case PF_8R8G8B24:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_8R8G8B24_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_8R8G8B24_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_pixmap;
+         xrb->Base.PutValues     = put_values_8R8G8B24_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_pixmap;
+      }
+      else {
+         xrb->Base.PutRow        = put_row_8R8G8B24_ximage;
+         xrb->Base.PutRowRGB     = put_row_rgb_8R8G8B24_ximage;
+         xrb->Base.PutMonoRow    = put_mono_row_8R8G8B24_ximage;
+         xrb->Base.PutValues     = put_values_8R8G8B24_ximage;
+         xrb->Base.PutMonoValues = put_mono_values_8R8G8B24_ximage;
+      }
+      break;
+   case PF_5R6G5B:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_5R6G5B_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_5R6G5B_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_pixmap;
+         xrb->Base.PutValues     = put_values_5R6G5B_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_pixmap;
+      }
+      else {
+         xrb->Base.PutRow        = put_row_5R6G5B_ximage;
+         xrb->Base.PutRowRGB     = put_row_rgb_5R6G5B_ximage;
+         xrb->Base.PutMonoRow    = put_mono_row_ximage;
+         xrb->Base.PutValues     = put_values_5R6G5B_ximage;
+         xrb->Base.PutMonoValues = put_mono_values_ximage;
+      }
+      break;
+   case PF_Dither_5R6G5B:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_DITHER_5R6G5B_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_DITHER_5R6G5B_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_TRUEDITHER_pixmap;
+         xrb->Base.PutValues     = put_values_DITHER_5R6G5B_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_TRUEDITHER_pixmap;
+      }
+      else {
+         xrb->Base.PutRow        = put_row_DITHER_5R6G5B_ximage;
+         xrb->Base.PutRowRGB     = put_row_rgb_DITHER_5R6G5B_ximage;
+         xrb->Base.PutMonoRow    = put_mono_row_DITHER_5R6G5B_ximage;
+         xrb->Base.PutValues     = put_values_DITHER_5R6G5B_ximage;
+         xrb->Base.PutMonoValues = put_mono_values_DITHER_5R6G5B_ximage;
+      }
+      break;
+   case PF_Dither:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_DITHER_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_DITHER_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_DITHER_pixmap;
+         xrb->Base.PutValues     = put_values_DITHER_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_DITHER_pixmap;
+      }
+      else {
+         if (depth == 8) {
+            xrb->Base.PutRow        = put_row_DITHER8_ximage;
+            xrb->Base.PutRowRGB     = put_row_rgb_DITHER8_ximage;
+            xrb->Base.PutMonoRow    = put_mono_row_DITHER8_ximage;
+            xrb->Base.PutValues     = put_values_DITHER8_ximage;
+            xrb->Base.PutMonoValues = put_mono_values_DITHER8_ximage;
+         }
+         else {
+            xrb->Base.PutRow        = put_row_DITHER_ximage;
+            xrb->Base.PutRowRGB     = put_row_rgb_DITHER_ximage;
+            xrb->Base.PutMonoRow    = put_mono_row_DITHER_ximage;
+            xrb->Base.PutValues     = put_values_DITHER_ximage;
+            xrb->Base.PutMonoValues = put_mono_values_DITHER_ximage;
+         }
+      }
+      break;
+   case PF_1Bit:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_1BIT_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_1BIT_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_1BIT_pixmap;
+         xrb->Base.PutValues     = put_values_1BIT_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_1BIT_pixmap;
+      }
+      else {
+         xrb->Base.PutRow        = put_row_1BIT_ximage;
+         xrb->Base.PutRowRGB     = put_row_rgb_1BIT_ximage;
+         xrb->Base.PutMonoRow    = put_mono_row_1BIT_ximage;
+         xrb->Base.PutValues     = put_values_1BIT_ximage;
+         xrb->Base.PutMonoValues = put_mono_values_1BIT_ximage;
+      }
+      break;
+   case PF_HPCR:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_HPCR_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_HPCR_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_pixmap;
+         xrb->Base.PutValues     = put_values_HPCR_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_pixmap;
+      }
+      else {
+         xrb->Base.PutRow        = put_row_HPCR_ximage;
+         xrb->Base.PutRowRGB     = put_row_rgb_HPCR_ximage;
+         xrb->Base.PutMonoRow    = put_mono_row_HPCR_ximage;
+         xrb->Base.PutValues     = put_values_HPCR_ximage;
+         xrb->Base.PutMonoValues = put_mono_values_HPCR_ximage;
+      }
+      break;
+   case PF_Lookup:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_LOOKUP_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_LOOKUP_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_pixmap;
+         xrb->Base.PutValues     = put_values_LOOKUP_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_pixmap;
+      }
+      else {
+         if (depth==8) {
+            xrb->Base.PutRow        = put_row_LOOKUP8_ximage;
+            xrb->Base.PutRowRGB     = put_row_rgb_LOOKUP8_ximage;
+            xrb->Base.PutMonoRow    = put_mono_row_LOOKUP8_ximage;
+            xrb->Base.PutValues     = put_values_LOOKUP8_ximage;
+            xrb->Base.PutMonoValues = put_mono_values_LOOKUP8_ximage;
+         }
+         else {
+            xrb->Base.PutRow        = put_row_LOOKUP_ximage;
+            xrb->Base.PutRowRGB     = put_row_rgb_LOOKUP_ximage;
+            xrb->Base.PutMonoRow    = put_mono_row_ximage;
+            xrb->Base.PutValues     = put_values_LOOKUP_ximage;
+            xrb->Base.PutMonoValues = put_mono_values_ximage;
+         }
+      }
+      break;
+   case PF_Grayscale:
+      if (pixmap) {
+         xrb->Base.PutRow        = put_row_GRAYSCALE_pixmap;
+         xrb->Base.PutRowRGB     = put_row_rgb_GRAYSCALE_pixmap;
+         xrb->Base.PutMonoRow    = put_mono_row_pixmap;
+         xrb->Base.PutValues     = put_values_GRAYSCALE_pixmap;
+         xrb->Base.PutMonoValues = put_mono_values_pixmap;
+      }
+      else {
+         if (depth == 8) {
+            xrb->Base.PutRow        = put_row_GRAYSCALE8_ximage;
+            xrb->Base.PutRowRGB     = put_row_rgb_GRAYSCALE8_ximage;
+            xrb->Base.PutMonoRow    = put_mono_row_GRAYSCALE8_ximage;
+            xrb->Base.PutValues     = put_values_GRAYSCALE8_ximage;
+            xrb->Base.PutMonoValues = put_mono_values_GRAYSCALE8_ximage;
+         }
+         else {
+            xrb->Base.PutRow        = put_row_GRAYSCALE_ximage;
+            xrb->Base.PutRowRGB     = put_row_rgb_GRAYSCALE_ximage;
+            xrb->Base.PutMonoRow    = put_mono_row_ximage;
+            xrb->Base.PutValues     = put_values_GRAYSCALE_ximage;
+            xrb->Base.PutMonoValues = put_mono_values_ximage;
+         }
       }
+      break;
+   default:
+      _mesa_problem(NULL, "Bad pixel format in xmesa_update_state (1)");
+      return;
    }
-   /* change tile pixmap content */
-   XMesaPutImage(xmesa->display,
-                (XMesaDrawable)xmesa->xm_visual->hpcr_clear_pixmap,
-                xmesa->xm_buffer->cleargc,
-                xmesa->xm_visual->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2);
-}
-
-
 
-void xmesa_update_span_funcs( GLcontext *ctx )
-{
-   XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   int depth=GET_VISUAL_DEPTH(xmesa->xm_visual);
-   struct swrast_device_driver *dd = _swrast_GetDeviceDriverReference( ctx );
 
-   /*
-    * These drawing functions depend on color buffer config:
-    */
-   if (xmesa->xm_buffer->buffer!=XIMAGE) {
-      /* Writing to window or back pixmap */
-      switch (xmesa->pixelformat) {
-        case PF_Index:
-           dd->WriteCI32Span     = write_span_index_pixmap;
-           dd->WriteCI8Span      = write_span_index8_pixmap;
-           dd->WriteMonoCISpan   = write_span_mono_index_pixmap;
-           dd->WriteCI32Pixels   = write_pixels_index_pixmap;
-           dd->WriteMonoCIPixels = write_pixels_mono_index_pixmap;
-           break;
-        case PF_Truecolor:
-           dd->WriteRGBASpan       = write_span_TRUECOLOR_pixmap;
-           dd->WriteRGBSpan        = write_span_rgb_TRUECOLOR_pixmap;
-           dd->WriteMonoRGBASpan   = write_span_mono_pixmap;
-           dd->WriteRGBAPixels     = write_pixels_TRUECOLOR_pixmap;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_pixmap;
-           break;
-        case PF_Dither_True:
-           dd->WriteRGBASpan       = write_span_TRUEDITHER_pixmap;
-           dd->WriteRGBSpan        = write_span_rgb_TRUEDITHER_pixmap;
-           dd->WriteMonoRGBASpan   = write_span_mono_TRUEDITHER_pixmap;
-           dd->WriteRGBAPixels     = write_pixels_TRUEDITHER_pixmap;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_TRUEDITHER_pixmap;
-           break;
-        case PF_8A8B8G8R:
-           dd->WriteRGBASpan       = write_span_8A8B8G8R_pixmap;
-           dd->WriteRGBSpan        = write_span_rgb_8A8B8G8R_pixmap;
-           dd->WriteMonoRGBASpan   = write_span_mono_pixmap;
-           dd->WriteRGBAPixels     = write_pixels_8A8B8G8R_pixmap;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_pixmap;
-           break;
-        case PF_8R8G8B:
-           dd->WriteRGBASpan       = write_span_8R8G8B_pixmap;
-           dd->WriteRGBSpan        = write_span_rgb_8R8G8B_pixmap;
-           dd->WriteMonoRGBASpan   = write_span_mono_pixmap;
-           dd->WriteRGBAPixels     = write_pixels_8R8G8B_pixmap;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_pixmap;
-           break;
-        case PF_8R8G8B24:
-           dd->WriteRGBASpan       = write_span_8R8G8B24_pixmap;
-           dd->WriteRGBSpan        = write_span_rgb_8R8G8B24_pixmap;
-           dd->WriteMonoRGBASpan   = write_span_mono_pixmap;
-           dd->WriteRGBAPixels     = write_pixels_8R8G8B24_pixmap;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_pixmap;
-           break;
-        case PF_5R6G5B:
-           dd->WriteRGBASpan       = write_span_5R6G5B_pixmap;
-           dd->WriteRGBSpan        = write_span_rgb_5R6G5B_pixmap;
-           dd->WriteMonoRGBASpan   = write_span_mono_pixmap;
-           dd->WriteRGBAPixels     = write_pixels_5R6G5B_pixmap;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_pixmap;
-           break;
-        case PF_Dither_5R6G5B:
-           dd->WriteRGBASpan       = write_span_DITHER_5R6G5B_pixmap;
-           dd->WriteRGBSpan        = write_span_rgb_DITHER_5R6G5B_pixmap;
-           dd->WriteMonoRGBASpan   = write_span_mono_TRUEDITHER_pixmap;
-           dd->WriteRGBAPixels     = write_pixels_DITHER_5R6G5B_pixmap;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_TRUEDITHER_pixmap;
-           break;
-        case PF_Dither:
-           dd->WriteRGBASpan       = write_span_DITHER_pixmap;
-           dd->WriteRGBSpan        = write_span_rgb_DITHER_pixmap;
-           dd->WriteMonoRGBASpan   = write_span_mono_DITHER_pixmap;
-           dd->WriteRGBAPixels     = write_pixels_DITHER_pixmap;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_DITHER_pixmap;
-           break;
-        case PF_1Bit:
-           dd->WriteRGBASpan       = write_span_1BIT_pixmap;
-           dd->WriteRGBSpan        = write_span_rgb_1BIT_pixmap;
-           dd->WriteMonoRGBASpan   = write_span_mono_1BIT_pixmap;
-           dd->WriteRGBAPixels     = write_pixels_1BIT_pixmap;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_1BIT_pixmap;
-           break;
-         case PF_HPCR:
-            dd->WriteRGBASpan       = write_span_HPCR_pixmap;
-            dd->WriteRGBSpan        = write_span_rgb_HPCR_pixmap;
-            dd->WriteMonoRGBASpan   = write_span_mono_pixmap;
-            dd->WriteRGBAPixels     = write_pixels_HPCR_pixmap;
-            dd->WriteMonoRGBAPixels = write_pixels_mono_pixmap;
-           if (xmesa->xm_visual->hpcr_clear_flag) {
-              ctx->Driver.ClearColor = clear_color_HPCR_pixmap;
-           }
-            break;
-         case PF_Lookup:
-            dd->WriteRGBASpan       = write_span_LOOKUP_pixmap;
-            dd->WriteRGBSpan        = write_span_rgb_LOOKUP_pixmap;
-            dd->WriteMonoRGBASpan   = write_span_mono_pixmap;
-            dd->WriteRGBAPixels     = write_pixels_LOOKUP_pixmap;
-            dd->WriteMonoRGBAPixels = write_pixels_mono_pixmap;
-            break;
-         case PF_Grayscale:
-            dd->WriteRGBASpan       = write_span_GRAYSCALE_pixmap;
-            dd->WriteRGBSpan        = write_span_rgb_GRAYSCALE_pixmap;
-            dd->WriteMonoRGBASpan   = write_span_mono_pixmap;
-            dd->WriteRGBAPixels     = write_pixels_GRAYSCALE_pixmap;
-            dd->WriteMonoRGBAPixels = write_pixels_mono_pixmap;
-            break;
-        default:
-           _mesa_problem(NULL,"Bad pixel format in xmesa_update_state (1)");
-            return;
-      }
+   /* Get functions */
+   if (pixelformat == PF_Index) {
+      xrb->Base.GetRow = get_row_ci;
+      xrb->Base.GetValues = get_values_ci;
    }
-   else if (xmesa->xm_buffer->buffer==XIMAGE) {
-      /* Writing to back XImage */
-      switch (xmesa->pixelformat) {
-        case PF_Index:
-           dd->WriteCI32Span     = write_span_index_ximage;
-           if (depth==8)
-               dd->WriteCI8Span   = write_span_index8_ximage8;
-            else
-               dd->WriteCI8Span   = write_span_index8_ximage;
-           dd->WriteMonoCISpan   = write_span_mono_index_ximage;
-           dd->WriteCI32Pixels   = write_pixels_index_ximage;
-           dd->WriteMonoCIPixels = write_pixels_mono_index_ximage;
-           break;
-        case PF_Truecolor:
-           /* Generic RGB */
-           dd->WriteRGBASpan       = write_span_TRUECOLOR_ximage;
-           dd->WriteRGBSpan        = write_span_rgb_TRUECOLOR_ximage;
-           dd->WriteMonoRGBASpan   = write_span_mono_ximage;
-           dd->WriteRGBAPixels     = write_pixels_TRUECOLOR_ximage;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_ximage;
-           break;
-        case PF_Dither_True:
-           dd->WriteRGBASpan       = write_span_TRUEDITHER_ximage;
-           dd->WriteRGBSpan        = write_span_rgb_TRUEDITHER_ximage;
-           dd->WriteMonoRGBASpan   = write_span_mono_TRUEDITHER_ximage;
-           dd->WriteRGBAPixels     = write_pixels_TRUEDITHER_ximage;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_TRUEDITHER_ximage;
-           break;
-        case PF_8A8B8G8R:
-           dd->WriteRGBASpan       = write_span_8A8B8G8R_ximage;
-           dd->WriteRGBSpan        = write_span_rgb_8A8B8G8R_ximage;
-           dd->WriteMonoRGBASpan   = write_span_mono_8A8B8G8R_ximage;
-           dd->WriteRGBAPixels     = write_pixels_8A8B8G8R_ximage;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_8A8B8G8R_ximage;
-           break;
-        case PF_8R8G8B:
-           dd->WriteRGBASpan       = write_span_8R8G8B_ximage;
-           dd->WriteRGBSpan        = write_span_rgb_8R8G8B_ximage;
-           dd->WriteMonoRGBASpan   = write_span_mono_8R8G8B_ximage;
-           dd->WriteRGBAPixels     = write_pixels_8R8G8B_ximage;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_8R8G8B_ximage;
-           break;
-        case PF_8R8G8B24:
-           dd->WriteRGBASpan       = write_span_8R8G8B24_ximage;
-           dd->WriteRGBSpan        = write_span_rgb_8R8G8B24_ximage;
-           dd->WriteMonoRGBASpan   = write_span_mono_8R8G8B24_ximage;
-           dd->WriteRGBAPixels     = write_pixels_8R8G8B24_ximage;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_8R8G8B24_ximage;
-           break;
-        case PF_5R6G5B:
-           dd->WriteRGBASpan       = write_span_5R6G5B_ximage;
-           dd->WriteRGBSpan        = write_span_rgb_5R6G5B_ximage;
-           dd->WriteMonoRGBASpan   = write_span_mono_ximage;
-           dd->WriteRGBAPixels     = write_pixels_5R6G5B_ximage;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_ximage;
-           break;
-        case PF_Dither_5R6G5B:
-           dd->WriteRGBASpan       = write_span_DITHER_5R6G5B_ximage;
-           dd->WriteRGBSpan        = write_span_rgb_DITHER_5R6G5B_ximage;
-           dd->WriteMonoRGBASpan   = write_span_mono_DITHER_5R6G5B_ximage;
-           dd->WriteRGBAPixels     = write_pixels_DITHER_5R6G5B_ximage;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_DITHER_5R6G5B_ximage;
-           break;
-        case PF_Dither:
-           if (depth==8) {
-              dd->WriteRGBASpan      = write_span_DITHER8_ximage;
-              dd->WriteRGBSpan       = write_span_rgb_DITHER8_ximage;
-              dd->WriteMonoRGBASpan  = write_span_mono_DITHER8_ximage;
-              dd->WriteRGBAPixels    = write_pixels_DITHER8_ximage;
-              dd->WriteMonoRGBAPixels = write_pixels_mono_DITHER8_ximage;
-           }
-           else {
-              dd->WriteRGBASpan       = write_span_DITHER_ximage;
-              dd->WriteRGBSpan        = write_span_rgb_DITHER_ximage;
-              dd->WriteMonoRGBASpan   = write_span_mono_DITHER_ximage;
-              dd->WriteRGBAPixels     = write_pixels_DITHER_ximage;
-              dd->WriteMonoRGBAPixels = write_pixels_mono_DITHER_ximage;
-           }
-           break;
-        case PF_1Bit:
-           dd->WriteRGBASpan       = write_span_1BIT_ximage;
-           dd->WriteRGBSpan        = write_span_rgb_1BIT_ximage;
-           dd->WriteMonoRGBASpan   = write_span_mono_1BIT_ximage;
-           dd->WriteRGBAPixels     = write_pixels_1BIT_ximage;
-           dd->WriteMonoRGBAPixels = write_pixels_mono_1BIT_ximage;
-           break;
-         case PF_HPCR:
-            dd->WriteRGBASpan       = write_span_HPCR_ximage;
-            dd->WriteRGBSpan        = write_span_rgb_HPCR_ximage;
-            dd->WriteMonoRGBASpan   = write_span_mono_HPCR_ximage;
-            dd->WriteRGBAPixels     = write_pixels_HPCR_ximage;
-            dd->WriteMonoRGBAPixels = write_pixels_mono_HPCR_ximage;
-           if (xmesa->xm_visual->hpcr_clear_flag) {
-               ctx->Driver.ClearColor = clear_color_HPCR_ximage;
-           }
-            break;
-         case PF_Lookup:
-           if (depth==8) {
-               dd->WriteRGBASpan       = write_span_LOOKUP8_ximage;
-               dd->WriteRGBSpan        = write_rgb_LOOKUP8_ximage;
-               dd->WriteMonoRGBASpan   = write_span_mono_LOOKUP8_ximage;
-               dd->WriteRGBAPixels     = write_pixels_LOOKUP8_ximage;
-               dd->WriteMonoRGBAPixels = write_pixels_mono_LOOKUP8_ximage;
-            }
-            else {
-               dd->WriteRGBASpan       = write_span_LOOKUP_ximage;
-               dd->WriteRGBSpan        = write_span_rgb_LOOKUP_ximage;
-               dd->WriteMonoRGBASpan   = write_span_mono_ximage;
-               dd->WriteRGBAPixels     = write_pixels_LOOKUP_ximage;
-               dd->WriteMonoRGBAPixels = write_pixels_mono_ximage;
-            }
-            break;
-         case PF_Grayscale:
-           if (depth==8) {
-              dd->WriteRGBASpan       = write_span_GRAYSCALE8_ximage;
-              dd->WriteRGBSpan        = write_span_rgb_GRAYSCALE8_ximage;
-              dd->WriteMonoRGBASpan   = write_span_mono_GRAYSCALE8_ximage;
-              dd->WriteRGBAPixels     = write_pixels_GRAYSCALE8_ximage;
-              dd->WriteMonoRGBAPixels = write_pixels_mono_GRAYSCALE8_ximage;
-           }
-           else {
-              dd->WriteRGBASpan       = write_span_GRAYSCALE_ximage;
-              dd->WriteRGBSpan        = write_span_rgb_GRAYSCALE_ximage;
-              dd->WriteMonoRGBASpan   = write_span_mono_ximage;
-              dd->WriteRGBAPixels     = write_pixels_GRAYSCALE_ximage;
-              dd->WriteMonoRGBAPixels = write_pixels_mono_ximage;
-           }
-           break;
-        default:
-           _mesa_problem(NULL,"Bad pixel format in xmesa_update_state (2)");
-            return;
-      }
+   else {
+      xrb->Base.GetRow = get_row_rgba;
+      xrb->Base.GetValues = get_values_rgba;
    }
-
-   /* Pixel/span reading functions: */
-   dd->ReadCI32Span = read_index_span;
-   dd->ReadRGBASpan = read_color_span;
-   dd->ReadCI32Pixels = read_index_pixels;
-   dd->ReadRGBAPixels = read_color_pixels;
 }
+