summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2022-07-18 21:26:41 -0400
committerMarge Bot <emma+marge@anholt.net>2022-08-03 00:57:16 +0000
commit2208ff7a5be652a539d7419df6e08de5c335e455 (patch)
tree9764899c6e4bfaa5903411c09be65d386f97c336
parent91a3a38d5c0cfa89d95b6c7e16deabd212f90524 (diff)
downloadmesa-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.c94
-rw-r--r--src/util/format/u_format.h3
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