Properly clean up presentation resources
This commit is contained in:
parent
3b982362e4
commit
457a32bc06
2 changed files with 32 additions and 0 deletions
|
@ -7,6 +7,7 @@ struct RenderTarget {
|
||||||
VkSwapchainKHR swapchain = nullptr;
|
VkSwapchainKHR swapchain = nullptr;
|
||||||
|
|
||||||
VkExtent2D extent = {};
|
VkExtent2D extent = {};
|
||||||
|
uint32_t numImages = 0;
|
||||||
|
|
||||||
VkImage* images = nullptr;
|
VkImage* images = nullptr;
|
||||||
VkImageView* imageViews = nullptr;
|
VkImageView* imageViews = nullptr;
|
||||||
|
|
|
@ -20,6 +20,12 @@ Renderer::Renderer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderer::~Renderer() {
|
Renderer::~Renderer() {
|
||||||
|
vkDeviceWaitIdle(device_);
|
||||||
|
|
||||||
|
vkDestroyRenderPass(device_, presentationRenderPass_, nullptr);
|
||||||
|
|
||||||
|
vkDestroyCommandPool(device_, commandPool_, nullptr);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
destroyMessenger_(instance_, messenger_, nullptr);
|
destroyMessenger_(instance_, messenger_, nullptr);
|
||||||
#endif
|
#endif
|
||||||
|
@ -134,6 +140,8 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface) {
|
||||||
uint32_t swapchainImageCount = 0;
|
uint32_t swapchainImageCount = 0;
|
||||||
vkGetSwapchainImagesKHR(device_, target->swapchain, &swapchainImageCount, nullptr);
|
vkGetSwapchainImagesKHR(device_, target->swapchain, &swapchainImageCount, nullptr);
|
||||||
|
|
||||||
|
target->numImages = swapchainImageCount;
|
||||||
|
|
||||||
target->images = new VkImage[swapchainImageCount];
|
target->images = new VkImage[swapchainImageCount];
|
||||||
vkGetSwapchainImagesKHR(device_, target->swapchain, &swapchainImageCount, target->images);
|
vkGetSwapchainImagesKHR(device_, target->swapchain, &swapchainImageCount, target->images);
|
||||||
|
|
||||||
|
@ -194,6 +202,29 @@ RenderTarget* Renderer::createSurfaceRenderTarget(VkSurfaceKHR surface) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::destroyRenderTarget(RenderTarget* target) {
|
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);
|
vkDestroySwapchainKHR(device_, target->swapchain, nullptr);
|
||||||
vkDestroySurfaceKHR(instance_, target->surface, nullptr);
|
vkDestroySurfaceKHR(instance_, target->surface, nullptr);
|
||||||
|
|
||||||
|
|
Reference in a new issue