From 870224cde007d65edc335d5211b8391883b59115 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 4 Dec 2019 23:17:57 +0100 Subject: [PATCH] Emu/overlay: ingame native overlay PPU compilation --- rpcs3/Emu/Cell/PPUThread.cpp | 47 ++++++++++++++--- rpcs3/Emu/Cell/SPURecompiler.cpp | 7 +++ .../RSX/Overlays/overlay_message_dialog.cpp | 15 ++++-- .../Emu/RSX/Overlays/overlay_message_dialog.h | 2 + rpcs3/Emu/System.cpp | 52 +++++++++++++++---- 5 files changed, 102 insertions(+), 21 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 78b63ef22..0a4c4b9f4 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -80,6 +80,7 @@ const bool s_use_ssse3 = utils::has_ssse3(); extern atomic_t g_watchdog_hold_ctr; extern atomic_t g_progr; +extern atomic_t g_progr_show; extern atomic_t g_progr_ftotal; extern atomic_t g_progr_fdone; extern atomic_t g_progr_ptotal; @@ -2400,9 +2401,9 @@ extern void ppu_precompile(std::vector& dir_queue, std::vector fnext = 0; @@ -2519,6 +2520,8 @@ extern void ppu_precompile(std::vector& dir_queue, std::vector g_progr; +extern atomic_t g_progr_show; extern atomic_t g_progr_ptotal; extern atomic_t g_progr_pdone; @@ -426,6 +427,7 @@ void spu_cache::initialize() g_progr = "Building SPU cache..."; g_progr_ptotal += ::size32(func_list); + g_progr_show = true; worker_count = Emu.GetMaxThreads(); } @@ -525,6 +527,11 @@ void spu_cache::initialize() spu_log.notice("SPU Runtime: Worker %u built %u programs.", i + 1, workers[i]); } + if (g_cfg.core.spu_decoder == spu_decoder_type::asmjit || g_cfg.core.spu_decoder == spu_decoder_type::llvm) + { + g_progr_show = false; + } + if (Emu.IsStopped()) { spu_log.error("SPU Runtime: Cache building aborted."); diff --git a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp index ec5e2e100..ee5c36e4f 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.cpp @@ -209,11 +209,7 @@ namespace rsx btn_cancel.translate(0, offset); } - text_display.set_text(text); - - u16 text_w, text_h; - text_display.measure_text(text_w, text_h); - text_display.translate(0, -(text_h - 16)); + set_text(text); switch (type.button_type.unshifted()) { @@ -306,6 +302,15 @@ namespace rsx return CELL_OK; } + void message_dialog::set_text(const std::string& text) + { + u16 text_w, text_h; + text_display.set_pos(90, 364); + text_display.set_text(text); + text_display.measure_text(text_w, text_h); + text_display.translate(0, -(text_h - 16)); + } + u32 message_dialog::progress_bar_count() { return num_progress_bars; diff --git a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.h b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.h index 16cce420f..5b5b1d1c5 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_message_dialog.h @@ -35,6 +35,8 @@ 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); + u32 progress_bar_count(); void progress_bar_set_taskbar_index(s32 index); error_code progress_bar_set_message(u32 index, const std::string& msg); diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index bf1fad3f8..80161bc52 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -25,6 +25,7 @@ #include "Emu/title.h" #include "Emu/IdManager.h" #include "Emu/RSX/Capture/rsx_replay.h" +#include "Emu/RSX/Overlays/overlay_message_dialog.h" #include "Loader/PSF.h" #include "Loader/ELF.h" @@ -82,6 +83,7 @@ std::mutex g_tty_mutex; // Progress display server synchronization variables atomic_t g_progr{""}; +atomic_t g_progr_show{false}; atomic_t g_progr_ftotal{0}; atomic_t g_progr_fdone{0}; atomic_t g_progr_ptotal{0}; @@ -341,7 +343,7 @@ namespace while (thread_ctrl::state() != thread_state::aborting) { // Wait for the start condition - while (!g_progr_ftotal && !g_progr_ptotal) + while (!g_progr_show) { if (thread_ctrl::state() == thread_state::aborting) { @@ -357,9 +359,29 @@ namespace } // Initialize message dialog - std::shared_ptr dlg = Emu.GetCallbacks().get_msg_dialog(); - if (dlg) + std::shared_ptr dlg; + std::shared_ptr native_dlg; + + if (const auto renderer = rsx::get_current_renderer(); + renderer && renderer->is_inited) { + if (auto manager = g_fxo->try_get()) + { + MsgDialogType type{}; + type.se_normal = true; + type.bg_invisible = true; + type.disable_cancel = true; + type.progress_bar_count = 1; + + native_dlg = manager->create(!!g_cfg.video.shader_preloading_dialog.use_custom_background); + native_dlg->show(false, +g_progr, type, nullptr); + native_dlg->progress_bar_set_message(0, "Please wait"); + } + } + + if (!native_dlg) + { + dlg = Emu.GetCallbacks().get_msg_dialog(); dlg->type.se_normal = true; dlg->type.bg_invisible = true; dlg->type.progress_bar_count = 1; @@ -414,7 +436,13 @@ namespace if (ptotal) fmt::append(progr, " module %u of %u", pdone, ptotal); - if (dlg) + if (native_dlg) + { + native_dlg->set_text(+g_progr); + native_dlg->progress_bar_set_message(0, progr); + native_dlg->progress_bar_set_value(0, std::floor(value)); + } + else if (dlg) { dlg->SetMsg(+g_progr); dlg->ProgressBarSetMsg(0, progr); @@ -423,7 +451,7 @@ namespace }); } - if (fdone >= ftotal && pdone >= ptotal) + if (!g_progr_show) { // Close dialog break; @@ -442,14 +470,19 @@ namespace g_progr_fdone -= fdone; g_progr_ptotal -= ptotal; g_progr_pdone -= pdone; + g_progr_show = false; - if (dlg) + Emu.CallAfter([=]() { - Emu.CallAfter([=]() + if (native_dlg) + { + native_dlg->close(false, false); + } + else if (dlg) { dlg->Close(true); - }); - } + } + }); } } @@ -459,6 +492,7 @@ namespace g_progr_fdone.release(0); g_progr_ptotal.release(0); g_progr_pdone.release(0); + g_progr_show.release(false); } static auto constexpr thread_name = "Progress Dialog Server"sv;