From c8f9292babd5aa6021ce1bd6a977130baebb7de3 Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Tue, 16 Aug 2022 16:32:37 +0000 Subject: Avalonia - Couple fixes and improvements to vulkan (#3483) * drop split devices, rebase * add fallback to opengl if vulkan is not available * addressed review * ensure present image references are incremented and decremented when necessary * allow changing vsync for vulkan * fix screenshot on avalonia vulkan * save favorite when toggled * improve sync between popups * use separate devices for each new window * fix crash when closing window * addressed review * don't create the main window with immediate mode * change skia vk delegate to method * update vulkan throwonerror * addressed review --- Ryujinx.Graphics.Vulkan/Window.cs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'Ryujinx.Graphics.Vulkan/Window.cs') 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) -- cgit v1.2.3