aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Vulkan/CacheByRange.cs
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2022-09-20 22:38:48 +0100
committerGitHub <noreply@github.com>2022-09-20 18:38:48 -0300
commit4c0eb91d7e6bdbe42ffa6e950e3288f8066de089 (patch)
tree96b1325134798f4bed03989913e1ba32dae9ffa5 /Ryujinx.Graphics.Vulkan/CacheByRange.cs
parentda75a9a6ea89787c551b20e068a2bed8a8dc4f92 (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.cs50
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