Skip to content

Commit

Permalink
Do not consider XFB copies for invalidating textures when loading a n…
Browse files Browse the repository at this point in the history
…ew 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.
  • Loading branch information
AdmiralCurtiss committed Sep 15, 2018
1 parent ce9e918 commit f2fa637
Showing 1 changed file with 8 additions and 1 deletion.
9 changes: 8 additions & 1 deletion Source/Core/VideoCommon/TextureCacheBase.cpp
Expand Up @@ -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 &&
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit f2fa637

Please sign in to comment.