From c5e8c178c208dcdb2c8738ccde0d73d2feab7c02 Mon Sep 17 00:00:00 2001 From: Sascha Willems Date: Mon, 13 Apr 2020 18:58:02 +0200 Subject: [PATCH] Free glTF model resources in destructor --- examples/mesh/mesh.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/examples/mesh/mesh.cpp b/examples/mesh/mesh.cpp index fb35da1f..0e6713b7 100644 --- a/examples/mesh/mesh.cpp +++ b/examples/mesh/mesh.cpp @@ -122,6 +122,21 @@ public: std::vector materials; std::vector nodes; + ~VulkanglTFModel() + { + // Release all Vulkan resources allocated for the model + vkDestroyBuffer(vulkanDevice->logicalDevice, vertices.buffer, nullptr); + vkFreeMemory(vulkanDevice->logicalDevice, vertices.memory, nullptr); + vkDestroyBuffer(vulkanDevice->logicalDevice, indices.buffer, nullptr); + vkFreeMemory(vulkanDevice->logicalDevice, indices.memory, nullptr); + for (Image image : images) { + vkDestroyImageView(vulkanDevice->logicalDevice, image.texture.view, nullptr); + vkDestroyImage(vulkanDevice->logicalDevice, image.texture.image, nullptr); + vkDestroySampler(vulkanDevice->logicalDevice, image.texture.sampler, nullptr); + vkFreeMemory(vulkanDevice->logicalDevice, image.texture.deviceMemory, nullptr); + } + } + /* glTF loading functions @@ -324,7 +339,7 @@ public: */ // Draw a single node including child nodes (if present) - void drawglTFNode(VkCommandBuffer commandBuffer, VkPipelineLayout pipelineLayout, VulkanglTFModel::Node node) + void drawNode(VkCommandBuffer commandBuffer, VkPipelineLayout pipelineLayout, VulkanglTFModel::Node node) { if (node.mesh.primitives.size() > 0) { // Pass the node's matrix via push constanst @@ -348,7 +363,7 @@ public: } } for (auto& child : node.children) { - drawglTFNode(commandBuffer, pipelineLayout, child); + drawNode(commandBuffer, pipelineLayout, child); } } @@ -361,7 +376,7 @@ public: vkCmdBindIndexBuffer(commandBuffer, indices.buffer, 0, VK_INDEX_TYPE_UINT32); // Render all nodes at top-level for (auto& node : nodes) { - drawglTFNode(commandBuffer, pipelineLayout, node); + drawNode(commandBuffer, pipelineLayout, node); } }