From f4f8aa587eac7b3b671a70ca66e0c1d851de43c7 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 18 Oct 2025 20:17:34 +1000 Subject: [PATCH] FullscreenUI: Defer more resource loads That way we're not compiling the background shader (if any) when we're just using the pause menu. --- src/core/fullscreenui.cpp | 39 +++++++++--------------------- src/core/fullscreenui_private.h | 26 ++++++++++++-------- src/core/fullscreenui_settings.cpp | 10 ++++++-- 3 files changed, 35 insertions(+), 40 deletions(-) diff --git a/src/core/fullscreenui.cpp b/src/core/fullscreenui.cpp index 36cec89e8..3c5d65713 100644 --- a/src/core/fullscreenui.cpp +++ b/src/core/fullscreenui.cpp @@ -90,7 +90,6 @@ static void DrawShaderBackgroundCallback(const ImDrawList* parent_list, const Im ////////////////////////////////////////////////////////////////////////// // Resources ////////////////////////////////////////////////////////////////////////// -static void LoadResources(); static void DestroyResources(); static GPUTexture* GetUserThemeableTexture( const std::string_view png_name, const std::string_view svg_name, bool* is_colorable = nullptr, @@ -167,12 +166,10 @@ struct ALIGN_TO_CACHE_LINE WidgetsState PauseSubMenu current_pause_submenu = PauseSubMenu::None; MainWindowType previous_main_window = MainWindowType::None; bool initialized = false; + bool background_loaded = false; bool pause_menu_was_open = false; bool was_paused_on_quick_menu_open = false; - // Resources - std::shared_ptr app_icon_texture; - // Background std::unique_ptr app_background_texture; std::unique_ptr app_background_shader; @@ -205,9 +202,6 @@ void FullscreenUI::Initialize() s_state.initialized = true; - LoadResources(); - LoadBackground(); - // in case we open the pause menu while the game is running if (s_state.current_main_window == MainWindowType::None && !GPUThread::HasGPUBackend() && !GPUThread::IsGPUBackendRequested()) @@ -572,26 +566,10 @@ void FullscreenUI::Render() UpdateTransitionState(); } -void FullscreenUI::InvalidateCoverCache() -{ - if (!GPUThread::IsFullscreenUIRequested()) - return; - - GPUThread::RunOnThread(&FullscreenUI::ClearCoverCache); -} - -void FullscreenUI::LoadResources() -{ - s_state.app_icon_texture = LoadTexture("images/duck.png"); - - InitializeHotkeyList(); -} - void FullscreenUI::DestroyResources() { s_state.app_background_texture.reset(); s_state.app_background_shader.reset(); - s_state.app_icon_texture.reset(); } GPUTexture* FullscreenUI::GetUserThemeableTexture(const std::string_view png_name, const std::string_view svg_name, @@ -661,7 +639,6 @@ void FullscreenUI::UpdateCurrentTimeString() // Utility ////////////////////////////////////////////////////////////////////////// - void FullscreenUI::DoStartPath(std::string path, std::string state, std::optional fast_boot) { if (GPUThread::HasGPUBackend()) @@ -1018,13 +995,14 @@ bool FullscreenUI::HasBackground() return static_cast(s_state.app_background_texture || s_state.app_background_shader); } -void FullscreenUI::LoadBackground() +void FullscreenUI::UpdateBackground() { if (!IsInitialized()) return; g_gpu_device->RecycleTexture(std::move(s_state.app_background_texture)); s_state.app_background_shader.reset(); + s_state.background_loaded = true; const TinyString background_name = Host::GetBaseTinyStringSettingValue("Main", "FullscreenUIBackground", DEFAULT_BACKGROUND_NAME); @@ -1199,6 +1177,9 @@ bool FullscreenUI::LoadBackgroundImage(const std::string& path, Error* error) void FullscreenUI::DrawBackground() { + if (!s_state.background_loaded) + UpdateBackground(); + if (s_state.app_background_shader) { ImDrawList* dl = ImGui::GetBackgroundDrawList(); @@ -1251,7 +1232,9 @@ void FullscreenUI::DrawLandingTemplate(ImVec2* menu_pos, ImVec2* menu_size) { const ImVec2 logo_pos = LayoutScale(LAYOUT_MENU_BUTTON_X_PADDING, LAYOUT_MENU_BUTTON_Y_PADDING); const ImVec2 logo_size = ImVec2(UIStyle.LargeFontSize, UIStyle.LargeFontSize); - dl->AddImage(s_state.app_icon_texture.get(), logo_pos, logo_pos + logo_size); + GPUTexture* const logo_texture = + GetUserThemeableTexture("images/duck.png", "images/duck.svg", nullptr, logo_size); + dl->AddImage(logo_texture, logo_pos, logo_pos + logo_size); const std::string_view heading_text = "DuckStation"; const ImVec2 text_size = heading_font->CalcTextSizeA(heading_font_size, heading_font_weight, FLT_MAX, 0.0f, @@ -2270,7 +2253,6 @@ void FullscreenUI::DrawResumeStateSelector() EndFixedPopupDialog(); } - ////////////////////////////////////////////////////////////////////////// // Overlays ////////////////////////////////////////////////////////////////////////// @@ -2303,7 +2285,8 @@ void FullscreenUI::DrawAboutWindow() const ImVec2 image_size = LayoutScale(64.0f, 64.0f); const float indent = image_size.x + LayoutScale(8.0f); - ImGui::GetWindowDrawList()->AddImage(s_state.app_icon_texture.get(), ImGui::GetCursorScreenPos(), + GPUTexture* const logo_texture = GetUserThemeableTexture("images/duck.png", "images/duck.svg", nullptr, image_size); + ImGui::GetWindowDrawList()->AddImage(logo_texture, ImGui::GetCursorScreenPos(), ImGui::GetCursorScreenPos() + image_size); ImGui::SetCursorPosX(ImGui::GetCursorPosX() + indent); ImGui::PushFont(nullptr, 0.0f, UIStyle.BoldFontWeight); diff --git a/src/core/fullscreenui_private.h b/src/core/fullscreenui_private.h index ba2dbd8a3..85afde093 100644 --- a/src/core/fullscreenui_private.h +++ b/src/core/fullscreenui_private.h @@ -48,6 +48,10 @@ enum class SettingsPage : u8 Count }; +////////////////////////////////////////////////////////////////////////// +// Utility +////////////////////////////////////////////////////////////////////////// + void SwitchToMainWindow(MainWindowType type); void ReturnToMainWindow(); void ReturnToMainWindow(float transition_time); @@ -56,12 +60,20 @@ bool AreAnyDialogsOpen(); void ExitFullscreenAndOpenURL(std::string_view url); void CopyTextToClipboard(std::string title, std::string_view text); -FileSelectorFilters GetDiscImageFilters(); -FileSelectorFilters GetImageFilters(); +////////////////////////////////////////////////////////////////////////// +// Landing +////////////////////////////////////////////////////////////////////////// + +inline constexpr const char* DEFAULT_BACKGROUND_NAME = "StaticGray"; +inline constexpr const char* NONE_BACKGROUND_NAME = "None"; +ImVec4 GetTransparentBackgroundColor(const ImVec4& no_background_color = UIStyle.BackgroundColor); +ChoiceDialogOptions GetBackgroundOptions(const TinyString& current_value); +void UpdateBackground(); ////////////////////////////////////////////////////////////////////////// // Save State List ////////////////////////////////////////////////////////////////////////// + bool OpenLoadStateSelectorForGameResume(const GameList::Entry* entry); void OpenSaveStateSelector(const std::string& serial, const std::string& path, bool is_loading); void DoResume(); @@ -71,6 +83,8 @@ void DoResume(); ////////////////////////////////////////////////////////////////////////// bool ShouldOpenToGameList(); +FileSelectorFilters GetDiscImageFilters(); +FileSelectorFilters GetImageFilters(); void ClearGameListState(); void SwitchToGameList(); @@ -87,7 +101,6 @@ void ClearCoverCache(); // Settings ////////////////////////////////////////////////////////////////////////// -void InitializeHotkeyList(); void ClearSettingsState(); void SwitchToSettings(); bool SwitchToGameSettings(SettingsPage page = SettingsPage::Summary); @@ -98,11 +111,4 @@ void DrawSettingsWindow(); SettingsPage GetCurrentSettingsPage(); bool IsInputBindingDialogOpen(); -// TODO: Move to widgets or something -inline constexpr const char* DEFAULT_BACKGROUND_NAME = "StaticGray"; -inline constexpr const char* NONE_BACKGROUND_NAME = "None"; -ImVec4 GetTransparentBackgroundColor(const ImVec4& no_background_color = UIStyle.BackgroundColor); -ChoiceDialogOptions GetBackgroundOptions(const TinyString& current_value); -void LoadBackground(); - } // namespace FullscreenUI diff --git a/src/core/fullscreenui_settings.cpp b/src/core/fullscreenui_settings.cpp index 99091c8a7..d87537d32 100644 --- a/src/core/fullscreenui_settings.cpp +++ b/src/core/fullscreenui_settings.cpp @@ -73,6 +73,8 @@ struct PostProcessingStageInfo } // namespace +static void PopulateHotkeyList(); + static void DrawSummarySettingsPage(bool show_localized_titles); static void DrawInterfaceSettingsPage(); static void DrawGameListSettingsPage(); @@ -1519,8 +1521,11 @@ void FullscreenUI::StartClearBindingsForPort(u32 port) }); } -void FullscreenUI::InitializeHotkeyList() +void FullscreenUI::PopulateHotkeyList() { + if (!s_settings_locals.hotkey_list_cache.empty()) + return; + // sort hotkeys by category so we don't duplicate the groups const auto hotkeys = InputManager::GetHotkeyList(); s_settings_locals.hotkey_list_cache.reserve(hotkeys.size()); @@ -1589,6 +1594,7 @@ void FullscreenUI::SwitchToSettings() PopulateGraphicsAdapterList(); PopulatePostProcessingChain(GetEditingSettingsInterface(), PostProcessing::Config::DISPLAY_CHAIN_SECTION); + PopulateHotkeyList(); if (!IsEditingGameSettings(GetEditingSettingsInterface())) { @@ -2137,7 +2143,7 @@ void FullscreenUI::DrawInterfaceSettingsPage() // Have to defer the reload, because we've already drawn the bg for this frame. BeginTransition(LONG_TRANSITION_TIME, {}); - Host::RunOnCPUThread([]() { GPUThread::RunOnThread(&FullscreenUI::LoadBackground); }); + Host::RunOnCPUThread([]() { GPUThread::RunOnThread(&FullscreenUI::UpdateBackground); }); }); }