[Mesa-dev] [PATCH 09/24] swrast: Directly map the stencil buffer in read_stencil_pixels.

Eric Anholt eric at anholt.net
Fri Oct 28 12:49:59 PDT 2011


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



More information about the mesa-dev mailing list