freedreno/ir3: fix for load_front_face intrinsic
authorRob Clark <robclark@freedesktop.org>
Mon, 21 Mar 2016 23:55:37 +0000 (19:55 -0400)
committerRob Clark <robclark@freedesktop.org>
Mon, 28 Mar 2016 14:19:53 +0000 (10:19 -0400)
Seems like trying to widen in the same instruction as the add.s does a
non-sign-extending widen.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c

index 88f6e168558d1cfa723c0ef11f6a67e708c2d0c6..3d656d4a34df0f73c211caf7c041080d08fc234c 100644 (file)
@@ -1258,7 +1258,14 @@ emit_intrinsic(struct ir3_compile *ctx, nir_intrinsic_instr *intr)
                        ctx->frag_face = create_input(b, 0);
                        ctx->frag_face->regs[0]->flags |= IR3_REG_HALF;
                }
-               dst[0] = ir3_ADD_S(b, ctx->frag_face, 0, create_immed(b, 1), 0);
+               /* for fragface, we always get -1 or 0, but that is inverse
+                * of what nir expects (where ~0 is true).  Unfortunately
+                * trying to widen from half to full in add.s seems to do a
+                * non-sign-extending widen (resulting in something that
+                * gets interpreted as float Inf??)
+                */
+               dst[0] = ir3_COV(b, ctx->frag_face, TYPE_S16, TYPE_S32);
+               dst[0] = ir3_ADD_S(b, dst[0], 0, create_immed(b, 1), 0);
                break;
        case nir_intrinsic_discard_if:
        case nir_intrinsic_discard: {