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;