aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Headless.SDL2/WindowBase.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Headless.SDL2/WindowBase.cs')
-rw-r--r--Ryujinx.Headless.SDL2/WindowBase.cs100
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();
}