From 1df6c07f78c4c3b8c7fc679d7466f79a10c2d496 Mon Sep 17 00:00:00 2001
From: gdkchan <gab.dark.100@gmail.com>
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
---
 .../Memory/MultiRangeBuffer.cs                     | 60 ++++++++++++++++++++++
 1 file changed, 60 insertions(+)
 create mode 100644 src/Ryujinx.Graphics.Gpu/Memory/MultiRangeBuffer.cs

(limited to 'src/Ryujinx.Graphics.Gpu/Memory/MultiRangeBuffer.cs')

diff --git a/src/Ryujinx.Graphics.Gpu/Memory/MultiRangeBuffer.cs b/src/Ryujinx.Graphics.Gpu/Memory/MultiRangeBuffer.cs
new file mode 100644
index 00000000..e039a7a4
--- /dev/null
+++ b/src/Ryujinx.Graphics.Gpu/Memory/MultiRangeBuffer.cs
@@ -0,0 +1,60 @@
+using Ryujinx.Graphics.GAL;
+using Ryujinx.Memory.Range;
+using System;
+
+namespace Ryujinx.Graphics.Gpu.Memory
+{
+    /// <summary>
+    /// Buffer, used to store vertex and index data, uniform and storage buffers, and others.
+    /// </summary>
+    class MultiRangeBuffer : IMultiRangeItem, IDisposable
+    {
+        private readonly GpuContext _context;
+
+        /// <summary>
+        /// Host buffer handle.
+        /// </summary>
+        public BufferHandle Handle { get; }
+
+        /// <summary>
+        /// Range of memory where the data is located.
+        /// </summary>
+        public MultiRange Range { get; }
+
+        /// <summary>
+        /// Creates a new instance of the buffer.
+        /// </summary>
+        /// <param name="context">GPU context that the buffer belongs to</param>
+        /// <param name="range">Range of memory where the data is mapped</param>
+        /// <param name="storages">Backing memory for the buffers</param>
+        public MultiRangeBuffer(GpuContext context, MultiRange range, ReadOnlySpan<BufferRange> storages)
+        {
+            _context = context;
+            Range = range;
+            Handle = context.Renderer.CreateBufferSparse(storages);
+        }
+
+        /// <summary>
+        /// Gets a sub-range from the buffer.
+        /// </summary>
+        /// <remarks>
+        /// This can be used to bind and use sub-ranges of the buffer on the host API.
+        /// </remarks>
+        /// <param name="range">Range of memory where the data is mapped</param>
+        /// <returns>The buffer sub-range</returns>
+        public BufferRange GetRange(MultiRange range)
+        {
+            int offset = Range.FindOffset(range);
+
+            return new BufferRange(Handle, offset, (int)range.GetSize());
+        }
+
+        /// <summary>
+        /// Disposes the host buffer.
+        /// </summary>
+        public void Dispose()
+        {
+            _context.Renderer.DeleteBuffer(Handle);
+        }
+    }
+}
-- 
cgit v1.2.3-70-g09d2