Mesa (master): pan/midgard: Implement shadow cubemaps

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Dec 24 23:59:40 UTC 2019


Module: Mesa
Branch: master
Commit: 6b7243f28f0ec6208ca7431fe0b5e99c4dcdc57e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6b7243f28f0ec6208ca7431fe0b5e99c4dcdc57e

Author: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
Date:   Fri Dec 20 17:25:05 2019 -0500

pan/midgard: Implement shadow cubemaps

We need to reshuffle to sync up the shadow coordinate temporary with the
cubemap coordinate temporary. Once that's in place, it's simple enough
(we load the shadow coordinate into .z like 2D).

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>

---

 src/panfrost/midgard/midgard_compile.c | 48 ++++++++++++++++------------------
 1 file changed, 22 insertions(+), 26 deletions(-)

diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c
index 5e3c50f50ee..a03e47708b0 100644
--- a/src/panfrost/midgard/midgard_compile.c
+++ b/src/panfrost/midgard/midgard_compile.c
@@ -1741,6 +1741,7 @@ emit_texop_native(compiler_context *ctx, nir_tex_instr *instr,
 
         bool needs_temp_coord =
                 (midgard_texop == TEXTURE_OP_TEXEL_FETCH) ||
+                (instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE) ||
                 (instr->is_shadow);
 
         unsigned coords = needs_temp_coord ? make_compiler_temp_reg(ctx) : 0;
@@ -1755,7 +1756,25 @@ emit_texop_native(compiler_context *ctx, nir_tex_instr *instr,
 
                         unsigned coord_mask = mask_of(instr->coord_components);
 
-                        if (needs_temp_coord) {
+                        if (instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE) {
+                                /* texelFetch is undefined on samplerCube */
+                                assert(midgard_texop != TEXTURE_OP_TEXEL_FETCH);
+
+                                /* For cubemaps, we use a special ld/st op to
+                                 * select the face and copy the xy into the
+                                 * texture register */
+
+                                midgard_instruction ld = m_ld_cubemap_coords(coords, 0);
+                                ld.src[1] = index;
+                                ld.mask = 0x3; /* xy */
+                                ld.load_store.arg_1 = 0x20;
+                                ld.swizzle[1][3] = COMPONENT_X;
+                                emit_mir_instruction(ctx, ld);
+
+                                /* xyzw -> xyxx */
+                                ins.swizzle[1][2] = instr->is_shadow ? COMPONENT_Z : COMPONENT_X;
+                                ins.swizzle[1][3] = COMPONENT_X;
+                        } else if (needs_temp_coord) {
                                 /* mov coord_temp, coords */
                                 midgard_instruction mov = v_mov(index, coords);
                                 mov.mask = coord_mask;
@@ -1764,6 +1783,8 @@ emit_texop_native(compiler_context *ctx, nir_tex_instr *instr,
                                 coords = index;
                         }
 
+                        ins.src[1] = coords;
+
                         /* Texelfetch coordinates uses all four elements
                          * (xyz/index) regardless of texture dimensionality,
                          * which means it's necessary to zero the unused
@@ -1778,30 +1799,6 @@ emit_texop_native(compiler_context *ctx, nir_tex_instr *instr,
                                 emit_mir_instruction(ctx, mov);
                         }
 
-                        if (instr->sampler_dim == GLSL_SAMPLER_DIM_CUBE) {
-                                /* texelFetch is undefined on samplerCube */
-                                assert(midgard_texop != TEXTURE_OP_TEXEL_FETCH);
-
-                                /* For cubemaps, we use a special ld/st op to
-                                 * select the face and copy the xy into the
-                                 * texture register */
-
-                                unsigned temp = make_compiler_temp(ctx);
-                                midgard_instruction ld = m_ld_cubemap_coords(temp, 0);
-                                ld.src[1] = coords;
-                                ld.mask = 0x3; /* xy */
-                                ld.load_store.arg_1 = 0x20;
-                                ld.swizzle[1][3] = COMPONENT_X;
-                                emit_mir_instruction(ctx, ld);
-
-                                ins.src[1] = temp;
-                                /* xyzw -> xyxx */
-                                ins.swizzle[1][2] = COMPONENT_X;
-                                ins.swizzle[1][3] = COMPONENT_X;
-                        } else {
-                                ins.src[1] = coords;
-                        }
-
                         if (instr->sampler_dim == GLSL_SAMPLER_DIM_2D) {
                                 /* Array component in w but NIR wants it in z */
                                 if (nr_components == 3) {
@@ -1855,7 +1852,6 @@ emit_texop_native(compiler_context *ctx, nir_tex_instr *instr,
                 };
 
                 case nir_tex_src_comparator: {
-                        /* TODO: generalize */
                         unsigned comp = COMPONENT_Z;
 
                         /* mov coord_temp.foo, coords */




More information about the mesa-commit mailing list