summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2024-03-25 18:05:05 -0400
committerMarge Bot <emma+marge@anholt.net>2024-04-24 19:17:10 +0000
commitc3fc214a980b6c0ba0d4aa4d7278f6a434c553ef (patch)
tree18aca18f7808b15dac9e9f11e655137d4e0c52c5
parent882ee264a6c89831863e99aa144315b5bb6dc0ee (diff)
radeonsi: implement user_data_amd for 5, 6, and 7 components correctly24.1-branchpoint
NIR can't handle those component counts, so we have to split it into 2 SGPR vectors where each has max 4 components. Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28725>
-rw-r--r--src/gallium/drivers/radeonsi/si_nir_lower_abi.c13
-rw-r--r--src/gallium/drivers/radeonsi/si_shader.c7
-rw-r--r--src/gallium/drivers/radeonsi/si_shader_internal.h2
3 files changed, 17 insertions, 5 deletions
diff --git a/src/gallium/drivers/radeonsi/si_nir_lower_abi.c b/src/gallium/drivers/radeonsi/si_nir_lower_abi.c
index c6f6e3f4699..01238a1ca25 100644
--- a/src/gallium/drivers/radeonsi/si_nir_lower_abi.c
+++ b/src/gallium/drivers/radeonsi/si_nir_lower_abi.c
@@ -744,10 +744,17 @@ static bool lower_intrinsic(nir_builder *b, nir_instr *instr, struct lower_abi_s
s->gsvs_ring[stream_id] : nir_undef(b, 4, 32);
break;
}
- case nir_intrinsic_load_user_data_amd:
- replacement = ac_nir_load_arg(b, &args->ac, args->cs_user_data);
- replacement = nir_pad_vector(b, replacement, 8);
+ case nir_intrinsic_load_user_data_amd: {
+ nir_def *low_vec4 = ac_nir_load_arg(b, &args->ac, args->cs_user_data[0]);
+ replacement = nir_pad_vector(b, low_vec4, 8);
+
+ if (args->cs_user_data[1].used && intrin->def.num_components > 4) {
+ nir_def *high_vec4 = ac_nir_load_arg(b, &args->ac, args->cs_user_data[1]);
+ for (unsigned i = 0; i < high_vec4->num_components; i++)
+ replacement = nir_vector_insert_imm(b, replacement, nir_channel(b, high_vec4, i), 4 + i);
+ }
break;
+ }
default:
return false;
}
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index b4d8acef8b0..4c96a07c66a 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -677,7 +677,12 @@ void si_init_shader_args(struct si_shader *shader, struct si_shader_args *args)
unsigned cs_user_data_dwords =
shader->selector->info.base.cs.user_data_components_amd;
if (cs_user_data_dwords) {
- ac_add_arg(&args->ac, AC_ARG_SGPR, cs_user_data_dwords, AC_ARG_INT, &args->cs_user_data);
+ ac_add_arg(&args->ac, AC_ARG_SGPR, MIN2(cs_user_data_dwords, 4), AC_ARG_INT,
+ &args->cs_user_data[0]);
+ if (cs_user_data_dwords > 4) {
+ ac_add_arg(&args->ac, AC_ARG_SGPR, cs_user_data_dwords - 4, AC_ARG_INT,
+ &args->cs_user_data[1]);
+ }
}
/* Some descriptors can be in user SGPRs. */
diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h
index 8e989fe862b..30df2885cba 100644
--- a/src/gallium/drivers/radeonsi/si_shader_internal.h
+++ b/src/gallium/drivers/radeonsi/si_shader_internal.h
@@ -75,7 +75,7 @@ struct si_shader_args {
struct ac_arg color_start;
/* CS */
struct ac_arg block_size;
- struct ac_arg cs_user_data;
+ struct ac_arg cs_user_data[2];
struct ac_arg cs_shaderbuf[3];
struct ac_arg cs_image[3];
};