From: Patrick Lerda Date: Thu, 22 Jun 2023 11:11:07 +0000 (+0200) Subject: radeonsi: fix refcnt imbalance related to util_blitter_save_fragment_constant_buffer_... X-Git-Tag: upstream/23.3.3~6016 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=80ccc3f822d32f014ccb7ab7283a1a80e6f7d9ca;p=platform%2Fupstream%2Fmesa.git radeonsi: fix refcnt imbalance related to util_blitter_save_fragment_constant_buffer_slot() Indeed, util_blitter_clear() requires a call to util_blitter_save_fragment_constant_buffer_slot(), but most other blitter functions do not. For instance, this issue is triggered with: "piglit/bin/object-namespace-pollution glDrawPixels buffer -auto -fbo" while setting GALLIUM_REFCNT_LOG=refcnt.log. Fixes: 03bc7503d471 ("radeonsi: save the fs constant buffer to the util blitter context") Signed-off-by: Patrick Lerda Reviewed-by: Marek Olšák Part-of: --- diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 11de9a8..8582444 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -37,7 +37,10 @@ void si_blitter_begin(struct si_context *sctx, enum si_blitter_op op) if (op & SI_SAVE_FRAGMENT_STATE) { struct pipe_constant_buffer fs_cb = {}; si_get_pipe_constant_buffer(sctx, PIPE_SHADER_FRAGMENT, 0, &fs_cb); - util_blitter_save_fragment_constant_buffer_slot(sctx->blitter, &fs_cb); + + if (op & SI_SAVE_FRAGMENT_CONSTANT) + util_blitter_save_fragment_constant_buffer_slot(sctx->blitter, &fs_cb); + pipe_resource_reference(&fs_cb.buffer, NULL); util_blitter_save_blend(sctx->blitter, sctx->queued.named.blend); util_blitter_save_depth_stencil_alpha(sctx->blitter, sctx->queued.named.dsa); diff --git a/src/gallium/drivers/radeonsi/si_clear.c b/src/gallium/drivers/radeonsi/si_clear.c index a210192..cd0dd49 100644 --- a/src/gallium/drivers/radeonsi/si_clear.c +++ b/src/gallium/drivers/radeonsi/si_clear.c @@ -10,9 +10,8 @@ #include "util/u_pack_color.h" #include "util/u_surface.h" -enum -{ - SI_CLEAR = SI_SAVE_FRAGMENT_STATE, +enum { + SI_CLEAR = SI_SAVE_FRAGMENT_STATE | SI_SAVE_FRAGMENT_CONSTANT, SI_CLEAR_SURFACE = SI_SAVE_FRAMEBUFFER | SI_SAVE_FRAGMENT_STATE, }; diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 46b09fb..55f1d17 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -1342,7 +1342,8 @@ enum si_blitter_op /* bitmask */ SI_SAVE_TEXTURES = 1, SI_SAVE_FRAMEBUFFER = 2, SI_SAVE_FRAGMENT_STATE = 4, - SI_DISABLE_RENDER_COND = 8, + SI_SAVE_FRAGMENT_CONSTANT = 8, + SI_DISABLE_RENDER_COND = 16, }; void si_blitter_begin(struct si_context *sctx, enum si_blitter_op op);