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/BufferHolder.cs | |
| parent | da75a9a6ea89787c551b20e068a2bed8a8dc4f92 (diff) | |
Convert Quads to Triangles in Vulkan (#3715)
* 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/BufferHolder.cs')
| -rw-r--r-- | Ryujinx.Graphics.Vulkan/BufferHolder.cs | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Vulkan/BufferHolder.cs b/Ryujinx.Graphics.Vulkan/BufferHolder.cs index a2fc0c39..f449c102 100644 --- a/Ryujinx.Graphics.Vulkan/BufferHolder.cs +++ b/Ryujinx.Graphics.Vulkan/BufferHolder.cs @@ -370,6 +370,7 @@ namespace Ryujinx.Graphics.Vulkan { holder = _gd.BufferManager.Create(_gd, (size * 2 + 3) & ~3); + _gd.PipelineInternal.EndRenderPass(); _gd.HelperShader.ConvertI8ToI16(_gd, cbs, this, holder, offset, size); _cachedConvertedBuffers.Add(offset, size, key, holder); @@ -388,6 +389,7 @@ namespace Ryujinx.Graphics.Vulkan holder = _gd.BufferManager.Create(_gd, (size / stride) * alignedStride); + _gd.PipelineInternal.EndRenderPass(); _gd.HelperShader.ChangeStride(_gd, cbs, this, holder, offset, size, stride, alignedStride); key.SetBuffer(holder.GetBuffer()); @@ -398,6 +400,29 @@ namespace Ryujinx.Graphics.Vulkan return holder.GetBuffer(); } + public Auto<DisposableBuffer> GetBufferTopologyConversion(CommandBufferScoped cbs, int offset, int size, IndexBufferPattern pattern, int indexSize) + { + var key = new TopologyConversionCacheKey(_gd, pattern, indexSize); + + if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out var holder)) + { + // The destination index size is always I32. + + int indexCount = size / indexSize; + + int convertedCount = pattern.GetConvertedCount(indexCount); + + holder = _gd.BufferManager.Create(_gd, convertedCount * 4); + + _gd.PipelineInternal.EndRenderPass(); + _gd.HelperShader.ConvertIndexBuffer(_gd, cbs, this, holder, pattern, indexSize, offset, indexCount); + + _cachedConvertedBuffers.Add(offset, size, key, holder); + } + + return holder.GetBuffer(); + } + public void Dispose() { _gd.PipelineInternal?.FlushCommandsIfWeightExceeding(_buffer, (ulong)Size); |
