From 5d69d9103ef423719619658dc3378869692a5064 Mon Sep 17 00:00:00 2001 From: riperiperi Date: Thu, 10 Sep 2020 20:44:04 +0100 Subject: Texture/Buffer Memory Management Improvements (#1408) * Initial implementation. Still pending better valid-overlap handling, disposed pool, compressed format flush fix. * Very messy backend resource cache. * Oops * Dispose -> Release * Improve Release/Dispose. * More rule refinement. * View compatibility levels as an enum - you can always know if a view is only copy compatible. * General cleanup. Use locking on the resource cache, as it is likely to be used by other threads in future. * Rename resource cache to resource pool. * Address some of the smaller nits. * Fix regression with MK8 lens flare Texture flushes done the old way should trigger memory tracking. * Use TextureCreateInfo as a key. It now implements IEquatable and generates a hashcode based on width/height. * Fix size change for compressed+non-compressed view combos. Before, this could set either the compressed or non compressed texture with a size with the wrong size, depending on which texture had its size changed. This caused exceptions when flushing the texture. Now it correctly takes the block size into account, assuming that these textures are only related because a pixel in the non-compressed texture represents a block in the compressed one. * Implement JD's suggestion for HashCode Combine Co-authored-by: jduncanator <1518948+jduncanator@users.noreply.github.com> * Address feedback * Address feedback. Co-authored-by: jduncanator <1518948+jduncanator@users.noreply.github.com> --- Ryujinx.Graphics.OpenGL/Image/TextureStorage.cs | 33 +++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) (limited to 'Ryujinx.Graphics.OpenGL/Image/TextureStorage.cs') diff --git a/Ryujinx.Graphics.OpenGL/Image/TextureStorage.cs b/Ryujinx.Graphics.OpenGL/Image/TextureStorage.cs index ed258aee..635b6c2c 100644 --- a/Ryujinx.Graphics.OpenGL/Image/TextureStorage.cs +++ b/Ryujinx.Graphics.OpenGL/Image/TextureStorage.cs @@ -16,6 +16,8 @@ namespace Ryujinx.Graphics.OpenGL.Image private int _viewsCount; + internal ITexture DefaultView { get; private set; } + public TextureStorage(Renderer renderer, TextureCreateInfo info, float scaleFactor) { _renderer = renderer; @@ -147,7 +149,9 @@ namespace Ryujinx.Graphics.OpenGL.Image public ITexture CreateDefaultView() { - return CreateView(Info, 0, 0); + DefaultView = CreateView(Info, 0, 0); + + return DefaultView; } public ITexture CreateView(TextureCreateInfo info, int firstLayer, int firstLevel) @@ -167,12 +171,37 @@ namespace Ryujinx.Graphics.OpenGL.Image // If we don't have any views, then the storage is now useless, delete it. if (--_viewsCount == 0) { - Dispose(); + if (DefaultView == null) + { + Dispose(); + } + else + { + // If the default view still exists, we can put it into the resource pool. + Release(); + } } } + /// + /// Release the TextureStorage to the resource pool without disposing its handle. + /// + public void Release() + { + _viewsCount = 1; // When we are used again, we will have the default view. + + _renderer.ResourcePool.AddTexture((TextureView)DefaultView); + } + + public void DeleteDefault() + { + DefaultView = null; + } + public void Dispose() { + DefaultView = null; + if (Handle != 0) { GL.DeleteTexture(Handle); -- cgit v1.2.3