mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-08-09 03:37:52 +02:00
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
This commit is contained in:
@@ -15,6 +15,11 @@ namespace Ryujinx.Memory.Range
|
||||
|
||||
private bool HasSingleRange => _ranges == null;
|
||||
|
||||
/// <summary>
|
||||
/// Indicates that the range is fully unmapped.
|
||||
/// </summary>
|
||||
public bool IsUnmapped => HasSingleRange && _singleRange.Address == InvalidAddress;
|
||||
|
||||
/// <summary>
|
||||
/// Total of physical sub-ranges on the virtual memory region.
|
||||
/// </summary>
|
||||
@@ -38,8 +43,18 @@ namespace Ryujinx.Memory.Range
|
||||
/// <exception cref="ArgumentNullException"><paramref name="ranges"/> is null</exception>
|
||||
public MultiRange(MemoryRange[] ranges)
|
||||
{
|
||||
_singleRange = MemoryRange.Empty;
|
||||
_ranges = ranges ?? throw new ArgumentNullException(nameof(ranges));
|
||||
ArgumentNullException.ThrowIfNull(ranges);
|
||||
|
||||
if (ranges.Length == 1)
|
||||
{
|
||||
_singleRange = ranges[0];
|
||||
_ranges = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
_singleRange = MemoryRange.Empty;
|
||||
_ranges = ranges;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -91,7 +106,7 @@ namespace Ryujinx.Memory.Range
|
||||
offset -= range.Size;
|
||||
}
|
||||
|
||||
return new MultiRange(ranges.ToArray());
|
||||
return ranges.Count == 1 ? new MultiRange(ranges[0].Address, ranges[0].Size) : new MultiRange(ranges.ToArray());
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user