diff --git a/src/ARMeilleure/Common/AddressTablePresets.cs b/src/ARMeilleure/Common/AddressTablePresets.cs index e18c6cfe4..629e55e9c 100644 --- a/src/ARMeilleure/Common/AddressTablePresets.cs +++ b/src/ARMeilleure/Common/AddressTablePresets.cs @@ -36,11 +36,32 @@ namespace ARMeilleure.Common new( 1, 9), }; - public static AddressTableLevel[] GetArmPreset(bool for64Bits, bool sparse) + private static readonly AddressTableLevel[] _levels64BitSparseGiant = + new AddressTableLevel[] + { + new( 38, 1), + new( 2, 36), + }; + + private static readonly AddressTableLevel[] _levels32BitSparseGiant = + new AddressTableLevel[] + { + new( 31, 1), + new( 1, 30), + }; + + public static AddressTableLevel[] GetArmPreset(bool for64Bits, bool sparse, bool lowPower = false) { if (sparse) { + if (lowPower) + { + return for64Bits ? _levels64BitSparseTiny : _levels32BitSparseTiny; + } + else + { return for64Bits ? _levels64BitSparseGiant : _levels32BitSparseGiant; + } } else { diff --git a/src/ARMeilleure/Translation/PTC/Ptc.cs b/src/ARMeilleure/Translation/PTC/Ptc.cs index f9f0828e1..3a7c1e506 100644 --- a/src/ARMeilleure/Translation/PTC/Ptc.cs +++ b/src/ARMeilleure/Translation/PTC/Ptc.cs @@ -30,7 +30,7 @@ namespace ARMeilleure.Translation.PTC private const string OuterHeaderMagicString = "PTCohd\0\0"; private const string InnerHeaderMagicString = "PTCihd\0\0"; - private const uint InternalVersion = 6986; //! To be incremented manually for each change to the ARMeilleure project. + private const uint InternalVersion = 6991; //! To be incremented manually for each change to the ARMeilleure project. private const string ActualDir = "0"; private const string BackupDir = "1"; @@ -102,7 +102,7 @@ namespace ARMeilleure.Translation.PTC Disable(); } - public void Initialize(string titleIdText, string displayVersion, bool enabled, MemoryManagerType memoryMode) + public void Initialize(string titleIdText, string displayVersion, bool enabled, MemoryManagerType memoryMode, string cacheSelector) { Wait(); @@ -141,8 +141,8 @@ namespace ARMeilleure.Translation.PTC Directory.CreateDirectory(workPathBackup); } - CachePathActual = Path.Combine(workPathActual, DisplayVersion); - CachePathBackup = Path.Combine(workPathBackup, DisplayVersion); + CachePathActual = Path.Combine(workPathActual, DisplayVersion) + "-" + cacheSelector; + CachePathBackup = Path.Combine(workPathBackup, DisplayVersion) + "-" + cacheSelector; PreLoad(); Profiler.PreLoad(); diff --git a/src/ARMeilleure/Translation/Translator.cs b/src/ARMeilleure/Translation/Translator.cs index a20bef9a4..162368782 100644 --- a/src/ARMeilleure/Translation/Translator.cs +++ b/src/ARMeilleure/Translation/Translator.cs @@ -58,9 +58,9 @@ namespace ARMeilleure.Translation FunctionTable.Fill = (ulong)Stubs.SlowDispatchStub; } - public IPtcLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled) + public IPtcLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled, string cacheSelector) { - _ptc.Initialize(titleIdText, displayVersion, enabled, Memory.Type); + _ptc.Initialize(titleIdText, displayVersion, enabled, Memory.Type, cacheSelector); return _ptc; } diff --git a/src/Ryujinx.Cpu/AddressTable.cs b/src/Ryujinx.Cpu/AddressTable.cs index d8b9176ca..9f292ab10 100644 --- a/src/Ryujinx.Cpu/AddressTable.cs +++ b/src/Ryujinx.Cpu/AddressTable.cs @@ -178,12 +178,12 @@ namespace ARMeilleure.Common /// True if the guest is A64, false otherwise /// Memory manager type /// An for ARM function lookup - public static AddressTable CreateForArm(bool for64Bits, MemoryManagerType type) + public static AddressTable CreateForArm(bool for64Bits, MemoryManagerType type, bool lowPower) { // Assume software memory means that we don't want to use any signal handlers. bool sparse = type != MemoryManagerType.SoftwareMmu && type != MemoryManagerType.SoftwarePageTable; - return new AddressTable(AddressTablePresets.GetArmPreset(for64Bits, sparse), sparse); + return new AddressTable(AddressTablePresets.GetArmPreset(for64Bits, sparse, lowPower), sparse); } /// diff --git a/src/Ryujinx.Cpu/AppleHv/HvCpuContext.cs b/src/Ryujinx.Cpu/AppleHv/HvCpuContext.cs index 99e4c0479..9c761bfce 100644 --- a/src/Ryujinx.Cpu/AppleHv/HvCpuContext.cs +++ b/src/Ryujinx.Cpu/AppleHv/HvCpuContext.cs @@ -9,7 +9,7 @@ namespace Ryujinx.Cpu.AppleHv private readonly ITickSource _tickSource; private readonly HvMemoryManager _memoryManager; - public HvCpuContext(ITickSource tickSource, IMemoryManager memory, bool for64Bit) + public HvCpuContext(ITickSource tickSource, IMemoryManager memory, bool for64Bit, bool lowPower) { _tickSource = tickSource; _memoryManager = (HvMemoryManager)memory; @@ -32,7 +32,7 @@ namespace Ryujinx.Cpu.AppleHv { } - public IDiskCacheLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled) + public IDiskCacheLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled, string cacheSelector) { return new DummyDiskCacheLoadState(); } diff --git a/src/Ryujinx.Cpu/AppleHv/HvEngine.cs b/src/Ryujinx.Cpu/AppleHv/HvEngine.cs index c3c1a4484..97e2ca953 100644 --- a/src/Ryujinx.Cpu/AppleHv/HvEngine.cs +++ b/src/Ryujinx.Cpu/AppleHv/HvEngine.cs @@ -14,9 +14,9 @@ namespace Ryujinx.Cpu.AppleHv } /// - public ICpuContext CreateCpuContext(IMemoryManager memoryManager, bool for64Bit) + public ICpuContext CreateCpuContext(IMemoryManager memoryManager, bool for64Bit, bool lowPower) { - return new HvCpuContext(_tickSource, memoryManager, for64Bit); + return new HvCpuContext(_tickSource, memoryManager, for64Bit, lowPower); } } } diff --git a/src/Ryujinx.Cpu/ICpuContext.cs b/src/Ryujinx.Cpu/ICpuContext.cs index edcebdfc4..1fb3b674d 100644 --- a/src/Ryujinx.Cpu/ICpuContext.cs +++ b/src/Ryujinx.Cpu/ICpuContext.cs @@ -48,7 +48,7 @@ namespace Ryujinx.Cpu /// Version of the application /// True if the cache should be loaded from disk if it exists, false otherwise /// Disk cache load progress reporter and manager - IDiskCacheLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled); + IDiskCacheLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled, string cacheSelector); /// /// Indicates that code has been loaded into guest memory, and that it might be executed in the future. diff --git a/src/Ryujinx.Cpu/ICpuEngine.cs b/src/Ryujinx.Cpu/ICpuEngine.cs index b53b23a8c..e3b8cca74 100644 --- a/src/Ryujinx.Cpu/ICpuEngine.cs +++ b/src/Ryujinx.Cpu/ICpuEngine.cs @@ -13,6 +13,6 @@ namespace Ryujinx.Cpu /// Memory manager for the address space of the context /// Indicates if the context will be used to run 64-bit or 32-bit Arm code /// CPU context - ICpuContext CreateCpuContext(IMemoryManager memoryManager, bool for64Bit); + ICpuContext CreateCpuContext(IMemoryManager memoryManager, bool for64Bit, bool lowPower); } } diff --git a/src/Ryujinx.Cpu/Jit/JitCpuContext.cs b/src/Ryujinx.Cpu/Jit/JitCpuContext.cs index 9d9e02707..aaa0bc87c 100644 --- a/src/Ryujinx.Cpu/Jit/JitCpuContext.cs +++ b/src/Ryujinx.Cpu/Jit/JitCpuContext.cs @@ -12,10 +12,10 @@ namespace Ryujinx.Cpu.Jit private readonly Translator _translator; private readonly AddressTable _functionTable; - public JitCpuContext(ITickSource tickSource, IMemoryManager memory, bool for64Bit) + public JitCpuContext(ITickSource tickSource, IMemoryManager memory, bool for64Bit, bool lowPower) { _tickSource = tickSource; - _functionTable = AddressTable.CreateForArm(for64Bit, memory.Type); + _functionTable = AddressTable.CreateForArm(for64Bit, memory.Type, lowPower); _translator = new Translator(new JitMemoryAllocator(forJit: true), memory, _functionTable); if (memory.Type.IsHostMappedOrTracked()) @@ -50,9 +50,9 @@ namespace Ryujinx.Cpu.Jit } /// - public IDiskCacheLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled) + public IDiskCacheLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled, string cacheSelector) { - return new JitDiskCacheLoadState(_translator.LoadDiskCache(titleIdText, displayVersion, enabled)); + return new JitDiskCacheLoadState(_translator.LoadDiskCache(titleIdText, displayVersion, enabled, cacheSelector)); } /// diff --git a/src/Ryujinx.Cpu/Jit/JitEngine.cs b/src/Ryujinx.Cpu/Jit/JitEngine.cs index deebb8b9e..e70b863ff 100644 --- a/src/Ryujinx.Cpu/Jit/JitEngine.cs +++ b/src/Ryujinx.Cpu/Jit/JitEngine.cs @@ -12,9 +12,9 @@ namespace Ryujinx.Cpu.Jit } /// - public ICpuContext CreateCpuContext(IMemoryManager memoryManager, bool for64Bit) + public ICpuContext CreateCpuContext(IMemoryManager memoryManager, bool for64Bit, bool lowPower) { - return new JitCpuContext(_tickSource, memoryManager, for64Bit); + return new JitCpuContext(_tickSource, memoryManager, for64Bit, lowPower); } } } diff --git a/src/Ryujinx.Cpu/LightningJit/LightningJitCpuContext.cs b/src/Ryujinx.Cpu/LightningJit/LightningJitCpuContext.cs index 0ac9dc8b5..1a17d744b 100644 --- a/src/Ryujinx.Cpu/LightningJit/LightningJitCpuContext.cs +++ b/src/Ryujinx.Cpu/LightningJit/LightningJitCpuContext.cs @@ -11,11 +11,11 @@ namespace Ryujinx.Cpu.LightningJit private readonly Translator _translator; private readonly AddressTable _functionTable; - public LightningJitCpuContext(ITickSource tickSource, IMemoryManager memory, bool for64Bit) + public LightningJitCpuContext(ITickSource tickSource, IMemoryManager memory, bool for64Bit, bool lowPower) { _tickSource = tickSource; - _functionTable = AddressTable.CreateForArm(for64Bit, memory.Type); + _functionTable = AddressTable.CreateForArm(for64Bit, memory.Type, lowPower); _translator = new Translator(memory, _functionTable); @@ -46,7 +46,7 @@ namespace Ryujinx.Cpu.LightningJit } /// - public IDiskCacheLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled) + public IDiskCacheLoadState LoadDiskCache(string titleIdText, string displayVersion, bool enabled, string cacheSelector) { return new DummyDiskCacheLoadState(); } diff --git a/src/Ryujinx.Cpu/LightningJit/LightningJitEngine.cs b/src/Ryujinx.Cpu/LightningJit/LightningJitEngine.cs index c97ddc7c7..607e69969 100644 --- a/src/Ryujinx.Cpu/LightningJit/LightningJitEngine.cs +++ b/src/Ryujinx.Cpu/LightningJit/LightningJitEngine.cs @@ -12,9 +12,9 @@ namespace Ryujinx.Cpu.LightningJit } /// - public ICpuContext CreateCpuContext(IMemoryManager memoryManager, bool for64Bit) + public ICpuContext CreateCpuContext(IMemoryManager memoryManager, bool for64Bit, bool lowPower) { - return new LightningJitCpuContext(_tickSource, memoryManager, for64Bit); + return new LightningJitCpuContext(_tickSource, memoryManager, for64Bit, lowPower); } } } diff --git a/src/Ryujinx.HLE/HLEConfiguration.cs b/src/Ryujinx.HLE/HLEConfiguration.cs index 70fcf278d..59dcf27b4 100644 --- a/src/Ryujinx.HLE/HLEConfiguration.cs +++ b/src/Ryujinx.HLE/HLEConfiguration.cs @@ -98,6 +98,11 @@ namespace Ryujinx.HLE /// internal readonly bool EnablePtc; + /// + /// Control if the Profiled Translation Cache (PTC) should run in low power mode. + /// + internal readonly bool LowPowerPtc; + /// /// Control if the guest application should be told that there is a Internet connection available. /// @@ -198,6 +203,7 @@ namespace Ryujinx.HLE bool enableVsync, bool enableDockedMode, bool enablePtc, + bool lowPowerPtc, bool enableInternetAccess, IntegrityCheckLevel fsIntegrityCheckLevel, int fsGlobalAccessLogMode, @@ -228,6 +234,7 @@ namespace Ryujinx.HLE EnableVsync = enableVsync; EnableDockedMode = enableDockedMode; EnablePtc = enablePtc; + LowPowerPtc = lowPowerPtc; EnableInternetAccess = enableInternetAccess; FsIntegrityCheckLevel = fsIntegrityCheckLevel; FsGlobalAccessLogMode = fsGlobalAccessLogMode; diff --git a/src/Ryujinx.HLE/HOS/ArmProcessContext.cs b/src/Ryujinx.HLE/HOS/ArmProcessContext.cs index fde489ab7..f873c3deb 100644 --- a/src/Ryujinx.HLE/HOS/ArmProcessContext.cs +++ b/src/Ryujinx.HLE/HOS/ArmProcessContext.cs @@ -13,7 +13,8 @@ namespace Ryujinx.HLE.HOS string displayVersion, bool diskCacheEnabled, ulong codeAddress, - ulong codeSize); + ulong codeSize, + string cacheSelector); } class ArmProcessContext : IArmProcessContext where T : class, IVirtualMemoryManagerTracked, IMemoryManager @@ -33,7 +34,8 @@ namespace Ryujinx.HLE.HOS GpuContext gpuContext, T memoryManager, ulong addressSpaceSize, - bool for64Bit) + bool for64Bit, + bool lowPower) { if (memoryManager is IRefCounted rc) { @@ -44,7 +46,7 @@ namespace Ryujinx.HLE.HOS _pid = pid; _gpuContext = gpuContext; - _cpuContext = cpuEngine.CreateCpuContext(memoryManager, for64Bit); + _cpuContext = cpuEngine.CreateCpuContext(memoryManager, for64Bit, lowPower); _memoryManager = memoryManager; AddressSpaceSize = addressSpaceSize; @@ -67,10 +69,11 @@ namespace Ryujinx.HLE.HOS string displayVersion, bool diskCacheEnabled, ulong codeAddress, - ulong codeSize) + ulong codeSize, + string cacheSelector) { _cpuContext.PrepareCodeRange(codeAddress, codeSize); - return _cpuContext.LoadDiskCache(titleIdText, displayVersion, diskCacheEnabled); + return _cpuContext.LoadDiskCache(titleIdText, displayVersion, diskCacheEnabled, cacheSelector); } public void InvalidateCacheRegion(ulong address, ulong size) diff --git a/src/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs b/src/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs index 6646826cb..41f98768d 100644 --- a/src/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs +++ b/src/Ryujinx.HLE/HOS/ArmProcessContextFactory.cs @@ -48,12 +48,13 @@ namespace Ryujinx.HLE.HOS IArmProcessContext processContext; bool isArm64Host = RuntimeInformation.ProcessArchitecture == Architecture.Arm64; + bool isLowPower = context.Device.Configuration.LowPowerPtc; if (OperatingSystem.IsMacOS() && isArm64Host && for64Bit && context.Device.Configuration.UseHypervisor) { var cpuEngine = new HvEngine(_tickSource); var memoryManager = new HvMemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler); - processContext = new ArmProcessContext(pid, cpuEngine, _gpu, memoryManager, addressSpaceSize, for64Bit); + processContext = new ArmProcessContext(pid, cpuEngine, _gpu, memoryManager, addressSpaceSize, for64Bit, isLowPower); } else { @@ -87,7 +88,7 @@ namespace Ryujinx.HLE.HOS { case MemoryManagerMode.SoftwarePageTable: var memoryManager = new MemoryManager(context.Memory, addressSpaceSize, invalidAccessHandler); - processContext = new ArmProcessContext(pid, cpuEngine, _gpu, memoryManager, addressSpaceSize, for64Bit); + processContext = new ArmProcessContext(pid, cpuEngine, _gpu, memoryManager, addressSpaceSize, for64Bit, isLowPower); break; case MemoryManagerMode.HostMapped: @@ -95,7 +96,7 @@ namespace Ryujinx.HLE.HOS if (addressSpace == null) { var memoryManagerHostTracked = new MemoryManagerHostTracked(context.Memory, addressSpaceSize, mode == MemoryManagerMode.HostMappedUnsafe, invalidAccessHandler); - processContext = new ArmProcessContext(pid, cpuEngine, _gpu, memoryManagerHostTracked, addressSpaceSize, for64Bit); + processContext = new ArmProcessContext(pid, cpuEngine, _gpu, memoryManagerHostTracked, addressSpaceSize, for64Bit, isLowPower); } else { @@ -105,7 +106,7 @@ namespace Ryujinx.HLE.HOS } var memoryManagerHostMapped = new MemoryManagerHostMapped(addressSpace, mode == MemoryManagerMode.HostMappedUnsafe, invalidAccessHandler); - processContext = new ArmProcessContext(pid, cpuEngine, _gpu, memoryManagerHostMapped, addressSpace.AddressSpaceSize, for64Bit); + processContext = new ArmProcessContext(pid, cpuEngine, _gpu, memoryManagerHostMapped, addressSpace.AddressSpaceSize, for64Bit, isLowPower); } break; @@ -114,7 +115,7 @@ namespace Ryujinx.HLE.HOS } } - DiskCacheLoadState = processContext.Initialize(_titleIdText, _displayVersion, _diskCacheEnabled, _codeAddress, _codeSize); + DiskCacheLoadState = processContext.Initialize(_titleIdText, _displayVersion, _diskCacheEnabled, _codeAddress, _codeSize, isLowPower ? "LowPower" : "HighPower"); return processContext; } diff --git a/src/Ryujinx.Headless.SDL2/Options.cs b/src/Ryujinx.Headless.SDL2/Options.cs index 8078ca5e4..d813ade65 100644 --- a/src/Ryujinx.Headless.SDL2/Options.cs +++ b/src/Ryujinx.Headless.SDL2/Options.cs @@ -106,6 +106,9 @@ namespace Ryujinx.Headless.SDL2 [Option("disable-ptc", Required = false, HelpText = "Disables profiled persistent translation cache.")] public bool DisablePTC { get; set; } + [Option("low-power-ptc", Required = false, HelpText = "Increases PTC performance for low power systems.")] + public bool LowPowerPTC { get; set; } + [Option("enable-internet-connection", Required = false, Default = false, HelpText = "Enables guest Internet connection.")] public bool EnableInternetAccess { get; set; } diff --git a/src/Ryujinx.Headless.SDL2/Program.cs b/src/Ryujinx.Headless.SDL2/Program.cs index e3bbd1e51..67d6ab4eb 100644 --- a/src/Ryujinx.Headless.SDL2/Program.cs +++ b/src/Ryujinx.Headless.SDL2/Program.cs @@ -566,6 +566,7 @@ namespace Ryujinx.Headless.SDL2 !options.DisableVSync, !options.DisableDockedMode, !options.DisablePTC, + options.LowPowerPTC, options.EnableInternetAccess, !options.DisableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, options.FsGlobalAccessLogMode, diff --git a/src/Ryujinx.Tests/Cpu/CpuContext.cs b/src/Ryujinx.Tests/Cpu/CpuContext.cs index 81e8ba8c9..b896ea53f 100644 --- a/src/Ryujinx.Tests/Cpu/CpuContext.cs +++ b/src/Ryujinx.Tests/Cpu/CpuContext.cs @@ -11,9 +11,9 @@ namespace Ryujinx.Tests.Cpu { private readonly Translator _translator; - public CpuContext(IMemoryManager memory, bool for64Bit) + public CpuContext(IMemoryManager memory, bool for64Bit, bool lowPower) { - _translator = new Translator(new JitMemoryAllocator(), memory, AddressTable.CreateForArm(for64Bit, memory.Type)); + _translator = new Translator(new JitMemoryAllocator(), memory, AddressTable.CreateForArm(for64Bit, memory.Type, lowPower)); memory.UnmapEvent += UnmapHandler; } diff --git a/src/Ryujinx.Tests/Cpu/CpuTest.cs b/src/Ryujinx.Tests/Cpu/CpuTest.cs index da0f03e6b..193966782 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTest.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTest.cs @@ -62,7 +62,7 @@ namespace Ryujinx.Tests.Cpu _context = CpuContext.CreateExecutionContext(); - _cpuContext = new CpuContext(_memory, for64Bit: true); + _cpuContext = new CpuContext(_memory, for64Bit: true, lowPower: false); // Prevent registering LCQ functions in the FunctionTable to avoid initializing and populating the table, // which improves test durations. diff --git a/src/Ryujinx.Tests/Cpu/CpuTest32.cs b/src/Ryujinx.Tests/Cpu/CpuTest32.cs index 6a690834f..ac059a3ac 100644 --- a/src/Ryujinx.Tests/Cpu/CpuTest32.cs +++ b/src/Ryujinx.Tests/Cpu/CpuTest32.cs @@ -57,7 +57,7 @@ namespace Ryujinx.Tests.Cpu _context = CpuContext.CreateExecutionContext(); _context.IsAarch32 = true; - _cpuContext = new CpuContext(_memory, for64Bit: false); + _cpuContext = new CpuContext(_memory, for64Bit: false, lowPower: false); // Prevent registering LCQ functions in the FunctionTable to avoid initializing and populating the table, // which improves test durations. diff --git a/src/Ryujinx.Tests/Cpu/EnvironmentTests.cs b/src/Ryujinx.Tests/Cpu/EnvironmentTests.cs index 43c84c193..0e8b93b65 100644 --- a/src/Ryujinx.Tests/Cpu/EnvironmentTests.cs +++ b/src/Ryujinx.Tests/Cpu/EnvironmentTests.cs @@ -22,7 +22,7 @@ namespace Ryujinx.Tests.Cpu _translator ??= new Translator( new JitMemoryAllocator(), new MockMemoryManager(), - AddressTable.CreateForArm(true, MemoryManagerType.SoftwarePageTable)); + AddressTable.CreateForArm(true, MemoryManagerType.SoftwarePageTable, lowPower: false)); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] diff --git a/src/Ryujinx.Tests/Memory/PartialUnmaps.cs b/src/Ryujinx.Tests/Memory/PartialUnmaps.cs index 3e5b47423..51df00a8d 100644 --- a/src/Ryujinx.Tests/Memory/PartialUnmaps.cs +++ b/src/Ryujinx.Tests/Memory/PartialUnmaps.cs @@ -58,7 +58,7 @@ namespace Ryujinx.Tests.Memory _translator ??= new Translator( new JitMemoryAllocator(), new MockMemoryManager(), - AddressTable.CreateForArm(true, MemoryManagerType.SoftwarePageTable)); + AddressTable.CreateForArm(true, MemoryManagerType.SoftwarePageTable, lowPower: false)); } [Test] diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index 7246be4b9..590a86c40 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -871,6 +871,7 @@ namespace Ryujinx.Ava ConfigurationState.Instance.Graphics.EnableVsync, ConfigurationState.Instance.System.EnableDockedMode, ConfigurationState.Instance.System.EnablePtc, + ConfigurationState.Instance.System.EnableLowPowerPtc, ConfigurationState.Instance.System.EnableInternetAccess, ConfigurationState.Instance.System.EnableFsIntegrityChecks ? IntegrityCheckLevel.ErrorOnInvalid : IntegrityCheckLevel.None, ConfigurationState.Instance.System.FsGlobalAccessLogMode,