From f2fa63783b3099ddb0d903cc50f8bddd409c6b7d Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Tue, 11 Sep 2018 23:25:28 +0200 Subject: [PATCH] Do not consider XFB copies for invalidating textures when loading a new texture. This fixes severe image flickering in some cutscenes of Twin Snakes. The game appears to sometimes load a previously made XFB copy as a texture before it is actually rendered to the screen, which we took as an invitation to invalidate the XFB copy. --- Source/Core/VideoCommon/TextureCacheBase.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Source/Core/VideoCommon/TextureCacheBase.cpp b/Source/Core/VideoCommon/TextureCacheBase.cpp index cd8a024fbc..62d188e1b9 100644 --- a/Source/Core/VideoCommon/TextureCacheBase.cpp +++ b/Source/Core/VideoCommon/TextureCacheBase.cpp @@ -811,6 +811,11 @@ TextureCacheBase::GetTexture(u32 address, u32 width, u32 height, const TextureFo continue; } + // TODO: Some games (Rogue Squadron 3, Twin Snakes) seem to load a previously made XFB + // copy as a regular texture. You can see this particularly well in RS3 whenever the + // game freezes the image and fades it out to black on screen transitions, which fades + // out a purple screen in XFB2Tex. Check for this here and convert them if necessary. + // Do not load strided EFB copies, they are not meant to be used directly. // Also do not directly load EFB copies, which were partly overwritten. if (entry->IsEfbCopy() && entry->native_width == nativeW && entry->native_height == nativeH && @@ -863,8 +868,10 @@ TextureCacheBase::GetTexture(u32 address, u32 width, u32 height, const TextureFo // improves the performance a lot in some games that use paletted textures. // Example: Sonic the Fighters (inside Sonic Gems Collection) // Skip EFB copies here, so they can be used for partial texture updates + // Also skip XFB copies, we might need to still scan them out + // or load them as regular textures later. if (entry->frameCount != FRAMECOUNT_INVALID && entry->frameCount < temp_frameCount && - !entry->IsEfbCopy() && !(isPaletteTexture && entry->base_hash == base_hash)) + !entry->IsCopy() && !(isPaletteTexture && entry->base_hash == base_hash)) { temp_frameCount = entry->frameCount; oldest_entry = iter;