diff options
| author | Thog <me@thog.eu> | 2020-02-14 11:52:34 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-14 11:52:34 +0100 |
| commit | dbe3f938c7be920ff40761bb03ff2f385f0327d2 (patch) | |
| tree | a7612a77c1e38df8b5daad6449555a5712f9948d | |
| parent | 949bb81a9e7ef7d582ac06edabb3bc2613eb7698 (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.cs | 73 | ||||
| -rw-r--r-- | Ryujinx/Ui/ScopedGlContext.cs | 35 |
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); - } - } -} |
