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.cs34
1 files changed, 26 insertions, 8 deletions
diff --git a/Ryujinx.Headless.SDL2/WindowBase.cs b/Ryujinx.Headless.SDL2/WindowBase.cs
index 9aa17936..88b0d573 100644
--- a/Ryujinx.Headless.SDL2/WindowBase.cs
+++ b/Ryujinx.Headless.SDL2/WindowBase.cs
@@ -11,6 +11,7 @@ using Ryujinx.Input;
using Ryujinx.Input.HLE;
using Ryujinx.SDL2.Common;
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
@@ -26,6 +27,13 @@ namespace Ryujinx.Headless.SDL2
private const SDL_WindowFlags DefaultFlags = SDL_WindowFlags.SDL_WINDOW_ALLOW_HIGHDPI | SDL_WindowFlags.SDL_WINDOW_RESIZABLE | SDL_WindowFlags.SDL_WINDOW_INPUT_FOCUS | SDL_WindowFlags.SDL_WINDOW_SHOWN;
private const int TargetFps = 60;
+ private static ConcurrentQueue<Action> MainThreadActions = new ConcurrentQueue<Action>();
+
+ public static void QueueMainThreadAction(Action action)
+ {
+ MainThreadActions.Enqueue(action);
+ }
+
public NpadManager NpadManager { get; }
public TouchScreenManager TouchScreenManager { get; }
public Switch Device { get; private set; }
@@ -168,6 +176,14 @@ namespace Ryujinx.Headless.SDL2
public void Render()
{
+ InitializeWindowRenderer();
+
+ Device.Gpu.Renderer.Initialize(_glLogLevel);
+
+ InitializeRenderer();
+
+ _gpuVendorName = GetGpuVendorName();
+
Device.Gpu.Renderer.RunLoop(() =>
{
Device.Gpu.SetGpuThread();
@@ -241,6 +257,14 @@ namespace Ryujinx.Headless.SDL2
_exitEvent.Dispose();
}
+ public void ProcessMainThreadQueue()
+ {
+ while (MainThreadActions.TryDequeue(out Action action))
+ {
+ action();
+ }
+ }
+
public void MainLoop()
{
while (_isActive)
@@ -249,6 +273,8 @@ namespace Ryujinx.Headless.SDL2
SDL_PumpEvents();
+ ProcessMainThreadQueue();
+
// Polling becomes expensive if it's not slept
Thread.Sleep(1);
}
@@ -315,14 +341,6 @@ namespace Ryujinx.Headless.SDL2
InitializeWindow();
- InitializeWindowRenderer();
-
- Device.Gpu.Renderer.Initialize(_glLogLevel);
-
- InitializeRenderer();
-
- _gpuVendorName = GetGpuVendorName();
-
Thread renderLoopThread = new Thread(Render)
{
Name = "GUI.RenderLoop"