From e548743cbfcc5c6a8582a467de73bd469c577d5e Mon Sep 17 00:00:00 2001 From: Eladash Date: Tue, 12 Jul 2022 16:04:33 +0300 Subject: [PATCH] Fixup rsx cpatures --- rpcs3/Emu/Cell/lv2/lv2.cpp | 2 ++ rpcs3/Emu/RSX/RSXThread.cpp | 15 ++++++++------- rpcs3/Emu/System.cpp | 24 +++++++++++++++++------- rpcs3/Emu/savestate_utils.cpp | 2 ++ 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/lv2.cpp b/rpcs3/Emu/Cell/lv2/lv2.cpp index 11d5316c22..de58a64b83 100644 --- a/rpcs3/Emu/Cell/lv2/lv2.cpp +++ b/rpcs3/Emu/Cell/lv2/lv2.cpp @@ -1303,6 +1303,8 @@ void lv2_obj::sleep_unlocked(cpu_thread& thread, u64 timeout) { on_to_sleep_update(); } + + return; } if (timeout) diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index d81486089c..66ad3f30f6 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -45,7 +45,14 @@ extern thread_local std::string(*g_tls_log_prefix)(); template <> bool serialize(utils::serial& ar, rsx::rsx_state& o) { - return ar(o.transform_program, o.transform_constants, o.registers); + ar(o.transform_program); + + if (GET_SERIALIZATION_VERSION(global_version)) + { + ar(o.transform_constants); + } + + return ar(o.registers); } template <> @@ -754,12 +761,6 @@ namespace rsx // Wait for startup (TODO) while (m_rsx_thread_exiting || Emu.IsPaused()) { - // Wait for external pause events - if (external_interrupt_lock) - { - wait_pause(); - } - // Execute backend-local tasks first do_local_task(performance_counters.state); diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index c8f1ba6d80..70220ebbbe 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -609,11 +609,9 @@ bool Emulator::BootRsxCapture(const std::string& path) GetCallbacks().init_pad_handler(""); GetCallbacks().on_run(false); - m_state = system_state::running; + m_state = system_state::starting; - auto replay_thr = g_fxo->init>("RSX Replay", std::move(frame)); - replay_thr->state -= cpu_flag::stop; - replay_thr->state.notify_one(cpu_flag::stop); + ensure(g_fxo->init>("RSX Replay", std::move(frame))); return true; } @@ -1865,8 +1863,10 @@ void Emulator::RunPPU() { ensure(IsStarting()); + bool signalled_thread = false; + // Run main thread - idm::select>([](u32, named_thread& cpu) + idm::select>([&](u32, named_thread& cpu) { if (std::exchange(cpu.stop_flag_removal_protection, false)) { @@ -1875,10 +1875,11 @@ void Emulator::RunPPU() ensure(cpu.state.test_and_reset(cpu_flag::stop)); cpu.state.notify_one(cpu_flag::stop); + signalled_thread = true; }); // Run SPUs waiting on a syscall (savestates related) - idm::select>([](u32, named_thread& spu) + idm::select>([&](u32, named_thread& spu) { if (spu.group && spu.index == spu.group->waiter_spu_index) { @@ -1889,9 +1890,16 @@ void Emulator::RunPPU() ensure(spu.state.test_and_reset(cpu_flag::stop)); spu.state.notify_one(cpu_flag::stop); + signalled_thread = true; } }); + if (!signalled_thread) + { + FixGuestTime(); + FinalizeRunRequest(); + } + if (auto thr = g_fxo->try_get>()) { thr->state -= cpu_flag::stop; @@ -2192,6 +2200,7 @@ void Emulator::Kill(bool allow_autoexit, bool savestate) init_mem_containers = nullptr; m_config_path.clear(); m_config_mode = cfg_mode::custom; + read_used_savestate_versions(); return; } @@ -2458,7 +2467,7 @@ void Emulator::Kill(bool allow_autoexit, bool savestate) sys_log.success("Saved savestate! path='%s'", path); } - ar.pos = 0; + ar.set_reading_state(); } // Boot arg cleanup (preserved in the case restarting) @@ -2471,6 +2480,7 @@ void Emulator::Kill(bool allow_autoexit, bool savestate) init_mem_containers = nullptr; m_config_path.clear(); m_config_mode = cfg_mode::custom; + read_used_savestate_versions(); // Always Enable display sleep, not only if it was prevented. enable_display_sleep(); diff --git a/rpcs3/Emu/savestate_utils.cpp b/rpcs3/Emu/savestate_utils.cpp index 5295c0a91c..018fbed717 100644 --- a/rpcs3/Emu/savestate_utils.cpp +++ b/rpcs3/Emu/savestate_utils.cpp @@ -154,6 +154,8 @@ std::vector> read_used_savestate_versions() { used_serial.emplace_back(&ver - s_serial_versions.data(), *ver.compatible_versions.rbegin()); } + + ver.current_version = 0; } return used_serial;