From dbafc6ef955ea42706a3f20da1ff45508b8a8722 Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 19 Feb 2017 22:31:07 +0100 Subject: [PATCH] Centralize Texcache::Clear --- GPU/Common/TextureCacheCommon.cpp | 20 ++++++++++++++++++++ GPU/Common/TextureCacheCommon.h | 2 ++ GPU/D3D11/TextureCacheD3D11.cpp | 30 +++++++++--------------------- GPU/D3D11/TextureCacheD3D11.h | 14 +------------- GPU/Directx9/TextureCacheDX9.cpp | 28 ++++++---------------------- GPU/Directx9/TextureCacheDX9.h | 10 +--------- GPU/GLES/TextureCacheGLES.cpp | 25 ++++++------------------- GPU/GLES/TextureCacheGLES.h | 1 + GPU/Vulkan/TextureCacheVulkan.cpp | 22 +++------------------- GPU/Vulkan/TextureCacheVulkan.h | 2 +- 10 files changed, 50 insertions(+), 104 deletions(-) diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index 0cb2b21a38..6ab7cfb06b 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -965,6 +965,26 @@ bool TextureCacheCommon::ReadIndexedTex(u8 *out, int outPitch, int level, const return true; } +void TextureCacheCommon::Clear(bool delete_them) { + ForgetLastTexture(); + if (delete_them) { + for (TexCache::iterator iter = cache.begin(); iter != cache.end(); ++iter) { + ReleaseTexture(&iter->second); + } + for (TexCache::iterator iter = secondCache.begin(); iter != secondCache.end(); ++iter) { + ReleaseTexture(&iter->second); + } + } + if (cache.size() + secondCache.size()) { + INFO_LOG(G3D, "Texture cached cleared from %i textures", (int)(cache.size() + secondCache.size())); + cache.clear(); + secondCache.clear(); + cacheSizeEstimate_ = 0; + secondCacheSizeEstimate_ = 0; + } + fbTexInfo_.clear(); + videos_.clear(); +} bool TextureCacheCommon::CheckFullHash(TexCacheEntry *const entry, bool &doDelete) { bool hashFail = false; diff --git a/GPU/Common/TextureCacheCommon.h b/GPU/Common/TextureCacheCommon.h index 09bf70eef4..9eb8a9e360 100644 --- a/GPU/Common/TextureCacheCommon.h +++ b/GPU/Common/TextureCacheCommon.h @@ -178,6 +178,7 @@ public: void InvalidateAll(GPUInvalidationType type); void ClearNextFrame(); virtual void ForgetLastTexture() = 0; + virtual void Clear(bool delete_them); // FramebufferManager keeps TextureCache updated about what regions of memory are being rendered to. void NotifyFramebuffer(u32 address, VirtualFramebuffer *framebuffer, FramebufferNotification msg); @@ -196,6 +197,7 @@ public: protected: virtual void Unbind() = 0; + virtual void ReleaseTexture(TexCacheEntry *entry) = 0; bool CheckFullHash(TexCacheEntry *const entry, bool &doDelete); diff --git a/GPU/D3D11/TextureCacheD3D11.cpp b/GPU/D3D11/TextureCacheD3D11.cpp index 8641c07aaf..ff7ad8fd9c 100644 --- a/GPU/D3D11/TextureCacheD3D11.cpp +++ b/GPU/D3D11/TextureCacheD3D11.cpp @@ -134,29 +134,17 @@ void TextureCacheD3D11::SetFramebufferManager(FramebufferManagerD3D11 *fbManager framebufferManager_ = fbManager; } -void TextureCacheD3D11::Clear(bool delete_them) { - // ID3D11ShaderResourceView *srv = nullptr; - // context_->PSSetShaderResources(0, 1, &srv); - lastBoundTexture = INVALID_TEX; - if (delete_them) { - for (TexCache::iterator iter = cache.begin(); iter != cache.end(); ++iter) { - DEBUG_LOG(G3D, "Deleting texture %p", iter->second.texturePtr); - ReleaseTexture(&iter->second); - } - for (TexCache::iterator iter = secondCache.begin(); iter != secondCache.end(); ++iter) { - DEBUG_LOG(G3D, "Deleting texture %p", iter->second.texturePtr); - ReleaseTexture(&iter->second); - } +void TextureCacheD3D11::ReleaseTexture(TexCacheEntry *entry) { + ID3D11Texture2D *texture = (ID3D11Texture2D *)entry->texturePtr; + ID3D11ShaderResourceView *view = (ID3D11ShaderResourceView *)entry->textureView; + if (texture) { + texture->Release(); + entry->texturePtr = nullptr; } - if (cache.size() + secondCache.size()) { - INFO_LOG(G3D, "Texture cached cleared from %i textures", (int)(cache.size() + secondCache.size())); - cache.clear(); - secondCache.clear(); - cacheSizeEstimate_ = 0; - secondCacheSizeEstimate_ = 0; + if (view) { + view->Release(); + entry->textureView = nullptr; } - fbTexInfo_.clear(); - videos_.clear(); } void TextureCacheD3D11::DeleteTexture(TexCache::iterator it) { diff --git a/GPU/D3D11/TextureCacheD3D11.h b/GPU/D3D11/TextureCacheD3D11.h index 4c4f2e2d66..2fe76de9b4 100644 --- a/GPU/D3D11/TextureCacheD3D11.h +++ b/GPU/D3D11/TextureCacheD3D11.h @@ -48,7 +48,6 @@ public: void SetTexture(bool force = false); - void Clear(bool delete_them); void StartFrame(); void SetFramebufferManager(FramebufferManagerD3D11 *fbManager); @@ -70,6 +69,7 @@ public: protected: void Unbind() override; + void ReleaseTexture(TexCacheEntry *entry) override; private: void Decimate(); // Run this once per frame to get rid of old textures. @@ -95,18 +95,6 @@ private: ID3D11ShaderResourceView *DxView(TexCacheEntry *entry) { return (ID3D11ShaderResourceView *)entry->textureView; } - void ReleaseTexture(TexCacheEntry *entry) { - ID3D11Texture2D *texture = (ID3D11Texture2D *)entry->texturePtr; - ID3D11ShaderResourceView *view = (ID3D11ShaderResourceView *)entry->textureView; - if (texture) { - texture->Release(); - entry->texturePtr = nullptr; - } - if (view) { - view->Release(); - entry->textureView = nullptr; - } - } TextureScalerD3D11 scaler; diff --git a/GPU/Directx9/TextureCacheDX9.cpp b/GPU/Directx9/TextureCacheDX9.cpp index 5e1efd93eb..f18f369b33 100644 --- a/GPU/Directx9/TextureCacheDX9.cpp +++ b/GPU/Directx9/TextureCacheDX9.cpp @@ -98,28 +98,13 @@ void TextureCacheDX9::SetFramebufferManager(FramebufferManagerDX9 *fbManager) { framebufferManager_ = fbManager; } -void TextureCacheDX9::Clear(bool delete_them) { - pD3Ddevice->SetTexture(0, NULL); - lastBoundTexture = INVALID_TEX; - if (delete_them) { - for (TexCache::iterator iter = cache.begin(); iter != cache.end(); ++iter) { - DEBUG_LOG(G3D, "Deleting texture %p", iter->second.texturePtr); - ReleaseTexture(&iter->second); - } - for (TexCache::iterator iter = secondCache.begin(); iter != secondCache.end(); ++iter) { - DEBUG_LOG(G3D, "Deleting texture %p", iter->second.texturePtr); - ReleaseTexture(&iter->second); - } +void TextureCacheDX9::ReleaseTexture(TexCacheEntry *entry) { + DEBUG_LOG(G3D, "Deleting texture %p", entry->texturePtr); + LPDIRECT3DTEXTURE9 &texture = DxTex(entry); + if (texture) { + texture->Release(); + texture = nullptr; } - if (cache.size() + secondCache.size()) { - INFO_LOG(G3D, "Texture cached cleared from %i textures", (int)(cache.size() + secondCache.size())); - cache.clear(); - secondCache.clear(); - cacheSizeEstimate_ = 0; - secondCacheSizeEstimate_ = 0; - } - fbTexInfo_.clear(); - videos_.clear(); } void TextureCacheDX9::DeleteTexture(TexCache::iterator it) { @@ -128,7 +113,6 @@ void TextureCacheDX9::DeleteTexture(TexCache::iterator it) { if (fbInfo != fbTexInfo_.end()) { fbTexInfo_.erase(fbInfo); } - cacheSizeEstimate_ -= EstimateTexMemoryUsage(&it->second); cache.erase(it); } diff --git a/GPU/Directx9/TextureCacheDX9.h b/GPU/Directx9/TextureCacheDX9.h index 2c5a8a8401..d8ede25c4f 100644 --- a/GPU/Directx9/TextureCacheDX9.h +++ b/GPU/Directx9/TextureCacheDX9.h @@ -41,8 +41,6 @@ public: ~TextureCacheDX9(); void SetTexture(bool force = false); - - void Clear(bool delete_them); void StartFrame(); void SetFramebufferManager(FramebufferManagerDX9 *fbManager); @@ -64,6 +62,7 @@ public: protected: void Unbind() override; + void ReleaseTexture(TexCacheEntry *entry) override; private: void Decimate(); // Run this once per frame to get rid of old textures. @@ -83,13 +82,6 @@ private: LPDIRECT3DTEXTURE9 &DxTex(TexCacheEntry *entry) { return *(LPDIRECT3DTEXTURE9 *)&entry->texturePtr; } - void ReleaseTexture(TexCacheEntry *entry) { - LPDIRECT3DTEXTURE9 &texture = DxTex(entry); - if (texture) { - texture->Release(); - texture = nullptr; - } - } TextureScalerDX9 scaler; diff --git a/GPU/GLES/TextureCacheGLES.cpp b/GPU/GLES/TextureCacheGLES.cpp index 56bb45cf50..7dc7450b08 100644 --- a/GPU/GLES/TextureCacheGLES.cpp +++ b/GPU/GLES/TextureCacheGLES.cpp @@ -86,32 +86,19 @@ void TextureCacheGLES::SetFramebufferManager(FramebufferManagerGLES *fbManager) framebufferManager_ = fbManager; } +void TextureCacheGLES::ReleaseTexture(TexCacheEntry *entry) { + DEBUG_LOG(G3D, "Deleting texture %i", entry->textureName); + glDeleteTextures(1, &entry->textureName); +} + void TextureCacheGLES::Clear(bool delete_them) { - glBindTexture(GL_TEXTURE_2D, 0); - lastBoundTexture = INVALID_TEX; + TextureCacheCommon::Clear(delete_them); if (delete_them) { - for (TexCache::iterator iter = cache.begin(); iter != cache.end(); ++iter) { - DEBUG_LOG(G3D, "Deleting texture %i", iter->second.textureName); - glDeleteTextures(1, &iter->second.textureName); - } - for (TexCache::iterator iter = secondCache.begin(); iter != secondCache.end(); ++iter) { - DEBUG_LOG(G3D, "Deleting texture %i", iter->second.textureName); - glDeleteTextures(1, &iter->second.textureName); - } if (!nameCache_.empty()) { glDeleteTextures((GLsizei)nameCache_.size(), &nameCache_[0]); nameCache_.clear(); } } - if (cache.size() + secondCache.size()) { - INFO_LOG(G3D, "Texture cached cleared from %i textures", (int)(cache.size() + secondCache.size())); - cache.clear(); - secondCache.clear(); - cacheSizeEstimate_ = 0; - secondCacheSizeEstimate_ = 0; - } - fbTexInfo_.clear(); - videos_.clear(); } void TextureCacheGLES::DeleteTexture(TexCache::iterator it) { diff --git a/GPU/GLES/TextureCacheGLES.h b/GPU/GLES/TextureCacheGLES.h index e3c031b600..7f54503d5c 100644 --- a/GPU/GLES/TextureCacheGLES.h +++ b/GPU/GLES/TextureCacheGLES.h @@ -78,6 +78,7 @@ public: protected: void Unbind() override; + void ReleaseTexture(TexCacheEntry *entry) override; private: void Decimate(); // Run this once per frame to get rid of old textures. diff --git a/GPU/Vulkan/TextureCacheVulkan.cpp b/GPU/Vulkan/TextureCacheVulkan.cpp index 30e6554b43..fa6b2e1b95 100644 --- a/GPU/Vulkan/TextureCacheVulkan.cpp +++ b/GPU/Vulkan/TextureCacheVulkan.cpp @@ -192,25 +192,9 @@ void TextureCacheVulkan::DeviceRestore(VulkanContext *vulkan) { samplerCache_.DeviceRestore(vulkan); } -void TextureCacheVulkan::Clear(bool delete_them) { - lastBoundTexture = nullptr; - for (TexCache::iterator iter = cache.begin(); iter != cache.end(); ++iter) { - DEBUG_LOG(G3D, "Deleting texture %p", iter->second.vkTex); - delete iter->second.vkTex; - } - for (TexCache::iterator iter = secondCache.begin(); iter != secondCache.end(); ++iter) { - DEBUG_LOG(G3D, "Deleting texture %p", iter->second.vkTex); - delete iter->second.vkTex; - } - if (cache.size() + secondCache.size()) { - INFO_LOG(G3D, "Texture cached cleared from %i textures", (int)(cache.size() + secondCache.size())); - cache.clear(); - secondCache.clear(); - cacheSizeEstimate_ = 0; - secondCacheSizeEstimate_ = 0; - } - fbTexInfo_.clear(); - videos_.clear(); +void TextureCacheVulkan::ReleaseTexture(TexCacheEntry *entry) { + DEBUG_LOG(G3D, "Deleting texture %p", entry->vkTex); + delete entry->vkTex; } void TextureCacheVulkan::DeleteTexture(TexCache::iterator it) { diff --git a/GPU/Vulkan/TextureCacheVulkan.h b/GPU/Vulkan/TextureCacheVulkan.h index f0318a3f26..986b6c34ba 100644 --- a/GPU/Vulkan/TextureCacheVulkan.h +++ b/GPU/Vulkan/TextureCacheVulkan.h @@ -68,7 +68,6 @@ public: ~TextureCacheVulkan(); void SetTexture(); - void Clear(bool delete_them); void StartFrame(); void EndFrame(); @@ -95,6 +94,7 @@ public: protected: void Unbind() override; + void ReleaseTexture(TexCacheEntry *entry) override; private: void Decimate(); // Run this once per frame to get rid of old textures.