On Fri, Oct 28, 2011 at 1:49 PM, Eric Anholt <e...@anholt.net> wrote: > 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;
I'd probably put the code to unpack a row of stencil values into a new _mesa_unpack_ubyte_stencil_row() function in format_unpack.c in case it could be used elsewhere, like in the swrast stencil op code. Otherwise this looks good. -Brian _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev