From a74f2aeb4fcc8765571b9120a8c8b13cee59de46 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 2 Jan 2019 14:50:20 -0800 Subject: [PATCH] nir: Allow nir_format_unpack_int/sint to unpack larger values. For V3D, I want to unpack 4-16-bit packed integers for 8 and 16-bit integer samplers. Reviewed-by: Jason Ekstrand --- src/compiler/nir/nir_format_convert.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/compiler/nir/nir_format_convert.h b/src/compiler/nir/nir_format_convert.h index c5d69ba5a37..bf6dc201a18 100644 --- a/src/compiler/nir/nir_format_convert.h +++ b/src/compiler/nir/nir_format_convert.h @@ -90,19 +90,24 @@ nir_format_unpack_int(nir_builder *b, nir_ssa_def *packed, return packed; } + unsigned next_chan = 0; unsigned offset = 0; for (unsigned i = 0; i < num_components; i++) { assert(bits[i] < bit_size); assert(offset + bits[i] <= bit_size); + nir_ssa_def *chan = nir_channel(b, packed, next_chan); nir_ssa_def *lshift = nir_imm_int(b, bit_size - (offset + bits[i])); nir_ssa_def *rshift = nir_imm_int(b, bit_size - bits[i]); if (sign_extend) - comps[i] = nir_ishr(b, nir_ishl(b, packed, lshift), rshift); + comps[i] = nir_ishr(b, nir_ishl(b, chan, lshift), rshift); else - comps[i] = nir_ushr(b, nir_ishl(b, packed, lshift), rshift); + comps[i] = nir_ushr(b, nir_ishl(b, chan, lshift), rshift); offset += bits[i]; + if (offset >= bit_size) { + next_chan++; + offset -= bit_size; + } } - assert(offset <= bit_size); return nir_vec(b, comps, num_components); } -- 2.30.2