diff options
| author | gdk <gab.dark.100@gmail.com> | 2019-10-13 03:02:07 -0300 |
|---|---|---|
| committer | Thog <thog@protonmail.com> | 2020-01-09 02:13:00 +0100 |
| commit | 1876b346fea647e8284a66bb6d62c38801035cff (patch) | |
| tree | 6eeff094298cda84d1613dc5ec0691e51d7b35f1 /Ryujinx.Graphics/Memory | |
| parent | f617fb542a0e3d36012d77a4b5acbde7b08902f2 (diff) | |
Initial work
Diffstat (limited to 'Ryujinx.Graphics/Memory')
| -rw-r--r-- | Ryujinx.Graphics/Memory/NvGpuBufferType.cs | 11 | ||||
| -rw-r--r-- | Ryujinx.Graphics/Memory/NvGpuVmm.cs | 399 | ||||
| -rw-r--r-- | Ryujinx.Graphics/Memory/NvGpuVmmCache.cs | 79 |
3 files changed, 0 insertions, 489 deletions
diff --git a/Ryujinx.Graphics/Memory/NvGpuBufferType.cs b/Ryujinx.Graphics/Memory/NvGpuBufferType.cs deleted file mode 100644 index 6f0d2571..00000000 --- a/Ryujinx.Graphics/Memory/NvGpuBufferType.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Ryujinx.Graphics.Memory -{ - public enum NvGpuBufferType - { - Index, - Vertex, - Texture, - ConstBuffer, - Count - } -}
\ No newline at end of file diff --git a/Ryujinx.Graphics/Memory/NvGpuVmm.cs b/Ryujinx.Graphics/Memory/NvGpuVmm.cs deleted file mode 100644 index c72b82e3..00000000 --- a/Ryujinx.Graphics/Memory/NvGpuVmm.cs +++ /dev/null @@ -1,399 +0,0 @@ -using ARMeilleure.Memory; -using Ryujinx.Graphics.Gal; -using System; - -namespace Ryujinx.Graphics.Memory -{ - public class NvGpuVmm : IMemory, IGalMemory - { - public const long AddrSize = 1L << 40; - - private const int PtLvl0Bits = 14; - private const int PtLvl1Bits = 14; - private const int PtPageBits = 12; - - private const int PtLvl0Size = 1 << PtLvl0Bits; - private const int PtLvl1Size = 1 << PtLvl1Bits; - public const int PageSize = 1 << PtPageBits; - - private const int PtLvl0Mask = PtLvl0Size - 1; - private const int PtLvl1Mask = PtLvl1Size - 1; - public const int PageMask = PageSize - 1; - - private const int PtLvl0Bit = PtPageBits + PtLvl1Bits; - private const int PtLvl1Bit = PtPageBits; - - public MemoryManager Memory { get; private set; } - - private NvGpuVmmCache _cache; - - private const long PteUnmapped = -1; - private const long PteReserved = -2; - - private long[][] _pageTable; - - public NvGpuVmm(MemoryManager memory) - { - Memory = memory; - - _cache = new NvGpuVmmCache(memory); - - _pageTable = new long[PtLvl0Size][]; - } - - public long Map(long pa, long va, long size) - { - lock (_pageTable) - { - for (long offset = 0; offset < size; offset += PageSize) - { - SetPte(va + offset, pa + offset); - } - } - - return va; - } - - public long Map(long pa, long size) - { - lock (_pageTable) - { - long va = GetFreePosition(size); - - if (va != -1) - { - for (long offset = 0; offset < size; offset += PageSize) - { - SetPte(va + offset, pa + offset); - } - } - - return va; - } - } - - public long MapLow(long pa, long size) - { - lock (_pageTable) - { - long va = GetFreePosition(size, 1, PageSize); - - if (va != -1 && (ulong)va <= uint.MaxValue && (ulong)(va + size) <= uint.MaxValue) - { - for (long offset = 0; offset < size; offset += PageSize) - { - SetPte(va + offset, pa + offset); - } - } - else - { - va = -1; - } - - return va; - } - } - - public long ReserveFixed(long va, long size) - { - lock (_pageTable) - { - for (long offset = 0; offset < size; offset += PageSize) - { - if (IsPageInUse(va + offset)) - { - return -1; - } - } - - for (long offset = 0; offset < size; offset += PageSize) - { - SetPte(va + offset, PteReserved); - } - } - - return va; - } - - public long Reserve(long size, long align) - { - lock (_pageTable) - { - long position = GetFreePosition(size, align); - - if (position != -1) - { - for (long offset = 0; offset < size; offset += PageSize) - { - SetPte(position + offset, PteReserved); - } - } - - return position; - } - } - - public void Free(long va, long size) - { - lock (_pageTable) - { - for (long offset = 0; offset < size; offset += PageSize) - { - SetPte(va + offset, PteUnmapped); - } - } - } - - private long GetFreePosition(long size, long align = 1, long start = 1L << 32) - { - // Note: Address 0 is not considered valid by the driver, - // when 0 is returned it's considered a mapping error. - long position = start; - long freeSize = 0; - - if (align < 1) - { - align = 1; - } - - align = (align + PageMask) & ~PageMask; - - while (position + freeSize < AddrSize) - { - if (!IsPageInUse(position + freeSize)) - { - freeSize += PageSize; - - if (freeSize >= size) - { - return position; - } - } - else - { - position += freeSize + PageSize; - freeSize = 0; - - long remainder = position % align; - - if (remainder != 0) - { - position = (position - remainder) + align; - } - } - } - - return -1; - } - - public long GetPhysicalAddress(long va) - { - long basePos = GetPte(va); - - if (basePos < 0) - { - return -1; - } - - return basePos + (va & PageMask); - } - - public bool IsRegionFree(long va, long size) - { - for (long offset = 0; offset < size; offset += PageSize) - { - if (IsPageInUse(va + offset)) - { - return false; - } - } - - return true; - } - - private bool IsPageInUse(long va) - { - if (va >> PtLvl0Bits + PtLvl1Bits + PtPageBits != 0) - { - return false; - } - - long l0 = (va >> PtLvl0Bit) & PtLvl0Mask; - long l1 = (va >> PtLvl1Bit) & PtLvl1Mask; - - if (_pageTable[l0] == null) - { - return false; - } - - return _pageTable[l0][l1] != PteUnmapped; - } - - private long GetPte(long position) - { - long l0 = (position >> PtLvl0Bit) & PtLvl0Mask; - long l1 = (position >> PtLvl1Bit) & PtLvl1Mask; - - if (_pageTable[l0] == null) - { - return -1; - } - - return _pageTable[l0][l1]; - } - - private void SetPte(long position, long tgtAddr) - { - long l0 = (position >> PtLvl0Bit) & PtLvl0Mask; - long l1 = (position >> PtLvl1Bit) & PtLvl1Mask; - - if (_pageTable[l0] == null) - { - _pageTable[l0] = new long[PtLvl1Size]; - - for (int index = 0; index < PtLvl1Size; index++) - { - _pageTable[l0][index] = PteUnmapped; - } - } - - _pageTable[l0][l1] = tgtAddr; - } - - public bool IsRegionModified(long pa, long size, NvGpuBufferType bufferType) - { - return _cache.IsRegionModified(pa, size, bufferType); - } - - public bool TryGetHostAddress(long position, long size, out IntPtr ptr) - { - return Memory.TryGetHostAddress(GetPhysicalAddress(position), size, out ptr); - } - - public byte ReadByte(long position) - { - position = GetPhysicalAddress(position); - - return Memory.ReadByte(position); - } - - public ushort ReadUInt16(long position) - { - position = GetPhysicalAddress(position); - - return Memory.ReadUInt16(position); - } - - public uint ReadUInt32(long position) - { - position = GetPhysicalAddress(position); - - return Memory.ReadUInt32(position); - } - - public ulong ReadUInt64(long position) - { - position = GetPhysicalAddress(position); - - return Memory.ReadUInt64(position); - } - - public sbyte ReadSByte(long position) - { - position = GetPhysicalAddress(position); - - return Memory.ReadSByte(position); - } - - public short ReadInt16(long position) - { - position = GetPhysicalAddress(position); - - return Memory.ReadInt16(position); - } - - public int ReadInt32(long position) - { - position = GetPhysicalAddress(position); - - return Memory.ReadInt32(position); - } - - public long ReadInt64(long position) - { - position = GetPhysicalAddress(position); - - return Memory.ReadInt64(position); - } - - public byte[] ReadBytes(long position, long size) - { - position = GetPhysicalAddress(position); - - return Memory.ReadBytes(position, size); - } - - public void WriteByte(long position, byte value) - { - position = GetPhysicalAddress(position); - - Memory.WriteByte(position, value); - } - - public void WriteUInt16(long position, ushort value) - { - position = GetPhysicalAddress(position); - - Memory.WriteUInt16(position, value); - } - - public void WriteUInt32(long position, uint value) - { - position = GetPhysicalAddress(position); - - Memory.WriteUInt32(position, value); - } - - public void WriteUInt64(long position, ulong value) - { - position = GetPhysicalAddress(position); - - Memory.WriteUInt64(position, value); - } - - public void WriteSByte(long position, sbyte value) - { - position = GetPhysicalAddress(position); - - Memory.WriteSByte(position, value); - } - - public void WriteInt16(long position, short value) - { - position = GetPhysicalAddress(position); - - Memory.WriteInt16(position, value); - } - - public void WriteInt32(long position, int value) - { - position = GetPhysicalAddress(position); - - Memory.WriteInt32(position, value); - } - - public void WriteInt64(long position, long value) - { - position = GetPhysicalAddress(position); - - Memory.WriteInt64(position, value); - } - - public void WriteBytes(long position, byte[] data) - { - position = GetPhysicalAddress(position); - - Memory.WriteBytes(position, data); - } - } -}
\ No newline at end of file diff --git a/Ryujinx.Graphics/Memory/NvGpuVmmCache.cs b/Ryujinx.Graphics/Memory/NvGpuVmmCache.cs deleted file mode 100644 index 2a505443..00000000 --- a/Ryujinx.Graphics/Memory/NvGpuVmmCache.cs +++ /dev/null @@ -1,79 +0,0 @@ -using ARMeilleure.Memory; -using System.Collections.Concurrent; - -namespace Ryujinx.Graphics.Memory -{ - class NvGpuVmmCache - { - private const int PageBits = MemoryManager.PageBits; - - private const long PageSize = MemoryManager.PageSize; - private const long PageMask = MemoryManager.PageMask; - - private ConcurrentDictionary<long, int>[] _cachedPages; - - private MemoryManager _memory; - - public NvGpuVmmCache(MemoryManager memory) - { - _memory = memory; - - _cachedPages = new ConcurrentDictionary<long, int>[1 << 20]; - } - - public bool IsRegionModified(long position, long size, NvGpuBufferType bufferType) - { - long va = position; - - long pa = _memory.GetPhysicalAddress(va); - - long endAddr = (va + size + PageMask) & ~PageMask; - - long addrTruncated = va & ~PageMask; - - bool modified = _memory.IsRegionModified(addrTruncated, endAddr - addrTruncated); - - int newBuffMask = 1 << (int)bufferType; - - long cachedPagesCount = 0; - - while (va < endAddr) - { - long page = _memory.GetPhysicalAddress(va) >> PageBits; - - ConcurrentDictionary<long, int> dictionary = _cachedPages[page]; - - if (dictionary == null) - { - dictionary = new ConcurrentDictionary<long, int>(); - - _cachedPages[page] = dictionary; - } - else if (modified) - { - _cachedPages[page].Clear(); - } - - if (dictionary.TryGetValue(pa, out int currBuffMask)) - { - if ((currBuffMask & newBuffMask) != 0) - { - cachedPagesCount++; - } - else - { - dictionary[pa] |= newBuffMask; - } - } - else - { - dictionary[pa] = newBuffMask; - } - - va += PageSize; - } - - return cachedPagesCount != (endAddr - addrTruncated) >> PageBits; - } - } -}
\ No newline at end of file |
