using Ryujinx.Graphics.GAL; using Ryujinx.Memory.Range; using System; namespace Ryujinx.Graphics.Gpu.Memory { /// /// Buffer, used to store vertex and index data, uniform and storage buffers, and others. /// class MultiRangeBuffer : IMultiRangeItem, IDisposable { private readonly GpuContext _context; /// /// Host buffer handle. /// public BufferHandle Handle { get; } /// /// Range of memory where the data is located. /// public MultiRange Range { get; } /// /// Creates a new instance of the buffer. /// /// GPU context that the buffer belongs to /// Range of memory where the data is mapped /// Backing memory for the buffers public MultiRangeBuffer(GpuContext context, MultiRange range, ReadOnlySpan storages) { _context = context; Range = range; Handle = context.Renderer.CreateBufferSparse(storages); } /// /// Gets a sub-range from the buffer. /// /// /// This can be used to bind and use sub-ranges of the buffer on the host API. /// /// Range of memory where the data is mapped /// The buffer sub-range public BufferRange GetRange(MultiRange range) { int offset = Range.FindOffset(range); return new BufferRange(Handle, offset, (int)range.GetSize()); } /// /// Disposes the host buffer. /// public void Dispose() { _context.Renderer.DeleteBuffer(Handle); } } }