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:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user