freedreno/ir3: Use immediate for flat.b's src1
authorMatt Turner <mattst88@gmail.com>
Tue, 19 Oct 2021 19:39:13 +0000 (12:39 -0700)
committerMarge Bot <emma+marge@anholt.net>
Thu, 4 Nov 2021 02:59:28 +0000 (02:59 +0000)
According to Jonathan Marek:

  Only one immediate can be decoded in a cat2 instruction (if both srcs
  are immediates, they will use the value of the either the first or
  second one, I don't remember which) - using 2 immediates in a cat2
  instruction is only "correct" if they are both equal.

  The (i,j) in the second src of flat.b is not unused, but behaves as 0
  for any (small) integer because it is a float src. The hack I
  suggested is to set the second src equal to (immediate) first src,
  which seems to work.

This allows us to remove a couple of mov instructions or a bit of extra
constfile usage.

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

src/freedreno/ir3/ir3.c
src/freedreno/ir3/ir3_compiler_nir.c

index 04e68c6..db116f0 100644 (file)
@@ -859,6 +859,11 @@ ir3_valid_flags(struct ir3_instruction *instr, unsigned n, unsigned flags)
       if (flags & ~valid_flags)
          return false;
 
+      /* Allow an immediate src1 for flat.b, since it's ignored */
+      if (instr->opc == OPC_FLAT_B &&
+          n == 1 && flags == IR3_REG_IMMED)
+         return true;
+
       if (flags & (IR3_REG_CONST | IR3_REG_IMMED | IR3_REG_SHARED)) {
          unsigned m = n ^ 1;
          /* cannot deal w/ const or shared in both srcs:
index 7b21dfa..abee963 100644 (file)
@@ -87,14 +87,7 @@ create_frag_input(struct ir3_context *ctx, struct ir3_instruction *coord,
       instr = ir3_BARY_F(block, inloc, 0, coord, 0);
    } else if (ctx->compiler->flat_bypass) {
       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;
+         instr = ir3_FLAT_B(block, inloc, 0, inloc, 0);
       } else {
          instr = ir3_LDLV(block, inloc, 0, create_immed(block, 1), 0);
          instr->cat6.type = TYPE_U32;