nir: Pull some of intel's image load/store format conversion to nir_format.h
authorEric Anholt <eric@anholt.net>
Tue, 11 Dec 2018 21:49:28 +0000 (13:49 -0800)
committerEric Anholt <eric@anholt.net>
Thu, 13 Dec 2018 00:09:43 +0000 (16:09 -0800)
I needed the same functions for v3d.  Note that the color value in the
Intel lowering has already been cut down to image.chans num_components.

v2: Drop the half float one, since it was a 1-liner after cleanup.

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

index 9869d1e6905b6730a3ac9610ace971c36ac3f655..7ebb7d50ca4797e4b95a09df8d7cd6c0b819eea3 100644 (file)
@@ -282,6 +282,44 @@ nir_format_srgb_to_linear(nir_builder *b, nir_ssa_def *c)
                                    linear, curved));
 }
 
+/* Clamps a vector of uints so they don't extend beyond the given number of
+ * bits per channel.
+ */
+static inline nir_ssa_def *
+nir_format_clamp_uint(nir_builder *b, nir_ssa_def *f, const unsigned *bits)
+{
+   if (bits[0] == 32)
+      return f;
+
+   nir_const_value max;
+   for (unsigned i = 0; i < f->num_components; i++) {
+      assert(bits[i] < 32);
+      max.i32[i] = (1 << (bits[i] - 1)) - 1;
+   }
+   return nir_umin(b, f, nir_build_imm(b, f->num_components, 32, max));
+}
+
+/* Clamps a vector of sints so they don't extend beyond the given number of
+ * bits per channel.
+ */
+static inline nir_ssa_def *
+nir_format_clamp_sint(nir_builder *b, nir_ssa_def *f, const unsigned *bits)
+{
+   if (bits[0] == 32)
+      return f;
+
+   nir_const_value min, max;
+   for (unsigned i = 0; i < f->num_components; i++) {
+      assert(bits[i] < 32);
+      max.i32[i] = (1 << (bits[i] - 1)) - 1;
+      min.i32[i] = -(1 << (bits[i] - 1));
+   }
+   f = nir_imin(b, f, nir_build_imm(b, f->num_components, 32, max));
+   f = nir_imax(b, f, nir_build_imm(b, f->num_components, 32, min));
+
+   return f;
+}
+
 static inline nir_ssa_def *
 nir_format_unpack_11f11f10f(nir_builder *b, nir_ssa_def *packed)
 {
index 1a7671b74b1b161d68b766fb8dbd7dc08760485e..269dbf8e2835badd4ac6ab760965afca13b582f1 100644 (file)
@@ -555,27 +555,11 @@ convert_color_for_store(nir_builder *b, const struct gen_device_info *devinfo,
       break;
 
    case ISL_UINT:
-      if (image.bits[0] < 32) {
-         nir_const_value max;
-         for (unsigned i = 0; i < image.chans; i++) {
-            assert(image.bits[i] < 32);
-            max.u32[i] = (1u << image.bits[i]) - 1;
-         }
-         color = nir_umin(b, color, nir_build_imm(b, image.chans, 32, max));
-      }
+      color = nir_format_clamp_uint(b, color, image.bits);
       break;
 
    case ISL_SINT:
-      if (image.bits[0] < 32) {
-         nir_const_value min, max;
-         for (unsigned i = 0; i < image.chans; i++) {
-            assert(image.bits[i] < 32);
-            max.i32[i] = (1 << (image.bits[i] - 1)) - 1;
-            min.i32[i] = -(1 << (image.bits[i] - 1));
-         }
-         color = nir_imin(b, color, nir_build_imm(b, image.chans, 32, max));
-         color = nir_imax(b, color, nir_build_imm(b, image.chans, 32, min));
-      }
+      color = nir_format_clamp_sint(b, color, image.bits);
       break;
 
    default: