From c99b55092ff70f283e1cb8d112bf7bdb587236a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 15 Sep 2024 10:22:29 -0400 Subject: [PATCH] radeonsi: move barriers out of si_execute_clears Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/si_blit.c | 4 +++- src/gallium/drivers/radeonsi/si_clear.c | 19 ++++++++++--------- src/gallium/drivers/radeonsi/si_pipe.h | 2 +- src/gallium/drivers/radeonsi/si_texture.c | 7 +++++-- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index bb1a2451d93..ac91d873ad9 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -1202,7 +1202,9 @@ bool si_msaa_resolve_blit_via_CB(struct pipe_context *ctx, const struct pipe_bli if (!vi_dcc_get_clear_info(sctx, dst, info->dst.level, DCC_UNCOMPRESSED, &clear_info)) return false; - si_execute_clears(sctx, &clear_info, 1, SI_CLEAR_TYPE_DCC, info->render_condition_enable); + si_barrier_before_image_fast_clear(sctx, SI_CLEAR_TYPE_DCC); + si_execute_clears(sctx, &clear_info, 1, info->render_condition_enable); + si_barrier_after_image_fast_clear(sctx); dst->dirty_level_mask &= ~(1 << info->dst.level); } diff --git a/src/gallium/drivers/radeonsi/si_clear.c b/src/gallium/drivers/radeonsi/si_clear.c index cd9b88a838e..d4c8bf9f2d1 100644 --- a/src/gallium/drivers/radeonsi/si_clear.c +++ b/src/gallium/drivers/radeonsi/si_clear.c @@ -49,12 +49,9 @@ static void si_init_clear_image_dcc_single(struct si_clear_info *info, struct si } void si_execute_clears(struct si_context *sctx, struct si_clear_info *info, - unsigned num_clears, unsigned types, bool render_condition_enable) + unsigned num_clears, bool render_condition_enable) { - if (!num_clears) - return; - - si_barrier_before_image_fast_clear(sctx, types); + assert(num_clears); /* Execute clears. */ for (unsigned i = 0; i < num_clears; i++) { @@ -83,8 +80,6 @@ void si_execute_clears(struct si_context *sctx, struct si_clear_info *info, render_condition_enable); } } - - si_barrier_after_image_fast_clear(sctx); } static bool si_alloc_separate_cmask(struct si_screen *sscreen, struct si_texture *tex) @@ -1093,7 +1088,11 @@ static void si_fast_clear(struct si_context *sctx, unsigned *buffers, } } - si_execute_clears(sctx, info, num_clears, clear_types, sctx->render_cond_enabled); + if (num_clears) { + si_barrier_before_image_fast_clear(sctx, clear_types); + si_execute_clears(sctx, info, num_clears, sctx->render_cond_enabled); + si_barrier_after_image_fast_clear(sctx); + } } static void si_fb_clear_via_compute(struct si_context *sctx, unsigned *buffers, @@ -1397,7 +1396,9 @@ bool si_compute_fast_clear_image(struct si_context *sctx, struct pipe_resource * } assert(num_clears <= ARRAY_SIZE(info)); - si_execute_clears(sctx, info, num_clears, clear_types, render_condition_enable); + si_barrier_before_image_fast_clear(sctx, clear_types); + si_execute_clears(sctx, info, num_clears, render_condition_enable); + si_barrier_after_image_fast_clear(sctx); return true; } diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index 2a79bc9df37..0d79e3441c8 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -1469,7 +1469,7 @@ void si_init_buffer_clear(struct si_clear_info *info, struct pipe_resource *resource, uint64_t offset, uint32_t size, uint32_t clear_value); void si_execute_clears(struct si_context *sctx, struct si_clear_info *info, - unsigned num_clears, unsigned types, bool render_condition_enabled); + unsigned num_clears, bool render_condition_enabled); bool si_compute_fast_clear_image(struct si_context *sctx, struct pipe_resource *tex, enum pipe_format format, unsigned level, const struct pipe_box *box, const union pipe_color_union *color, bool render_condition_enable, diff --git a/src/gallium/drivers/radeonsi/si_texture.c b/src/gallium/drivers/radeonsi/si_texture.c index 0206c69fa35..7ee8f9061e6 100644 --- a/src/gallium/drivers/radeonsi/si_texture.c +++ b/src/gallium/drivers/radeonsi/si_texture.c @@ -1280,8 +1280,11 @@ static struct si_texture *si_texture_create_object(struct pipe_screen *screen, /* Execute the clears. */ if (num_clears) { - si_execute_clears(si_get_aux_context(&sscreen->aux_context.general), clears, num_clears, 0, - false); + struct si_context *sctx = si_get_aux_context(&sscreen->aux_context.general); + + si_barrier_before_image_fast_clear(sctx, 0); + si_execute_clears(sctx, clears, num_clears, false); + si_barrier_after_image_fast_clear(sctx); si_put_aux_context_flush(&sscreen->aux_context.general); }