From 756b97ee6d330fa7fc605c6416e73079055205d3 Mon Sep 17 00:00:00 2001 From: Panos Karabelas Date: Mon, 9 Dec 2024 13:47:27 +0000 Subject: [PATCH] [rhi] improved submit() performance by making the mutex lock conditional --- runtime/RHI/RHI_SyncPrimitive.h | 4 +++- runtime/RHI/Vulkan/Vulkan_Queue.cpp | 14 ++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/runtime/RHI/RHI_SyncPrimitive.h b/runtime/RHI/RHI_SyncPrimitive.h index 2e7bc14e4..0c2ed1926 100644 --- a/runtime/RHI/RHI_SyncPrimitive.h +++ b/runtime/RHI/RHI_SyncPrimitive.h @@ -62,8 +62,10 @@ namespace Spartan private: RHI_SyncPrimitive_Type m_type = RHI_SyncPrimitive_Type::Max; - void* m_rhi_resource = nullptr; uint64_t m_value_wait = 0; bool m_signaled = false; + + // rhi + void* m_rhi_resource = nullptr; }; } diff --git a/runtime/RHI/Vulkan/Vulkan_Queue.cpp b/runtime/RHI/Vulkan/Vulkan_Queue.cpp index 7e8b149af..1e23983f0 100644 --- a/runtime/RHI/Vulkan/Vulkan_Queue.cpp +++ b/runtime/RHI/Vulkan/Vulkan_Queue.cpp @@ -19,7 +19,7 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -//= INCLUDES ===================== +//= INCLUDES ======================= #include "pch.h" #include "../RHI_Implementation.h" #include "../RHI_Device.h" @@ -27,7 +27,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "../RHI_SyncPrimitive.h" #include "../RHI_FidelityFX.h" #include "../Core/Debugging.h" -//================================ +#include "../Core/ProgressTracker.h" +//================================== //= NAMESPACES ===== using namespace std; @@ -143,7 +144,6 @@ namespace Spartan void RHI_Queue::Wait() { - lock_guard lock(get_mutex(this)); SP_ASSERT_VK(vkQueueWaitIdle(static_cast(RHI_Device::GetQueueRhiResource(m_type)))); } @@ -154,7 +154,13 @@ namespace Spartan SP_ASSERT(semaphore != nullptr); SP_ASSERT(semaphore_timeline != nullptr); - lock_guard lock(get_mutex(this)); + // locking only during texture loading to stage data without race conditions + unique_lock lock; + if (ProgressTracker::IsLoading()) + { + lock = unique_lock(get_mutex(this)); + } + VkSemaphoreSubmitInfo semaphores[2] = {}; // semaphore binary