This avoids going through the wrapper that has to rewrite the data for packed depth/stencil. This isn't done in _swrast_read_stencil_span because we don't want to map/unmap for each span. --- src/mesa/swrast/s_readpix.c | 43 +++++++++++++++++++++++++++++++++++++++---- 1 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/src/mesa/swrast/s_readpix.c b/src/mesa/swrast/s_readpix.c index 187c27e..4ecb5b8 100644 --- a/src/mesa/swrast/s_readpix.c +++ b/src/mesa/swrast/s_readpix.c @@ -142,8 +142,10 @@ read_stencil_pixels( struct gl_context *ctx, const struct gl_pixelstore_attrib *packing ) { struct gl_framebuffer *fb = ctx->ReadBuffer; - struct gl_renderbuffer *rb = fb->_StencilBuffer; - GLint j; + struct gl_renderbuffer *rb = fb->Attachment[BUFFER_STENCIL].Renderbuffer; + GLint j, i; + GLubyte *map; + GLint stride; if (!rb) return; @@ -151,18 +153,51 @@ read_stencil_pixels( struct gl_context *ctx, /* width should never be > MAX_WIDTH since we did clipping earlier */ ASSERT(width <= MAX_WIDTH); + ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height, GL_MAP_READ_BIT, + &map, &stride); + /* process image row by row */ - for (j=0;j<height;j++,y++) { + for (j = 0; j < height; j++) { GLvoid *dest; GLstencil stencil[MAX_WIDTH]; - _swrast_read_stencil_span(ctx, rb, width, x, y, stencil); + switch (rb->Format) { + + case MESA_FORMAT_S8_Z24: { + uint32_t *data = (uint32_t *)map; + for (i = 0; i < width; i++) + stencil[i] = data[i] >> 24; + break; + } + + case MESA_FORMAT_Z24_S8: { + uint32_t *data = (uint32_t *)map; + for (i = 0; i < width; i++) + stencil[i] = data[i] & 0xff; + break; + } + + case MESA_FORMAT_S8: + for (i = 0; i < width; i++) + stencil[i] = map[i]; + break; + + default: + _mesa_problem(ctx, "Unknown format %s in %s\n", + _mesa_get_format_name(rb->Format), __FUNCTION__); + memset(stencil, 0, MAX_WIDTH); + break; + } dest = _mesa_image_address2d(packing, pixels, width, height, GL_STENCIL_INDEX, type, j, 0); _mesa_pack_stencil_span(ctx, width, type, dest, stencil, packing); + + map += stride; } + + ctx->Driver.UnmapRenderbuffer(ctx, rb); } -- 1.7.7 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev