swrast: Switch the remaining depth readpixels to MapRenderbuffer.
authorEric Anholt <eric@anholt.net>
Wed, 12 Oct 2011 20:39:14 +0000 (13:39 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 4 Nov 2011 06:29:52 +0000 (23:29 -0700)
This avoids the wrapper, which should improve performance on packed
depth/stencil drivers.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/mesa/swrast/s_readpix.c

index 4637bfb829ff4d4f6386e87b06ed485c2b780e5d..5d79a20644d7485979bea069b3c5c91e0c38a05e 100644 (file)
@@ -103,8 +103,10 @@ read_depth_pixels( struct gl_context *ctx,
                    const struct gl_pixelstore_attrib *packing )
 {
    struct gl_framebuffer *fb = ctx->ReadBuffer;
-   struct gl_renderbuffer *rb = fb->_DepthBuffer;
+   struct gl_renderbuffer *rb = fb->Attachment[BUFFER_DEPTH].Renderbuffer;
    GLint j;
+   GLubyte *dst, *map;
+   int dstStride, stride;
 
    if (!rb)
       return;
@@ -120,14 +122,24 @@ read_depth_pixels( struct gl_context *ctx,
    if (fast_read_depth_pixels(ctx, x, y, width, height, type, pixels, packing))
       return;
 
+   dstStride = _mesa_image_row_stride(packing, width, GL_DEPTH_COMPONENT, type);
+   dst = (GLubyte *) _mesa_image_address2d(packing, pixels, width, height,
+                                          GL_DEPTH_COMPONENT, type, 0, 0);
+
+   ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height, GL_MAP_READ_BIT,
+                              &map, &stride);
+
    /* General case (slower) */
    for (j = 0; j < height; j++, y++) {
       GLfloat depthValues[MAX_WIDTH];
-      GLvoid *dest = _mesa_image_address2d(packing, pixels, width, height,
-                                          GL_DEPTH_COMPONENT, type, j, 0);
-      _swrast_read_depth_span_float(ctx, rb, width, x, y, depthValues);
-      _mesa_pack_depth_span(ctx, width, dest, type, depthValues, packing);
+      _mesa_unpack_float_z_row(rb->Format, width, map, depthValues);
+      _mesa_pack_depth_span(ctx, width, dst, type, depthValues, packing);
+
+      dst += dstStride;
+      map += stride;
    }
+
+   ctx->Driver.UnmapRenderbuffer(ctx, rb);
 }