From 888cb9d6738d8fdbdcb67cd5ffa80fac9b536560 Mon Sep 17 00:00:00 2001 From: eladash Date: Sun, 31 Mar 2019 18:56:27 +0300 Subject: [PATCH] Remove reader_lock executed in every instruction by RSX Use optimistic double check instead, use one load instruction for the check to be atomic + Read emu status once every FIFO iteration --- rpcs3/Emu/RSX/RSXThread.cpp | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index f6555166af..2f3948f6e7 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -527,7 +527,7 @@ namespace rsx fesetround(FE_TONEAREST); // TODO: exit condition - while (!Emu.IsStopped()) + while (true) { // Wait for external pause events if (external_interrupt_lock.load()) @@ -536,13 +536,6 @@ namespace rsx while (external_interrupt_lock.load()) _mm_pause(); } - // Idle if emulation paused - if (Emu.IsPaused()) - { - std::this_thread::sleep_for(1ms); - continue; - } - // Note a possible rollback address if (sync_point_request) { @@ -559,6 +552,20 @@ namespace rsx // Execute FIFO queue run_FIFO(); + + if (!Emu.IsRunning()) + { + // Idle if emulation paused + while (Emu.IsPaused()) + { + std::this_thread::sleep_for(1ms); + } + + if (Emu.IsStopped()) + { + break; + } + } } } @@ -900,12 +907,14 @@ namespace rsx if (!in_begin_end && state != FIFO_state::lock_wait) { - reader_lock lock(m_mtx_task); - - if (m_invalidated_memory_range.valid()) + if (atomic_storage::load(m_invalidated_memory_range.end) != 0) { - lock.upgrade(); - handle_invalidated_memory_range(); + std::lock_guard lock(m_mtx_task); + + if (m_invalidated_memory_range.valid()) + { + handle_invalidated_memory_range(); + } } } }