From edb66dab8469736e5c2954fd3ffb9704de4542c3 Mon Sep 17 00:00:00 2001 From: Scott Mansell Date: Sun, 10 Oct 2021 14:08:19 +1300 Subject: [PATCH] TextureCache: Remove deleted textures from bound_textures Fixes issue where vulkan might crash trying to bind a deleted texture. --- Source/Core/VideoCommon/TextureCacheBase.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Source/Core/VideoCommon/TextureCacheBase.cpp b/Source/Core/VideoCommon/TextureCacheBase.cpp index 9a01b57007..0f66284180 100644 --- a/Source/Core/VideoCommon/TextureCacheBase.cpp +++ b/Source/Core/VideoCommon/TextureCacheBase.cpp @@ -2552,13 +2552,21 @@ TextureCacheBase::InvalidateTexture(TexAddrCache::iterator iter, bool discard_pe for (size_t i = 0; i < bound_textures.size(); ++i) { - // If the entry is currently bound and tmem has it recorded as cached, keep it, but mark it as - // invalidated. This way it can still be used via tmem cache emulation, but nothing else. - // Spyro: A Hero's Tail is known for using such overwritten textures. - if (bound_textures[i] == entry && TMEM::IsCached(static_cast(i))) + if (bound_textures[i] == entry) { - bound_textures[i]->tmem_only = true; - return ++iter; + if (TMEM::IsCached(static_cast(i))) + { + // If the entry is currently bound and tmem has it recorded as cached, keep it, but mark it + // as invalidated. This way it can still be used via tmem cache emulation, but nothing else. + // Spyro: A Hero's Tail is known for using such overwritten textures. + bound_textures[i]->tmem_only = true; + return ++iter; + } + else + { + // Otherwise, delete the reference to it from bound_textures + bound_textures[i] = nullptr; + } } }