[Mesa-dev] [PATCH] mesa: don't map depth+stencil buffer twice in glReadPixels()

Jose Fonseca jfonseca at vmware.com
Wed Nov 16 07:43:41 PST 2011


Looks good Brian.

BTW, we should probably be more defensive about map failures on this code. This is not a regression, as st_cb_readpixels.c also did a poor job.

Jose

----- Original Message -----
> 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
> ---
>  src/mesa/main/readpix.c |   14 +++++++++++---
>  1 files changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/src/mesa/main/readpix.c b/src/mesa/main/readpix.c
> index 8550618..0b41de6 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);
> +   }
>  }



More information about the mesa-dev mailing list