From 0b2fa6ffdc6e6c4a1a00a628b003b1f44e93a14b Mon Sep 17 00:00:00 2001 From: Eladash Date: Sun, 29 Sep 2019 20:54:33 +0300 Subject: [PATCH] rsx: Flush FIFO GET before smeaphore_acquire --- rpcs3/Emu/RSX/RSXThread.cpp | 6 ++++++ rpcs3/Emu/RSX/RSXThread.h | 1 + rpcs3/Emu/RSX/rsx_methods.cpp | 8 +++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index cd75b092f9..ed193c88e2 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -2334,6 +2334,12 @@ namespace rsx //verify (HERE), async_tasks_pending.load() == 0; } + void thread::flush_fifo() + { + // Make sure GET value is exposed before sync points + fifo_ctrl->sync_get(); + } + void thread::read_barrier(u32 memory_address, u32 memory_range) { zcull_ctrl->read_barrier(this, memory_address, memory_range); diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 75136652f7..fbc48427ea 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -518,6 +518,7 @@ namespace rsx u32 restore_point = 0; atomic_t external_interrupt_lock{ false }; atomic_t external_interrupt_ack{ false }; + void flush_fifo(); // Performance approximation counters struct diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 55d55997c7..ba28a11cff 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -65,13 +65,15 @@ namespace rsx rsx->sync_point_request = true; const u32 addr = get_address(method_registers.semaphore_offset_406e(), method_registers.semaphore_context_dma_406e()); - const auto& sema = vm::_ref>>(addr); + const auto& sema = vm::_ref>(addr); // TODO: Remove vblank semaphore hack - if (sema.load() == arg || addr == rsx->ctxt_addr + 0x30) return; + if (sema == arg || addr == rsx->ctxt_addr + 0x30) return; + + rsx->flush_fifo(); u64 start = get_system_time(); - while (sema.load() != arg) + while (sema != arg) { if (Emu.IsStopped()) return;