i965: defined BRW_MAX_MRF
[mesa.git] / src / mesa / drivers / x11 / xm_span.c
index 1288c9d9587c7dbae53c5697905d2f7d19637a5b..309cefcb8e8152dc7b6afdafa4afa0a93c866bfd 100644 (file)
@@ -471,8 +471,26 @@ static void put_row_8R8G8B_pixmap( PUT_ROW_ARGS )
    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
          }
       }
    }
@@ -1303,17 +1321,6 @@ static void put_row_rgb_TRUEDITHER_ximage( RGB_SPAN_ARGS )
 }
 
 
-
-static void *get_pointer_4_ximage( GLcontext *ctx, 
-                                  struct gl_renderbuffer *rb, 
-                                  GLint x, GLint y )
-{
-   GET_XRB(xrb);
-   return PIXEL_ADDR4(xrb, x, y);
-}
-
-
-
 /*
  * Write a span of PF_8A8B8G8R-format pixels to an ximage.
  */
@@ -4539,260 +4546,257 @@ xmesa_set_renderbuffer_funcs(struct xmesa_renderbuffer *xrb,
                              enum pixel_format pixelformat, GLint depth)
 {
    const GLboolean pixmap = xrb->pixmap ? GL_TRUE : GL_FALSE;
-   struct gl_renderbuffer *rb  = &xrb->St.Base;
 
    switch (pixelformat) {
    case PF_Index:
-      ASSERT(rb->DataType == GL_UNSIGNED_INT);
+      ASSERT(xrb->Base.DataType == GL_UNSIGNED_INT);
       if (pixmap) {
-         rb->PutRow        = put_row_ci_pixmap;
-         rb->PutRowRGB     = NULL;
-         rb->PutMonoRow    = put_mono_row_ci_pixmap;
-         rb->PutValues     = put_values_ci_pixmap;
-         rb->PutMonoValues = put_mono_values_ci_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;
       }
       else {
-         rb->PutRow        = put_row_ci_ximage;
-         rb->PutRowRGB     = NULL;
-         rb->PutMonoRow    = put_mono_row_ci_ximage;
-         rb->PutValues     = put_values_ci_ximage;
-         rb->PutMonoValues = put_mono_values_ci_ximage;
+         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) {
-         rb->PutRow        = put_row_TRUECOLOR_pixmap;
-         rb->PutRowRGB     = put_row_rgb_TRUECOLOR_pixmap;
-         rb->PutMonoRow    = put_mono_row_pixmap;
-         rb->PutValues     = put_values_TRUECOLOR_pixmap;
-         rb->PutMonoValues = put_mono_values_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 {
-         rb->PutRow        = put_row_TRUECOLOR_ximage;
-         rb->PutRowRGB     = put_row_rgb_TRUECOLOR_ximage;
-         rb->PutMonoRow    = put_mono_row_ximage;
-         rb->PutValues     = put_values_TRUECOLOR_ximage;
-         rb->PutMonoValues = put_mono_values_ximage;
+         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) {
-         rb->PutRow        = put_row_TRUEDITHER_pixmap;
-         rb->PutRowRGB     = put_row_rgb_TRUEDITHER_pixmap;
-         rb->PutMonoRow    = put_mono_row_TRUEDITHER_pixmap;
-         rb->PutValues     = put_values_TRUEDITHER_pixmap;
-         rb->PutMonoValues = put_mono_values_TRUEDITHER_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 {
-         rb->PutRow        = put_row_TRUEDITHER_ximage;
-         rb->PutRowRGB     = put_row_rgb_TRUEDITHER_ximage;
-         rb->PutMonoRow    = put_mono_row_TRUEDITHER_ximage;
-         rb->PutValues     = put_values_TRUEDITHER_ximage;
-         rb->PutMonoValues = put_mono_values_TRUEDITHER_ximage;
+         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) {
-         rb->PutRow        = put_row_8A8B8G8R_pixmap;
-         rb->PutRowRGB     = put_row_rgb_8A8B8G8R_pixmap;
-         rb->PutMonoRow    = put_mono_row_pixmap;
-         rb->PutValues     = put_values_8A8B8G8R_pixmap;
-         rb->PutMonoValues = put_mono_values_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 {
-         rb->PutRow        = put_row_8A8B8G8R_ximage;
-         rb->PutRowRGB     = put_row_rgb_8A8B8G8R_ximage;
-         rb->PutMonoRow    = put_mono_row_8A8B8G8R_ximage;
-         rb->PutValues     = put_values_8A8B8G8R_ximage;
-         rb->PutMonoValues = put_mono_values_8A8B8G8R_ximage;
-        rb->GetPointer    = get_pointer_4_ximage;
+         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) {
-         rb->PutRow        = put_row_8A8R8G8B_pixmap;
-         rb->PutRowRGB     = put_row_rgb_8A8R8G8B_pixmap;
-         rb->PutMonoRow    = put_mono_row_pixmap;
-         rb->PutValues     = put_values_8A8R8G8B_pixmap;
-         rb->PutMonoValues = put_mono_values_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 {
-         rb->PutRow        = put_row_8A8R8G8B_ximage;
-         rb->PutRowRGB     = put_row_rgb_8A8R8G8B_ximage;
-         rb->PutMonoRow    = put_mono_row_8A8R8G8B_ximage;
-         rb->PutValues     = put_values_8A8R8G8B_ximage;
-         rb->PutMonoValues = put_mono_values_8A8R8G8B_ximage;
-        rb->GetPointer    = get_pointer_4_ximage;
+         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) {
-         rb->PutRow        = put_row_8R8G8B_pixmap;
-         rb->PutRowRGB     = put_row_rgb_8R8G8B_pixmap;
-         rb->PutMonoRow    = put_mono_row_pixmap;
-         rb->PutValues     = put_values_8R8G8B_pixmap;
-         rb->PutMonoValues = put_mono_values_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 {
-         rb->PutRow        = put_row_8R8G8B_ximage;
-         rb->PutRowRGB     = put_row_rgb_8R8G8B_ximage;
-         rb->PutMonoRow    = put_mono_row_8R8G8B_ximage;
-         rb->PutValues     = put_values_8R8G8B_ximage;
-         rb->PutMonoValues = put_mono_values_8R8G8B_ximage;
+         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) {
-         rb->PutRow        = put_row_8R8G8B24_pixmap;
-         rb->PutRowRGB     = put_row_rgb_8R8G8B24_pixmap;
-         rb->PutMonoRow    = put_mono_row_pixmap;
-         rb->PutValues     = put_values_8R8G8B24_pixmap;
-         rb->PutMonoValues = put_mono_values_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 {
-         rb->PutRow        = put_row_8R8G8B24_ximage;
-         rb->PutRowRGB     = put_row_rgb_8R8G8B24_ximage;
-         rb->PutMonoRow    = put_mono_row_8R8G8B24_ximage;
-         rb->PutValues     = put_values_8R8G8B24_ximage;
-         rb->PutMonoValues = put_mono_values_8R8G8B24_ximage;
+         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) {
-         rb->PutRow        = put_row_5R6G5B_pixmap;
-         rb->PutRowRGB     = put_row_rgb_5R6G5B_pixmap;
-         rb->PutMonoRow    = put_mono_row_pixmap;
-         rb->PutValues     = put_values_5R6G5B_pixmap;
-         rb->PutMonoValues = put_mono_values_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 {
-         rb->PutRow        = put_row_5R6G5B_ximage;
-         rb->PutRowRGB     = put_row_rgb_5R6G5B_ximage;
-         rb->PutMonoRow    = put_mono_row_ximage;
-         rb->PutValues     = put_values_5R6G5B_ximage;
-         rb->PutMonoValues = put_mono_values_ximage;
+         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) {
-         rb->PutRow        = put_row_DITHER_5R6G5B_pixmap;
-         rb->PutRowRGB     = put_row_rgb_DITHER_5R6G5B_pixmap;
-         rb->PutMonoRow    = put_mono_row_TRUEDITHER_pixmap;
-         rb->PutValues     = put_values_DITHER_5R6G5B_pixmap;
-         rb->PutMonoValues = put_mono_values_TRUEDITHER_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 {
-         rb->PutRow        = put_row_DITHER_5R6G5B_ximage;
-         rb->PutRowRGB     = put_row_rgb_DITHER_5R6G5B_ximage;
-         rb->PutMonoRow    = put_mono_row_DITHER_5R6G5B_ximage;
-         rb->PutValues     = put_values_DITHER_5R6G5B_ximage;
-         rb->PutMonoValues = put_mono_values_DITHER_5R6G5B_ximage;
+         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) {
-         rb->PutRow        = put_row_DITHER_pixmap;
-         rb->PutRowRGB     = put_row_rgb_DITHER_pixmap;
-         rb->PutMonoRow    = put_mono_row_DITHER_pixmap;
-         rb->PutValues     = put_values_DITHER_pixmap;
-         rb->PutMonoValues = put_mono_values_DITHER_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) {
-            rb->PutRow        = put_row_DITHER8_ximage;
-            rb->PutRowRGB     = put_row_rgb_DITHER8_ximage;
-            rb->PutMonoRow    = put_mono_row_DITHER8_ximage;
-            rb->PutValues     = put_values_DITHER8_ximage;
-            rb->PutMonoValues = put_mono_values_DITHER8_ximage;
+            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 {
-            rb->PutRow        = put_row_DITHER_ximage;
-            rb->PutRowRGB     = put_row_rgb_DITHER_ximage;
-            rb->PutMonoRow    = put_mono_row_DITHER_ximage;
-            rb->PutValues     = put_values_DITHER_ximage;
-            rb->PutMonoValues = put_mono_values_DITHER_ximage;
+            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) {
-         rb->PutRow        = put_row_1BIT_pixmap;
-         rb->PutRowRGB     = put_row_rgb_1BIT_pixmap;
-         rb->PutMonoRow    = put_mono_row_1BIT_pixmap;
-         rb->PutValues     = put_values_1BIT_pixmap;
-         rb->PutMonoValues = put_mono_values_1BIT_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 {
-         rb->PutRow        = put_row_1BIT_ximage;
-         rb->PutRowRGB     = put_row_rgb_1BIT_ximage;
-         rb->PutMonoRow    = put_mono_row_1BIT_ximage;
-         rb->PutValues     = put_values_1BIT_ximage;
-         rb->PutMonoValues = put_mono_values_1BIT_ximage;
+         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) {
-         rb->PutRow        = put_row_HPCR_pixmap;
-         rb->PutRowRGB     = put_row_rgb_HPCR_pixmap;
-         rb->PutMonoRow    = put_mono_row_pixmap;
-         rb->PutValues     = put_values_HPCR_pixmap;
-         rb->PutMonoValues = put_mono_values_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 {
-         rb->PutRow        = put_row_HPCR_ximage;
-         rb->PutRowRGB     = put_row_rgb_HPCR_ximage;
-         rb->PutMonoRow    = put_mono_row_HPCR_ximage;
-         rb->PutValues     = put_values_HPCR_ximage;
-         rb->PutMonoValues = put_mono_values_HPCR_ximage;
+         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) {
-         rb->PutRow        = put_row_LOOKUP_pixmap;
-         rb->PutRowRGB     = put_row_rgb_LOOKUP_pixmap;
-         rb->PutMonoRow    = put_mono_row_pixmap;
-         rb->PutValues     = put_values_LOOKUP_pixmap;
-         rb->PutMonoValues = put_mono_values_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) {
-            rb->PutRow        = put_row_LOOKUP8_ximage;
-            rb->PutRowRGB     = put_row_rgb_LOOKUP8_ximage;
-            rb->PutMonoRow    = put_mono_row_LOOKUP8_ximage;
-            rb->PutValues     = put_values_LOOKUP8_ximage;
-            rb->PutMonoValues = put_mono_values_LOOKUP8_ximage;
+            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 {
-            rb->PutRow        = put_row_LOOKUP_ximage;
-            rb->PutRowRGB     = put_row_rgb_LOOKUP_ximage;
-            rb->PutMonoRow    = put_mono_row_ximage;
-            rb->PutValues     = put_values_LOOKUP_ximage;
-            rb->PutMonoValues = put_mono_values_ximage;
+            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) {
-         rb->PutRow        = put_row_GRAYSCALE_pixmap;
-         rb->PutRowRGB     = put_row_rgb_GRAYSCALE_pixmap;
-         rb->PutMonoRow    = put_mono_row_pixmap;
-         rb->PutValues     = put_values_GRAYSCALE_pixmap;
-         rb->PutMonoValues = put_mono_values_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) {
-            rb->PutRow        = put_row_GRAYSCALE8_ximage;
-            rb->PutRowRGB     = put_row_rgb_GRAYSCALE8_ximage;
-            rb->PutMonoRow    = put_mono_row_GRAYSCALE8_ximage;
-            rb->PutValues     = put_values_GRAYSCALE8_ximage;
-            rb->PutMonoValues = put_mono_values_GRAYSCALE8_ximage;
+            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 {
-            rb->PutRow        = put_row_GRAYSCALE_ximage;
-            rb->PutRowRGB     = put_row_rgb_GRAYSCALE_ximage;
-            rb->PutMonoRow    = put_mono_row_ximage;
-            rb->PutValues     = put_values_GRAYSCALE_ximage;
-            rb->PutMonoValues = put_mono_values_ximage;
+            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;
@@ -4804,12 +4808,12 @@ xmesa_set_renderbuffer_funcs(struct xmesa_renderbuffer *xrb,
 
    /* Get functions */
    if (pixelformat == PF_Index) {
-      rb->GetRow = get_row_ci;
-      rb->GetValues = get_values_ci;
+      xrb->Base.GetRow = get_row_ci;
+      xrb->Base.GetValues = get_values_ci;
    }
    else {
-      rb->GetRow = get_row_rgba;
-      rb->GetValues = get_values_rgba;
+      xrb->Base.GetRow = get_row_rgba;
+      xrb->Base.GetValues = get_values_rgba;
    }
 }