aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/Memory/AMemory.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-06-08 21:15:56 -0300
committerGitHub <noreply@github.com>2018-06-08 21:15:56 -0300
commit231fae1a4c97d7588655e9775f37c1dc9bd55fb0 (patch)
tree1c0e7b298ec33d5bf5b6a5693dd69a8c7e0bd23b /ChocolArm64/Memory/AMemory.cs
parent6fe51f970501fe732276c17ed0dacb564b92a73d (diff)
Texture/Vertex/Index data cache (#132)
* Initial implementation of the texture cache * Cache vertex and index data aswell, some cleanup * Improve handling of the cache by storing cached ranges on a list for each page * Delete old data from the caches automatically, ensure that the cache is cleaned when the mapping/size changes, and some general cleanup
Diffstat (limited to 'ChocolArm64/Memory/AMemory.cs')
-rw-r--r--ChocolArm64/Memory/AMemory.cs63
1 files changed, 61 insertions, 2 deletions
diff --git a/ChocolArm64/Memory/AMemory.cs b/ChocolArm64/Memory/AMemory.cs
index e7d46565..7e9a358a 100644
--- a/ChocolArm64/Memory/AMemory.cs
+++ b/ChocolArm64/Memory/AMemory.cs
@@ -54,7 +54,14 @@ namespace ChocolArm64.Memory
ExAddrs = new HashSet<long>();
- Ram = Marshal.AllocHGlobal((IntPtr)AMemoryMgr.RamSize + AMemoryMgr.PageSize);
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ {
+ Ram = AMemoryWin32.Allocate((IntPtr)AMemoryMgr.RamSize + AMemoryMgr.PageSize);
+ }
+ else
+ {
+ Ram = Marshal.AllocHGlobal((IntPtr)AMemoryMgr.RamSize + AMemoryMgr.PageSize);
+ }
RamPtr = (byte*)Ram;
}
@@ -141,6 +148,51 @@ namespace ChocolArm64.Memory
}
}
+ public long GetHostPageSize()
+ {
+ if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ {
+ return AMemoryMgr.PageSize;
+ }
+
+ IntPtr MemAddress = new IntPtr(RamPtr);
+ IntPtr MemSize = new IntPtr(AMemoryMgr.RamSize);
+
+ long PageSize = AMemoryWin32.IsRegionModified(MemAddress, MemSize, Reset: false);
+
+ if (PageSize < 1)
+ {
+ throw new InvalidOperationException();
+ }
+
+ return PageSize;
+ }
+
+ public bool IsRegionModified(long Position, long Size)
+ {
+ if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ {
+ return true;
+ }
+
+ long EndPos = Position + Size;
+
+ if ((ulong)EndPos < (ulong)Position)
+ {
+ return false;
+ }
+
+ if ((ulong)EndPos > AMemoryMgr.RamSize)
+ {
+ return false;
+ }
+
+ IntPtr MemAddress = new IntPtr(RamPtr + Position);
+ IntPtr MemSize = new IntPtr(Size);
+
+ return AMemoryWin32.IsRegionModified(MemAddress, MemSize, Reset: true) != 0;
+ }
+
public sbyte ReadSByte(long Position)
{
return (sbyte)ReadByte(Position);
@@ -640,7 +692,14 @@ namespace ChocolArm64.Memory
{
if (Ram != IntPtr.Zero)
{
- Marshal.FreeHGlobal(Ram);
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ {
+ AMemoryWin32.Free(Ram);
+ }
+ else
+ {
+ Marshal.FreeHGlobal(Ram);
+ }
Ram = IntPtr.Zero;
}