diff --git a/rpcs3/Emu/CMakeLists.txt b/rpcs3/Emu/CMakeLists.txt index 46064425f9..e3e01e6290 100644 --- a/rpcs3/Emu/CMakeLists.txt +++ b/rpcs3/Emu/CMakeLists.txt @@ -370,6 +370,8 @@ target_sources(rpcs3_emu PRIVATE RSX/Overlays/overlays.cpp RSX/Overlays/overlay_shader_compile_notification.cpp RSX/Overlays/overlay_trophy_notification.cpp + RSX/Overlays/Shaders/shader_loading_dialog.cpp + RSX/Overlays/Shaders/shader_loading_dialog_native.cpp RSX/Capture/rsx_capture.cpp RSX/Capture/rsx_replay.cpp RSX/GL/GLCommonDecompiler.cpp diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 81107446a8..a8b159686d 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -4,6 +4,7 @@ #include "GLGSRender.h" #include "GLCompute.h" #include "GLVertexProgram.h" +#include "../Overlays/Shaders/shader_loading_dialog_native.h" #include "../rsx_methods.h" #include "../Common/BufferUtils.h" #include "../rsx_utils.h" @@ -911,62 +912,9 @@ void GLGSRender::on_init_thread() } else { - struct native_helper : gl::shader_cache::progress_dialog_helper - { - rsx::thread *owner = nullptr; - std::shared_ptr dlg; + rsx::shader_loading_dialog_native dlg(this); - native_helper(GLGSRender *ptr) : - owner(ptr) {} - - void create() override - { - MsgDialogType type = {}; - type.disable_cancel = true; - type.progress_bar_count = 2; - - dlg = g_fxo->get()->create(!!g_cfg.video.shader_preloading_dialog.use_custom_background); - dlg->progress_bar_set_taskbar_index(-1); - dlg->show(false, "Loading precompiled shaders from disk...", type, [](s32 status) - { - if (status != CELL_OK) - Emu.Stop(); - }); - } - - void update_msg(u32 index, u32 processed, u32 entry_count) override - { - const char *text = index == 0 ? "Loading pipeline object %u of %u" : "Compiling pipeline object %u of %u"; - dlg->progress_bar_set_message(index, fmt::format(text, processed, entry_count)); - owner->flip({}); - } - - void inc_value(u32 index, u32 value) override - { - dlg->progress_bar_increment(index, static_cast(value)); - owner->flip({}); - } - - void set_limit(u32 index, u32 limit) override - { - dlg->progress_bar_set_limit(index, limit); - owner->flip({}); - } - - void refresh() override - { - dlg->refresh(); - } - - void close() override - { - dlg->return_code = CELL_OK; - dlg->close(); - } - } - helper(this); - - m_shaders_cache->load(&helper); + m_shaders_cache->load(&dlg); } } diff --git a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.cpp b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.cpp new file mode 100644 index 0000000000..57b5a51f2e --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.cpp @@ -0,0 +1,91 @@ +#include "stdafx.h" +#include "shader_loading_dialog.h" + +namespace rsx +{ + void shader_loading_dialog::create(const std::string& msg, const std::string& title) + { + dlg = Emu.GetCallbacks().get_msg_dialog(); + if (dlg) + { + dlg->type.se_normal = true; + dlg->type.bg_invisible = true; + dlg->type.progress_bar_count = 2; + dlg->ProgressBarSetTaskbarIndex(-1); // -1 to combine all progressbars in the taskbar progress + dlg->on_close = [](s32 status) { Emu.CallAfter([]() { Emu.Stop(); }); }; + + ref_cnt++; + + Emu.CallAfter([&]() + { + dlg->Create(msg, title); + ref_cnt--; + }); + } + + while (ref_cnt.load() && !Emu.IsStopped()) + { + _mm_pause(); + } + } + + void shader_loading_dialog::update_msg(u32 index, const std::string& msg) + { + if (!dlg) + { + return; + } + + ref_cnt++; + + Emu.CallAfter([&, index, msg]() + { + dlg->ProgressBarSetMsg(index, msg); + ref_cnt--; + }); + } + + void shader_loading_dialog::inc_value(u32 index, u32 value) + { + if (!dlg) + { + return; + } + + ref_cnt++; + + Emu.CallAfter([&, index, value]() + { + dlg->ProgressBarInc(index, value); + ref_cnt--; + }); + } + + void shader_loading_dialog::set_limit(u32 index, u32 limit) + { + if (!dlg) + { + return; + } + + ref_cnt++; + + Emu.CallAfter([&, index, limit]() + { + dlg->ProgressBarSetLimit(index, limit); + ref_cnt--; + }); + } + + void shader_loading_dialog::refresh() + { + } + + void shader_loading_dialog::close() + { + while (ref_cnt.load() && !Emu.IsStopped()) + { + _mm_pause(); + } + } +} diff --git a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.h b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.h new file mode 100644 index 0000000000..5a49ae1b39 --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog.h @@ -0,0 +1,20 @@ +#pragma once + +#include "Emu/System.h" +#include "Emu/Cell/Modules/cellMsgDialog.h" + +namespace rsx +{ + struct shader_loading_dialog + { + std::shared_ptr dlg; + atomic_t ref_cnt; + + virtual void create(const std::string& msg, const std::string& title); + virtual void update_msg(u32 index, const std::string& msg); + virtual void inc_value(u32 index, u32 value); + virtual void set_limit(u32 index, u32 limit); + virtual void refresh(); + virtual void close(); + }; +} diff --git a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.cpp b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.cpp new file mode 100644 index 0000000000..cf5c1f09d1 --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.cpp @@ -0,0 +1,54 @@ +#include "stdafx.h" +#include "shader_loading_dialog_native.h" + +namespace rsx +{ + shader_loading_dialog_native::shader_loading_dialog_native(GSRender* ptr) + : owner(ptr) + { + } + + void shader_loading_dialog_native::create(const std::string& msg, const std::string&/* title*/) + { + MsgDialogType type = {}; + type.disable_cancel = true; + type.progress_bar_count = 2; + + dlg = g_fxo->get()->create(!!g_cfg.video.shader_preloading_dialog.use_custom_background); + dlg->progress_bar_set_taskbar_index(-1); + dlg->show(false, msg, type, [](s32 status) + { + if (status != CELL_OK) + Emu.Stop(); + }); + } + + void shader_loading_dialog_native::update_msg(u32 index, const std::string& msg) + { + dlg->progress_bar_set_message(index, msg); + owner->flip({}); + } + + void shader_loading_dialog_native::inc_value(u32 index, u32 value) + { + dlg->progress_bar_increment(index, static_cast(value)); + owner->flip({}); + } + + void shader_loading_dialog_native::set_limit(u32 index, u32 limit) + { + dlg->progress_bar_set_limit(index, limit); + owner->flip({}); + } + + void shader_loading_dialog_native::refresh() + { + dlg->refresh(); + } + + void shader_loading_dialog_native::close() + { + dlg->return_code = CELL_OK; + dlg->close(); + } +} diff --git a/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.h b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.h new file mode 100644 index 0000000000..c9d25d226c --- /dev/null +++ b/rpcs3/Emu/RSX/Overlays/Shaders/shader_loading_dialog_native.h @@ -0,0 +1,22 @@ +#pragma once + +#include "shader_loading_dialog.h" +#include "../../GSRender.h" + +namespace rsx +{ + struct shader_loading_dialog_native : rsx::shader_loading_dialog + { + rsx::thread* owner = nullptr; + std::shared_ptr dlg; + + 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 inc_value(u32 index, u32 value) override; + void set_limit(u32 index, u32 limit) override; + void refresh() override; + void close() override; + }; +} diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 165df436c1..8450b09eb6 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2,6 +2,7 @@ #include "Emu/Memory/vm.h" #include "Emu/System.h" #include "VKGSRender.h" +#include "../Overlays/Shaders/shader_loading_dialog_native.h" #include "../rsx_methods.h" #include "../rsx_utils.h" #include "../Common/BufferUtils.h" @@ -1879,63 +1880,10 @@ void VKGSRender::on_init_thread() } else { - struct native_helper : vk::shader_cache::progress_dialog_helper - { - rsx::thread *owner = nullptr; - std::shared_ptr dlg; - - native_helper(VKGSRender *ptr) : - owner(ptr) {} - - void create() override - { - MsgDialogType type = {}; - type.disable_cancel = true; - type.progress_bar_count = 2; - - dlg = g_fxo->get()->create(!!g_cfg.video.shader_preloading_dialog.use_custom_background); - dlg->progress_bar_set_taskbar_index(-1); - dlg->show(false, "Loading precompiled shaders from disk...", type, [](s32 status) - { - if (status != CELL_OK) - Emu.Stop(); - }); - } - - void update_msg(u32 index, u32 processed, u32 entry_count) override - { - const char *text = index == 0 ? "Loading pipeline object %u of %u" : "Compiling pipeline object %u of %u"; - dlg->progress_bar_set_message(index, fmt::format(text, processed, entry_count)); - owner->flip({}); - } - - void inc_value(u32 index, u32 value) override - { - dlg->progress_bar_increment(index, static_cast(value)); - owner->flip({}); - } - - void set_limit(u32 index, u32 limit) override - { - dlg->progress_bar_set_limit(index, limit); - owner->flip({}); - } - - void refresh() override - { - dlg->refresh(); - } - - void close() override - { - dlg->return_code = CELL_OK; - dlg->close(); - } - } - helper(this); + rsx::shader_loading_dialog_native dlg(this); // TODO: Handle window resize messages during loading on GPUs without OUT_OF_DATE_KHR support - m_shaders_cache->load(&helper, *m_device, pipeline_layout); + m_shaders_cache->load(&dlg, *m_device, pipeline_layout); } } diff --git a/rpcs3/Emu/RSX/rsx_cache.h b/rpcs3/Emu/RSX/rsx_cache.h index ddb461f911..44fddcbdfb 100644 --- a/rpcs3/Emu/RSX/rsx_cache.h +++ b/rpcs3/Emu/RSX/rsx_cache.h @@ -5,9 +5,9 @@ #include "Emu/Memory/vm.h" #include "gcm_enums.h" #include "Common/ProgramStateCache.h" -#include "Emu/Cell/Modules/cellMsgDialog.h" #include "Emu/System.h" #include "Common/texture_cache_checker.h" +#include "Overlays/Shaders/shader_loading_dialog.h" #include "rsx_utils.h" #include @@ -423,104 +423,6 @@ namespace rsx public: - struct progress_dialog_helper - { - std::shared_ptr dlg; - atomic_t ref_cnt; - - virtual void create() - { - dlg = Emu.GetCallbacks().get_msg_dialog(); - if (dlg) - { - dlg->type.se_normal = true; - dlg->type.bg_invisible = true; - dlg->type.progress_bar_count = 2; - dlg->ProgressBarSetTaskbarIndex(-1); // -1 to combine all progressbars in the taskbar progress - dlg->on_close = [](s32 status) - { - Emu.CallAfter([]() - { - Emu.Stop(); - }); - }; - - ref_cnt++; - - Emu.CallAfter([&]() - { - dlg->Create("Preloading cached shaders from disk.\nPlease wait...", "Shader Compilation"); - ref_cnt--; - }); - } - - while (ref_cnt.load() && !Emu.IsStopped()) - { - _mm_pause(); - } - } - - virtual void update_msg(u32 index, u32 processed, u32 entry_count) - { - if (!dlg) - { - return; - } - - ref_cnt++; - - Emu.CallAfter([&, index, processed, entry_count]() - { - const char *text = index == 0 ? "Loading pipeline object %u of %u" : "Compiling pipeline object %u of %u"; - dlg->ProgressBarSetMsg(index, fmt::format(text, processed, entry_count)); - ref_cnt--; - }); - } - - virtual void inc_value(u32 index, u32 value) - { - if (!dlg) - { - return; - } - - ref_cnt++; - - Emu.CallAfter([&, index, value]() - { - dlg->ProgressBarInc(index, value); - ref_cnt--; - }); - } - - virtual void set_limit(u32 index, u32 limit) - { - if (!dlg) - { - return; - } - - ref_cnt++; - - Emu.CallAfter([&, index, limit]() - { - dlg->ProgressBarSetLimit(index, limit); - ref_cnt--; - }); - } - - virtual void refresh() - {} - - virtual void close() - { - while (ref_cnt.load() && !Emu.IsStopped()) - { - _mm_pause(); - } - } - }; - shaders_cache(backend_storage& storage, std::string pipeline_class, std::string version_prefix_str = "v1") : version_prefix(std::move(version_prefix_str)) , pipeline_class_name(std::move(pipeline_class)) @@ -533,7 +435,7 @@ namespace rsx } template - void load(progress_dialog_helper* dlg, Args&& ...args) + void load(shader_loading_dialog* dlg, Args&& ...args) { if (g_cfg.video.disable_on_disk_shader_cache) { @@ -573,18 +475,24 @@ namespace rsx std::vector invalid_entries; // Progress dialog - std::unique_ptr fallback_dlg; + std::unique_ptr fallback_dlg; if (!dlg) { - fallback_dlg = std::make_unique(); + fallback_dlg = std::make_unique(); dlg = fallback_dlg.get(); } - dlg->create(); + const auto getMessage = [](u32 index, u32 processed, u32 entry_count) -> std::string + { + const char* text = index == 0 ? "Loading pipeline object %u of %u" : "Compiling pipeline object %u of %u"; + return fmt::format(text, processed, entry_count); + }; + + dlg->create("Preloading cached shaders from disk.\nPlease wait...", "Shader Compilation"); dlg->set_limit(0, entry_count); dlg->set_limit(1, entry_count); - dlg->update_msg(0, 0, entry_count); - dlg->update_msg(1, 0, entry_count); + dlg->update_msg(0, getMessage(0, 0, entry_count)); + dlg->update_msg(1, getMessage(0, 0, entry_count)); // Setup worker threads unsigned nb_threads = std::thread::hardware_concurrency(); @@ -620,7 +528,7 @@ namespace rsx processed_since_last_update++; if ((std::chrono::duration_cast(now - last_update) > 100ms) || (i == entry_count - 1)) { - dlg->update_msg(0, i + 1, entry_count); + dlg->update_msg(0, getMessage(0, i + 1, entry_count)); dlg->inc_value(0, processed_since_last_update); last_update = now; processed_since_last_update = 0; @@ -663,7 +571,7 @@ namespace rsx if (processed_since_last_update > 0) { - dlg->update_msg(1, current_progress, entry_count); + dlg->update_msg(1, getMessage(0, current_progress, entry_count)); dlg->inc_value(1, processed_since_last_update); } } @@ -685,7 +593,7 @@ namespace rsx processed_since_last_update++; if ((std::chrono::duration_cast(now - last_update) > 100ms) || (pos == entry_count - 1)) { - dlg->update_msg(1, pos + 1, entry_count); + dlg->update_msg(1, getMessage(0, pos + 1, entry_count)); dlg->inc_value(1, processed_since_last_update); last_update = now; processed_since_last_update = 0; diff --git a/rpcs3/emucore.vcxproj b/rpcs3/emucore.vcxproj index ab583b869d..d4355889c8 100644 --- a/rpcs3/emucore.vcxproj +++ b/rpcs3/emucore.vcxproj @@ -70,6 +70,8 @@ + + NotUsing @@ -395,6 +397,8 @@ + + diff --git a/rpcs3/emucore.vcxproj.filters b/rpcs3/emucore.vcxproj.filters index 49246ff690..a9ae15c02e 100644 --- a/rpcs3/emucore.vcxproj.filters +++ b/rpcs3/emucore.vcxproj.filters @@ -69,6 +69,9 @@ {7536c5ad-d58f-40a7-96db-74d959fa4c02} + + {f368580d-07bc-4c8b-b488-a4198f2dd17d} + @@ -836,6 +839,12 @@ Crypto + + Emu\GPU\RSX\Overlays\Shaders + + + Emu\GPU\RSX\Overlays\Shaders + @@ -1585,5 +1594,11 @@ Emu\Cell\Modules + + Emu\GPU\RSX\Overlays\Shaders + + + Emu\GPU\RSX\Overlays\Shaders + \ No newline at end of file