From fb07406f102eaa2d237c95c35e8853680d902b6a Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 18 Jan 2026 12:59:25 +0100 Subject: VideoCommon: Defer creating TextureInfo TextureCacheBase::LoadImpl has a hot path where the passed-in TextureInfo never gets used. Instead of passing in a TextureInfo, let's pass in the stage and create the TextureInfo from the stage if needed. This unlocks somewhere above an additional 4% performance boost in the Hoth level of Rogue Squadron 2 on my PC. Performance varies, making it difficult for me to measure, so treat this as a very approximate number. --- Source/Core/VideoCommon/TextureCacheBase.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'Source/Core/VideoCommon/TextureCacheBase.cpp') diff --git a/Source/Core/VideoCommon/TextureCacheBase.cpp b/Source/Core/VideoCommon/TextureCacheBase.cpp index d27234dee9..4b048ef2ac 100644 --- a/Source/Core/VideoCommon/TextureCacheBase.cpp +++ b/Source/Core/VideoCommon/TextureCacheBase.cpp @@ -1231,9 +1231,9 @@ private: std::vector levels; }; -TCacheEntry* TextureCacheBase::Load(const TextureInfo& texture_info) +TCacheEntry* TextureCacheBase::Load(u32 stage) { - if (auto entry = LoadImpl(texture_info, false)) + if (auto entry = LoadImpl(stage, false)) { if (!DidLinkedAssetsChange(*entry)) { @@ -1241,19 +1241,18 @@ TCacheEntry* TextureCacheBase::Load(const TextureInfo& texture_info) } InvalidateTexture(GetTexCacheIter(entry)); - return LoadImpl(texture_info, true); + return LoadImpl(stage, true); } return nullptr; } -TCacheEntry* TextureCacheBase::LoadImpl(const TextureInfo& texture_info, bool force_reload) +TCacheEntry* TextureCacheBase::LoadImpl(u32 stage, bool force_reload) { // if this stage was not invalidated by changes to texture registers, keep the current texture - if (!force_reload && TMEM::IsValid(texture_info.GetStage()) && - m_bound_textures[texture_info.GetStage()]) + if (!force_reload && TMEM::IsValid(stage) && m_bound_textures[stage]) { - TCacheEntry* entry = m_bound_textures[texture_info.GetStage()].get(); + TCacheEntry* entry = m_bound_textures[stage].get(); // If the TMEM configuration is such that this texture is more or less guaranteed to still // be in TMEM, then we know we can reuse the old entry without even hashing the memory // @@ -1263,7 +1262,7 @@ TCacheEntry* TextureCacheBase::LoadImpl(const TextureInfo& texture_info, bool fo // // Spyro: A Hero's Tail is known for (deliberately?) using such overwritten textures // in it's bloom effect, which breaks without giving it the invalidated texture. - if (TMEM::IsCached(texture_info.GetStage())) + if (TMEM::IsCached(stage)) { return entry; } @@ -1276,6 +1275,7 @@ TCacheEntry* TextureCacheBase::LoadImpl(const TextureInfo& texture_info, bool fo } } + const TextureInfo texture_info = TextureInfo::FromStage(stage); auto entry = GetTexture(g_ActiveConfig.iSafeTextureCache_ColorSamples, texture_info); if (!entry) -- cgit v1.2.3