diff options
author | gdkchan <gab.dark.100@gmail.com> | 2022-06-05 14:06:47 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-05 14:06:47 -0300 |
commit | a3e7bb8eb40b66e61a5a3bfef0b780d0c76a31c1 (patch) | |
tree | 4484bdd53aae7c5b6a0668cd584fafc5e0bd0bc4 /Ryujinx.Graphics.OpenGL/Image/IntermmediatePool.cs | |
parent | 2073ba29197be4fcdcd750db7e7b8a36110efd71 (diff) |
Copy dependency for multisample and non-multisample textures (#3382)1.1.139
* Use copy dependency for textures that differs in multisample but are otherwise compatible
* Remove allowMs flag as it's no longer required for correctness, it's just an optimization now
* Dispose intermmediate pool
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Image/IntermmediatePool.cs')
-rw-r--r-- | Ryujinx.Graphics.OpenGL/Image/IntermmediatePool.cs | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Image/IntermmediatePool.cs b/Ryujinx.Graphics.OpenGL/Image/IntermmediatePool.cs new file mode 100644 index 00000000..bd6efc76 --- /dev/null +++ b/Ryujinx.Graphics.OpenGL/Image/IntermmediatePool.cs @@ -0,0 +1,98 @@ +using Ryujinx.Graphics.GAL; +using System; +using System.Collections.Generic; + +namespace Ryujinx.Graphics.OpenGL.Image +{ + class IntermmediatePool : IDisposable + { + private readonly Renderer _renderer; + private readonly List<TextureView> _entries; + + public IntermmediatePool(Renderer renderer) + { + _renderer = renderer; + _entries = new List<TextureView>(); + } + + public TextureView GetOrCreateWithAtLeast( + Target target, + int blockWidth, + int blockHeight, + int bytesPerPixel, + Format format, + int width, + int height, + int depth, + int levels) + { + TextureView entry; + + for (int i = 0; i < _entries.Count; i++) + { + entry = _entries[i]; + + if (entry.Target == target && entry.Format == format) + { + if (entry.Width < width || entry.Height < height || entry.Info.Depth < depth || entry.Info.Levels < levels) + { + width = Math.Max(width, entry.Width); + height = Math.Max(height, entry.Height); + depth = Math.Max(depth, entry.Info.Depth); + levels = Math.Max(levels, entry.Info.Levels); + + entry.Dispose(); + entry = CreateNew(target, blockWidth, blockHeight, bytesPerPixel, format, width, height, depth, levels); + _entries[i] = entry; + } + + return entry; + } + } + + entry = CreateNew(target, blockWidth, blockHeight, bytesPerPixel, format, width, height, depth, levels); + _entries.Add(entry); + + return entry; + } + + private TextureView CreateNew( + Target target, + int blockWidth, + int blockHeight, + int bytesPerPixel, + Format format, + int width, + int height, + int depth, + int levels) + { + return (TextureView)_renderer.CreateTexture(new TextureCreateInfo( + width, + height, + depth, + levels, + 1, + blockWidth, + blockHeight, + bytesPerPixel, + format, + DepthStencilMode.Depth, + target, + SwizzleComponent.Red, + SwizzleComponent.Green, + SwizzleComponent.Blue, + SwizzleComponent.Alpha), 1f); + } + + public void Dispose() + { + foreach (TextureView entry in _entries) + { + entry.Dispose(); + } + + _entries.Clear(); + } + } +}
\ No newline at end of file |