diff options
-rw-r--r-- | layers/generated/chassis.cpp | 9 | ||||
-rw-r--r-- | layers/generated/chassis.h | 27 | ||||
-rw-r--r-- | layers/generated/layer_chassis_dispatch.cpp | 611 | ||||
-rw-r--r-- | layers/vk_layer_utils.h | 124 | ||||
-rw-r--r-- | scripts/layer_chassis_dispatch_generator.py | 162 | ||||
-rw-r--r-- | scripts/layer_chassis_generator.py | 36 |
6 files changed, 482 insertions, 487 deletions
diff --git a/layers/generated/chassis.cpp b/layers/generated/chassis.cpp index 5632c549c..ddf37ba32 100644 --- a/layers/generated/chassis.cpp +++ b/layers/generated/chassis.cpp @@ -33,10 +33,11 @@ std::unordered_map<void*, ValidationObject*> layer_data_map; -// Global unique object identifier. All increments must be guarded by a lock. -uint64_t global_unique_id = 1; -// Map uniqueID to actual object handle -std::unordered_map<uint64_t, uint64_t> unique_id_mapping; +// Global unique object identifier. +std::atomic<uint64_t> global_unique_id(1ULL); +// Map uniqueID to actual object handle. Accesses to the map itself are +// internally synchronized. +vl_concurrent_unordered_map<uint64_t, uint64_t, 4> unique_id_mapping; // TODO: This variable controls handle wrapping -- in the future it should be hooked // up to the new VALIDATION_FEATURES extension. Temporarily, control with a compile-time flag. diff --git a/layers/generated/chassis.h b/layers/generated/chassis.h index fec2a8851..4e81b7f49 100644 --- a/layers/generated/chassis.h +++ b/layers/generated/chassis.h @@ -25,6 +25,7 @@ #define NOMINMAX +#include <atomic> #include <mutex> #include <cinttypes> #include <stdio.h> @@ -52,8 +53,8 @@ #include "vk_typemap_helper.h" -extern uint64_t global_unique_id; -extern std::unordered_map<uint64_t, uint64_t> unique_id_mapping; +extern std::atomic<uint64_t> global_unique_id; +extern vl_concurrent_unordered_map<uint64_t, uint64_t, 4> unique_id_mapping; @@ -2467,7 +2468,7 @@ class ValidationObject { // Handle Wrapping Data // Reverse map display handles - std::unordered_map<VkDisplayKHR, uint64_t> display_id_reverse_mapping; + vl_concurrent_unordered_map<VkDisplayKHR, uint64_t, 0> display_id_reverse_mapping; // Wrapping Descriptor Template Update structures requires access to the template createinfo structs std::unordered_map<uint64_t, std::unique_ptr<TEMPLATE_STATE>> desc_template_createinfo_map; struct SubpassesUsageStates { @@ -2483,31 +2484,33 @@ class ValidationObject { std::unordered_map<VkDescriptorPool, std::unordered_set<VkDescriptorSet>> pool_descriptor_sets_map; - // Unwrap a handle. Must hold lock. + // Unwrap a handle. template <typename HandleType> HandleType Unwrap(HandleType wrappedHandle) { - // TODO: don't use operator[] here. - return (HandleType)unique_id_mapping[reinterpret_cast<uint64_t const &>(wrappedHandle)]; + auto iter = unique_id_mapping.find(reinterpret_cast<uint64_t const &>(wrappedHandle)); + if (iter == unique_id_mapping.end()) + return (HandleType)0; + return (HandleType)iter->second; } - // Wrap a newly created handle with a new unique ID, and return the new ID -- must hold lock. + // Wrap a newly created handle with a new unique ID, and return the new ID. template <typename HandleType> HandleType WrapNew(HandleType newlyCreatedHandle) { auto unique_id = global_unique_id++; - unique_id_mapping[unique_id] = reinterpret_cast<uint64_t const &>(newlyCreatedHandle); + unique_id_mapping.insert_or_assign(unique_id, reinterpret_cast<uint64_t const &>(newlyCreatedHandle)); return (HandleType)unique_id; } - // Specialized handling for VkDisplayKHR. Adds an entry to enable reverse-lookup. Must hold lock. + // Specialized handling for VkDisplayKHR. Adds an entry to enable reverse-lookup. VkDisplayKHR WrapDisplay(VkDisplayKHR newlyCreatedHandle, ValidationObject *map_data) { auto unique_id = global_unique_id++; - unique_id_mapping[unique_id] = reinterpret_cast<uint64_t const &>(newlyCreatedHandle); - map_data->display_id_reverse_mapping[newlyCreatedHandle] = unique_id; + unique_id_mapping.insert_or_assign(unique_id, reinterpret_cast<uint64_t const &>(newlyCreatedHandle)); + map_data->display_id_reverse_mapping.insert_or_assign(newlyCreatedHandle, unique_id); return (VkDisplayKHR)unique_id; } // VkDisplayKHR objects don't have a single point of creation, so we need to see if one already exists in the map before - // creating another. Must hold lock. + // creating another. VkDisplayKHR MaybeWrapDisplay(VkDisplayKHR handle, ValidationObject *map_data) { // See if this display is already known auto it = map_data->display_id_reverse_mapping.find(handle); diff --git a/layers/generated/layer_chassis_dispatch.cpp b/layers/generated/layer_chassis_dispatch.cpp index 2816ebad3..b92b9bf10 100644 --- a/layers/generated/layer_chassis_dispatch.cpp +++ b/layers/generated/layer_chassis_dispatch.cpp @@ -30,7 +30,18 @@ // This intentionally includes a cpp file #include "vk_safe_struct.cpp" -std::mutex dispatch_lock; +// shared_mutex support added in MSVC 2015 update 2 +#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 + #include <shared_mutex> + typedef std::shared_mutex dispatch_lock_t; + typedef std::shared_lock<dispatch_lock_t> read_dispatch_lock_guard_t; + typedef std::unique_lock<dispatch_lock_t> write_dispatch_lock_guard_t; +#else + typedef std::mutex dispatch_lock_t; + typedef std::unique_lock<dispatch_lock_t> read_dispatch_lock_guard_t; + typedef std::unique_lock<dispatch_lock_t> write_dispatch_lock_guard_t; +#endif +dispatch_lock_t dispatch_lock; // Unique Objects pNext extension handling function void WrapPnextChainHandles(ValidationObject *layer_data, const void *pNext) { @@ -157,7 +168,6 @@ VkResult DispatchCreateComputePipelines(VkDevice device, VkPipelineCache pipelin pCreateInfos, pAllocator, pPipelines); safe_VkComputePipelineCreateInfo *local_pCreateInfos = NULL; if (pCreateInfos) { - std::lock_guard<std::mutex> lock(dispatch_lock); local_pCreateInfos = new safe_VkComputePipelineCreateInfo[createInfoCount]; for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) { local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]); @@ -173,7 +183,6 @@ VkResult DispatchCreateComputePipelines(VkDevice device, VkPipelineCache pipelin } } if (pipelineCache) { - std::lock_guard<std::mutex> lock(dispatch_lock); pipelineCache = layer_data->Unwrap(pipelineCache); } @@ -181,7 +190,6 @@ VkResult DispatchCreateComputePipelines(VkDevice device, VkPipelineCache pipelin local_pCreateInfos->ptr(), pAllocator, pPipelines); delete[] local_pCreateInfos; { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t i = 0; i < createInfoCount; ++i) { if (pPipelines[i] != VK_NULL_HANDLE) { pPipelines[i] = layer_data->WrapNew(pPipelines[i]); @@ -200,7 +208,7 @@ VkResult DispatchCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipeli safe_VkGraphicsPipelineCreateInfo *local_pCreateInfos = nullptr; if (pCreateInfos) { local_pCreateInfos = new safe_VkGraphicsPipelineCreateInfo[createInfoCount]; - std::lock_guard<std::mutex> lock(dispatch_lock); + read_dispatch_lock_guard_t lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) { bool uses_color_attachment = false; bool uses_depthstencil_attachment = false; @@ -236,7 +244,6 @@ VkResult DispatchCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipeli } } if (pipelineCache) { - std::lock_guard<std::mutex> lock(dispatch_lock); pipelineCache = layer_data->Unwrap(pipelineCache); } @@ -244,7 +251,6 @@ VkResult DispatchCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipeli local_pCreateInfos->ptr(), pAllocator, pPipelines); delete[] local_pCreateInfos; { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t i = 0; i < createInfoCount; ++i) { if (pPipelines[i] != VK_NULL_HANDLE) { pPipelines[i] = layer_data->WrapNew(pPipelines[i]); @@ -279,7 +285,7 @@ VkResult DispatchCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo VkResult result = layer_data->device_dispatch_table.CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass); if (!wrap_handles) return result; if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); UpdateCreateRenderPassState(layer_data, pCreateInfo, *pRenderPass); *pRenderPass = layer_data->WrapNew(*pRenderPass); } @@ -292,7 +298,7 @@ VkResult DispatchCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateI VkResult result = layer_data->device_dispatch_table.CreateRenderPass2KHR(device, pCreateInfo, pAllocator, pRenderPass); if (!wrap_handles) return result; if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); UpdateCreateRenderPassState(layer_data, pCreateInfo, *pRenderPass); *pRenderPass = layer_data->WrapNew(*pRenderPass); } @@ -302,14 +308,18 @@ VkResult DispatchCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateI void DispatchDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyRenderPass(device, renderPass, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t renderPass_id = reinterpret_cast<uint64_t &>(renderPass); - renderPass = (VkRenderPass)unique_id_mapping[renderPass_id]; - unique_id_mapping.erase(renderPass_id); - lock.unlock(); + + auto iter = unique_id_mapping.pop(renderPass_id); + if (iter != unique_id_mapping.end()) { + renderPass = (VkRenderPass)iter->second; + } else { + renderPass = (VkRenderPass)0; + } + layer_data->device_dispatch_table.DestroyRenderPass(device, renderPass, pAllocator); - lock.lock(); + write_dispatch_lock_guard_t lock(dispatch_lock); layer_data->renderpasses_states.erase(renderPass); } @@ -319,7 +329,6 @@ VkResult DispatchCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfo if (!wrap_handles) return layer_data->device_dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain); safe_VkSwapchainCreateInfoKHR *local_pCreateInfo = NULL; if (pCreateInfo) { - std::lock_guard<std::mutex> lock(dispatch_lock); local_pCreateInfo = new safe_VkSwapchainCreateInfoKHR(pCreateInfo); local_pCreateInfo->oldSwapchain = layer_data->Unwrap(pCreateInfo->oldSwapchain); // Surface is instance-level object @@ -330,7 +339,6 @@ VkResult DispatchCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfo delete local_pCreateInfo; if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSwapchain = layer_data->WrapNew(*pSwapchain); } return result; @@ -344,7 +352,6 @@ VkResult DispatchCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCo pSwapchains); safe_VkSwapchainCreateInfoKHR *local_pCreateInfos = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfos) { local_pCreateInfos = new safe_VkSwapchainCreateInfoKHR[swapchainCount]; for (uint32_t i = 0; i < swapchainCount; ++i) { @@ -363,7 +370,6 @@ VkResult DispatchCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCo pAllocator, pSwapchains); delete[] local_pCreateInfos; if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t i = 0; i < swapchainCount; i++) { pSwapchains[i] = layer_data->WrapNew(pSwapchains[i]); } @@ -378,14 +384,13 @@ VkResult DispatchGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain return layer_data->device_dispatch_table.GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages); VkSwapchainKHR wrapped_swapchain_handle = swapchain; if (VK_NULL_HANDLE != swapchain) { - std::lock_guard<std::mutex> lock(dispatch_lock); swapchain = layer_data->Unwrap(swapchain); } VkResult result = layer_data->device_dispatch_table.GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages); if ((VK_SUCCESS == result) || (VK_INCOMPLETE == result)) { if ((*pSwapchainImageCount > 0) && pSwapchainImages) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); auto &wrapped_swapchain_image_handles = layer_data->swapchain_wrapped_image_handle_map[wrapped_swapchain_handle]; for (uint32_t i = static_cast<uint32_t>(wrapped_swapchain_image_handles.size()); i < *pSwapchainImageCount; i++) { wrapped_swapchain_image_handles.emplace_back(layer_data->WrapNew(pSwapchainImages[i])); @@ -401,18 +406,24 @@ VkResult DispatchGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain void DispatchDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroySwapchainKHR(device, swapchain, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); auto &image_array = layer_data->swapchain_wrapped_image_handle_map[swapchain]; for (auto &image_handle : image_array) { unique_id_mapping.erase(HandleToUint64(image_handle)); } layer_data->swapchain_wrapped_image_handle_map.erase(swapchain); + lock.unlock(); uint64_t swapchain_id = HandleToUint64(swapchain); - swapchain = (VkSwapchainKHR)unique_id_mapping[swapchain_id]; - unique_id_mapping.erase(swapchain_id); - lock.unlock(); + + auto iter = unique_id_mapping.pop(swapchain_id); + if (iter != unique_id_mapping.end()) { + swapchain = (VkSwapchainKHR)iter->second; + } else { + swapchain = (VkSwapchainKHR)0; + } + layer_data->device_dispatch_table.DestroySwapchainKHR(device, swapchain, pAllocator); } @@ -421,7 +432,6 @@ VkResult DispatchQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresent if (!wrap_handles) return layer_data->device_dispatch_table.QueuePresentKHR(queue, pPresentInfo); safe_VkPresentInfoKHR *local_pPresentInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pPresentInfo) { local_pPresentInfo = new safe_VkPresentInfoKHR(pPresentInfo); if (local_pPresentInfo->pWaitSemaphores) { @@ -452,18 +462,24 @@ VkResult DispatchQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresent void DispatchDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyDescriptorPool(device, descriptorPool, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); // remove references to implicitly freed descriptor sets for(auto descriptor_set : layer_data->pool_descriptor_sets_map[descriptorPool]) { unique_id_mapping.erase(reinterpret_cast<uint64_t &>(descriptor_set)); } layer_data->pool_descriptor_sets_map.erase(descriptorPool); + lock.unlock(); uint64_t descriptorPool_id = reinterpret_cast<uint64_t &>(descriptorPool); - descriptorPool = (VkDescriptorPool)unique_id_mapping[descriptorPool_id]; - unique_id_mapping.erase(descriptorPool_id); - lock.unlock(); + + auto iter = unique_id_mapping.pop(descriptorPool_id); + if (iter != unique_id_mapping.end()) { + descriptorPool = (VkDescriptorPool)iter->second; + } else { + descriptorPool = (VkDescriptorPool)0; + } + layer_data->device_dispatch_table.DestroyDescriptorPool(device, descriptorPool, pAllocator); } @@ -472,12 +488,11 @@ VkResult DispatchResetDescriptorPool(VkDevice device, VkDescriptorPool descripto if (!wrap_handles) return layer_data->device_dispatch_table.ResetDescriptorPool(device, descriptorPool, flags); VkDescriptorPool local_descriptor_pool = VK_NULL_HANDLE; { - std::lock_guard<std::mutex> lock(dispatch_lock); local_descriptor_pool = layer_data->Unwrap(descriptorPool); } VkResult result = layer_data->device_dispatch_table.ResetDescriptorPool(device, local_descriptor_pool, flags); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); // remove references to implicitly freed descriptor sets for(auto descriptor_set : layer_data->pool_descriptor_sets_map[descriptorPool]) { unique_id_mapping.erase(reinterpret_cast<uint64_t &>(descriptor_set)); @@ -494,7 +509,6 @@ VkResult DispatchAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAl if (!wrap_handles) return layer_data->device_dispatch_table.AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets); safe_VkDescriptorSetAllocateInfo *local_pAllocateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pAllocateInfo) { local_pAllocateInfo = new safe_VkDescriptorSetAllocateInfo(pAllocateInfo); if (pAllocateInfo->descriptorPool) { @@ -513,7 +527,7 @@ VkResult DispatchAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAl delete local_pAllocateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); auto &pool_descriptor_sets = layer_data->pool_descriptor_sets_map[pAllocateInfo->descriptorPool]; for (uint32_t index0 = 0; index0 < pAllocateInfo->descriptorSetCount; index0++) { pDescriptorSets[index0] = layer_data->WrapNew(pDescriptorSets[index0]); @@ -531,7 +545,6 @@ VkResult DispatchFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptor VkDescriptorSet *local_pDescriptorSets = NULL; VkDescriptorPool local_descriptor_pool = VK_NULL_HANDLE; { - std::lock_guard<std::mutex> lock(dispatch_lock); local_descriptor_pool = layer_data->Unwrap(descriptorPool); if (pDescriptorSets) { local_pDescriptorSets = new VkDescriptorSet[descriptorSetCount]; @@ -544,7 +557,7 @@ VkResult DispatchFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptor (const VkDescriptorSet *)local_pDescriptorSets); if (local_pDescriptorSets) delete[] local_pDescriptorSets; if ((VK_SUCCESS == result) && (pDescriptorSets)) { - std::unique_lock<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); auto &pool_descriptor_sets = layer_data->pool_descriptor_sets_map[descriptorPool]; for (uint32_t index0 = 0; index0 < descriptorSetCount; index0++) { VkDescriptorSet handle = pDescriptorSets[index0]; @@ -566,7 +579,6 @@ VkResult DispatchCreateDescriptorUpdateTemplate(VkDevice device, const VkDescrip pDescriptorUpdateTemplate); safe_VkDescriptorUpdateTemplateCreateInfo *local_create_info = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_create_info = new safe_VkDescriptorUpdateTemplateCreateInfo(pCreateInfo); if (pCreateInfo->descriptorSetLayout) { @@ -580,7 +592,7 @@ VkResult DispatchCreateDescriptorUpdateTemplate(VkDevice device, const VkDescrip VkResult result = layer_data->device_dispatch_table.CreateDescriptorUpdateTemplate(device, local_create_info->ptr(), pAllocator, pDescriptorUpdateTemplate); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); *pDescriptorUpdateTemplate = layer_data->WrapNew(*pDescriptorUpdateTemplate); // Shadow template createInfo for later updates @@ -600,7 +612,6 @@ VkResult DispatchCreateDescriptorUpdateTemplateKHR(VkDevice device, const VkDesc pDescriptorUpdateTemplate); safe_VkDescriptorUpdateTemplateCreateInfo *local_create_info = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_create_info = new safe_VkDescriptorUpdateTemplateCreateInfo(pCreateInfo); if (pCreateInfo->descriptorSetLayout) { @@ -614,7 +625,7 @@ VkResult DispatchCreateDescriptorUpdateTemplateKHR(VkDevice device, const VkDesc VkResult result = layer_data->device_dispatch_table.CreateDescriptorUpdateTemplateKHR(device, local_create_info->ptr(), pAllocator, pDescriptorUpdateTemplate); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); *pDescriptorUpdateTemplate = layer_data->WrapNew(*pDescriptorUpdateTemplate); // Shadow template createInfo for later updates @@ -630,12 +641,18 @@ void DispatchDestroyDescriptorUpdateTemplate(VkDevice device, VkDescriptorUpdate auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyDescriptorUpdateTemplate(device, descriptorUpdateTemplate, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); uint64_t descriptor_update_template_id = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); layer_data->desc_template_createinfo_map.erase(descriptor_update_template_id); - descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unique_id_mapping[descriptor_update_template_id]; - unique_id_mapping.erase(descriptor_update_template_id); lock.unlock(); + + auto iter = unique_id_mapping.pop(descriptor_update_template_id); + if (iter != unique_id_mapping.end()) { + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)iter->second; + } else { + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)0; + } + layer_data->device_dispatch_table.DestroyDescriptorUpdateTemplate(device, descriptorUpdateTemplate, pAllocator); } @@ -645,12 +662,18 @@ void DispatchDestroyDescriptorUpdateTemplateKHR(VkDevice device, VkDescriptorUpd auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); uint64_t descriptor_update_template_id = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); layer_data->desc_template_createinfo_map.erase(descriptor_update_template_id); - descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unique_id_mapping[descriptor_update_template_id]; - unique_id_mapping.erase(descriptor_update_template_id); lock.unlock(); + + auto iter = unique_id_mapping.pop(descriptor_update_template_id); + if (iter != unique_id_mapping.end()) { + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)iter->second; + } else { + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)0; + } + layer_data->device_dispatch_table.DestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator); } @@ -760,12 +783,13 @@ void DispatchUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet de return layer_data->device_dispatch_table.UpdateDescriptorSetWithTemplate(device, descriptorSet, descriptorUpdateTemplate, pData); uint64_t template_handle = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); + void *unwrapped_buffer = nullptr; { - std::lock_guard<std::mutex> lock(dispatch_lock); + read_dispatch_lock_guard_t lock(dispatch_lock); descriptorSet = layer_data->Unwrap(descriptorSet); - descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unique_id_mapping[template_handle]; + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)layer_data->Unwrap(descriptorUpdateTemplate); + unwrapped_buffer = BuildUnwrappedUpdateTemplateBuffer(layer_data, template_handle, pData); } - void *unwrapped_buffer = BuildUnwrappedUpdateTemplateBuffer(layer_data, template_handle, pData); layer_data->device_dispatch_table.UpdateDescriptorSetWithTemplate(device, descriptorSet, descriptorUpdateTemplate, unwrapped_buffer); free(unwrapped_buffer); } @@ -779,9 +803,9 @@ void DispatchUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet uint64_t template_handle = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); void *unwrapped_buffer = nullptr; { - std::lock_guard<std::mutex> lock(dispatch_lock); + read_dispatch_lock_guard_t lock(dispatch_lock); descriptorSet = layer_data->Unwrap(descriptorSet); - descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unique_id_mapping[template_handle]; + descriptorUpdateTemplate = layer_data->Unwrap(descriptorUpdateTemplate); unwrapped_buffer = BuildUnwrappedUpdateTemplateBuffer(layer_data, template_handle, pData); } layer_data->device_dispatch_table.UpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, unwrapped_buffer); @@ -798,7 +822,7 @@ void DispatchCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer, uint64_t template_handle = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); void *unwrapped_buffer = nullptr; { - std::lock_guard<std::mutex> lock(dispatch_lock); + read_dispatch_lock_guard_t lock(dispatch_lock); descriptorUpdateTemplate = layer_data->Unwrap(descriptorUpdateTemplate); layout = layer_data->Unwrap(layout); unwrapped_buffer = BuildUnwrappedUpdateTemplateBuffer(layer_data, template_handle, pData); @@ -815,7 +839,6 @@ VkResult DispatchGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physical layer_data->instance_dispatch_table.GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties); if (!wrap_handles) return result; if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pProperties) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { pProperties[idx0].display = layer_data->MaybeWrapDisplay(pProperties[idx0].display, layer_data); } @@ -830,7 +853,6 @@ VkResult DispatchGetPhysicalDeviceDisplayProperties2KHR(VkPhysicalDevice physica layer_data->instance_dispatch_table.GetPhysicalDeviceDisplayProperties2KHR(physicalDevice, pPropertyCount, pProperties); if (!wrap_handles) return result; if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pProperties) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { pProperties[idx0].displayProperties.display = layer_data->MaybeWrapDisplay(pProperties[idx0].displayProperties.display, layer_data); @@ -846,7 +868,6 @@ VkResult DispatchGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice phy layer_data->instance_dispatch_table.GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties); if (!wrap_handles) return result; if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pProperties) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { VkDisplayKHR &opt_display = pProperties[idx0].currentDisplay; if (opt_display) opt_display = layer_data->MaybeWrapDisplay(opt_display, layer_data); @@ -862,7 +883,6 @@ VkResult DispatchGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice ph pPropertyCount, pProperties); if (!wrap_handles) return result; if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pProperties) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { VkDisplayKHR &opt_display = pProperties[idx0].displayPlaneProperties.currentDisplay; if (opt_display) opt_display = layer_data->MaybeWrapDisplay(opt_display, layer_data); @@ -878,7 +898,6 @@ VkResult DispatchGetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDe pDisplayCount, pDisplays); if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pDisplays) { if (!wrap_handles) return result; - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t i = 0; i < *pDisplayCount; ++i) { if (pDisplays[i]) pDisplays[i] = layer_data->MaybeWrapDisplay(pDisplays[i], layer_data); } @@ -893,13 +912,11 @@ VkResult DispatchGetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, Vk return layer_data->instance_dispatch_table.GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties); { - std::lock_guard<std::mutex> lock(dispatch_lock); display = layer_data->Unwrap(display); } VkResult result = layer_data->instance_dispatch_table.GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties); if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pProperties) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { pProperties[idx0].displayMode = layer_data->WrapNew(pProperties[idx0].displayMode); } @@ -914,14 +931,12 @@ VkResult DispatchGetDisplayModeProperties2KHR(VkPhysicalDevice physicalDevice, V return layer_data->instance_dispatch_table.GetDisplayModeProperties2KHR(physicalDevice, display, pPropertyCount, pProperties); { - std::lock_guard<std::mutex> lock(dispatch_lock); display = layer_data->Unwrap(display); } VkResult result = layer_data->instance_dispatch_table.GetDisplayModeProperties2KHR(physicalDevice, display, pPropertyCount, pProperties); if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pProperties) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { pProperties[idx0].displayModeProperties.displayMode = layer_data->WrapNew(pProperties[idx0].displayModeProperties.displayMode); } @@ -934,7 +949,6 @@ VkResult DispatchDebugMarkerSetObjectTagEXT(VkDevice device, const VkDebugMarker if (!wrap_handles) return layer_data->device_dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo); safe_VkDebugMarkerObjectTagInfoEXT local_tag_info(pTagInfo); { - std::lock_guard<std::mutex> lock(dispatch_lock); auto it = unique_id_mapping.find(reinterpret_cast<uint64_t &>(local_tag_info.object)); if (it != unique_id_mapping.end()) { local_tag_info.object = it->second; @@ -950,7 +964,6 @@ VkResult DispatchDebugMarkerSetObjectNameEXT(VkDevice device, const VkDebugMarke if (!wrap_handles) return layer_data->device_dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo); safe_VkDebugMarkerObjectNameInfoEXT local_name_info(pNameInfo); { - std::lock_guard<std::mutex> lock(dispatch_lock); auto it = unique_id_mapping.find(reinterpret_cast<uint64_t &>(local_name_info.object)); if (it != unique_id_mapping.end()) { local_name_info.object = it->second; @@ -967,7 +980,6 @@ VkResult DispatchSetDebugUtilsObjectTagEXT(VkDevice device, const VkDebugUtilsOb if (!wrap_handles) return layer_data->device_dispatch_table.SetDebugUtilsObjectTagEXT(device, pTagInfo); safe_VkDebugUtilsObjectTagInfoEXT local_tag_info(pTagInfo); { - std::lock_guard<std::mutex> lock(dispatch_lock); auto it = unique_id_mapping.find(reinterpret_cast<uint64_t &>(local_tag_info.objectHandle)); if (it != unique_id_mapping.end()) { local_tag_info.objectHandle = it->second; @@ -983,7 +995,6 @@ VkResult DispatchSetDebugUtilsObjectNameEXT(VkDevice device, const VkDebugUtilsO if (!wrap_handles) return layer_data->device_dispatch_table.SetDebugUtilsObjectNameEXT(device, pNameInfo); safe_VkDebugUtilsObjectNameInfoEXT local_name_info(pNameInfo); { - std::lock_guard<std::mutex> lock(dispatch_lock); auto it = unique_id_mapping.find(reinterpret_cast<uint64_t &>(local_name_info.objectHandle)); if (it != unique_id_mapping.end()) { local_name_info.objectHandle = it->second; @@ -1127,7 +1138,6 @@ VkResult DispatchQueueSubmit( if (!wrap_handles) return layer_data->device_dispatch_table.QueueSubmit(queue, submitCount, pSubmits, fence); safe_VkSubmitInfo *local_pSubmits = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pSubmits) { local_pSubmits = new safe_VkSubmitInfo[submitCount]; for (uint32_t index0 = 0; index0 < submitCount; ++index0) { @@ -1182,7 +1192,6 @@ VkResult DispatchAllocateMemory( if (!wrap_handles) return layer_data->device_dispatch_table.AllocateMemory(device, pAllocateInfo, pAllocator, pMemory); safe_VkMemoryAllocateInfo *local_pAllocateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pAllocateInfo) { local_pAllocateInfo = new safe_VkMemoryAllocateInfo(pAllocateInfo); WrapPnextChainHandles(layer_data, local_pAllocateInfo->pNext); @@ -1193,7 +1202,6 @@ VkResult DispatchAllocateMemory( delete local_pAllocateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pMemory = layer_data->WrapNew(*pMemory); } return result; @@ -1206,11 +1214,13 @@ void DispatchFreeMemory( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.FreeMemory(device, memory, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t memory_id = reinterpret_cast<uint64_t &>(memory); - memory = (VkDeviceMemory)unique_id_mapping[memory_id]; - unique_id_mapping.erase(memory_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(memory_id); + if (iter != unique_id_mapping.end()) { + memory = (VkDeviceMemory)iter->second; + } else { + memory = (VkDeviceMemory)0; + } layer_data->device_dispatch_table.FreeMemory(device, memory, pAllocator); } @@ -1226,7 +1236,6 @@ VkResult DispatchMapMemory( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.MapMemory(device, memory, offset, size, flags, ppData); { - std::lock_guard<std::mutex> lock(dispatch_lock); memory = layer_data->Unwrap(memory); } VkResult result = layer_data->device_dispatch_table.MapMemory(device, memory, offset, size, flags, ppData); @@ -1241,7 +1250,6 @@ void DispatchUnmapMemory( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.UnmapMemory(device, memory); { - std::lock_guard<std::mutex> lock(dispatch_lock); memory = layer_data->Unwrap(memory); } layer_data->device_dispatch_table.UnmapMemory(device, memory); @@ -1257,7 +1265,6 @@ VkResult DispatchFlushMappedMemoryRanges( if (!wrap_handles) return layer_data->device_dispatch_table.FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges); safe_VkMappedMemoryRange *local_pMemoryRanges = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pMemoryRanges) { local_pMemoryRanges = new safe_VkMappedMemoryRange[memoryRangeCount]; for (uint32_t index0 = 0; index0 < memoryRangeCount; ++index0) { @@ -1284,7 +1291,6 @@ VkResult DispatchInvalidateMappedMemoryRanges( if (!wrap_handles) return layer_data->device_dispatch_table.InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges); safe_VkMappedMemoryRange *local_pMemoryRanges = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pMemoryRanges) { local_pMemoryRanges = new safe_VkMappedMemoryRange[memoryRangeCount]; for (uint32_t index0 = 0; index0 < memoryRangeCount; ++index0) { @@ -1310,7 +1316,6 @@ void DispatchGetDeviceMemoryCommitment( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes); { - std::lock_guard<std::mutex> lock(dispatch_lock); memory = layer_data->Unwrap(memory); } layer_data->device_dispatch_table.GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes); @@ -1326,7 +1331,6 @@ VkResult DispatchBindBufferMemory( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.BindBufferMemory(device, buffer, memory, memoryOffset); { - std::lock_guard<std::mutex> lock(dispatch_lock); buffer = layer_data->Unwrap(buffer); memory = layer_data->Unwrap(memory); } @@ -1344,7 +1348,6 @@ VkResult DispatchBindImageMemory( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.BindImageMemory(device, image, memory, memoryOffset); { - std::lock_guard<std::mutex> lock(dispatch_lock); image = layer_data->Unwrap(image); memory = layer_data->Unwrap(memory); } @@ -1361,7 +1364,6 @@ void DispatchGetBufferMemoryRequirements( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetBufferMemoryRequirements(device, buffer, pMemoryRequirements); { - std::lock_guard<std::mutex> lock(dispatch_lock); buffer = layer_data->Unwrap(buffer); } layer_data->device_dispatch_table.GetBufferMemoryRequirements(device, buffer, pMemoryRequirements); @@ -1376,7 +1378,6 @@ void DispatchGetImageMemoryRequirements( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetImageMemoryRequirements(device, image, pMemoryRequirements); { - std::lock_guard<std::mutex> lock(dispatch_lock); image = layer_data->Unwrap(image); } layer_data->device_dispatch_table.GetImageMemoryRequirements(device, image, pMemoryRequirements); @@ -1392,7 +1393,6 @@ void DispatchGetImageSparseMemoryRequirements( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements); { - std::lock_guard<std::mutex> lock(dispatch_lock); image = layer_data->Unwrap(image); } layer_data->device_dispatch_table.GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements); @@ -1424,7 +1424,6 @@ VkResult DispatchQueueBindSparse( if (!wrap_handles) return layer_data->device_dispatch_table.QueueBindSparse(queue, bindInfoCount, pBindInfo, fence); safe_VkBindSparseInfo *local_pBindInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pBindInfo) { local_pBindInfo = new safe_VkBindSparseInfo[bindInfoCount]; for (uint32_t index0 = 0; index0 < bindInfoCount; ++index0) { @@ -1502,7 +1501,6 @@ VkResult DispatchCreateFence( if (!wrap_handles) return layer_data->device_dispatch_table.CreateFence(device, pCreateInfo, pAllocator, pFence); VkResult result = layer_data->device_dispatch_table.CreateFence(device, pCreateInfo, pAllocator, pFence); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pFence = layer_data->WrapNew(*pFence); } return result; @@ -1515,11 +1513,13 @@ void DispatchDestroyFence( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyFence(device, fence, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t fence_id = reinterpret_cast<uint64_t &>(fence); - fence = (VkFence)unique_id_mapping[fence_id]; - unique_id_mapping.erase(fence_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(fence_id); + if (iter != unique_id_mapping.end()) { + fence = (VkFence)iter->second; + } else { + fence = (VkFence)0; + } layer_data->device_dispatch_table.DestroyFence(device, fence, pAllocator); } @@ -1533,7 +1533,6 @@ VkResult DispatchResetFences( if (!wrap_handles) return layer_data->device_dispatch_table.ResetFences(device, fenceCount, pFences); VkFence *local_pFences = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pFences) { local_pFences = new VkFence[fenceCount]; for (uint32_t index0 = 0; index0 < fenceCount; ++index0) { @@ -1554,7 +1553,6 @@ VkResult DispatchGetFenceStatus( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetFenceStatus(device, fence); { - std::lock_guard<std::mutex> lock(dispatch_lock); fence = layer_data->Unwrap(fence); } VkResult result = layer_data->device_dispatch_table.GetFenceStatus(device, fence); @@ -1573,7 +1571,6 @@ VkResult DispatchWaitForFences( if (!wrap_handles) return layer_data->device_dispatch_table.WaitForFences(device, fenceCount, pFences, waitAll, timeout); VkFence *local_pFences = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pFences) { local_pFences = new VkFence[fenceCount]; for (uint32_t index0 = 0; index0 < fenceCount; ++index0) { @@ -1597,7 +1594,6 @@ VkResult DispatchCreateSemaphore( if (!wrap_handles) return layer_data->device_dispatch_table.CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore); VkResult result = layer_data->device_dispatch_table.CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSemaphore = layer_data->WrapNew(*pSemaphore); } return result; @@ -1610,11 +1606,13 @@ void DispatchDestroySemaphore( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroySemaphore(device, semaphore, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t semaphore_id = reinterpret_cast<uint64_t &>(semaphore); - semaphore = (VkSemaphore)unique_id_mapping[semaphore_id]; - unique_id_mapping.erase(semaphore_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(semaphore_id); + if (iter != unique_id_mapping.end()) { + semaphore = (VkSemaphore)iter->second; + } else { + semaphore = (VkSemaphore)0; + } layer_data->device_dispatch_table.DestroySemaphore(device, semaphore, pAllocator); } @@ -1629,7 +1627,6 @@ VkResult DispatchCreateEvent( if (!wrap_handles) return layer_data->device_dispatch_table.CreateEvent(device, pCreateInfo, pAllocator, pEvent); VkResult result = layer_data->device_dispatch_table.CreateEvent(device, pCreateInfo, pAllocator, pEvent); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pEvent = layer_data->WrapNew(*pEvent); } return result; @@ -1642,11 +1639,13 @@ void DispatchDestroyEvent( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyEvent(device, event, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t event_id = reinterpret_cast<uint64_t &>(event); - event = (VkEvent)unique_id_mapping[event_id]; - unique_id_mapping.erase(event_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(event_id); + if (iter != unique_id_mapping.end()) { + event = (VkEvent)iter->second; + } else { + event = (VkEvent)0; + } layer_data->device_dispatch_table.DestroyEvent(device, event, pAllocator); } @@ -1658,7 +1657,6 @@ VkResult DispatchGetEventStatus( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetEventStatus(device, event); { - std::lock_guard<std::mutex> lock(dispatch_lock); event = layer_data->Unwrap(event); } VkResult result = layer_data->device_dispatch_table.GetEventStatus(device, event); @@ -1673,7 +1671,6 @@ VkResult DispatchSetEvent( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.SetEvent(device, event); { - std::lock_guard<std::mutex> lock(dispatch_lock); event = layer_data->Unwrap(event); } VkResult result = layer_data->device_dispatch_table.SetEvent(device, event); @@ -1688,7 +1685,6 @@ VkResult DispatchResetEvent( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.ResetEvent(device, event); { - std::lock_guard<std::mutex> lock(dispatch_lock); event = layer_data->Unwrap(event); } VkResult result = layer_data->device_dispatch_table.ResetEvent(device, event); @@ -1706,7 +1702,6 @@ VkResult DispatchCreateQueryPool( if (!wrap_handles) return layer_data->device_dispatch_table.CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool); VkResult result = layer_data->device_dispatch_table.CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pQueryPool = layer_data->WrapNew(*pQueryPool); } return result; @@ -1719,11 +1714,13 @@ void DispatchDestroyQueryPool( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyQueryPool(device, queryPool, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t queryPool_id = reinterpret_cast<uint64_t &>(queryPool); - queryPool = (VkQueryPool)unique_id_mapping[queryPool_id]; - unique_id_mapping.erase(queryPool_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(queryPool_id); + if (iter != unique_id_mapping.end()) { + queryPool = (VkQueryPool)iter->second; + } else { + queryPool = (VkQueryPool)0; + } layer_data->device_dispatch_table.DestroyQueryPool(device, queryPool, pAllocator); } @@ -1741,7 +1738,6 @@ VkResult DispatchGetQueryPoolResults( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags); { - std::lock_guard<std::mutex> lock(dispatch_lock); queryPool = layer_data->Unwrap(queryPool); } VkResult result = layer_data->device_dispatch_table.GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags); @@ -1759,7 +1755,6 @@ VkResult DispatchCreateBuffer( if (!wrap_handles) return layer_data->device_dispatch_table.CreateBuffer(device, pCreateInfo, pAllocator, pBuffer); VkResult result = layer_data->device_dispatch_table.CreateBuffer(device, pCreateInfo, pAllocator, pBuffer); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pBuffer = layer_data->WrapNew(*pBuffer); } return result; @@ -1772,11 +1767,13 @@ void DispatchDestroyBuffer( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyBuffer(device, buffer, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t buffer_id = reinterpret_cast<uint64_t &>(buffer); - buffer = (VkBuffer)unique_id_mapping[buffer_id]; - unique_id_mapping.erase(buffer_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(buffer_id); + if (iter != unique_id_mapping.end()) { + buffer = (VkBuffer)iter->second; + } else { + buffer = (VkBuffer)0; + } layer_data->device_dispatch_table.DestroyBuffer(device, buffer, pAllocator); } @@ -1791,7 +1788,6 @@ VkResult DispatchCreateBufferView( if (!wrap_handles) return layer_data->device_dispatch_table.CreateBufferView(device, pCreateInfo, pAllocator, pView); safe_VkBufferViewCreateInfo *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkBufferViewCreateInfo(pCreateInfo); if (pCreateInfo->buffer) { @@ -1804,7 +1800,6 @@ VkResult DispatchCreateBufferView( delete local_pCreateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pView = layer_data->WrapNew(*pView); } return result; @@ -1817,11 +1812,13 @@ void DispatchDestroyBufferView( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyBufferView(device, bufferView, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t bufferView_id = reinterpret_cast<uint64_t &>(bufferView); - bufferView = (VkBufferView)unique_id_mapping[bufferView_id]; - unique_id_mapping.erase(bufferView_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(bufferView_id); + if (iter != unique_id_mapping.end()) { + bufferView = (VkBufferView)iter->second; + } else { + bufferView = (VkBufferView)0; + } layer_data->device_dispatch_table.DestroyBufferView(device, bufferView, pAllocator); } @@ -1836,7 +1833,6 @@ VkResult DispatchCreateImage( if (!wrap_handles) return layer_data->device_dispatch_table.CreateImage(device, pCreateInfo, pAllocator, pImage); safe_VkImageCreateInfo *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkImageCreateInfo(pCreateInfo); WrapPnextChainHandles(layer_data, local_pCreateInfo->pNext); @@ -1847,7 +1843,6 @@ VkResult DispatchCreateImage( delete local_pCreateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pImage = layer_data->WrapNew(*pImage); } return result; @@ -1860,11 +1855,13 @@ void DispatchDestroyImage( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyImage(device, image, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t image_id = reinterpret_cast<uint64_t &>(image); - image = (VkImage)unique_id_mapping[image_id]; - unique_id_mapping.erase(image_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(image_id); + if (iter != unique_id_mapping.end()) { + image = (VkImage)iter->second; + } else { + image = (VkImage)0; + } layer_data->device_dispatch_table.DestroyImage(device, image, pAllocator); } @@ -1878,7 +1875,6 @@ void DispatchGetImageSubresourceLayout( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetImageSubresourceLayout(device, image, pSubresource, pLayout); { - std::lock_guard<std::mutex> lock(dispatch_lock); image = layer_data->Unwrap(image); } layer_data->device_dispatch_table.GetImageSubresourceLayout(device, image, pSubresource, pLayout); @@ -1895,7 +1891,6 @@ VkResult DispatchCreateImageView( if (!wrap_handles) return layer_data->device_dispatch_table.CreateImageView(device, pCreateInfo, pAllocator, pView); safe_VkImageViewCreateInfo *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkImageViewCreateInfo(pCreateInfo); if (pCreateInfo->image) { @@ -1909,7 +1904,6 @@ VkResult DispatchCreateImageView( delete local_pCreateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pView = layer_data->WrapNew(*pView); } return result; @@ -1922,11 +1916,13 @@ void DispatchDestroyImageView( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyImageView(device, imageView, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t imageView_id = reinterpret_cast<uint64_t &>(imageView); - imageView = (VkImageView)unique_id_mapping[imageView_id]; - unique_id_mapping.erase(imageView_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(imageView_id); + if (iter != unique_id_mapping.end()) { + imageView = (VkImageView)iter->second; + } else { + imageView = (VkImageView)0; + } layer_data->device_dispatch_table.DestroyImageView(device, imageView, pAllocator); } @@ -1941,7 +1937,6 @@ VkResult DispatchCreateShaderModule( if (!wrap_handles) return layer_data->device_dispatch_table.CreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule); safe_VkShaderModuleCreateInfo *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkShaderModuleCreateInfo(pCreateInfo); WrapPnextChainHandles(layer_data, local_pCreateInfo->pNext); @@ -1952,7 +1947,6 @@ VkResult DispatchCreateShaderModule( delete local_pCreateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pShaderModule = layer_data->WrapNew(*pShaderModule); } return result; @@ -1965,11 +1959,13 @@ void DispatchDestroyShaderModule( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyShaderModule(device, shaderModule, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t shaderModule_id = reinterpret_cast<uint64_t &>(shaderModule); - shaderModule = (VkShaderModule)unique_id_mapping[shaderModule_id]; - unique_id_mapping.erase(shaderModule_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(shaderModule_id); + if (iter != unique_id_mapping.end()) { + shaderModule = (VkShaderModule)iter->second; + } else { + shaderModule = (VkShaderModule)0; + } layer_data->device_dispatch_table.DestroyShaderModule(device, shaderModule, pAllocator); } @@ -1984,7 +1980,6 @@ VkResult DispatchCreatePipelineCache( if (!wrap_handles) return layer_data->device_dispatch_table.CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache); VkResult result = layer_data->device_dispatch_table.CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pPipelineCache = layer_data->WrapNew(*pPipelineCache); } return result; @@ -1997,11 +1992,13 @@ void DispatchDestroyPipelineCache( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyPipelineCache(device, pipelineCache, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t pipelineCache_id = reinterpret_cast<uint64_t &>(pipelineCache); - pipelineCache = (VkPipelineCache)unique_id_mapping[pipelineCache_id]; - unique_id_mapping.erase(pipelineCache_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(pipelineCache_id); + if (iter != unique_id_mapping.end()) { + pipelineCache = (VkPipelineCache)iter->second; + } else { + pipelineCache = (VkPipelineCache)0; + } layer_data->device_dispatch_table.DestroyPipelineCache(device, pipelineCache, pAllocator); } @@ -2015,7 +2012,6 @@ VkResult DispatchGetPipelineCacheData( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetPipelineCacheData(device, pipelineCache, pDataSize, pData); { - std::lock_guard<std::mutex> lock(dispatch_lock); pipelineCache = layer_data->Unwrap(pipelineCache); } VkResult result = layer_data->device_dispatch_table.GetPipelineCacheData(device, pipelineCache, pDataSize, pData); @@ -2033,7 +2029,6 @@ VkResult DispatchMergePipelineCaches( if (!wrap_handles) return layer_data->device_dispatch_table.MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches); VkPipelineCache *local_pSrcCaches = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); dstCache = layer_data->Unwrap(dstCache); if (pSrcCaches) { local_pSrcCaches = new VkPipelineCache[srcCacheCount]; @@ -2059,11 +2054,13 @@ void DispatchDestroyPipeline( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyPipeline(device, pipeline, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t pipeline_id = reinterpret_cast<uint64_t &>(pipeline); - pipeline = (VkPipeline)unique_id_mapping[pipeline_id]; - unique_id_mapping.erase(pipeline_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(pipeline_id); + if (iter != unique_id_mapping.end()) { + pipeline = (VkPipeline)iter->second; + } else { + pipeline = (VkPipeline)0; + } layer_data->device_dispatch_table.DestroyPipeline(device, pipeline, pAllocator); } @@ -2078,7 +2075,6 @@ VkResult DispatchCreatePipelineLayout( if (!wrap_handles) return layer_data->device_dispatch_table.CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout); safe_VkPipelineLayoutCreateInfo *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkPipelineLayoutCreateInfo(pCreateInfo); if (local_pCreateInfo->pSetLayouts) { @@ -2093,7 +2089,6 @@ VkResult DispatchCreatePipelineLayout( delete local_pCreateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pPipelineLayout = layer_data->WrapNew(*pPipelineLayout); } return result; @@ -2106,11 +2101,13 @@ void DispatchDestroyPipelineLayout( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyPipelineLayout(device, pipelineLayout, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t pipelineLayout_id = reinterpret_cast<uint64_t &>(pipelineLayout); - pipelineLayout = (VkPipelineLayout)unique_id_mapping[pipelineLayout_id]; - unique_id_mapping.erase(pipelineLayout_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(pipelineLayout_id); + if (iter != unique_id_mapping.end()) { + pipelineLayout = (VkPipelineLayout)iter->second; + } else { + pipelineLayout = (VkPipelineLayout)0; + } layer_data->device_dispatch_table.DestroyPipelineLayout(device, pipelineLayout, pAllocator); } @@ -2125,7 +2122,6 @@ VkResult DispatchCreateSampler( if (!wrap_handles) return layer_data->device_dispatch_table.CreateSampler(device, pCreateInfo, pAllocator, pSampler); safe_VkSamplerCreateInfo *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkSamplerCreateInfo(pCreateInfo); WrapPnextChainHandles(layer_data, local_pCreateInfo->pNext); @@ -2136,7 +2132,6 @@ VkResult DispatchCreateSampler( delete local_pCreateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSampler = layer_data->WrapNew(*pSampler); } return result; @@ -2149,11 +2144,13 @@ void DispatchDestroySampler( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroySampler(device, sampler, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t sampler_id = reinterpret_cast<uint64_t &>(sampler); - sampler = (VkSampler)unique_id_mapping[sampler_id]; - unique_id_mapping.erase(sampler_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(sampler_id); + if (iter != unique_id_mapping.end()) { + sampler = (VkSampler)iter->second; + } else { + sampler = (VkSampler)0; + } layer_data->device_dispatch_table.DestroySampler(device, sampler, pAllocator); } @@ -2168,7 +2165,6 @@ VkResult DispatchCreateDescriptorSetLayout( if (!wrap_handles) return layer_data->device_dispatch_table.CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout); safe_VkDescriptorSetLayoutCreateInfo *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkDescriptorSetLayoutCreateInfo(pCreateInfo); if (local_pCreateInfo->pBindings) { @@ -2187,7 +2183,6 @@ VkResult DispatchCreateDescriptorSetLayout( delete local_pCreateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSetLayout = layer_data->WrapNew(*pSetLayout); } return result; @@ -2200,11 +2195,13 @@ void DispatchDestroyDescriptorSetLayout( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t descriptorSetLayout_id = reinterpret_cast<uint64_t &>(descriptorSetLayout); - descriptorSetLayout = (VkDescriptorSetLayout)unique_id_mapping[descriptorSetLayout_id]; - unique_id_mapping.erase(descriptorSetLayout_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(descriptorSetLayout_id); + if (iter != unique_id_mapping.end()) { + descriptorSetLayout = (VkDescriptorSetLayout)iter->second; + } else { + descriptorSetLayout = (VkDescriptorSetLayout)0; + } layer_data->device_dispatch_table.DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator); } @@ -2219,7 +2216,6 @@ VkResult DispatchCreateDescriptorPool( if (!wrap_handles) return layer_data->device_dispatch_table.CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool); VkResult result = layer_data->device_dispatch_table.CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pDescriptorPool = layer_data->WrapNew(*pDescriptorPool); } return result; @@ -2245,7 +2241,6 @@ void DispatchUpdateDescriptorSets( safe_VkWriteDescriptorSet *local_pDescriptorWrites = NULL; safe_VkCopyDescriptorSet *local_pDescriptorCopies = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pDescriptorWrites) { local_pDescriptorWrites = new safe_VkWriteDescriptorSet[descriptorWriteCount]; for (uint32_t index0 = 0; index0 < descriptorWriteCount; ++index0) { @@ -2310,7 +2305,6 @@ VkResult DispatchCreateFramebuffer( if (!wrap_handles) return layer_data->device_dispatch_table.CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer); safe_VkFramebufferCreateInfo *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkFramebufferCreateInfo(pCreateInfo); if (pCreateInfo->renderPass) { @@ -2328,7 +2322,6 @@ VkResult DispatchCreateFramebuffer( delete local_pCreateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pFramebuffer = layer_data->WrapNew(*pFramebuffer); } return result; @@ -2341,11 +2334,13 @@ void DispatchDestroyFramebuffer( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyFramebuffer(device, framebuffer, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t framebuffer_id = reinterpret_cast<uint64_t &>(framebuffer); - framebuffer = (VkFramebuffer)unique_id_mapping[framebuffer_id]; - unique_id_mapping.erase(framebuffer_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(framebuffer_id); + if (iter != unique_id_mapping.end()) { + framebuffer = (VkFramebuffer)iter->second; + } else { + framebuffer = (VkFramebuffer)0; + } layer_data->device_dispatch_table.DestroyFramebuffer(device, framebuffer, pAllocator); } @@ -2362,7 +2357,6 @@ void DispatchGetRenderAreaGranularity( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetRenderAreaGranularity(device, renderPass, pGranularity); { - std::lock_guard<std::mutex> lock(dispatch_lock); renderPass = layer_data->Unwrap(renderPass); } layer_data->device_dispatch_table.GetRenderAreaGranularity(device, renderPass, pGranularity); @@ -2379,7 +2373,6 @@ VkResult DispatchCreateCommandPool( if (!wrap_handles) return layer_data->device_dispatch_table.CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool); VkResult result = layer_data->device_dispatch_table.CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pCommandPool = layer_data->WrapNew(*pCommandPool); } return result; @@ -2392,11 +2385,13 @@ void DispatchDestroyCommandPool( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyCommandPool(device, commandPool, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t commandPool_id = reinterpret_cast<uint64_t &>(commandPool); - commandPool = (VkCommandPool)unique_id_mapping[commandPool_id]; - unique_id_mapping.erase(commandPool_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(commandPool_id); + if (iter != unique_id_mapping.end()) { + commandPool = (VkCommandPool)iter->second; + } else { + commandPool = (VkCommandPool)0; + } layer_data->device_dispatch_table.DestroyCommandPool(device, commandPool, pAllocator); } @@ -2409,7 +2404,6 @@ VkResult DispatchResetCommandPool( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.ResetCommandPool(device, commandPool, flags); { - std::lock_guard<std::mutex> lock(dispatch_lock); commandPool = layer_data->Unwrap(commandPool); } VkResult result = layer_data->device_dispatch_table.ResetCommandPool(device, commandPool, flags); @@ -2426,7 +2420,6 @@ VkResult DispatchAllocateCommandBuffers( if (!wrap_handles) return layer_data->device_dispatch_table.AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers); safe_VkCommandBufferAllocateInfo *local_pAllocateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pAllocateInfo) { local_pAllocateInfo = new safe_VkCommandBufferAllocateInfo(pAllocateInfo); if (pAllocateInfo->commandPool) { @@ -2450,7 +2443,6 @@ void DispatchFreeCommandBuffers( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers); { - std::lock_guard<std::mutex> lock(dispatch_lock); commandPool = layer_data->Unwrap(commandPool); } layer_data->device_dispatch_table.FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers); @@ -2465,7 +2457,6 @@ VkResult DispatchBeginCommandBuffer( if (!wrap_handles) return layer_data->device_dispatch_table.BeginCommandBuffer(commandBuffer, pBeginInfo); safe_VkCommandBufferBeginInfo *local_pBeginInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pBeginInfo) { local_pBeginInfo = new safe_VkCommandBufferBeginInfo(pBeginInfo); if (local_pBeginInfo->pInheritanceInfo) { @@ -2512,7 +2503,6 @@ void DispatchCmdBindPipeline( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline); { - std::lock_guard<std::mutex> lock(dispatch_lock); pipeline = layer_data->Unwrap(pipeline); } layer_data->device_dispatch_table.CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline); @@ -2624,7 +2614,6 @@ void DispatchCmdBindDescriptorSets( if (!wrap_handles) return layer_data->device_dispatch_table.CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets); VkDescriptorSet *local_pDescriptorSets = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); layout = layer_data->Unwrap(layout); if (pDescriptorSets) { local_pDescriptorSets = new VkDescriptorSet[descriptorSetCount]; @@ -2647,7 +2636,6 @@ void DispatchCmdBindIndexBuffer( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType); { - std::lock_guard<std::mutex> lock(dispatch_lock); buffer = layer_data->Unwrap(buffer); } layer_data->device_dispatch_table.CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType); @@ -2665,7 +2653,6 @@ void DispatchCmdBindVertexBuffers( if (!wrap_handles) return layer_data->device_dispatch_table.CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets); VkBuffer *local_pBuffers = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pBuffers) { local_pBuffers = new VkBuffer[bindingCount]; for (uint32_t index0 = 0; index0 < bindingCount; ++index0) { @@ -2713,7 +2700,6 @@ void DispatchCmdDrawIndirect( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride); { - std::lock_guard<std::mutex> lock(dispatch_lock); buffer = layer_data->Unwrap(buffer); } layer_data->device_dispatch_table.CmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride); @@ -2730,7 +2716,6 @@ void DispatchCmdDrawIndexedIndirect( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride); { - std::lock_guard<std::mutex> lock(dispatch_lock); buffer = layer_data->Unwrap(buffer); } layer_data->device_dispatch_table.CmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride); @@ -2756,7 +2741,6 @@ void DispatchCmdDispatchIndirect( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdDispatchIndirect(commandBuffer, buffer, offset); { - std::lock_guard<std::mutex> lock(dispatch_lock); buffer = layer_data->Unwrap(buffer); } layer_data->device_dispatch_table.CmdDispatchIndirect(commandBuffer, buffer, offset); @@ -2773,7 +2757,6 @@ void DispatchCmdCopyBuffer( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions); { - std::lock_guard<std::mutex> lock(dispatch_lock); srcBuffer = layer_data->Unwrap(srcBuffer); dstBuffer = layer_data->Unwrap(dstBuffer); } @@ -2793,7 +2776,6 @@ void DispatchCmdCopyImage( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions); { - std::lock_guard<std::mutex> lock(dispatch_lock); srcImage = layer_data->Unwrap(srcImage); dstImage = layer_data->Unwrap(dstImage); } @@ -2814,7 +2796,6 @@ void DispatchCmdBlitImage( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter); { - std::lock_guard<std::mutex> lock(dispatch_lock); srcImage = layer_data->Unwrap(srcImage); dstImage = layer_data->Unwrap(dstImage); } @@ -2833,7 +2814,6 @@ void DispatchCmdCopyBufferToImage( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions); { - std::lock_guard<std::mutex> lock(dispatch_lock); srcBuffer = layer_data->Unwrap(srcBuffer); dstImage = layer_data->Unwrap(dstImage); } @@ -2852,7 +2832,6 @@ void DispatchCmdCopyImageToBuffer( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions); { - std::lock_guard<std::mutex> lock(dispatch_lock); srcImage = layer_data->Unwrap(srcImage); dstBuffer = layer_data->Unwrap(dstBuffer); } @@ -2870,7 +2849,6 @@ void DispatchCmdUpdateBuffer( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData); { - std::lock_guard<std::mutex> lock(dispatch_lock); dstBuffer = layer_data->Unwrap(dstBuffer); } layer_data->device_dispatch_table.CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData); @@ -2887,7 +2865,6 @@ void DispatchCmdFillBuffer( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data); { - std::lock_guard<std::mutex> lock(dispatch_lock); dstBuffer = layer_data->Unwrap(dstBuffer); } layer_data->device_dispatch_table.CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data); @@ -2905,7 +2882,6 @@ void DispatchCmdClearColorImage( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges); { - std::lock_guard<std::mutex> lock(dispatch_lock); image = layer_data->Unwrap(image); } layer_data->device_dispatch_table.CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges); @@ -2923,7 +2899,6 @@ void DispatchCmdClearDepthStencilImage( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges); { - std::lock_guard<std::mutex> lock(dispatch_lock); image = layer_data->Unwrap(image); } layer_data->device_dispatch_table.CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges); @@ -2954,7 +2929,6 @@ void DispatchCmdResolveImage( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions); { - std::lock_guard<std::mutex> lock(dispatch_lock); srcImage = layer_data->Unwrap(srcImage); dstImage = layer_data->Unwrap(dstImage); } @@ -2970,7 +2944,6 @@ void DispatchCmdSetEvent( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdSetEvent(commandBuffer, event, stageMask); { - std::lock_guard<std::mutex> lock(dispatch_lock); event = layer_data->Unwrap(event); } layer_data->device_dispatch_table.CmdSetEvent(commandBuffer, event, stageMask); @@ -2985,7 +2958,6 @@ void DispatchCmdResetEvent( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdResetEvent(commandBuffer, event, stageMask); { - std::lock_guard<std::mutex> lock(dispatch_lock); event = layer_data->Unwrap(event); } layer_data->device_dispatch_table.CmdResetEvent(commandBuffer, event, stageMask); @@ -3011,7 +2983,6 @@ void DispatchCmdWaitEvents( safe_VkBufferMemoryBarrier *local_pBufferMemoryBarriers = NULL; safe_VkImageMemoryBarrier *local_pImageMemoryBarriers = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pEvents) { local_pEvents = new VkEvent[eventCount]; for (uint32_t index0 = 0; index0 < eventCount; ++index0) { @@ -3065,7 +3036,6 @@ void DispatchCmdPipelineBarrier( safe_VkBufferMemoryBarrier *local_pBufferMemoryBarriers = NULL; safe_VkImageMemoryBarrier *local_pImageMemoryBarriers = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pBufferMemoryBarriers) { local_pBufferMemoryBarriers = new safe_VkBufferMemoryBarrier[bufferMemoryBarrierCount]; for (uint32_t index0 = 0; index0 < bufferMemoryBarrierCount; ++index0) { @@ -3103,7 +3073,6 @@ void DispatchCmdBeginQuery( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdBeginQuery(commandBuffer, queryPool, query, flags); { - std::lock_guard<std::mutex> lock(dispatch_lock); queryPool = layer_data->Unwrap(queryPool); } layer_data->device_dispatch_table.CmdBeginQuery(commandBuffer, queryPool, query, flags); @@ -3118,7 +3087,6 @@ void DispatchCmdEndQuery( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdEndQuery(commandBuffer, queryPool, query); { - std::lock_guard<std::mutex> lock(dispatch_lock); queryPool = layer_data->Unwrap(queryPool); } layer_data->device_dispatch_table.CmdEndQuery(commandBuffer, queryPool, query); @@ -3134,7 +3102,6 @@ void DispatchCmdResetQueryPool( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount); { - std::lock_guard<std::mutex> lock(dispatch_lock); queryPool = layer_data->Unwrap(queryPool); } layer_data->device_dispatch_table.CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount); @@ -3150,7 +3117,6 @@ void DispatchCmdWriteTimestamp( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query); { - std::lock_guard<std::mutex> lock(dispatch_lock); queryPool = layer_data->Unwrap(queryPool); } layer_data->device_dispatch_table.CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query); @@ -3170,7 +3136,6 @@ void DispatchCmdCopyQueryPoolResults( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags); { - std::lock_guard<std::mutex> lock(dispatch_lock); queryPool = layer_data->Unwrap(queryPool); dstBuffer = layer_data->Unwrap(dstBuffer); } @@ -3189,7 +3154,6 @@ void DispatchCmdPushConstants( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues); { - std::lock_guard<std::mutex> lock(dispatch_lock); layout = layer_data->Unwrap(layout); } layer_data->device_dispatch_table.CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues); @@ -3205,7 +3169,6 @@ void DispatchCmdBeginRenderPass( if (!wrap_handles) return layer_data->device_dispatch_table.CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents); safe_VkRenderPassBeginInfo *local_pRenderPassBegin = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pRenderPassBegin) { local_pRenderPassBegin = new safe_VkRenderPassBeginInfo(pRenderPassBegin); if (pRenderPassBegin->renderPass) { @@ -3261,7 +3224,6 @@ VkResult DispatchBindBufferMemory2( if (!wrap_handles) return layer_data->device_dispatch_table.BindBufferMemory2(device, bindInfoCount, pBindInfos); safe_VkBindBufferMemoryInfo *local_pBindInfos = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pBindInfos) { local_pBindInfos = new safe_VkBindBufferMemoryInfo[bindInfoCount]; for (uint32_t index0 = 0; index0 < bindInfoCount; ++index0) { @@ -3291,7 +3253,6 @@ VkResult DispatchBindImageMemory2( if (!wrap_handles) return layer_data->device_dispatch_table.BindImageMemory2(device, bindInfoCount, pBindInfos); safe_VkBindImageMemoryInfo *local_pBindInfos = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pBindInfos) { local_pBindInfos = new safe_VkBindImageMemoryInfo[bindInfoCount]; for (uint32_t index0 = 0; index0 < bindInfoCount; ++index0) { @@ -3368,7 +3329,6 @@ void DispatchGetImageMemoryRequirements2( if (!wrap_handles) return layer_data->device_dispatch_table.GetImageMemoryRequirements2(device, pInfo, pMemoryRequirements); safe_VkImageMemoryRequirementsInfo2 *local_pInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pInfo) { local_pInfo = new safe_VkImageMemoryRequirementsInfo2(pInfo); if (pInfo->image) { @@ -3391,7 +3351,6 @@ void DispatchGetBufferMemoryRequirements2( if (!wrap_handles) return layer_data->device_dispatch_table.GetBufferMemoryRequirements2(device, pInfo, pMemoryRequirements); safe_VkBufferMemoryRequirementsInfo2 *local_pInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pInfo) { local_pInfo = new safe_VkBufferMemoryRequirementsInfo2(pInfo); if (pInfo->buffer) { @@ -3415,7 +3374,6 @@ void DispatchGetImageSparseMemoryRequirements2( if (!wrap_handles) return layer_data->device_dispatch_table.GetImageSparseMemoryRequirements2(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements); safe_VkImageSparseMemoryRequirementsInfo2 *local_pInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pInfo) { local_pInfo = new safe_VkImageSparseMemoryRequirementsInfo2(pInfo); if (pInfo->image) { @@ -3466,7 +3424,6 @@ VkResult DispatchGetPhysicalDeviceImageFormatProperties2( if (!wrap_handles) return layer_data->instance_dispatch_table.GetPhysicalDeviceImageFormatProperties2(physicalDevice, pImageFormatInfo, pImageFormatProperties); safe_VkPhysicalDeviceImageFormatInfo2 *local_pImageFormatInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pImageFormatInfo) { local_pImageFormatInfo = new safe_VkPhysicalDeviceImageFormatInfo2(pImageFormatInfo); WrapPnextChainHandles(layer_data, local_pImageFormatInfo->pNext); @@ -3517,7 +3474,6 @@ void DispatchTrimCommandPool( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.TrimCommandPool(device, commandPool, flags); { - std::lock_guard<std::mutex> lock(dispatch_lock); commandPool = layer_data->Unwrap(commandPool); } layer_data->device_dispatch_table.TrimCommandPool(device, commandPool, flags); @@ -3544,7 +3500,6 @@ VkResult DispatchCreateSamplerYcbcrConversion( if (!wrap_handles) return layer_data->device_dispatch_table.CreateSamplerYcbcrConversion(device, pCreateInfo, pAllocator, pYcbcrConversion); safe_VkSamplerYcbcrConversionCreateInfo *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkSamplerYcbcrConversionCreateInfo(pCreateInfo); WrapPnextChainHandles(layer_data, local_pCreateInfo->pNext); @@ -3555,7 +3510,6 @@ VkResult DispatchCreateSamplerYcbcrConversion( delete local_pCreateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pYcbcrConversion = layer_data->WrapNew(*pYcbcrConversion); } return result; @@ -3568,11 +3522,13 @@ void DispatchDestroySamplerYcbcrConversion( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroySamplerYcbcrConversion(device, ycbcrConversion, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t ycbcrConversion_id = reinterpret_cast<uint64_t &>(ycbcrConversion); - ycbcrConversion = (VkSamplerYcbcrConversion)unique_id_mapping[ycbcrConversion_id]; - unique_id_mapping.erase(ycbcrConversion_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(ycbcrConversion_id); + if (iter != unique_id_mapping.end()) { + ycbcrConversion = (VkSamplerYcbcrConversion)iter->second; + } else { + ycbcrConversion = (VkSamplerYcbcrConversion)0; + } layer_data->device_dispatch_table.DestroySamplerYcbcrConversion(device, ycbcrConversion, pAllocator); } @@ -3622,7 +3578,6 @@ void DispatchGetDescriptorSetLayoutSupport( if (!wrap_handles) return layer_data->device_dispatch_table.GetDescriptorSetLayoutSupport(device, pCreateInfo, pSupport); safe_VkDescriptorSetLayoutCreateInfo *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkDescriptorSetLayoutCreateInfo(pCreateInfo); if (local_pCreateInfo->pBindings) { @@ -3649,11 +3604,13 @@ void DispatchDestroySurfaceKHR( { auto layer_data = GetLayerDataPtr(get_dispatch_key(instance), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.DestroySurfaceKHR(instance, surface, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t surface_id = reinterpret_cast<uint64_t &>(surface); - surface = (VkSurfaceKHR)unique_id_mapping[surface_id]; - unique_id_mapping.erase(surface_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(surface_id); + if (iter != unique_id_mapping.end()) { + surface = (VkSurfaceKHR)iter->second; + } else { + surface = (VkSurfaceKHR)0; + } layer_data->instance_dispatch_table.DestroySurfaceKHR(instance, surface, pAllocator); } @@ -3667,7 +3624,6 @@ VkResult DispatchGetPhysicalDeviceSurfaceSupportKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported); { - std::lock_guard<std::mutex> lock(dispatch_lock); surface = layer_data->Unwrap(surface); } VkResult result = layer_data->instance_dispatch_table.GetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported); @@ -3683,7 +3639,6 @@ VkResult DispatchGetPhysicalDeviceSurfaceCapabilitiesKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities); { - std::lock_guard<std::mutex> lock(dispatch_lock); surface = layer_data->Unwrap(surface); } VkResult result = layer_data->instance_dispatch_table.GetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities); @@ -3700,7 +3655,6 @@ VkResult DispatchGetPhysicalDeviceSurfaceFormatsKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats); { - std::lock_guard<std::mutex> lock(dispatch_lock); surface = layer_data->Unwrap(surface); } VkResult result = layer_data->instance_dispatch_table.GetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats); @@ -3717,7 +3671,6 @@ VkResult DispatchGetPhysicalDeviceSurfacePresentModesKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes); { - std::lock_guard<std::mutex> lock(dispatch_lock); surface = layer_data->Unwrap(surface); } VkResult result = layer_data->instance_dispatch_table.GetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes); @@ -3742,7 +3695,6 @@ VkResult DispatchAcquireNextImageKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.AcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex); { - std::lock_guard<std::mutex> lock(dispatch_lock); swapchain = layer_data->Unwrap(swapchain); semaphore = layer_data->Unwrap(semaphore); fence = layer_data->Unwrap(fence); @@ -3772,7 +3724,6 @@ VkResult DispatchGetDeviceGroupSurfacePresentModesKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetDeviceGroupSurfacePresentModesKHR(device, surface, pModes); { - std::lock_guard<std::mutex> lock(dispatch_lock); surface = layer_data->Unwrap(surface); } VkResult result = layer_data->device_dispatch_table.GetDeviceGroupSurfacePresentModesKHR(device, surface, pModes); @@ -3789,7 +3740,6 @@ VkResult DispatchGetPhysicalDevicePresentRectanglesKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.GetPhysicalDevicePresentRectanglesKHR(physicalDevice, surface, pRectCount, pRects); { - std::lock_guard<std::mutex> lock(dispatch_lock); surface = layer_data->Unwrap(surface); } VkResult result = layer_data->instance_dispatch_table.GetPhysicalDevicePresentRectanglesKHR(physicalDevice, surface, pRectCount, pRects); @@ -3806,7 +3756,6 @@ VkResult DispatchAcquireNextImage2KHR( if (!wrap_handles) return layer_data->device_dispatch_table.AcquireNextImage2KHR(device, pAcquireInfo, pImageIndex); safe_VkAcquireNextImageInfoKHR *local_pAcquireInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pAcquireInfo) { local_pAcquireInfo = new safe_VkAcquireNextImageInfoKHR(pAcquireInfo); if (pAcquireInfo->swapchain) { @@ -3845,12 +3794,10 @@ VkResult DispatchCreateDisplayModeKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode); { - std::lock_guard<std::mutex> lock(dispatch_lock); display = layer_data->Unwrap(display); } VkResult result = layer_data->instance_dispatch_table.CreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pMode = layer_data->WrapNew(*pMode); } return result; @@ -3865,7 +3812,6 @@ VkResult DispatchGetDisplayPlaneCapabilitiesKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities); { - std::lock_guard<std::mutex> lock(dispatch_lock); mode = layer_data->Unwrap(mode); } VkResult result = layer_data->instance_dispatch_table.GetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities); @@ -3883,7 +3829,6 @@ VkResult DispatchCreateDisplayPlaneSurfaceKHR( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); safe_VkDisplaySurfaceCreateInfoKHR *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkDisplaySurfaceCreateInfoKHR(pCreateInfo); if (pCreateInfo->displayMode) { @@ -3896,7 +3841,6 @@ VkResult DispatchCreateDisplayPlaneSurfaceKHR( delete local_pCreateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -3916,7 +3860,6 @@ VkResult DispatchCreateXlibSurfaceKHR( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); VkResult result = layer_data->instance_dispatch_table.CreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -3950,7 +3893,6 @@ VkResult DispatchCreateXcbSurfaceKHR( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); VkResult result = layer_data->instance_dispatch_table.CreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -3984,7 +3926,6 @@ VkResult DispatchCreateWaylandSurfaceKHR( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); VkResult result = layer_data->instance_dispatch_table.CreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -4017,7 +3958,6 @@ VkResult DispatchCreateAndroidSurfaceKHR( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); VkResult result = layer_data->instance_dispatch_table.CreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -4036,7 +3976,6 @@ VkResult DispatchCreateWin32SurfaceKHR( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); VkResult result = layer_data->instance_dispatch_table.CreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -4093,7 +4032,6 @@ VkResult DispatchGetPhysicalDeviceImageFormatProperties2KHR( if (!wrap_handles) return layer_data->instance_dispatch_table.GetPhysicalDeviceImageFormatProperties2KHR(physicalDevice, pImageFormatInfo, pImageFormatProperties); safe_VkPhysicalDeviceImageFormatInfo2 *local_pImageFormatInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pImageFormatInfo) { local_pImageFormatInfo = new safe_VkPhysicalDeviceImageFormatInfo2(pImageFormatInfo); WrapPnextChainHandles(layer_data, local_pImageFormatInfo->pNext); @@ -4179,7 +4117,6 @@ void DispatchTrimCommandPoolKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.TrimCommandPoolKHR(device, commandPool, flags); { - std::lock_guard<std::mutex> lock(dispatch_lock); commandPool = layer_data->Unwrap(commandPool); } layer_data->device_dispatch_table.TrimCommandPoolKHR(device, commandPool, flags); @@ -4218,7 +4155,6 @@ VkResult DispatchGetMemoryWin32HandleKHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetMemoryWin32HandleKHR(device, pGetWin32HandleInfo, pHandle); safe_VkMemoryGetWin32HandleInfoKHR *local_pGetWin32HandleInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pGetWin32HandleInfo) { local_pGetWin32HandleInfo = new safe_VkMemoryGetWin32HandleInfoKHR(pGetWin32HandleInfo); if (pGetWin32HandleInfo->memory) { @@ -4258,7 +4194,6 @@ VkResult DispatchGetMemoryFdKHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetMemoryFdKHR(device, pGetFdInfo, pFd); safe_VkMemoryGetFdInfoKHR *local_pGetFdInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pGetFdInfo) { local_pGetFdInfo = new safe_VkMemoryGetFdInfoKHR(pGetFdInfo); if (pGetFdInfo->memory) { @@ -4305,7 +4240,6 @@ VkResult DispatchImportSemaphoreWin32HandleKHR( if (!wrap_handles) return layer_data->device_dispatch_table.ImportSemaphoreWin32HandleKHR(device, pImportSemaphoreWin32HandleInfo); safe_VkImportSemaphoreWin32HandleInfoKHR *local_pImportSemaphoreWin32HandleInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pImportSemaphoreWin32HandleInfo) { local_pImportSemaphoreWin32HandleInfo = new safe_VkImportSemaphoreWin32HandleInfoKHR(pImportSemaphoreWin32HandleInfo); if (pImportSemaphoreWin32HandleInfo->semaphore) { @@ -4332,7 +4266,6 @@ VkResult DispatchGetSemaphoreWin32HandleKHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetSemaphoreWin32HandleKHR(device, pGetWin32HandleInfo, pHandle); safe_VkSemaphoreGetWin32HandleInfoKHR *local_pGetWin32HandleInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pGetWin32HandleInfo) { local_pGetWin32HandleInfo = new safe_VkSemaphoreGetWin32HandleInfoKHR(pGetWin32HandleInfo); if (pGetWin32HandleInfo->semaphore) { @@ -4356,7 +4289,6 @@ VkResult DispatchImportSemaphoreFdKHR( if (!wrap_handles) return layer_data->device_dispatch_table.ImportSemaphoreFdKHR(device, pImportSemaphoreFdInfo); safe_VkImportSemaphoreFdInfoKHR *local_pImportSemaphoreFdInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pImportSemaphoreFdInfo) { local_pImportSemaphoreFdInfo = new safe_VkImportSemaphoreFdInfoKHR(pImportSemaphoreFdInfo); if (pImportSemaphoreFdInfo->semaphore) { @@ -4380,7 +4312,6 @@ VkResult DispatchGetSemaphoreFdKHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetSemaphoreFdKHR(device, pGetFdInfo, pFd); safe_VkSemaphoreGetFdInfoKHR *local_pGetFdInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pGetFdInfo) { local_pGetFdInfo = new safe_VkSemaphoreGetFdInfoKHR(pGetFdInfo); if (pGetFdInfo->semaphore) { @@ -4407,7 +4338,6 @@ void DispatchCmdPushDescriptorSetKHR( if (!wrap_handles) return layer_data->device_dispatch_table.CmdPushDescriptorSetKHR(commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites); safe_VkWriteDescriptorSet *local_pDescriptorWrites = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); layout = layer_data->Unwrap(layout); if (pDescriptorWrites) { local_pDescriptorWrites = new safe_VkWriteDescriptorSet[descriptorWriteCount]; @@ -4467,7 +4397,6 @@ void DispatchCmdBeginRenderPass2KHR( if (!wrap_handles) return layer_data->device_dispatch_table.CmdBeginRenderPass2KHR(commandBuffer, pRenderPassBegin, pSubpassBeginInfo); safe_VkRenderPassBeginInfo *local_pRenderPassBegin = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pRenderPassBegin) { local_pRenderPassBegin = new safe_VkRenderPassBeginInfo(pRenderPassBegin); if (pRenderPassBegin->renderPass) { @@ -4511,7 +4440,6 @@ VkResult DispatchGetSwapchainStatusKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetSwapchainStatusKHR(device, swapchain); { - std::lock_guard<std::mutex> lock(dispatch_lock); swapchain = layer_data->Unwrap(swapchain); } VkResult result = layer_data->device_dispatch_table.GetSwapchainStatusKHR(device, swapchain); @@ -4539,7 +4467,6 @@ VkResult DispatchImportFenceWin32HandleKHR( if (!wrap_handles) return layer_data->device_dispatch_table.ImportFenceWin32HandleKHR(device, pImportFenceWin32HandleInfo); safe_VkImportFenceWin32HandleInfoKHR *local_pImportFenceWin32HandleInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pImportFenceWin32HandleInfo) { local_pImportFenceWin32HandleInfo = new safe_VkImportFenceWin32HandleInfoKHR(pImportFenceWin32HandleInfo); if (pImportFenceWin32HandleInfo->fence) { @@ -4566,7 +4493,6 @@ VkResult DispatchGetFenceWin32HandleKHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetFenceWin32HandleKHR(device, pGetWin32HandleInfo, pHandle); safe_VkFenceGetWin32HandleInfoKHR *local_pGetWin32HandleInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pGetWin32HandleInfo) { local_pGetWin32HandleInfo = new safe_VkFenceGetWin32HandleInfoKHR(pGetWin32HandleInfo); if (pGetWin32HandleInfo->fence) { @@ -4590,7 +4516,6 @@ VkResult DispatchImportFenceFdKHR( if (!wrap_handles) return layer_data->device_dispatch_table.ImportFenceFdKHR(device, pImportFenceFdInfo); safe_VkImportFenceFdInfoKHR *local_pImportFenceFdInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pImportFenceFdInfo) { local_pImportFenceFdInfo = new safe_VkImportFenceFdInfoKHR(pImportFenceFdInfo); if (pImportFenceFdInfo->fence) { @@ -4614,7 +4539,6 @@ VkResult DispatchGetFenceFdKHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetFenceFdKHR(device, pGetFdInfo, pFd); safe_VkFenceGetFdInfoKHR *local_pGetFdInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pGetFdInfo) { local_pGetFdInfo = new safe_VkFenceGetFdInfoKHR(pGetFdInfo); if (pGetFdInfo->fence) { @@ -4638,7 +4562,6 @@ VkResult DispatchGetPhysicalDeviceSurfaceCapabilities2KHR( if (!wrap_handles) return layer_data->instance_dispatch_table.GetPhysicalDeviceSurfaceCapabilities2KHR(physicalDevice, pSurfaceInfo, pSurfaceCapabilities); safe_VkPhysicalDeviceSurfaceInfo2KHR *local_pSurfaceInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pSurfaceInfo) { local_pSurfaceInfo = new safe_VkPhysicalDeviceSurfaceInfo2KHR(pSurfaceInfo); if (pSurfaceInfo->surface) { @@ -4663,7 +4586,6 @@ VkResult DispatchGetPhysicalDeviceSurfaceFormats2KHR( if (!wrap_handles) return layer_data->instance_dispatch_table.GetPhysicalDeviceSurfaceFormats2KHR(physicalDevice, pSurfaceInfo, pSurfaceFormatCount, pSurfaceFormats); safe_VkPhysicalDeviceSurfaceInfo2KHR *local_pSurfaceInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pSurfaceInfo) { local_pSurfaceInfo = new safe_VkPhysicalDeviceSurfaceInfo2KHR(pSurfaceInfo); if (pSurfaceInfo->surface) { @@ -4693,7 +4615,6 @@ VkResult DispatchGetDisplayPlaneCapabilities2KHR( if (!wrap_handles) return layer_data->instance_dispatch_table.GetDisplayPlaneCapabilities2KHR(physicalDevice, pDisplayPlaneInfo, pCapabilities); safe_VkDisplayPlaneInfo2KHR *local_pDisplayPlaneInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pDisplayPlaneInfo) { local_pDisplayPlaneInfo = new safe_VkDisplayPlaneInfo2KHR(pDisplayPlaneInfo); if (pDisplayPlaneInfo->mode) { @@ -4717,7 +4638,6 @@ void DispatchGetImageMemoryRequirements2KHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetImageMemoryRequirements2KHR(device, pInfo, pMemoryRequirements); safe_VkImageMemoryRequirementsInfo2 *local_pInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pInfo) { local_pInfo = new safe_VkImageMemoryRequirementsInfo2(pInfo); if (pInfo->image) { @@ -4740,7 +4660,6 @@ void DispatchGetBufferMemoryRequirements2KHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetBufferMemoryRequirements2KHR(device, pInfo, pMemoryRequirements); safe_VkBufferMemoryRequirementsInfo2 *local_pInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pInfo) { local_pInfo = new safe_VkBufferMemoryRequirementsInfo2(pInfo); if (pInfo->buffer) { @@ -4764,7 +4683,6 @@ void DispatchGetImageSparseMemoryRequirements2KHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetImageSparseMemoryRequirements2KHR(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements); safe_VkImageSparseMemoryRequirementsInfo2 *local_pInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pInfo) { local_pInfo = new safe_VkImageSparseMemoryRequirementsInfo2(pInfo); if (pInfo->image) { @@ -4788,7 +4706,6 @@ VkResult DispatchCreateSamplerYcbcrConversionKHR( if (!wrap_handles) return layer_data->device_dispatch_table.CreateSamplerYcbcrConversionKHR(device, pCreateInfo, pAllocator, pYcbcrConversion); safe_VkSamplerYcbcrConversionCreateInfo *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkSamplerYcbcrConversionCreateInfo(pCreateInfo); WrapPnextChainHandles(layer_data, local_pCreateInfo->pNext); @@ -4799,7 +4716,6 @@ VkResult DispatchCreateSamplerYcbcrConversionKHR( delete local_pCreateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pYcbcrConversion = layer_data->WrapNew(*pYcbcrConversion); } return result; @@ -4812,11 +4728,13 @@ void DispatchDestroySamplerYcbcrConversionKHR( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroySamplerYcbcrConversionKHR(device, ycbcrConversion, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t ycbcrConversion_id = reinterpret_cast<uint64_t &>(ycbcrConversion); - ycbcrConversion = (VkSamplerYcbcrConversion)unique_id_mapping[ycbcrConversion_id]; - unique_id_mapping.erase(ycbcrConversion_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(ycbcrConversion_id); + if (iter != unique_id_mapping.end()) { + ycbcrConversion = (VkSamplerYcbcrConversion)iter->second; + } else { + ycbcrConversion = (VkSamplerYcbcrConversion)0; + } layer_data->device_dispatch_table.DestroySamplerYcbcrConversionKHR(device, ycbcrConversion, pAllocator); } @@ -4830,7 +4748,6 @@ VkResult DispatchBindBufferMemory2KHR( if (!wrap_handles) return layer_data->device_dispatch_table.BindBufferMemory2KHR(device, bindInfoCount, pBindInfos); safe_VkBindBufferMemoryInfo *local_pBindInfos = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pBindInfos) { local_pBindInfos = new safe_VkBindBufferMemoryInfo[bindInfoCount]; for (uint32_t index0 = 0; index0 < bindInfoCount; ++index0) { @@ -4860,7 +4777,6 @@ VkResult DispatchBindImageMemory2KHR( if (!wrap_handles) return layer_data->device_dispatch_table.BindImageMemory2KHR(device, bindInfoCount, pBindInfos); safe_VkBindImageMemoryInfo *local_pBindInfos = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pBindInfos) { local_pBindInfos = new safe_VkBindImageMemoryInfo[bindInfoCount]; for (uint32_t index0 = 0; index0 < bindInfoCount; ++index0) { @@ -4891,7 +4807,6 @@ void DispatchGetDescriptorSetLayoutSupportKHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetDescriptorSetLayoutSupportKHR(device, pCreateInfo, pSupport); safe_VkDescriptorSetLayoutCreateInfo *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkDescriptorSetLayoutCreateInfo(pCreateInfo); if (local_pCreateInfo->pBindings) { @@ -4923,7 +4838,6 @@ void DispatchCmdDrawIndirectCountKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdDrawIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride); { - std::lock_guard<std::mutex> lock(dispatch_lock); buffer = layer_data->Unwrap(buffer); countBuffer = layer_data->Unwrap(countBuffer); } @@ -4943,7 +4857,6 @@ void DispatchCmdDrawIndexedIndirectCountKHR( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdDrawIndexedIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride); { - std::lock_guard<std::mutex> lock(dispatch_lock); buffer = layer_data->Unwrap(buffer); countBuffer = layer_data->Unwrap(countBuffer); } @@ -4961,7 +4874,6 @@ VkResult DispatchGetPipelineExecutablePropertiesKHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetPipelineExecutablePropertiesKHR(device, pPipelineInfo, pExecutableCount, pProperties); safe_VkPipelineInfoKHR *local_pPipelineInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pPipelineInfo) { local_pPipelineInfo = new safe_VkPipelineInfoKHR(pPipelineInfo); if (pPipelineInfo->pipeline) { @@ -4986,7 +4898,6 @@ VkResult DispatchGetPipelineExecutableStatisticsKHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetPipelineExecutableStatisticsKHR(device, pExecutableInfo, pStatisticCount, pStatistics); safe_VkPipelineExecutableInfoKHR *local_pExecutableInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pExecutableInfo) { local_pExecutableInfo = new safe_VkPipelineExecutableInfoKHR(pExecutableInfo); if (pExecutableInfo->pipeline) { @@ -5011,7 +4922,6 @@ VkResult DispatchGetPipelineExecutableInternalRepresentationsKHR( if (!wrap_handles) return layer_data->device_dispatch_table.GetPipelineExecutableInternalRepresentationsKHR(device, pExecutableInfo, pInternalRepresentationCount, pInternalRepresentations); safe_VkPipelineExecutableInfoKHR *local_pExecutableInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pExecutableInfo) { local_pExecutableInfo = new safe_VkPipelineExecutableInfoKHR(pExecutableInfo); if (pExecutableInfo->pipeline) { @@ -5036,7 +4946,6 @@ VkResult DispatchCreateDebugReportCallbackEXT( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback); VkResult result = layer_data->instance_dispatch_table.CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pCallback = layer_data->WrapNew(*pCallback); } return result; @@ -5049,11 +4958,13 @@ void DispatchDestroyDebugReportCallbackEXT( { auto layer_data = GetLayerDataPtr(get_dispatch_key(instance), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.DestroyDebugReportCallbackEXT(instance, callback, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t callback_id = reinterpret_cast<uint64_t &>(callback); - callback = (VkDebugReportCallbackEXT)unique_id_mapping[callback_id]; - unique_id_mapping.erase(callback_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(callback_id); + if (iter != unique_id_mapping.end()) { + callback = (VkDebugReportCallbackEXT)iter->second; + } else { + callback = (VkDebugReportCallbackEXT)0; + } layer_data->instance_dispatch_table.DestroyDebugReportCallbackEXT(instance, callback, pAllocator); } @@ -5115,7 +5026,6 @@ void DispatchCmdBindTransformFeedbackBuffersEXT( if (!wrap_handles) return layer_data->device_dispatch_table.CmdBindTransformFeedbackBuffersEXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes); VkBuffer *local_pBuffers = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pBuffers) { local_pBuffers = new VkBuffer[bindingCount]; for (uint32_t index0 = 0; index0 < bindingCount; ++index0) { @@ -5139,7 +5049,6 @@ void DispatchCmdBeginTransformFeedbackEXT( if (!wrap_handles) return layer_data->device_dispatch_table.CmdBeginTransformFeedbackEXT(commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets); VkBuffer *local_pCounterBuffers = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCounterBuffers) { local_pCounterBuffers = new VkBuffer[counterBufferCount]; for (uint32_t index0 = 0; index0 < counterBufferCount; ++index0) { @@ -5163,7 +5072,6 @@ void DispatchCmdEndTransformFeedbackEXT( if (!wrap_handles) return layer_data->device_dispatch_table.CmdEndTransformFeedbackEXT(commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets); VkBuffer *local_pCounterBuffers = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCounterBuffers) { local_pCounterBuffers = new VkBuffer[counterBufferCount]; for (uint32_t index0 = 0; index0 < counterBufferCount; ++index0) { @@ -5186,7 +5094,6 @@ void DispatchCmdBeginQueryIndexedEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdBeginQueryIndexedEXT(commandBuffer, queryPool, query, flags, index); { - std::lock_guard<std::mutex> lock(dispatch_lock); queryPool = layer_data->Unwrap(queryPool); } layer_data->device_dispatch_table.CmdBeginQueryIndexedEXT(commandBuffer, queryPool, query, flags, index); @@ -5202,7 +5109,6 @@ void DispatchCmdEndQueryIndexedEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdEndQueryIndexedEXT(commandBuffer, queryPool, query, index); { - std::lock_guard<std::mutex> lock(dispatch_lock); queryPool = layer_data->Unwrap(queryPool); } layer_data->device_dispatch_table.CmdEndQueryIndexedEXT(commandBuffer, queryPool, query, index); @@ -5221,7 +5127,6 @@ void DispatchCmdDrawIndirectByteCountEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdDrawIndirectByteCountEXT(commandBuffer, instanceCount, firstInstance, counterBuffer, counterBufferOffset, counterOffset, vertexStride); { - std::lock_guard<std::mutex> lock(dispatch_lock); counterBuffer = layer_data->Unwrap(counterBuffer); } layer_data->device_dispatch_table.CmdDrawIndirectByteCountEXT(commandBuffer, instanceCount, firstInstance, counterBuffer, counterBufferOffset, counterOffset, vertexStride); @@ -5236,7 +5141,6 @@ uint32_t DispatchGetImageViewHandleNVX( if (!wrap_handles) return layer_data->device_dispatch_table.GetImageViewHandleNVX(device, pInfo); safe_VkImageViewHandleInfoNVX *local_pInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pInfo) { local_pInfo = new safe_VkImageViewHandleInfoNVX(pInfo); if (pInfo->imageView) { @@ -5266,7 +5170,6 @@ void DispatchCmdDrawIndirectCountAMD( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride); { - std::lock_guard<std::mutex> lock(dispatch_lock); buffer = layer_data->Unwrap(buffer); countBuffer = layer_data->Unwrap(countBuffer); } @@ -5286,7 +5189,6 @@ void DispatchCmdDrawIndexedIndirectCountAMD( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride); { - std::lock_guard<std::mutex> lock(dispatch_lock); buffer = layer_data->Unwrap(buffer); countBuffer = layer_data->Unwrap(countBuffer); } @@ -5305,7 +5207,6 @@ VkResult DispatchGetShaderInfoAMD( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetShaderInfoAMD(device, pipeline, shaderStage, infoType, pInfoSize, pInfo); { - std::lock_guard<std::mutex> lock(dispatch_lock); pipeline = layer_data->Unwrap(pipeline); } VkResult result = layer_data->device_dispatch_table.GetShaderInfoAMD(device, pipeline, shaderStage, infoType, pInfoSize, pInfo); @@ -5325,7 +5226,6 @@ VkResult DispatchCreateStreamDescriptorSurfaceGGP( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateStreamDescriptorSurfaceGGP(instance, pCreateInfo, pAllocator, pSurface); VkResult result = layer_data->instance_dispatch_table.CreateStreamDescriptorSurfaceGGP(instance, pCreateInfo, pAllocator, pSurface); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -5359,7 +5259,6 @@ VkResult DispatchGetMemoryWin32HandleNV( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetMemoryWin32HandleNV(device, memory, handleType, pHandle); { - std::lock_guard<std::mutex> lock(dispatch_lock); memory = layer_data->Unwrap(memory); } VkResult result = layer_data->device_dispatch_table.GetMemoryWin32HandleNV(device, memory, handleType, pHandle); @@ -5380,7 +5279,6 @@ VkResult DispatchCreateViSurfaceNN( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateViSurfaceNN(instance, pCreateInfo, pAllocator, pSurface); VkResult result = layer_data->instance_dispatch_table.CreateViSurfaceNN(instance, pCreateInfo, pAllocator, pSurface); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -5395,7 +5293,6 @@ void DispatchCmdBeginConditionalRenderingEXT( if (!wrap_handles) return layer_data->device_dispatch_table.CmdBeginConditionalRenderingEXT(commandBuffer, pConditionalRenderingBegin); safe_VkConditionalRenderingBeginInfoEXT *local_pConditionalRenderingBegin = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pConditionalRenderingBegin) { local_pConditionalRenderingBegin = new safe_VkConditionalRenderingBeginInfoEXT(pConditionalRenderingBegin); if (pConditionalRenderingBegin->buffer) { @@ -5425,7 +5322,6 @@ void DispatchCmdProcessCommandsNVX( if (!wrap_handles) return layer_data->device_dispatch_table.CmdProcessCommandsNVX(commandBuffer, pProcessCommandsInfo); safe_VkCmdProcessCommandsInfoNVX *local_pProcessCommandsInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pProcessCommandsInfo) { local_pProcessCommandsInfo = new safe_VkCmdProcessCommandsInfoNVX(pProcessCommandsInfo); if (pProcessCommandsInfo->objectTable) { @@ -5463,7 +5359,6 @@ void DispatchCmdReserveSpaceForCommandsNVX( if (!wrap_handles) return layer_data->device_dispatch_table.CmdReserveSpaceForCommandsNVX(commandBuffer, pReserveSpaceInfo); safe_VkCmdReserveSpaceForCommandsInfoNVX *local_pReserveSpaceInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pReserveSpaceInfo) { local_pReserveSpaceInfo = new safe_VkCmdReserveSpaceForCommandsInfoNVX(pReserveSpaceInfo); if (pReserveSpaceInfo->objectTable) { @@ -5490,7 +5385,6 @@ VkResult DispatchCreateIndirectCommandsLayoutNVX( if (!wrap_handles) return layer_data->device_dispatch_table.CreateIndirectCommandsLayoutNVX(device, pCreateInfo, pAllocator, pIndirectCommandsLayout); VkResult result = layer_data->device_dispatch_table.CreateIndirectCommandsLayoutNVX(device, pCreateInfo, pAllocator, pIndirectCommandsLayout); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pIndirectCommandsLayout = layer_data->WrapNew(*pIndirectCommandsLayout); } return result; @@ -5503,11 +5397,13 @@ void DispatchDestroyIndirectCommandsLayoutNVX( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyIndirectCommandsLayoutNVX(device, indirectCommandsLayout, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t indirectCommandsLayout_id = reinterpret_cast<uint64_t &>(indirectCommandsLayout); - indirectCommandsLayout = (VkIndirectCommandsLayoutNVX)unique_id_mapping[indirectCommandsLayout_id]; - unique_id_mapping.erase(indirectCommandsLayout_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(indirectCommandsLayout_id); + if (iter != unique_id_mapping.end()) { + indirectCommandsLayout = (VkIndirectCommandsLayoutNVX)iter->second; + } else { + indirectCommandsLayout = (VkIndirectCommandsLayoutNVX)0; + } layer_data->device_dispatch_table.DestroyIndirectCommandsLayoutNVX(device, indirectCommandsLayout, pAllocator); } @@ -5522,7 +5418,6 @@ VkResult DispatchCreateObjectTableNVX( if (!wrap_handles) return layer_data->device_dispatch_table.CreateObjectTableNVX(device, pCreateInfo, pAllocator, pObjectTable); VkResult result = layer_data->device_dispatch_table.CreateObjectTableNVX(device, pCreateInfo, pAllocator, pObjectTable); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pObjectTable = layer_data->WrapNew(*pObjectTable); } return result; @@ -5535,11 +5430,13 @@ void DispatchDestroyObjectTableNVX( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyObjectTableNVX(device, objectTable, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t objectTable_id = reinterpret_cast<uint64_t &>(objectTable); - objectTable = (VkObjectTableNVX)unique_id_mapping[objectTable_id]; - unique_id_mapping.erase(objectTable_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(objectTable_id); + if (iter != unique_id_mapping.end()) { + objectTable = (VkObjectTableNVX)iter->second; + } else { + objectTable = (VkObjectTableNVX)0; + } layer_data->device_dispatch_table.DestroyObjectTableNVX(device, objectTable, pAllocator); } @@ -5554,7 +5451,6 @@ VkResult DispatchRegisterObjectsNVX( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.RegisterObjectsNVX(device, objectTable, objectCount, ppObjectTableEntries, pObjectIndices); { - std::lock_guard<std::mutex> lock(dispatch_lock); objectTable = layer_data->Unwrap(objectTable); } VkResult result = layer_data->device_dispatch_table.RegisterObjectsNVX(device, objectTable, objectCount, ppObjectTableEntries, pObjectIndices); @@ -5572,7 +5468,6 @@ VkResult DispatchUnregisterObjectsNVX( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.UnregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices); { - std::lock_guard<std::mutex> lock(dispatch_lock); objectTable = layer_data->Unwrap(objectTable); } VkResult result = layer_data->device_dispatch_table.UnregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices); @@ -5608,7 +5503,6 @@ VkResult DispatchReleaseDisplayEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.ReleaseDisplayEXT(physicalDevice, display); { - std::lock_guard<std::mutex> lock(dispatch_lock); display = layer_data->Unwrap(display); } VkResult result = layer_data->instance_dispatch_table.ReleaseDisplayEXT(physicalDevice, display); @@ -5626,7 +5520,6 @@ VkResult DispatchAcquireXlibDisplayEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.AcquireXlibDisplayEXT(physicalDevice, dpy, display); { - std::lock_guard<std::mutex> lock(dispatch_lock); display = layer_data->Unwrap(display); } VkResult result = layer_data->instance_dispatch_table.AcquireXlibDisplayEXT(physicalDevice, dpy, display); @@ -5647,7 +5540,6 @@ VkResult DispatchGetRandROutputDisplayEXT( if (!wrap_handles) return layer_data->instance_dispatch_table.GetRandROutputDisplayEXT(physicalDevice, dpy, rrOutput, pDisplay); VkResult result = layer_data->instance_dispatch_table.GetRandROutputDisplayEXT(physicalDevice, dpy, rrOutput, pDisplay); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pDisplay = layer_data->WrapNew(*pDisplay); } return result; @@ -5662,7 +5554,6 @@ VkResult DispatchGetPhysicalDeviceSurfaceCapabilities2EXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.GetPhysicalDeviceSurfaceCapabilities2EXT(physicalDevice, surface, pSurfaceCapabilities); { - std::lock_guard<std::mutex> lock(dispatch_lock); surface = layer_data->Unwrap(surface); } VkResult result = layer_data->instance_dispatch_table.GetPhysicalDeviceSurfaceCapabilities2EXT(physicalDevice, surface, pSurfaceCapabilities); @@ -5678,7 +5569,6 @@ VkResult DispatchDisplayPowerControlEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DisplayPowerControlEXT(device, display, pDisplayPowerInfo); { - std::lock_guard<std::mutex> lock(dispatch_lock); display = layer_data->Unwrap(display); } VkResult result = layer_data->device_dispatch_table.DisplayPowerControlEXT(device, display, pDisplayPowerInfo); @@ -5696,7 +5586,6 @@ VkResult DispatchRegisterDeviceEventEXT( if (!wrap_handles) return layer_data->device_dispatch_table.RegisterDeviceEventEXT(device, pDeviceEventInfo, pAllocator, pFence); VkResult result = layer_data->device_dispatch_table.RegisterDeviceEventEXT(device, pDeviceEventInfo, pAllocator, pFence); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pFence = layer_data->WrapNew(*pFence); } return result; @@ -5712,12 +5601,10 @@ VkResult DispatchRegisterDisplayEventEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.RegisterDisplayEventEXT(device, display, pDisplayEventInfo, pAllocator, pFence); { - std::lock_guard<std::mutex> lock(dispatch_lock); display = layer_data->Unwrap(display); } VkResult result = layer_data->device_dispatch_table.RegisterDisplayEventEXT(device, display, pDisplayEventInfo, pAllocator, pFence); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pFence = layer_data->WrapNew(*pFence); } return result; @@ -5732,7 +5619,6 @@ VkResult DispatchGetSwapchainCounterEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetSwapchainCounterEXT(device, swapchain, counter, pCounterValue); { - std::lock_guard<std::mutex> lock(dispatch_lock); swapchain = layer_data->Unwrap(swapchain); } VkResult result = layer_data->device_dispatch_table.GetSwapchainCounterEXT(device, swapchain, counter, pCounterValue); @@ -5748,7 +5634,6 @@ VkResult DispatchGetRefreshCycleDurationGOOGLE( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetRefreshCycleDurationGOOGLE(device, swapchain, pDisplayTimingProperties); { - std::lock_guard<std::mutex> lock(dispatch_lock); swapchain = layer_data->Unwrap(swapchain); } VkResult result = layer_data->device_dispatch_table.GetRefreshCycleDurationGOOGLE(device, swapchain, pDisplayTimingProperties); @@ -5765,7 +5650,6 @@ VkResult DispatchGetPastPresentationTimingGOOGLE( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount, pPresentationTimings); { - std::lock_guard<std::mutex> lock(dispatch_lock); swapchain = layer_data->Unwrap(swapchain); } VkResult result = layer_data->device_dispatch_table.GetPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount, pPresentationTimings); @@ -5794,7 +5678,6 @@ void DispatchSetHdrMetadataEXT( if (!wrap_handles) return layer_data->device_dispatch_table.SetHdrMetadataEXT(device, swapchainCount, pSwapchains, pMetadata); VkSwapchainKHR *local_pSwapchains = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pSwapchains) { local_pSwapchains = new VkSwapchainKHR[swapchainCount]; for (uint32_t index0 = 0; index0 < swapchainCount; ++index0) { @@ -5819,7 +5702,6 @@ VkResult DispatchCreateIOSSurfaceMVK( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateIOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface); VkResult result = layer_data->instance_dispatch_table.CreateIOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -5838,7 +5720,6 @@ VkResult DispatchCreateMacOSSurfaceMVK( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateMacOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface); VkResult result = layer_data->instance_dispatch_table.CreateMacOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -5911,7 +5792,6 @@ VkResult DispatchCreateDebugUtilsMessengerEXT( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateDebugUtilsMessengerEXT(instance, pCreateInfo, pAllocator, pMessenger); VkResult result = layer_data->instance_dispatch_table.CreateDebugUtilsMessengerEXT(instance, pCreateInfo, pAllocator, pMessenger); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pMessenger = layer_data->WrapNew(*pMessenger); } return result; @@ -5924,11 +5804,13 @@ void DispatchDestroyDebugUtilsMessengerEXT( { auto layer_data = GetLayerDataPtr(get_dispatch_key(instance), layer_data_map); if (!wrap_handles) return layer_data->instance_dispatch_table.DestroyDebugUtilsMessengerEXT(instance, messenger, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t messenger_id = reinterpret_cast<uint64_t &>(messenger); - messenger = (VkDebugUtilsMessengerEXT)unique_id_mapping[messenger_id]; - unique_id_mapping.erase(messenger_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(messenger_id); + if (iter != unique_id_mapping.end()) { + messenger = (VkDebugUtilsMessengerEXT)iter->second; + } else { + messenger = (VkDebugUtilsMessengerEXT)0; + } layer_data->instance_dispatch_table.DestroyDebugUtilsMessengerEXT(instance, messenger, pAllocator); } @@ -5969,7 +5851,6 @@ VkResult DispatchGetMemoryAndroidHardwareBufferANDROID( if (!wrap_handles) return layer_data->device_dispatch_table.GetMemoryAndroidHardwareBufferANDROID(device, pInfo, pBuffer); safe_VkMemoryGetAndroidHardwareBufferInfoANDROID *local_pInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pInfo) { local_pInfo = new safe_VkMemoryGetAndroidHardwareBufferInfoANDROID(pInfo); if (pInfo->memory) { @@ -6012,7 +5893,6 @@ VkResult DispatchGetImageDrmFormatModifierPropertiesEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetImageDrmFormatModifierPropertiesEXT(device, image, pProperties); { - std::lock_guard<std::mutex> lock(dispatch_lock); image = layer_data->Unwrap(image); } VkResult result = layer_data->device_dispatch_table.GetImageDrmFormatModifierPropertiesEXT(device, image, pProperties); @@ -6030,7 +5910,6 @@ VkResult DispatchCreateValidationCacheEXT( if (!wrap_handles) return layer_data->device_dispatch_table.CreateValidationCacheEXT(device, pCreateInfo, pAllocator, pValidationCache); VkResult result = layer_data->device_dispatch_table.CreateValidationCacheEXT(device, pCreateInfo, pAllocator, pValidationCache); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pValidationCache = layer_data->WrapNew(*pValidationCache); } return result; @@ -6043,11 +5922,13 @@ void DispatchDestroyValidationCacheEXT( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyValidationCacheEXT(device, validationCache, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t validationCache_id = reinterpret_cast<uint64_t &>(validationCache); - validationCache = (VkValidationCacheEXT)unique_id_mapping[validationCache_id]; - unique_id_mapping.erase(validationCache_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(validationCache_id); + if (iter != unique_id_mapping.end()) { + validationCache = (VkValidationCacheEXT)iter->second; + } else { + validationCache = (VkValidationCacheEXT)0; + } layer_data->device_dispatch_table.DestroyValidationCacheEXT(device, validationCache, pAllocator); } @@ -6062,7 +5943,6 @@ VkResult DispatchMergeValidationCachesEXT( if (!wrap_handles) return layer_data->device_dispatch_table.MergeValidationCachesEXT(device, dstCache, srcCacheCount, pSrcCaches); VkValidationCacheEXT *local_pSrcCaches = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); dstCache = layer_data->Unwrap(dstCache); if (pSrcCaches) { local_pSrcCaches = new VkValidationCacheEXT[srcCacheCount]; @@ -6086,7 +5966,6 @@ VkResult DispatchGetValidationCacheDataEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetValidationCacheDataEXT(device, validationCache, pDataSize, pData); { - std::lock_guard<std::mutex> lock(dispatch_lock); validationCache = layer_data->Unwrap(validationCache); } VkResult result = layer_data->device_dispatch_table.GetValidationCacheDataEXT(device, validationCache, pDataSize, pData); @@ -6102,7 +5981,6 @@ void DispatchCmdBindShadingRateImageNV( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdBindShadingRateImageNV(commandBuffer, imageView, imageLayout); { - std::lock_guard<std::mutex> lock(dispatch_lock); imageView = layer_data->Unwrap(imageView); } layer_data->device_dispatch_table.CmdBindShadingRateImageNV(commandBuffer, imageView, imageLayout); @@ -6141,7 +6019,6 @@ VkResult DispatchCreateAccelerationStructureNV( if (!wrap_handles) return layer_data->device_dispatch_table.CreateAccelerationStructureNV(device, pCreateInfo, pAllocator, pAccelerationStructure); safe_VkAccelerationStructureCreateInfoNV *local_pCreateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_pCreateInfo = new safe_VkAccelerationStructureCreateInfoNV(pCreateInfo); if (local_pCreateInfo->info.pGeometries) { @@ -6167,7 +6044,6 @@ VkResult DispatchCreateAccelerationStructureNV( delete local_pCreateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pAccelerationStructure = layer_data->WrapNew(*pAccelerationStructure); } return result; @@ -6180,11 +6056,13 @@ void DispatchDestroyAccelerationStructureNV( { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyAccelerationStructureNV(device, accelerationStructure, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t accelerationStructure_id = reinterpret_cast<uint64_t &>(accelerationStructure); - accelerationStructure = (VkAccelerationStructureNV)unique_id_mapping[accelerationStructure_id]; - unique_id_mapping.erase(accelerationStructure_id); - lock.unlock(); + auto iter = unique_id_mapping.pop(accelerationStructure_id); + if (iter != unique_id_mapping.end()) { + accelerationStructure = (VkAccelerationStructureNV)iter->second; + } else { + accelerationStructure = (VkAccelerationStructureNV)0; + } layer_data->device_dispatch_table.DestroyAccelerationStructureNV(device, accelerationStructure, pAllocator); } @@ -6198,7 +6076,6 @@ void DispatchGetAccelerationStructureMemoryRequirementsNV( if (!wrap_handles) return layer_data->device_dispatch_table.GetAccelerationStructureMemoryRequirementsNV(device, pInfo, pMemoryRequirements); safe_VkAccelerationStructureMemoryRequirementsInfoNV *local_pInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pInfo) { local_pInfo = new safe_VkAccelerationStructureMemoryRequirementsInfoNV(pInfo); if (pInfo->accelerationStructure) { @@ -6221,7 +6098,6 @@ VkResult DispatchBindAccelerationStructureMemoryNV( if (!wrap_handles) return layer_data->device_dispatch_table.BindAccelerationStructureMemoryNV(device, bindInfoCount, pBindInfos); safe_VkBindAccelerationStructureMemoryInfoNV *local_pBindInfos = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pBindInfos) { local_pBindInfos = new safe_VkBindAccelerationStructureMemoryInfoNV[bindInfoCount]; for (uint32_t index0 = 0; index0 < bindInfoCount; ++index0) { @@ -6257,7 +6133,6 @@ void DispatchCmdBuildAccelerationStructureNV( if (!wrap_handles) return layer_data->device_dispatch_table.CmdBuildAccelerationStructureNV(commandBuffer, pInfo, instanceData, instanceOffset, update, dst, src, scratch, scratchOffset); safe_VkAccelerationStructureInfoNV *local_pInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pInfo) { local_pInfo = new safe_VkAccelerationStructureInfoNV(pInfo); if (local_pInfo->pGeometries) { @@ -6297,7 +6172,6 @@ void DispatchCmdCopyAccelerationStructureNV( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdCopyAccelerationStructureNV(commandBuffer, dst, src, mode); { - std::lock_guard<std::mutex> lock(dispatch_lock); dst = layer_data->Unwrap(dst); src = layer_data->Unwrap(src); } @@ -6325,7 +6199,6 @@ void DispatchCmdTraceRaysNV( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdTraceRaysNV(commandBuffer, raygenShaderBindingTableBuffer, raygenShaderBindingOffset, missShaderBindingTableBuffer, missShaderBindingOffset, missShaderBindingStride, hitShaderBindingTableBuffer, hitShaderBindingOffset, hitShaderBindingStride, callableShaderBindingTableBuffer, callableShaderBindingOffset, callableShaderBindingStride, width, height, depth); { - std::lock_guard<std::mutex> lock(dispatch_lock); raygenShaderBindingTableBuffer = layer_data->Unwrap(raygenShaderBindingTableBuffer); missShaderBindingTableBuffer = layer_data->Unwrap(missShaderBindingTableBuffer); hitShaderBindingTableBuffer = layer_data->Unwrap(hitShaderBindingTableBuffer); @@ -6347,7 +6220,6 @@ VkResult DispatchCreateRayTracingPipelinesNV( if (!wrap_handles) return layer_data->device_dispatch_table.CreateRayTracingPipelinesNV(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines); safe_VkRayTracingPipelineCreateInfoNV *local_pCreateInfos = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); pipelineCache = layer_data->Unwrap(pipelineCache); if (pCreateInfos) { local_pCreateInfos = new safe_VkRayTracingPipelineCreateInfoNV[createInfoCount]; @@ -6374,7 +6246,6 @@ VkResult DispatchCreateRayTracingPipelinesNV( delete[] local_pCreateInfos; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t index0 = 0; index0 < createInfoCount; index0++) { pPipelines[index0] = layer_data->WrapNew(pPipelines[index0]); } @@ -6393,7 +6264,6 @@ VkResult DispatchGetRayTracingShaderGroupHandlesNV( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetRayTracingShaderGroupHandlesNV(device, pipeline, firstGroup, groupCount, dataSize, pData); { - std::lock_guard<std::mutex> lock(dispatch_lock); pipeline = layer_data->Unwrap(pipeline); } VkResult result = layer_data->device_dispatch_table.GetRayTracingShaderGroupHandlesNV(device, pipeline, firstGroup, groupCount, dataSize, pData); @@ -6410,7 +6280,6 @@ VkResult DispatchGetAccelerationStructureHandleNV( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.GetAccelerationStructureHandleNV(device, accelerationStructure, dataSize, pData); { - std::lock_guard<std::mutex> lock(dispatch_lock); accelerationStructure = layer_data->Unwrap(accelerationStructure); } VkResult result = layer_data->device_dispatch_table.GetAccelerationStructureHandleNV(device, accelerationStructure, dataSize, pData); @@ -6430,7 +6299,6 @@ void DispatchCmdWriteAccelerationStructuresPropertiesNV( if (!wrap_handles) return layer_data->device_dispatch_table.CmdWriteAccelerationStructuresPropertiesNV(commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery); VkAccelerationStructureNV *local_pAccelerationStructures = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pAccelerationStructures) { local_pAccelerationStructures = new VkAccelerationStructureNV[accelerationStructureCount]; for (uint32_t index0 = 0; index0 < accelerationStructureCount; ++index0) { @@ -6452,7 +6320,6 @@ VkResult DispatchCompileDeferredNV( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CompileDeferredNV(device, pipeline, shader); { - std::lock_guard<std::mutex> lock(dispatch_lock); pipeline = layer_data->Unwrap(pipeline); } VkResult result = layer_data->device_dispatch_table.CompileDeferredNV(device, pipeline, shader); @@ -6482,7 +6349,6 @@ void DispatchCmdWriteBufferMarkerAMD( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdWriteBufferMarkerAMD(commandBuffer, pipelineStage, dstBuffer, dstOffset, marker); { - std::lock_guard<std::mutex> lock(dispatch_lock); dstBuffer = layer_data->Unwrap(dstBuffer); } layer_data->device_dispatch_table.CmdWriteBufferMarkerAMD(commandBuffer, pipelineStage, dstBuffer, dstOffset, marker); @@ -6533,7 +6399,6 @@ void DispatchCmdDrawMeshTasksIndirectNV( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdDrawMeshTasksIndirectNV(commandBuffer, buffer, offset, drawCount, stride); { - std::lock_guard<std::mutex> lock(dispatch_lock); buffer = layer_data->Unwrap(buffer); } layer_data->device_dispatch_table.CmdDrawMeshTasksIndirectNV(commandBuffer, buffer, offset, drawCount, stride); @@ -6552,7 +6417,6 @@ void DispatchCmdDrawMeshTasksIndirectCountNV( auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.CmdDrawMeshTasksIndirectCountNV(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride); { - std::lock_guard<std::mutex> lock(dispatch_lock); buffer = layer_data->Unwrap(buffer); countBuffer = layer_data->Unwrap(countBuffer); } @@ -6646,7 +6510,6 @@ VkResult DispatchAcquirePerformanceConfigurationINTEL( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.AcquirePerformanceConfigurationINTEL(device, pAcquireInfo, pConfiguration); { - std::lock_guard<std::mutex> lock(dispatch_lock); pConfiguration = layer_data->Unwrap(pConfiguration); } VkResult result = layer_data->device_dispatch_table.AcquirePerformanceConfigurationINTEL(device, pAcquireInfo, pConfiguration); @@ -6661,7 +6524,6 @@ VkResult DispatchReleasePerformanceConfigurationINTEL( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.ReleasePerformanceConfigurationINTEL(device, configuration); { - std::lock_guard<std::mutex> lock(dispatch_lock); configuration = layer_data->Unwrap(configuration); } VkResult result = layer_data->device_dispatch_table.ReleasePerformanceConfigurationINTEL(device, configuration); @@ -6676,7 +6538,6 @@ VkResult DispatchQueueSetPerformanceConfigurationINTEL( auto layer_data = GetLayerDataPtr(get_dispatch_key(queue), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.QueueSetPerformanceConfigurationINTEL(queue, configuration); { - std::lock_guard<std::mutex> lock(dispatch_lock); configuration = layer_data->Unwrap(configuration); } VkResult result = layer_data->device_dispatch_table.QueueSetPerformanceConfigurationINTEL(queue, configuration); @@ -6703,7 +6564,6 @@ void DispatchSetLocalDimmingAMD( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.SetLocalDimmingAMD(device, swapChain, localDimmingEnable); { - std::lock_guard<std::mutex> lock(dispatch_lock); swapChain = layer_data->Unwrap(swapChain); } layer_data->device_dispatch_table.SetLocalDimmingAMD(device, swapChain, localDimmingEnable); @@ -6722,7 +6582,6 @@ VkResult DispatchCreateImagePipeSurfaceFUCHSIA( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateImagePipeSurfaceFUCHSIA(instance, pCreateInfo, pAllocator, pSurface); VkResult result = layer_data->instance_dispatch_table.CreateImagePipeSurfaceFUCHSIA(instance, pCreateInfo, pAllocator, pSurface); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -6741,7 +6600,6 @@ VkResult DispatchCreateMetalSurfaceEXT( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateMetalSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface); VkResult result = layer_data->instance_dispatch_table.CreateMetalSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -6756,7 +6614,6 @@ VkDeviceAddress DispatchGetBufferDeviceAddressEXT( if (!wrap_handles) return layer_data->device_dispatch_table.GetBufferDeviceAddressEXT(device, pInfo); safe_VkBufferDeviceAddressInfoEXT *local_pInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pInfo) { local_pInfo = new safe_VkBufferDeviceAddressInfoEXT(pInfo); if (pInfo->buffer) { @@ -6805,7 +6662,6 @@ VkResult DispatchGetPhysicalDeviceSurfacePresentModes2EXT( if (!wrap_handles) return layer_data->instance_dispatch_table.GetPhysicalDeviceSurfacePresentModes2EXT(physicalDevice, pSurfaceInfo, pPresentModeCount, pPresentModes); safe_VkPhysicalDeviceSurfaceInfo2KHR *local_pSurfaceInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pSurfaceInfo) { local_pSurfaceInfo = new safe_VkPhysicalDeviceSurfaceInfo2KHR(pSurfaceInfo); if (pSurfaceInfo->surface) { @@ -6830,7 +6686,6 @@ VkResult DispatchAcquireFullScreenExclusiveModeEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.AcquireFullScreenExclusiveModeEXT(device, swapchain); { - std::lock_guard<std::mutex> lock(dispatch_lock); swapchain = layer_data->Unwrap(swapchain); } VkResult result = layer_data->device_dispatch_table.AcquireFullScreenExclusiveModeEXT(device, swapchain); @@ -6848,7 +6703,6 @@ VkResult DispatchReleaseFullScreenExclusiveModeEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.ReleaseFullScreenExclusiveModeEXT(device, swapchain); { - std::lock_guard<std::mutex> lock(dispatch_lock); swapchain = layer_data->Unwrap(swapchain); } VkResult result = layer_data->device_dispatch_table.ReleaseFullScreenExclusiveModeEXT(device, swapchain); @@ -6868,7 +6722,6 @@ VkResult DispatchGetDeviceGroupSurfacePresentModes2EXT( if (!wrap_handles) return layer_data->device_dispatch_table.GetDeviceGroupSurfacePresentModes2EXT(device, pSurfaceInfo, pModes); safe_VkPhysicalDeviceSurfaceInfo2KHR *local_pSurfaceInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pSurfaceInfo) { local_pSurfaceInfo = new safe_VkPhysicalDeviceSurfaceInfo2KHR(pSurfaceInfo); if (pSurfaceInfo->surface) { @@ -6894,7 +6747,6 @@ VkResult DispatchCreateHeadlessSurfaceEXT( if (!wrap_handles) return layer_data->instance_dispatch_table.CreateHeadlessSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface); VkResult result = layer_data->instance_dispatch_table.CreateHeadlessSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSurface = layer_data->WrapNew(*pSurface); } return result; @@ -6919,7 +6771,6 @@ void DispatchResetQueryPoolEXT( auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.ResetQueryPoolEXT(device, queryPool, firstQuery, queryCount); { - std::lock_guard<std::mutex> lock(dispatch_lock); queryPool = layer_data->Unwrap(queryPool); } layer_data->device_dispatch_table.ResetQueryPoolEXT(device, queryPool, firstQuery, queryCount); diff --git a/layers/vk_layer_utils.h b/layers/vk_layer_utils.h index 723bc004a..9b1bccec4 100644 --- a/layers/vk_layer_utils.h +++ b/layers/vk_layer_utils.h @@ -159,3 +159,127 @@ static inline int u_ffs(int val) { #ifdef __cplusplus } #endif + +// shared_mutex support added in MSVC 2015 update 2 +#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 +#include <shared_mutex> +#endif + +// Limited concurrent_unordered_map that supports internally-synchronized +// insert/erase/access. Splits locking across N buckets and uses shared_mutex +// for read/write locking. Iterators are not supported. The following +// operations are supported: +// +// insert_or_assign: Insert a new element or update an existing element. +// erase: Remove an element. +// find: Returns != end() if found, value is in ret->second. +// pop: Erases and returns the erased value if found. +// +// find/end: find returns a vaguely iterator-like type that can be compared to +// end and can use iter->second to retrieve the reference. This is to ease porting +// for existing code that combines the existence check and lookup in a single +// operation (and thus a single lock). i.e.: +// +// auto iter = map.find(key); +// if (iter != map.end()) { +// T t = iter->second; +// ... +template <typename Key, typename T, int BUCKETSLOG2 = 2> +class vl_concurrent_unordered_map { + public: + void insert_or_assign(const Key &key, const T &value) { + uint32_t h = ConcurrentMapHashObject(key); + write_lock_guard_t lock(locks[h].lock); + maps[h][key] = value; + } + + // returns size_type + size_t erase(const Key &key) { + uint32_t h = ConcurrentMapHashObject(key); + write_lock_guard_t lock(locks[h].lock); + return maps[h].erase(key); + } + + // type returned by find() and end(). + class FindResult { + public: + FindResult(bool a, T b) : result(a, b) {} + + // == and != only support comparing against end() + bool operator==(const FindResult &other) const { + if (result.first == false && other.result.first == false) { + return true; + } + return false; + } + bool operator!=(const FindResult &other) const { return !(*this == other); } + + // Make -> act kind of like an iterator. + std::pair<bool, T> *operator->() { return &result; } + const std::pair<bool, T> *operator->() const { return &result; } + + private: + // (found, reference to element) + std::pair<bool, T> result; + }; + + // find()/end() return a FindResult containing a reference. For end(), that + // reference is to this dummy member. + T dummy; + FindResult end() { return FindResult(false, dummy); } + + FindResult find(const Key &key) { + uint32_t h = ConcurrentMapHashObject(key); + read_lock_guard_t lock(locks[h].lock); + + auto itr = maps[h].find(key); + bool found = itr != maps[h].end(); + + return found ? FindResult(true, itr->second) : end(); + } + + FindResult pop(const Key &key) { + uint32_t h = ConcurrentMapHashObject(key); + write_lock_guard_t lock(locks[h].lock); + + auto itr = maps[h].find(key); + bool found = itr != maps[h].end(); + + if (found) { + auto ret = FindResult(true, itr->second); + maps[h].erase(itr); + return ret; + } else { + return end(); + } + } + + private: + static const int BUCKETS = (1 << BUCKETSLOG2); +// shared_mutex support added in MSVC 2015 update 2 +#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 +#include <shared_mutex> + typedef std::shared_mutex lock_t; + typedef std::shared_lock<lock_t> read_lock_guard_t; + typedef std::unique_lock<lock_t> write_lock_guard_t; +#else + typedef std::mutex lock_t; + typedef std::unique_lock<lock_t> read_lock_guard_t; + typedef std::unique_lock<lock_t> write_lock_guard_t; +#endif + + std::unordered_map<Key, T> maps[BUCKETS]; + struct { + lock_t lock; + // Put each lock on its own cache line to avoid false cache line sharing. + char padding[64 - sizeof(lock_t)]; + } locks[BUCKETS]; + + uint32_t ConcurrentMapHashObject(const Key &object) const { + uint64_t u64 = (uint64_t)(uintptr_t)object; + uint32_t hash = (uint32_t)(u64 >> 32) + (uint32_t)u64; + hash ^= (hash >> BUCKETSLOG2) ^ (hash >> (2 * BUCKETSLOG2)); + hash &= (BUCKETS - 1); + return hash; + } +}; diff --git a/scripts/layer_chassis_dispatch_generator.py b/scripts/layer_chassis_dispatch_generator.py index b49f77e0b..977824b2d 100644 --- a/scripts/layer_chassis_dispatch_generator.py +++ b/scripts/layer_chassis_dispatch_generator.py @@ -148,7 +148,6 @@ VkResult DispatchCreateComputePipelines(VkDevice device, VkPipelineCache pipelin pCreateInfos, pAllocator, pPipelines); safe_VkComputePipelineCreateInfo *local_pCreateInfos = NULL; if (pCreateInfos) { - std::lock_guard<std::mutex> lock(dispatch_lock); local_pCreateInfos = new safe_VkComputePipelineCreateInfo[createInfoCount]; for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) { local_pCreateInfos[idx0].initialize(&pCreateInfos[idx0]); @@ -164,7 +163,6 @@ VkResult DispatchCreateComputePipelines(VkDevice device, VkPipelineCache pipelin } } if (pipelineCache) { - std::lock_guard<std::mutex> lock(dispatch_lock); pipelineCache = layer_data->Unwrap(pipelineCache); } @@ -172,7 +170,6 @@ VkResult DispatchCreateComputePipelines(VkDevice device, VkPipelineCache pipelin local_pCreateInfos->ptr(), pAllocator, pPipelines); delete[] local_pCreateInfos; { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t i = 0; i < createInfoCount; ++i) { if (pPipelines[i] != VK_NULL_HANDLE) { pPipelines[i] = layer_data->WrapNew(pPipelines[i]); @@ -191,7 +188,7 @@ VkResult DispatchCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipeli safe_VkGraphicsPipelineCreateInfo *local_pCreateInfos = nullptr; if (pCreateInfos) { local_pCreateInfos = new safe_VkGraphicsPipelineCreateInfo[createInfoCount]; - std::lock_guard<std::mutex> lock(dispatch_lock); + read_dispatch_lock_guard_t lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < createInfoCount; ++idx0) { bool uses_color_attachment = false; bool uses_depthstencil_attachment = false; @@ -227,7 +224,6 @@ VkResult DispatchCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipeli } } if (pipelineCache) { - std::lock_guard<std::mutex> lock(dispatch_lock); pipelineCache = layer_data->Unwrap(pipelineCache); } @@ -235,7 +231,6 @@ VkResult DispatchCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipeli local_pCreateInfos->ptr(), pAllocator, pPipelines); delete[] local_pCreateInfos; { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t i = 0; i < createInfoCount; ++i) { if (pPipelines[i] != VK_NULL_HANDLE) { pPipelines[i] = layer_data->WrapNew(pPipelines[i]); @@ -270,7 +265,7 @@ VkResult DispatchCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo VkResult result = layer_data->device_dispatch_table.CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass); if (!wrap_handles) return result; if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); UpdateCreateRenderPassState(layer_data, pCreateInfo, *pRenderPass); *pRenderPass = layer_data->WrapNew(*pRenderPass); } @@ -283,7 +278,7 @@ VkResult DispatchCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateI VkResult result = layer_data->device_dispatch_table.CreateRenderPass2KHR(device, pCreateInfo, pAllocator, pRenderPass); if (!wrap_handles) return result; if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); UpdateCreateRenderPassState(layer_data, pCreateInfo, *pRenderPass); *pRenderPass = layer_data->WrapNew(*pRenderPass); } @@ -293,14 +288,18 @@ VkResult DispatchCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateI void DispatchDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyRenderPass(device, renderPass, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); uint64_t renderPass_id = reinterpret_cast<uint64_t &>(renderPass); - renderPass = (VkRenderPass)unique_id_mapping[renderPass_id]; - unique_id_mapping.erase(renderPass_id); - lock.unlock(); + + auto iter = unique_id_mapping.pop(renderPass_id); + if (iter != unique_id_mapping.end()) { + renderPass = (VkRenderPass)iter->second; + } else { + renderPass = (VkRenderPass)0; + } + layer_data->device_dispatch_table.DestroyRenderPass(device, renderPass, pAllocator); - lock.lock(); + write_dispatch_lock_guard_t lock(dispatch_lock); layer_data->renderpasses_states.erase(renderPass); } @@ -310,7 +309,6 @@ VkResult DispatchCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfo if (!wrap_handles) return layer_data->device_dispatch_table.CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain); safe_VkSwapchainCreateInfoKHR *local_pCreateInfo = NULL; if (pCreateInfo) { - std::lock_guard<std::mutex> lock(dispatch_lock); local_pCreateInfo = new safe_VkSwapchainCreateInfoKHR(pCreateInfo); local_pCreateInfo->oldSwapchain = layer_data->Unwrap(pCreateInfo->oldSwapchain); // Surface is instance-level object @@ -321,7 +319,6 @@ VkResult DispatchCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfo delete local_pCreateInfo; if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); *pSwapchain = layer_data->WrapNew(*pSwapchain); } return result; @@ -335,7 +332,6 @@ VkResult DispatchCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCo pSwapchains); safe_VkSwapchainCreateInfoKHR *local_pCreateInfos = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfos) { local_pCreateInfos = new safe_VkSwapchainCreateInfoKHR[swapchainCount]; for (uint32_t i = 0; i < swapchainCount; ++i) { @@ -354,7 +350,6 @@ VkResult DispatchCreateSharedSwapchainsKHR(VkDevice device, uint32_t swapchainCo pAllocator, pSwapchains); delete[] local_pCreateInfos; if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t i = 0; i < swapchainCount; i++) { pSwapchains[i] = layer_data->WrapNew(pSwapchains[i]); } @@ -369,14 +364,13 @@ VkResult DispatchGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain return layer_data->device_dispatch_table.GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages); VkSwapchainKHR wrapped_swapchain_handle = swapchain; if (VK_NULL_HANDLE != swapchain) { - std::lock_guard<std::mutex> lock(dispatch_lock); swapchain = layer_data->Unwrap(swapchain); } VkResult result = layer_data->device_dispatch_table.GetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages); if ((VK_SUCCESS == result) || (VK_INCOMPLETE == result)) { if ((*pSwapchainImageCount > 0) && pSwapchainImages) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); auto &wrapped_swapchain_image_handles = layer_data->swapchain_wrapped_image_handle_map[wrapped_swapchain_handle]; for (uint32_t i = static_cast<uint32_t>(wrapped_swapchain_image_handles.size()); i < *pSwapchainImageCount; i++) { wrapped_swapchain_image_handles.emplace_back(layer_data->WrapNew(pSwapchainImages[i])); @@ -392,18 +386,24 @@ VkResult DispatchGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain void DispatchDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks *pAllocator) { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroySwapchainKHR(device, swapchain, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); auto &image_array = layer_data->swapchain_wrapped_image_handle_map[swapchain]; for (auto &image_handle : image_array) { unique_id_mapping.erase(HandleToUint64(image_handle)); } layer_data->swapchain_wrapped_image_handle_map.erase(swapchain); + lock.unlock(); uint64_t swapchain_id = HandleToUint64(swapchain); - swapchain = (VkSwapchainKHR)unique_id_mapping[swapchain_id]; - unique_id_mapping.erase(swapchain_id); - lock.unlock(); + + auto iter = unique_id_mapping.pop(swapchain_id); + if (iter != unique_id_mapping.end()) { + swapchain = (VkSwapchainKHR)iter->second; + } else { + swapchain = (VkSwapchainKHR)0; + } + layer_data->device_dispatch_table.DestroySwapchainKHR(device, swapchain, pAllocator); } @@ -412,7 +412,6 @@ VkResult DispatchQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresent if (!wrap_handles) return layer_data->device_dispatch_table.QueuePresentKHR(queue, pPresentInfo); safe_VkPresentInfoKHR *local_pPresentInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pPresentInfo) { local_pPresentInfo = new safe_VkPresentInfoKHR(pPresentInfo); if (local_pPresentInfo->pWaitSemaphores) { @@ -443,18 +442,24 @@ VkResult DispatchQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresent void DispatchDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) { auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyDescriptorPool(device, descriptorPool, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); // remove references to implicitly freed descriptor sets for(auto descriptor_set : layer_data->pool_descriptor_sets_map[descriptorPool]) { unique_id_mapping.erase(reinterpret_cast<uint64_t &>(descriptor_set)); } layer_data->pool_descriptor_sets_map.erase(descriptorPool); + lock.unlock(); uint64_t descriptorPool_id = reinterpret_cast<uint64_t &>(descriptorPool); - descriptorPool = (VkDescriptorPool)unique_id_mapping[descriptorPool_id]; - unique_id_mapping.erase(descriptorPool_id); - lock.unlock(); + + auto iter = unique_id_mapping.pop(descriptorPool_id); + if (iter != unique_id_mapping.end()) { + descriptorPool = (VkDescriptorPool)iter->second; + } else { + descriptorPool = (VkDescriptorPool)0; + } + layer_data->device_dispatch_table.DestroyDescriptorPool(device, descriptorPool, pAllocator); } @@ -463,12 +468,11 @@ VkResult DispatchResetDescriptorPool(VkDevice device, VkDescriptorPool descripto if (!wrap_handles) return layer_data->device_dispatch_table.ResetDescriptorPool(device, descriptorPool, flags); VkDescriptorPool local_descriptor_pool = VK_NULL_HANDLE; { - std::lock_guard<std::mutex> lock(dispatch_lock); local_descriptor_pool = layer_data->Unwrap(descriptorPool); } VkResult result = layer_data->device_dispatch_table.ResetDescriptorPool(device, local_descriptor_pool, flags); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); // remove references to implicitly freed descriptor sets for(auto descriptor_set : layer_data->pool_descriptor_sets_map[descriptorPool]) { unique_id_mapping.erase(reinterpret_cast<uint64_t &>(descriptor_set)); @@ -485,7 +489,6 @@ VkResult DispatchAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAl if (!wrap_handles) return layer_data->device_dispatch_table.AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets); safe_VkDescriptorSetAllocateInfo *local_pAllocateInfo = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pAllocateInfo) { local_pAllocateInfo = new safe_VkDescriptorSetAllocateInfo(pAllocateInfo); if (pAllocateInfo->descriptorPool) { @@ -504,7 +507,7 @@ VkResult DispatchAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAl delete local_pAllocateInfo; } if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); auto &pool_descriptor_sets = layer_data->pool_descriptor_sets_map[pAllocateInfo->descriptorPool]; for (uint32_t index0 = 0; index0 < pAllocateInfo->descriptorSetCount; index0++) { pDescriptorSets[index0] = layer_data->WrapNew(pDescriptorSets[index0]); @@ -522,7 +525,6 @@ VkResult DispatchFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptor VkDescriptorSet *local_pDescriptorSets = NULL; VkDescriptorPool local_descriptor_pool = VK_NULL_HANDLE; { - std::lock_guard<std::mutex> lock(dispatch_lock); local_descriptor_pool = layer_data->Unwrap(descriptorPool); if (pDescriptorSets) { local_pDescriptorSets = new VkDescriptorSet[descriptorSetCount]; @@ -535,7 +537,7 @@ VkResult DispatchFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptor (const VkDescriptorSet *)local_pDescriptorSets); if (local_pDescriptorSets) delete[] local_pDescriptorSets; if ((VK_SUCCESS == result) && (pDescriptorSets)) { - std::unique_lock<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); auto &pool_descriptor_sets = layer_data->pool_descriptor_sets_map[descriptorPool]; for (uint32_t index0 = 0; index0 < descriptorSetCount; index0++) { VkDescriptorSet handle = pDescriptorSets[index0]; @@ -557,7 +559,6 @@ VkResult DispatchCreateDescriptorUpdateTemplate(VkDevice device, const VkDescrip pDescriptorUpdateTemplate); safe_VkDescriptorUpdateTemplateCreateInfo *local_create_info = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_create_info = new safe_VkDescriptorUpdateTemplateCreateInfo(pCreateInfo); if (pCreateInfo->descriptorSetLayout) { @@ -571,7 +572,7 @@ VkResult DispatchCreateDescriptorUpdateTemplate(VkDevice device, const VkDescrip VkResult result = layer_data->device_dispatch_table.CreateDescriptorUpdateTemplate(device, local_create_info->ptr(), pAllocator, pDescriptorUpdateTemplate); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); *pDescriptorUpdateTemplate = layer_data->WrapNew(*pDescriptorUpdateTemplate); // Shadow template createInfo for later updates @@ -591,7 +592,6 @@ VkResult DispatchCreateDescriptorUpdateTemplateKHR(VkDevice device, const VkDesc pDescriptorUpdateTemplate); safe_VkDescriptorUpdateTemplateCreateInfo *local_create_info = NULL; { - std::lock_guard<std::mutex> lock(dispatch_lock); if (pCreateInfo) { local_create_info = new safe_VkDescriptorUpdateTemplateCreateInfo(pCreateInfo); if (pCreateInfo->descriptorSetLayout) { @@ -605,7 +605,7 @@ VkResult DispatchCreateDescriptorUpdateTemplateKHR(VkDevice device, const VkDesc VkResult result = layer_data->device_dispatch_table.CreateDescriptorUpdateTemplateKHR(device, local_create_info->ptr(), pAllocator, pDescriptorUpdateTemplate); if (VK_SUCCESS == result) { - std::lock_guard<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); *pDescriptorUpdateTemplate = layer_data->WrapNew(*pDescriptorUpdateTemplate); // Shadow template createInfo for later updates @@ -621,12 +621,18 @@ void DispatchDestroyDescriptorUpdateTemplate(VkDevice device, VkDescriptorUpdate auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyDescriptorUpdateTemplate(device, descriptorUpdateTemplate, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); uint64_t descriptor_update_template_id = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); layer_data->desc_template_createinfo_map.erase(descriptor_update_template_id); - descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unique_id_mapping[descriptor_update_template_id]; - unique_id_mapping.erase(descriptor_update_template_id); lock.unlock(); + + auto iter = unique_id_mapping.pop(descriptor_update_template_id); + if (iter != unique_id_mapping.end()) { + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)iter->second; + } else { + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)0; + } + layer_data->device_dispatch_table.DestroyDescriptorUpdateTemplate(device, descriptorUpdateTemplate, pAllocator); } @@ -636,12 +642,18 @@ void DispatchDestroyDescriptorUpdateTemplateKHR(VkDevice device, VkDescriptorUpd auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map); if (!wrap_handles) return layer_data->device_dispatch_table.DestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator); - std::unique_lock<std::mutex> lock(dispatch_lock); + write_dispatch_lock_guard_t lock(dispatch_lock); uint64_t descriptor_update_template_id = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); layer_data->desc_template_createinfo_map.erase(descriptor_update_template_id); - descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unique_id_mapping[descriptor_update_template_id]; - unique_id_mapping.erase(descriptor_update_template_id); lock.unlock(); + + auto iter = unique_id_mapping.pop(descriptor_update_template_id); + if (iter != unique_id_mapping.end()) { + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)iter->second; + } else { + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)0; + } + layer_data->device_dispatch_table.DestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator); } @@ -751,12 +763,13 @@ void DispatchUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet de return layer_data->device_dispatch_table.UpdateDescriptorSetWithTemplate(device, descriptorSet, descriptorUpdateTemplate, pData); uint64_t template_handle = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); + void *unwrapped_buffer = nullptr; { - std::lock_guard<std::mutex> lock(dispatch_lock); + read_dispatch_lock_guard_t lock(dispatch_lock); descriptorSet = layer_data->Unwrap(descriptorSet); - descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unique_id_mapping[template_handle]; + descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)layer_data->Unwrap(descriptorUpdateTemplate); + unwrapped_buffer = BuildUnwrappedUpdateTemplateBuffer(layer_data, template_handle, pData); } - void *unwrapped_buffer = BuildUnwrappedUpdateTemplateBuffer(layer_data, template_handle, pData); layer_data->device_dispatch_table.UpdateDescriptorSetWithTemplate(device, descriptorSet, descriptorUpdateTemplate, unwrapped_buffer); free(unwrapped_buffer); } @@ -770,9 +783,9 @@ void DispatchUpdateDescriptorSetWithTemplateKHR(VkDevice device, VkDescriptorSet uint64_t template_handle = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); void *unwrapped_buffer = nullptr; { - std::lock_guard<std::mutex> lock(dispatch_lock); + read_dispatch_lock_guard_t lock(dispatch_lock); descriptorSet = layer_data->Unwrap(descriptorSet); - descriptorUpdateTemplate = (VkDescriptorUpdateTemplate)unique_id_mapping[template_handle]; + descriptorUpdateTemplate = layer_data->Unwrap(descriptorUpdateTemplate); unwrapped_buffer = BuildUnwrappedUpdateTemplateBuffer(layer_data, template_handle, pData); } layer_data->device_dispatch_table.UpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, unwrapped_buffer); @@ -789,7 +802,7 @@ void DispatchCmdPushDescriptorSetWithTemplateKHR(VkCommandBuffer commandBuffer, uint64_t template_handle = reinterpret_cast<uint64_t &>(descriptorUpdateTemplate); void *unwrapped_buffer = nullptr; { - std::lock_guard<std::mutex> lock(dispatch_lock); + read_dispatch_lock_guard_t lock(dispatch_lock); descriptorUpdateTemplate = layer_data->Unwrap(descriptorUpdateTemplate); layout = layer_data->Unwrap(layout); unwrapped_buffer = BuildUnwrappedUpdateTemplateBuffer(layer_data, template_handle, pData); @@ -806,7 +819,6 @@ VkResult DispatchGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physical layer_data->instance_dispatch_table.GetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties); if (!wrap_handles) return result; if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pProperties) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { pProperties[idx0].display = layer_data->MaybeWrapDisplay(pProperties[idx0].display, layer_data); } @@ -821,7 +833,6 @@ VkResult DispatchGetPhysicalDeviceDisplayProperties2KHR(VkPhysicalDevice physica layer_data->instance_dispatch_table.GetPhysicalDeviceDisplayProperties2KHR(physicalDevice, pPropertyCount, pProperties); if (!wrap_handles) return result; if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pProperties) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { pProperties[idx0].displayProperties.display = layer_data->MaybeWrapDisplay(pProperties[idx0].displayProperties.display, layer_data); @@ -837,7 +848,6 @@ VkResult DispatchGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice phy layer_data->instance_dispatch_table.GetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties); if (!wrap_handles) return result; if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pProperties) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { VkDisplayKHR &opt_display = pProperties[idx0].currentDisplay; if (opt_display) opt_display = layer_data->MaybeWrapDisplay(opt_display, layer_data); @@ -853,7 +863,6 @@ VkResult DispatchGetPhysicalDeviceDisplayPlaneProperties2KHR(VkPhysicalDevice ph pPropertyCount, pProperties); if (!wrap_handles) return result; if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pProperties) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { VkDisplayKHR &opt_display = pProperties[idx0].displayPlaneProperties.currentDisplay; if (opt_display) opt_display = layer_data->MaybeWrapDisplay(opt_display, layer_data); @@ -869,7 +878,6 @@ VkResult DispatchGetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDe pDisplayCount, pDisplays); if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pDisplays) { if (!wrap_handles) return result; - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t i = 0; i < *pDisplayCount; ++i) { if (pDisplays[i]) pDisplays[i] = layer_data->MaybeWrapDisplay(pDisplays[i], layer_data); } @@ -884,13 +892,11 @@ VkResult DispatchGetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, Vk return layer_data->instance_dispatch_table.GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties); { - std::lock_guard<std::mutex> lock(dispatch_lock); display = layer_data->Unwrap(display); } VkResult result = layer_data->instance_dispatch_table.GetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties); if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pProperties) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { pProperties[idx0].displayMode = layer_data->WrapNew(pProperties[idx0].displayMode); } @@ -905,14 +911,12 @@ VkResult DispatchGetDisplayModeProperties2KHR(VkPhysicalDevice physicalDevice, V return layer_data->instance_dispatch_table.GetDisplayModeProperties2KHR(physicalDevice, display, pPropertyCount, pProperties); { - std::lock_guard<std::mutex> lock(dispatch_lock); display = layer_data->Unwrap(display); } VkResult result = layer_data->instance_dispatch_table.GetDisplayModeProperties2KHR(physicalDevice, display, pPropertyCount, pProperties); if ((result == VK_SUCCESS || result == VK_INCOMPLETE) && pProperties) { - std::lock_guard<std::mutex> lock(dispatch_lock); for (uint32_t idx0 = 0; idx0 < *pPropertyCount; ++idx0) { pProperties[idx0].displayModeProperties.displayMode = layer_data->WrapNew(pProperties[idx0].displayModeProperties.displayMode); } @@ -925,7 +929,6 @@ VkResult DispatchDebugMarkerSetObjectTagEXT(VkDevice device, const VkDebugMarker if (!wrap_handles) return layer_data->device_dispatch_table.DebugMarkerSetObjectTagEXT(device, pTagInfo); safe_VkDebugMarkerObjectTagInfoEXT local_tag_info(pTagInfo); { - std::lock_guard<std::mutex> lock(dispatch_lock); auto it = unique_id_mapping.find(reinterpret_cast<uint64_t &>(local_tag_info.object)); if (it != unique_id_mapping.end()) { local_tag_info.object = it->second; @@ -941,7 +944,6 @@ VkResult DispatchDebugMarkerSetObjectNameEXT(VkDevice device, const VkDebugMarke if (!wrap_handles) return layer_data->device_dispatch_table.DebugMarkerSetObjectNameEXT(device, pNameInfo); safe_VkDebugMarkerObjectNameInfoEXT local_name_info(pNameInfo); { - std::lock_guard<std::mutex> lock(dispatch_lock); auto it = unique_id_mapping.find(reinterpret_cast<uint64_t &>(local_name_info.object)); if (it != unique_id_mapping.end()) { local_name_info.object = it->second; @@ -958,7 +960,6 @@ VkResult DispatchSetDebugUtilsObjectTagEXT(VkDevice device, const VkDebugUtilsOb if (!wrap_handles) return layer_data->device_dispatch_table.SetDebugUtilsObjectTagEXT(device, pTagInfo); safe_VkDebugUtilsObjectTagInfoEXT local_tag_info(pTagInfo); { - std::lock_guard<std::mutex> lock(dispatch_lock); auto it = unique_id_mapping.find(reinterpret_cast<uint64_t &>(local_tag_info.objectHandle)); if (it != unique_id_mapping.end()) { local_tag_info.objectHandle = it->second; @@ -974,7 +975,6 @@ VkResult DispatchSetDebugUtilsObjectNameEXT(VkDevice device, const VkDebugUtilsO if (!wrap_handles) return layer_data->device_dispatch_table.SetDebugUtilsObjectNameEXT(device, pNameInfo); safe_VkDebugUtilsObjectNameInfoEXT local_name_info(pNameInfo); { - std::lock_guard<std::mutex> lock(dispatch_lock); auto it = unique_id_mapping.find(reinterpret_cast<uint64_t &>(local_name_info.objectHandle)); if (it != unique_id_mapping.end()) { local_name_info.objectHandle = it->second; @@ -1121,7 +1121,18 @@ VkResult DispatchSetDebugUtilsObjectNameEXT(VkDevice device, const VkDebugUtilsO write('// This intentionally includes a cpp file', file=self.outFile) write('#include "vk_safe_struct.cpp"', file=self.outFile) self.newline() - write('std::mutex dispatch_lock;', file=self.outFile) + write('// shared_mutex support added in MSVC 2015 update 2', file=self.outFile) + write('#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918', file=self.outFile) + write(' #include <shared_mutex>', file=self.outFile) + write(' typedef std::shared_mutex dispatch_lock_t;', file=self.outFile) + write(' typedef std::shared_lock<dispatch_lock_t> read_dispatch_lock_guard_t;', file=self.outFile) + write(' typedef std::unique_lock<dispatch_lock_t> write_dispatch_lock_guard_t;', file=self.outFile) + write('#else', file=self.outFile) + write(' typedef std::mutex dispatch_lock_t;', file=self.outFile) + write(' typedef std::unique_lock<dispatch_lock_t> read_dispatch_lock_guard_t;', file=self.outFile) + write(' typedef std::unique_lock<dispatch_lock_t> write_dispatch_lock_guard_t;', file=self.outFile) + write('#endif', file=self.outFile) + write('dispatch_lock_t dispatch_lock;', file=self.outFile) self.newline() write('// Unique Objects pNext extension handling function', file=self.outFile) write('%s' % extension_proc, file=self.outFile) @@ -1270,10 +1281,6 @@ VkResult DispatchSetDebugUtilsObjectNameEXT(VkDevice device, const VkDebugUtilsO self.structMembers.append(self.StructMemberData(name=typeName, members=membersInfo)) # - # Insert a lock_guard line - def lock_guard(self, indent): - return '%sstd::lock_guard<std::mutex> lock(dispatch_lock);\n' % indent - # # Determine if a struct has an NDO as a member or an embedded member def struct_contains_ndo(self, struct_item): struct_member_dict = dict(self.structMembers) @@ -1386,7 +1393,6 @@ VkResult DispatchSetDebugUtilsObjectNameEXT(VkDevice device, const VkDebugUtilsO handle_name = params[-1].find('name') create_ndo_code += '%sif (VK_SUCCESS == result) {\n' % (indent) indent = self.incIndent(indent) - create_ndo_code += '%sstd::lock_guard<std::mutex> lock(dispatch_lock);\n' % (indent) ndo_dest = '*%s' % handle_name.text if ndo_array == True: create_ndo_code += '%sfor (uint32_t index0 = 0; index0 < %s; index0++) {\n' % (indent, cmd_info[-1].len) @@ -1416,7 +1422,6 @@ VkResult DispatchSetDebugUtilsObjectNameEXT(VkDevice device, const VkDebugUtilsO # This API is freeing an array of handles. Remove them from the unique_id map. destroy_ndo_code += '%sif ((VK_SUCCESS == result) && (%s)) {\n' % (indent, cmd_info[param].name) indent = self.incIndent(indent) - destroy_ndo_code += '%sstd::unique_lock<std::mutex> lock(dispatch_lock);\n' % (indent) destroy_ndo_code += '%sfor (uint32_t index0 = 0; index0 < %s; index0++) {\n' % (indent, cmd_info[param].len) indent = self.incIndent(indent) destroy_ndo_code += '%s%s handle = %s[index0];\n' % (indent, cmd_info[param].type, cmd_info[param].name) @@ -1428,11 +1433,18 @@ VkResult DispatchSetDebugUtilsObjectNameEXT(VkDevice device, const VkDebugUtilsO destroy_ndo_code += '%s}\n' % indent else: # Remove a single handle from the map - destroy_ndo_code += '%sstd::unique_lock<std::mutex> lock(dispatch_lock);\n' % (indent) destroy_ndo_code += '%suint64_t %s_id = reinterpret_cast<uint64_t &>(%s);\n' % (indent, cmd_info[param].name, cmd_info[param].name) - destroy_ndo_code += '%s%s = (%s)unique_id_mapping[%s_id];\n' % (indent, cmd_info[param].name, cmd_info[param].type, cmd_info[param].name) - destroy_ndo_code += '%sunique_id_mapping.erase(%s_id);\n' % (indent, cmd_info[param].name) - destroy_ndo_code += '%slock.unlock();\n' % (indent) + destroy_ndo_code += '%sauto iter = unique_id_mapping.pop(%s_id);\n' % (indent, cmd_info[param].name) + destroy_ndo_code += '%sif (iter != unique_id_mapping.end()) {\n' % (indent) + indent = self.incIndent(indent) + destroy_ndo_code += '%s%s = (%s)iter->second;\n' % (indent, cmd_info[param].name, cmd_info[param].type) + indent = self.decIndent(indent); + destroy_ndo_code += '%s} else {\n' % (indent) + indent = self.incIndent(indent) + destroy_ndo_code += '%s%s = (%s)0;\n' % (indent, cmd_info[param].name, cmd_info[param].type) + indent = self.decIndent(indent); + destroy_ndo_code += '%s}\n' % (indent) + return ndo_array, destroy_ndo_code # @@ -1624,7 +1636,7 @@ VkResult DispatchSetDebugUtilsObjectNameEXT(VkDevice device, const VkDebugUtilsO param_pre_code += destroy_ndo_code if param_pre_code: if (not destroy_func) or (destroy_array): - param_pre_code = '%s{\n%s%s%s%s}\n' % (' ', indent, self.lock_guard(indent), param_pre_code, indent) + param_pre_code = '%s{\n%s%s}\n' % (' ', param_pre_code, indent) return paramdecl, param_pre_code, param_post_code # # Capture command parameter info needed to wrap NDOs as well as handling some boilerplate code diff --git a/scripts/layer_chassis_generator.py b/scripts/layer_chassis_generator.py index 332363f80..c1c7f3dc5 100644 --- a/scripts/layer_chassis_generator.py +++ b/scripts/layer_chassis_generator.py @@ -198,6 +198,7 @@ class LayerChassisOutputGenerator(OutputGenerator): inline_custom_header_preamble = """ #define NOMINMAX +#include <atomic> #include <mutex> #include <cinttypes> #include <stdio.h> @@ -225,8 +226,8 @@ class LayerChassisOutputGenerator(OutputGenerator): #include "vk_typemap_helper.h" -extern uint64_t global_unique_id; -extern std::unordered_map<uint64_t, uint64_t> unique_id_mapping; +extern std::atomic<uint64_t> global_unique_id; +extern vl_concurrent_unordered_map<uint64_t, uint64_t, 4> unique_id_mapping; """ inline_custom_header_class_definition = """ @@ -346,7 +347,7 @@ class ValidationObject { // Handle Wrapping Data // Reverse map display handles - std::unordered_map<VkDisplayKHR, uint64_t> display_id_reverse_mapping; + vl_concurrent_unordered_map<VkDisplayKHR, uint64_t, 0> display_id_reverse_mapping; // Wrapping Descriptor Template Update structures requires access to the template createinfo structs std::unordered_map<uint64_t, std::unique_ptr<TEMPLATE_STATE>> desc_template_createinfo_map; struct SubpassesUsageStates { @@ -362,31 +363,33 @@ class ValidationObject { std::unordered_map<VkDescriptorPool, std::unordered_set<VkDescriptorSet>> pool_descriptor_sets_map; - // Unwrap a handle. Must hold lock. + // Unwrap a handle. template <typename HandleType> HandleType Unwrap(HandleType wrappedHandle) { - // TODO: don't use operator[] here. - return (HandleType)unique_id_mapping[reinterpret_cast<uint64_t const &>(wrappedHandle)]; + auto iter = unique_id_mapping.find(reinterpret_cast<uint64_t const &>(wrappedHandle)); + if (iter == unique_id_mapping.end()) + return (HandleType)0; + return (HandleType)iter->second; } - // Wrap a newly created handle with a new unique ID, and return the new ID -- must hold lock. + // Wrap a newly created handle with a new unique ID, and return the new ID. template <typename HandleType> HandleType WrapNew(HandleType newlyCreatedHandle) { auto unique_id = global_unique_id++; - unique_id_mapping[unique_id] = reinterpret_cast<uint64_t const &>(newlyCreatedHandle); + unique_id_mapping.insert_or_assign(unique_id, reinterpret_cast<uint64_t const &>(newlyCreatedHandle)); return (HandleType)unique_id; } - // Specialized handling for VkDisplayKHR. Adds an entry to enable reverse-lookup. Must hold lock. + // Specialized handling for VkDisplayKHR. Adds an entry to enable reverse-lookup. VkDisplayKHR WrapDisplay(VkDisplayKHR newlyCreatedHandle, ValidationObject *map_data) { auto unique_id = global_unique_id++; - unique_id_mapping[unique_id] = reinterpret_cast<uint64_t const &>(newlyCreatedHandle); - map_data->display_id_reverse_mapping[newlyCreatedHandle] = unique_id; + unique_id_mapping.insert_or_assign(unique_id, reinterpret_cast<uint64_t const &>(newlyCreatedHandle)); + map_data->display_id_reverse_mapping.insert_or_assign(newlyCreatedHandle, unique_id); return (VkDisplayKHR)unique_id; } // VkDisplayKHR objects don't have a single point of creation, so we need to see if one already exists in the map before - // creating another. Must hold lock. + // creating another. VkDisplayKHR MaybeWrapDisplay(VkDisplayKHR handle, ValidationObject *map_data) { // See if this display is already known auto it = map_data->display_id_reverse_mapping.find(handle); @@ -434,10 +437,11 @@ class ValidationObject { std::unordered_map<void*, ValidationObject*> layer_data_map; -// Global unique object identifier. All increments must be guarded by a lock. -uint64_t global_unique_id = 1; -// Map uniqueID to actual object handle -std::unordered_map<uint64_t, uint64_t> unique_id_mapping; +// Global unique object identifier. +std::atomic<uint64_t> global_unique_id(1ULL); +// Map uniqueID to actual object handle. Accesses to the map itself are +// internally synchronized. +vl_concurrent_unordered_map<uint64_t, uint64_t, 4> unique_id_mapping; // TODO: This variable controls handle wrapping -- in the future it should be hooked // up to the new VALIDATION_FEATURES extension. Temporarily, control with a compile-time flag. |