diff options
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/Window.cs')
-rw-r--r-- | Ryujinx.Graphics.Vulkan/Window.cs | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/Ryujinx.Graphics.Vulkan/Window.cs b/Ryujinx.Graphics.Vulkan/Window.cs index 12212a7f..26f53b39 100644 --- a/Ryujinx.Graphics.Vulkan/Window.cs +++ b/Ryujinx.Graphics.Vulkan/Window.cs @@ -25,6 +25,8 @@ namespace Ryujinx.Graphics.Vulkan private int _width; private int _height; + private bool _vsyncEnabled; + private bool _vsyncModeChanged; private VkFormat _format; public unsafe Window(VulkanRenderer gd, SurfaceKHR surface, PhysicalDevice physicalDevice, Device device) @@ -47,6 +49,8 @@ namespace Ryujinx.Graphics.Vulkan private void RecreateSwapchain() { + _vsyncModeChanged = false; + for (int i = 0; i < _swapchainImageViews.Length; i++) { _swapchainImageViews[i].Dispose(); @@ -110,7 +114,7 @@ namespace Ryujinx.Graphics.Vulkan ImageArrayLayers = 1, PreTransform = capabilities.CurrentTransform, CompositeAlpha = CompositeAlphaFlagsKHR.CompositeAlphaOpaqueBitKhr, - PresentMode = ChooseSwapPresentMode(presentModes), + PresentMode = ChooseSwapPresentMode(presentModes, _vsyncEnabled), Clipped = true, OldSwapchain = oldSwapchain }; @@ -178,9 +182,9 @@ namespace Ryujinx.Graphics.Vulkan return availableFormats[0]; } - private static PresentModeKHR ChooseSwapPresentMode(PresentModeKHR[] availablePresentModes) + private static PresentModeKHR ChooseSwapPresentMode(PresentModeKHR[] availablePresentModes, bool vsyncEnabled) { - if (availablePresentModes.Contains(PresentModeKHR.PresentModeImmediateKhr)) + if (!vsyncEnabled && availablePresentModes.Contains(PresentModeKHR.PresentModeImmediateKhr)) { return PresentModeKHR.PresentModeImmediateKhr; } @@ -188,6 +192,10 @@ namespace Ryujinx.Graphics.Vulkan { return PresentModeKHR.PresentModeMailboxKhr; } + else if (availablePresentModes.Contains(PresentModeKHR.PresentModeFifoKhr)) + { + return PresentModeKHR.PresentModeFifoKhr; + } else { return PresentModeKHR.PresentModeFifoKhr; @@ -224,7 +232,8 @@ namespace Ryujinx.Graphics.Vulkan ref nextImage); if (acquireResult == Result.ErrorOutOfDateKhr || - acquireResult == Result.SuboptimalKhr) + acquireResult == Result.SuboptimalKhr || + _vsyncModeChanged) { RecreateSwapchain(); } @@ -404,6 +413,12 @@ namespace Ryujinx.Graphics.Vulkan // Not needed as we can get the size from the surface. } + public override void ChangeVSyncMode(bool vsyncEnabled) + { + _vsyncEnabled = vsyncEnabled; + _vsyncModeChanged = true; + } + protected virtual void Dispose(bool disposing) { if (disposing) |