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);
}
}
}