pan/midgard: Set Z to shadow comparator for 2D
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 16 Dec 2019 22:14:04 +0000 (17:14 -0500)
committerMarge Bot <eric+marge@anholt.net>
Tue, 17 Dec 2019 17:42:57 +0000 (17:42 +0000)
We still need to generalize for other types of (non-2D / array) shadow
samplers, but this is enough for sampler2DShadow to work with initial
dEQP tests passing.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3125>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3125>

src/panfrost/midgard/midgard_compile.c

index c28a69a429150b200c4228e3e21e5b3966e339a9..e2a6cef1433405c33fec8461478c17a357a548a0 100644 (file)
@@ -1731,7 +1731,10 @@ emit_texop_native(compiler_context *ctx, nir_tex_instr *instr,
 
         /* We may need a temporary for the coordinate */
 
-        bool needs_temp_coord = (midgard_texop == TEXTURE_OP_TEXEL_FETCH);
+        bool needs_temp_coord =
+                (midgard_texop == TEXTURE_OP_TEXEL_FETCH) ||
+                (instr->is_shadow);
+
         unsigned coords = needs_temp_coord ? make_compiler_temp_reg(ctx) : 0;
 
         for (unsigned i = 0; i < instr->num_srcs; ++i) {
@@ -1795,7 +1798,8 @@ emit_texop_native(compiler_context *ctx, nir_tex_instr *instr,
                                         ins.swizzle[1][2] = COMPONENT_Z;
                                         ins.swizzle[1][3] = COMPONENT_Z;
                                 } else if (nr_components == 2) {
-                                        ins.swizzle[1][2] = COMPONENT_X;
+                                        ins.swizzle[1][2] =
+                                                instr->is_shadow ? COMPONENT_Z : COMPONENT_X;
                                         ins.swizzle[1][3] = COMPONENT_X;
                                 } else
                                         unreachable("Invalid texture 2D components");
@@ -1819,6 +1823,21 @@ emit_texop_native(compiler_context *ctx, nir_tex_instr *instr,
                         break;
                 };
 
+                case nir_tex_src_comparator: {
+                        /* TODO: generalize */
+                        unsigned comp = COMPONENT_Z;
+
+                        /* mov coord_temp.foo, coords */
+                        midgard_instruction mov = v_mov(index, coords);
+                        mov.mask = 1 << comp;
+
+                        for (unsigned i = 0; i < MIR_VEC_COMPONENTS; ++i)
+                                mov.swizzle[1][i] = COMPONENT_X;
+
+                        emit_mir_instruction(ctx, mov);
+                        break;
+                }
+
                 default:
                         unreachable("Unknown texture source type\n");
                 }