aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.HLE')
-rw-r--r--Ryujinx.HLE/HLEConfiguration.cs9
-rw-r--r--Ryujinx.HLE/HOS/ArmProcessContextFactory.cs55
-rw-r--r--Ryujinx.HLE/HOS/Horizon.cs3
-rw-r--r--Ryujinx.HLE/HOS/ProgramLoader.cs4
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,