diff --git a/rpcs3/Emu/Cell/PPUModule.cpp b/rpcs3/Emu/Cell/PPUModule.cpp index 64e197e3e3..4df1749bcd 100644 --- a/rpcs3/Emu/Cell/PPUModule.cpp +++ b/rpcs3/Emu/Cell/PPUModule.cpp @@ -2494,7 +2494,7 @@ std::pair, CellError> ppu_load_overlay(const ppu_ex } } - const auto ovlm = std::make_shared(); + std::shared_ptr ovlm = std::make_shared(); // Set path (TODO) ovlm->name = path.substr(path.find_last_of('/') + 1); diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 32290dbe26..49aa70e8d0 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -3751,7 +3751,7 @@ extern void ppu_precompile(std::vector& dir_queue, std::vector& dir_queue, std::vectorstate.all_of(cpu_flag::exit) : Emu.IsStopped()) { diff --git a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.cpp b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.cpp index 4d20bddc9d..d6a9f74f6b 100644 --- a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.cpp @@ -40,7 +40,7 @@ namespace rsx } } - void shader_loading_dialog::update_msg(u32 index, const std::string& msg) + void shader_loading_dialog::update_msg(u32 index, std::string msg) { if (!dlg) { @@ -49,9 +49,9 @@ namespace rsx ref_cnt++; - Emu.CallFromMainThread([&, index, msg]() + Emu.CallFromMainThread([&, index, message = std::move(msg)]() { - dlg->ProgressBarSetMsg(index, msg); + dlg->ProgressBarSetMsg(index, message); ref_cnt--; }); } diff --git a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.h b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.h index 7d141c49d2..ae95b4bda8 100644 --- a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.h @@ -11,7 +11,7 @@ namespace rsx virtual ~shader_loading_dialog() = default; virtual void create(const std::string& msg, const std::string& title); - virtual void update_msg(u32 index, const std::string& msg); + virtual void update_msg(u32 index, std::string msg); virtual void inc_value(u32 index, u32 value); virtual void set_value(u32 index, u32 value); virtual void set_limit(u32 index, u32 limit); diff --git a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.cpp b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.cpp index 7b8ddd29c8..c0d0f4ff93 100644 --- a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.cpp +++ b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.cpp @@ -31,9 +31,9 @@ namespace rsx }); } - void shader_loading_dialog_native::update_msg(u32 index, const std::string& msg) + void shader_loading_dialog_native::update_msg(u32 index, std::string msg) { - dlg->progress_bar_set_message(index, msg); + dlg->progress_bar_set_message(index, std::move(msg)); owner->flip({}); } diff --git a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.h b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.h index 08ad43bfcf..0d73324562 100644 --- a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.h +++ b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.h @@ -21,7 +21,7 @@ namespace rsx shader_loading_dialog_native(GSRender* ptr); void create(const std::string& msg, const std::string&/* title*/) override; - void update_msg(u32 index, const std::string& msg) override; + void update_msg(u32 index, std::string msg) override; void inc_value(u32 index, u32 value) override; void set_value(u32 index, u32 value) override; void set_limit(u32 index, u32 limit) override; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp index 078ccb9c85..ac8c359bdd 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp @@ -342,9 +342,9 @@ namespace rsx return CELL_OK; } - void message_dialog::set_text(const std::string& text) + void message_dialog::set_text(std::string text) { - text_guard.set_text(text); + text_guard.set_text(std::move(text)); } void message_dialog::update_custom_background() @@ -411,12 +411,12 @@ namespace rsx taskbar_index = index; } - error_code message_dialog::progress_bar_set_message(u32 index, const std::string& msg) + error_code message_dialog::progress_bar_set_message(u32 index, std::string msg) { if (index >= num_progress_bars) return CELL_MSGDIALOG_ERROR_PARAM; - ::at32(bar_text_guard, index).set_text(msg); + ::at32(bar_text_guard, index).set_text(std::move(msg)); return CELL_OK; } diff --git a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.h b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.h index 989dec8c16..cfc5d44eba 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.h @@ -72,12 +72,12 @@ namespace rsx error_code show(bool is_blocking, const std::string& text, const MsgDialogType& type, std::function on_close); - void set_text(const std::string& text); + void set_text(std::string text); void update_custom_background(); u32 progress_bar_count() const; void progress_bar_set_taskbar_index(s32 index); - error_code progress_bar_set_message(u32 index, const std::string& msg); + error_code progress_bar_set_message(u32 index, std::string msg); error_code progress_bar_increment(u32 index, f32 value); error_code progress_bar_set_value(u32 index, f32 value); error_code progress_bar_reset(u32 index); diff --git a/rpcs3/Emu/RSX/Overlays/overlay_utils.cpp b/rpcs3/Emu/RSX/Overlays/overlay_utils.cpp index 4be5d07c79..65dde9a8a7 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_utils.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_utils.cpp @@ -60,10 +60,10 @@ static auto s_ascii_lowering_map = []() }(); template -void process_multibyte(const std::string s, F&& func) +void process_multibyte(const std::string& s, F&& func) { - const auto end = s.length(); - for (u32 index = 0; index < end; ++index) + const usz end = s.length(); + for (usz index = 0; index < end; ++index) { const u8 code = static_cast(s[index]); @@ -78,7 +78,7 @@ void process_multibyte(const std::string s, F&& func) continue; } - const auto extra_bytes = (code <= 0xDF) ? 1u : (code <= 0xEF) ? 2u : 3u; + const u32 extra_bytes = (code <= 0xDF) ? 1u : (code <= 0xEF) ? 2u : 3u; if ((index + extra_bytes) > end) { // Malformed string, abort diff --git a/rpcs3/Emu/RSX/Overlays/overlays.cpp b/rpcs3/Emu/RSX/Overlays/overlays.cpp index e003b7fd5a..a8064a8803 100644 --- a/rpcs3/Emu/RSX/Overlays/overlays.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlays.cpp @@ -18,7 +18,7 @@ namespace rsx { thread_local DECLARE(user_interface::g_thread_bit) = 0; - u64 user_interface::alloc_thread_bit() + u32 user_interface::alloc_thread_bit() { auto [_old, ok] = this->thread_bits.fetch_op([](u32& bits) { @@ -38,7 +38,7 @@ namespace rsx return 0; } - const u64 r = u64{1} << std::countr_one(_old); + const u32 r = u32{1} << std::countr_one(_old); ::overlays.trace("Bit allocated (%u)", r); return r; } diff --git a/rpcs3/Emu/RSX/Overlays/overlays.h b/rpcs3/Emu/RSX/Overlays/overlays.h index ac23e00406..f12d0ed209 100644 --- a/rpcs3/Emu/RSX/Overlays/overlays.h +++ b/rpcs3/Emu/RSX/Overlays/overlays.h @@ -90,9 +90,9 @@ namespace rsx bool m_keyboard_pad_handler_active = true; // Initialized as true to prevent keyboard input until proven otherwise. bool m_allow_input_on_pause = false; - static thread_local u64 g_thread_bit; + static thread_local u32 g_thread_bit; - u64 alloc_thread_bit(); + u32 alloc_thread_bit(); std::function on_close = nullptr; @@ -114,7 +114,7 @@ namespace rsx private: user_interface* m_parent; - u64 m_thread_bit; + u32 m_thread_bit; }; public: s32 return_code = 0; // CELL_OK diff --git a/rpcs3/Emu/system_progress.cpp b/rpcs3/Emu/system_progress.cpp index 229fae9197..f829944c39 100644 --- a/rpcs3/Emu/system_progress.cpp +++ b/rpcs3/Emu/system_progress.cpp @@ -37,6 +37,26 @@ void progress_dialog_server::operator()() std::shared_ptr native_dlg; g_system_progress_stopping = false; + const auto get_state = []() + { + auto whole_state = std::make_tuple(+g_progr.load(), +g_progr_ftotal, +g_progr_fdone, +g_progr_ptotal, +g_progr_pdone); + + while (true) + { + auto new_state = std::make_tuple(+g_progr.load(), +g_progr_ftotal, +g_progr_fdone, +g_progr_ptotal, +g_progr_pdone); + + if (new_state == whole_state) + { + // Only leave while it has a complete (atomic) state + return whole_state; + } + + whole_state = std::move(new_state); + } + + return whole_state; + }; + while (!g_system_progress_stopping && thread_ctrl::state() != thread_state::aborting) { // Wait for the start condition @@ -51,29 +71,15 @@ void progress_dialog_server::operator()() if (g_progr_ftotal || g_progr_fdone || g_progr_ptotal || g_progr_pdone) { - auto whole_state = std::make_tuple(+g_progr.load(), +g_progr_ftotal, +g_progr_fdone, +g_progr_ptotal, +g_progr_pdone); - - while (true) - { - const auto new_state = std::make_tuple(+g_progr.load(), +g_progr_ftotal, +g_progr_fdone, +g_progr_ptotal, +g_progr_pdone); - - if (new_state == whole_state) - { - // Only leave while it has a complete (atomic) state - break; - } - - whole_state = new_state; - } - - const auto [text_new, ftotal, fdone, ptotal, pdone] = whole_state; + const auto& [text_new, ftotal, fdone, ptotal, pdone] = get_state(); if (text_new) { text0 = text_new; break; } - else if ((ftotal || ptotal) && ftotal == fdone && ptotal == pdone) + + if ((ftotal || ptotal) && ftotal == fdone && ptotal == pdone) { // Cleanup (missed message but do not cry over spilt milk) g_progr_fdone -= fdone; @@ -157,22 +163,7 @@ void progress_dialog_server::operator()() // Update progress while (!g_system_progress_stopping && thread_ctrl::state() != thread_state::aborting) { - auto whole_state = std::make_tuple(+g_progr.load(), +g_progr_ftotal, +g_progr_fdone, +g_progr_ptotal, +g_progr_pdone); - - while (true) - { - const auto new_state = std::make_tuple(+g_progr.load(), +g_progr_ftotal, +g_progr_fdone, +g_progr_ptotal, +g_progr_pdone); - - if (new_state == whole_state) - { - // Only leave while it has a complete (atomic) state - break; - } - - whole_state = new_state; - } - - const auto [text_new, ftotal_new, fdone_new, ptotal_new, pdone_new] = whole_state; + const auto& [text_new, ftotal_new, fdone_new, ptotal_new, pdone_new] = get_state(); if (ftotal != ftotal_new || fdone != fdone_new || ptotal != ptotal_new || pdone != pdone_new || text_new != text1) { @@ -191,11 +182,16 @@ void progress_dialog_server::operator()() if (show_overlay_message) { // Show a message instead (if compilation period is estimated to be lengthy) - const u64 passed = (get_system_time() - start_time); - - if (pdone < ptotal && g_cfg.misc.show_ppu_compilation_hint && (pdone ? (passed * (ptotal - pdone) / pdone) : (passed * (ptotal + 1))) >= 100'000) + if (pdone < ptotal && g_cfg.misc.show_ppu_compilation_hint) { - rsx::overlays::show_ppu_compile_notification(); + const u64 passed_usec = (get_system_time() - start_time); + const u64 remaining_usec = passed_usec * (pdone ? ((static_cast(ptotal) - pdone) / pdone) : ptotal); + + // Only show compile notification if we estimate at least 100ms + if (remaining_usec >= 100'000ULL) + { + rsx::overlays::show_ppu_compile_notification(); + } } thread_ctrl::wait_for(10000); @@ -219,7 +215,7 @@ void progress_dialog_server::operator()() if (native_dlg) { native_dlg->set_text(text_new); - native_dlg->progress_bar_set_message(0, progr); + native_dlg->progress_bar_set_message(0, std::move(progr)); native_dlg->progress_bar_set_value(0, std::floor(value)); } else if (dlg) diff --git a/rpcs3/rpcs3qt/msg_dialog_frame.cpp b/rpcs3/rpcs3qt/msg_dialog_frame.cpp index e05c1f87e0..32bb19c6f8 100644 --- a/rpcs3/rpcs3qt/msg_dialog_frame.cpp +++ b/rpcs3/rpcs3qt/msg_dialog_frame.cpp @@ -5,8 +5,6 @@ #include #include -constexpr auto qstr = QString::fromStdString; - void msg_dialog_frame::Create(const std::string& msg, const std::string& title) { state = MsgDialogState::Open; @@ -16,10 +14,10 @@ void msg_dialog_frame::Create(const std::string& msg, const std::string& title) Close(true); m_dialog = new custom_dialog(type.disable_cancel); - m_dialog->setWindowTitle(title.empty() ? (type.se_normal ? tr("Normal dialog") : tr("Error dialog")) : qstr(title)); + m_dialog->setWindowTitle(title.empty() ? (type.se_normal ? tr("Normal dialog") : tr("Error dialog")) : QString::fromStdString(title)); m_dialog->setWindowOpacity(type.bg_invisible ? 1. : 0.75); - m_text = new QLabel(qstr(msg)); + m_text = new QLabel(QString::fromStdString(msg)); m_text->setAlignment(Qt::AlignCenter); // Layout @@ -159,7 +157,7 @@ void msg_dialog_frame::SetMsg(const std::string& msg) { if (m_dialog) { - m_text->setText(qstr(msg)); + m_text->setText(QString::fromStdString(msg)); } } @@ -171,14 +169,14 @@ void msg_dialog_frame::ProgressBarSetMsg(u32 index, const std::string& msg) { if (m_text1) { - m_text1->setText(qstr(msg)); + m_text1->setText(QString::fromStdString(msg)); } } else if (index == 1) { if (m_text2) { - m_text2->setText(qstr(msg)); + m_text2->setText(QString::fromStdString(msg)); } } }