diff options
author | Marek Olšák <marek.olsak@amd.com> | 2022-07-18 21:26:41 -0400 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2022-08-03 00:57:16 +0000 |
commit | 2208ff7a5be652a539d7419df6e08de5c335e455 (patch) | |
tree | 9764899c6e4bfaa5903411c09be65d386f97c336 | |
parent | 91a3a38d5c0cfa89d95b6c7e16deabd212f90524 (diff) | |
download | mesa-2208ff7a5be652a539d7419df6e08de5c335e455.tar.gz |
util/format: add util_format_rgbx_to_rgba helper
Image stores don't like RGBX on AMD. This is required by compute blits.
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17864>
-rw-r--r-- | src/util/format/u_format.c | 94 | ||||
-rw-r--r-- | src/util/format/u_format.h | 3 |
2 files changed, 97 insertions, 0 deletions
diff --git a/src/util/format/u_format.c b/src/util/format/u_format.c index bd989c33f4e..aba5d51ed97 100644 --- a/src/util/format/u_format.c +++ b/src/util/format/u_format.c @@ -1262,3 +1262,97 @@ util_format_snorm_to_unorm(enum pipe_format format) #undef CASE } + +enum pipe_format +util_format_rgbx_to_rgba(enum pipe_format format) +{ + switch (format) { + case PIPE_FORMAT_B8G8R8X8_UNORM: + return PIPE_FORMAT_B8G8R8A8_UNORM; + case PIPE_FORMAT_X8B8G8R8_UNORM: + return PIPE_FORMAT_A8B8G8R8_UNORM; + case PIPE_FORMAT_X8R8G8B8_UNORM: + return PIPE_FORMAT_A8R8G8B8_UNORM; + case PIPE_FORMAT_X8B8G8R8_SRGB: + return PIPE_FORMAT_A8B8G8R8_SRGB; + case PIPE_FORMAT_B8G8R8X8_SRGB: + return PIPE_FORMAT_B8G8R8A8_SRGB; + case PIPE_FORMAT_X8R8G8B8_SRGB: + return PIPE_FORMAT_A8R8G8B8_SRGB; + case PIPE_FORMAT_B5G5R5X1_UNORM: + return PIPE_FORMAT_B5G5R5A1_UNORM; + case PIPE_FORMAT_R10G10B10X2_USCALED: + return PIPE_FORMAT_R10G10B10A2_USCALED; + case PIPE_FORMAT_R10G10B10X2_SNORM: + return PIPE_FORMAT_R10G10B10A2_SNORM; + case PIPE_FORMAT_R8G8B8X8_UNORM: + return PIPE_FORMAT_R8G8B8A8_UNORM; + case PIPE_FORMAT_B4G4R4X4_UNORM: + return PIPE_FORMAT_B4G4R4A4_UNORM; + case PIPE_FORMAT_R8G8B8X8_SNORM: + return PIPE_FORMAT_R8G8B8A8_SNORM; + case PIPE_FORMAT_R8G8B8X8_SRGB: + return PIPE_FORMAT_R8G8B8A8_SRGB; + case PIPE_FORMAT_R8G8B8X8_UINT: + return PIPE_FORMAT_R8G8B8A8_UINT; + case PIPE_FORMAT_R8G8B8X8_SINT: + return PIPE_FORMAT_R8G8B8A8_SINT; + case PIPE_FORMAT_B10G10R10X2_UNORM: + return PIPE_FORMAT_B10G10R10A2_UNORM; + case PIPE_FORMAT_R16G16B16X16_UNORM: + return PIPE_FORMAT_R16G16B16A16_UNORM; + case PIPE_FORMAT_R16G16B16X16_SNORM: + return PIPE_FORMAT_R16G16B16A16_SNORM; + case PIPE_FORMAT_R16G16B16X16_FLOAT: + return PIPE_FORMAT_R16G16B16A16_FLOAT; + case PIPE_FORMAT_R16G16B16X16_UINT: + return PIPE_FORMAT_R16G16B16A16_UINT; + case PIPE_FORMAT_R16G16B16X16_SINT: + return PIPE_FORMAT_R16G16B16A16_SINT; + case PIPE_FORMAT_R32G32B32X32_FLOAT: + return PIPE_FORMAT_R32G32B32A32_FLOAT; + case PIPE_FORMAT_R32G32B32X32_UINT: + return PIPE_FORMAT_R32G32B32A32_UINT; + case PIPE_FORMAT_R32G32B32X32_SINT: + return PIPE_FORMAT_R32G32B32A32_SINT; + case PIPE_FORMAT_X8B8G8R8_SNORM: + return PIPE_FORMAT_A8B8G8R8_SNORM; + case PIPE_FORMAT_R10G10B10X2_UNORM: + return PIPE_FORMAT_R10G10B10A2_UNORM; + case PIPE_FORMAT_X1B5G5R5_UNORM: + return PIPE_FORMAT_A1B5G5R5_UNORM; + case PIPE_FORMAT_X8B8G8R8_SINT: + return PIPE_FORMAT_A8B8G8R8_SINT; + case PIPE_FORMAT_B8G8R8X8_SNORM: + return PIPE_FORMAT_B8G8R8A8_SNORM; + case PIPE_FORMAT_B8G8R8X8_UINT: + return PIPE_FORMAT_B8G8R8A8_UINT; + case PIPE_FORMAT_B8G8R8X8_SINT: + return PIPE_FORMAT_B8G8R8A8_SINT; + case PIPE_FORMAT_X8R8G8B8_SNORM: + return PIPE_FORMAT_A8R8G8B8_SNORM; + case PIPE_FORMAT_X8R8G8B8_SINT: + return PIPE_FORMAT_A8R8G8B8_SINT; + case PIPE_FORMAT_R5G5B5X1_UNORM: + return PIPE_FORMAT_R5G5B5A1_UNORM; + case PIPE_FORMAT_X1R5G5B5_UNORM: + return PIPE_FORMAT_A1R5G5B5_UNORM; + case PIPE_FORMAT_R4G4B4X4_UNORM: + return PIPE_FORMAT_R4G4B4A4_UNORM; + case PIPE_FORMAT_B10G10R10X2_SNORM: + return PIPE_FORMAT_B10G10R10A2_SNORM; + case PIPE_FORMAT_R10G10B10X2_SINT: + return PIPE_FORMAT_R10G10B10A2_SINT; + case PIPE_FORMAT_B10G10R10X2_SINT: + return PIPE_FORMAT_B10G10R10A2_SINT; + default: { + const struct util_format_description *desc = util_format_description(format); + + /* Assert that the format doesn't contain X instead of A. */ + assert(desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS || + (desc->channel[0].type != UTIL_FORMAT_TYPE_VOID && + desc->channel[desc->nr_channels - 1].type != UTIL_FORMAT_TYPE_VOID)); + return format; + } + } +} diff --git a/src/util/format/u_format.h b/src/util/format/u_format.h index 56cb7a70b97..b2f5e51f9a8 100644 --- a/src/util/format/u_format.h +++ b/src/util/format/u_format.h @@ -1693,6 +1693,9 @@ util_format_rgb_to_bgr(enum pipe_format format); enum pipe_format util_format_snorm_to_unorm(enum pipe_format format); +enum pipe_format +util_format_rgbx_to_rgba(enum pipe_format format); + #ifdef __cplusplus } // extern "C" { #endif |