layers: LX160, Validate Descriptor Set Image Aspects
Validated that Descriptor Sets do not have both the STENCIL and
DEPTH aspect bits set in their imageViews.
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
old mode 100644
new mode 100755
index 63cf634..368493e
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -869,6 +869,31 @@
(*pNewNode)->pNext = NULL;
return skipCall;
}
+
+static VkBool32 validateDescriptorSetImageView(VkDevice device, uint32_t writeDsCount, const VkWriteDescriptorSet *pWDS)
+{
+ VkBool32 skipCall = VK_FALSE;
+ layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
+
+ // Check ImageAspects of each descriptorSet in each writeDescriptorSet array
+ for (uint32_t i = 0; i < writeDsCount; i++) {
+ for (uint32_t j = 0; j < pWDS[i].count; j++) {
+ const VkDescriptorInfo *dInfo = &pWDS[i].pDescriptors[j];
+ auto imageViewItem = dev_data->imageViewMap.find(dInfo->imageView.handle);
+ if (imageViewItem != dev_data->imageViewMap.end()) {
+ VkImageAspectFlags flags = ((*imageViewItem).second)->subresourceRange.aspectMask;
+ if ((flags & VK_IMAGE_ASPECT_DEPTH_BIT) &&
+ (flags & VK_IMAGE_ASPECT_STENCIL_BIT)) {
+ skipCall |= log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_IMAGE_VIEW, dInfo->imageView.handle, 0,
+ DRAWSTATE_INVALID_IMAGE_ASPECT, "DS", "vkUpdateDescriptorSets: DesriptorSet[%d] in WriteDesriptorSet[%d] "
+ "has ImageView with both STENCIL and DEPTH aspects set", i, j);
+ }
+ }
+ }
+ }
+ return skipCall;
+}
+
// update DS mappings based on ppUpdateArray
static VkBool32 dsUpdate(layer_data* my_data, VkDevice device, VkStructureType type, uint32_t updateCount, const void* pUpdateArray)
{
@@ -876,10 +901,12 @@
const VkCopyDescriptorSet *pCDS = NULL;
VkBool32 skipCall = VK_FALSE;
- if (type == VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET)
- pWDS = (const VkWriteDescriptorSet *) pUpdateArray;
- else
- pCDS = (const VkCopyDescriptorSet *) pUpdateArray;
+ if (type == VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET) {
+ pWDS = (const VkWriteDescriptorSet *)pUpdateArray;
+ skipCall |= validateDescriptorSetImageView(device, updateCount, pWDS);
+ } else {
+ pCDS = (const VkCopyDescriptorSet *)pUpdateArray;
+ }
loader_platform_thread_lock_mutex(&globalLock);
LAYOUT_NODE* pLayout = NULL;