mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Centralize Texcache::Clear
This commit is contained in:
parent
91611832dc
commit
dbafc6ef95
10 changed files with 50 additions and 104 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Add table
Reference in a new issue