From f6a50c0b1ff620d1b721968144a56452c0bd6d85 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 16 Nov 2011 07:47:51 -0700 Subject: [PATCH] mesa: don't map depth+stencil buffer twice in glReadPixels() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- src/mesa/main/readpix.c | 14 +++++++++++--- 1 file 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); + } } -- 2.30.2