From 2614450e4b2f7d9d49dfad9e769c4ad4b99e46ba Mon Sep 17 00:00:00 2001 From: Elad <18193363+elad335@users.noreply.github.com> Date: Sat, 4 Jan 2025 08:28:19 +0200 Subject: [PATCH 1/4] Fix IDM image serialization --- rpcs3/Emu/Cell/lv2/sys_cond.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_event.cpp | 4 ++-- rpcs3/Emu/Cell/lv2/sys_event_flag.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_memory.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_mmapper.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_mutex.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_net.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_overlay.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_prx.cpp | 2 +- rpcs3/Emu/Cell/lv2/sys_sync.h | 2 +- rpcs3/Emu/IdManager.h | 2 +- 11 files changed, 12 insertions(+), 12 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_cond.cpp b/rpcs3/Emu/Cell/lv2/sys_cond.cpp index bcfe83aed3..4387d27306 100644 --- a/rpcs3/Emu/Cell/lv2/sys_cond.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_cond.cpp @@ -71,7 +71,7 @@ CellError lv2_cond::on_id_create() std::function lv2_cond::load(utils::serial& ar) { - return load_func(make_shared(ar)); + return load_func(make_shared(stx::exact_t(ar))); } void lv2_cond::save(utils::serial& ar) diff --git a/rpcs3/Emu/Cell/lv2/sys_event.cpp b/rpcs3/Emu/Cell/lv2/sys_event.cpp index 0428fd0f11..d5ad126142 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event.cpp @@ -37,8 +37,8 @@ lv2_event_queue::lv2_event_queue(utils::serial& ar) noexcept std::function lv2_event_queue::load(utils::serial& ar) { - auto queue = make_shared(ar); - return [ptr = lv2_obj::load(queue->key, queue)](void* storage) { *static_cast*>(storage) = ptr; }; + auto queue = make_shared(stx::exact_t(ar)); + return [ptr = lv2_obj::load(queue->key, queue)](void* storage) { *static_cast*>(storage) = ptr; }; } void lv2_event_queue::save(utils::serial& ar) diff --git a/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp b/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp index 6c630e9261..971408e042 100644 --- a/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_event_flag.cpp @@ -24,7 +24,7 @@ lv2_event_flag::lv2_event_flag(utils::serial& ar) std::function lv2_event_flag::load(utils::serial& ar) { - return load_func(make_shared(ar)); + return load_func(make_shared(stx::exact_t(ar))); } void lv2_event_flag::save(utils::serial& ar) diff --git a/rpcs3/Emu/Cell/lv2/sys_memory.cpp b/rpcs3/Emu/Cell/lv2/sys_memory.cpp index de5590426e..6cfc3a1860 100644 --- a/rpcs3/Emu/Cell/lv2/sys_memory.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_memory.cpp @@ -33,7 +33,7 @@ std::function lv2_memory_container::load(utils::serial& ar) // Use idm::last_id() only for the instances at IDM return [ptr = make_shared(stx::exact_t(ar), true)](void* storage) { - *static_cast*>(storage) = ptr; + *static_cast*>(storage) = ptr; }; } diff --git a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp index d134102a73..805d5db0ad 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mmapper.cpp @@ -84,7 +84,7 @@ CellError lv2_memory::on_id_create() std::function lv2_memory::load(utils::serial& ar) { - auto mem = make_shared(ar); + auto mem = make_shared(stx::exact_t(ar)); mem->exists++; // Disable on_id_create() auto func = load_func(mem, +mem->pshared); mem->exists--; diff --git a/rpcs3/Emu/Cell/lv2/sys_mutex.cpp b/rpcs3/Emu/Cell/lv2/sys_mutex.cpp index c8ac190c25..f2d23291ff 100644 --- a/rpcs3/Emu/Cell/lv2/sys_mutex.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_mutex.cpp @@ -27,7 +27,7 @@ lv2_mutex::lv2_mutex(utils::serial& ar) std::function lv2_mutex::load(utils::serial& ar) { - return load_func(make_shared(ar)); + return load_func(make_shared(stx::exact_t(ar))); } void lv2_mutex::save(utils::serial& ar) diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index 97d40d6d47..aae2454619 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -293,7 +293,7 @@ std::function lv2_socket::load(utils::serial& ar) sock_lv2->bind(sock_lv2->last_bound_addr); } - return [ptr = sock_lv2](void* storage) { *static_cast*>(storage) = ptr; };; + return [ptr = sock_lv2](void* storage) { *static_cast*>(storage) = ptr; };; } void lv2_socket::save(utils::serial& ar, bool save_only_this_class) diff --git a/rpcs3/Emu/Cell/lv2/sys_overlay.cpp b/rpcs3/Emu/Cell/lv2/sys_overlay.cpp index 99b5981795..66481ed280 100644 --- a/rpcs3/Emu/Cell/lv2/sys_overlay.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_overlay.cpp @@ -112,7 +112,7 @@ std::function lv2_overlay::load(utils::serial& ar) return [ovlm](void* storage) { - *static_cast*>(storage) = ovlm; + *static_cast*>(storage) = ovlm; }; } diff --git a/rpcs3/Emu/Cell/lv2/sys_prx.cpp b/rpcs3/Emu/Cell/lv2/sys_prx.cpp index 42903d7454..f918070a4e 100644 --- a/rpcs3/Emu/Cell/lv2/sys_prx.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_prx.cpp @@ -372,7 +372,7 @@ std::function lv2_prx::load(utils::serial& ar) return [prx](void* storage) { - *static_cast*>(storage) = prx; + *static_cast*>(storage) = prx; }; } diff --git a/rpcs3/Emu/Cell/lv2/sys_sync.h b/rpcs3/Emu/Cell/lv2/sys_sync.h index 644e0c90f2..bd6004dfaa 100644 --- a/rpcs3/Emu/Cell/lv2/sys_sync.h +++ b/rpcs3/Emu/Cell/lv2/sys_sync.h @@ -449,7 +449,7 @@ public: static std::function load_func(shared_ptr make, u64 pshared = umax) { const u64 key = make->key; - return [ptr = load(key, make, pshared)](void* storage) { *static_cast*>(storage) = ptr; }; + return [ptr = load(key, make, pshared)](void* storage) { *static_cast*>(storage) = ptr; }; } static bool wait_timeout(u64 usec, ppu_thread* cpu = {}, bool scale = true, bool is_usleep = false); diff --git a/rpcs3/Emu/IdManager.h b/rpcs3/Emu/IdManager.h index 99082462f9..26162045b7 100644 --- a/rpcs3/Emu/IdManager.h +++ b/rpcs3/Emu/IdManager.h @@ -123,7 +123,7 @@ namespace id_manager ptr = stx::make_shared(stx::exact_t(ar)); } - return [ptr](void* storage) { *static_cast*>(storage) = ptr; }; + return [ptr](void* storage) { *static_cast*>(storage) = ptr; }; }; }; From 51417cc8c36eda525574c231a2a826e8c6705e6b Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 4 Jan 2025 02:11:19 +0100 Subject: [PATCH 2/4] Qt: stop batch compilation immediately on cancel --- rpcs3/rpcs3qt/game_list_frame.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 12886b8664..aa004211b9 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -2414,6 +2414,14 @@ void game_list_frame::BatchCreateCPUCaches(const std::vector& game_da pdlg->setAutoReset(false); pdlg->open(); + connect(pdlg, &progress_dialog::canceled, this, []() + { + if (!Emu.IsStopped()) + { + Emu.GracefulShutdown(false, true); + } + }); + BatchActionBySerials(pdlg, serials, tr("%0\nProgress: %1/%2 caches compiled").arg(main_label), [&, game_data](const std::string& serial) { From 635eac7704b674ba78e8a122fb99cc7b689fa747 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 4 Jan 2025 02:13:39 +0100 Subject: [PATCH 3/4] Qt: fix batch compilation after a game was already running Batch compilation wasn't working if g_system_progress_canceled wasn't reset --- rpcs3/Emu/system_progress.cpp | 1 + rpcs3/rpcs3qt/game_list_frame.cpp | 14 ++++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/system_progress.cpp b/rpcs3/Emu/system_progress.cpp index feeaea352d..66d59af65b 100644 --- a/rpcs3/Emu/system_progress.cpp +++ b/rpcs3/Emu/system_progress.cpp @@ -41,6 +41,7 @@ void progress_dialog_server::operator()() { std::shared_ptr native_dlg; g_system_progress_stopping = false; + g_system_progress_canceled = false; const auto get_state = []() { diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index aa004211b9..a5fc1f4525 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -2277,11 +2277,13 @@ void game_list_frame::RemoveHDD1Cache(const std::string& base_dir, const std::st game_list_log.fatal("Only %d/%d HDD1 cache directories could be removed in %s (%s)", dirs_removed, dirs_total, base_dir, title_id); } -void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set& serials, QString progressLabel, std::function action, std::function cancel_log, bool refresh_on_finish, bool can_be_concurrent, std::function should_wait_cb) +void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set& serials, QString progressLabel, std::function action, std::function cancel_log, bool refresh_on_finish, bool can_be_concurrent, std::function should_wait_cb) { // Concurrent tasks should not wait (at least not in current implementation) ensure(!should_wait_cb || !can_be_concurrent); + g_system_progress_canceled = false; + const std::shared_ptr> iterate_over_serial = std::make_shared>(); const std::shared_ptr> index = std::make_shared>(0); @@ -2297,12 +2299,16 @@ void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set const std::string& serial = *std::next(serials.begin(), index); - if (pdlg->wasCanceled() || g_system_progress_canceled) + if (pdlg->wasCanceled() || g_system_progress_canceled.exchange(false)) { - cancel_log(index, serials_size); + if (cancel_log) + { + cancel_log(index, serials_size); + } return false; } - else if (action(serial)) + + if (action(serial)) { const int done = index_ptr->load(); pdlg->setLabelText(progressLabel.arg(done + 1).arg(serials_size)); From d2b96636db1d76c8ea00064a5dbd3c120b69afdf Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sat, 4 Jan 2025 02:13:59 +0100 Subject: [PATCH 4/4] Qt: delete batch progress dialog after user closed it (as originally intended) --- rpcs3/rpcs3qt/game_list_frame.cpp | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index a5fc1f4525..02ca16716e 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -2366,19 +2366,17 @@ void game_list_frame::BatchActionBySerials(progress_dialog* pdlg, const std::set if ((*iterate_over_serial)(*index)) { QTimer::singleShot(1, this, *periodic_func); + return; } - else + + pdlg->setLabelText(progressLabel.arg(*index).arg(serials_size)); + pdlg->setCancelButtonText(tr("OK")); + connect(pdlg, &progress_dialog::canceled, this, [pdlg](){ pdlg->deleteLater(); }); + QApplication::beep(); + + if (refresh_on_finish && index) { - pdlg->setLabelText(progressLabel.arg(*index).arg(serials_size)); - pdlg->setCancelButtonText(tr("OK")); - QApplication::beep(); - - if (refresh_on_finish && index) - { - Refresh(true); - } - - pdlg->deleteLater(); + Refresh(true); } };