ryujinx/Ryujinx.HLE/OsHle/Handles/KTlsPageManager.cs
gdkchan c393cdf8e3
More flexible memory manager (#307)
* Keep track mapped buffers with fixed offsets

* Started rewriting the memory manager

* Initial support for MapPhysicalMemory and UnmapPhysicalMemory, other tweaks

* MapPhysicalMemory/UnmapPhysicalMemory support, other tweaks

* Rebased

* Optimize the map/unmap physical memory svcs

* Integrate shared font support

* Fix address space reserve alignment

* Some fixes related to gpu memory mapping

* Some cleanup

* Only try uploading const buffers that are really used

* Check if memory region is contiguous

* Rebased

* Add missing count increment on IsRegionModified

* Check for reads/writes outside of the address space, optimize translation with a tail call
2018-08-15 15:59:51 -03:00

60 lines
1.3 KiB
C#

using System;
namespace Ryujinx.HLE.OsHle.Handles
{
class KTlsPageManager
{
private const int TlsEntrySize = 0x200;
private long PagePosition;
private int UsedSlots;
private bool[] Slots;
public bool IsEmpty => UsedSlots == 0;
public bool IsFull => UsedSlots == Slots.Length;
public KTlsPageManager(long PagePosition)
{
this.PagePosition = PagePosition;
Slots = new bool[KMemoryManager.PageSize / TlsEntrySize];
}
public bool TryGetFreeTlsAddr(out long Position)
{
Position = PagePosition;
for (int Index = 0; Index < Slots.Length; Index++)
{
if (!Slots[Index])
{
Slots[Index] = true;
UsedSlots++;
return true;
}
Position += TlsEntrySize;
}
Position = 0;
return false;
}
public void FreeTlsSlot(int Slot)
{
if ((uint)Slot > Slots.Length)
{
throw new ArgumentOutOfRangeException(nameof(Slot));
}
Slots[Slot] = false;
UsedSlots--;
}
}
}