Do not delete strided efb copies on load

This hopefully allows to use partial texture updates with strided efb copies that start at the same offset as the loaded texture
This commit is contained in:
mimimi085181 2015-10-11 20:11:12 +02:00
parent b0bbe52cc9
commit af28934703
1 changed files with 5 additions and 2 deletions

View File

@ -471,7 +471,9 @@ TextureCache::TCacheEntryBase* TextureCache::Load(const u32 stage)
while (iter != iter_range.second) while (iter != iter_range.second)
{ {
TCacheEntryBase* entry = iter->second; TCacheEntryBase* entry = iter->second;
if (entry->IsEfbCopy()) // Do not load strided EFB copies, they are not meant to be used directly
if (entry->IsEfbCopy() && entry->native_width == nativeW && entry->native_height == nativeH &&
entry->memory_stride == entry->CacheLinesPerRow() * 32)
{ {
// EFB copies have slightly different rules as EFB copy formats have different // EFB copies have slightly different rules as EFB copy formats have different
// meanings from texture formats. // meanings from texture formats.
@ -517,8 +519,9 @@ TextureCache::TCacheEntryBase* TextureCache::Load(const u32 stage)
// textures as the same texture here, when the texture itself is the same. This // textures as the same texture here, when the texture itself is the same. This
// improves the performance a lot in some games that use paletted textures. // improves the performance a lot in some games that use paletted textures.
// Example: Sonic the Fighters (inside Sonic Gems Collection) // Example: Sonic the Fighters (inside Sonic Gems Collection)
// Skip EFB copies here, so they can be used for partial texture updates
if (entry->frameCount != FRAMECOUNT_INVALID && entry->frameCount < temp_frameCount && if (entry->frameCount != FRAMECOUNT_INVALID && entry->frameCount < temp_frameCount &&
!(isPaletteTexture && entry->base_hash == base_hash)) !entry->IsEfbCopy() && !(isPaletteTexture && entry->base_hash == base_hash))
{ {
temp_frameCount = entry->frameCount; temp_frameCount = entry->frameCount;
oldest_entry = iter; oldest_entry = iter;