Initialize GPU physical memory accessor from KProcess, to allow homebrew that never maps anything on the GPU to work
This commit is contained in:
parent
6cf9a04d98
commit
647d0962df
7 changed files with 40 additions and 61 deletions
|
@ -9,7 +9,7 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
{
|
{
|
||||||
public IRenderer Renderer { get; }
|
public IRenderer Renderer { get; }
|
||||||
|
|
||||||
internal IPhysicalMemory PhysicalMemory { get; private set; }
|
internal PhysicalMemory PhysicalMemory { get; private set; }
|
||||||
|
|
||||||
public MemoryManager MemoryManager { get; }
|
public MemoryManager MemoryManager { get; }
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
|
|
||||||
internal int SequenceNumber { get; private set; }
|
internal int SequenceNumber { get; private set; }
|
||||||
|
|
||||||
private Lazy<Capabilities> _caps;
|
private readonly Lazy<Capabilities> _caps;
|
||||||
|
|
||||||
internal Capabilities Capabilities => _caps.Value;
|
internal Capabilities Capabilities => _caps.Value;
|
||||||
|
|
||||||
|
@ -53,9 +53,9 @@ namespace Ryujinx.Graphics.Gpu
|
||||||
SequenceNumber++;
|
SequenceNumber++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetVmm(IPhysicalMemory mm)
|
public void SetVmm(ARMeilleure.Memory.MemoryManager cpuMemory)
|
||||||
{
|
{
|
||||||
PhysicalMemory = mm;
|
PhysicalMemory = new PhysicalMemory(cpuMemory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -212,14 +212,6 @@ namespace Ryujinx.Graphics.Gpu.Image
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ulong pageSize = (uint)_context.PhysicalMemory.GetPageSize();
|
|
||||||
|
|
||||||
ulong pageMask = pageSize - 1;
|
|
||||||
|
|
||||||
ulong rangeAddress = Address & ~pageMask;
|
|
||||||
|
|
||||||
ulong rangeSize = (EndAddress - Address + pageMask) & ~pageMask;
|
|
||||||
|
|
||||||
Span<byte> data = _context.PhysicalMemory.Read(Address, Size);
|
Span<byte> data = _context.PhysicalMemory.Read(Address, Size);
|
||||||
|
|
||||||
if (_info.IsLinear)
|
if (_info.IsLinear)
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Ryujinx.Graphics.Gpu.Memory
|
|
||||||
{
|
|
||||||
public interface IPhysicalMemory
|
|
||||||
{
|
|
||||||
int GetPageSize();
|
|
||||||
|
|
||||||
Span<byte> Read(ulong address, ulong size);
|
|
||||||
|
|
||||||
void Write(ulong address, Span<byte> data);
|
|
||||||
|
|
||||||
(ulong, ulong)[] GetModifiedRanges(ulong address, ulong size, ResourceName name);
|
|
||||||
}
|
|
||||||
}
|
|
31
Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs
Normal file
31
Ryujinx.Graphics.Gpu/Memory/PhysicalMemory.cs
Normal file
|
@ -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<byte> Read(ulong address, ulong size)
|
||||||
|
{
|
||||||
|
return _cpuMemory.ReadBytes((long)address, (long)size);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Write(ulong address, Span<byte> data)
|
||||||
|
{
|
||||||
|
_cpuMemory.WriteBytes((long)address, data.ToArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
public (ulong, ulong)[] GetModifiedRanges(ulong address, ulong size, ResourceName name)
|
||||||
|
{
|
||||||
|
return _cpuMemory.GetModifiedRanges(address, size, (int)name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\ARMeilleure\ARMeilleure.csproj" />
|
||||||
<ProjectReference Include="..\Ryujinx.Graphics.GAL\Ryujinx.Graphics.GAL.csproj" />
|
<ProjectReference Include="..\Ryujinx.Graphics.GAL\Ryujinx.Graphics.GAL.csproj" />
|
||||||
<ProjectReference Include="..\Ryujinx.Common\Ryujinx.Common.csproj" />
|
<ProjectReference Include="..\Ryujinx.Common\Ryujinx.Common.csproj" />
|
||||||
<ProjectReference Include="..\Ryujinx.Graphics.Texture\Ryujinx.Graphics.Texture.csproj" />
|
<ProjectReference Include="..\Ryujinx.Graphics.Texture\Ryujinx.Graphics.Texture.csproj" />
|
||||||
|
|
|
@ -1115,6 +1115,10 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
|
||||||
|
|
||||||
Translator = new Translator(CpuMemory);
|
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);
|
MemoryManager = new KMemoryManager(_system, CpuMemory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,44 +40,10 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostAsGpu.Types
|
||||||
|
|
||||||
public MemoryManager Gmm { get; }
|
public MemoryManager Gmm { get; }
|
||||||
|
|
||||||
private class MemoryProxy : IPhysicalMemory
|
|
||||||
{
|
|
||||||
private ARMeilleure.Memory.MemoryManager _cpuMemory;
|
|
||||||
|
|
||||||
public MemoryProxy(ARMeilleure.Memory.MemoryManager cpuMemory)
|
|
||||||
{
|
|
||||||
_cpuMemory = cpuMemory;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Span<byte> Read(ulong address, ulong size)
|
|
||||||
{
|
|
||||||
return _cpuMemory.ReadBytes((long)address, (long)size);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Write(ulong address, Span<byte> 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)
|
public AddressSpaceContext(ServiceCtx context)
|
||||||
{
|
{
|
||||||
Gmm = context.Device.Gpu.MemoryManager;
|
Gmm = context.Device.Gpu.MemoryManager;
|
||||||
|
|
||||||
var memoryProxy = new MemoryProxy(context.Process.CpuMemory);
|
|
||||||
|
|
||||||
context.Device.Gpu.SetVmm(memoryProxy);
|
|
||||||
|
|
||||||
_maps = new SortedList<long, Range>();
|
_maps = new SortedList<long, Range>();
|
||||||
_reservations = new SortedList<long, Range>();
|
_reservations = new SortedList<long, Range>();
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue