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

Reply via email to