Dehardcode residency page size

This commit is contained in:
ReinUsesLisp 2018-07-23 01:43:54 -03:00
commit 9b51ce9bb6

View file

@ -114,7 +114,7 @@ namespace Ryujinx.HLE.Gpu.Memory
private HashSet<long>[] Residency; private HashSet<long>[] Residency;
private const int PageSize = AMemoryMgr.PageSize; private long ResidencyPageSize;
private int CpCount; private int CpCount;
@ -123,13 +123,6 @@ namespace Ryujinx.HLE.Gpu.Memory
Cache = new Dictionary<long, CachedPage>(); Cache = new Dictionary<long, CachedPage>();
SortedCache = new LinkedList<long>(); SortedCache = new LinkedList<long>();
Residency = new HashSet<long>[AMemoryMgr.RamSize / PageSize];
for (int i = 0; i < Residency.Length; i++)
{
Residency[i] = new HashSet<long>();
}
} }
public bool IsRegionModified(AMemory Memory, NvGpuBufferType BufferType, long PA, long Size) public bool IsRegionModified(AMemory Memory, NvGpuBufferType BufferType, long PA, long Size)
@ -143,6 +136,10 @@ namespace Ryujinx.HLE.Gpu.Memory
ClearCachedPagesIfNeeded(); ClearCachedPagesIfNeeded();
long PageSize = Memory.GetHostPageSize();
EnsureResidencyInitialized(PageSize);
bool HasResidents = AddResidency(PA, Size); bool HasResidents = AddResidency(PA, Size);
if (!HasResidents && ModifiedCount == 0) if (!HasResidents && ModifiedCount == 0)
@ -204,6 +201,8 @@ namespace Ryujinx.HLE.Gpu.Memory
private bool AddResidency(long PA, long Size) private bool AddResidency(long PA, long Size)
{ {
long PageSize = ResidencyPageSize;
long Mask = PageSize - 1; long Mask = PageSize - 1;
long Key = PA; long Key = PA;
@ -225,6 +224,28 @@ namespace Ryujinx.HLE.Gpu.Memory
return ResidentFound; return ResidentFound;
} }
private void EnsureResidencyInitialized(long PageSize)
{
if (Residency == null)
{
Residency = new HashSet<long>[AMemoryMgr.RamSize / PageSize];
for (int i = 0; i < Residency.Length; i++)
{
Residency[i] = new HashSet<long>();
}
ResidencyPageSize = PageSize;
}
else
{
if (ResidencyPageSize != PageSize)
{
throw new InvalidOperationException("Tried to change residency page size");
}
}
}
private void ClearCachedPagesIfNeeded() private void ClearCachedPagesIfNeeded()
{ {
if (CpCount <= MaxCpCount) if (CpCount <= MaxCpCount)
@ -245,7 +266,7 @@ namespace Ryujinx.HLE.Gpu.Memory
CachedPage Cp = Cache[Key]; CachedPage Cp = Cache[Key];
Cp.RemoveResidency(Residency, PageSize); Cp.RemoveResidency(Residency, ResidencyPageSize);
Cache.Remove(Key); Cache.Remove(Key);