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