diff --git a/src/Ryujinx.Common/Configuration/Hid/KeyboardHotkeys.cs b/src/Ryujinx.Common/Configuration/Hid/KeyboardHotkeys.cs index e9c163cf2..8d4dd7518 100644 --- a/src/Ryujinx.Common/Configuration/Hid/KeyboardHotkeys.cs +++ b/src/Ryujinx.Common/Configuration/Hid/KeyboardHotkeys.cs @@ -13,5 +13,6 @@ namespace Ryujinx.Common.Configuration.Hid public Key ResScaleDown { get; set; } public Key VolumeUp { get; set; } public Key VolumeDown { get; set; } + public Key ToggleTurbo { get; set; } } } diff --git a/src/Ryujinx.Cpu/TickSource.cs b/src/Ryujinx.Cpu/TickSource.cs index eee83fc62..a23e66496 100644 --- a/src/Ryujinx.Cpu/TickSource.cs +++ b/src/Ryujinx.Cpu/TickSource.cs @@ -15,11 +15,25 @@ namespace Ryujinx.Cpu /// public ulong Counter => (ulong)(ElapsedSeconds * Frequency); - /// - public TimeSpan ElapsedTime => _tickCounter.Elapsed; + public static long s_tickMultiplier = 100; + private static long AcumElapsedTicks = 0; + private static long LastElapsedTicks = 0; + private long Elapsedticks + { + get + { + long ElapsedTicks = _tickCounter.ElapsedTicks; + AcumElapsedTicks += (ElapsedTicks - LastElapsedTicks) * s_tickMultiplier / 100; + LastElapsedTicks = ElapsedTicks; + return AcumElapsedTicks; + } + } /// - public double ElapsedSeconds => _tickCounter.ElapsedTicks * _hostTickFreq; + public TimeSpan ElapsedTime => Stopwatch.GetElapsedTime(0, Elapsedticks); + + /// + public double ElapsedSeconds => Elapsedticks * _hostTickFreq; public TickSource(ulong frequency) { diff --git a/src/Ryujinx.Gtk3/UI/MainWindow.cs b/src/Ryujinx.Gtk3/UI/MainWindow.cs index d1ca6ce6a..ba0b7397e 100644 --- a/src/Ryujinx.Gtk3/UI/MainWindow.cs +++ b/src/Ryujinx.Gtk3/UI/MainWindow.cs @@ -669,7 +669,8 @@ namespace Ryujinx.UI ConfigurationState.Instance.System.AudioVolume, ConfigurationState.Instance.System.UseHypervisor, ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value, - ConfigurationState.Instance.Multiplayer.Mode); + ConfigurationState.Instance.Multiplayer.Mode, + ConfigurationState.Instance.System.TurboMultiplier); _emulationContext = new HLE.Switch(configuration); } diff --git a/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs b/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs index 0e636792d..fdb066ef0 100644 --- a/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs +++ b/src/Ryujinx.Gtk3/UI/RendererWidgetBase.cs @@ -497,7 +497,8 @@ namespace Ryujinx.UI _gpuBackendName, dockedMode, ConfigurationState.Instance.Graphics.AspectRatio.Value.ToText(), - $"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", + $"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)" + + (Device.TurboMode ? $" Turbo ({Device.Configuration.TurboMultiplier}%)" : ""), $"FIFO: {Device.Statistics.GetFifoPercent():0.00} %", $"GPU: {_gpuDriverName}")); diff --git a/src/Ryujinx.HLE/HLEConfiguration.cs b/src/Ryujinx.HLE/HLEConfiguration.cs index 955fee4b5..73eb2b3e7 100644 --- a/src/Ryujinx.HLE/HLEConfiguration.cs +++ b/src/Ryujinx.HLE/HLEConfiguration.cs @@ -83,6 +83,11 @@ namespace Ryujinx.HLE /// This cannot be changed after instantiation. internal readonly RegionCode Region; + /// + /// Turbo mode speed multiplier + /// + public long TurboMultiplier; + /// /// Control the initial state of the vertical sync in the SurfaceFlinger service. /// @@ -194,7 +199,8 @@ namespace Ryujinx.HLE float audioVolume, bool useHypervisor, string multiplayerLanInterfaceId, - MultiplayerMode multiplayerMode) + MultiplayerMode multiplayerMode, + long turboMultiplier) { VirtualFileSystem = virtualFileSystem; LibHacHorizonManager = libHacHorizonManager; @@ -207,6 +213,7 @@ namespace Ryujinx.HLE HostUIHandler = hostUIHandler; SystemLanguage = systemLanguage; Region = region; + TurboMultiplier = turboMultiplier; EnableVsync = enableVsync; EnableDockedMode = enableDockedMode; EnablePtc = enablePtc; diff --git a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs index fd517b1ae..475494c6a 100644 --- a/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs +++ b/src/Ryujinx.HLE/HOS/Services/SurfaceFlinger/SurfaceFlinger.cs @@ -2,6 +2,7 @@ using Ryujinx.Common; using Ryujinx.Common.Configuration; using Ryujinx.Common.Logging; using Ryujinx.Common.PreciseSleep; +using Ryujinx.Cpu; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Gpu; using Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvMap; @@ -88,7 +89,7 @@ namespace Ryujinx.HLE.HOS.Services.SurfaceFlinger } else { - _ticksPerFrame = Stopwatch.Frequency / TargetFps; + _ticksPerFrame = (Stopwatch.Frequency / TargetFps * 100) / TickSource.s_tickMultiplier; } } diff --git a/src/Ryujinx.HLE/Switch.cs b/src/Ryujinx.HLE/Switch.cs index 81c3ab473..413447533 100644 --- a/src/Ryujinx.HLE/Switch.cs +++ b/src/Ryujinx.HLE/Switch.cs @@ -28,6 +28,7 @@ namespace Ryujinx.HLE public IHostUIHandler UIHandler { get; } public bool EnableDeviceVsync { get; set; } = true; + public bool TurboMode { get; set; } = false; public bool IsFrameAvailable => Gpu.Window.IsFrameAvailable; diff --git a/src/Ryujinx.Headless.SDL2/Options.cs b/src/Ryujinx.Headless.SDL2/Options.cs index ea2063758..190302769 100644 --- a/src/Ryujinx.Headless.SDL2/Options.cs +++ b/src/Ryujinx.Headless.SDL2/Options.cs @@ -114,6 +114,9 @@ namespace Ryujinx.Headless.SDL2 [Option("fs-global-access-log-mode", Required = false, Default = 0, HelpText = "Enables FS access log output to the console.")] public int FsGlobalAccessLogMode { get; set; } + [Option("turbo-multiplier", Required = false, Default = 200, HelpText = "The Turbo mode clock speed multiplier.")] + public long TurboMultiplier { get; set; } + [Option("disable-vsync", Required = false, HelpText = "Disables Vertical Sync.")] public bool DisableVSync { get; set; } diff --git a/src/Ryujinx.Headless.SDL2/Program.cs b/src/Ryujinx.Headless.SDL2/Program.cs index 85aff6712..59a91525b 100644 --- a/src/Ryujinx.Headless.SDL2/Program.cs +++ b/src/Ryujinx.Headless.SDL2/Program.cs @@ -571,7 +571,8 @@ namespace Ryujinx.Headless.SDL2 options.AudioVolume, options.UseHypervisor ?? true, options.MultiplayerLanInterfaceId, - Common.Configuration.Multiplayer.MultiplayerMode.Disabled); + Common.Configuration.Multiplayer.MultiplayerMode.Disabled, + options.TurboMultiplier); return new Switch(configuration); } diff --git a/src/Ryujinx.Headless.SDL2/WindowBase.cs b/src/Ryujinx.Headless.SDL2/WindowBase.cs index 8768913f5..3d40a0452 100644 --- a/src/Ryujinx.Headless.SDL2/WindowBase.cs +++ b/src/Ryujinx.Headless.SDL2/WindowBase.cs @@ -312,7 +312,8 @@ namespace Ryujinx.Headless.SDL2 Device.EnableDeviceVsync, dockedMode, Device.Configuration.AspectRatio.ToText(), - $"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", + $"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)" + + (Device.TurboMode ? $" Turbo ({Device.Configuration.TurboMultiplier}%)" : ""), $"FIFO: {Device.Statistics.GetFifoPercent():0.00} %", $"GPU: {_gpuDriverName}")); diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs b/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs index 0f6c21ef2..7530a2c3b 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs +++ b/src/Ryujinx.UI.Common/Configuration/ConfigurationFileFormat.cs @@ -15,7 +15,7 @@ namespace Ryujinx.UI.Common.Configuration /// /// The current version of the file format /// - public const int CurrentVersion = 49; + public const int CurrentVersion = 50; /// /// Version of the configuration file format @@ -167,6 +167,11 @@ namespace Ryujinx.UI.Common.Configuration /// public HideCursorMode HideCursor { get; set; } + /// + /// Clock speed multiplier for Turbo mode + /// + public long TurboMultiplier { get; set; } + /// /// Enables or disables Vertical Sync /// diff --git a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs b/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs index b7f36087c..e2a8b319a 100644 --- a/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs +++ b/src/Ryujinx.UI.Common/Configuration/ConfigurationState.cs @@ -365,6 +365,11 @@ namespace Ryujinx.UI.Common.Configuration /// public ReactiveObject UseHypervisor { get; private set; } + /// + /// Turbo mode clock speed multiplier + /// + public ReactiveObject TurboMultiplier { get; private set; } + public SystemSection() { Language = new ReactiveObject(); @@ -393,6 +398,8 @@ namespace Ryujinx.UI.Common.Configuration AudioVolume.Event += static (sender, e) => LogValueChange(e, nameof(AudioVolume)); UseHypervisor = new ReactiveObject(); UseHypervisor.Event += static (sender, e) => LogValueChange(e, nameof(UseHypervisor)); + TurboMultiplier = new ReactiveObject(); + TurboMultiplier.Event += static (sender, e) => LogValueChange(e, nameof(TurboMultiplier)); } } @@ -675,6 +682,7 @@ namespace Ryujinx.UI.Common.Configuration SystemTimeZone = System.TimeZone, SystemTimeOffset = System.SystemTimeOffset, DockedMode = System.EnableDockedMode, + TurboMultiplier = System.TurboMultiplier, EnableDiscordIntegration = EnableDiscordIntegration, CheckUpdatesOnStart = CheckUpdatesOnStart, ShowConfirmExit = ShowConfirmExit, @@ -782,6 +790,7 @@ namespace Ryujinx.UI.Common.Configuration System.TimeZone.Value = "UTC"; System.SystemTimeOffset.Value = 0; System.EnableDockedMode.Value = true; + System.TurboMultiplier.Value = 200; EnableDiscordIntegration.Value = true; CheckUpdatesOnStart.Value = true; ShowConfirmExit.Value = true; @@ -854,6 +863,7 @@ namespace Ryujinx.UI.Common.Configuration ResScaleDown = Key.Unbound, VolumeUp = Key.Unbound, VolumeDown = Key.Unbound, + ToggleTurbo = Key.F3, }; Hid.InputConfig.Value = new List { @@ -1442,6 +1452,29 @@ namespace Ryujinx.UI.Common.Configuration configurationFileUpdated = true; } + if (configurationFileFormat.Version < 50) + { + Ryujinx.Common.Logging.Logger.Warning?.Print(LogClass.Application, $"Outdated configuration version {configurationFileFormat.Version}, migrating to version 50."); + + configurationFileFormat.TurboMultiplier = 200; + + configurationFileFormat.Hotkeys = new KeyboardHotkeys + { + ToggleTurbo = Key.F3, + Screenshot = configurationFileFormat.Hotkeys.Screenshot, + ShowUI = configurationFileFormat.Hotkeys.ShowUI, + Pause = configurationFileFormat.Hotkeys.Pause, + ToggleMute = configurationFileFormat.Hotkeys.ToggleMute, + ResScaleUp = configurationFileFormat.Hotkeys.ResScaleUp, + ResScaleDown = configurationFileFormat.Hotkeys.ResScaleDown, + VolumeUp = configurationFileFormat.Hotkeys.VolumeUp, + VolumeDown = configurationFileFormat.Hotkeys.VolumeDown, + ToggleVsync = configurationFileFormat.Hotkeys.ToggleVsync, + }; + + configurationFileUpdated = true; + } + Logger.EnableFileLog.Value = configurationFileFormat.EnableFileLog; Graphics.ResScale.Value = configurationFileFormat.ResScale; Graphics.ResScaleCustom.Value = configurationFileFormat.ResScaleCustom; @@ -1469,6 +1502,7 @@ namespace Ryujinx.UI.Common.Configuration System.TimeZone.Value = configurationFileFormat.SystemTimeZone; System.SystemTimeOffset.Value = configurationFileFormat.SystemTimeOffset; System.EnableDockedMode.Value = configurationFileFormat.DockedMode; + System.TurboMultiplier.Value = configurationFileFormat.TurboMultiplier; EnableDiscordIntegration.Value = configurationFileFormat.EnableDiscordIntegration; CheckUpdatesOnStart.Value = configurationFileFormat.CheckUpdatesOnStart; ShowConfirmExit.Value = configurationFileFormat.ShowConfirmExit; diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index 2620ea68c..57d87ff6e 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -23,6 +23,7 @@ using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Common.Logging; using Ryujinx.Common.SystemInterop; using Ryujinx.Common.Utilities; +using Ryujinx.Cpu; using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL.Multithreading; using Ryujinx.Graphics.Gpu; @@ -795,7 +796,8 @@ namespace Ryujinx.Ava ConfigurationState.Instance.System.AudioVolume, ConfigurationState.Instance.System.UseHypervisor, ConfigurationState.Instance.Multiplayer.LanInterfaceId.Value, - ConfigurationState.Instance.Multiplayer.Mode); + ConfigurationState.Instance.Multiplayer.Mode, + ConfigurationState.Instance.System.TurboMultiplier); Device = new Switch(configuration); } @@ -980,7 +982,8 @@ namespace Ryujinx.Ava ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.Vulkan ? "Vulkan" : "OpenGL", dockedMode, ConfigurationState.Instance.Graphics.AspectRatio.Value.ToText(), - LocaleManager.Instance[LocaleKeys.Game] + $": {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)", + LocaleManager.Instance[LocaleKeys.Game] + $": {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)" + + (Device.TurboMode ? $" Turbo ({Device.Configuration.TurboMultiplier}%)" : ""), $"FIFO: {Device.Statistics.GetFifoPercent():00.00} %", $"GPU: {_renderer.GetHardwareInfo().GpuDriver}")); } @@ -1065,6 +1068,12 @@ namespace Ryujinx.Ava if (currentHotkeyState != _prevHotkeyState) { + if (_keyboardInterface.IsPressed((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.ToggleTurbo) != Device.TurboMode) + { + Device.TurboMode = !Device.TurboMode; + long turboMultiplier = Device.TurboMode ? Device.Configuration.TurboMultiplier : 100; + TickSource.s_tickMultiplier = turboMultiplier; + } switch (currentHotkeyState) { case KeyboardHotkeyState.ToggleVSync: @@ -1077,6 +1086,8 @@ namespace Ryujinx.Ava case KeyboardHotkeyState.ShowUI: _viewModel.ShowMenuAndStatusBar = !_viewModel.ShowMenuAndStatusBar; break; + case KeyboardHotkeyState.ToggleTurbo: + break; case KeyboardHotkeyState.Pause: if (_viewModel.IsPaused) { @@ -1192,6 +1203,10 @@ namespace Ryujinx.Ava { state = KeyboardHotkeyState.VolumeDown; } + else if (_keyboardInterface.IsPressed((Key)ConfigurationState.Instance.Hid.Hotkeys.Value.ToggleTurbo)) + { + state = KeyboardHotkeyState.ToggleTurbo; + } return state; } diff --git a/src/Ryujinx/Assets/Locales/en_US.json b/src/Ryujinx/Assets/Locales/en_US.json index 3a3cb3017..d5adf474c 100644 --- a/src/Ryujinx/Assets/Locales/en_US.json +++ b/src/Ryujinx/Assets/Locales/en_US.json @@ -129,6 +129,9 @@ "SettingsTabSystemSystemLanguageTraditionalChinese": "Traditional Chinese", "SettingsTabSystemSystemTimeZone": "System TimeZone:", "SettingsTabSystemSystemTime": "System Time:", + "SettingsTabSystemTurboMultiplierValue": "Turbo multiplier:", + "SettingsTabSystemTurboMultiplierSliderTooltip": "The Turbo mode multiplier target value.", + "SettingsTabSystemTurboMultiplierValueTooltip": "The Turbo mode multiplier, as a percentage of the normal Switch clock speed.", "SettingsTabSystemEnableVsync": "VSync", "SettingsTabSystemEnablePptc": "PPTC (Profiled Persistent Translation Cache)", "SettingsTabSystemEnableFsIntegrityChecks": "FS Integrity Checks", @@ -627,6 +630,7 @@ "RyujinxUpdaterMessage": "Do you want to update Ryujinx to the latest version?", "SettingsTabHotkeysVolumeUpHotkey": "Increase Volume:", "SettingsTabHotkeysVolumeDownHotkey": "Decrease Volume:", + "SettingsTabHotkeysToggleTurboHotkey": "Toggle turbo mode", "SettingsEnableMacroHLE": "Enable Macro HLE", "SettingsEnableMacroHLETooltip": "High-level emulation of GPU Macro code.\n\nImproves performance, but may cause graphical glitches in some games.\n\nLeave ON if unsure.", "SettingsEnableColorSpacePassthrough": "Color Space Passthrough", diff --git a/src/Ryujinx/Common/KeyboardHotkeyState.cs b/src/Ryujinx/Common/KeyboardHotkeyState.cs index 6e4920988..ea86f6a36 100644 --- a/src/Ryujinx/Common/KeyboardHotkeyState.cs +++ b/src/Ryujinx/Common/KeyboardHotkeyState.cs @@ -12,5 +12,6 @@ namespace Ryujinx.Ava.Common ResScaleDown, VolumeUp, VolumeDown, + ToggleTurbo, } } diff --git a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs index fde8f74ae..b3e96b930 100644 --- a/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs +++ b/src/Ryujinx/UI/ViewModels/SettingsViewModel.cs @@ -13,6 +13,7 @@ using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Configuration.Multiplayer; using Ryujinx.Common.GraphicsDriver; using Ryujinx.Common.Logging; +using Ryujinx.Cpu; using Ryujinx.Graphics.Vulkan; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS.Services.Time.TimeZone; @@ -50,6 +51,7 @@ namespace Ryujinx.Ava.UI.ViewModels private int _graphicsBackendIndex; private int _scalingFilter; private int _scalingFilterLevel; + private long _turboModeMultiplier; public event Action CloseWindow; public event Action SaveSettingsEvent; @@ -135,6 +137,26 @@ namespace Ryujinx.Ava.UI.ViewModels public int HideCursor { get; set; } public bool EnableDockedMode { get; set; } public bool EnableKeyboard { get; set; } + public long TurboMultiplier + { + get => _turboModeMultiplier; + set + { + if (_turboModeMultiplier != value) + { + _turboModeMultiplier = value; + OnPropertyChanged(); + OnPropertyChanged((nameof(TurboMultiplierPercentageText))); + } + } + } + public string TurboMultiplierPercentageText + { + get + { + return TurboMultiplier.ToString() + "%"; + } + } public bool EnableMouse { get; set; } public bool EnableVsync { get; set; } public bool EnablePptc { get; set; } @@ -434,6 +456,7 @@ namespace Ryujinx.Ava.UI.ViewModels EnablePptc = config.System.EnablePtc; MemoryMode = (int)config.System.MemoryManagerMode.Value; UseHypervisor = config.System.UseHypervisor; + _turboModeMultiplier = config.System.TurboMultiplier; // Graphics GraphicsBackendIndex = (int)config.Graphics.GraphicsBackend.Value; @@ -512,6 +535,7 @@ namespace Ryujinx.Ava.UI.ViewModels } config.System.SystemTimeOffset.Value = Convert.ToInt64((CurrentDate.ToUnixTimeSeconds() + CurrentTime.TotalSeconds) - DateTimeOffset.Now.ToUnixTimeSeconds()); + config.System.TurboMultiplier.Value = TurboMultiplier; config.Graphics.EnableVsync.Value = EnableVsync; config.System.EnableFsIntegrityChecks.Value = EnableFsIntegrityChecks; config.System.ExpandRam.Value = ExpandDramSize; @@ -578,6 +602,7 @@ namespace Ryujinx.Ava.UI.ViewModels config.ToFileFormat().SaveConfig(Program.ConfigurationPath); MainWindow.UpdateGraphicsConfig(); + MainWindow.UpdateTurboConfig(TurboMultiplier); SaveSettingsEvent?.Invoke(); diff --git a/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml index b4eae01ef..4bdf00651 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsHotkeysView.axaml @@ -1,4 +1,4 @@ - + + + + + + - \ No newline at end of file + diff --git a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml index e6f7c6e46..96d49b78a 100644 --- a/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml +++ b/src/Ryujinx/UI/Views/Settings/SettingsSystemView.axaml @@ -1,9 +1,10 @@ - + + + + + + - \ No newline at end of file + diff --git a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs index 33a9af5b6..ac77f02ef 100644 --- a/src/Ryujinx/UI/Windows/MainWindow.axaml.cs +++ b/src/Ryujinx/UI/Windows/MainWindow.axaml.cs @@ -11,6 +11,7 @@ using Ryujinx.Ava.UI.Applet; using Ryujinx.Ava.UI.Helpers; using Ryujinx.Ava.UI.ViewModels; using Ryujinx.Common.Logging; +using Ryujinx.Cpu; using Ryujinx.Graphics.Gpu; using Ryujinx.HLE.FileSystem; using Ryujinx.HLE.HOS; @@ -407,6 +408,15 @@ namespace Ryujinx.Ava.UI.Windows } } + public static void UpdateTurboConfig(long turboMultiplier) + { + MainWindow.MainWindowViewModel.AppHost.Device.Configuration.TurboMultiplier = turboMultiplier; + if (MainWindow.MainWindowViewModel.AppHost.Device.TurboMode) + { + TickSource.s_tickMultiplier = turboMultiplier; + } + } + public static void UpdateGraphicsConfig() { #pragma warning disable IDE0055 // Disable formatting