st/mesa: don't assume that the whole surface gets mapped
authorIlia Mirkin <imirkin@alum.mit.edu>
Fri, 24 Jun 2016 02:27:40 +0000 (22:27 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Fri, 24 Jun 2016 13:53:13 +0000 (09:53 -0400)
Under some circumstances, the driver may choose to return a temporary
surface instead of a pointer to the original. Make sure to pass the
actual view volume to be mapped to the transfer function rather than
adjusting the map pointer after-the-fact.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/mesa/state_tracker/st_cb_readpixels.c

index 99d9cd59b0fd01fde575692a4aa3f4ec7f5476d7..8eb839d16a90639c07bf7e3fc63b5b79eb19c16c 100644 (file)
@@ -406,7 +406,7 @@ st_ReadPixels(struct gl_context *ctx, GLint x, GLint y,
    unsigned bind = PIPE_BIND_TRANSFER_READ;
    struct pipe_transfer *tex_xfer;
    ubyte *map = NULL;
-   bool window;
+   int dst_x, dst_y;
 
    /* Validate state (to be sure we have up-to-date framebuffer surfaces)
     * and flush the bitmap cache prior to reading. */
@@ -483,7 +483,8 @@ st_ReadPixels(struct gl_context *ctx, GLint x, GLint y,
                                st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP,
                                width, height, format, src_format, dst_format);
    if (dst) {
-      window = false;
+      dst_x = x;
+      dst_y = y;
    } else {
       /* See if the texture format already matches the format and type,
        * in which case the memcpy-based fast path will likely be used and
@@ -500,23 +501,21 @@ st_ReadPixels(struct gl_context *ctx, GLint x, GLint y,
       if (!dst)
          goto fallback;
 
-      window = true;
+      dst_x = 0;
+      dst_y = 0;
    }
 
    /* map resources */
    pixels = _mesa_map_pbo_dest(ctx, pack, pixels);
 
    map = pipe_transfer_map_3d(pipe, dst, 0, PIPE_TRANSFER_READ,
-                              0, 0, 0, width, height, 1, &tex_xfer);
+                              dst_x, dst_y, 0, width, height, 1, &tex_xfer);
    if (!map) {
       _mesa_unmap_pbo_dest(ctx, pack);
       pipe_resource_reference(&dst, NULL);
       goto fallback;
    }
 
-   if (!window)
-      map += y * tex_xfer->stride + x * util_format_get_blocksize(dst_format);
-
    /* memcpy data into a user buffer */
    {
       const uint bytesPerRow = width * util_format_get_blocksize(dst_format);