freedreno/ir3: fix load_front_face conversion
authorIlia Mirkin <imirkin@alum.mit.edu>
Wed, 12 Jul 2017 01:44:12 +0000 (21:44 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Wed, 12 Jul 2017 23:30:46 +0000 (19:30 -0400)
The comments are correct - we get -1 and 0. However by adding 1, we
convert this into 0,1. This mostly works for conditionals, but when
negated, this will yield the wrong result. Instead just negate the
values (as they are backwards -- -1 means back instead of front).

Fixes tests/shaders/glsl-fs-frontfacing-not.shader_test and
dEQP-GLES3.functional.shaders.builtin_variable.frontfacing on A530.

The latter also tested on A306 by Rob Clark.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/freedreno/ir3/ir3_compiler_nir.c

index ba1c64ee37cefca759763f8efe8940e5f9cfc5cf..764aeb49f1a7418a8fa26f389386c9d10a4970f3 100644 (file)
@@ -1546,14 +1546,11 @@ 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;
                }
-               /* 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??)
+               /* for fragface, we get -1 for back and 0 for front. However this is
+                * the inverse of what nir expects (where ~0 is true).
                 */
                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);
+               dst[0] = ir3_NOT_B(b, dst[0], 0);
                break;
        case nir_intrinsic_load_local_invocation_id:
                if (!ctx->local_invocation_id) {