From: Matt Turner Date: Tue, 19 Oct 2021 19:39:13 +0000 (-0700) Subject: freedreno/ir3: Use immediate for flat.b's src1 X-Git-Tag: upstream/22.3.5~16017 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cc29b940413138e99e2b6860382e672b13980a39;p=platform%2Fupstream%2Fmesa.git freedreno/ir3: Use immediate for flat.b's src1 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: --- diff --git a/src/freedreno/ir3/ir3.c b/src/freedreno/ir3/ir3.c index 04e68c6..db116f0 100644 --- a/src/freedreno/ir3/ir3.c +++ b/src/freedreno/ir3/ir3.c @@ -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: diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c index 7b21dfa..abee963 100644 --- a/src/freedreno/ir3/ir3_compiler_nir.c +++ b/src/freedreno/ir3/ir3_compiler_nir.c @@ -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;