From 4b0b826ec9301270c71b4a0bc7b31a923c22f023 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 2 Nov 2021 14:01:06 +0100 Subject: [PATCH] mesa: always call _mesa_update_pixel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 10c75ae4 moved handling of this state to the functions that depend on ctx->_ImageTransferState. So we can't depend on _NEW_PIXEL being set to call this function, since it'll be always clear earlier by _mesa_update_state_locked. Example sequence that would trigger the issue: glPixelTransferi(...) glClear(...) glTexSubImage2D(...) <-- won't use the new value set by glPixelTransferi because glClear caused _NEW_PIXEL to be cleared. _NEW_PIXEL itself is kept because st_update_pixel_transfer depends on it. Fixes: 10c75ae4 ("mesa: move _mesa_update_pixel out of _mesa_update_state") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5273 Reviewed-by: Marek Olšák Part-of: (cherry picked from commit 1ee3fbd703752460248958f9b7e42a855023b274) --- .pick_status.json | 2 +- src/mesa/main/drawpix.c | 9 +++------ src/mesa/main/readpix.c | 3 +-- src/mesa/main/teximage.c | 15 +++++---------- 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 0b76fcde4e2..2dbf4899d3d 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -94,7 +94,7 @@ "description": "mesa: always call _mesa_update_pixel", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "10c75ae41c4e914a0160f9d93bbe1e65b5e14517" }, diff --git a/src/mesa/main/drawpix.c b/src/mesa/main/drawpix.c index a6c48f2d2e4..9df1406e1e6 100644 --- a/src/mesa/main/drawpix.c +++ b/src/mesa/main/drawpix.c @@ -73,8 +73,7 @@ _mesa_DrawPixels( GLsizei width, GLsizei height, */ _mesa_set_vp_override(ctx, GL_TRUE); - if (ctx->NewState & _NEW_PIXEL) - _mesa_update_pixel(ctx); + _mesa_update_pixel(ctx); if (ctx->NewState) _mesa_update_state(ctx); @@ -245,8 +244,7 @@ _mesa_CopyPixels( GLint srcx, GLint srcy, GLsizei width, GLsizei height, */ _mesa_set_vp_override(ctx, GL_TRUE); - if (ctx->NewState & _NEW_PIXEL) - _mesa_update_pixel(ctx); + _mesa_update_pixel(ctx); if (ctx->NewState) _mesa_update_state(ctx); @@ -334,8 +332,7 @@ _mesa_Bitmap( GLsizei width, GLsizei height, return; /* do nothing */ } - if (ctx->NewState & _NEW_PIXEL) - _mesa_update_pixel(ctx); + _mesa_update_pixel(ctx); if (ctx->NewState) _mesa_update_state(ctx); diff --git a/src/mesa/main/readpix.c b/src/mesa/main/readpix.c index 6f4d49905a1..b46825e7ad3 100644 --- a/src/mesa/main/readpix.c +++ b/src/mesa/main/readpix.c @@ -1049,8 +1049,7 @@ read_pixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, return; } - if (ctx->NewState & _NEW_PIXEL) - _mesa_update_pixel(ctx); + _mesa_update_pixel(ctx); if (ctx->NewState) _mesa_update_state(ctx); diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index f6be38896d2..b9f1a952dad 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -3145,8 +3145,7 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims, unpack = &unpack_no_border; } - if (ctx->NewState & _NEW_PIXEL) - _mesa_update_pixel(ctx); + _mesa_update_pixel(ctx); _mesa_lock_texture(ctx, texObj); { @@ -3586,8 +3585,7 @@ texture_sub_image(struct gl_context *ctx, GLuint dims, { FLUSH_VERTICES(ctx, 0, 0); - if (ctx->NewState & _NEW_PIXEL) - _mesa_update_pixel(ctx); + _mesa_update_pixel(ctx); _mesa_lock_texture(ctx, texObj); { @@ -4270,8 +4268,7 @@ copy_texture_sub_image_err(struct gl_context *ctx, GLuint dims, _mesa_enum_to_string(target), level, xoffset, yoffset, zoffset, x, y, width, height); - if (ctx->NewState & _NEW_PIXEL) - _mesa_update_pixel(ctx); + _mesa_update_pixel(ctx); if (ctx->NewState & NEW_COPY_TEX_STATE) _mesa_update_state(ctx); @@ -4296,8 +4293,7 @@ copy_texture_sub_image_no_error(struct gl_context *ctx, GLuint dims, { FLUSH_VERTICES(ctx, 0, 0); - if (ctx->NewState & _NEW_PIXEL) - _mesa_update_pixel(ctx); + _mesa_update_pixel(ctx); if (ctx->NewState & NEW_COPY_TEX_STATE) _mesa_update_state(ctx); @@ -4328,8 +4324,7 @@ copyteximage(struct gl_context *ctx, GLuint dims, struct gl_texture_object *texO _mesa_enum_to_string(internalFormat), x, y, width, height, border); - if (ctx->NewState & _NEW_PIXEL) - _mesa_update_pixel(ctx); + _mesa_update_pixel(ctx); if (ctx->NewState & NEW_COPY_TEX_STATE) _mesa_update_state(ctx);