renderer_vulkan: Surface recreation works

This commit is contained in:
GPUCode
2023-01-06 21:15:52 +02:00
parent 6d286d5f8c
commit 11061f36e6
3 changed files with 8 additions and 10 deletions

View File

@ -962,7 +962,6 @@ void RendererVulkan::SwapBuffers() {
} }
void RendererVulkan::NotifySurfaceChanged() { void RendererVulkan::NotifySurfaceChanged() {
scheduler.Finish();
vk::SurfaceKHR new_surface = CreateSurface(instance.GetInstance(), render_window); vk::SurfaceKHR new_surface = CreateSurface(instance.GetInstance(), render_window);
swapchain.Create(new_surface); swapchain.Create(new_surface);
} }

View File

@ -255,7 +255,6 @@ Instance::~Instance() {
if (device) { if (device) {
vmaDestroyAllocator(allocator); vmaDestroyAllocator(allocator);
device.destroy(); device.destroy();
instance.destroySurfaceKHR(surface);
if (debug_messenger) { if (debug_messenger) {
instance.destroyDebugUtilsMessengerEXT(debug_messenger); instance.destroyDebugUtilsMessengerEXT(debug_messenger);

View File

@ -38,12 +38,15 @@ Swapchain::~Swapchain() {
for (const vk::Semaphore semaphore : present_ready) { for (const vk::Semaphore semaphore : present_ready) {
device.destroySemaphore(semaphore); device.destroySemaphore(semaphore);
} }
instance.GetInstance().destroySurfaceKHR(surface);
} }
void Swapchain::Create(vk::SurfaceKHR new_surface) { void Swapchain::Create(vk::SurfaceKHR new_surface) {
is_outdated = false; is_outdated = false;
is_suboptimal = false; is_suboptimal = false;
if (new_surface) { if (new_surface) {
instance.GetInstance().destroySurfaceKHR(surface);
surface = new_surface; surface = new_surface;
} }
@ -73,24 +76,21 @@ void Swapchain::Create(vk::SurfaceKHR new_surface) {
.compositeAlpha = composite_alpha, .compositeAlpha = composite_alpha,
.presentMode = present_mode, .presentMode = present_mode,
.clipped = true, .clipped = true,
.oldSwapchain = swapchain, .oldSwapchain = nullptr,
}; };
vk::Device device = instance.GetDevice(); vk::Device device = instance.GetDevice();
vk::SwapchainKHR new_swapchain{}; device.waitIdle();
Destroy();
try { try {
new_swapchain = device.createSwapchainKHR(swapchain_info); swapchain = device.createSwapchainKHR(swapchain_info);
device.waitIdle();
} catch (vk::SystemError& err) { } catch (vk::SystemError& err) {
LOG_CRITICAL(Render_Vulkan, "{}", err.what()); LOG_CRITICAL(Render_Vulkan, "{}", err.what());
UNREACHABLE(); UNREACHABLE();
} }
Destroy();
swapchain = new_swapchain;
SetupImages(); SetupImages();
resource_ticks.clear(); resource_ticks.clear();
resource_ticks.resize(image_count); resource_ticks.resize(image_count);
} }