From 31b81ade3cf7ee8af836fb48389187d4dfcdb583 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 2 Sep 2020 10:22:11 +0100 Subject: [PATCH] Switch descriptor refs lock back to normal lock * Unfortunately some programs have extreme contention on this lock due to multithreaded descriptor set writes enabled by UPDATE_AFTER_BIND. --- renderdoc/driver/vulkan/vk_common.cpp | 6 +++--- renderdoc/driver/vulkan/vk_resources.h | 2 +- renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp | 2 +- renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 43e3619fb..75321ce58 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -1060,7 +1060,7 @@ void DescriptorSetSlotImageInfo::SetFrom(const VkDescriptorImageInfo &imInfo, bo void DescriptorSetSlot::RemoveBindRefs(rdcarray &ids, VulkanResourceManager *rm, VkResourceRecord *record) { - SCOPED_SPINLOCK(record->descInfo->refLock); + SCOPED_LOCK(record->descInfo->refLock); if(texelBufferView != ResourceId()) { @@ -1109,7 +1109,7 @@ void DescriptorSetSlot::AddBindRefs(rdcarray &ids, VkResourceRecord VkResourceRecord *imgView, VkResourceRecord *buffer, VkResourceRecord *descSetRecord, FrameRefType ref) { - SCOPED_SPINLOCK(descSetRecord->descInfo->refLock); + SCOPED_LOCK(descSetRecord->descInfo->refLock); if(bufView) { @@ -1156,7 +1156,7 @@ void DescriptorSetSlot::AddBindRefs(rdcarray &ids, VulkanResourceMan void DescriptorSetData::UpdateBackgroundRefCache(const rdcarray &ids) { - SCOPED_SPINLOCK(refLock); + SCOPED_LOCK(refLock); if(backgroundFrameRefs.empty()) { diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 5ffc6260f..aaeaf5255 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1059,7 +1059,7 @@ struct DescriptorSetData BindingStorage data; // lock protecting bindFrameRefs and bindMemRefs - Threading::SpinLock refLock; + Threading::CriticalSection refLock; // contains the framerefs (ref counted) for the bound resources // in the binding slots. Updated when updating descriptor sets diff --git a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp index 492ecc6d0..71c95bab5 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp @@ -1178,7 +1178,7 @@ void WrappedVulkan::vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, VkResourceRecord *setrecord = GetRecord(pDescriptorCopies[i].srcSet); - SCOPED_SPINLOCK(setrecord->descInfo->refLock); + SCOPED_LOCK(setrecord->descInfo->refLock); for(auto refit = setrecord->descInfo->bindFrameRefs.begin(); refit != setrecord->descInfo->bindFrameRefs.end(); ++refit) diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 0f76cc243..e48d6dca5 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -877,7 +877,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, VkResourceRecord *setrecord = GetRecord(*it); - SCOPED_SPINLOCK(setrecord->descInfo->refLock); + SCOPED_LOCK(setrecord->descInfo->refLock); for(auto refit = setrecord->descInfo->bindFrameRefs.begin(); refit != setrecord->descInfo->bindFrameRefs.end(); ++refit) @@ -965,7 +965,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, { VkResourceRecord *setrecord = GetRecord(*it); - SCOPED_SPINLOCK(setrecord->descInfo->refLock); + SCOPED_LOCK(setrecord->descInfo->refLock); GetResourceManager()->MarkBackgroundFrameReferenced( setrecord->descInfo->backgroundFrameRefs);