aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThog <me@thog.eu>2020-02-14 11:52:34 +0100
committerGitHub <noreply@github.com>2020-02-14 11:52:34 +0100
commitdbe3f938c7be920ff40761bb03ff2f385f0327d2 (patch)
treea7612a77c1e38df8b5daad6449555a5712f9948d
parent949bb81a9e7ef7d582ac06edabb3bc2613eb7698 (diff)
Remove ScopedGlContext (#933)
As MakeCurrent can be slow to execute, this PR changes GLRenderer to not have to reexecute MakeCurrent when processing frames.
-rw-r--r--Ryujinx/Ui/GLRenderer.cs73
-rw-r--r--Ryujinx/Ui/ScopedGlContext.cs35
2 files changed, 33 insertions, 75 deletions
diff --git a/Ryujinx/Ui/GLRenderer.cs b/Ryujinx/Ui/GLRenderer.cs
index 737a1fdd..6feb3ed4 100644
--- a/Ryujinx/Ui/GLRenderer.cs
+++ b/Ryujinx/Ui/GLRenderer.cs
@@ -84,7 +84,7 @@ namespace Ryujinx.Ui
private void GLRenderer_ShuttingDown(object sender, EventArgs args)
{
- Exit();
+ _device.DisposeGpu();
}
private void Parent_FocusOutEvent(object o, Gtk.FocusOutEventArgs args)
@@ -146,7 +146,7 @@ namespace Ryujinx.Ui
private void GLRenderer_Initialized(object sender, EventArgs e)
{
- // Release the GL exclusivity that OpenTK gave us.
+ // Release the GL exclusivity that OpenTK gave us as we aren't going to use it in GTK Thread.
GraphicsContext.MakeCurrent(null);
WaitEvent.Set();
@@ -234,14 +234,7 @@ namespace Ryujinx.Ui
}
IsStopped = true;
- IsActive = false;
-
- using (ScopedGlContext scopedGLContext = new ScopedGlContext(WindowInfo, GraphicsContext))
- {
- _device.DisposeGpu();
- }
-
- WaitEvent.Set();
+ IsActive = false;
}
public void Initialize()
@@ -256,12 +249,15 @@ namespace Ryujinx.Ui
public void Render()
{
- using (ScopedGlContext scopedGLContext = new ScopedGlContext(WindowInfo, GraphicsContext))
- {
- _renderer.Initialize();
+ // First take exclusivity on the OpenGL context.
+ GraphicsContext.MakeCurrent(WindowInfo);
- SwapBuffers();
- }
+ _renderer.Initialize();
+
+ // Make sure the first frame is not transparent.
+ GL.ClearColor(OpenTK.Color.Black);
+ GL.Clear(ClearBufferMask.ColorBufferBit);
+ SwapBuffers();
while (IsActive)
{
@@ -270,43 +266,40 @@ namespace Ryujinx.Ui
return;
}
- using (ScopedGlContext scopedGLContext = new ScopedGlContext(WindowInfo, GraphicsContext))
- {
- _ticks += _chrono.ElapsedTicks;
+ _ticks += _chrono.ElapsedTicks;
- _chrono.Restart();
+ _chrono.Restart();
- if (_device.WaitFifo())
- {
- _device.ProcessFrame();
- }
+ if (_device.WaitFifo())
+ {
+ _device.ProcessFrame();
+ }
- if (_ticks >= _ticksPerFrame)
- {
- _device.PresentFrame(SwapBuffers);
+ if (_ticks >= _ticksPerFrame)
+ {
+ _device.PresentFrame(SwapBuffers);
- _device.Statistics.RecordSystemFrameTime();
+ _device.Statistics.RecordSystemFrameTime();
- double hostFps = _device.Statistics.GetSystemFrameRate();
- double gameFps = _device.Statistics.GetGameFrameRate();
+ double hostFps = _device.Statistics.GetSystemFrameRate();
+ double gameFps = _device.Statistics.GetGameFrameRate();
- string titleNameSection = string.IsNullOrWhiteSpace(_device.System.TitleName) ? string.Empty
- : " | " + _device.System.TitleName;
+ string titleNameSection = string.IsNullOrWhiteSpace(_device.System.TitleName) ? string.Empty
+ : " | " + _device.System.TitleName;
- string titleIdSection = string.IsNullOrWhiteSpace(_device.System.TitleIdText) ? string.Empty
- : " | " + _device.System.TitleIdText.ToUpper();
+ string titleIdSection = string.IsNullOrWhiteSpace(_device.System.TitleIdText) ? string.Empty
+ : " | " + _device.System.TitleIdText.ToUpper();
- _newTitle = $"Ryujinx {Program.Version}{titleNameSection}{titleIdSection} | Host FPS: {hostFps:0.0} | Game FPS: {gameFps:0.0} | " +
- $"Game Vsync: {(_device.EnableDeviceVsync ? "On" : "Off")}";
+ _newTitle = $"Ryujinx {Program.Version}{titleNameSection}{titleIdSection} | Host FPS: {hostFps:0.0} | Game FPS: {gameFps:0.0} | " +
+ $"Game Vsync: {(_device.EnableDeviceVsync ? "On" : "Off")}";
- _titleEvent = true;
+ _titleEvent = true;
- _device.System.SignalVsync();
+ _device.System.SignalVsync();
- _device.VsyncEvent.Set();
+ _device.VsyncEvent.Set();
- _ticks = Math.Min(_ticks - _ticksPerFrame, _ticksPerFrame);
- }
+ _ticks = Math.Min(_ticks - _ticksPerFrame, _ticksPerFrame);
}
}
}
diff --git a/Ryujinx/Ui/ScopedGlContext.cs b/Ryujinx/Ui/ScopedGlContext.cs
deleted file mode 100644
index 8dc9246e..00000000
--- a/Ryujinx/Ui/ScopedGlContext.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using OpenTK.Graphics;
-using OpenTK.Platform;
-using System;
-using System.Threading;
-
-namespace Ryujinx.Ui
-{
- class ScopedGlContext : IDisposable
- {
- private IGraphicsContext _graphicsContext;
-
- private static readonly object _lock = new object();
-
- public ScopedGlContext(IWindowInfo windowInfo, IGraphicsContext graphicsContext)
- {
- _graphicsContext = graphicsContext;
-
- Monitor.Enter(_lock);
-
- MakeCurrent(windowInfo);
- }
-
- private void MakeCurrent(IWindowInfo windowInfo)
- {
- _graphicsContext.MakeCurrent(windowInfo);
- }
-
- public void Dispose()
- {
- MakeCurrent(null);
-
- Monitor.Exit(_lock);
- }
- }
-}