aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Cpu
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-02-16 18:28:49 -0300
committerGitHub <noreply@github.com>2023-02-16 18:28:49 -0300
commitefb135b74c9c0ff1de2dfd7d2a431bd23185ca66 (patch)
tree4defd89a4473e8d1149e041e98171d1b92fa18f2 /Ryujinx.Cpu
parenta707842e14dde468781270198ae63757ca3c2716 (diff)
Clear CPU side data on GPU buffer clears (#4125)
* Clear CPU side data on GPU buffer clears * Implement tracked fill operation that can signal other resource types except buffer * Fix tests, add missing XML doc * PR feedback
Diffstat (limited to 'Ryujinx.Cpu')
-rw-r--r--Ryujinx.Cpu/AppleHv/HvMemoryManager.cs20
-rw-r--r--Ryujinx.Cpu/IVirtualMemoryManagerTracked.cs9
-rw-r--r--Ryujinx.Cpu/Jit/MemoryManager.cs18
-rw-r--r--Ryujinx.Cpu/Jit/MemoryManagerHostMapped.cs20
-rw-r--r--Ryujinx.Cpu/MemoryEhMeilleure.cs2
5 files changed, 36 insertions, 33 deletions
diff --git a/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs b/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs
index 222dcae1..437e02ae 100644
--- a/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs
+++ b/Ryujinx.Cpu/AppleHv/HvMemoryManager.cs
@@ -634,13 +634,13 @@ namespace Ryujinx.Cpu.AppleHv
/// <remarks>
/// This function also validates that the given range is both valid and mapped, and will throw if it is not.
/// </remarks>
- public void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false)
+ public void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null)
{
AssertValidAddressAndSize(va, size);
if (precise)
{
- Tracking.VirtualMemoryEvent(va, size, write, precise: true);
+ Tracking.VirtualMemoryEvent(va, size, write, precise: true, exemptId);
return;
}
@@ -663,7 +663,7 @@ namespace Ryujinx.Cpu.AppleHv
if (state >= tag)
{
- Tracking.VirtualMemoryEvent(va, size, write);
+ Tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId);
return;
}
else if (state == 0)
@@ -706,7 +706,7 @@ namespace Ryujinx.Cpu.AppleHv
// Only trigger tracking from reads if both bits are set on any page.
if (write || (pte & (pte >> 1) & BlockMappedMask) != 0)
{
- Tracking.VirtualMemoryEvent(va, size, write);
+ Tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId);
break;
}
}
@@ -822,21 +822,21 @@ namespace Ryujinx.Cpu.AppleHv
}
/// <inheritdoc/>
- public CpuRegionHandle BeginTracking(ulong address, ulong size)
+ public CpuRegionHandle BeginTracking(ulong address, ulong size, int id)
{
- return new CpuRegionHandle(Tracking.BeginTracking(address, size));
+ return new CpuRegionHandle(Tracking.BeginTracking(address, size, id));
}
/// <inheritdoc/>
- public CpuMultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity)
+ public CpuMultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id)
{
- return new CpuMultiRegionHandle(Tracking.BeginGranularTracking(address, size, handles, granularity));
+ return new CpuMultiRegionHandle(Tracking.BeginGranularTracking(address, size, handles, granularity, id));
}
/// <inheritdoc/>
- public CpuSmartMultiRegionHandle BeginSmartGranularTracking(ulong address, ulong size, ulong granularity)
+ public CpuSmartMultiRegionHandle BeginSmartGranularTracking(ulong address, ulong size, ulong granularity, int id)
{
- return new CpuSmartMultiRegionHandle(Tracking.BeginSmartGranularTracking(address, size, granularity));
+ return new CpuSmartMultiRegionHandle(Tracking.BeginSmartGranularTracking(address, size, granularity, id));
}
/// <summary>
diff --git a/Ryujinx.Cpu/IVirtualMemoryManagerTracked.cs b/Ryujinx.Cpu/IVirtualMemoryManagerTracked.cs
index 8004d39b..92d3c76c 100644
--- a/Ryujinx.Cpu/IVirtualMemoryManagerTracked.cs
+++ b/Ryujinx.Cpu/IVirtualMemoryManagerTracked.cs
@@ -28,8 +28,9 @@ namespace Ryujinx.Cpu
/// </summary>
/// <param name="address">CPU virtual address of the region</param>
/// <param name="size">Size of the region</param>
+ /// <param name="id">Handle ID</param>
/// <returns>The memory tracking handle</returns>
- CpuRegionHandle BeginTracking(ulong address, ulong size);
+ CpuRegionHandle BeginTracking(ulong address, ulong size, int id);
/// <summary>
/// Obtains a memory tracking handle for the given virtual region, with a specified granularity. This should be disposed when finished with.
@@ -38,8 +39,9 @@ namespace Ryujinx.Cpu
/// <param name="size">Size of the region</param>
/// <param name="handles">Handles to inherit state from or reuse. When none are present, provide null</param>
/// <param name="granularity">Desired granularity of write tracking</param>
+ /// <param name="id">Handle ID</param>
/// <returns>The memory tracking handle</returns>
- CpuMultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity);
+ CpuMultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id);
/// <summary>
/// Obtains a smart memory tracking handle for the given virtual region, with a specified granularity. This should be disposed when finished with.
@@ -47,7 +49,8 @@ namespace Ryujinx.Cpu
/// <param name="address">CPU virtual address of the region</param>
/// <param name="size">Size of the region</param>
/// <param name="granularity">Desired granularity of write tracking</param>
+ /// <param name="id">Handle ID</param>
/// <returns>The memory tracking handle</returns>
- CpuSmartMultiRegionHandle BeginSmartGranularTracking(ulong address, ulong size, ulong granularity);
+ CpuSmartMultiRegionHandle BeginSmartGranularTracking(ulong address, ulong size, ulong granularity, int id);
}
}
diff --git a/Ryujinx.Cpu/Jit/MemoryManager.cs b/Ryujinx.Cpu/Jit/MemoryManager.cs
index 014d843b..8542d53e 100644
--- a/Ryujinx.Cpu/Jit/MemoryManager.cs
+++ b/Ryujinx.Cpu/Jit/MemoryManager.cs
@@ -629,31 +629,31 @@ namespace Ryujinx.Cpu.Jit
}
/// <inheritdoc/>
- public CpuRegionHandle BeginTracking(ulong address, ulong size)
+ public CpuRegionHandle BeginTracking(ulong address, ulong size, int id)
{
- return new CpuRegionHandle(Tracking.BeginTracking(address, size));
+ return new CpuRegionHandle(Tracking.BeginTracking(address, size, id));
}
/// <inheritdoc/>
- public CpuMultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity)
+ public CpuMultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id)
{
- return new CpuMultiRegionHandle(Tracking.BeginGranularTracking(address, size, handles, granularity));
+ return new CpuMultiRegionHandle(Tracking.BeginGranularTracking(address, size, handles, granularity, id));
}
/// <inheritdoc/>
- public CpuSmartMultiRegionHandle BeginSmartGranularTracking(ulong address, ulong size, ulong granularity)
+ public CpuSmartMultiRegionHandle BeginSmartGranularTracking(ulong address, ulong size, ulong granularity, int id)
{
- return new CpuSmartMultiRegionHandle(Tracking.BeginSmartGranularTracking(address, size, granularity));
+ return new CpuSmartMultiRegionHandle(Tracking.BeginSmartGranularTracking(address, size, granularity, id));
}
/// <inheritdoc/>
- public void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false)
+ public void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null)
{
AssertValidAddressAndSize(va, size);
if (precise)
{
- Tracking.VirtualMemoryEvent(va, size, write, precise: true);
+ Tracking.VirtualMemoryEvent(va, size, write, precise: true, exemptId);
return;
}
@@ -676,7 +676,7 @@ namespace Ryujinx.Cpu.Jit
if ((pte & tag) != 0)
{
- Tracking.VirtualMemoryEvent(va, size, write);
+ Tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId);
break;
}
diff --git a/Ryujinx.Cpu/Jit/MemoryManagerHostMapped.cs b/Ryujinx.Cpu/Jit/MemoryManagerHostMapped.cs
index 856b6b9b..090740ab 100644
--- a/Ryujinx.Cpu/Jit/MemoryManagerHostMapped.cs
+++ b/Ryujinx.Cpu/Jit/MemoryManagerHostMapped.cs
@@ -518,13 +518,13 @@ namespace Ryujinx.Cpu.Jit
/// <remarks>
/// This function also validates that the given range is both valid and mapped, and will throw if it is not.
/// </remarks>
- public void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false)
+ public void SignalMemoryTracking(ulong va, ulong size, bool write, bool precise = false, int? exemptId = null)
{
AssertValidAddressAndSize(va, size);
if (precise)
{
- Tracking.VirtualMemoryEvent(va, size, write, precise: true);
+ Tracking.VirtualMemoryEvent(va, size, write, precise: true, exemptId);
return;
}
@@ -547,7 +547,7 @@ namespace Ryujinx.Cpu.Jit
if (state >= tag)
{
- Tracking.VirtualMemoryEvent(va, size, write);
+ Tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId);
return;
}
else if (state == 0)
@@ -590,7 +590,7 @@ namespace Ryujinx.Cpu.Jit
// Only trigger tracking from reads if both bits are set on any page.
if (write || (pte & (pte >> 1) & BlockMappedMask) != 0)
{
- Tracking.VirtualMemoryEvent(va, size, write);
+ Tracking.VirtualMemoryEvent(va, size, write, precise: false, exemptId);
break;
}
}
@@ -706,21 +706,21 @@ namespace Ryujinx.Cpu.Jit
}
/// <inheritdoc/>
- public CpuRegionHandle BeginTracking(ulong address, ulong size)
+ public CpuRegionHandle BeginTracking(ulong address, ulong size, int id)
{
- return new CpuRegionHandle(Tracking.BeginTracking(address, size));
+ return new CpuRegionHandle(Tracking.BeginTracking(address, size, id));
}
/// <inheritdoc/>
- public CpuMultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity)
+ public CpuMultiRegionHandle BeginGranularTracking(ulong address, ulong size, IEnumerable<IRegionHandle> handles, ulong granularity, int id)
{
- return new CpuMultiRegionHandle(Tracking.BeginGranularTracking(address, size, handles, granularity));
+ return new CpuMultiRegionHandle(Tracking.BeginGranularTracking(address, size, handles, granularity, id));
}
/// <inheritdoc/>
- public CpuSmartMultiRegionHandle BeginSmartGranularTracking(ulong address, ulong size, ulong granularity)
+ public CpuSmartMultiRegionHandle BeginSmartGranularTracking(ulong address, ulong size, ulong granularity, int id)
{
- return new CpuSmartMultiRegionHandle(Tracking.BeginSmartGranularTracking(address, size, granularity));
+ return new CpuSmartMultiRegionHandle(Tracking.BeginSmartGranularTracking(address, size, granularity, id));
}
/// <summary>
diff --git a/Ryujinx.Cpu/MemoryEhMeilleure.cs b/Ryujinx.Cpu/MemoryEhMeilleure.cs
index 806ef811..0b434ea7 100644
--- a/Ryujinx.Cpu/MemoryEhMeilleure.cs
+++ b/Ryujinx.Cpu/MemoryEhMeilleure.cs
@@ -8,7 +8,7 @@ namespace Ryujinx.Cpu
{
public class MemoryEhMeilleure : IDisposable
{
- private delegate bool TrackingEventDelegate(ulong address, ulong size, bool write, bool precise = false);
+ private delegate bool TrackingEventDelegate(ulong address, ulong size, bool write);
private readonly MemoryTracking _tracking;
private readonly TrackingEventDelegate _trackingEvent;