From 3f0fa3b32dec4aed3ee3fb95ac7b53cbf4af3091 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Thu, 23 Jun 2016 22:27:40 -0400 Subject: [PATCH] st/mesa: don't assume that the whole surface gets mapped MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Nicolai Hähnle --- src/mesa/state_tracker/st_cb_readpixels.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/mesa/state_tracker/st_cb_readpixels.c b/src/mesa/state_tracker/st_cb_readpixels.c index 99d9cd59b0f..8eb839d16a9 100644 --- a/src/mesa/state_tracker/st_cb_readpixels.c +++ b/src/mesa/state_tracker/st_cb_readpixels.c @@ -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); -- 2.30.2