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>
This commit is contained in:
Emma Anholt
2021-10-13 16:39:05 -07:00
committed by Marge Bot
parent cbdc8e09bf
commit 68f8bbb37e
4 changed files with 87 additions and 30 deletions
@@ -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);
}
+66
View File
@@ -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
}
+4
View File
@@ -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
+16
View File
@@ -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);