From 2b280bddd0b9ae48691b186bc95fe087364ebdf5 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Tue, 13 May 2025 21:20:09 +1000 Subject: [PATCH] GPU/TextureCache: Display replacement info on game start --- src/core/gpu_hw.cpp | 2 +- src/core/gpu_hw_texture_cache.cpp | 26 +++++++++++++++++--------- src/core/gpu_hw_texture_cache.h | 2 +- src/core/gpu_thread.cpp | 3 ++- src/core/hotkeys.cpp | 2 +- src/duckstation-qt/qthost.cpp | 2 +- 6 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/core/gpu_hw.cpp b/src/core/gpu_hw.cpp index 0f0b5a17b..c64128477 100644 --- a/src/core/gpu_hw.cpp +++ b/src/core/gpu_hw.cpp @@ -299,7 +299,7 @@ bool GPU_HW::Initialize(bool upload_vram, Error* error) else { // Still potentially have VRAM texture replacements. - GPUTextureCache::ReloadTextureReplacements(false); + GPUTextureCache::ReloadTextureReplacements(System::GetState() == System::State::Starting, false); } UpdateDownsamplingLevels(); diff --git a/src/core/gpu_hw_texture_cache.cpp b/src/core/gpu_hw_texture_cache.cpp index 50a54380f..ebfef9f32 100644 --- a/src/core/gpu_hw_texture_cache.cpp +++ b/src/core/gpu_hw_texture_cache.cpp @@ -27,6 +27,7 @@ #include "common/timer.h" #include "IconsEmoji.h" +#include "IconsFontAwesome5.h" #ifndef XXH_STATIC_LINKING_ONLY #define XXH_STATIC_LINKING_ONLY @@ -599,8 +600,12 @@ bool GPUTextureCache::Initialize(GPU_HW* backend, Error* error) s_state.hw_backend = backend; SetHashCacheTextureFormat(); - ReloadTextureReplacements(false); + + // note: safe because the CPU thread is waiting for the GPU thread to finish initializing + ReloadTextureReplacements(System::GetState() == System::State::Starting, false); + UpdateVRAMTrackingState(); + if (!CompilePipelines(error)) return false; @@ -639,7 +644,7 @@ bool GPUTextureCache::UpdateSettings(bool use_texture_cache, const GPUSettings& } } - ReloadTextureReplacements(false); + ReloadTextureReplacements(false, false); } UpdateVRAMTrackingState(); @@ -2719,7 +2724,7 @@ size_t GPUTextureCache::DumpedTextureKeyHash::operator()(const DumpedTextureKey& void GPUTextureCache::GameSerialChanged() { - ReloadTextureReplacements(false); + ReloadTextureReplacements(false, false); } GPUTexture* GPUTextureCache::GetVRAMReplacement(u32 width, u32 height, const void* pixels) @@ -3618,7 +3623,7 @@ bool GPUTextureCache::LoadLocalConfiguration(bool load_vram_write_replacement_al return (s_state.config != old_config); } -void GPUTextureCache::ReloadTextureReplacements(bool show_info) +void GPUTextureCache::ReloadTextureReplacements(bool show_info, bool show_info_if_none) { s_state.dumped_textures.clear(); s_state.dumped_vram_writes.clear(); @@ -3655,11 +3660,14 @@ void GPUTextureCache::ReloadTextureReplacements(bool show_info) const int total = static_cast(s_state.vram_replacements.size() + s_state.vram_write_texture_replacements.size() + s_state.texture_page_texture_replacements.size()); - Host::AddIconOSDMessage("ReloadTextureReplacements", ICON_EMOJI_REFRESH, - (total > 0) ? TRANSLATE_PLURAL_STR("GPU_HW", "%n replacement textures found.", - "Replacement texture count", total) : - TRANSLATE_STR("GPU_HW", "No replacement textures found."), - Host::OSD_INFO_DURATION); + if (total > 0 || show_info_if_none) + { + Host::AddIconOSDMessage("ReloadTextureReplacements", ICON_FA_IMAGES, + (total > 0) ? TRANSLATE_PLURAL_STR("GPU_HW", "%n replacement textures found.", + "Replacement texture count", total) : + TRANSLATE_STR("GPU_HW", "No replacement textures found."), + Host::OSD_INFO_DURATION); + } } } diff --git a/src/core/gpu_hw_texture_cache.h b/src/core/gpu_hw_texture_cache.h index 258c81f37..23d11fb22 100644 --- a/src/core/gpu_hw_texture_cache.h +++ b/src/core/gpu_hw_texture_cache.h @@ -130,7 +130,7 @@ bool AreSourcePagesDrawn(SourceKey key, const GSVector4i rect); void Compact(); void GameSerialChanged(); -void ReloadTextureReplacements(bool show_info); +void ReloadTextureReplacements(bool show_info, bool show_info_if_none); // VRAM Write Replacements GPUTexture* GetVRAMReplacement(u32 width, u32 height, const void* pixels); diff --git a/src/core/gpu_thread.cpp b/src/core/gpu_thread.cpp index a9a599744..8868ba4f3 100644 --- a/src/core/gpu_thread.cpp +++ b/src/core/gpu_thread.cpp @@ -1399,7 +1399,8 @@ void GPUThread::SetGameSerial(std::string serial) s_state.game_serial = std::move(serial); if (changed) { - GPUTextureCache::GameSerialChanged(); + if (HasGPUBackend()) + GPUTextureCache::GameSerialChanged(); if (SaveStateSelectorUI::IsOpen()) SaveStateSelectorUI::RefreshList(); } diff --git a/src/core/hotkeys.cpp b/src/core/hotkeys.cpp index 4896136db..0206f78cf 100644 --- a/src/core/hotkeys.cpp +++ b/src/core/hotkeys.cpp @@ -464,7 +464,7 @@ DEFINE_HOTKEY("ReloadPostProcessingShaders", TRANSLATE_NOOP("Hotkeys", "Graphics DEFINE_HOTKEY("ReloadTextureReplacements", TRANSLATE_NOOP("Hotkeys", "Graphics"), TRANSLATE_NOOP("Hotkeys", "Reload Texture Replacements"), [](s32 pressed) { if (!pressed && System::IsValid()) - GPUThread::RunOnThread([]() { GPUTextureCache::ReloadTextureReplacements(true); }); + GPUThread::RunOnThread([]() { GPUTextureCache::ReloadTextureReplacements(true, true); }); }) DEFINE_HOTKEY("IncreaseResolutionScale", TRANSLATE_NOOP("Hotkeys", "Graphics"), diff --git a/src/duckstation-qt/qthost.cpp b/src/duckstation-qt/qthost.cpp index 19b6818c9..45c0a3052 100644 --- a/src/duckstation-qt/qthost.cpp +++ b/src/duckstation-qt/qthost.cpp @@ -1343,7 +1343,7 @@ void EmuThread::reloadTextureReplacements() } if (System::IsValid()) - GPUThread::RunOnThread([]() { GPUTextureCache::ReloadTextureReplacements(true); }); + GPUThread::RunOnThread([]() { GPUTextureCache::ReloadTextureReplacements(true, true); }); } void EmuThread::captureGPUFrameDump()