From 1df6c07f78c4c3b8c7fc679d7466f79a10c2d496 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Mon, 4 Dec 2023 16:30:19 -0300 Subject: Implement support for multi-range buffers using Vulkan sparse mappings (#5427) * Pass MultiRange to BufferManager * Implement support for multi-range buffers using Vulkan sparse mappings * Use multi-range for remaining buffers, delete old methods * Assume that more buffers are contiguous * Dispose multi-range buffers after they are removed from the list * Properly init BufferBounds for constant and storage buffers * Do not try reading zero bytes data from an unmapped address on the shader cache + PR feedback * Fix misaligned sparse buffer offsets * Null check can be simplified * PR feedback --- src/Ryujinx.Graphics.Gpu/Memory/Buffer.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'src/Ryujinx.Graphics.Gpu/Memory/Buffer.cs') diff --git a/src/Ryujinx.Graphics.Gpu/Memory/Buffer.cs b/src/Ryujinx.Graphics.Gpu/Memory/Buffer.cs index c9286a61..12461e96 100644 --- a/src/Ryujinx.Graphics.Gpu/Memory/Buffer.cs +++ b/src/Ryujinx.Graphics.Gpu/Memory/Buffer.cs @@ -43,6 +43,11 @@ namespace Ryujinx.Graphics.Gpu.Memory /// public int UnmappedSequence { get; private set; } + /// + /// Indicates if the buffer can be used in a sparse buffer mapping. + /// + public bool SparseCompatible { get; } + /// /// Ranges of the buffer that have been modified on the GPU. /// Ranges defined here cannot be updated from CPU until a CPU waiting sync point is reached. @@ -77,15 +82,25 @@ namespace Ryujinx.Graphics.Gpu.Memory /// Physical memory where the buffer is mapped /// Start address of the buffer /// Size of the buffer in bytes + /// Indicates if the buffer can be used in a sparse buffer mapping /// Buffers which this buffer contains, and will inherit tracking handles from - public Buffer(GpuContext context, PhysicalMemory physicalMemory, ulong address, ulong size, IEnumerable baseBuffers = null) + public Buffer( + GpuContext context, + PhysicalMemory physicalMemory, + ulong address, + ulong size, + bool sparseCompatible, + IEnumerable baseBuffers = null) { _context = context; _physicalMemory = physicalMemory; Address = address; Size = size; + SparseCompatible = sparseCompatible; + + BufferAccess access = sparseCompatible ? BufferAccess.SparseCompatible : BufferAccess.Default; - Handle = context.Renderer.CreateBuffer((int)size, baseBuffers?.MaxBy(x => x.Size).Handle ?? BufferHandle.Null); + Handle = context.Renderer.CreateBuffer((int)size, access, baseBuffers?.MaxBy(x => x.Size).Handle ?? BufferHandle.Null); _useGranular = size > GranularBufferThreshold; -- cgit v1.2.3