diff options
Diffstat (limited to 'Ryujinx.HLE')
-rw-r--r-- | Ryujinx.HLE/HLEConfiguration.cs | 9 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/ArmProcessContextFactory.cs | 55 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/Horizon.cs | 3 | ||||
-rw-r--r-- | Ryujinx.HLE/HOS/ProgramLoader.cs | 4 |
4 files changed, 44 insertions, 27 deletions
diff --git a/Ryujinx.HLE/HLEConfiguration.cs b/Ryujinx.HLE/HLEConfiguration.cs index 8fd02a96..e21157f9 100644 --- a/Ryujinx.HLE/HLEConfiguration.cs +++ b/Ryujinx.HLE/HLEConfiguration.cs @@ -149,6 +149,11 @@ namespace Ryujinx.HLE public float AudioVolume { get; set; } /// <summary> + /// Use Hypervisor over JIT if available. + /// </summary> + internal readonly bool UseHypervisor; + + /// <summary> /// An action called when HLE force a refresh of output after docked mode changed. /// </summary> public Action RefreshInputConfig { internal get; set; } @@ -175,7 +180,8 @@ namespace Ryujinx.HLE MemoryManagerMode memoryManagerMode, bool ignoreMissingServices, AspectRatio aspectRatio, - float audioVolume) + float audioVolume, + bool useHypervisor) { VirtualFileSystem = virtualFileSystem; LibHacHorizonManager = libHacHorizonManager; @@ -200,6 +206,7 @@ namespace Ryujinx.HLE IgnoreMissingServices = ignoreMissingServices; AspectRatio = aspectRatio; AudioVolume = audioVolume; + UseHypervisor = useHypervisor; } } }
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs b/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs index 5ecaf38e..1b0d66ac 100644 --- a/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs +++ b/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs @@ -1,17 +1,19 @@ using Ryujinx.Common.Configuration; using Ryujinx.Cpu; +using Ryujinx.Cpu.AppleHv; using Ryujinx.Cpu.Jit; using Ryujinx.Graphics.Gpu; using Ryujinx.HLE.HOS.Kernel; using Ryujinx.HLE.HOS.Kernel.Process; using Ryujinx.Memory; using System; +using System.Runtime.InteropServices; namespace Ryujinx.HLE.HOS { class ArmProcessContextFactory : IProcessContextFactory { - private readonly ICpuEngine _cpuEngine; + private readonly ITickSource _tickSource; private readonly GpuContext _gpu; private readonly string _titleIdText; private readonly string _displayVersion; @@ -22,7 +24,7 @@ namespace Ryujinx.HLE.HOS public IDiskCacheLoadState DiskCacheLoadState { get; private set; } public ArmProcessContextFactory( - ICpuEngine cpuEngine, + ITickSource tickSource, GpuContext gpu, string titleIdText, string displayVersion, @@ -30,7 +32,7 @@ namespace Ryujinx.HLE.HOS ulong codeAddress, ulong codeSize) { - _cpuEngine = cpuEngine; + _tickSource = tickSource; _gpu = gpu; _titleIdText = titleIdText; _displayVersion = displayVersion; @@ -41,31 +43,42 @@ namespace Ryujinx.HLE.HOS public IProcessContext Create(KernelContext context, ulong pid, ulong addressSpaceSize, InvalidAccessHandler invalidAccessHandler, bool for64Bit) { - MemoryManagerMode mode = context.Device.Configuration.MemoryManagerMode; + IArmProcessContext processContext; - if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible)) + if (OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64 && for64Bit && context.Device.Configuration.UseHypervisor) { - mode = MemoryManagerMode.SoftwarePageTable; + var cpuEngine = new HvEngine(_tickSource); + var memoryManager = new HvMemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler); + processContext = new ArmProcessContext<HvMemoryManager>(pid, cpuEngine, _gpu, memoryManager, for64Bit); } + else + { + MemoryManagerMode mode = context.Device.Configuration.MemoryManagerMode; - IArmProcessContext processContext; + if (!MemoryBlock.SupportsFlags(MemoryAllocationFlags.ViewCompatible)) + { + mode = MemoryManagerMode.SoftwarePageTable; + } - switch (mode) - { - case MemoryManagerMode.SoftwarePageTable: - var memoryManager = new MemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler); - processContext = new ArmProcessContext<MemoryManager>(pid, _cpuEngine, _gpu, memoryManager, for64Bit); - break; + var cpuEngine = new JitEngine(_tickSource); + + switch (mode) + { + case MemoryManagerMode.SoftwarePageTable: + var memoryManager = new MemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler); + processContext = new ArmProcessContext<MemoryManager>(pid, cpuEngine, _gpu, memoryManager, for64Bit); + break; - case MemoryManagerMode.HostMapped: - case MemoryManagerMode.HostMappedUnsafe: - bool unsafeMode = mode == MemoryManagerMode.HostMappedUnsafe; - var memoryManagerHostMapped = new MemoryManagerHostMapped(context.Memory, addressSpaceSize, unsafeMode, invalidAccessHandler); - processContext = new ArmProcessContext<MemoryManagerHostMapped>(pid, _cpuEngine, _gpu, memoryManagerHostMapped, for64Bit); - break; + case MemoryManagerMode.HostMapped: + case MemoryManagerMode.HostMappedUnsafe: + bool unsafeMode = mode == MemoryManagerMode.HostMappedUnsafe; + var memoryManagerHostMapped = new MemoryManagerHostMapped(context.Memory, addressSpaceSize, unsafeMode, invalidAccessHandler); + processContext = new ArmProcessContext<MemoryManagerHostMapped>(pid, cpuEngine, _gpu, memoryManagerHostMapped, for64Bit); + break; - default: - throw new ArgumentOutOfRangeException(); + default: + throw new ArgumentOutOfRangeException(); + } } DiskCacheLoadState = processContext.Initialize(_titleIdText, _displayVersion, _diskCacheEnabled, _codeAddress, _codeSize); diff --git a/Ryujinx.HLE/HOS/Horizon.cs b/Ryujinx.HLE/HOS/Horizon.cs index ca3f8103..9908cbba 100644 --- a/Ryujinx.HLE/HOS/Horizon.cs +++ b/Ryujinx.HLE/HOS/Horizon.cs @@ -12,7 +12,6 @@ using Ryujinx.Audio.Renderer.Device; using Ryujinx.Audio.Renderer.Server; using Ryujinx.Common.Utilities; using Ryujinx.Cpu; -using Ryujinx.Cpu.Jit; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS.Kernel; using Ryujinx.HLE.HOS.Kernel.Memory; @@ -61,7 +60,6 @@ namespace Ryujinx.HLE.HOS internal Switch Device { get; private set; } internal ITickSource TickSource { get; } - internal ICpuEngine CpuEngine { get; } internal SurfaceFlinger SurfaceFlinger { get; private set; } internal AudioManager AudioManager { get; private set; } @@ -130,7 +128,6 @@ namespace Ryujinx.HLE.HOS public Horizon(Switch device) { TickSource = new TickSource(KernelConstants.CounterFrequency); - CpuEngine = new JitEngine(TickSource); KernelContext = new KernelContext( TickSource, diff --git a/Ryujinx.HLE/HOS/ProgramLoader.cs b/Ryujinx.HLE/HOS/ProgramLoader.cs index 695f4672..1f6fd96d 100644 --- a/Ryujinx.HLE/HOS/ProgramLoader.cs +++ b/Ryujinx.HLE/HOS/ProgramLoader.cs @@ -129,7 +129,7 @@ namespace Ryujinx.HLE.HOS KProcess process = new KProcess(context); var processContextFactory = new ArmProcessContextFactory( - context.Device.System.CpuEngine, + context.Device.System.TickSource, context.Device.Gpu, string.Empty, string.Empty, @@ -308,7 +308,7 @@ namespace Ryujinx.HLE.HOS } var processContextFactory = new ArmProcessContextFactory( - context.Device.System.CpuEngine, + context.Device.System.TickSource, context.Device.Gpu, programInfo.TitleIdText, programInfo.DisplayVersion, |