layers: Fix AllocateDescriptorSets in threading
authorMark Lobodzinski <mark@lunarg.com>
Thu, 16 Feb 2017 18:45:27 +0000 (11:45 -0700)
committerMark Lobodzinski <mark@lunarg.com>
Thu, 16 Feb 2017 21:00:50 +0000 (14:00 -0700)
Needed to special case this routine to skip validating objects
before creation. Caught in CTS testing.

Change-Id: Ic1c1b69bd1d75a5742c8b709624153db6af71885

layers/threading.cpp
scripts/threading_generator.py

index 927aac3..0c46ef0 100644 (file)
@@ -360,6 +360,29 @@ VKAPI_ATTR VkResult VKAPI_CALL AllocateCommandBuffers(VkDevice device, const VkC
     return result;
 }
 
+VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo,
+                                                      VkDescriptorSet *pDescriptorSets) {
+    dispatch_key key = get_dispatch_key(device);
+    layer_data *my_data = GetLayerDataPtr(key, layer_data_map);
+    VkLayerDispatchTable *pTable = my_data->device_dispatch_table;
+    VkResult result;
+    bool threadChecks = startMultiThread();
+    if (threadChecks) {
+        startReadObject(my_data, device);
+        startWriteObject(my_data, pAllocateInfo->descriptorPool);
+        // Host access to pAllocateInfo::descriptorPool must be externally synchronized
+    }
+    result = pTable->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
+    if (threadChecks) {
+        finishReadObject(my_data, device);
+        finishWriteObject(my_data, pAllocateInfo->descriptorPool);
+        // Host access to pAllocateInfo::descriptorPool must be externally synchronized
+    } else {
+        finishMultiThread();
+    }
+    return result;
+}
+
 VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
                                               const VkCommandBuffer *pCommandBuffers) {
     dispatch_key key = get_dispatch_key(device);
index 553fde9..fc9174b 100644 (file)
@@ -382,6 +382,7 @@ class ThreadOutputGenerator(OutputGenerator):
             'vkFreeCommandBuffers',
             'vkCreateDebugReportCallbackEXT',
             'vkDestroyDebugReportCallbackEXT',
+            'vkAllocateDescriptorSets',
         ]
         if name in special_functions:
             decls = self.makeCDecls(cmdinfo.elem)