diff options
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs')
-rw-r--r-- | Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs | 49 |
1 files changed, 28 insertions, 21 deletions
diff --git a/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs b/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs index b6395e73..977fbdf9 100644 --- a/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs +++ b/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs @@ -28,7 +28,7 @@ namespace Ryujinx.Graphics.Gpu.Memory private const int PtLvl1Bit = PtPageBits; private const int AddressSpaceBits = PtPageBits + PtLvl1Bits + PtLvl0Bits; - public const ulong PteUnmapped = 0xffffffff_ffffffff; + public const ulong PteUnmapped = ulong.MaxValue; private readonly ulong[][] _pageTable; @@ -340,7 +340,6 @@ namespace Ryujinx.Graphics.Gpu.Memory /// <param name="va">Virtual address of the range</param> /// <param name="size">Size of the range</param> /// <returns>Multi-range with the physical regions</returns> - /// <exception cref="InvalidMemoryRegionException">The memory region specified by <paramref name="va"/> and <paramref name="size"/> is not fully mapped</exception> public MultiRange GetPhysicalRegions(ulong va, ulong size) { if (IsContiguous(va, (int)size)) @@ -348,11 +347,6 @@ namespace Ryujinx.Graphics.Gpu.Memory return new MultiRange(Translate(va), size); } - if (!IsMapped(va)) - { - throw new InvalidMemoryRegionException($"The specified GPU virtual address 0x{va:X} is not mapped."); - } - ulong regionStart = Translate(va); ulong regionSize = Math.Min(size, PageSize - (va & PageMask)); @@ -367,14 +361,10 @@ namespace Ryujinx.Graphics.Gpu.Memory for (int page = 0; page < pages - 1; page++) { - if (!IsMapped(va + PageSize)) - { - throw new InvalidMemoryRegionException($"The specified GPU virtual memory range 0x{va:X}..0x{(va + size):X} is not fully mapped."); - } - + ulong currPa = Translate(va); ulong newPa = Translate(va + PageSize); - if (Translate(va) + PageSize != newPa) + if ((currPa != PteUnmapped || newPa != PteUnmapped) && currPa + PageSize != newPa) { regions.Add(new MemoryRange(regionStart, regionSize)); regionStart = newPa; @@ -405,18 +395,35 @@ namespace Ryujinx.Graphics.Gpu.Memory { MemoryRange currentRange = range.GetSubRange(i); - ulong address = currentRange.Address & ~PageMask; - ulong endAddress = (currentRange.EndAddress + PageMask) & ~PageMask; - - while (address < endAddress) + if (currentRange.Address != PteUnmapped) { - if (Translate(va) != address) + ulong address = currentRange.Address & ~PageMask; + ulong endAddress = (currentRange.EndAddress + PageMask) & ~PageMask; + + while (address < endAddress) { - return false; + if (Translate(va) != address) + { + return false; + } + + va += PageSize; + address += PageSize; } + } + else + { + ulong endVa = va + (((currentRange.Size) + PageMask) & ~PageMask); - va += PageSize; - address += PageSize; + while (va < endVa) + { + if (Translate(va) != PteUnmapped) + { + return false; + } + + va += PageSize; + } } } |