aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2021-08-29 16:52:38 -0300
committerGitHub <noreply@github.com>2021-08-29 16:52:38 -0300
commit82cefc8dd3babb781d4b7229435e26911fb083dd (patch)
tree769fb8595890c414fd8721e345ef3f0764c80e25 /Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs
parent15e7fe3ac940a1768a25326e66683ad0f23127e0 (diff)
Handle indirect draw counts with non-zero draw starts properly (#2593)
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs')
-rw-r--r--Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs27
1 files changed, 25 insertions, 2 deletions
diff --git a/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs b/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs
index b747b558..2dc1edd2 100644
--- a/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs
+++ b/Ryujinx.Graphics.Gpu/Memory/MemoryManager.cs
@@ -63,10 +63,33 @@ namespace Ryujinx.Graphics.Gpu.Memory
/// </summary>
/// <typeparam name="T">Type of the data</typeparam>
/// <param name="va">GPU virtual address where the data is located</param>
+ /// <param name="tracked">True if read tracking is triggered on the memory region</param>
/// <returns>The data at the specified memory location</returns>
- public T Read<T>(ulong va) where T : unmanaged
+ public T Read<T>(ulong va, bool tracked = false) where T : unmanaged
{
- return MemoryMarshal.Cast<byte, T>(GetSpan(va, Unsafe.SizeOf<T>()))[0];
+ int size = Unsafe.SizeOf<T>();
+
+ if (IsContiguous(va, size))
+ {
+ ulong address = Translate(va);
+
+ if (tracked)
+ {
+ return Physical.ReadTracked<T>(address);
+ }
+ else
+ {
+ return Physical.Read<T>(address);
+ }
+ }
+ else
+ {
+ Span<byte> data = new byte[size];
+
+ ReadImpl(va, data, tracked);
+
+ return MemoryMarshal.Cast<byte, T>(data)[0];
+ }
}
/// <summary>