Просмотр исходного кода

Initialize GPU physical memory accessor from KProcess, to allow homebrew that never maps anything on the GPU to work

gdkchan 6 лет назад
Родитель
Сommit
647d0962df

+ 4 - 4
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<Capabilities> _caps;
+        private readonly Lazy<Capabilities> _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);
         }
     }
 }

+ 0 - 8
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<byte> data = _context.PhysicalMemory.Read(Address, Size);
 
             if (_info.IsLinear)

+ 0 - 15
Ryujinx.Graphics.Gpu/Memory/IPhysicalMemory.cs

@@ -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 - 0
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<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 - 0
Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj

@@ -1,6 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <ItemGroup>
+    <ProjectReference Include="..\ARMeilleure\ARMeilleure.csproj" />
     <ProjectReference Include="..\Ryujinx.Graphics.GAL\Ryujinx.Graphics.GAL.csproj" />
     <ProjectReference Include="..\Ryujinx.Common\Ryujinx.Common.csproj" />
     <ProjectReference Include="..\Ryujinx.Graphics.Texture\Ryujinx.Graphics.Texture.csproj" />

+ 4 - 0
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);
         }
 

+ 0 - 34
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<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)
         {
             Gmm = context.Device.Gpu.MemoryManager;
 
-            var memoryProxy = new MemoryProxy(context.Process.CpuMemory);
-
-            context.Device.Gpu.SetVmm(memoryProxy);
-
             _maps         = new SortedList<long, Range>();
             _reservations = new SortedList<long, Range>();
         }