From 647d0962df5b54334af965b88f784409afbf6223 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Wed, 25 Dec 2019 20:28:17 -0300 Subject: [PATCH] Initialize GPU physical memory accessor from KProcess, to allow homebrew that never maps anything on the GPU to work --- Ryujinx.Graphics.Gpu/GpuContext.cs | 8 ++--- Ryujinx.Graphics.Gpu/Image/Texture.cs | 8 ----- .../Memory/IPhysicalMemory.cs | 15 -------- Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs | 31 +++++++++++++++++ .../Ryujinx.Graphics.Gpu.csproj | 1 + Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs | 4 +++ .../NvHostAsGpu/Types/AddressSpaceContext.cs | 34 ------------------- 7 files changed, 40 insertions(+), 61 deletions(-) delete mode 100644 Ryujinx.Graphics.Gpu/Memory/IPhysicalMemory.cs create mode 100644 Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs diff --git a/Ryujinx.Graphics.Gpu/GpuContext.cs b/Ryujinx.Graphics.Gpu/GpuContext.cs index 0906d10e..bb172c9e 100644 --- a/Ryujinx.Graphics.Gpu/GpuContext.cs +++ b/Ryujinx.Graphics.Gpu/GpuContext.cs @@ -9,7 +9,7 @@ namespace Ryujinx.Graphics.Gpu { public IRenderer Renderer { get; } - internal IPhysicalMemory PhysicalMemory { get; private set; } + internal PhysicalMemory PhysicalMemory { get; private set; } public MemoryManager MemoryManager { get; } @@ -25,7 +25,7 @@ namespace Ryujinx.Graphics.Gpu internal int SequenceNumber { get; private set; } - private Lazy _caps; + private readonly Lazy _caps; internal Capabilities Capabilities => _caps.Value; @@ -53,9 +53,9 @@ namespace Ryujinx.Graphics.Gpu SequenceNumber++; } - public void SetVmm(IPhysicalMemory mm) + public void SetVmm(ARMeilleure.Memory.MemoryManager cpuMemory) { - PhysicalMemory = mm; + PhysicalMemory = new PhysicalMemory(cpuMemory); } } } \ No newline at end of file diff --git a/Ryujinx.Graphics.Gpu/Image/Texture.cs b/Ryujinx.Graphics.Gpu/Image/Texture.cs index e72b619c..11855592 100644 --- a/Ryujinx.Graphics.Gpu/Image/Texture.cs +++ b/Ryujinx.Graphics.Gpu/Image/Texture.cs @@ -212,14 +212,6 @@ namespace Ryujinx.Graphics.Gpu.Image return; } - ulong pageSize = (uint)_context.PhysicalMemory.GetPageSize(); - - ulong pageMask = pageSize - 1; - - ulong rangeAddress = Address & ~pageMask; - - ulong rangeSize = (EndAddress - Address + pageMask) & ~pageMask; - Span data = _context.PhysicalMemory.Read(Address, Size); if (_info.IsLinear) diff --git a/Ryujinx.Graphics.Gpu/Memory/IPhysicalMemory.cs b/Ryujinx.Graphics.Gpu/Memory/IPhysicalMemory.cs deleted file mode 100644 index 73b3a9e1..00000000 --- a/Ryujinx.Graphics.Gpu/Memory/IPhysicalMemory.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace Ryujinx.Graphics.Gpu.Memory -{ - public interface IPhysicalMemory - { - int GetPageSize(); - - Span Read(ulong address, ulong size); - - void Write(ulong address, Span data); - - (ulong, ulong)[] GetModifiedRanges(ulong address, ulong size, ResourceName name); - } -} \ No newline at end of file diff --git a/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs b/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs new file mode 100644 index 00000000..8f585b0f --- /dev/null +++ b/Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs @@ -0,0 +1,31 @@ +using System; + +namespace Ryujinx.Graphics.Gpu.Memory +{ + using CpuMemoryManager = ARMeilleure.Memory.MemoryManager; + + class PhysicalMemory + { + private readonly CpuMemoryManager _cpuMemory; + + public PhysicalMemory(CpuMemoryManager cpuMemory) + { + _cpuMemory = cpuMemory; + } + + public Span Read(ulong address, ulong size) + { + return _cpuMemory.ReadBytes((long)address, (long)size); + } + + public void Write(ulong address, Span data) + { + _cpuMemory.WriteBytes((long)address, data.ToArray()); + } + + public (ulong, ulong)[] GetModifiedRanges(ulong address, ulong size, ResourceName name) + { + return _cpuMemory.GetModifiedRanges(address, size, (int)name); + } + } +} \ No newline at end of file diff --git a/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj b/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj index 88761ddf..76c12690 100644 --- a/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj +++ b/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj @@ -1,6 +1,7 @@ + diff --git a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs index c74f6fca..f987c83c 100644 --- a/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs +++ b/Ryujinx.HLE/HOS/Kernel/Process/KProcess.cs @@ -1115,6 +1115,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Process Translator = new Translator(CpuMemory); + // TODO: This should eventually be removed. + // The GPU shouldn't depend on the CPU memory manager at all. + _system.Device.Gpu.SetVmm(CpuMemory); + MemoryManager = new KMemoryManager(_system, CpuMemory); } diff --git a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostAsGpu/Types/AddressSpaceContext.cs b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostAsGpu/Types/AddressSpaceContext.cs index bca9ba7c..951994ef 100644 --- a/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostAsGpu/Types/AddressSpaceContext.cs +++ b/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostAsGpu/Types/AddressSpaceContext.cs @@ -40,44 +40,10 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu.Types public MemoryManager Gmm { get; } - private class MemoryProxy : IPhysicalMemory - { - private ARMeilleure.Memory.MemoryManager _cpuMemory; - - public MemoryProxy(ARMeilleure.Memory.MemoryManager cpuMemory) - { - _cpuMemory = cpuMemory; - } - - public Span Read(ulong address, ulong size) - { - return _cpuMemory.ReadBytes((long)address, (long)size); - } - - public void Write(ulong address, Span data) - { - _cpuMemory.WriteBytes((long)address, data.ToArray()); - } - - public (ulong, ulong)[] GetModifiedRanges(ulong address, ulong size, ResourceName name) - { - return _cpuMemory.GetModifiedRanges(address, size, (int)name); - } - - public int GetPageSize() - { - return 4096; - } - } - public AddressSpaceContext(ServiceCtx context) { Gmm = context.Device.Gpu.MemoryManager; - var memoryProxy = new MemoryProxy(context.Process.CpuMemory); - - context.Device.Gpu.SetVmm(memoryProxy); - _maps = new SortedList(); _reservations = new SortedList(); }