summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/TextureCacheBase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon/TextureCacheBase.cpp')
-rw-r--r--Source/Core/VideoCommon/TextureCacheBase.cpp24
1 files changed, 20 insertions, 4 deletions
diff --git a/Source/Core/VideoCommon/TextureCacheBase.cpp b/Source/Core/VideoCommon/TextureCacheBase.cpp
index 0107b3e57d..85a1726817 100644
--- a/Source/Core/VideoCommon/TextureCacheBase.cpp
+++ b/Source/Core/VideoCommon/TextureCacheBase.cpp
@@ -150,12 +150,28 @@ void TextureCache::Cleanup(int _frameCount)
if (iter->second->frameCount == FRAMECOUNT_INVALID)
{
iter->second->frameCount = _frameCount;
+ ++iter;
}
- if (_frameCount > TEXTURE_KILL_THRESHOLD + iter->second->frameCount &&
- // EFB copies living on the host GPU are unrecoverable and thus shouldn't be deleted
- !iter->second->IsEfbCopy())
+ else if (_frameCount > TEXTURE_KILL_THRESHOLD + iter->second->frameCount)
{
- iter = FreeTexture(iter);
+ if (iter->second->IsEfbCopy())
+ {
+ // Only remove EFB copies when they wouldn't be used anymore(changed hash), because EFB copies living on the
+ // host GPU are unrecoverable. Perform this check only every TEXTURE_KILL_THRESHOLD for performance reasons
+ if ((_frameCount - iter->second->frameCount) % TEXTURE_KILL_THRESHOLD == 1 &&
+ iter->second->hash != GetHash64(Memory::GetPointer(iter->second->addr), iter->second->size_in_bytes, g_ActiveConfig.iSafeTextureCache_ColorSamples))
+ {
+ iter = FreeTexture(iter);
+ }
+ else
+ {
+ ++iter;
+ }
+ }
+ else
+ {
+ iter = FreeTexture(iter);
+ }
}
else
{