From b73ba7b710681f10b70a23f3bd1bd3d9327c6974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 21 Aug 2024 14:38:22 -0400 Subject: [PATCH] radeonsi: do init/deinit for multi-dispatch compute blits only once Do it outside the loop, which is more optimal. Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- .../drivers/radeonsi/si_compute_blit.c | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_compute_blit.c b/src/gallium/drivers/radeonsi/si_compute_blit.c index 8804f50a790..87179f1583f 100644 --- a/src/gallium/drivers/radeonsi/si_compute_blit.c +++ b/src/gallium/drivers/radeonsi/si_compute_blit.c @@ -996,6 +996,19 @@ bool si_compute_blit(struct si_context *sctx, const struct pipe_blit_info *info, if (info->render_condition_enable) flags |= SI_OP_CS_RENDER_COND_ENABLE; + /* Bind images and execute the barrier. */ + unsigned num_images = is_clear ? 1 : 2; + struct pipe_image_view saved_images[2] = {}; + assert(num_images <= ARRAY_SIZE(saved_images)); + + /* This must be before the barrier and si_compute_begin_internal because it might invoke DCC + * decompression. + */ + flags |= SI_OP_CS_IMAGE; + si_compute_save_and_bind_images(sctx, num_images, image, saved_images); + si_barrier_before_internal_op(sctx, flags, 0, NULL, 0, num_images, image); + si_compute_begin_internal(sctx, flags); + /* Execute compute blits. */ for (unsigned i = 0; i < out.num_dispatches; i++) { struct ac_cs_blit_dispatch *dispatch = &out.dispatches[i]; @@ -1026,11 +1039,11 @@ bool si_compute_blit(struct si_context *sctx, const struct pipe_blit_info *info, }, }; - si_launch_grid_internal_images(sctx, image, is_clear ? 1 : 2, &grid, shader, - (flags & ~SI_OP_SYNC_BEFORE_AFTER) | - (i == 0 ? flags & SI_OP_SYNC_BEFORE : 0) | - (i == out.num_dispatches - 1 ? flags & SI_OP_SYNC_AFTER : 0)); + si_launch_grid_internal(sctx, &grid, shader); } + si_compute_end_internal(sctx); + si_barrier_after_internal_op(sctx, flags, 0, NULL, 0, num_images, image); + si_compute_restore_images(sctx, num_images, saved_images); return true; }