layers: Add state-dependent image aspect/format checks
diff --git a/layers/vk_layer_utils.cpp b/layers/vk_layer_utils.cpp
index c4d10f6..b0a483a 100644
--- a/layers/vk_layer_utils.cpp
+++ b/layers/vk_layer_utils.cpp
@@ -210,16 +210,20 @@
{ 4, 4 }, // [VK_FORMAT_B10G10R10A2_SINT]
};
-// Return true if format is a depth-stencil format
-bool vk_format_is_ds(VkFormat format)
+// Return true if format is a depth or stencil format
+bool vk_format_is_depth_or_stencil(VkFormat format)
+{
+ return (vk_format_is_depth_and_stencil(format) ||
+ vk_format_is_depth_only(format) ||
+ vk_format_is_stencil_only(format));
+}
+
+// Return true if format contains depth and stencil information
+bool vk_format_is_depth_and_stencil(VkFormat format)
{
bool is_ds = false;
switch (format) {
- case VK_FORMAT_D16_UNORM:
- case VK_FORMAT_D24_UNORM_X8:
- case VK_FORMAT_D32_SFLOAT:
- case VK_FORMAT_S8_UINT:
case VK_FORMAT_D16_UNORM_S8_UINT:
case VK_FORMAT_D24_UNORM_S8_UINT:
case VK_FORMAT_D32_SFLOAT_S8_UINT:
@@ -228,10 +232,33 @@
default:
break;
}
-
return is_ds;
}
+// Return true if format is a stencil-only format
+bool vk_format_is_stencil_only(VkFormat format)
+{
+ return (format == VK_FORMAT_S8_UINT);
+}
+
+// Return true if format is a depth-only format
+bool vk_format_is_depth_only(VkFormat format)
+{
+ bool is_depth = false;
+
+ switch (format) {
+ case VK_FORMAT_D16_UNORM:
+ case VK_FORMAT_D24_UNORM_X8:
+ case VK_FORMAT_D32_SFLOAT:
+ is_depth = true;
+ break;
+ default:
+ break;
+ }
+
+ return is_depth;
+}
+
// Return true if format is of time UNORM
bool vk_format_is_norm(VkFormat format)
{
@@ -305,51 +332,73 @@
return is_norm;
};
+
// Return true if format is an integer format
bool vk_format_is_int(VkFormat format)
{
- bool is_int = false;
+ return (vk_format_is_sint(format) || vk_format_is_uint(format));
+}
+
+// Return true if format is an unsigned integer format
+bool vk_format_is_uint(VkFormat format)
+{
+ bool is_uint = false;
switch (format) {
case VK_FORMAT_R8_UINT:
- case VK_FORMAT_R8_SINT:
case VK_FORMAT_R8G8_UINT:
- case VK_FORMAT_R8G8_SINT:
case VK_FORMAT_R8G8B8_UINT:
- case VK_FORMAT_R8G8B8_SINT:
case VK_FORMAT_R8G8B8A8_UINT:
- case VK_FORMAT_R8G8B8A8_SINT:
case VK_FORMAT_R10G10B10A2_UINT:
- case VK_FORMAT_R10G10B10A2_SINT:
case VK_FORMAT_R16_UINT:
- case VK_FORMAT_R16_SINT:
case VK_FORMAT_R16G16_UINT:
- case VK_FORMAT_R16G16_SINT:
case VK_FORMAT_R16G16B16_UINT:
- case VK_FORMAT_R16G16B16_SINT:
case VK_FORMAT_R16G16B16A16_UINT:
- case VK_FORMAT_R16G16B16A16_SINT:
case VK_FORMAT_R32_UINT:
- case VK_FORMAT_R32_SINT:
case VK_FORMAT_R32G32_UINT:
- case VK_FORMAT_R32G32_SINT:
case VK_FORMAT_R32G32B32_UINT:
- case VK_FORMAT_R32G32B32_SINT:
case VK_FORMAT_R32G32B32A32_UINT:
- case VK_FORMAT_R32G32B32A32_SINT:
case VK_FORMAT_B8G8R8_UINT:
- case VK_FORMAT_B8G8R8_SINT:
case VK_FORMAT_B8G8R8A8_UINT:
- case VK_FORMAT_B8G8R8A8_SINT:
case VK_FORMAT_B10G10R10A2_UINT:
- case VK_FORMAT_B10G10R10A2_SINT:
- is_int = true;
+ is_uint = true;
break;
default:
break;
}
- return is_int;
+ return is_uint;
+}
+
+// Return true if format is a signed integer format
+bool vk_format_is_sint(VkFormat format)
+{
+ bool is_sint = false;
+
+ switch (format) {
+ case VK_FORMAT_R8_SINT:
+ case VK_FORMAT_R8G8_SINT:
+ case VK_FORMAT_R8G8B8_SINT:
+ case VK_FORMAT_R8G8B8A8_SINT:
+ case VK_FORMAT_R10G10B10A2_SINT:
+ case VK_FORMAT_R16_SINT:
+ case VK_FORMAT_R16G16_SINT:
+ case VK_FORMAT_R16G16B16_SINT:
+ case VK_FORMAT_R16G16B16A16_SINT:
+ case VK_FORMAT_R32_SINT:
+ case VK_FORMAT_R32G32_SINT:
+ case VK_FORMAT_R32G32B32_SINT:
+ case VK_FORMAT_R32G32B32A32_SINT:
+ case VK_FORMAT_B8G8R8_SINT:
+ case VK_FORMAT_B8G8R8A8_SINT:
+ case VK_FORMAT_B10G10R10A2_SINT:
+ is_sint = true;
+ break;
+ default:
+ break;
+ }
+
+ return is_sint;
}
// Return true if format is a floating-point format