summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/intel/vulkan/anv_formats.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c
index 049ffe17ac0..9db80ba14e3 100644
--- a/src/intel/vulkan/anv_formats.c
+++ b/src/intel/vulkan/anv_formats.c
@@ -45,7 +45,7 @@
#define RGB1 _ISL_SWIZZLE(RED, GREEN, BLUE, ONE)
#define swiz_fmt(__vk_fmt, __hw_fmt, __swizzle) \
- [__vk_fmt] = { \
+ [VK_ENUM_OFFSET(__vk_fmt)] = { \
.isl_format = __hw_fmt, \
.swizzle = __swizzle, \
}
@@ -58,7 +58,7 @@
* other. The reason for this is that, for packed formats, the ISL (and
* bspec) names are in LSB -> MSB order while VK formats are MSB -> LSB.
*/
-static const struct anv_format anv_formats[] = {
+static const struct anv_format main_formats[] = {
fmt(VK_FORMAT_UNDEFINED, ISL_FORMAT_UNSUPPORTED),
fmt(VK_FORMAT_R4G4_UNORM_PACK8, ISL_FORMAT_UNSUPPORTED),
fmt(VK_FORMAT_R4G4B4A4_UNORM_PACK16, ISL_FORMAT_A4B4G4R4_UNORM),
@@ -251,13 +251,30 @@ static const struct anv_format anv_formats[] = {
#undef fmt
+static const struct {
+ const struct anv_format *formats;
+ uint32_t n_formats;
+} anv_formats[] = {
+ [0] = { .formats = main_formats, .n_formats = ARRAY_SIZE(main_formats), },
+};
+
+static struct anv_format
+vk_to_anv_format(VkFormat vk_format)
+{
+ uint32_t enum_offset = VK_ENUM_OFFSET(vk_format);
+ uint32_t ext_number = VK_ENUM_EXTENSION(vk_format);
+
+ if (ext_number >= ARRAY_SIZE(anv_formats) ||
+ enum_offset >= anv_formats[ext_number].n_formats)
+ return (struct anv_format) { .isl_format = ISL_FORMAT_UNSUPPORTED };
+
+ return anv_formats[ext_number].formats[enum_offset];
+}
+
static bool
format_supported(VkFormat vk_format)
{
- if (vk_format >= ARRAY_SIZE(anv_formats))
- return false;
-
- return anv_formats[vk_format].isl_format != ISL_FORMAT_UNSUPPORTED;
+ return vk_to_anv_format(vk_format).isl_format != ISL_FORMAT_UNSUPPORTED;
}
/**
@@ -267,10 +284,10 @@ struct anv_format
anv_get_format(const struct gen_device_info *devinfo, VkFormat vk_format,
VkImageAspectFlags aspect, VkImageTiling tiling)
{
- if (!format_supported(vk_format))
- return anv_formats[VK_FORMAT_UNDEFINED];
+ struct anv_format format = vk_to_anv_format(vk_format);
- struct anv_format format = anv_formats[vk_format];
+ if (format.isl_format == ISL_FORMAT_UNSUPPORTED)
+ return format;
if (aspect == VK_IMAGE_ASPECT_STENCIL_BIT) {
assert(vk_format_aspects(vk_format) & VK_IMAGE_ASPECT_STENCIL_BIT);
@@ -553,7 +570,7 @@ anv_get_image_format_properties(
* * This field cannot be ASTC format if the Surface Type is SURFTYPE_1D.
*/
if (info->type == VK_IMAGE_TYPE_1D &&
- isl_format_is_compressed(anv_formats[info->format].isl_format)) {
+ isl_format_is_compressed(vk_to_anv_format(info->format).isl_format)) {
goto unsupported;
}