[Mesa-dev] [PATCH 11/24] swrast: Calculate image address/stride once for depth/stencil readpixels.
Eric Anholt
eric at anholt.net
Fri Oct 28 12:50:01 PDT 2011
The fast and slow paths were doing these separately before.
---
src/mesa/swrast/s_readpix.c | 30 ++++++++++++++----------------
1 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/src/mesa/swrast/s_readpix.c b/src/mesa/swrast/s_readpix.c
index c0bb399..7b74ed3 100644
--- a/src/mesa/swrast/s_readpix.c
+++ b/src/mesa/swrast/s_readpix.c
@@ -400,14 +400,13 @@ static GLboolean
fast_read_depth_stencil_pixels(struct gl_context *ctx,
GLint x, GLint y,
GLsizei width, GLsizei height,
- GLenum type, GLvoid *pixels,
- const struct gl_pixelstore_attrib *packing)
+ GLenum type, GLvoid *dst, int dstStride)
{
struct gl_framebuffer *fb = ctx->ReadBuffer;
struct gl_renderbuffer *rb = fb->Attachment[BUFFER_DEPTH].Renderbuffer;
struct gl_renderbuffer *stencilRb = fb->Attachment[BUFFER_DEPTH].Renderbuffer;
- GLubyte *dst, *map;
- int stride, dstStride, i;
+ GLubyte *map;
+ int stride, i;
if (rb != stencilRb)
return GL_FALSE;
@@ -422,13 +421,6 @@ fast_read_depth_stencil_pixels(struct gl_context *ctx,
ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height, GL_MAP_READ_BIT,
&map, &stride);
- dstStride = _mesa_image_row_stride(packing, width,
- GL_DEPTH_STENCIL_EXT, type);
- dst = (GLubyte *) _mesa_image_address2d(packing, pixels,
- width, height,
- GL_DEPTH_STENCIL_EXT,
- type, 0, 0);
-
for (i = 0; i < height; i++) {
memcpy(dst, map, width * 4);
@@ -469,6 +461,8 @@ read_depth_stencil_pixels(struct gl_context *ctx,
const GLboolean stencilTransfer = ctx->Pixel.IndexShift
|| ctx->Pixel.IndexOffset || ctx->Pixel.MapStencilFlag;
struct gl_renderbuffer *depthRb, *stencilRb;
+ GLubyte *dst;
+ int dstStride;
depthRb = ctx->ReadBuffer->_DepthBuffer;
stencilRb = ctx->ReadBuffer->_StencilBuffer;
@@ -476,9 +470,16 @@ read_depth_stencil_pixels(struct gl_context *ctx,
if (!depthRb || !stencilRb)
return;
+ dst = (GLubyte *) _mesa_image_address2d(packing, pixels,
+ width, height,
+ GL_DEPTH_STENCIL_EXT,
+ type, 0, 0);
+ dstStride = _mesa_image_row_stride(packing, width,
+ GL_DEPTH_STENCIL_EXT, type);
+
if (!scaleOrBias && !stencilTransfer && !packing->SwapBytes) {
if (fast_read_depth_stencil_pixels(ctx, x, y, width, height, type,
- pixels, packing))
+ dst, dstStride))
return;
}
@@ -490,10 +491,7 @@ read_depth_stencil_pixels(struct gl_context *ctx,
for (i = 0; i < height; i++) {
GLstencil stencilVals[MAX_WIDTH];
-
- GLuint *depthStencilDst = (GLuint *)
- _mesa_image_address2d(packing, pixels, width, height,
- GL_DEPTH_STENCIL_EXT, type, i, 0);
+ GLuint *depthStencilDst = (GLuint *) (dst + dstStride * i);
_swrast_read_stencil_span(ctx, stencilRb, width,
x, y + i, stencilVals);
--
1.7.7
More information about the mesa-dev
mailing list