summaryrefslogtreecommitdiffstats
path: root/src/panfrost/midgard/midgard_compile.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/panfrost/midgard/midgard_compile.c')
-rw-r--r--src/panfrost/midgard/midgard_compile.c48
1 files 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 */