layers: Verify memory is bound to images used to update descriptors
authorTobin Ehlis <tobine@google.com>
Wed, 21 Sep 2016 15:19:15 +0000 (09:19 -0600)
committerTobin Ehlis <tobine@google.com>
Thu, 22 Sep 2016 13:55:28 +0000 (07:55 -0600)
Fixes #663

For vkUpdateDescriptorSets() calls that include an image, verify that memory is bound to the image.

layers/core_validation_types.h
layers/descriptor_sets.cpp

index 5d38a1a..52aad3d 100644 (file)
@@ -676,6 +676,7 @@ VkSwapchainKHR getSwapchainFromImage(const layer_data *, VkImage);
 SWAPCHAIN_NODE *getSwapchainNode(const layer_data *, VkSwapchainKHR);
 void invalidateCommandBuffers(std::unordered_set<GLOBAL_CB_NODE *>, VK_OBJECT);
 bool ValidateMemoryIsBoundToBuffer(const layer_data *, const BUFFER_NODE *, const char *);
+bool ValidateMemoryIsBoundToImage(const layer_data *, const IMAGE_NODE *, const char *);
 void AddCommandBufferBindingSampler(GLOBAL_CB_NODE *, SAMPLER_NODE *);
 void AddCommandBufferBindingImage(const layer_data *, GLOBAL_CB_NODE *, IMAGE_NODE *);
 void AddCommandBufferBindingImageView(const layer_data *, GLOBAL_CB_NODE *, IMAGE_VIEW_STATE *);
index f02da6b..e017f0e 100644 (file)
@@ -689,6 +689,9 @@ bool cvdescriptorset::ValidateImageUpdate(VkImageView image_view, VkImageLayout
     if (image_node) {
         format = image_node->createInfo.format;
         usage = image_node->createInfo.usage;
+        // Validate that memory is bound to image
+        if (ValidateMemoryIsBoundToImage(dev_data, image_node, "vkUpdateDescriptorSets()"))
+            return false;
     } else {
         // Also need to check the swapchains.
         auto swapchain = getSwapchainFromImage(dev_data, image);