diff --git a/Ryujinx.Graphics.Vulkan/BufferManager.cs b/Ryujinx.Graphics.Vulkan/BufferManager.cs index 8315ba4a0..06e137b42 100644 --- a/Ryujinx.Graphics.Vulkan/BufferManager.cs +++ b/Ryujinx.Graphics.Vulkan/BufferManager.cs @@ -125,6 +125,18 @@ namespace Ryujinx.Graphics.Vulkan return null; } + public Auto GetBufferWithSize(CommandBuffer commandBuffer, BufferHandle handle, bool isWrite, out int size) + { + if (TryGetBuffer(handle, out var holder)) + { + size = holder.Size; + return holder.GetBuffer(commandBuffer, isWrite); + } + + size = 0; + return null; + } + public Auto GetBufferI8ToI16(CommandBufferScoped cbs, BufferHandle handle, int offset, int size) { if (TryGetBuffer(handle, out var holder)) diff --git a/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/Ryujinx.Graphics.Vulkan/PipelineBase.cs index c64b58316..a9880e5ab 100644 --- a/Ryujinx.Graphics.Vulkan/PipelineBase.cs +++ b/Ryujinx.Graphics.Vulkan/PipelineBase.cs @@ -759,7 +759,7 @@ namespace Ryujinx.Graphics.Vulkan if (vertexBuffer.Buffer.Handle != BufferHandle.Null) { - var vb = Gd.BufferManager.GetBuffer(CommandBuffer, vertexBuffer.Buffer.Handle, false); + var vb = Gd.BufferManager.GetBuffer(CommandBuffer, vertexBuffer.Buffer.Handle, false, out int totalBufferSize); if (vb != null) { int binding = i + 1; @@ -770,11 +770,18 @@ namespace Ryujinx.Graphics.Vulkan (uint)vertexBuffer.Stride, inputRate); + int vbSize = vertexBuffer.Buffer.Size; + + if (Gd.Vendor == Vendor.Amd) + { + vbSize = totalBufferSize; + } + _vertexBuffers[binding].Dispose(); _vertexBuffers[binding] = new BufferState( vb, vertexBuffer.Buffer.Offset, - vertexBuffer.Buffer.Size, + vbSize, (ulong)vertexBuffer.Stride); _vertexBuffers[binding].BindVertexBuffer(Gd, Cbs, (uint)binding);