diff options
author | Emmanuel Hansen <emmausssss@gmail.com> | 2022-08-16 16:32:37 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-16 16:32:37 +0000 |
commit | c8f9292babd5aa6021ce1bd6a977130baebb7de3 (patch) | |
tree | e6e62d79d08726129485476078732f9b89f6ab5c /Ryujinx.Graphics.Vulkan/Window.cs | |
parent | 0ec933a6152ebb7724da1e3a05a5ae1c2ea07b2f (diff) |
Avalonia - Couple fixes and improvements to vulkan (#3483)1.1.219
* 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
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) |