diff options
author | Eric Anholt <[email protected]> | 2018-12-26 23:35:22 -0800 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2018-12-30 08:05:11 -0800 |
commit | 906fca1b4b8df43778780250cda61d1cd9d5667d (patch) | |
tree | 1ca712482ca3052adc6d1bf7e78a98cf1173cbec /src/broadcom | |
parent | 47caefc7b4e239bb7e9486a799e618e5614e4924 (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/broadcom')
-rw-r--r-- | src/broadcom/compiler/v3d40_tex.c | 32 |
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; } |