diff options
Diffstat (limited to 'Ryujinx.Headless.SDL2/WindowBase.cs')
-rw-r--r-- | Ryujinx.Headless.SDL2/WindowBase.cs | 100 |
1 files changed, 58 insertions, 42 deletions
diff --git a/Ryujinx.Headless.SDL2/WindowBase.cs b/Ryujinx.Headless.SDL2/WindowBase.cs index 7f574e97..6297e64e 100644 --- a/Ryujinx.Headless.SDL2/WindowBase.cs +++ b/Ryujinx.Headless.SDL2/WindowBase.cs @@ -3,6 +3,7 @@ using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration.Hid; using Ryujinx.Common.Logging; using Ryujinx.Graphics.GAL; +using Ryujinx.Graphics.GAL.Multithreading; using Ryujinx.HLE; using Ryujinx.HLE.HOS.Applets; using Ryujinx.HLE.HOS.Services.Am.AppletOE.ApplicationProxyService.ApplicationProxy.Types; @@ -73,7 +74,15 @@ namespace Ryujinx.Headless.SDL2 public void Initialize(Switch device, List<InputConfig> inputConfigs, bool enableKeyboard, bool enableMouse) { Device = device; - Renderer = Device.Gpu.Renderer; + + IRenderer renderer = Device.Gpu.Renderer; + + if (renderer is ThreadedRenderer tr) + { + renderer = tr.BaseRenderer; + } + + Renderer = renderer; NpadManager.Initialize(device, inputConfigs, enableKeyboard, enableMouse); TouchScreenManager.Initialize(device); @@ -148,52 +157,55 @@ namespace Ryujinx.Headless.SDL2 _gpuVendorName = GetGpuVendorName(); - Device.Gpu.InitializeShaderCache(); - Translator.IsReadyForTranslation.Set(); - - while (_isActive) + Device.Gpu.Renderer.RunLoop(() => { - if (_isStopped) - { - return; - } - - _ticks += _chrono.ElapsedTicks; - - _chrono.Restart(); + Device.Gpu.InitializeShaderCache(); + Translator.IsReadyForTranslation.Set(); - if (Device.WaitFifo()) + while (_isActive) { - Device.Statistics.RecordFifoStart(); - Device.ProcessFrame(); - Device.Statistics.RecordFifoEnd(); - } + if (_isStopped) + { + return; + } - while (Device.ConsumeFrameAvailable()) - { - Device.PresentFrame(SwapBuffers); - } + _ticks += _chrono.ElapsedTicks; - if (_ticks >= _ticksPerFrame) - { - string dockedMode = Device.System.State.DockedMode ? "Docked" : "Handheld"; - float scale = Graphics.Gpu.GraphicsConfig.ResScale; - if (scale != 1) + _chrono.Restart(); + + if (Device.WaitFifo()) { - dockedMode += $" ({scale}x)"; + Device.Statistics.RecordFifoStart(); + Device.ProcessFrame(); + Device.Statistics.RecordFifoEnd(); } - StatusUpdatedEvent?.Invoke(this, new StatusUpdatedEventArgs( - Device.EnableDeviceVsync, - dockedMode, - Device.Configuration.AspectRatio.ToText(), - $"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS", - $"FIFO: {Device.Statistics.GetFifoPercent():0.00} %", - $"GPU: {_gpuVendorName}")); + while (Device.ConsumeFrameAvailable()) + { + Device.PresentFrame(SwapBuffers); + } - _ticks = Math.Min(_ticks - _ticksPerFrame, _ticksPerFrame); + if (_ticks >= _ticksPerFrame) + { + string dockedMode = Device.System.State.DockedMode ? "Docked" : "Handheld"; + float scale = Graphics.Gpu.GraphicsConfig.ResScale; + if (scale != 1) + { + dockedMode += $" ({scale}x)"; + } + + StatusUpdatedEvent?.Invoke(this, new StatusUpdatedEventArgs( + Device.EnableDeviceVsync, + dockedMode, + Device.Configuration.AspectRatio.ToText(), + $"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS", + $"FIFO: {Device.Statistics.GetFifoPercent():0.00} %", + $"GPU: {_gpuVendorName}")); + + _ticks = Math.Min(_ticks - _ticksPerFrame, _ticksPerFrame); + } } - } + }); FinalizeRenderer(); } @@ -295,16 +307,20 @@ namespace Ryujinx.Headless.SDL2 }; renderLoopThread.Start(); - Thread nvStutterWorkaround = new Thread(NVStutterWorkaround) + Thread nvStutterWorkaround = null; + if (Renderer is Graphics.OpenGL.Renderer) { - Name = "GUI.NVStutterWorkaround" - }; - nvStutterWorkaround.Start(); + nvStutterWorkaround = new Thread(NVStutterWorkaround) + { + Name = "GUI.NVStutterWorkaround" + }; + nvStutterWorkaround.Start(); + } MainLoop(); renderLoopThread.Join(); - nvStutterWorkaround.Join(); + nvStutterWorkaround?.Join(); Exit(); } |