From 457a32bc0619e82150df228bbd7d5fec905a6540 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Mon, 1 Oct 2018 20:20:16 -0400 Subject: [PATCH] Properly clean up presentation resources --- include/renderer.h | 1 + src/renderer.cpp | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/renderer.h b/include/renderer.h index 4d9ddc7..ada4145 100644 --- a/include/renderer.h +++ b/include/renderer.h @@ -7,6 +7,7 @@ struct RenderTarget { VkSwapchainKHR swapchain = nullptr; VkExtent2D extent = {}; + uint32_t numImages = 0; VkImage* images = nullptr; VkImageView* imageViews = nullptr; diff --git a/src/renderer.cpp b/src/renderer.cpp index f026315..16fba8d 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -20,6 +20,12 @@ Renderer::Renderer() { } Renderer::~Renderer() { + vkDeviceWaitIdle(device_); + + vkDestroyRenderPass(device_, presentationRenderPass_, nullptr); + + vkDestroyCommandPool(device_, commandPool_, nullptr); + #ifdef DEBUG destroyMessenger_(instance_, messenger_, nullptr); #endif @@ -134,6 +140,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface) { uint32_t swapchainImageCount = 0; vkGetSwapchainImagesKHR(device_, target->swapchain, &swapchainImageCount, nullptr); + target->numImages = swapchainImageCount; + target->images = new VkImage[swapchainImageCount]; vkGetSwapchainImagesKHR(device_, target->swapchain, &swapchainImageCount, target->images); @@ -194,6 +202,29 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface) { } void Renderer::destroyRenderTarget(RenderTarget* target) { + vkDeviceWaitIdle(device_); + + for(uint32_t i = 0; i < target->numImages; i++) + vkDestroyFence(device_, target->fences[i], nullptr); + + delete[] target->fences; + + vkDestroySemaphore(device_, target->renderFinishedSemaphore, nullptr); + vkDestroySemaphore(device_, target->imageAvailableSemaphore, nullptr); + + vkFreeCommandBuffers(device_, commandPool_, target->numImages, target->commandBuffers); + + delete[] target->commandBuffers; + + for(uint32_t i = 0; i < target->numImages; i++) { + vkDestroyFramebuffer(device_, target->framebuffers[i], nullptr); + vkDestroyImageView(device_, target->imageViews[i], nullptr); + } + + delete[] target->framebuffers; + delete[] target->imageViews; + delete[] target->images; + vkDestroySwapchainKHR(device_, target->swapchain, nullptr); vkDestroySurfaceKHR(instance_, target->surface, nullptr);