aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/PipelineBase.cs')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/PipelineBase.cs43
1 files changed, 32 insertions, 11 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs
index cf31a7f8..4aec0dbc 100644
--- a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs
+++ b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs
@@ -66,6 +66,8 @@ namespace Ryujinx.Graphics.Vulkan
private ulong _vertexBuffersDirty;
protected Rectangle<int> ClearScissor;
+ private readonly VertexBufferUpdater _vertexBufferUpdater;
+
public SupportBufferUpdater SupportBufferUpdater;
public IndexBufferPattern QuadsToTrisPattern;
public IndexBufferPattern TriFanToTrisPattern;
@@ -96,6 +98,7 @@ namespace Ryujinx.Graphics.Vulkan
gd.Api.CreatePipelineCache(device, pipelineCacheCreateInfo, null, out PipelineCache).ThrowOnError();
_descriptorSetUpdater = new DescriptorSetUpdater(gd, this);
+ _vertexBufferUpdater = new VertexBufferUpdater(gd);
_transformFeedbackBuffers = new BufferState[Constants.MaxTransformFeedbackBuffers];
_vertexBuffers = new VertexBufferState[Constants.MaxVertexBuffers + 1];
@@ -1185,6 +1188,9 @@ namespace Ryujinx.Graphics.Vulkan
int validCount = 1;
+ BufferHandle lastHandle = default;
+ Auto<DisposableBuffer> lastBuffer = default;
+
for (int i = 0; i < count; i++)
{
var vertexBuffer = vertexBuffers[i];
@@ -1194,7 +1200,12 @@ namespace Ryujinx.Graphics.Vulkan
if (vertexBuffer.Buffer.Handle != BufferHandle.Null)
{
- var vb = Gd.BufferManager.GetBuffer(CommandBuffer, vertexBuffer.Buffer.Handle, false);
+ Auto<DisposableBuffer> vb = (vertexBuffer.Buffer.Handle == lastHandle) ? lastBuffer :
+ Gd.BufferManager.GetBuffer(CommandBuffer, vertexBuffer.Buffer.Handle, false);
+
+ lastHandle = vertexBuffer.Buffer.Handle;
+ lastBuffer = vb;
+
if (vb != null)
{
int binding = i + 1;
@@ -1222,24 +1233,29 @@ namespace Ryujinx.Graphics.Vulkan
ref var buffer = ref _vertexBuffers[binding];
int oldScalarAlign = buffer.AttributeScalarAlignment;
- buffer.Dispose();
-
if (Gd.Capabilities.VertexBufferAlignment < 2 &&
(vertexBuffer.Stride % FormatExtensions.MaxBufferFormatScalarSize) == 0)
{
- buffer = new VertexBufferState(
- vb,
- descriptorIndex,
- vertexBuffer.Buffer.Offset,
- vbSize,
- vertexBuffer.Stride);
+ if (!buffer.Matches(vb, descriptorIndex, vertexBuffer.Buffer.Offset, vbSize, vertexBuffer.Stride))
+ {
+ buffer.Dispose();
+
+ buffer = new VertexBufferState(
+ vb,
+ descriptorIndex,
+ vertexBuffer.Buffer.Offset,
+ vbSize,
+ vertexBuffer.Stride);
- buffer.BindVertexBuffer(Gd, Cbs, (uint)binding, ref _newState);
+ buffer.BindVertexBuffer(Gd, Cbs, (uint)binding, ref _newState, _vertexBufferUpdater);
+ }
}
else
{
// May need to be rewritten. Bind this buffer before draw.
+ buffer.Dispose();
+
buffer = new VertexBufferState(
vertexBuffer.Buffer.Handle,
descriptorIndex,
@@ -1255,6 +1271,8 @@ namespace Ryujinx.Graphics.Vulkan
}
}
+ _vertexBufferUpdater.Commit(Cbs);
+
_newState.VertexBindingDescriptionsCount = (uint)validCount;
SignalStateChange();
}
@@ -1596,10 +1614,12 @@ namespace Ryujinx.Graphics.Vulkan
{
int i = BitOperations.TrailingZeroCount(_vertexBuffersDirty);
- _vertexBuffers[i].BindVertexBuffer(Gd, Cbs, (uint)i, ref _newState);
+ _vertexBuffers[i].BindVertexBuffer(Gd, Cbs, (uint)i, ref _newState, _vertexBufferUpdater);
_vertexBuffersDirty &= ~(1UL << i);
}
+
+ _vertexBufferUpdater.Commit(Cbs);
}
if (_stateDirty || Pbp != pbp)
@@ -1712,6 +1732,7 @@ namespace Ryujinx.Graphics.Vulkan
_framebuffer?.Dispose();
_newState.Dispose();
_descriptorSetUpdater.Dispose();
+ _vertexBufferUpdater.Dispose();
for (int i = 0; i < _vertexBuffers.Length; i++)
{