mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 07:10:15 +01:00
st/mesa: don't assume that the whole surface gets mapped
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>
This commit is contained in:
parent
0da890e62c
commit
3f0fa3b32d
1 changed files with 6 additions and 7 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue