mesa: don't map depth+stencil buffer twice in glReadPixels()
authorBrian Paul <brianp@vmware.com>
Wed, 16 Nov 2011 14:47:51 +0000 (07:47 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 16 Nov 2011 15:49:22 +0000 (08:49 -0700)
In slow_read_depth_stencil_pixels_separate() we might have separate
depth and stencil buffers or a combined buffer.  In the later case,
don't map the buffer twice.  This function is used when the depth
scale/bias pixel transfer values are not the defaults.

Fixes http://bugs.freedesktop.org/show_bug.cgi?id=42963

Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/mesa/main/readpix.c

index 855061815f7477096f7ad9392c58920c155e2f59..0b41de622241e28a83203655056feea66fe2d597 100644 (file)
@@ -402,10 +402,16 @@ slow_read_depth_stencil_pixels_separate(struct gl_context *ctx,
    GLubyte *depthMap, *stencilMap;
    int depthStride, stencilStride, j;
 
+   /* The depth and stencil buffers might be separate, or a single buffer.
+    * If one buffer, only map it once.
+    */
    ctx->Driver.MapRenderbuffer(ctx, depthRb, x, y, width, height,
                               GL_MAP_READ_BIT, &depthMap, &depthStride);
-   ctx->Driver.MapRenderbuffer(ctx, stencilRb, x, y, width, height,
-                              GL_MAP_READ_BIT, &stencilMap, &stencilStride);
+   if (stencilRb != depthRb) {
+      ctx->Driver.MapRenderbuffer(ctx, stencilRb, x, y, width, height,
+                                  GL_MAP_READ_BIT, &stencilMap,
+                                  &stencilStride);
+   }
 
    for (j = 0; j < height; j++) {
       GLubyte stencilVals[MAX_WIDTH];
@@ -424,7 +430,9 @@ slow_read_depth_stencil_pixels_separate(struct gl_context *ctx,
    }
 
    ctx->Driver.UnmapRenderbuffer(ctx, depthRb);
-   ctx->Driver.UnmapRenderbuffer(ctx, stencilRb);
+   if (stencilRb != depthRb) {
+      ctx->Driver.UnmapRenderbuffer(ctx, stencilRb);
+   }
 }