blob: d23c9ff3fc624e8fb564373d1b8652317c5b5b6d [file] [log] [blame]
Mike Stroyan845bdc42015-11-02 15:30:20 -07001/*
2 * Vulkan
3 *
4 * Copyright (C) 2015 Valve, Inc.
5 * Copyright (C) 2016 Google, Inc.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
24 */
25#include <stdio.h>
26#include <stdlib.h>
27#include <string.h>
28#include <unordered_map>
29#include <list>
Mike Stroyan845bdc42015-11-02 15:30:20 -070030
Dustin Graves899960f2016-02-05 15:53:12 -070031#include "vk_loader_platform.h"
Mike Stroyan3409fcd2016-01-29 15:11:28 -070032#include "vulkan/vk_layer.h"
Mike Stroyan845bdc42015-11-02 15:30:20 -070033#include "vk_layer_config.h"
34#include "vk_layer_extension_utils.h"
35#include "vk_layer_utils.h"
36#include "vk_enum_validate_helper.h"
37#include "vk_struct_validate_helper.h"
38#include "vk_layer_table.h"
39#include "vk_layer_logging.h"
40#include "threading.h"
Mike Stroyan845bdc42015-11-02 15:30:20 -070041#include "vk_dispatch_table_helper.h"
42#include "vk_struct_string_helper_cpp.h"
43#include "vk_layer_data.h"
Mark Lobodzinski1079e1b2016-03-15 14:21:59 -060044#include "vk_layer_utils.h"
Mike Stroyan845bdc42015-11-02 15:30:20 -070045
46#include "thread_check.h"
47
Jon Ashburn5484e0c2016-03-08 17:48:44 -070048static void initThreading(layer_data *my_data, const VkAllocationCallbacks *pAllocator) {
Mike Stroyan845bdc42015-11-02 15:30:20 -070049
Mark Lobodzinski1079e1b2016-03-15 14:21:59 -060050 layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "google_threading");
Mike Stroyan845bdc42015-11-02 15:30:20 -070051}
52
Jon Ashburn5484e0c2016-03-08 17:48:44 -070053VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
54vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
Mike Stroyan845bdc42015-11-02 15:30:20 -070055 VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
56
57 assert(chain_info->u.pLayerInfo);
58 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -070059 PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
Mike Stroyan845bdc42015-11-02 15:30:20 -070060 if (fpCreateInstance == NULL) {
61 return VK_ERROR_INITIALIZATION_FAILED;
62 }
63
64 // Advance the link info for the next element on the chain
65 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
66
67 VkResult result = fpCreateInstance(pCreateInfo, pAllocator, pInstance);
68 if (result != VK_SUCCESS)
69 return result;
70
71 layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map);
72 my_data->instance_dispatch_table = new VkLayerInstanceDispatchTable;
73 layer_init_instance_dispatch_table(*pInstance, my_data->instance_dispatch_table, fpGetInstanceProcAddr);
74
Jon Ashburn5484e0c2016-03-08 17:48:44 -070075 my_data->report_data = debug_report_create_instance(my_data->instance_dispatch_table, *pInstance,
76 pCreateInfo->enabledExtensionCount, pCreateInfo->ppEnabledExtensionNames);
Mike Stroyan845bdc42015-11-02 15:30:20 -070077 initThreading(my_data, pAllocator);
78 return result;
79}
80
Jon Ashburn5484e0c2016-03-08 17:48:44 -070081VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
Mike Stroyan845bdc42015-11-02 15:30:20 -070082 dispatch_key key = get_dispatch_key(instance);
83 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
84 VkLayerInstanceDispatchTable *pTable = my_data->instance_dispatch_table;
Mike Stroyana7bf3282016-02-04 16:39:53 -070085 startWriteObject(my_data, instance);
Mike Stroyan845bdc42015-11-02 15:30:20 -070086 pTable->DestroyInstance(instance, pAllocator);
Mike Stroyana7bf3282016-02-04 16:39:53 -070087 finishWriteObject(my_data, instance);
Mike Stroyan845bdc42015-11-02 15:30:20 -070088
89 // Clean up logging callback, if any
90 while (my_data->logging_callback.size() > 0) {
91 VkDebugReportCallbackEXT callback = my_data->logging_callback.back();
92 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
93 my_data->logging_callback.pop_back();
94 }
95
96 layer_debug_report_destroy_instance(my_data->report_data);
97 delete my_data->instance_dispatch_table;
98 layer_data_map.erase(key);
Mike Stroyan845bdc42015-11-02 15:30:20 -070099}
100
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700101VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
102 const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700103 VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
104
105 assert(chain_info->u.pLayerInfo);
106 PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr;
107 PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700108 PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice");
Mike Stroyan845bdc42015-11-02 15:30:20 -0700109 if (fpCreateDevice == NULL) {
110 return VK_ERROR_INITIALIZATION_FAILED;
111 }
112
113 // Advance the link info for the next element on the chain
114 chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
115
116 VkResult result = fpCreateDevice(gpu, pCreateInfo, pAllocator, pDevice);
117 if (result != VK_SUCCESS) {
118 return result;
119 }
120
121 layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map);
122 layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map);
123
124 // Setup device dispatch table
125 my_device_data->device_dispatch_table = new VkLayerDispatchTable;
126 layer_init_device_dispatch_table(*pDevice, my_device_data->device_dispatch_table, fpGetDeviceProcAddr);
127
128 my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice);
129 return result;
130}
131
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700132VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700133 dispatch_key key = get_dispatch_key(device);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700134 layer_data *dev_data = get_my_data_ptr(key, layer_data_map);
Mike Stroyana7bf3282016-02-04 16:39:53 -0700135 startWriteObject(dev_data, device);
Mike Stroyan845bdc42015-11-02 15:30:20 -0700136 dev_data->device_dispatch_table->DestroyDevice(device, pAllocator);
Mike Stroyana7bf3282016-02-04 16:39:53 -0700137 finishWriteObject(dev_data, device);
Mike Stroyan845bdc42015-11-02 15:30:20 -0700138 layer_data_map.erase(key);
139}
140
Courtney Goeltzenleuchterf3d39702016-02-12 13:30:20 -0700141static const VkExtensionProperties threading_extensions[] = {
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700142 {VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}};
Mike Stroyan845bdc42015-11-02 15:30:20 -0700143
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700144VK_LAYER_EXPORT VkResult VKAPI_CALL
145vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) {
Courtney Goeltzenleuchterf3d39702016-02-12 13:30:20 -0700146 return util_GetExtensionProperties(ARRAY_SIZE(threading_extensions), threading_extensions, pCount, pProperties);
Mike Stroyan845bdc42015-11-02 15:30:20 -0700147}
148
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700149static const VkLayerProperties globalLayerProps[] = {{
150 "VK_LAYER_GOOGLE_threading",
Jon Ashburndc9111c2016-03-22 12:57:13 -0600151 VK_LAYER_API_VERSION, // specVersion
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700152 1, "Google Validation Layer",
153}};
Mike Stroyan845bdc42015-11-02 15:30:20 -0700154
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700155VK_LAYER_EXPORT VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700156 return util_GetLayerProperties(ARRAY_SIZE(globalLayerProps), globalLayerProps, pCount, pProperties);
157}
158
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700159static const VkLayerProperties deviceLayerProps[] = {{
160 "VK_LAYER_GOOGLE_threading",
Jon Ashburndc9111c2016-03-22 12:57:13 -0600161 VK_LAYER_API_VERSION, // specVersion
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700162 1, "Google Validation Layer",
163}};
Courtney Goeltzenleuchtera4784fb2016-02-12 13:22:04 -0700164
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700165VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
166 const char *pLayerName, uint32_t *pCount,
167 VkExtensionProperties *pProperties) {
Courtney Goeltzenleuchterf3d39702016-02-12 13:30:20 -0700168 if (pLayerName == NULL) {
169 dispatch_key key = get_dispatch_key(physicalDevice);
170 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700171 return my_data->instance_dispatch_table->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);
Courtney Goeltzenleuchterf3d39702016-02-12 13:30:20 -0700172 } else {
173 // Threading layer does not have any device extensions
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700174 return util_GetExtensionProperties(0, nullptr, pCount, pProperties);
Courtney Goeltzenleuchterf3d39702016-02-12 13:30:20 -0700175 }
176}
177
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700178VK_LAYER_EXPORT VkResult VKAPI_CALL
179vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700180 return util_GetLayerProperties(ARRAY_SIZE(deviceLayerProps), deviceLayerProps, pCount, pProperties);
181}
182
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700183static inline PFN_vkVoidFunction layer_intercept_proc(const char *name) {
184 for (int i = 0; i < sizeof(procmap) / sizeof(procmap[0]); i++) {
185 if (!strcmp(name, procmap[i].name))
186 return procmap[i].pFunc;
Mike Stroyan845bdc42015-11-02 15:30:20 -0700187 }
188 return NULL;
189}
190
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700191static inline PFN_vkVoidFunction layer_intercept_instance_proc(const char *name) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700192 if (!name || name[0] != 'v' || name[1] != 'k')
193 return NULL;
194
195 name += 2;
196 if (!strcmp(name, "CreateInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700197 return (PFN_vkVoidFunction)vkCreateInstance;
Mike Stroyan845bdc42015-11-02 15:30:20 -0700198 if (!strcmp(name, "DestroyInstance"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700199 return (PFN_vkVoidFunction)vkDestroyInstance;
Mike Stroyan845bdc42015-11-02 15:30:20 -0700200 if (!strcmp(name, "EnumerateInstanceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700201 return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties;
Mike Stroyan845bdc42015-11-02 15:30:20 -0700202 if (!strcmp(name, "EnumerateInstanceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700203 return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties;
Courtney Goeltzenleuchterf3d39702016-02-12 13:30:20 -0700204 if (!strcmp(name, "EnumerateDeviceExtensionProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700205 return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties;
Mike Stroyan845bdc42015-11-02 15:30:20 -0700206 if (!strcmp(name, "EnumerateDeviceLayerProperties"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700207 return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties;
Mike Stroyan845bdc42015-11-02 15:30:20 -0700208 if (!strcmp(name, "CreateDevice"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700209 return (PFN_vkVoidFunction)vkCreateDevice;
Mike Stroyan845bdc42015-11-02 15:30:20 -0700210 if (!strcmp(name, "GetInstanceProcAddr"))
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700211 return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
Mike Stroyan845bdc42015-11-02 15:30:20 -0700212
213 return NULL;
214}
215
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700216VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700217 PFN_vkVoidFunction addr;
218 layer_data *dev_data;
219 if (device == VK_NULL_HANDLE) {
220 return NULL;
221 }
222
223 addr = layer_intercept_proc(funcName);
224 if (addr)
225 return addr;
226
227 dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700228 VkLayerDispatchTable *pTable = dev_data->device_dispatch_table;
Mike Stroyan845bdc42015-11-02 15:30:20 -0700229
230 if (pTable->GetDeviceProcAddr == NULL)
231 return NULL;
232 return pTable->GetDeviceProcAddr(device, funcName);
233}
234
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700235VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700236 PFN_vkVoidFunction addr;
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700237 layer_data *my_data;
Mike Stroyan845bdc42015-11-02 15:30:20 -0700238
Mike Stroyan845bdc42015-11-02 15:30:20 -0700239 addr = layer_intercept_instance_proc(funcName);
240 if (addr) {
241 return addr;
242 }
243
Karl Schultz929f8792016-02-07 15:17:26 -0700244 if (instance == VK_NULL_HANDLE) {
245 return NULL;
246 }
247
Mike Stroyan845bdc42015-11-02 15:30:20 -0700248 my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
249 addr = debug_report_get_instance_proc_addr(my_data->report_data, funcName);
250 if (addr) {
251 return addr;
252 }
253
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700254 VkLayerInstanceDispatchTable *pTable = my_data->instance_dispatch_table;
Mike Stroyan845bdc42015-11-02 15:30:20 -0700255 if (pTable->GetInstanceProcAddr == NULL) {
256 return NULL;
257 }
258 return pTable->GetInstanceProcAddr(instance, funcName);
259}
260
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700261VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
262vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,
263 const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700264 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
265 startReadObject(my_data, instance);
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700266 VkResult result =
267 my_data->instance_dispatch_table->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);
Mike Stroyan845bdc42015-11-02 15:30:20 -0700268 if (VK_SUCCESS == result) {
269 result = layer_create_msg_callback(my_data->report_data, pCreateInfo, pAllocator, pMsgCallback);
270 }
271 finishReadObject(my_data, instance);
272 return result;
273}
274
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700275VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL
276vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks *pAllocator) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700277 layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);
278 startReadObject(my_data, instance);
279 startWriteObject(my_data, callback);
280 my_data->instance_dispatch_table->DestroyDebugReportCallbackEXT(instance, callback, pAllocator);
281 layer_destroy_msg_callback(my_data->report_data, callback, pAllocator);
282 finishReadObject(my_data, instance);
283 finishWriteObject(my_data, callback);
284}
285
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700286VkResult VKAPI_CALL
287vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700288 dispatch_key key = get_dispatch_key(device);
289 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
290 VkLayerDispatchTable *pTable = my_data->device_dispatch_table;
291 VkResult result;
292 startReadObject(my_data, device);
293 startWriteObject(my_data, pAllocateInfo->commandPool);
294
295 result = pTable->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
296 finishReadObject(my_data, device);
297 finishWriteObject(my_data, pAllocateInfo->commandPool);
298
299 // Record mapping from command buffer to command pool
300 if (VK_SUCCESS == result) {
Michael Mc Donnell75ecdb72016-04-03 14:47:51 -0700301 for (uint32_t index = 0; index < pAllocateInfo->commandBufferCount; index++) {
Jeremy Hayesb350beb2016-04-12 13:48:52 -0600302 std::lock_guard<std::mutex> lock(global_lock);
Mike Stroyan845bdc42015-11-02 15:30:20 -0700303 command_pool_map[pCommandBuffers[index]] = pAllocateInfo->commandPool;
304 }
305 }
306
307 return result;
308}
309
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700310void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount,
311 const VkCommandBuffer *pCommandBuffers) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700312 dispatch_key key = get_dispatch_key(device);
313 layer_data *my_data = get_my_data_ptr(key, layer_data_map);
314 VkLayerDispatchTable *pTable = my_data->device_dispatch_table;
315 const bool lockCommandPool = false; // pool is already directly locked
316 startReadObject(my_data, device);
317 startWriteObject(my_data, commandPool);
Michael Mc Donnell75ecdb72016-04-03 14:47:51 -0700318 for (uint32_t index = 0; index < commandBufferCount; index++) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700319 startWriteObject(my_data, pCommandBuffers[index], lockCommandPool);
320 }
321
Jon Ashburn5484e0c2016-03-08 17:48:44 -0700322 pTable->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
Mike Stroyan845bdc42015-11-02 15:30:20 -0700323 finishReadObject(my_data, device);
324 finishWriteObject(my_data, commandPool);
Michael Mc Donnell75ecdb72016-04-03 14:47:51 -0700325 for (uint32_t index = 0; index < commandBufferCount; index++) {
Mike Stroyan845bdc42015-11-02 15:30:20 -0700326 finishWriteObject(my_data, pCommandBuffers[index], lockCommandPool);
Jeremy Hayesb350beb2016-04-12 13:48:52 -0600327 std::lock_guard<std::mutex> lock(global_lock);
Mike Stroyan845bdc42015-11-02 15:30:20 -0700328 command_pool_map.erase(pCommandBuffers[index]);
Mike Stroyan845bdc42015-11-02 15:30:20 -0700329 }
330}