diff options
author | Eric Anholt <[email protected]> | 2017-11-07 10:34:42 -0800 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2017-11-07 12:58:03 -0800 |
commit | 50906e4583357920b49c78c25787403c5b4836d0 (patch) | |
tree | d4139abe3be88781a507b11ea8a9db66eda8b14f /src | |
parent | 80da60947b65b792edc95671147b00bfe53f9101 (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.
Diffstat (limited to 'src')
-rw-r--r-- | src/broadcom/compiler/nir_to_vir.c | 37 |
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]); } |