From 68f8bbb37ea76437a5e334bd3f635946939812fb Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Wed, 13 Oct 2021 16:39:05 -0700 Subject: [PATCH] util: Move freedreno's snorm-to-unorm to util/, adding remaining cases. I want it in turnip too. Part-of: --- .../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);