Mesa (main): util: Move freedreno's snorm-to-unorm to util/, adding remaining cases.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Oct 21 09:15:40 UTC 2021


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

Author: Emma Anholt <emma at anholt.net>
Date:   Wed Oct 13 16:39:05 2021 -0700

util: Move freedreno's snorm-to-unorm to util/, adding remaining cases.

I want it in turnip too.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13379>

---

 src/gallium/drivers/freedreno/a6xx/fd6_blitter.c | 31 +----------
 src/util/format/u_format.c                       | 66 ++++++++++++++++++++++++
 src/util/format/u_format.h                       |  4 ++
 src/util/tests/format/u_format_test.c            | 16 ++++++
 4 files changed, 87 insertions(+), 30 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
index 0750cb6ed49..9435aaf7013 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.c
@@ -1126,35 +1126,6 @@ handle_compressed_blit(struct fd_context *ctx,
    return do_rewritten_blit(ctx, &blit);
 }
 
-static enum pipe_format
-snorm_copy_format(enum pipe_format format)
-{
-   switch (format) {
-   case PIPE_FORMAT_R8_SNORM:           return PIPE_FORMAT_R8_UNORM;
-   case PIPE_FORMAT_R16_SNORM:          return PIPE_FORMAT_R16_UNORM;
-   case PIPE_FORMAT_A16_SNORM:          return PIPE_FORMAT_A16_UNORM;
-   case PIPE_FORMAT_L16_SNORM:          return PIPE_FORMAT_L16_UNORM;
-   case PIPE_FORMAT_I16_SNORM:          return PIPE_FORMAT_I16_UNORM;
-   case PIPE_FORMAT_R8G8_SNORM:         return PIPE_FORMAT_R8G8_UNORM;
-   case PIPE_FORMAT_R8G8B8_SNORM:       return PIPE_FORMAT_R8G8B8_UNORM;
-   case PIPE_FORMAT_R32_SNORM:          return PIPE_FORMAT_R32_UNORM;
-   case PIPE_FORMAT_R16G16_SNORM:       return PIPE_FORMAT_R16G16_UNORM;
-   case PIPE_FORMAT_L16A16_SNORM:       return PIPE_FORMAT_L16A16_UNORM;
-   case PIPE_FORMAT_R8G8B8A8_SNORM:     return PIPE_FORMAT_R8G8B8A8_UNORM;
-   case PIPE_FORMAT_R10G10B10A2_SNORM:  return PIPE_FORMAT_R10G10B10A2_UNORM;
-   case PIPE_FORMAT_B10G10R10A2_SNORM:  return PIPE_FORMAT_B10G10R10A2_UNORM;
-   case PIPE_FORMAT_R16G16B16_SNORM:    return PIPE_FORMAT_R16G16B16_UNORM;
-   case PIPE_FORMAT_R16G16B16A16_SNORM: return PIPE_FORMAT_R16G16B16A16_UNORM;
-   case PIPE_FORMAT_R16G16B16X16_SNORM: return PIPE_FORMAT_R16G16B16X16_UNORM;
-   case PIPE_FORMAT_R32G32_SNORM:       return PIPE_FORMAT_R32G32_UNORM;
-   case PIPE_FORMAT_R32G32B32_SNORM:    return PIPE_FORMAT_R32G32B32_UNORM;
-   case PIPE_FORMAT_R32G32B32A32_SNORM: return PIPE_FORMAT_R32G32B32A32_UNORM;
-   default:
-      unreachable("unhandled snorm format");
-      return format;
-   }
-}
-
 /**
  * For SNORM formats, copy them as the equivalent UNORM format.  If we treat
  * them as snorm then the 0x80 (-1.0 snorm8) value will get clamped to 0x81
@@ -1168,7 +1139,7 @@ handle_snorm_copy_blit(struct fd_context *ctx,
 {
    struct pipe_blit_info blit = *info;
 
-   blit.src.format = blit.dst.format = snorm_copy_format(info->src.format);
+   blit.src.format = blit.dst.format = util_format_snorm_to_unorm(info->src.format);
 
    return do_rewritten_blit(ctx, &blit);
 }
diff --git a/src/util/format/u_format.c b/src/util/format/u_format.c
index 31f1f240efc..36c5e52008e 100644
--- a/src/util/format/u_format.c
+++ b/src/util/format/u_format.c
@@ -1158,3 +1158,69 @@ util_format_unpack_description(enum pipe_format format)
 
    return util_format_unpack_table[format];
 }
+
+enum pipe_format
+util_format_snorm_to_unorm(enum pipe_format format)
+{
+#define CASE(x) case PIPE_FORMAT_##x##_SNORM: return PIPE_FORMAT_##x##_UNORM
+
+   switch (format) {
+   CASE(R8G8B8A8);
+   CASE(R8G8B8X8);
+   CASE(B8G8R8A8);
+   CASE(B8G8R8X8);
+   CASE(A8R8G8B8);
+   CASE(X8R8G8B8);
+   CASE(A8B8G8R8);
+   CASE(X8B8G8R8);
+
+   CASE(R10G10B10A2);
+   CASE(R10G10B10X2);
+   CASE(B10G10R10A2);
+   CASE(B10G10R10X2);
+
+   CASE(R8);
+   CASE(R8G8);
+   CASE(G8R8);
+   CASE(R8G8B8);
+   CASE(B8G8R8);
+
+   CASE(R16);
+   CASE(R16G16);
+   CASE(G16R16);
+   CASE(R16G16B16);
+
+   CASE(R16G16B16A16);
+   CASE(R16G16B16X16);
+
+   CASE(R32);
+   CASE(R32G32);
+   CASE(R32G32B32);
+   CASE(R32G32B32A32);
+
+   CASE(RGTC1);
+   CASE(RGTC2);
+   CASE(ETC2_R11);
+   CASE(ETC2_RG11);
+
+   CASE(A8);
+   CASE(A16);
+   CASE(L8);
+   CASE(L16);
+   CASE(I8);
+   CASE(I16);
+
+   CASE(L8A8);
+   CASE(L16A16);
+   CASE(R8A8);
+   CASE(R16A16);
+
+   CASE(LATC1);
+   CASE(LATC2);
+
+   default:
+      return format;
+   }
+
+#undef CASE
+}
diff --git a/src/util/format/u_format.h b/src/util/format/u_format.h
index 804dd3486a0..0943a80f46d 100644
--- a/src/util/format/u_format.h
+++ b/src/util/format/u_format.h
@@ -1688,6 +1688,10 @@ util_copy_rect(ubyte * dst, enum pipe_format format,
 enum pipe_format
 util_format_rgb_to_bgr(enum pipe_format format);
 
+/* Returns the pipe format with SNORM formats cast to UNORM, otherwise the original pipe format. */
+enum pipe_format
+util_format_snorm_to_unorm(enum pipe_format format);
+
 #ifdef __cplusplus
 } // extern "C" {
 #endif
diff --git a/src/util/tests/format/u_format_test.c b/src/util/tests/format/u_format_test.c
index 9f14b671ff8..1ce93b97cc0 100644
--- a/src/util/tests/format/u_format_test.c
+++ b/src/util/tests/format/u_format_test.c
@@ -827,6 +827,22 @@ test_all(void)
             success = FALSE;
       }
 
+      if (util_format_is_snorm(format)) {
+         enum pipe_format unorm = util_format_snorm_to_unorm(format);
+
+         if (format == PIPE_FORMAT_R8G8Bx_SNORM) {
+            /* no unorm equivalent for this one */
+         } else if (unorm == format) {
+            fprintf(stderr, "%s missing from util_format_snorm_to_unorm().\n",
+                    util_format_name(format));
+            success = FALSE;
+         } else if (!util_format_is_unorm(unorm)) {
+            fprintf(stderr, "util_format_snorm_to_unorm(%s) returned non-unorm %s.\n",
+                    util_format_name(format), util_format_name(unorm));
+            success = FALSE;
+         }
+      }
+
       TEST_ONE_PACK_FUNC(pack_rgba_float);
       TEST_ONE_UNPACK_RECT_FUNC(unpack_rgba);
       TEST_ONE_PACK_FUNC(pack_rgba_8unorm);



More information about the mesa-commit mailing list