Mesa (main): freedreno/ir3: Use flat.b to load flat varyings on a6xx

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Nov 4 03:20:38 UTC 2021


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

Author: Matt Turner <mattst88 at gmail.com>
Date:   Tue Oct 12 08:50:55 2021 -0700

freedreno/ir3: Use flat.b to load flat varyings on a6xx

The flat.b/bary.f cat2 instruction should be faster than an ldlv cat6
instruction, even with a couple of additional moves (which will be
removed in the next patch).

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13558>

---

 src/freedreno/ir3/ir3.h              |  4 ++++
 src/freedreno/ir3/ir3_compiler_nir.c | 17 ++++++++++++++---
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/freedreno/ir3/ir3.h b/src/freedreno/ir3/ir3.h
index 96835e0e595..5cdf85d2970 100644
--- a/src/freedreno/ir3/ir3.h
+++ b/src/freedreno/ir3/ir3.h
@@ -1462,6 +1462,10 @@ ir3_output_conv_src_type(struct ir3_instruction *instr, type_t base_type)
        */
       return TYPE_F32;
 
+   case OPC_FLAT_B:
+      /* Treat the input data as u32 if not interpolating. */
+      return TYPE_U32;
+
    default:
       return (instr->srcs[0]->flags & IR3_REG_HALF) ? half_type(base_type)
                                                     : full_type(base_type);
diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c
index 6302f293072..7b21dfa40d9 100644
--- a/src/freedreno/ir3/ir3_compiler_nir.c
+++ b/src/freedreno/ir3/ir3_compiler_nir.c
@@ -86,9 +86,20 @@ create_frag_input(struct ir3_context *ctx, struct ir3_instruction *coord,
    if (coord) {
       instr = ir3_BARY_F(block, inloc, 0, coord, 0);
    } else if (ctx->compiler->flat_bypass) {
-      instr = ir3_LDLV(block, inloc, 0, create_immed(block, 1), 0);
-      instr->cat6.type = TYPE_U32;
-      instr->cat6.iim_val = 1;
+      if (ctx->compiler->gen >= 6) {
+         struct ir3_instruction *ij[2];
+
+         for (int i = 0; i < 2; i++) {
+            ij[i] = create_immed(block, fui(0.0));
+         }
+
+         instr = ir3_FLAT_B(block, inloc, 0, ir3_create_collect(block, ij, 2), 0);
+         instr->srcs[1]->wrmask = 0x3;
+      } else {
+         instr = ir3_LDLV(block, inloc, 0, create_immed(block, 1), 0);
+         instr->cat6.type = TYPE_U32;
+         instr->cat6.iim_val = 1;
+      }
    } else {
       instr = ir3_BARY_F(block, inloc, 0, ctx->ij[IJ_PERSP_PIXEL], 0);
       instr->srcs[1]->wrmask = 0x3;



More information about the mesa-commit mailing list