From cd74fb6a6d5105c0476336372e37f6e1837dc431 Mon Sep 17 00:00:00 2001 From: Eladash Date: Fri, 20 May 2022 21:10:55 +0300 Subject: [PATCH] rsx: Implement HW accurate frame limiter --- rpcs3/Emu/RSX/RSXThread.cpp | 2 +- rpcs3/Emu/RSX/rsx_methods.cpp | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index 17b518bee0..8885fcc761 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -3188,7 +3188,7 @@ namespace rsx case frame_limit_type::_50: limit = 50.; break; case frame_limit_type::_60: limit = 60.; break; case frame_limit_type::_30: limit = 30.; break; - case frame_limit_type::_auto: limit = static_cast(g_cfg.video.vblank_rate); break; + case frame_limit_type::_auto: limit = 0.; break; // Handled in RSX semaphore_acquire default: break; } diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index d6f0b286c9..90c0423763 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -88,9 +88,6 @@ namespace rsx const auto& sema = vm::_ref(addr).val; - // TODO: Remove vblank semaphore hack - if (addr == rsx->device_addr + 0x30) return; - if (sema == arg) { // Flip semaphore doesnt need wake-up delay @@ -107,10 +104,15 @@ namespace rsx rsx->flush_fifo(); } + if (addr == rsx->device_addr + 0x30 && g_cfg.video.frame_limit == frame_limit_type::none) + { + return; + } + u64 start = rsx::uclock(); while (sema != arg) { - if (rsx->is_stopped()) + if (rsx->test_stopped()) { return; } @@ -123,7 +125,7 @@ namespace rsx while (rsx->is_paused()) { - rsx->cpu_wait({}); + rsx->check_state(); } // Reset