summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/readpix.c
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2011-11-16 07:47:51 -0700
committerBrian Paul <[email protected]>2011-11-16 08:49:22 -0700
commitf6a50c0b1ff620d1b721968144a56452c0bd6d85 (patch)
tree59470ce86cab923f1b8b710ee18cdcccf14dd84d /src/mesa/main/readpix.c
parent728a830fae690a4c6063ba4829dabe450b6c287d (diff)
mesa: don't map depth+stencil buffer twice in glReadPixels()
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 <[email protected]>
Diffstat (limited to 'src/mesa/main/readpix.c')
-rw-r--r--src/mesa/main/readpix.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/mesa/main/readpix.c b/src/mesa/main/readpix.c
index 855061815f7..0b41de62224 100644
--- a/src/mesa/main/readpix.c
+++ b/src/mesa/main/readpix.c
@@ -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);
+ }
}