Module: Mesa
Branch: master
Commit: d3e046e76c06978d92bc7311bf02926e888159dc
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=d3e046e76c06978d92bc7311bf02926e888159dc

Author: Eric Anholt <e...@anholt.net>
Date:   Tue Dec 11 13:49:28 2018 -0800

nir: Pull some of intel's image load/store format conversion to nir_format.h

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 <ja...@jlekstrand.net>

---

 src/compiler/nir/nir_format_convert.h              | 38 ++++++++++++++++++++++
 .../compiler/brw_nir_lower_image_load_store.c      | 20 ++----------
 2 files changed, 40 insertions(+), 18 deletions(-)

diff --git a/src/compiler/nir/nir_format_convert.h 
b/src/compiler/nir/nir_format_convert.h
index 9869d1e690..7ebb7d50ca 100644
--- a/src/compiler/nir/nir_format_convert.h
+++ b/src/compiler/nir/nir_format_convert.h
@@ -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)
 {
diff --git a/src/intel/compiler/brw_nir_lower_image_load_store.c 
b/src/intel/compiler/brw_nir_lower_image_load_store.c
index 1a7671b74b..269dbf8e28 100644
--- a/src/intel/compiler/brw_nir_lower_image_load_store.c
+++ b/src/intel/compiler/brw_nir_lower_image_load_store.c
@@ -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:

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to