From 8565f0269978cb0414ccddfc212312f132acc035 Mon Sep 17 00:00:00 2001 From: degasus Date: Sat, 17 Jan 2015 10:57:19 +0100 Subject: [PATCH] TexCache: use an unordered_multimap for the tex pool --- Source/Core/VideoCommon/TextureCacheBase.cpp | 41 ++++++++++---------- Source/Core/VideoCommon/TextureCacheBase.h | 16 +++++++- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/Source/Core/VideoCommon/TextureCacheBase.cpp b/Source/Core/VideoCommon/TextureCacheBase.cpp index f87b10aba9..f9f603e8e5 100644 --- a/Source/Core/VideoCommon/TextureCacheBase.cpp +++ b/Source/Core/VideoCommon/TextureCacheBase.cpp @@ -31,7 +31,7 @@ GC_ALIGNED16(u8 *TextureCache::temp) = nullptr; size_t TextureCache::temp_size; TextureCache::TexCache TextureCache::textures; -TextureCache::TexturePool TextureCache::texture_pool; +TextureCache::TexPool TextureCache::texture_pool; TextureCache::BackupConfig TextureCache::backup_config; @@ -82,7 +82,7 @@ void TextureCache::Invalidate() for (auto& rt : texture_pool) { - delete rt; + delete rt.second; } texture_pool.clear(); } @@ -161,19 +161,22 @@ void TextureCache::Cleanup(int _frameCount) } } - for (size_t i = 0; i < texture_pool.size();) + TexPool::iterator iter2 = texture_pool.begin(); + TexPool::iterator tcend2 = texture_pool.end(); + while (iter2 != tcend2) { - auto rt = texture_pool[i]; - - if (_frameCount > TEXTURE_POOL_KILL_THRESHOLD + rt->frameCount) + if(iter2->second->frameCount == FRAMECOUNT_INVALID) { - delete rt; - texture_pool[i] = texture_pool.back(); - texture_pool.pop_back(); + iter2->second->frameCount = _frameCount; + } + if (_frameCount > TEXTURE_POOL_KILL_THRESHOLD + iter2->second->frameCount) + { + delete iter2->second; + iter2 = texture_pool.erase(iter2); } else { - ++i; + ++iter2; } } } @@ -888,17 +891,12 @@ void TextureCache::CopyRenderTargetToTexture(u32 dstAddr, unsigned int dstFormat TextureCache::TCacheEntryBase* TextureCache::AllocateTexture(const TCacheEntryConfig& config) { - for (size_t i = 0; i < texture_pool.size(); ++i) + TexPool::iterator iter = texture_pool.find(config); + if (iter != texture_pool.end()) { - auto rt = texture_pool[i]; - - if (rt->config == config) - { - texture_pool[i] = texture_pool.back(); - texture_pool.pop_back(); - - return rt; - } + TextureCache::TCacheEntryBase* entry = iter->second; + texture_pool.erase(iter); + return entry; } INCSTAT(stats.numTexturesCreated); @@ -907,5 +905,6 @@ TextureCache::TCacheEntryBase* TextureCache::AllocateTexture(const TCacheEntryCo void TextureCache::FreeTexture(TCacheEntryBase* entry) { - texture_pool.push_back(entry); + entry->frameCount = FRAMECOUNT_INVALID; + texture_pool.insert(TexPool::value_type(entry->config, entry)); } diff --git a/Source/Core/VideoCommon/TextureCacheBase.h b/Source/Core/VideoCommon/TextureCacheBase.h index 2a24c87700..52f9e04e16 100644 --- a/Source/Core/VideoCommon/TextureCacheBase.h +++ b/Source/Core/VideoCommon/TextureCacheBase.h @@ -4,7 +4,9 @@ #pragma once +#include #include +#include #include "Common/CommonTypes.h" #include "Common/Thread.h" @@ -37,6 +39,16 @@ public: { return width == b.width && height == b.height && levels == b.levels && layers == b.layers && rendertarget == b.rendertarget; } + + struct Hasher : std::hash + { + size_t operator()(const TextureCache::TCacheEntryConfig& c) const + { + u64 id = (u64)c.rendertarget << 63 | (u64)c.layers << 48 | (u64)c.levels << 32 | (u64)c.height << 16 | (u64)c.width; + return std::hash::operator()(id); + } + }; + }; struct TCacheEntryBase @@ -134,10 +146,10 @@ private: static void FreeTexture(TCacheEntryBase* entry); typedef std::map TexCache; - typedef std::vector TexturePool; + typedef std::unordered_multimap TexPool; static TexCache textures; - static TexturePool texture_pool; + static TexPool texture_pool; // Backup configuration values static struct BackupConfig