From 62cce3abcdbaea2e3672875985d51832fec3e08a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 11 Feb 2026 22:46:02 -0500 Subject: [PATCH] ac/nir/meta: use the clear/copy compute shader if CP DMA doesn't support sparse MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ac_prepare_cs_clear_copy_buffer determines whether to use CP DMA, and the driver obeys that. Reviewed-by: Timur Kristóf Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/amd/common/nir/ac_nir_meta.h | 1 + src/amd/common/nir/ac_nir_meta_cs_clear_copy_buffer.c | 3 +++ src/gallium/drivers/radeonsi/si_compute_blit.c | 1 + 3 files changed, 5 insertions(+) diff --git a/src/amd/common/nir/ac_nir_meta.h b/src/amd/common/nir/ac_nir_meta.h index bddb8b4e96c..eb75212ec35 100644 --- a/src/amd/common/nir/ac_nir_meta.h +++ b/src/amd/common/nir/ac_nir_meta.h @@ -173,6 +173,7 @@ struct ac_cs_clear_copy_buffer_info { bool render_condition_enabled; bool dst_is_vram; bool src_is_vram; + bool dst_is_sparse; bool src_is_sparse; }; diff --git a/src/amd/common/nir/ac_nir_meta_cs_clear_copy_buffer.c b/src/amd/common/nir/ac_nir_meta_cs_clear_copy_buffer.c index ce33ba95dc3..a9ea141e807 100644 --- a/src/amd/common/nir/ac_nir_meta_cs_clear_copy_buffer.c +++ b/src/amd/common/nir/ac_nir_meta_cs_clear_copy_buffer.c @@ -351,8 +351,11 @@ ac_prepare_cs_clear_copy_buffer(const struct ac_cs_clear_copy_buffer_options *op /* This doesn't fail very often because the only possible fallback is CP DMA, which doesn't * support the render condition. + * + * CP DMA doesn't support sparse on GFX6-9, so we must use compute for that. */ if (options->fail_if_slow && !info->render_condition_enabled && options->info->has_cp_dma && + ((!info->src_is_sparse && !info->dst_is_sparse) || options->info->cp_dma_supports_sparse) && !options->info->cp_sdma_ge_use_system_memory_scope) { switch (options->info->gfx_level) { /* GFX6-8: CP DMA clears are so slow that we risk getting a GPU timeout. CP DMA copies diff --git a/src/gallium/drivers/radeonsi/si_compute_blit.c b/src/gallium/drivers/radeonsi/si_compute_blit.c index b4299c44140..46338ba2d36 100644 --- a/src/gallium/drivers/radeonsi/si_compute_blit.c +++ b/src/gallium/drivers/radeonsi/si_compute_blit.c @@ -174,6 +174,7 @@ bool si_compute_clear_copy_buffer(struct si_context *sctx, struct pipe_resource .render_condition_enabled = render_condition_enable, .dst_is_vram = si_resource(dst)->domains & RADEON_DOMAIN_VRAM, .src_is_vram = src && si_resource(src)->domains & RADEON_DOMAIN_VRAM, + .dst_is_sparse = dst->flags & PIPE_RESOURCE_FLAG_SPARSE, .src_is_sparse = src && src->flags & PIPE_RESOURCE_FLAG_SPARSE, }; memcpy(info.clear_value, clear_value, clear_value_size);