summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2018-12-26 23:35:22 -0800
committerEric Anholt <[email protected]>2018-12-30 08:05:11 -0800
commit906fca1b4b8df43778780250cda61d1cd9d5667d (patch)
tree1ca712482ca3052adc6d1bf7e78a98cf1173cbec /src
parent47caefc7b4e239bb7e9486a799e618e5614e4924 (diff)
v3d: Add support for non-constant texture offsets.
Fixes dEQP-GLES31.functional.texture.gather.offset_dynamic.min_required_offset.2d.rgba8.size_pot.clamp_to_edge_repeat and others.
Diffstat (limited to 'src')
-rw-r--r--src/broadcom/compiler/v3d40_tex.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/broadcom/compiler/v3d40_tex.c b/src/broadcom/compiler/v3d40_tex.c
index c12d14c6fe6..c41cd33505a 100644
--- a/src/broadcom/compiler/v3d40_tex.c
+++ b/src/broadcom/compiler/v3d40_tex.c
@@ -132,14 +132,30 @@ v3d40_vir_emit_tex(struct v3d_compile *c, nir_tex_instr *instr)
break;
case nir_tex_src_offset: {
- nir_const_value *offset =
- nir_src_as_const_value(instr->src[i].src);
-
- p2_unpacked.offset_s = offset->i32[0];
- if (instr->coord_components >= 2)
- p2_unpacked.offset_t = offset->i32[1];
- if (instr->coord_components >= 3)
- p2_unpacked.offset_r = offset->i32[2];
+ if (nir_src_is_const(instr->src[i].src)) {
+ nir_const_value *offset =
+ nir_src_as_const_value(instr->src[i].src);
+
+ p2_unpacked.offset_s = offset->i32[0];
+ if (instr->coord_components >= 2)
+ p2_unpacked.offset_t = offset->i32[1];
+ if (instr->coord_components >= 3)
+ p2_unpacked.offset_r = offset->i32[2];
+ } else {
+ struct qreg mask = vir_uniform_ui(c, 0xf);
+ struct qreg x, y, offset;
+
+ x = vir_AND(c, ntq_get_src(c, instr->src[i].src,
+ 0), mask);
+ y = vir_AND(c, ntq_get_src(c, instr->src[i].src,
+ 1), mask);
+ offset = vir_OR(c, x,
+ vir_SHL(c, y,
+ vir_uniform_ui(c, 4)));
+
+ vir_TMU_WRITE(c, V3D_QPU_WADDR_TMUOFF,
+ offset, &tmu_writes);
+ }
break;
}