aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Memory/Range/MultiRange.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-12-04 16:30:19 -0300
committerGitHub <noreply@github.com>2023-12-04 20:30:19 +0100
commit1df6c07f78c4c3b8c7fc679d7466f79a10c2d496 (patch)
treeb80d247e199503274054259cb2707f44cc072993 /src/Ryujinx.Memory/Range/MultiRange.cs
parent0531c16326c8215bff1c0a98f3ed217f01065446 (diff)
Implement support for multi-range buffers using Vulkan sparse mappings (#5427)1.1.1098
* 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
Diffstat (limited to 'src/Ryujinx.Memory/Range/MultiRange.cs')
-rw-r--r--src/Ryujinx.Memory/Range/MultiRange.cs21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/Ryujinx.Memory/Range/MultiRange.cs b/src/Ryujinx.Memory/Range/MultiRange.cs
index 798bc911..093e2190 100644
--- a/src/Ryujinx.Memory/Range/MultiRange.cs
+++ b/src/Ryujinx.Memory/Range/MultiRange.cs
@@ -16,6 +16,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>
public int Count => HasSingleRange ? 1 : _ranges.Length;
@@ -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());
}
}