diff --git a/src/amd/common/ac_nir.c b/src/amd/common/ac_nir.c index a28193e02d9..b4afb897ae9 100644 --- a/src/amd/common/ac_nir.c +++ b/src/amd/common/ac_nir.c @@ -26,15 +26,18 @@ #include "nir_builder.h" #include "nir_xfb_info.h" +/* Load argument with index start from arg plus relative_index. */ nir_ssa_def * -ac_nir_load_arg(nir_builder *b, const struct ac_shader_args *ac_args, struct ac_arg arg) +ac_nir_load_arg_at_offset(nir_builder *b, const struct ac_shader_args *ac_args, + struct ac_arg arg, unsigned relative_index) { - unsigned num_components = ac_args->args[arg.arg_index].size; + unsigned arg_index = arg.arg_index + relative_index; + unsigned num_components = ac_args->args[arg_index].size; - if (ac_args->args[arg.arg_index].file == AC_ARG_SGPR) - return nir_load_scalar_arg_amd(b, num_components, .base = arg.arg_index); + if (ac_args->args[arg_index].file == AC_ARG_SGPR) + return nir_load_scalar_arg_amd(b, num_components, .base = arg_index); else - return nir_load_vector_arg_amd(b, num_components, .base = arg.arg_index); + return nir_load_vector_arg_amd(b, num_components, .base = arg_index); } nir_ssa_def * diff --git a/src/amd/common/ac_nir.h b/src/amd/common/ac_nir.h index 7b1c75bb262..b6c9d09d5df 100644 --- a/src/amd/common/ac_nir.h +++ b/src/amd/common/ac_nir.h @@ -67,7 +67,14 @@ typedef struct nir_builder nir_builder; typedef void (*ac_nir_cull_accepted)(nir_builder *b, void *state); nir_ssa_def * -ac_nir_load_arg(nir_builder *b, const struct ac_shader_args *ac_args, struct ac_arg arg); +ac_nir_load_arg_at_offset(nir_builder *b, const struct ac_shader_args *ac_args, + struct ac_arg arg, unsigned relative_index); + +static inline nir_ssa_def * +ac_nir_load_arg(nir_builder *b, const struct ac_shader_args *ac_args, struct ac_arg arg) +{ + return ac_nir_load_arg_at_offset(b, ac_args, arg, 0); +} nir_ssa_def * ac_nir_unpack_arg(nir_builder *b, const struct ac_shader_args *ac_args, struct ac_arg arg,