aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/VertexBufferState.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/VertexBufferState.cs')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/VertexBufferState.cs13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/VertexBufferState.cs b/src/Ryujinx.Graphics.Vulkan/VertexBufferState.cs
index cbbd829a..9a943bf9 100644
--- a/src/Ryujinx.Graphics.Vulkan/VertexBufferState.cs
+++ b/src/Ryujinx.Graphics.Vulkan/VertexBufferState.cs
@@ -4,6 +4,8 @@ namespace Ryujinx.Graphics.Vulkan
{
internal struct VertexBufferState
{
+ private const int VertexBufferMaxMirrorable = 0x20000;
+
public static VertexBufferState Null => new(null, 0, 0, 0);
private readonly int _offset;
@@ -88,9 +90,11 @@ namespace Ryujinx.Graphics.Vulkan
if (autoBuffer != null)
{
- var buffer = autoBuffer.Get(cbs, _offset, _size).Value;
+ int offset = _offset;
+ bool mirrorable = _size <= VertexBufferMaxMirrorable;
+ var buffer = mirrorable ? autoBuffer.GetMirrorable(cbs, ref offset, _size, out _).Value : autoBuffer.Get(cbs, offset, _size).Value;
- updater.BindVertexBuffer(cbs, binding, buffer, (ulong)_offset, (ulong)_size, (ulong)_stride);
+ updater.BindVertexBuffer(cbs, binding, buffer, (ulong)offset, (ulong)_size, (ulong)_stride);
}
}
@@ -99,6 +103,11 @@ namespace Ryujinx.Graphics.Vulkan
return _buffer == buffer;
}
+ public readonly bool Overlaps(Auto<DisposableBuffer> buffer, int offset, int size)
+ {
+ return buffer == _buffer && offset < _offset + _size && offset + size > _offset;
+ }
+
public readonly bool Matches(Auto<DisposableBuffer> buffer, int descriptorIndex, int offset, int size, int stride = 0)
{
return _buffer == buffer && DescriptorIndex == descriptorIndex && _offset == offset && _size == size && _stride == stride;