mirror of https://gitlab.freedesktop.org/mesa/mesa
radeonsi: implement user_data_amd for 5, 6, and 7 components correctly
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>
This commit is contained in:
parent
882ee264a6
commit
c3fc214a98
|
@ -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);
|
s->gsvs_ring[stream_id] : nir_undef(b, 4, 32);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case nir_intrinsic_load_user_data_amd:
|
case nir_intrinsic_load_user_data_amd: {
|
||||||
replacement = ac_nir_load_arg(b, &args->ac, args->cs_user_data);
|
nir_def *low_vec4 = ac_nir_load_arg(b, &args->ac, args->cs_user_data[0]);
|
||||||
replacement = nir_pad_vector(b, replacement, 8);
|
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;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -677,7 +677,12 @@ void si_init_shader_args(struct si_shader *shader, struct si_shader_args *args)
|
||||||
unsigned cs_user_data_dwords =
|
unsigned cs_user_data_dwords =
|
||||||
shader->selector->info.base.cs.user_data_components_amd;
|
shader->selector->info.base.cs.user_data_components_amd;
|
||||||
if (cs_user_data_dwords) {
|
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. */
|
/* Some descriptors can be in user SGPRs. */
|
||||||
|
|
|
@ -75,7 +75,7 @@ struct si_shader_args {
|
||||||
struct ac_arg color_start;
|
struct ac_arg color_start;
|
||||||
/* CS */
|
/* CS */
|
||||||
struct ac_arg block_size;
|
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_shaderbuf[3];
|
||||||
struct ac_arg cs_image[3];
|
struct ac_arg cs_image[3];
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue