From 665614b9b91270e4b10007a02390410a7a819013 Mon Sep 17 00:00:00 2001 From: niki Date: Sat, 20 Aug 2022 21:33:09 +0200 Subject: [PATCH] vulkan: fix crash when recreating swapchain --- src/modules/graphics/vulkan/Graphics.cpp | 22 +++++++++++++++++----- src/modules/graphics/vulkan/Graphics.h | 1 + 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/modules/graphics/vulkan/Graphics.cpp b/src/modules/graphics/vulkan/Graphics.cpp index 472f9b73f..de458a950 100644 --- a/src/modules/graphics/vulkan/Graphics.cpp +++ b/src/modules/graphics/vulkan/Graphics.cpp @@ -41,12 +41,8 @@ const std::vector deviceExtensions = { #ifdef NDEBUG constexpr bool enableValidationLayers = false; #else -#ifdef LOVE_ANDROID -constexpr bool enableValidationLayers = false; -#else constexpr bool enableValidationLayers = true; #endif -#endif constexpr int MAX_FRAMES_IN_FLIGHT = 2; @@ -1012,7 +1008,7 @@ void Graphics::createSwapChain() { } createInfo.preTransform = swapChainSupport.capabilities.currentTransform; - createInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; + createInfo.compositeAlpha = chooseCompositeAlpha(swapChainSupport.capabilities); createInfo.presentMode = presentMode; createInfo.clipped = VK_TRUE; createInfo.oldSwapchain = VK_NULL_HANDLE; @@ -1091,6 +1087,20 @@ VkExtent2D Graphics::chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabiliti } } +VkCompositeAlphaFlagBitsKHR Graphics::chooseCompositeAlpha(const VkSurfaceCapabilitiesKHR &capabilities) { + if (capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR) { + return VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; + } else if (capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR) { + return VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR; + } else if (capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR) { + return VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR; + } else if (capabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR) { + return VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR; + } else { + throw love::Exception("failed to find composite alpha"); + } +} + void Graphics::createImageViews() { swapChainImageViews.resize(swapChainImages.size()); @@ -1673,9 +1683,11 @@ void Graphics::cleanupSwapChain() { for (const auto& [key, val] : framebuffers) { vkDestroyFramebuffer(device, val, nullptr); } + framebuffers.clear(); for (auto & swapChainImageView : swapChainImageViews) { vkDestroyImageView(device, swapChainImageView, nullptr); } + swapChainImageViews.clear(); vkDestroySwapchainKHR(device, swapChain, nullptr); } diff --git a/src/modules/graphics/vulkan/Graphics.h b/src/modules/graphics/vulkan/Graphics.h index bbffae8e7..955503769 100644 --- a/src/modules/graphics/vulkan/Graphics.h +++ b/src/modules/graphics/vulkan/Graphics.h @@ -208,6 +208,7 @@ private: VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector& availableFormats); VkPresentModeKHR chooseSwapPresentMode(const std::vector& availablePresentModes); VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities); + VkCompositeAlphaFlagBitsKHR chooseCompositeAlpha(const VkSurfaceCapabilitiesKHR& capabilities); void createSwapChain(); void createImageViews(); VkFramebuffer createFramebuffer(FramebufferConfiguration);