vulkan: fix crash when recreating swapchain

This commit is contained in:
niki
2022-08-20 21:33:09 +02:00
parent 5f2fdc0dd0
commit 665614b9b9
2 changed files with 18 additions and 5 deletions
+17 -5
View File
@@ -41,12 +41,8 @@ const std::vector<const char*> 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);
}
+1
View File
@@ -208,6 +208,7 @@ private:
VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& availableFormats);
VkPresentModeKHR chooseSwapPresentMode(const std::vector<VkPresentModeKHR>& availablePresentModes);
VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities);
VkCompositeAlphaFlagBitsKHR chooseCompositeAlpha(const VkSurfaceCapabilitiesKHR& capabilities);
void createSwapChain();
void createImageViews();
VkFramebuffer createFramebuffer(FramebufferConfiguration);