Mesa (main): gallium/util: add helper to clamp colors to valid range

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Dec 3 16:10:52 UTC 2021


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

Author: Juan A. Suarez Romero <jasuarez at igalia.com>
Date:   Fri Oct 29 16:04:47 2021 +0200

gallium/util: add helper to clamp colors to valid range

v3 (Iago):
 - Fix comment.

Signed-off-by: Juan A. Suarez Romero <jasuarez at igalia.com>
Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13409>

---

 src/gallium/auxiliary/util/u_helpers.c | 27 +++++++++++++++++++++++++++
 src/gallium/auxiliary/util/u_helpers.h |  3 +++
 2 files changed, 30 insertions(+)

diff --git a/src/gallium/auxiliary/util/u_helpers.c b/src/gallium/auxiliary/util/u_helpers.c
index dd415b9909f..e0e91aab462 100644
--- a/src/gallium/auxiliary/util/u_helpers.c
+++ b/src/gallium/auxiliary/util/u_helpers.c
@@ -25,6 +25,7 @@
  *
  **************************************************************************/
 
+#include "util/format/format_utils.h"
 #include "util/u_cpu_detect.h"
 #include "util/u_helpers.h"
 #include "util/u_inlines.h"
@@ -518,3 +519,29 @@ util_init_pipe_vertex_state(struct pipe_screen *screen,
       state->input.elements[i] = elements[i];
    state->input.full_velem_mask = full_velem_mask;
 }
+
+/**
+ * Clamp color value to format range.
+ */
+union pipe_color_union
+util_clamp_color(enum pipe_format format,
+                 const union pipe_color_union *color)
+{
+   union pipe_color_union clamp_color = *color;
+   int i;
+
+   for (i = 0; i < util_format_get_nr_components(format); i++) {
+      uint8_t bits = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, i);
+
+      if (util_format_is_unorm(format))
+         clamp_color.ui[i] = _mesa_unorm_to_unorm(clamp_color.ui[i], bits, bits);
+      else if (util_format_is_snorm(format))
+         clamp_color.i[i] = _mesa_snorm_to_snorm(clamp_color.i[i], bits, bits);
+      else if (util_format_is_pure_uint(format))
+         clamp_color.ui[i] = _mesa_unsigned_to_unsigned(clamp_color.ui[i], bits);
+      else if (util_format_is_pure_sint(format))
+         clamp_color.i[i] = _mesa_signed_to_signed(clamp_color.i[i], bits);
+   }
+
+   return clamp_color;
+}
diff --git a/src/gallium/auxiliary/util/u_helpers.h b/src/gallium/auxiliary/util/u_helpers.h
index 9246d306ed8..299c6798088 100644
--- a/src/gallium/auxiliary/util/u_helpers.h
+++ b/src/gallium/auxiliary/util/u_helpers.h
@@ -130,6 +130,9 @@ util_init_pipe_vertex_state(struct pipe_screen *screen,
                             uint32_t full_velem_mask,
                             struct pipe_vertex_state *state);
 
+union pipe_color_union util_clamp_color(enum pipe_format format,
+                                        const union pipe_color_union *color);
+
 #ifdef __cplusplus
 }
 #endif



More information about the mesa-commit mailing list