diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index e1794f4d9..14dd44d22 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -831,6 +831,8 @@ bool IsValid(const VkWriteDescriptorSet &write, uint32_t arrayElement) void DescriptorSetSlot::RemoveBindRefs(VkResourceRecord *record) { + SCOPED_LOCK(record->descInfo->refLock); + if(texelBufferView != VK_NULL_HANDLE) { record->RemoveBindFrameRef(GetResID(texelBufferView)); @@ -874,6 +876,8 @@ void DescriptorSetSlot::RemoveBindRefs(VkResourceRecord *record) void DescriptorSetSlot::AddBindRefs(VkResourceRecord *record, FrameRefType ref) { + SCOPED_LOCK(record->descInfo->refLock); + if(texelBufferView != VK_NULL_HANDLE) { VkResourceRecord *bufView = GetRecord(texelBufferView); diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index a73b47fb6..154b0f07f 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -957,6 +957,9 @@ struct DescriptorSetData // create from the layout. vector descBindings; + // lock protecting bindFrameRefs and bindMemRefs + Threading::CriticalSection refLock; + // contains the framerefs (ref counted) for the bound resources // in the binding slots. Updated when updating descriptor sets // and then applied in a block on descriptor set bind. diff --git a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp index 625664594..4f0fa4530 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp @@ -956,6 +956,8 @@ void WrappedVulkan::vkUpdateDescriptorSets(VkDevice device, uint32_t writeCount, VkResourceRecord *setrecord = GetRecord(pDescriptorCopies[i].srcSet); + 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 4bbdb0a82..f207b35d1 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -827,6 +827,8 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, { VkResourceRecord *setrecord = GetRecord(*it); + SCOPED_LOCK(setrecord->descInfo->refLock); + const std::map> &frameRefs = setrecord->descInfo->bindFrameRefs; @@ -865,6 +867,8 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, VkResourceRecord *setrecord = GetRecord(*it); + SCOPED_LOCK(setrecord->descInfo->refLock); + for(auto refit = setrecord->descInfo->bindFrameRefs.begin(); refit != setrecord->descInfo->bindFrameRefs.end(); ++refit) {