nir/format_convert: Add vec mask and sign-extend helpers
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 13 Aug 2018 17:04:25 +0000 (12:04 -0500)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 29 Aug 2018 19:04:02 +0000 (14:04 -0500)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/nir/nir_format_convert.h

index b1345f7263b6483a22de3ce46c540de35179855a..305273cdfdd0a099b67fcd403ef269b00f04a13c 100644 (file)
@@ -50,6 +50,32 @@ nir_mask_shift_or(struct nir_builder *b, nir_ssa_def *dst, nir_ssa_def *src,
    return nir_ior(b, nir_mask_shift(b, src, src_mask, src_left_shift), dst);
 }
 
+static inline nir_ssa_def *
+nir_format_mask_uvec(nir_builder *b, nir_ssa_def *src,
+                     const unsigned *bits)
+{
+   nir_const_value mask;
+   for (unsigned i = 0; i < src->num_components; i++) {
+      assert(bits[i] < 32);
+      mask.u32[i] = (1u << bits[i]) - 1;
+   }
+   return nir_iand(b, src, nir_build_imm(b, src->num_components, 32, mask));
+}
+
+static inline nir_ssa_def *
+nir_format_sign_extend_ivec(nir_builder *b, nir_ssa_def *src,
+                            const unsigned *bits)
+{
+   assert(src->num_components <= 4);
+   nir_ssa_def *comps[4];
+   for (unsigned i = 0; i < src->num_components; i++) {
+      nir_ssa_def *shift = nir_imm_int(b, src->bit_size - bits[i]);
+      comps[i] = nir_ishr(b, nir_ishl(b, nir_channel(b, src, i), shift), shift);
+   }
+   return nir_vec(b, comps, src->num_components);
+}
+
+
 static inline nir_ssa_def *
 nir_format_unpack_int(nir_builder *b, nir_ssa_def *packed,
                       const unsigned *bits, unsigned num_components,
@@ -117,14 +143,7 @@ static inline nir_ssa_def *
 nir_format_pack_uint(nir_builder *b, nir_ssa_def *color,
                      const unsigned *bits, unsigned num_components)
 {
-   nir_const_value mask;
-   for (unsigned i = 0; i < num_components; i++) {
-      assert(bits[i] < 32);
-      mask.u32[i] = (1u << bits[i]) - 1;
-   }
-   nir_ssa_def *mask_imm = nir_build_imm(b, num_components, 32, mask);
-
-   return nir_format_pack_uint_unmasked(b, nir_iand(b, color, mask_imm),
+   return nir_format_pack_uint_unmasked(b, nir_format_mask_uvec(b, color, bits),
                                         bits, num_components);
 }