diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2021-01-17 15:44:34 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-17 19:44:34 +0100 |
| commit | c4f56c570494a6186792439e3c0e74458cc82b5c (patch) | |
| tree | 40be96f5f3f24b711e088bf2ca681d94aac68c15 /Ryujinx.Memory/Range/MemoryRange.cs | |
| parent | 3bad321d2b0994cd19129bc18ed98bb3ab81c3b0 (diff) | |
Support for resources on non-contiguous GPU memory regions (#1905)
* Support for resources on non-contiguous GPU memory regions
* Implement MultiRange physical addresses, only used with a single range for now
* Actually use non-contiguous ranges
* GetPhysicalRegions fixes
* Documentation and remove Address property from TextureInfo
* Finish implementing GetWritableRegion
* Fix typo
Diffstat (limited to 'Ryujinx.Memory/Range/MemoryRange.cs')
| -rw-r--r-- | Ryujinx.Memory/Range/MemoryRange.cs | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/Ryujinx.Memory/Range/MemoryRange.cs b/Ryujinx.Memory/Range/MemoryRange.cs new file mode 100644 index 00000000..ba12bae5 --- /dev/null +++ b/Ryujinx.Memory/Range/MemoryRange.cs @@ -0,0 +1,71 @@ +using System; + +namespace Ryujinx.Memory.Range +{ + /// <summary> + /// Range of memory composed of an address and size. + /// </summary> + public struct MemoryRange : IEquatable<MemoryRange> + { + /// <summary> + /// An empty memory range, with a null address and zero size. + /// </summary> + public static MemoryRange Empty => new MemoryRange(0UL, 0); + + /// <summary> + /// Start address of the range. + /// </summary> + public ulong Address { get; } + + /// <summary> + /// Size of the range in bytes. + /// </summary> + public ulong Size { get; } + + /// <summary> + /// Address where the range ends (exclusive). + /// </summary> + public ulong EndAddress => Address + Size; + + /// <summary> + /// Creates a new memory range with the specified address and size. + /// </summary> + /// <param name="address">Start address</param> + /// <param name="size">Size in bytes</param> + public MemoryRange(ulong address, ulong size) + { + Address = address; + Size = size; + } + + /// <summary> + /// Checks if the range overlaps with another. + /// </summary> + /// <param name="other">The other range to check for overlap</param> + /// <returns>True if the ranges overlap, false otherwise</returns> + public bool OverlapsWith(MemoryRange other) + { + ulong thisAddress = Address; + ulong thisEndAddress = EndAddress; + ulong otherAddress = other.Address; + ulong otherEndAddress = other.EndAddress; + + return thisAddress < otherEndAddress && otherAddress < thisEndAddress; + } + + public override bool Equals(object obj) + { + return obj is MemoryRange other && Equals(other); + } + + public bool Equals(MemoryRange other) + { + return Address == other.Address && Size == other.Size; + } + + public override int GetHashCode() + { + return HashCode.Combine(Address, Size); + } + } +} |
