From a452c7f4c89ed54b997c33009dbd264bbd317f7b Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 25 Oct 2019 15:03:35 +0100 Subject: [PATCH] If sync primitive queries are called in a loop don't serialise each call --- .../driver/vulkan/wrappers/vk_sync_funcs.cpp | 67 +++++++++++++++---- 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp index 1f9cbcf1b..47b4e0db4 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp @@ -206,13 +206,26 @@ VkResult WrappedVulkan::vkGetFenceStatus(VkDevice device, VkFence fence) if(IsActiveCapturing(m_State)) { - CACHE_THREAD_SERIALISER(); + bool alreadySerialised = false; - SCOPED_SERIALISE_CHUNK(VulkanChunk::vkGetFenceStatus); - Serialise_vkGetFenceStatus(ser, device, fence); + { + m_FrameCaptureRecord->LockChunks(); + alreadySerialised = (m_FrameCaptureRecord->NumChunks() > 0 && + m_FrameCaptureRecord->GetLastChunk()->GetChunkType() == + VulkanChunk::vkGetFenceStatus); + m_FrameCaptureRecord->UnlockChunks(); + } - m_FrameCaptureRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(GetResID(fence), eFrameRef_Read); + if(!alreadySerialised) + { + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkGetFenceStatus); + Serialise_vkGetFenceStatus(ser, device, fence); + + m_FrameCaptureRecord->AddChunk(scope.Get()); + GetResourceManager()->MarkResourceFrameReferenced(GetResID(fence), eFrameRef_Read); + } } return ret; @@ -492,12 +505,25 @@ VkResult WrappedVulkan::vkGetEventStatus(VkDevice device, VkEvent event) if(IsActiveCapturing(m_State)) { - CACHE_THREAD_SERIALISER(); + bool alreadySerialised = false; - SCOPED_SERIALISE_CHUNK(VulkanChunk::vkGetEventStatus); - Serialise_vkGetEventStatus(ser, device, event); + { + m_FrameCaptureRecord->LockChunks(); + alreadySerialised = (m_FrameCaptureRecord->NumChunks() > 0 && + m_FrameCaptureRecord->GetLastChunk()->GetChunkType() == + VulkanChunk::vkGetEventStatus); + m_FrameCaptureRecord->UnlockChunks(); + } - m_FrameCaptureRecord->AddChunk(scope.Get()); + if(!alreadySerialised) + { + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkGetEventStatus); + Serialise_vkGetEventStatus(ser, device, event); + + m_FrameCaptureRecord->AddChunk(scope.Get()); + } } return ret; @@ -968,13 +994,26 @@ VkResult WrappedVulkan::vkGetSemaphoreCounterValueKHR(VkDevice device, VkSemapho if(IsActiveCapturing(m_State)) { - CACHE_THREAD_SERIALISER(); + bool alreadySerialised = false; - SCOPED_SERIALISE_CHUNK(VulkanChunk::vkGetSemaphoreCounterValueKHR); - Serialise_vkGetSemaphoreCounterValueKHR(ser, device, semaphore, pValue); + { + m_FrameCaptureRecord->LockChunks(); + alreadySerialised = (m_FrameCaptureRecord->NumChunks() > 0 && + m_FrameCaptureRecord->GetLastChunk()->GetChunkType() == + VulkanChunk::vkGetSemaphoreCounterValueKHR); + m_FrameCaptureRecord->UnlockChunks(); + } - m_FrameCaptureRecord->AddChunk(scope.Get()); - GetResourceManager()->MarkResourceFrameReferenced(GetResID(semaphore), eFrameRef_Read); + if(!alreadySerialised) + { + CACHE_THREAD_SERIALISER(); + + SCOPED_SERIALISE_CHUNK(VulkanChunk::vkGetSemaphoreCounterValueKHR); + Serialise_vkGetSemaphoreCounterValueKHR(ser, device, semaphore, pValue); + + m_FrameCaptureRecord->AddChunk(scope.Get()); + GetResourceManager()->MarkResourceFrameReferenced(GetResID(semaphore), eFrameRef_Read); + } } return ret;