Mesa (main): tgsi/exec: Simplify indirects now that they always use the ADDR file.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jan 4 23:34:54 UTC 2022


Module: Mesa
Branch: main
Commit: 4dc6cd5933c191ce50b9acdffaec202faedf7a4c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4dc6cd5933c191ce50b9acdffaec202faedf7a4c

Author: Emma Anholt <emma at anholt.net>
Date:   Thu Dec 30 16:09:50 2021 -0800

tgsi/exec: Simplify indirects now that they always use the ADDR file.

This was a lot of extra code in the hot path of getting though
fetch_src_file_channel().  No significant perf difference in softpipe,
though.

Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14360>

---

 src/gallium/auxiliary/tgsi/tgsi_exec.c | 56 ++++++----------------------------
 1 file changed, 10 insertions(+), 46 deletions(-)

diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index b9262d25bab..f50b2c3f2f6 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -1501,8 +1501,6 @@ get_index_registers(const struct tgsi_exec_machine *mach,
                     union tgsi_exec_channel *index,
                     union tgsi_exec_channel *index2D)
 {
-   uint swizzle;
-
    /* We start with a direct index into a register file.
     *
     *    file[1],
@@ -1526,35 +1524,17 @@ get_index_registers(const struct tgsi_exec_machine *mach,
     *       .x = Indirect.SwizzleX
     */
    if (reg->Register.Indirect) {
-      union tgsi_exec_channel index2;
-      union tgsi_exec_channel indir_index;
       const uint execmask = mach->ExecMask;
-      uint i;
-
-      /* which address register (always zero now) */
-      index2.i[0] =
-      index2.i[1] =
-      index2.i[2] =
-      index2.i[3] = reg->Indirect.Index;
-      /* get current value of address register[swizzle] */
-      swizzle = reg->Indirect.Swizzle;
-      fetch_src_file_channel(mach,
-                             reg->Indirect.File,
-                             swizzle,
-                             &index2,
-                             &ZeroVec,
-                             &indir_index);
 
-      /* add value of address register to the offset */
-      index->i[0] += indir_index.i[0];
-      index->i[1] += indir_index.i[1];
-      index->i[2] += indir_index.i[2];
-      index->i[3] += indir_index.i[3];
+      assert(reg->Indirect.File == TGSI_FILE_ADDRESS);
+      const union tgsi_exec_channel *addr = &mach->Addrs[reg->Indirect.Index].xyzw[reg->Indirect.Swizzle];
+      for (int i = 0; i < TGSI_QUAD_SIZE; i++)
+         index->i[i] += addr->u[i];
 
       /* for disabled execution channels, zero-out the index to
        * avoid using a potential garbage value.
        */
-      for (i = 0; i < TGSI_QUAD_SIZE; i++) {
+      for (int i = 0; i < TGSI_QUAD_SIZE; i++) {
          if ((execmask & (1 << i)) == 0)
             index->i[i] = 0;
       }
@@ -1586,33 +1566,17 @@ get_index_registers(const struct tgsi_exec_machine *mach,
        *       .y = DimIndirect.SwizzleX
        */
       if (reg->Dimension.Indirect) {
-         union tgsi_exec_channel index2;
-         union tgsi_exec_channel indir_index;
          const uint execmask = mach->ExecMask;
-         uint i;
-
-         index2.i[0] =
-         index2.i[1] =
-         index2.i[2] =
-         index2.i[3] = reg->DimIndirect.Index;
-
-         swizzle = reg->DimIndirect.Swizzle;
-         fetch_src_file_channel(mach,
-                                reg->DimIndirect.File,
-                                swizzle,
-                                &index2,
-                                &ZeroVec,
-                                &indir_index);
 
-         index2D->i[0] += indir_index.i[0];
-         index2D->i[1] += indir_index.i[1];
-         index2D->i[2] += indir_index.i[2];
-         index2D->i[3] += indir_index.i[3];
+         assert(reg->DimIndirect.File == TGSI_FILE_ADDRESS);
+         const union tgsi_exec_channel *addr = &mach->Addrs[reg->DimIndirect.Index].xyzw[reg->DimIndirect.Swizzle];
+         for (int i = 0; i < TGSI_QUAD_SIZE; i++)
+            index2D->i[i] += addr->u[i];
 
          /* for disabled execution channels, zero-out the index to
           * avoid using a potential garbage value.
           */
-         for (i = 0; i < TGSI_QUAD_SIZE; i++) {
+         for (int i = 0; i < TGSI_QUAD_SIZE; i++) {
             if ((execmask & (1 << i)) == 0) {
                index2D->i[i] = 0;
             }



More information about the mesa-commit mailing list