mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2025-07-26 21:17:12 +02:00
Add a separate device memory manager (#6153)
* Add a separate device memory manager * Still need this * Device writes are always tracked * Device writes are always tracked (2) * Rename more instances of gmm to mm
This commit is contained in:
parent
90455a05e6
commit
f241f88558
33 changed files with 555 additions and 157 deletions
|
@ -1,4 +1,5 @@
|
|||
using Ryujinx.Common;
|
||||
using Ryujinx.Graphics.Device;
|
||||
using Ryujinx.Graphics.GAL;
|
||||
using Ryujinx.Graphics.Gpu.Engine.GPFifo;
|
||||
using Ryujinx.Graphics.Gpu.Memory;
|
||||
|
@ -163,6 +164,22 @@ namespace Ryujinx.Graphics.Gpu
|
|||
return new MemoryManager(physicalMemory);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new device memory manager.
|
||||
/// </summary>
|
||||
/// <param name="pid">ID of the process that owns the memory manager</param>
|
||||
/// <returns>The memory manager</returns>
|
||||
/// <exception cref="ArgumentException">Thrown when <paramref name="pid"/> is invalid</exception>
|
||||
public DeviceMemoryManager CreateDeviceMemoryManager(ulong pid)
|
||||
{
|
||||
if (!PhysicalMemoryRegistry.TryGetValue(pid, out var physicalMemory))
|
||||
{
|
||||
throw new ArgumentException("The PID is invalid or the process was not registered", nameof(pid));
|
||||
}
|
||||
|
||||
return physicalMemory.CreateDeviceMemoryManager();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Registers virtual memory used by a process for GPU memory access, caching and read/write tracking.
|
||||
/// </summary>
|
||||
|
|
|
@ -329,49 +329,6 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes data to GPU mapped memory, stopping at the first unmapped page at the memory region, if any.
|
||||
/// </summary>
|
||||
/// <param name="va">GPU virtual address to write the data into</param>
|
||||
/// <param name="data">The data to be written</param>
|
||||
public void WriteMapped(ulong va, ReadOnlySpan<byte> data)
|
||||
{
|
||||
if (IsContiguous(va, data.Length))
|
||||
{
|
||||
Physical.Write(Translate(va), data);
|
||||
}
|
||||
else
|
||||
{
|
||||
int offset = 0, size;
|
||||
|
||||
if ((va & PageMask) != 0)
|
||||
{
|
||||
ulong pa = Translate(va);
|
||||
|
||||
size = Math.Min(data.Length, (int)PageSize - (int)(va & PageMask));
|
||||
|
||||
if (pa != PteUnmapped && Physical.IsMapped(pa))
|
||||
{
|
||||
Physical.Write(pa, data[..size]);
|
||||
}
|
||||
|
||||
offset += size;
|
||||
}
|
||||
|
||||
for (; offset < data.Length; offset += size)
|
||||
{
|
||||
ulong pa = Translate(va + (ulong)offset);
|
||||
|
||||
size = Math.Min(data.Length - offset, (int)PageSize);
|
||||
|
||||
if (pa != PteUnmapped && Physical.IsMapped(pa))
|
||||
{
|
||||
Physical.Write(pa, data.Slice(offset, size));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Runs remap actions that are added to an unmap event.
|
||||
/// These must run after the mapping completes.
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using Ryujinx.Cpu;
|
||||
using Ryujinx.Graphics.Device;
|
||||
using Ryujinx.Graphics.Gpu.Image;
|
||||
using Ryujinx.Graphics.Gpu.Shader;
|
||||
using Ryujinx.Memory;
|
||||
|
@ -82,6 +83,15 @@ namespace Ryujinx.Graphics.Gpu.Memory
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new device memory manager.
|
||||
/// </summary>
|
||||
/// <returns>The memory manager</returns>
|
||||
public DeviceMemoryManager CreateDeviceMemoryManager()
|
||||
{
|
||||
return new DeviceMemoryManager(_cpuMemory);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a host pointer for a given range of application memory.
|
||||
/// If the memory region is not a single contiguous block, this method returns 0.
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.Graphics.Device;
|
||||
using System;
|
||||
using System.Threading;
|
||||
|
||||
|
@ -7,7 +8,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization
|
|||
/// <summary>
|
||||
/// GPU synchronization manager.
|
||||
/// </summary>
|
||||
public class SynchronizationManager
|
||||
public class SynchronizationManager : ISynchronizationManager
|
||||
{
|
||||
/// <summary>
|
||||
/// The maximum number of syncpoints supported by the GM20B.
|
||||
|
@ -29,12 +30,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Increment the value of a syncpoint with a given id.
|
||||
/// </summary>
|
||||
/// <param name="id">The id of the syncpoint</param>
|
||||
/// <exception cref="System.ArgumentOutOfRangeException">Thrown when id >= MaxHardwareSyncpoints</exception>
|
||||
/// <returns>The incremented value of the syncpoint</returns>
|
||||
/// <inheritdoc/>
|
||||
public uint IncrementSyncpoint(uint id)
|
||||
{
|
||||
ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(id, (uint)MaxHardwareSyncpoints);
|
||||
|
@ -42,12 +38,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization
|
|||
return _syncpoints[id].Increment();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the value of a syncpoint with a given id.
|
||||
/// </summary>
|
||||
/// <param name="id">The id of the syncpoint</param>
|
||||
/// <exception cref="System.ArgumentOutOfRangeException">Thrown when id >= MaxHardwareSyncpoints</exception>
|
||||
/// <returns>The value of the syncpoint</returns>
|
||||
/// <inheritdoc/>
|
||||
public uint GetSyncpointValue(uint id)
|
||||
{
|
||||
ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(id, (uint)MaxHardwareSyncpoints);
|
||||
|
@ -84,15 +75,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization
|
|||
_syncpoints[id].UnregisterCallback(waiterInformation);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Wait on a syncpoint with a given id at a target threshold.
|
||||
/// The callback will be called once the threshold is reached and will automatically be unregistered.
|
||||
/// </summary>
|
||||
/// <param name="id">The id of the syncpoint</param>
|
||||
/// <param name="threshold">The target threshold</param>
|
||||
/// <param name="timeout">The timeout</param>
|
||||
/// <exception cref="System.ArgumentOutOfRangeException">Thrown when id >= MaxHardwareSyncpoints</exception>
|
||||
/// <returns>True if timed out</returns>
|
||||
/// <inheritdoc/>
|
||||
public bool WaitOnSyncpoint(uint id, uint threshold, TimeSpan timeout)
|
||||
{
|
||||
ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(id, (uint)MaxHardwareSyncpoints);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue