diff --git a/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs b/Ryujinx.HLE/HOS/Services/Vi/NvFlinger.cs index 8f541fbf45..2a6918c441 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 70bd7060ec..a3f874ee59 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 2c02c50f19..748d1dbf87 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 6e15a6ac29..c497c08112 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 e7eb26137b..8adff9c00d 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)