diff options
author | riperiperi <rhy3756547@hotmail.com> | 2022-11-24 14:50:15 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-24 15:50:15 +0100 |
commit | 65778a6b78ab8bde4090478482227e40c551db4d (patch) | |
tree | 3f59d3060b635a0cd9f9d87057ef12c00731f2ee /Ryujinx.Cpu/Jit/MemoryManager.cs | |
parent | f4e879a1e6ad810aa38c1c020467a2589441871b (diff) |
GPU: Don't trigger uploads for redundant buffer updates (#3828)1.1.382
* Initial implementation
* Actually do The Thing
* Add remark about performance to IVirtualMemoryManager
Diffstat (limited to 'Ryujinx.Cpu/Jit/MemoryManager.cs')
-rw-r--r-- | Ryujinx.Cpu/Jit/MemoryManager.cs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/Ryujinx.Cpu/Jit/MemoryManager.cs b/Ryujinx.Cpu/Jit/MemoryManager.cs index 86c69431..21c50d51 100644 --- a/Ryujinx.Cpu/Jit/MemoryManager.cs +++ b/Ryujinx.Cpu/Jit/MemoryManager.cs @@ -180,6 +180,37 @@ namespace Ryujinx.Cpu.Jit WriteImpl(va, data); } + /// <inheritdoc/> + public bool WriteWithRedundancyCheck(ulong va, ReadOnlySpan<byte> data) + { + if (data.Length == 0) + { + return false; + } + + SignalMemoryTracking(va, (ulong)data.Length, false); + + if (IsContiguousAndMapped(va, data.Length)) + { + var target = _backingMemory.GetSpan(GetPhysicalAddressInternal(va), data.Length); + + bool changed = !data.SequenceEqual(target); + + if (changed) + { + data.CopyTo(target); + } + + return changed; + } + else + { + WriteImpl(va, data); + + return true; + } + } + /// <summary> /// Writes data to CPU mapped memory. /// </summary> |