From 34795d23760652f9a11bb68bd060d68a404f1fe3 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Wed, 17 Oct 2018 10:12:34 -0400 Subject: [PATCH] Properly clean up post processing resources --- include/postpass.h | 1 + src/postpass.cpp | 9 +++++++++ src/renderer.cpp | 11 +++++++++++ src/worldpass.cpp | 2 ++ 4 files changed, 23 insertions(+) diff --git a/include/postpass.h b/include/postpass.h index 3654617..734161a 100644 --- a/include/postpass.h +++ b/include/postpass.h @@ -8,6 +8,7 @@ struct RenderTarget; class PostPass { public: PostPass(Renderer& renderer); + ~PostPass(); void render(VkCommandBuffer commandBuffer, RenderTarget* target); diff --git a/src/postpass.cpp b/src/postpass.cpp index 36e013b..ef17f6b 100644 --- a/src/postpass.cpp +++ b/src/postpass.cpp @@ -10,6 +10,15 @@ PostPass::PostPass(Renderer& renderer) : renderer_(renderer) { createSampler(); } +PostPass::~PostPass() { + vkDestroySampler(renderer_.getDevice(), offscreenSampler_, nullptr); + + vkDestroyPipelineLayout(renderer_.getDevice(), pipelineLayout_, nullptr); + vkDestroyPipeline(renderer_.getDevice(), pipeline_, nullptr); + + vkDestroyDescriptorSetLayout(renderer_.getDevice(), setLayout_, nullptr); +} + void PostPass::render(VkCommandBuffer commandBuffer, RenderTarget* target) { vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_); vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout_, 0, 1, &target->postSets[target->currentImage], 0, nullptr); diff --git a/src/renderer.cpp b/src/renderer.cpp index 96c0ed2..b69500c 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -28,8 +28,11 @@ Renderer::Renderer() { Renderer::~Renderer() { vkDeviceWaitIdle(device_); + delete postPass_; delete worldPass_; + vkDestroyDescriptorPool(device_, descriptorPool_, nullptr); + vkDestroyRenderPass(device_, presentationRenderPass_, nullptr); vkDestroyCommandPool(device_, commandPool_, nullptr); @@ -312,7 +315,14 @@ void Renderer::destroyRenderTarget(RenderTarget* target) { delete[] target->commandBuffers; + vkFreeDescriptorSets(device_, descriptorPool_, target->numImages, target->postSets); + for(uint32_t i = 0; i < target->numImages; i++) { + vkDestroyFramebuffer(device_, target->offscreenFramebuffers[i], nullptr); + vkDestroyImageView(device_, target->offscreenImageViews[i], nullptr); + vkFreeMemory(device_, target->offscreenMemory[i], nullptr); + vkDestroyImage(device_, target->offscreenImages[i], nullptr); + vkDestroyFramebuffer(device_, target->swapchainFramebuffers[i], nullptr); vkDestroyImageView(device_, target->swapchainImageViews[i], nullptr); } @@ -595,6 +605,7 @@ void Renderer::createDescriptorPool() { VkDescriptorPoolCreateInfo poolInfo = {}; poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + poolInfo.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; poolInfo.poolSizeCount = 1; poolInfo.pPoolSizes = &poolSize; poolInfo.maxSets = 15; diff --git a/src/worldpass.cpp b/src/worldpass.cpp index 23ced49..920e019 100644 --- a/src/worldpass.cpp +++ b/src/worldpass.cpp @@ -13,6 +13,8 @@ WorldPass::WorldPass(Renderer& renderer) : renderer_(renderer) { } WorldPass::~WorldPass() { + vkDestroyRenderPass(renderer_.getDevice(), renderPass_, nullptr); + vkDestroyPipeline(renderer_.getDevice(), pipeline_, nullptr); vkDestroyPipelineLayout(renderer_.getDevice(), pipelineLayout_, nullptr); }