From 80ccc3f822d32f014ccb7ab7283a1a80e6f7d9ca Mon Sep 17 00:00:00 2001 From: Patrick Lerda Date: Thu, 22 Jun 2023 13:11:07 +0200 Subject: [PATCH] radeonsi: fix refcnt imbalance related to util_blitter_save_fragment_constant_buffer_slot() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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: --- src/gallium/drivers/radeonsi/si_blit.c | 5 ++++- src/gallium/drivers/radeonsi/si_clear.c | 5 ++--- src/gallium/drivers/radeonsi/si_pipe.h | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) 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); -- 2.7.4