i965: defined BRW_MAX_MRF
[mesa.git] / src / mesa / drivers / x11 / xm_span.c
index b56ced6b5a67a01a64e6df22241f210199c1cc74..309cefcb8e8152dc7b6afdafa4afa0a93c866bfd 100644 (file)
  * 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"
@@ -176,7 +175,8 @@ static unsigned long read_pixel( XMesaDisplay *dpy,
        const void *values, const GLubyte mask[]
 
 
-/* NOTE: if mask==NULL, draw all pixels */
+#define GET_XRB(XRB) \
+   struct xmesa_renderbuffer *XRB = xmesa_renderbuffer(rb)
 
 
 /*
@@ -186,9 +186,9 @@ static void put_row_TRUECOLOR_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = XMESA_BUFFER(ctx->DrawBuffer)->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
 
@@ -223,9 +223,9 @@ static void put_row_rgb_TRUECOLOR_pixmap( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -258,9 +258,9 @@ static void put_row_TRUEDITHER_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -293,9 +293,9 @@ static void put_row_rgb_TRUEDITHER_pixmap( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -328,9 +328,9 @@ static void put_row_8A8B8G8R_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -362,9 +362,9 @@ static void put_row_rgb_8A8B8G8R_pixmap( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -395,9 +395,9 @@ static void put_row_8A8R8G8B_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -429,9 +429,9 @@ static void put_row_rgb_8A8R8G8B_pixmap( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -462,17 +462,35 @@ static void put_row_8R8G8B_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   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]) {
+#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
          }
       }
    }
@@ -495,9 +513,9 @@ static void put_row_8R8G8B24_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    y = YFLIP(xrb, y);
    if (mask) {
@@ -591,9 +609,9 @@ static void put_row_rgb_8R8G8B_pixmap( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -623,9 +641,9 @@ static void put_row_rgb_8R8G8B24_pixmap( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    y = YFLIP(xrb, y);
    if (mask) {
@@ -724,9 +742,9 @@ static void put_row_5R6G5B_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -757,9 +775,9 @@ static void put_row_DITHER_5R6G5B_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -792,9 +810,9 @@ static void put_row_rgb_5R6G5B_pixmap( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -825,9 +843,9 @@ 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);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -860,9 +878,9 @@ static void put_row_DITHER_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    XDITHER_SETUP(y);
@@ -893,9 +911,9 @@ static void put_row_rgb_DITHER_pixmap( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    XDITHER_SETUP(y);
@@ -926,9 +944,9 @@ static void put_row_1BIT_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    SETUP_1BIT;
@@ -961,9 +979,9 @@ static void put_row_rgb_1BIT_pixmap( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    SETUP_1BIT;
@@ -996,9 +1014,9 @@ static void put_row_HPCR_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -1029,9 +1047,9 @@ static void put_row_rgb_HPCR_pixmap( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -1061,9 +1079,9 @@ static void put_row_LOOKUP_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    LOOKUP_SETUP;
@@ -1093,9 +1111,9 @@ static void put_row_rgb_LOOKUP_pixmap( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    LOOKUP_SETUP;
@@ -1125,9 +1143,9 @@ static void put_row_GRAYSCALE_pixmap( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -1156,9 +1174,9 @@ static void put_row_rgb_GRAYSCALE_pixmap( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -1186,7 +1204,7 @@ static void put_row_TRUECOLOR_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -1217,7 +1235,7 @@ static void put_row_rgb_TRUECOLOR_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -1248,7 +1266,7 @@ static void put_row_TRUEDITHER_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -1279,7 +1297,7 @@ static void put_row_rgb_TRUEDITHER_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -1309,9 +1327,10 @@ static void put_row_rgb_TRUEDITHER_ximage( RGB_SPAN_ARGS )
 static void put_row_8A8B8G8R_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLuint *ptr = PIXEL_ADDR4(xrb, x, y);
+   (void) ctx;
    if (mask) {
       for (i=0;i<n;i++) {
          if (mask[i]) {
@@ -1334,7 +1353,7 @@ static void put_row_8A8B8G8R_ximage( PUT_ROW_ARGS )
 static void put_row_rgb_8A8B8G8R_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLuint *ptr = PIXEL_ADDR4(xrb, x, y);
    if (mask) {
@@ -1358,7 +1377,7 @@ static void put_row_rgb_8A8B8G8R_ximage( RGB_SPAN_ARGS )
 static void put_row_8A8R8G8B_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLuint *ptr = PIXEL_ADDR4(xrb, x, y);
    if (mask) {
@@ -1383,7 +1402,7 @@ static void put_row_8A8R8G8B_ximage( PUT_ROW_ARGS )
 static void put_row_rgb_8A8R8G8B_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLuint *ptr = PIXEL_ADDR4(xrb, x, y);
    if (mask) {
@@ -1408,7 +1427,7 @@ static void put_row_rgb_8A8R8G8B_ximage( RGB_SPAN_ARGS )
 static void put_row_8R8G8B_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLuint *ptr = PIXEL_ADDR4(xrb, x, y);
    if (mask) {
@@ -1432,7 +1451,7 @@ static void put_row_8R8G8B_ximage( PUT_ROW_ARGS )
 static void put_row_8R8G8B24_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLubyte *ptr = (GLubyte *) PIXEL_ADDR3(xrb, x, y );
    if (mask) {
@@ -1452,7 +1471,7 @@ static void put_row_8R8G8B24_ximage( PUT_ROW_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;
@@ -1462,7 +1481,7 @@ static void put_row_8R8G8B24_ximage( PUT_ROW_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;
@@ -1492,7 +1511,7 @@ static void put_row_8R8G8B24_ximage( PUT_ROW_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;
@@ -1503,7 +1522,7 @@ static void put_row_8R8G8B24_ximage( PUT_ROW_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)
@@ -1583,7 +1602,7 @@ static void put_row_8R8G8B24_ximage( PUT_ROW_ARGS )
 static void put_row_rgb_8R8G8B_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLuint *ptr = PIXEL_ADDR4(xrb, x, y);
    if (mask) {
@@ -1608,7 +1627,7 @@ static void put_row_rgb_8R8G8B_ximage( RGB_SPAN_ARGS )
 static void put_row_rgb_8R8G8B24_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLubyte *ptr = (GLubyte *) PIXEL_ADDR3(xrb, x, y);
    if (mask) {
@@ -1640,7 +1659,7 @@ static void put_row_rgb_8R8G8B24_ximage( RGB_SPAN_ARGS )
 static void put_row_5R6G5B_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLushort *ptr = PIXEL_ADDR2(xrb, x, y);
    if (mask) {
@@ -1680,7 +1699,7 @@ static void put_row_5R6G5B_ximage( PUT_ROW_ARGS )
 static void put_row_DITHER_5R6G5B_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint i;
    register GLushort *ptr = PIXEL_ADDR2(xrb, x, y);
@@ -1722,7 +1741,7 @@ static void put_row_DITHER_5R6G5B_ximage( PUT_ROW_ARGS )
 static void put_row_rgb_5R6G5B_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLushort *ptr = PIXEL_ADDR2(xrb, x, y);
    if (mask) {
@@ -1762,7 +1781,7 @@ static void put_row_rgb_5R6G5B_ximage( RGB_SPAN_ARGS )
 static void put_row_rgb_DITHER_5R6G5B_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint i;
    register GLushort *ptr = PIXEL_ADDR2(xrb, x, y );
@@ -1803,7 +1822,7 @@ static void put_row_rgb_DITHER_5R6G5B_ximage( RGB_SPAN_ARGS )
 static void put_row_DITHER_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    int yy = YFLIP(xrb, y);
@@ -1830,7 +1849,7 @@ static void put_row_DITHER_ximage( PUT_ROW_ARGS )
 static void put_row_rgb_DITHER_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    int yy = YFLIP(xrb, y);
@@ -1858,7 +1877,7 @@ static void put_row_rgb_DITHER_ximage( RGB_SPAN_ARGS )
 static void put_row_DITHER8_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    XDITHER_SETUP(y);
@@ -1880,7 +1899,7 @@ static void put_row_DITHER8_ximage( PUT_ROW_ARGS )
 static void put_row_rgb_DITHER8_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    XDITHER_SETUP(y);
@@ -1909,7 +1928,7 @@ static void put_row_1BIT_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    SETUP_1BIT;
@@ -1936,7 +1955,7 @@ static void put_row_rgb_1BIT_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    SETUP_1BIT;
@@ -1962,7 +1981,7 @@ static void put_row_rgb_1BIT_ximage( RGB_SPAN_ARGS )
 static void put_row_HPCR_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint i;
    register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
@@ -1988,7 +2007,7 @@ static void put_row_HPCR_ximage( PUT_ROW_ARGS )
 static void put_row_rgb_HPCR_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint i;
    register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
@@ -2014,7 +2033,7 @@ static void put_row_rgb_HPCR_ximage( RGB_SPAN_ARGS )
 static void put_row_LOOKUP_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    LOOKUP_SETUP;
@@ -2041,7 +2060,7 @@ static void put_row_LOOKUP_ximage( PUT_ROW_ARGS )
 static void put_row_rgb_LOOKUP_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    LOOKUP_SETUP;
@@ -2068,7 +2087,7 @@ static void put_row_rgb_LOOKUP_ximage( RGB_SPAN_ARGS )
 static void put_row_LOOKUP8_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    LOOKUP_SETUP;
@@ -2091,7 +2110,7 @@ static void put_row_LOOKUP8_ximage( PUT_ROW_ARGS )
 static void put_row_rgb_LOOKUP8_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    LOOKUP_SETUP;
@@ -2119,7 +2138,7 @@ static void put_row_rgb_LOOKUP8_ximage( RGB_SPAN_ARGS )
 static void put_row_GRAYSCALE_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -2145,7 +2164,7 @@ static void put_row_GRAYSCALE_ximage( PUT_ROW_ARGS )
 static void put_row_rgb_GRAYSCALE_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -2171,7 +2190,7 @@ static void put_row_rgb_GRAYSCALE_ximage( RGB_SPAN_ARGS )
 static void put_row_GRAYSCALE8_ximage( PUT_ROW_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    if (mask) {
@@ -2196,7 +2215,7 @@ static void put_row_GRAYSCALE8_ximage( PUT_ROW_ARGS )
 static void put_row_rgb_GRAYSCALE8_ximage( RGB_SPAN_ARGS )
 {
    const GLubyte (*rgb)[3] = (const GLubyte (*)[3]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    if (mask) {
@@ -2235,9 +2254,9 @@ static void put_values_TRUECOLOR_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2258,9 +2277,9 @@ static void put_values_TRUEDITHER_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2281,9 +2300,9 @@ static void put_values_8A8B8G8R_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2302,9 +2321,9 @@ static void put_values_8A8R8G8B_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2323,9 +2342,9 @@ static void put_values_8R8G8B_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2344,9 +2363,9 @@ static void put_values_8R8G8B24_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2365,9 +2384,9 @@ static void put_values_5R6G5B_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2386,9 +2405,9 @@ static void put_values_DITHER_5R6G5B_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2409,9 +2428,9 @@ static void put_values_DITHER_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    DITHER_SETUP;
@@ -2432,9 +2451,9 @@ static void put_values_1BIT_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    SETUP_1BIT;
@@ -2455,9 +2474,9 @@ static void put_values_HPCR_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2477,9 +2496,9 @@ static void put_values_LOOKUP_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    LOOKUP_SETUP;
@@ -2499,9 +2518,9 @@ static void put_values_GRAYSCALE_pixmap( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2520,7 +2539,7 @@ static void put_values_TRUECOLOR_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2540,7 +2559,7 @@ static void put_values_TRUEDITHER_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2559,7 +2578,7 @@ static void put_values_TRUEDITHER_ximage( PUT_VALUES_ARGS )
 static void put_values_8A8B8G8R_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
@@ -2575,7 +2594,7 @@ static void put_values_8A8B8G8R_ximage( PUT_VALUES_ARGS )
 static void put_values_8A8R8G8B_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
@@ -2592,7 +2611,7 @@ static void put_values_8A8R8G8B_ximage( PUT_VALUES_ARGS )
 static void put_values_8R8G8B_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
@@ -2609,7 +2628,7 @@ static void put_values_8R8G8B_ximage( PUT_VALUES_ARGS )
 static void put_values_8R8G8B24_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
@@ -2628,7 +2647,7 @@ static void put_values_8R8G8B24_ximage( PUT_VALUES_ARGS )
 static void put_values_5R6G5B_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
@@ -2645,7 +2664,7 @@ static void put_values_5R6G5B_ximage( PUT_VALUES_ARGS )
 static void put_values_DITHER_5R6G5B_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2663,7 +2682,7 @@ static void put_values_DITHER_5R6G5B_ximage( PUT_VALUES_ARGS )
 static void put_values_DITHER_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    DITHER_SETUP;
@@ -2682,7 +2701,7 @@ static void put_values_DITHER_ximage( PUT_VALUES_ARGS )
 static void put_values_DITHER8_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    DITHER_SETUP;
    for (i=0;i<n;i++) {
@@ -2701,7 +2720,7 @@ static void put_values_1BIT_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    SETUP_1BIT;
@@ -2720,7 +2739,7 @@ static void put_values_1BIT_ximage( PUT_VALUES_ARGS )
 static void put_values_HPCR_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2738,7 +2757,7 @@ static void put_values_HPCR_ximage( PUT_VALUES_ARGS )
 static void put_values_LOOKUP_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    LOOKUP_SETUP;
@@ -2756,7 +2775,7 @@ static void put_values_LOOKUP_ximage( PUT_VALUES_ARGS )
 static void put_values_LOOKUP8_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    LOOKUP_SETUP;
    for (i=0;i<n;i++) {
@@ -2774,7 +2793,7 @@ static void put_values_LOOKUP8_ximage( PUT_VALUES_ARGS )
 static void put_values_GRAYSCALE_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -2792,7 +2811,7 @@ static void put_values_GRAYSCALE_ximage( PUT_VALUES_ARGS )
 static void put_values_GRAYSCALE8_ximage( PUT_VALUES_ARGS )
 {
    const GLubyte (*rgba)[4] = (const GLubyte (*)[4]) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    for (i=0;i<n;i++) {
       if (mask[i]) {
@@ -2822,10 +2841,10 @@ static void put_values_GRAYSCALE8_ximage( PUT_VALUES_ARGS )
 static void put_mono_row_pixmap( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   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);
@@ -2863,9 +2882,9 @@ put_mono_row_ci_pixmap( PUT_MONO_ROW_ARGS )
 {
    GLuint colorIndex = *((GLuint *) value);
    XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    XMesaSetForeground( xmesa->display, gc, colorIndex );
@@ -2899,10 +2918,10 @@ put_mono_row_ci_pixmap( PUT_MONO_ROW_ARGS )
 static void put_mono_row_TRUEDITHER_pixmap( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   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;
@@ -2924,10 +2943,10 @@ static void put_mono_row_TRUEDITHER_pixmap( PUT_MONO_ROW_ARGS )
 static void put_mono_row_DITHER_pixmap( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   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;
@@ -2948,10 +2967,10 @@ static void put_mono_row_DITHER_pixmap( PUT_MONO_ROW_ARGS )
 static void put_mono_row_1BIT_pixmap( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   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;
@@ -2972,7 +2991,7 @@ static void put_mono_row_1BIT_pixmap( PUT_MONO_ROW_ARGS )
 static void put_mono_row_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
@@ -2991,7 +3010,7 @@ static void
 put_mono_row_ci_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLuint colorIndex = *((GLuint *) value);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -3009,7 +3028,7 @@ put_mono_row_ci_ximage( PUT_MONO_ROW_ARGS )
 static void put_mono_row_TRUEDITHER_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaImage *img = xrb->ximage;
    const GLint r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
@@ -3031,7 +3050,7 @@ static void put_mono_row_TRUEDITHER_ximage( PUT_MONO_ROW_ARGS )
 static void put_mono_row_8A8B8G8R_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaContext xmesa = XMESA_CONTEXT(ctx);
    GLuint i, *ptr;
    const unsigned long pixel = xmesa_color_to_pixel(ctx, color[RCOMP],
@@ -3050,7 +3069,7 @@ static void put_mono_row_8A8B8G8R_ximage( PUT_MONO_ROW_ARGS )
 static void put_mono_row_8A8R8G8B_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    GLuint i, *ptr;
    XMesaContext xmesa = XMESA_CONTEXT(ctx);
    const unsigned long pixel = xmesa_color_to_pixel(ctx, color[RCOMP],
@@ -3070,7 +3089,7 @@ static void put_mono_row_8A8R8G8B_ximage( PUT_MONO_ROW_ARGS )
 static void put_mono_row_8R8G8B_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const GLuint pixel = PACK_8R8G8B(color[RCOMP], color[GCOMP], color[BCOMP]);
    GLuint *ptr = PIXEL_ADDR4(xrb, x, y );
    GLuint i;
@@ -3088,7 +3107,7 @@ static void put_mono_row_8R8G8B_ximage( PUT_MONO_ROW_ARGS )
 static void put_mono_row_8R8G8B24_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP];
    const GLubyte g = color[GCOMP];
    const GLubyte b = color[BCOMP];
@@ -3110,7 +3129,7 @@ static void put_mono_row_8R8G8B24_ximage( PUT_MONO_ROW_ARGS )
 static void put_mono_row_DITHER_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    XMesaImage *img = xrb->ximage;
    int yy = YFLIP(xrb, y);
@@ -3130,7 +3149,7 @@ static void put_mono_row_DITHER_ximage( PUT_MONO_ROW_ARGS )
 static void put_mono_row_DITHER8_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    register GLuint i;
@@ -3149,7 +3168,7 @@ static void put_mono_row_DITHER8_ximage( PUT_MONO_ROW_ARGS )
 static void put_mono_row_LOOKUP8_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
    GLubyte pixel;
@@ -3170,7 +3189,7 @@ static void put_mono_row_1BIT_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    XMesaImage *img = xrb->ximage;
    register GLuint i;
@@ -3190,7 +3209,7 @@ static void put_mono_row_1BIT_ximage( PUT_MONO_ROW_ARGS )
 static void put_mono_row_HPCR_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLubyte *ptr = PIXEL_ADDR1(xrb, x, y);
@@ -3209,7 +3228,7 @@ static void put_mono_row_HPCR_ximage( PUT_MONO_ROW_ARGS )
 static void put_mono_row_GRAYSCALE8_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const GLubyte p = GRAY_RGB(color[RCOMP], color[GCOMP], color[BCOMP]);
    GLubyte *ptr = (GLubyte *) PIXEL_ADDR1(xrb, x, y);
    GLuint i;
@@ -3228,7 +3247,7 @@ static void put_mono_row_GRAYSCALE8_ximage( PUT_MONO_ROW_ARGS )
 static void put_mono_row_DITHER_5R6G5B_ximage( PUT_MONO_ROW_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLushort *ptr = PIXEL_ADDR2(xrb, x, y );
    const GLint r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
@@ -3261,9 +3280,9 @@ static void put_mono_values_pixmap( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    const unsigned long pixel = xmesa_color_to_pixel(ctx, color[RCOMP],
@@ -3283,9 +3302,9 @@ put_mono_values_ci_pixmap( PUT_MONO_VALUES_ARGS )
 {
    const GLuint colorIndex = *((GLuint *) value);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    XMesaSetForeground( xmesa->display, gc, colorIndex );
@@ -3305,9 +3324,9 @@ static void put_mono_values_TRUEDITHER_pixmap( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   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];
@@ -3330,9 +3349,9 @@ static void put_mono_values_DITHER_pixmap( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   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];
@@ -3353,9 +3372,9 @@ static void put_mono_values_1BIT_pixmap( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   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];
@@ -3376,7 +3395,7 @@ static void put_mono_values_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    const unsigned long pixel = xmesa_color_to_pixel(ctx, color[RCOMP],
@@ -3393,7 +3412,7 @@ static void
 put_mono_values_ci_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLuint colorIndex = *((GLuint *) value);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -3411,7 +3430,7 @@ static void put_mono_values_TRUEDITHER_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    const int r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
@@ -3432,7 +3451,7 @@ static void put_mono_values_TRUEDITHER_ximage( PUT_MONO_VALUES_ARGS )
 static void put_mono_values_8A8B8G8R_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const GLuint p = PACK_8A8B8G8R(color[RCOMP], color[GCOMP],
                                   color[BCOMP], color[ACOMP]);
    register GLuint i;
@@ -3450,7 +3469,7 @@ static void put_mono_values_8A8B8G8R_ximage( PUT_MONO_VALUES_ARGS )
 static void put_mono_values_8A8R8G8B_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const GLuint p = PACK_8A8R8G8B(color[RCOMP], color[GCOMP],
                                   color[BCOMP], color[ACOMP]);
    register GLuint i;
@@ -3468,7 +3487,7 @@ static void put_mono_values_8A8R8G8B_ximage( PUT_MONO_VALUES_ARGS )
 static void put_mono_values_8R8G8B_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    const GLuint p = PACK_8R8G8B(color[RCOMP], color[GCOMP], color[BCOMP]);
    for (i=0;i<n;i++) {
@@ -3486,7 +3505,7 @@ static void put_mono_values_8R8G8B_ximage( PUT_MONO_VALUES_ARGS )
 static void put_mono_values_8R8G8B24_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -3506,7 +3525,7 @@ static void put_mono_values_8R8G8B24_ximage( PUT_MONO_VALUES_ARGS )
 static void put_mono_values_DITHER_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    XMesaImage *img = xrb->ximage;
    register GLuint i;
@@ -3525,7 +3544,7 @@ static void put_mono_values_DITHER_ximage( PUT_MONO_VALUES_ARGS )
 static void put_mono_values_DITHER8_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLuint i;
    DITHER_SETUP;
@@ -3544,7 +3563,7 @@ static void put_mono_values_DITHER8_ximage( PUT_MONO_VALUES_ARGS )
 static void put_mono_values_LOOKUP8_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    GLubyte pixel;
    LOOKUP_SETUP;
@@ -3566,7 +3585,7 @@ static void put_mono_values_1BIT_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    XMesaImage *img = xrb->ximage;
    register GLuint i;
@@ -3586,7 +3605,7 @@ static void put_mono_values_1BIT_ximage( PUT_MONO_VALUES_ARGS )
 static void put_mono_values_HPCR_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    const GLubyte r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLuint i;
@@ -3605,7 +3624,7 @@ static void put_mono_values_HPCR_ximage( PUT_MONO_VALUES_ARGS )
 static void put_mono_values_GRAYSCALE8_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    register GLuint i;
    register GLubyte p = GRAY_RGB(color[RCOMP], color[GCOMP], color[BCOMP]);
    for (i=0;i<n;i++) {
@@ -3623,7 +3642,7 @@ static void put_mono_values_GRAYSCALE8_ximage( PUT_MONO_VALUES_ARGS )
 static void put_mono_values_DITHER_5R6G5B_ximage( PUT_MONO_VALUES_ARGS )
 {
    const GLubyte *color = (const GLubyte *) value;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    const int r = color[RCOMP], g = color[GCOMP], b = color[BCOMP];
    register GLuint i;
@@ -3648,9 +3667,9 @@ static void put_row_ci_pixmap( PUT_ROW_ARGS )
 {
    const GLuint *index = (GLuint *) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -3677,7 +3696,7 @@ static void put_row_ci_pixmap( PUT_ROW_ARGS )
 static void put_row_ci_ximage( PUT_ROW_ARGS )
 {
    const GLuint *index = (const GLuint *) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    y = YFLIP(xrb, y);
@@ -3707,9 +3726,9 @@ static void put_values_ci_pixmap( PUT_VALUES_ARGS )
 {
    const GLuint *index = (const GLuint *) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
-   XMesaDrawable buffer = xrb->pixmap;
+   XMesaDrawable buffer = xrb->drawable;
    XMesaGC gc = XMESA_BUFFER(ctx->DrawBuffer)->gc;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -3727,7 +3746,7 @@ static void put_values_ci_pixmap( PUT_VALUES_ARGS )
 static void put_values_ci_ximage( PUT_VALUES_ARGS )
 {
    const GLuint *index = (const GLuint *) values;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaImage *img = xrb->ximage;
    register GLuint i;
    for (i=0;i<n;i++) {
@@ -3762,7 +3781,7 @@ clip_for_xgetimage(GLcontext *ctx, GLuint *n, GLint *x, GLint *y)
    Window child;
    GLint screenWidth = WidthOfScreen(DefaultScreenOfDisplay(xmesa->display));
    GLint dx, dy;
-   if (source->type == PBUFFER)
+   if (source->type == PBUFFER || source->type == PIXMAP)
       return 0;
    XTranslateCoordinates(xmesa->display, source->frontxrb->pixmap, rootWin,
                          *x, *y, &dx, &dy, &child);
@@ -3799,7 +3818,7 @@ get_row_ci(GLcontext *ctx, struct gl_renderbuffer *rb,
 {
    GLuint *index = (GLuint *) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    GLuint i;
 
    y = YFLIP(xrb, y);
@@ -3832,7 +3851,7 @@ get_row_ci(GLcontext *ctx, struct gl_renderbuffer *rb,
         XMesaDestroyImage( span );
       }
 #else
-      (*xmesa->display->GetImage)(source->buffer,
+      (*xmesa->display->GetImage)(xrb->drawable,
                                  x, y, n, 1, ZPixmap,
                                  ~0L, (pointer)index);
 #endif
@@ -3856,7 +3875,7 @@ get_row_rgba(GLcontext *ctx, struct gl_renderbuffer *rb,
 {
    GLubyte (*rgba)[4] = (GLubyte (*)[4]) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    XMesaBuffer source = XMESA_BUFFER(ctx->DrawBuffer);
 
    if (xrb->pixmap) {
@@ -3867,7 +3886,7 @@ get_row_rgba(GLcontext *ctx, struct gl_renderbuffer *rb,
       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,
+      (*xmesa->display->GetImage)(xrb->drawable,
                                  x, YFLIP(xrb, y), n, 1, ZPixmap,
                                  ~0L, (pointer)span->data);
 #else
@@ -4258,11 +4277,11 @@ get_values_ci(GLcontext *ctx, struct gl_renderbuffer *rb,
 {
    GLuint *indx = (GLuint *) values;
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    GLuint i;
    if (xrb->pixmap) {
       for (i=0;i<n;i++) {
-         indx[i] = (GLuint) read_pixel( xmesa->display, xrb->pixmap,
+         indx[i] = (GLuint) read_pixel( xmesa->display, xrb->drawable,
                                         x[i], YFLIP(xrb, y[i]) );
       }
    }
@@ -4281,14 +4300,14 @@ 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;
-   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
+   GET_XRB(xrb);
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    XMesaDisplay *dpy = xmesa->xm_visual->display;
    XMesaBuffer source = XMESA_BUFFER(ctx->DrawBuffer);
    register GLuint i;
 
    if (xrb->pixmap) {
-      XMesaDrawable buffer = xrb->pixmap;
+      XMesaDrawable buffer = xrb->drawable;
       switch (xmesa->pixelformat) {
         case PF_Truecolor:
          case PF_Dither_True: