From 589ac1c5d4184f7e7a3193c05599e01d560ffbaa Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 28 Feb 2021 22:34:01 +0300 Subject: [PATCH] vk: Optimization - avoid touching the mutex at all if possible even when there is no contention --- rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp | 8 +++----- rpcs3/Emu/RSX/VK/VKAsyncScheduler.h | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp b/rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp index d702760285..87eb55b3f7 100644 --- a/rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp +++ b/rpcs3/Emu/RSX/VK/VKAsyncScheduler.cpp @@ -118,10 +118,9 @@ namespace vk event* AsyncTaskScheduler::get_primary_sync_label() { - std::lock_guard lock(m_submit_mutex); - - if (m_sync_required) + if (m_sync_required) [[unlikely]] { + std::lock_guard lock(m_submit_mutex); // For some reason this is inexplicably expensive. WTF! ensure(m_current_cb); insert_sync_event(); m_sync_required = false; @@ -132,13 +131,12 @@ namespace vk void AsyncTaskScheduler::flush(VkSemaphore wait_semaphore, VkPipelineStageFlags wait_dst_stage_mask) { - std::lock_guard lock(m_submit_mutex); - if (!m_current_cb) { return; } + std::lock_guard lock(m_submit_mutex); if (m_sync_required) { insert_sync_event(); diff --git a/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h b/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h index cc9a6f374d..6a77d723d8 100644 --- a/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h +++ b/rpcs3/Emu/RSX/VK/VKAsyncScheduler.h @@ -29,7 +29,7 @@ namespace vk // Sync event* m_sync_label = nullptr; - bool m_sync_required = false; + atomic_t m_sync_required = false; static constexpr u32 events_pool_size = 16384; std::vector m_events_pool;