From e4f7754977f4c2380a66223818391cc1e128227f Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Mon, 22 Jan 2024 15:19:20 +0100 Subject: [PATCH] radeonsi: try to disable dcc if compute_blit is the only option MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit COMPUTE contexts have no blitter so there are no fallback to si_can_use_compute_blit failing. One solution would be to disable DCC globally when a COMPUTE context is created but I'm not 100% sure it's a good idea. Until then this commit can fix a number of cases and will also prevent crashing if si_compute_blit fails. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/10296 Reviewed-by: Marek Olšák Part-of: --- src/gallium/drivers/radeonsi/si_blit.c | 7 +++++ .../drivers/radeonsi/si_compute_blit.c | 30 +++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 81142d75560..6bc6511adea 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -962,6 +962,13 @@ void si_resource_copy_region(struct pipe_context *ctx, struct pipe_resource *dst src_box, SI_OP_SYNC_BEFORE_AFTER)) return; + /* If the blitter isn't available fail here instead of crashing. */ + if (!sctx->blitter) { + fprintf(stderr, "si_resource_copy_region failed src_format: %s dst_format: %s\n", + util_format_name(src->format), util_format_name(dst->format)); + return; + } + assert(u_max_sample(dst) == u_max_sample(src)); /* The driver doesn't decompress resources automatically while diff --git a/src/gallium/drivers/radeonsi/si_compute_blit.c b/src/gallium/drivers/radeonsi/si_compute_blit.c index cdcf255b187..66dee97c643 100644 --- a/src/gallium/drivers/radeonsi/si_compute_blit.c +++ b/src/gallium/drivers/radeonsi/si_compute_blit.c @@ -659,12 +659,30 @@ bool si_compute_copy_image(struct si_context *sctx, struct pipe_resource *dst, u */ if (!util_format_is_compressed(src->format) && !util_format_is_compressed(dst->format) && - !util_format_is_subsampled_422(src->format) && - (!si_can_use_compute_blit(sctx, dst->format, dst->nr_samples, true, - vi_dcc_enabled(sdst, dst_level)) || - !si_can_use_compute_blit(sctx, src->format, src->nr_samples, false, - vi_dcc_enabled(ssrc, src_level)))) - return false; + !util_format_is_subsampled_422(src->format)) { + bool src_can_use_compute_blit = + si_can_use_compute_blit(sctx, src->format, src->nr_samples, false, + vi_dcc_enabled(ssrc, src_level)); + + if (!src_can_use_compute_blit) + return false; + + bool dst_can_use_compute_blit = + si_can_use_compute_blit(sctx, dst->format, dst->nr_samples, true, + vi_dcc_enabled(sdst, dst_level)); + + if (!dst_can_use_compute_blit && !sctx->has_graphics && + si_can_use_compute_blit(sctx, dst->format, dst->nr_samples, false, + vi_dcc_enabled(sdst, dst_level))) { + /* Non-graphics context don't have a blitter, so try harder to do + * a compute blit by disabling dcc on the destination texture. + */ + dst_can_use_compute_blit = si_texture_disable_dcc(sctx, sdst); + } + + if (!dst_can_use_compute_blit) + return false; + } enum pipe_format src_format = util_format_linear(src->format); enum pipe_format dst_format = util_format_linear(dst->format);