From 932e8c77683ca7b9516c4c4e1de1ae5b058fa3fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sat, 22 Jun 2024 04:40:20 -0400 Subject: [PATCH] ac/nir/cdna: don't use image_descriptor intrinsics if the src is a descriptor Fixes: 30af861bff71c7ec - radeonsi: restructure (rewrite) the compute blit shader Acked-by: Pierre-Eric Pelloux-Prayer Part-of: --- .../common/ac_nir_lower_image_opcodes_cdna.c | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/amd/common/ac_nir_lower_image_opcodes_cdna.c b/src/amd/common/ac_nir_lower_image_opcodes_cdna.c index 2f046d0f927..c770cb713bd 100644 --- a/src/amd/common/ac_nir_lower_image_opcodes_cdna.c +++ b/src/amd/common/ac_nir_lower_image_opcodes_cdna.c @@ -302,6 +302,7 @@ static bool lower_image_opcodes(nir_builder *b, nir_instr *instr, void *data) enum gl_access_qualifier access; enum glsl_sampler_dim dim; bool is_array; + unsigned num_desc_components; nir_def *desc = NULL, *result = NULL; ASSERTED const char *intr_name; @@ -316,8 +317,14 @@ static bool lower_image_opcodes(nir_builder *b, nir_instr *instr, void *data) if (dim == GLSL_SAMPLER_DIM_BUF) return false; is_array = nir_intrinsic_image_array(intr); - desc = nir_image_descriptor_amd(b, dim == GLSL_SAMPLER_DIM_BUF ? 4 : 8, - 32, intr->src[0].ssa); + num_desc_components = dim == GLSL_SAMPLER_DIM_BUF ? 4 : 8; + + if (intr->src[0].ssa->bit_size == 32 && + intr->src[0].ssa->num_components == num_desc_components) + desc = intr->src[0].ssa; + else + desc = nir_image_descriptor_amd(b, num_desc_components, + 32, intr->src[0].ssa); break; case nir_intrinsic_image_deref_load: @@ -328,8 +335,14 @@ static bool lower_image_opcodes(nir_builder *b, nir_instr *instr, void *data) if (dim == GLSL_SAMPLER_DIM_BUF) return false; is_array = glsl_sampler_type_is_array(deref->type); - desc = nir_image_deref_descriptor_amd(b, dim == GLSL_SAMPLER_DIM_BUF ? 4 : 8, - 32, intr->src[0].ssa); + num_desc_components = dim == GLSL_SAMPLER_DIM_BUF ? 4 : 8; + + if (intr->src[0].ssa->bit_size == 32 && + intr->src[0].ssa->num_components == num_desc_components) + desc = intr->src[0].ssa; + else + desc = nir_image_deref_descriptor_amd(b, num_desc_components, + 32, intr->src[0].ssa); break; case nir_intrinsic_bindless_image_load: @@ -339,8 +352,14 @@ static bool lower_image_opcodes(nir_builder *b, nir_instr *instr, void *data) if (dim == GLSL_SAMPLER_DIM_BUF) return false; is_array = nir_intrinsic_image_array(intr); - desc = nir_bindless_image_descriptor_amd(b, dim == GLSL_SAMPLER_DIM_BUF ? 4 : 8, - 32, intr->src[0].ssa); + num_desc_components = dim == GLSL_SAMPLER_DIM_BUF ? 4 : 8; + + if (intr->src[0].ssa->bit_size == 32 && + intr->src[0].ssa->num_components == num_desc_components) + desc = intr->src[0].ssa; + else + desc = nir_bindless_image_descriptor_amd(b, num_desc_components, + 32, intr->src[0].ssa); break; /* These don't need any lowering. */