From 5b9b17ef24f230b522d9034fc571e6f04496b16d Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Wed, 28 Jun 2023 09:21:05 +0000 Subject: [PATCH] attempt to recreate surface if lost --- src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs | 9 +++++++++ src/Ryujinx.Graphics.Vulkan/Window.cs | 12 +++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs index 641ac844f..1eff7e0cd 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs @@ -842,6 +842,15 @@ namespace Ryujinx.Graphics.Vulkan ScreenCaptured?.Invoke(this, bitmap); } + internal unsafe void RecreateSurface() + { + SurfaceApi.DestroySurface(_instance.Instance, _surface, null); + + _surface = _getSurface(_instance.Instance, Api); + + (_window as Window)?.SetSurface(_surface); + } + public unsafe void Dispose() { if (!_initialized) diff --git a/src/Ryujinx.Graphics.Vulkan/Window.cs b/src/Ryujinx.Graphics.Vulkan/Window.cs index 1b4ad8adc..443990c33 100644 --- a/src/Ryujinx.Graphics.Vulkan/Window.cs +++ b/src/Ryujinx.Graphics.Vulkan/Window.cs @@ -14,10 +14,10 @@ namespace Ryujinx.Graphics.Vulkan private const int SurfaceHeight = 720; private readonly VulkanRenderer _gd; - private readonly SurfaceKHR _surface; private readonly PhysicalDevice _physicalDevice; private readonly Device _device; private SwapchainKHR _swapchain; + private SurfaceKHR _surface; private Image[] _swapchainImages; private Auto[] _swapchainImageViews; @@ -84,6 +84,12 @@ namespace Ryujinx.Graphics.Vulkan CreateSwapchain(); } + internal void SetSurface(SurfaceKHR surface) + { + _surface = surface; + RecreateSwapchain(); + } + private unsafe void CreateSwapchain() { _gd.SurfaceApi.GetPhysicalDeviceSurfaceCapabilities(_physicalDevice, _surface, out var capabilities); @@ -313,6 +319,10 @@ namespace Ryujinx.Graphics.Vulkan { RecreateSwapchain(); } + else if(acquireResult == Result.ErrorSurfaceLostKhr) + { + _gd.RecreateSurface(); + } else { acquireResult.ThrowOnError();