radeonsi: fix refcnt imbalance related to util_blitter_save_fragment_constant_buffer_...
authorPatrick Lerda <patrick9876@free.fr>
Thu, 22 Jun 2023 11:11:07 +0000 (13:11 +0200)
committerMarge Bot <emma+marge@anholt.net>
Wed, 5 Jul 2023 20:01:09 +0000 (20:01 +0000)
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 <patrick9876@free.fr>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23856>

src/gallium/drivers/radeonsi/si_blit.c
src/gallium/drivers/radeonsi/si_clear.c
src/gallium/drivers/radeonsi/si_pipe.h

index 11de9a8..8582444 100644 (file)
@@ -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);
index a210192..cd0dd49 100644 (file)
@@ -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,
 };
 
index 46b09fb..55f1d17 100644 (file)
@@ -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);