Centralize Texcache::Clear

This commit is contained in:
Henrik Rydgard 2017-02-19 22:31:07 +01:00
parent 91611832dc
commit dbafc6ef95
10 changed files with 50 additions and 104 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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) {

View file

@ -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;

View file

@ -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);
}

View file

@ -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;

View file

@ -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) {

View file

@ -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.

View file

@ -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) {

View file

@ -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.