layers: Deep copy pQueueFamilyIndicies
authorPeter Lohrmann <plohrmann@gmail.com>
Fri, 17 Mar 2017 23:58:14 +0000 (16:58 -0700)
committerMark Lobodzinski <mark@lunarg.com>
Wed, 22 Mar 2017 18:07:28 +0000 (12:07 -0600)
IMAGE_STATE/BUFFER_STATE classes did not make deep copies of the
createinfo.pQueueFamilyIndices array, which could cause invalid
warnings to be reported to the user.

Change-Id: I7ebda777de9decb0c532a4999f78573460197fd7

layers/core_validation_types.h

index 73b5c80..f2659ae 100644 (file)
@@ -221,12 +221,27 @@ class BUFFER_STATE : public BINDABLE {
     VkBuffer buffer;
     VkBufferCreateInfo createInfo;
     BUFFER_STATE(VkBuffer buff, const VkBufferCreateInfo *pCreateInfo) : buffer(buff), createInfo(*pCreateInfo) {
+        if (createInfo.queueFamilyIndexCount > 0) {
+            uint32_t *pQueueFamilyIndices = new uint32_t[createInfo.queueFamilyIndexCount];
+            for (uint32_t i = 0; i < createInfo.queueFamilyIndexCount; i++) {
+                pQueueFamilyIndices[i] = pCreateInfo->pQueueFamilyIndices[i];
+            }
+            createInfo.pQueueFamilyIndices = pQueueFamilyIndices;
+        }
+
         if (createInfo.flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
             sparse = true;
         }
     };
 
     BUFFER_STATE(BUFFER_STATE const &rh_obj) = delete;
+
+    ~BUFFER_STATE() {
+        if (createInfo.queueFamilyIndexCount > 0) {
+            delete createInfo.pQueueFamilyIndices;
+            createInfo.pQueueFamilyIndices = nullptr;
+        }
+    };
 };
 
 class BUFFER_VIEW_STATE : public BASE_NODE {
@@ -252,12 +267,27 @@ class IMAGE_STATE : public BINDABLE {
     bool acquired;  // If this is a swapchain image, has it been acquired by the app.
     IMAGE_STATE(VkImage img, const VkImageCreateInfo *pCreateInfo)
         : image(img), createInfo(*pCreateInfo), valid(false), acquired(false) {
+        if (createInfo.queueFamilyIndexCount > 0) {
+            uint32_t *pQueueFamilyIndices = new uint32_t[createInfo.queueFamilyIndexCount];
+            for (uint32_t i = 0; i < createInfo.queueFamilyIndexCount; i++) {
+                pQueueFamilyIndices[i] = pCreateInfo->pQueueFamilyIndices[i];
+            }
+            createInfo.pQueueFamilyIndices = pQueueFamilyIndices;
+        }
+
         if (createInfo.flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
             sparse = true;
         }
     };
 
     IMAGE_STATE(IMAGE_STATE const &rh_obj) = delete;
+
+    ~IMAGE_STATE() {
+        if (createInfo.queueFamilyIndexCount > 0) {
+            delete createInfo.pQueueFamilyIndices;
+            createInfo.pQueueFamilyIndices = nullptr;
+        }
+    };
 };
 
 class IMAGE_VIEW_STATE : public BASE_NODE {