Module: Mesa Branch: main Commit: 3ff9153a3b31c04f5238838442c67cf38a1fd364 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3ff9153a3b31c04f5238838442c67cf38a1fd364
Author: Qiang Yu <[email protected]> Date: Thu Apr 13 14:43:04 2023 +0800 ac,radv: move ps arg compation to common place To be shared with radeonsi when aco is used. Reviewed-by: Rhys Perry <[email protected]> Signed-off-by: Qiang Yu <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22525> --- src/amd/common/ac_shader_args.c | 25 +++++++++++++++++++++++++ src/amd/common/ac_shader_args.h | 1 + src/amd/vulkan/radv_shader_args.c | 23 ++--------------------- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/amd/common/ac_shader_args.c b/src/amd/common/ac_shader_args.c index 2025cc75f82..ac268aae82d 100644 --- a/src/amd/common/ac_shader_args.c +++ b/src/amd/common/ac_shader_args.c @@ -68,3 +68,28 @@ void ac_add_return(struct ac_shader_args *info, enum ac_arg_regfile regfile) info->return_count++; } + +void ac_compact_ps_vgpr_args(struct ac_shader_args *info, uint32_t spi_ps_input) +{ + /* LLVM optimizes away unused FS inputs and computes spi_ps_input_addr itself and then + * communicates the results back via the ELF binary. Mirror what LLVM does by re-mapping the + * VGPR arguments here. + */ + unsigned vgpr_arg = 0; + unsigned vgpr_reg = 0; + + for (unsigned i = 0; i < info->arg_count; i++) { + if (info->args[i].file != AC_ARG_VGPR) + continue; + + if (!(spi_ps_input & (1 << vgpr_arg))) { + info->args[i].skip = true; + } else { + info->args[i].offset = vgpr_reg; + vgpr_reg += info->args[i].size; + } + vgpr_arg++; + } + + info->num_vgprs_used = vgpr_reg; +} diff --git a/src/amd/common/ac_shader_args.h b/src/amd/common/ac_shader_args.h index 294f51b94ae..890f89ccfa4 100644 --- a/src/amd/common/ac_shader_args.h +++ b/src/amd/common/ac_shader_args.h @@ -171,5 +171,6 @@ struct ac_shader_args { void ac_add_arg(struct ac_shader_args *info, enum ac_arg_regfile regfile, unsigned registers, enum ac_arg_type type, struct ac_arg *arg); void ac_add_return(struct ac_shader_args *info, enum ac_arg_regfile regfile); +void ac_compact_ps_vgpr_args(struct ac_shader_args *info, uint32_t spi_ps_input); #endif diff --git a/src/amd/vulkan/radv_shader_args.c b/src/amd/vulkan/radv_shader_args.c index c51b9bbc8df..276527679cb 100644 --- a/src/amd/vulkan/radv_shader_args.c +++ b/src/amd/vulkan/radv_shader_args.c @@ -272,8 +272,6 @@ declare_ms_input_vgprs(struct radv_shader_args *args) static void declare_ps_input_vgprs(const struct radv_shader_info *info, struct radv_shader_args *args) { - unsigned spi_ps_input = info->ps.spi_ps_input; - ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_INT, &args->ac.persp_sample); ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_INT, &args->ac.persp_center); ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_INT, &args->ac.persp_centroid); @@ -291,25 +289,8 @@ declare_ps_input_vgprs(const struct radv_shader_info *info, struct radv_shader_a ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.sample_coverage); ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, NULL); /* fixed pt */ - if (args->remap_spi_ps_input) { - /* LLVM optimizes away unused FS inputs and computes spi_ps_input_addr itself and then - * communicates the results back via the ELF binary. Mirror what LLVM does by re-mapping the - * VGPR arguments here. - */ - for (unsigned i = 0, vgpr_arg = 0, vgpr_reg = 0; i < args->ac.arg_count; i++) { - if (args->ac.args[i].file != AC_ARG_VGPR) { - continue; - } - - if (!(spi_ps_input & (1 << vgpr_arg))) { - args->ac.args[i].skip = true; - } else { - args->ac.args[i].offset = vgpr_reg; - vgpr_reg += args->ac.args[i].size; - } - vgpr_arg++; - } - } + if (args->remap_spi_ps_input) + ac_compact_ps_vgpr_args(&args->ac, info->ps.spi_ps_input); } static void
