From 50563f48368d75281bc2fb1c3407dc531ce28910 Mon Sep 17 00:00:00 2001 From: spencer-lunarg Date: Wed, 5 Mar 2025 23:22:24 -0500 Subject: [PATCH] format: Fix DepthStencil to Color compatible check --- include/vulkan/utility/vk_format_utils.h | 42 +++++++++++--------- scripts/generators/format_utils_generator.py | 42 +++++++++++--------- tests/test_formats.cpp | 22 ++++++---- 3 files changed, 63 insertions(+), 43 deletions(-) diff --git a/include/vulkan/utility/vk_format_utils.h b/include/vulkan/utility/vk_format_utils.h index aa0bdbc..5d8a853 100644 --- a/include/vulkan/utility/vk_format_utils.h +++ b/include/vulkan/utility/vk_format_utils.h @@ -263,7 +263,7 @@ inline VkExtent2D vkuFindMultiplaneExtentDivisors(VkFormat mp_fmt, VkImageAspect // From table in spec vkspec.html#formats-compatible-zs-color // Introduced in VK_KHR_maintenance8 to allow copying between color and depth/stencil formats -inline bool vkuFormatIsDepthStencilWithColorSizeCompatible(VkFormat color_format, VkFormat ds_format); +inline bool vkuFormatIsDepthStencilWithColorSizeCompatible(VkFormat color_format, VkFormat ds_format, VkImageAspectFlags aspect_mask); // Returns the count of components in a VkFormat inline uint32_t vkuFormatComponentCount(VkFormat format); @@ -2046,24 +2046,30 @@ inline VkExtent2D vkuFindMultiplaneExtentDivisors(VkFormat mp_fmt, VkImageAspect } // TODO - This should be generated, but will need updating the spec XML and table -inline bool vkuFormatIsDepthStencilWithColorSizeCompatible(VkFormat color_format, VkFormat ds_format) { - switch (ds_format) { - case VK_FORMAT_D32_SFLOAT: - case VK_FORMAT_D32_SFLOAT_S8_UINT: - return color_format == VK_FORMAT_R32_SFLOAT || color_format == VK_FORMAT_R32_SINT || color_format == VK_FORMAT_R32_UINT; - case VK_FORMAT_X8_D24_UNORM_PACK32: - case VK_FORMAT_D24_UNORM_S8_UINT: - return color_format == VK_FORMAT_R32_SFLOAT || color_format == VK_FORMAT_R32_SINT || color_format == VK_FORMAT_R32_UINT; - case VK_FORMAT_D16_UNORM: - case VK_FORMAT_D16_UNORM_S8_UINT: - return color_format == VK_FORMAT_R16_SFLOAT || color_format == VK_FORMAT_R16_UNORM || - color_format == VK_FORMAT_R16_SNORM || color_format == VK_FORMAT_R16_UINT || color_format == VK_FORMAT_R16_SINT; - case VK_FORMAT_S8_UINT: - return color_format == VK_FORMAT_R8_UINT || color_format == VK_FORMAT_R8_SINT || - color_format == VK_FORMAT_R8_UNORM || color_format == VK_FORMAT_R8_SNORM; - default: - return false; +// Some few case don't have an aspect mask, so might need to check both the Depth and Stencil possiblity +inline bool vkuFormatIsDepthStencilWithColorSizeCompatible(VkFormat color_format, VkFormat ds_format, VkImageAspectFlags aspect_mask) { + bool valid = false; + + if (aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) { + if (ds_format == VK_FORMAT_S8_UINT || ds_format == VK_FORMAT_D16_UNORM_S8_UINT || + ds_format == VK_FORMAT_D24_UNORM_S8_UINT || ds_format == VK_FORMAT_D32_SFLOAT_S8_UINT) { + valid |= (color_format == VK_FORMAT_R8_UINT || color_format == VK_FORMAT_R8_SINT || + color_format == VK_FORMAT_R8_UNORM || color_format == VK_FORMAT_R8_SNORM); + } } + + if (aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) { + if (ds_format == VK_FORMAT_D32_SFLOAT || ds_format == VK_FORMAT_D32_SFLOAT_S8_UINT || + ds_format == VK_FORMAT_X8_D24_UNORM_PACK32 || ds_format == VK_FORMAT_D24_UNORM_S8_UINT) { + valid |= (color_format == VK_FORMAT_R32_SFLOAT || color_format == VK_FORMAT_R32_SINT || color_format == VK_FORMAT_R32_UINT); + } + if (ds_format == VK_FORMAT_D16_UNORM || ds_format == VK_FORMAT_D16_UNORM_S8_UINT) { + valid |= (color_format == VK_FORMAT_R16_SFLOAT || color_format == VK_FORMAT_R16_UNORM || + color_format == VK_FORMAT_R16_SNORM || color_format == VK_FORMAT_R16_UINT || color_format == VK_FORMAT_R16_SINT); + } + } + + return valid; } inline uint32_t vkuFormatComponentCount(VkFormat format) { return vkuGetFormatInfo(format).component_count; } diff --git a/scripts/generators/format_utils_generator.py b/scripts/generators/format_utils_generator.py index ed2cdd8..bdf857d 100644 --- a/scripts/generators/format_utils_generator.py +++ b/scripts/generators/format_utils_generator.py @@ -209,7 +209,7 @@ inline VkExtent2D vkuFindMultiplaneExtentDivisors(VkFormat mp_fmt, VkImageAspect // From table in spec vkspec.html#formats-compatible-zs-color // Introduced in VK_KHR_maintenance8 to allow copying between color and depth/stencil formats -inline bool vkuFormatIsDepthStencilWithColorSizeCompatible(VkFormat color_format, VkFormat ds_format); +inline bool vkuFormatIsDepthStencilWithColorSizeCompatible(VkFormat color_format, VkFormat ds_format, VkImageAspectFlags aspect_mask); // Returns the count of components in a VkFormat inline uint32_t vkuFormatComponentCount(VkFormat format); @@ -570,24 +570,30 @@ inline VkExtent2D vkuFindMultiplaneExtentDivisors(VkFormat mp_fmt, VkImageAspect } // TODO - This should be generated, but will need updating the spec XML and table -inline bool vkuFormatIsDepthStencilWithColorSizeCompatible(VkFormat color_format, VkFormat ds_format) { - switch (ds_format) { - case VK_FORMAT_D32_SFLOAT: - case VK_FORMAT_D32_SFLOAT_S8_UINT: - return color_format == VK_FORMAT_R32_SFLOAT || color_format == VK_FORMAT_R32_SINT || color_format == VK_FORMAT_R32_UINT; - case VK_FORMAT_X8_D24_UNORM_PACK32: - case VK_FORMAT_D24_UNORM_S8_UINT: - return color_format == VK_FORMAT_R32_SFLOAT || color_format == VK_FORMAT_R32_SINT || color_format == VK_FORMAT_R32_UINT; - case VK_FORMAT_D16_UNORM: - case VK_FORMAT_D16_UNORM_S8_UINT: - return color_format == VK_FORMAT_R16_SFLOAT || color_format == VK_FORMAT_R16_UNORM || - color_format == VK_FORMAT_R16_SNORM || color_format == VK_FORMAT_R16_UINT || color_format == VK_FORMAT_R16_SINT; - case VK_FORMAT_S8_UINT: - return color_format == VK_FORMAT_R8_UINT || color_format == VK_FORMAT_R8_SINT || - color_format == VK_FORMAT_R8_UNORM || color_format == VK_FORMAT_R8_SNORM; - default: - return false; +// Some few case don't have an aspect mask, so might need to check both the Depth and Stencil possiblity +inline bool vkuFormatIsDepthStencilWithColorSizeCompatible(VkFormat color_format, VkFormat ds_format, VkImageAspectFlags aspect_mask) { + bool valid = false; + + if (aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) { + if (ds_format == VK_FORMAT_S8_UINT || ds_format == VK_FORMAT_D16_UNORM_S8_UINT || + ds_format == VK_FORMAT_D24_UNORM_S8_UINT || ds_format == VK_FORMAT_D32_SFLOAT_S8_UINT) { + valid |= (color_format == VK_FORMAT_R8_UINT || color_format == VK_FORMAT_R8_SINT || + color_format == VK_FORMAT_R8_UNORM || color_format == VK_FORMAT_R8_SNORM); + } } + + if (aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) { + if (ds_format == VK_FORMAT_D32_SFLOAT || ds_format == VK_FORMAT_D32_SFLOAT_S8_UINT || + ds_format == VK_FORMAT_X8_D24_UNORM_PACK32 || ds_format == VK_FORMAT_D24_UNORM_S8_UINT) { + valid |= (color_format == VK_FORMAT_R32_SFLOAT || color_format == VK_FORMAT_R32_SINT || color_format == VK_FORMAT_R32_UINT); + } + if (ds_format == VK_FORMAT_D16_UNORM || ds_format == VK_FORMAT_D16_UNORM_S8_UINT) { + valid |= (color_format == VK_FORMAT_R16_SFLOAT || color_format == VK_FORMAT_R16_UNORM || + color_format == VK_FORMAT_R16_SNORM || color_format == VK_FORMAT_R16_UINT || color_format == VK_FORMAT_R16_SINT); + } + } + + return valid; } inline uint32_t vkuFormatComponentCount(VkFormat format) { return vkuGetFormatInfo(format).component_count; } diff --git a/tests/test_formats.cpp b/tests/test_formats.cpp index 2ec5a52..7fa66d1 100644 --- a/tests/test_formats.cpp +++ b/tests/test_formats.cpp @@ -413,15 +413,23 @@ TEST(format_utils, vkuFindMultiplaneExtentDivisors) { } TEST(format_utils, vkuFormatIsDepthStencilWithColorSizeCompatible) { + EXPECT_FALSE(vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16, + VK_FORMAT_D16_UNORM, VK_IMAGE_ASPECT_DEPTH_BIT)); EXPECT_FALSE( - vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16, VK_FORMAT_D16_UNORM)); - EXPECT_FALSE(vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_D16_UNORM, VK_FORMAT_R16_SFLOAT)); - EXPECT_FALSE(vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_R8_UINT, VK_FORMAT_D16_UNORM_S8_UINT)); - EXPECT_FALSE(vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_R16_UNORM, VK_FORMAT_S8_UINT)); + vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_D16_UNORM, VK_FORMAT_R16_SFLOAT, VK_IMAGE_ASPECT_DEPTH_BIT)); + EXPECT_FALSE( + vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_R8_UINT, VK_FORMAT_D16_UNORM_S8_UINT, VK_IMAGE_ASPECT_DEPTH_BIT)); + EXPECT_FALSE(vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_R16_UNORM, VK_FORMAT_S8_UINT, VK_IMAGE_ASPECT_DEPTH_BIT)); - EXPECT_TRUE(vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_R16_SFLOAT, VK_FORMAT_D16_UNORM)); - EXPECT_TRUE(vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_R16_UNORM, VK_FORMAT_D16_UNORM_S8_UINT)); - EXPECT_TRUE(vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_R8_UINT, VK_FORMAT_S8_UINT)); + EXPECT_TRUE( + vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_R16_SFLOAT, VK_FORMAT_D16_UNORM, VK_IMAGE_ASPECT_DEPTH_BIT)); + EXPECT_TRUE(vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_R8_UINT, VK_FORMAT_D16_UNORM_S8_UINT, + VK_IMAGE_ASPECT_STENCIL_BIT)); + EXPECT_TRUE(vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_R16_UNORM, VK_FORMAT_D16_UNORM_S8_UINT, + VK_IMAGE_ASPECT_DEPTH_BIT)); + EXPECT_TRUE(vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_R16_UNORM, VK_FORMAT_D16_UNORM_S8_UINT, + VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)); + EXPECT_TRUE(vkuFormatIsDepthStencilWithColorSizeCompatible(VK_FORMAT_R8_UINT, VK_FORMAT_S8_UINT, VK_IMAGE_ASPECT_STENCIL_BIT)); } TEST(format_utils, vkuFormatComponentCount) {