nir: Allow nir_format_unpack_int/sint to unpack larger values.
authorEric Anholt <eric@anholt.net>
Wed, 2 Jan 2019 22:50:20 +0000 (14:50 -0800)
committerEric Anholt <eric@anholt.net>
Fri, 4 Jan 2019 23:59:30 +0000 (15:59 -0800)
For V3D, I want to unpack 4-16-bit packed integers for 8 and 16-bit
integer samplers.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/nir/nir_format_convert.h

index c5d69ba5a37c61b7a7082191fc83314473794c55..bf6dc201a1881e9c127c353b6bd693500f40b812 100644 (file)
@@ -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);
 }