From db1a759c5927f2df9ddd9a08fd691f99bf10e6f8 Mon Sep 17 00:00:00 2001 From: emmauss Date: Mon, 10 Sep 2018 02:38:56 +0300 Subject: [PATCH] Lock GbpQueueBuffer till Vsync is signalled (#367) * Initial Framerate limit implementation * use seperate event for limiter * check for vsync signal after queue up framebuffer * removed ingame toggle * fix nits --- Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs | 5 +++++ Ryujinx.HLE/Switch.cs | 11 +++++++++++ Ryujinx/Config.cs | 2 ++ Ryujinx/Ryujinx.conf | 3 +++ Ryujinx/Ui/GLScreen.cs | 5 ++++- 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs index 8f541fbf4..2a6918c44 100644 --- a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs +++ b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs @@ -199,6 +199,11 @@ namespace Ryujinx.HLE.HOS.Services.Android SendFrameBuffer(Context, Slot); + if (Context.Device.EnableDeviceVsync) + { + Context.Device.VsyncEvent.WaitOne(); + } + return MakeReplyParcel(Context, 1280, 720, 0, 0, 0); } diff --git a/Ryujinx.HLE/Switch.cs b/Ryujinx.HLE/Switch.cs index 70bd7060e..a3f874ee5 100644 --- a/Ryujinx.HLE/Switch.cs +++ b/Ryujinx.HLE/Switch.cs @@ -7,6 +7,7 @@ using Ryujinx.HLE.Input; using Ryujinx.HLE.Logging; using Ryujinx.HLE.Memory; using System; +using System.Threading; namespace Ryujinx.HLE { @@ -28,6 +29,12 @@ namespace Ryujinx.HLE public Hid Hid { get; private set; } + public bool EnableDeviceVsync { get; set; } = true; + + public AutoResetEvent VsyncEvent { get; private set; } + + public event EventHandler Finish; + public Switch(IGalRenderer Renderer, IAalOutput AudioOut) { if (Renderer == null) @@ -55,6 +62,8 @@ namespace Ryujinx.HLE Statistics = new PerformanceStatistics(); Hid = new Hid(this, System.HidSharedMem.PA); + + VsyncEvent = new AutoResetEvent(true); } public void LoadCart(string ExeFsDir, string RomFsFile = null) @@ -109,6 +118,8 @@ namespace Ryujinx.HLE if (Disposing) { System.Dispose(); + + VsyncEvent.Dispose(); } } } diff --git a/Ryujinx/Config.cs b/Ryujinx/Config.cs index 2c02c50f1..748d1dbf8 100644 --- a/Ryujinx/Config.cs +++ b/Ryujinx/Config.cs @@ -33,6 +33,8 @@ namespace Ryujinx Device.System.State.DockedMode = Convert.ToBoolean(Parser.Value("Docked_Mode")); + Device.EnableDeviceVsync = Convert.ToBoolean(Parser.Value("Enable_Vsync")); + string[] FilteredLogClasses = Parser.Value("Logging_Filtered_Classes").Split(',', StringSplitOptions.RemoveEmptyEntries); //When the classes are specified on the list, we only diff --git a/Ryujinx/Ryujinx.conf b/Ryujinx/Ryujinx.conf index 6e15a6ac2..c497c0811 100644 --- a/Ryujinx/Ryujinx.conf +++ b/Ryujinx/Ryujinx.conf @@ -25,6 +25,9 @@ Logging_Filtered_Classes = #Enable or Disable Docked Mode Docked_Mode = false +#Enable Game Vsync +Enable_Vsync = true + #Controller Device Index GamePad_Index = 0 diff --git a/Ryujinx/Ui/GLScreen.cs b/Ryujinx/Ui/GLScreen.cs index e7eb26137..8adff9c00 100644 --- a/Ryujinx/Ui/GLScreen.cs +++ b/Ryujinx/Ui/GLScreen.cs @@ -258,13 +258,16 @@ namespace Ryujinx double HostFps = Device.Statistics.GetSystemFrameRate(); double GameFps = Device.Statistics.GetGameFrameRate(); - NewTitle = $"Ryujinx | Host FPS: {HostFps:0.0} | Game FPS: {GameFps:0.0}"; + NewTitle = $"Ryujinx | Host FPS: {HostFps:0.0} | Game FPS: {GameFps:0.0} | Game Vsync: " + + (Device.EnableDeviceVsync ? "On" : "Off"); TitleEvent = true; SwapBuffers(); Device.System.SignalVsync(); + + Device.VsyncEvent.Set(); } protected override void OnUnload(EventArgs e)