summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2017-11-07 10:34:42 -0800
committerEric Anholt <[email protected]>2017-11-07 12:58:03 -0800
commit50906e4583357920b49c78c25787403c5b4836d0 (patch)
treed4139abe3be88781a507b11ea8a9db66eda8b14f
parent80da60947b65b792edc95671147b00bfe53f9101 (diff)
broadcom/vc5: Do 16-bit unpacking of integer texture returns properly.
We were doing f16 unpacks, which trashed "1" values. Fixes many piglit texwrap GL_EXT_texture_integer cases.
-rw-r--r--src/broadcom/compiler/nir_to_vir.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c
index 43ee84d5bba..4b176960b0b 100644
--- a/src/broadcom/compiler/nir_to_vir.c
+++ b/src/broadcom/compiler/nir_to_vir.c
@@ -477,14 +477,35 @@ ntq_emit_tex(struct v3d_compile *c, nir_tex_instr *instr)
STATIC_ASSERT(PIPE_SWIZZLE_X == 0);
chan = return_values[i / 2];
- enum v3d_qpu_input_unpack unpack;
- if (i & 1)
- unpack = V3D_QPU_UNPACK_H;
- else
- unpack = V3D_QPU_UNPACK_L;
-
- chan = vir_FMOV(c, chan);
- vir_set_unpack(c->defs[chan.index], 0, unpack);
+ if (nir_alu_type_get_base_type(instr->dest_type) ==
+ nir_type_float) {
+ enum v3d_qpu_input_unpack unpack;
+ if (i & 1)
+ unpack = V3D_QPU_UNPACK_H;
+ else
+ unpack = V3D_QPU_UNPACK_L;
+
+ chan = vir_FMOV(c, chan);
+ vir_set_unpack(c->defs[chan.index], 0, unpack);
+ } else {
+ /* If we're unpacking the low field, shift it
+ * up to the top first.
+ */
+ if ((i & 1) == 0) {
+ chan = vir_SHL(c, chan,
+ vir_uniform_ui(c, 16));
+ }
+
+ /* Do proper sign extension to a 32-bit int. */
+ if (nir_alu_type_get_base_type(instr->dest_type) ==
+ nir_type_int) {
+ chan = vir_ASR(c, chan,
+ vir_uniform_ui(c, 16));
+ } else {
+ chan = vir_SHR(c, chan,
+ vir_uniform_ui(c, 16));
+ }
+ }
} else {
chan = vir_MOV(c, return_values[i]);
}