renderer_vulkan: Surface recreation works
This commit is contained in:
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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{};
|
|
||||||
try {
|
|
||||||
new_swapchain = device.createSwapchainKHR(swapchain_info);
|
|
||||||
device.waitIdle();
|
device.waitIdle();
|
||||||
|
Destroy();
|
||||||
|
|
||||||
|
try {
|
||||||
|
swapchain = device.createSwapchainKHR(swapchain_info);
|
||||||
} 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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user