diff options
| author | skidau <skidau@gmail.com> | 2010-11-06 04:46:44 +0000 |
|---|---|---|
| committer | skidau <skidau@gmail.com> | 2010-11-06 04:46:44 +0000 |
| commit | 8775abacc6776fe2f8b65e04402d783b19da79fa (patch) | |
| tree | 83ee12e6fcc768d3ef2feb1fbd520f35cfd8793f /Source/Core/VideoCommon/Src/TextureCacheBase.cpp | |
| parent | d0afc20596413cc02b58bf23e960c29bd2b3e9de (diff) | |
Optimised EFB copy to RAM.
The finding was that 99% of the time, textures are static in memory. However, Dolphin would pessimistically continue to decode and copy the same texture every time. The optimisation is to check if the texture matches what is in the cache, and if it does, Dolphin should early exit.
The result is the speed in New Super Mario Bros Wii increased 35% with spinning coins. Still not as fast as EFB copy to texture though.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6352 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/VideoCommon/Src/TextureCacheBase.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/Src/TextureCacheBase.cpp | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/Source/Core/VideoCommon/Src/TextureCacheBase.cpp b/Source/Core/VideoCommon/Src/TextureCacheBase.cpp index a3d6c62740..ba54adbac5 100644 --- a/Source/Core/VideoCommon/Src/TextureCacheBase.cpp +++ b/Source/Core/VideoCommon/Src/TextureCacheBase.cpp @@ -119,8 +119,12 @@ void TextureCache::InvalidateRange(u32 start_address, u32 size) void TextureCache::MakeRangeDynamic(u32 start_address, u32 size) { TexCache::iterator - iter = textures.begin(), - tcend = textures.end(); + iter = textures.lower_bound(start_address), + tcend = textures.upper_bound(start_address + size); + + if (iter != textures.begin()) + iter--; + for (; iter != tcend; ++iter) { const int rangePosition = iter->second->IntersectsMemoryRange(start_address, size); @@ -131,6 +135,18 @@ void TextureCache::MakeRangeDynamic(u32 start_address, u32 size) } } +bool TextureCache::Find(u32 start_address, u64 hash) +{ + TexCache::iterator + iter = textures.lower_bound(start_address), + tcend = textures.upper_bound(start_address); + + if (iter->second->hash == hash) + return true; + + return false; +} + int TextureCache::TCacheEntryBase::IntersectsMemoryRange(u32 range_address, u32 range_size) const { if (addr + size_in_bytes < range_address) |
