From 0859aaa1636a96a4ae52611c107d83d0901099ac Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 17 Aug 2020 14:17:59 +0100 Subject: [PATCH] Change descriptor set lock to spinlock * We don't expect contention on this, the only time it will contend is when actively capturing a frame between updates and submits reading the descriptor contents, so we penalise that case while making the background case faster - since a spinlock is 'free' to take when there's no contention. --- renderdoc/common/threading.h | 2 +- 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 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/renderdoc/common/threading.h b/renderdoc/common/threading.h index 0bbeca783..49442df96 100644 --- a/renderdoc/common/threading.h +++ b/renderdoc/common/threading.h @@ -119,4 +119,4 @@ private: #define SCOPED_READLOCK(rw) Threading::ScopedReadLock CONCAT(scopedlock, __LINE__)(rw); #define SCOPED_WRITELOCK(rw) Threading::ScopedWriteLock CONCAT(scopedlock, __LINE__)(rw); -#define SCOPED_SPINLOCK(cs) Threading::SpinLock CONCAT(scopedlock, __LINE__)(cs); +#define SCOPED_SPINLOCK(cs) Threading::ScopedSpinLock CONCAT(scopedlock, __LINE__)(cs); diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 50078c50e..8b8c3218c 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(std::set &ids, VulkanResourceManager *rm, VkResourceRecord *record) { - SCOPED_LOCK(record->descInfo->refLock); + SCOPED_SPINLOCK(record->descInfo->refLock); if(texelBufferView != ResourceId()) { @@ -1109,7 +1109,7 @@ void DescriptorSetSlot::AddBindRefs(std::set &ids, VkResourceRecord VkResourceRecord *imgView, VkResourceRecord *buffer, VkResourceRecord *descSetRecord, FrameRefType ref) { - SCOPED_LOCK(descSetRecord->descInfo->refLock); + SCOPED_SPINLOCK(descSetRecord->descInfo->refLock); if(bufView) { @@ -1157,7 +1157,7 @@ void DescriptorSetSlot::AddBindRefs(std::set &ids, VulkanResourceMan void DescriptorSetData::UpdateBackgroundRefCache(VulkanResourceManager *resourceManager, const std::set &ids) { - SCOPED_LOCK(refLock); + SCOPED_SPINLOCK(refLock); rdcpair *cacheit = backgroundFrameRefs.begin(); for(auto refit = ids.begin(); refit != ids.end(); ++refit) diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 64c01b408..2341718d3 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1055,7 +1055,7 @@ struct DescriptorSetData BindingStorage data; // lock protecting bindFrameRefs and bindMemRefs - Threading::CriticalSection refLock; + Threading::SpinLock 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 85d7e67c1..cdc0038fc 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp @@ -1125,7 +1125,7 @@ void WrappedVulkan::vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, VkResourceRecord *setrecord = GetRecord(pDescriptorCopies[i].srcSet); - SCOPED_LOCK(setrecord->descInfo->refLock); + SCOPED_SPINLOCK(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 a08e0e51c..84a75626e 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -875,7 +875,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, VkResourceRecord *setrecord = GetRecord(*it); - SCOPED_LOCK(setrecord->descInfo->refLock); + SCOPED_SPINLOCK(setrecord->descInfo->refLock); for(auto refit = setrecord->descInfo->bindFrameRefs.begin(); refit != setrecord->descInfo->bindFrameRefs.end(); ++refit) @@ -963,7 +963,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, { VkResourceRecord *setrecord = GetRecord(*it); - SCOPED_LOCK(setrecord->descInfo->refLock); + SCOPED_SPINLOCK(setrecord->descInfo->refLock); GetResourceManager()->MarkBackgroundFrameReferenced( setrecord->descInfo->backgroundFrameRefs);