diff options
author | riperiperi <rhy3756547@hotmail.com> | 2022-09-20 22:38:48 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-20 18:38:48 -0300 |
commit | 4c0eb91d7e6bdbe42ffa6e950e3288f8066de089 (patch) | |
tree | 96b1325134798f4bed03989913e1ba32dae9ffa5 /Ryujinx.Graphics.Vulkan/CacheByRange.cs | |
parent | da75a9a6ea89787c551b20e068a2bed8a8dc4f92 (diff) |
Convert Quads to Triangles in Vulkan (#3715)1.1.278
* Add Index Buffer conversion for quads to Vulkan
Also adds a reusable repeating pattern index buffer to use for non-indexed
draws, and generalizes the conversion cache for buffers.
* Fix some issues
* End render pass before conversion
* Resume transform feedback after we ensure we're in a pass.
* Always generate UInt32 type indices for topology conversion
* No it's not.
* Remove unused code
* Rely on TopologyRemap to convert quads to tris.
* Remove double newline
* Ensure render pass ends before stride or I8 conversion
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/CacheByRange.cs')
-rw-r--r-- | Ryujinx.Graphics.Vulkan/CacheByRange.cs | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/Ryujinx.Graphics.Vulkan/CacheByRange.cs b/Ryujinx.Graphics.Vulkan/CacheByRange.cs index f9edca8a..4c47e1c1 100644 --- a/Ryujinx.Graphics.Vulkan/CacheByRange.cs +++ b/Ryujinx.Graphics.Vulkan/CacheByRange.cs @@ -10,14 +10,25 @@ namespace Ryujinx.Graphics.Vulkan struct I8ToI16CacheKey : ICacheKey { - public I8ToI16CacheKey() { } + // Used to notify the pipeline that bindings have invalidated on dispose. + private readonly VulkanRenderer _gd; + private Auto<DisposableBuffer> _buffer; + + public I8ToI16CacheKey(VulkanRenderer gd) + { + _gd = gd; + _buffer = null; + } public bool KeyEqual(ICacheKey other) { return other is I8ToI16CacheKey; } - public void Dispose() { } + public void Dispose() + { + _gd.PipelineInternal.DirtyIndexBuffer(_buffer); + } } struct AlignedVertexBufferCacheKey : ICacheKey @@ -55,6 +66,41 @@ namespace Ryujinx.Graphics.Vulkan } } + struct TopologyConversionCacheKey : ICacheKey + { + private IndexBufferPattern _pattern; + private int _indexSize; + + // Used to notify the pipeline that bindings have invalidated on dispose. + private readonly VulkanRenderer _gd; + private Auto<DisposableBuffer> _buffer; + + public TopologyConversionCacheKey(VulkanRenderer gd, IndexBufferPattern pattern, int indexSize) + { + _gd = gd; + _pattern = pattern; + _indexSize = indexSize; + _buffer = null; + } + + public bool KeyEqual(ICacheKey other) + { + return other is TopologyConversionCacheKey entry && + entry._pattern == _pattern && + entry._indexSize == _indexSize; + } + + public void SetBuffer(Auto<DisposableBuffer> buffer) + { + _buffer = buffer; + } + + public void Dispose() + { + _gd.PipelineInternal.DirtyIndexBuffer(_buffer); + } + } + struct CacheByRange<T> where T : IDisposable { private struct Entry |