mesa: always call _mesa_update_pixel

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 <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13596>
This commit is contained in:
Pierre-Eric Pelloux-Prayer 2021-11-02 14:01:06 +01:00
parent 6b002d2549
commit 1ee3fbd703
3 changed files with 9 additions and 18 deletions

View File

@ -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);

View File

@ -1056,8 +1056,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);

View File

@ -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);
{
@ -3587,8 +3586,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);
{
@ -4271,8 +4269,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);
@ -4297,8 +4294,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);
@ -4329,8 +4325,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);