mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-06-28 06:46:24 +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:
parent
0531c16326
commit
1df6c07f78
33 changed files with 1241 additions and 233 deletions
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue