From e87db99a97e703bb4b581bd5b6afb47de59b91fe Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Tue, 25 Jul 2023 22:53:47 -0700 Subject: [PATCH] Remove ownership of SDL's vulkan-surface This surface is managed by SDL itself, so there is no need to keep it in a Unique handle for us to delete. Fixes the bug where vulkan crashes during shutdown. --- include/renderer_vk/renderer_vk.hpp | 2 +- src/core/renderer_vk/renderer_vk.cpp | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/include/renderer_vk/renderer_vk.hpp b/include/renderer_vk/renderer_vk.hpp index 9545a4d9..708e196d 100644 --- a/include/renderer_vk/renderer_vk.hpp +++ b/include/renderer_vk/renderer_vk.hpp @@ -10,7 +10,7 @@ class RendererVK final : public Renderer { vk::UniqueInstance instance = {}; vk::UniqueDebugUtilsMessengerEXT debugMessenger = {}; - vk::UniqueSurfaceKHR surface = {}; + vk::SurfaceKHR surface = {}; vk::PhysicalDevice physicalDevice = {}; diff --git a/src/core/renderer_vk/renderer_vk.cpp b/src/core/renderer_vk/renderer_vk.cpp index 310fdec3..3161bf58 100644 --- a/src/core/renderer_vk/renderer_vk.cpp +++ b/src/core/renderer_vk/renderer_vk.cpp @@ -199,7 +199,7 @@ void RendererVK::display() { swapchainExtent.width = windowWidth; swapchainExtent.height = windowHeight; } - recreateSwapchain(surface.get(), swapchainExtent); + recreateSwapchain(surface, swapchainExtent); break; } default: { @@ -356,7 +356,7 @@ void RendererVK::display() { swapchainExtent.width = windowWidth; swapchainExtent.height = windowHeight; } - recreateSwapchain(surface.get(), swapchainExtent); + recreateSwapchain(surface, swapchainExtent); break; } default: { @@ -445,7 +445,7 @@ void RendererVK::initGraphicsContext(SDL_Window* window) { // Create surface if (window) { if (VkSurfaceKHR newSurface; SDL_Vulkan_CreateSurface(window, instance.get(), &newSurface)) { - surface.reset(newSurface); + surface = newSurface; } else { Helpers::warn("Error creating Vulkan surface"); } @@ -461,8 +461,7 @@ void RendererVK::initGraphicsContext(SDL_Window* window) { const auto surfaceSupport = [this](const vk::PhysicalDevice& physicalDevice) -> bool { const usize queueCount = physicalDevice.getQueueFamilyProperties().size(); for (usize queueIndex = 0; queueIndex < queueCount; ++queueIndex) { - if (auto supportResult = physicalDevice.getSurfaceSupportKHR(queueIndex, surface.get()); - supportResult.result == vk::Result::eSuccess) { + if (auto supportResult = physicalDevice.getSurfaceSupportKHR(queueIndex, surface); supportResult.result == vk::Result::eSuccess) { return supportResult.value; } } @@ -494,7 +493,7 @@ void RendererVK::initGraphicsContext(SDL_Window* window) { // Get present queue family if (surface) { for (usize queueFamilyIndex = 0; queueFamilyIndex < queueFamilyProperties.size(); ++queueFamilyIndex) { - if (auto supportResult = physicalDevice.getSurfaceSupportKHR(queueFamilyIndex, surface.get()); + if (auto supportResult = physicalDevice.getSurfaceSupportKHR(queueFamilyIndex, surface); supportResult.result == vk::Result::eSuccess) { if (supportResult.value) { presentQueueFamily = queueFamilyIndex; @@ -594,7 +593,7 @@ void RendererVK::initGraphicsContext(SDL_Window* window) { swapchainExtent.width = windowWidth; swapchainExtent.height = windowHeight; } - recreateSwapchain(surface.get(), swapchainExtent); + recreateSwapchain(surface, swapchainExtent); } // Create frame-buffering data