layers: Validate image with external memory layout
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 1530e6b..0d56b2d 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -2060,12 +2060,27 @@
}
const auto external_memory_create_info_nv = LvlFindInChain<VkExternalMemoryImageCreateInfoNV>(pCreateInfo->pNext);
- if (external_memory_create_info_nv != nullptr) {
- const auto external_memory_create_info = LvlFindInChain<VkExternalMemoryImageCreateInfo>(pCreateInfo->pNext);
- if (external_memory_create_info != nullptr) {
- skip |= LogError(device, "VUID-VkImageCreateInfo-pNext-00988",
- "vkCreateImage(): VkImageCreateInfo struct has both VkExternalMemoryImageCreateInfoNV and "
- "VkExternalMemoryImageCreateInfo chained structs.");
+ const auto external_memory_create_info = LvlFindInChain<VkExternalMemoryImageCreateInfo>(pCreateInfo->pNext);
+ if (external_memory_create_info_nv != nullptr && external_memory_create_info != nullptr) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-pNext-00988",
+ "vkCreateImage(): VkImageCreateInfo struct has both VkExternalMemoryImageCreateInfoNV and "
+ "VkExternalMemoryImageCreateInfo chained structs.");
+ }
+ if (external_memory_create_info) {
+ if (external_memory_create_info->handleTypes != 0 && pCreateInfo->initialLayout != VK_IMAGE_LAYOUT_UNDEFINED) {
+ skip |= LogError(
+ device, "VUID-VkImageCreateInfo-pNext-01443",
+ "vkCreateImage: VkImageCreateInfo pNext chain includes VkExternalMemoryImageCreateInfo with handleTypes %" PRIu32
+ " but pCreateInfo->initialLayout is %s.",
+ external_memory_create_info->handleTypes, string_VkImageLayout(pCreateInfo->initialLayout));
+ }
+ } else if (external_memory_create_info_nv) {
+ if (external_memory_create_info_nv->handleTypes != 0 && pCreateInfo->initialLayout != VK_IMAGE_LAYOUT_UNDEFINED) {
+ skip |= LogError(
+ device, "VUID-VkImageCreateInfo-pNext-01443",
+ "vkCreateImage: VkImageCreateInfo pNext chain includes VkExternalMemoryImageCreateInfoNV with handleTypes %" PRIu32
+ " but pCreateInfo->initialLayout is %s.",
+ external_memory_create_info_nv->handleTypes, string_VkImageLayout(pCreateInfo->initialLayout));
}
}