From bb89e36fd851e78787a3c81de0c6b757f170bea6 Mon Sep 17 00:00:00 2001 From: Fliperworld Date: Thu, 19 Jan 2023 21:31:25 -0300 Subject: [PATCH] Vulkan: Destroy old swapchain on swapchain recreation (#3889) * Destroy old swapchain on swapchain recreation * vkDeviceWaitIdle before DestroySwapchain * Update Ryujinx.Graphics.Vulkan/Window.cs Co-authored-by: gdkchan * Avoid unsafe code on RecreateSwapchain() * Destroying old Swapchain on a queue. * Cleanup and fix on destroying old Swapchain. * Update Ryujinx.Graphics.Vulkan/Window.cs Co-authored-by: gdkchan * Update Ryujinx.Graphics.Vulkan/Window.cs Co-authored-by: gdkchan * Update Ryujinx.Graphics.Vulkan/Window.cs Co-authored-by: gdkchan * Update Window.cs Done. Co-authored-by: gdkchan --- Ryujinx.Graphics.Vulkan/Window.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Ryujinx.Graphics.Vulkan/Window.cs b/Ryujinx.Graphics.Vulkan/Window.cs index d37dd7e96..edc7d7160 100644 --- a/Ryujinx.Graphics.Vulkan/Window.cs +++ b/Ryujinx.Graphics.Vulkan/Window.cs @@ -1,5 +1,6 @@ using Ryujinx.Graphics.GAL; using Silk.NET.Vulkan; +using Silk.NET.Vulkan.Extensions.KHR; using System; using System.Linq; using VkFormat = Silk.NET.Vulkan.Format; @@ -49,13 +50,19 @@ namespace Ryujinx.Graphics.Vulkan private void RecreateSwapchain() { + var oldSwapchain = _swapchain; + int imageCount = _swapchainImageViews.Length; _vsyncModeChanged = false; - for (int i = 0; i < _swapchainImageViews.Length; i++) + for (int i = 0; i < imageCount; i++) { _swapchainImageViews[i].Dispose(); } + // Destroy old Swapchain. + _gd.Api.DeviceWaitIdle(_device); + _gd.SwapchainApi.DestroySwapchain(_device, oldSwapchain, Span.Empty); + CreateSwapchain(); } @@ -115,8 +122,7 @@ namespace Ryujinx.Graphics.Vulkan PreTransform = capabilities.CurrentTransform, CompositeAlpha = CompositeAlphaFlagsKHR.OpaqueBitKhr, PresentMode = ChooseSwapPresentMode(presentModes, _vsyncEnabled), - Clipped = true, - OldSwapchain = oldSwapchain + Clipped = true }; _gd.SwapchainApi.CreateSwapchain(_device, swapchainCreateInfo, null, out _swapchain).ThrowOnError();