Dehardcode residency page size
This commit is contained in:
parent
f7b8c5dc57
commit
9b51ce9bb6
1 changed files with 30 additions and 9 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue