From 38f6cf208934c7415c16f69a26bf85b201c447ba Mon Sep 17 00:00:00 2001 From: mimimi085181 Date: Mon, 7 Sep 2015 20:53:38 +0200 Subject: [PATCH] Perform garbage collection for efb copies This checks every TEXTURE_KILL_THRESHOLD frames, to see if the hash for the memory area of the efb copy has hanged. If it has changed, the efb copy can be removed, it wouldn't be used anymore. Before this pr, some efb copies would never be deleted. Fixes issue https://bugs.dolphin-emu.org/issues/6101 and possibly some other VRAM leaks. --- Source/Core/VideoCommon/TextureCacheBase.cpp | 24 ++++++++++++++++---- 1 file 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 {