From fcf77baf57ac84f2a2fbd3c344e00b6ea186832d Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Mon, 6 Apr 2026 19:52:29 -0500 Subject: [PATCH] free memory prior to exit --- Makefile | 2 +- src/main.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 5e48212..966cd20 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ CFLAGS += -I../SDL3-dist/include CFLAGS += -I../volk CFLAGS += -fpic -#FLAGS += -fstack-protector -fstack-protector-all -fno-omit-frame-pointer -fsanitize=address +FLAGS += -fstack-protector -fstack-protector-all -fno-omit-frame-pointer -fsanitize=address LDFLAGS += -lm ifeq ($(shell uname),Linux) diff --git a/src/main.cpp b/src/main.cpp index 0d9629a..3eecd6e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -107,6 +107,7 @@ VkImageView depthImageView{ VK_NULL_HANDLE }; VkDeviceMemory depthImageMemory{ VK_NULL_HANDLE }; VkBuffer vertexIndexBuffer{ VK_NULL_HANDLE }; +VkDeviceMemory vertexIndexBufferMemory{ VK_NULL_HANDLE }; VkFence fences[maxFramesInFlight]; VkSemaphore presentSemaphores[maxFramesInFlight]; @@ -120,6 +121,7 @@ VkPipelineLayout pipelineLayout{ VK_NULL_HANDLE }; VkImage textureImage{ VK_NULL_HANDLE }; VkImageView textureImageView{ VK_NULL_HANDLE }; +VkDeviceMemory textureImageMemory{ VK_NULL_HANDLE }; VkSampler textureSampler{ VK_NULL_HANDLE }; VkDescriptorPool descriptorPool{ VK_NULL_HANDLE }; @@ -531,7 +533,6 @@ int main() .allocationSize = vertexIndexBufferMemoryRequirements.size, .memoryTypeIndex = vertexIndexBufferMemoryTypeIndex, }; - VkDeviceMemory vertexIndexBufferMemory; VK_CHECK(vkAllocateMemory(device, &vertexIndexBufferAllocateInfo, nullptr, &vertexIndexBufferMemory)); VK_CHECK(vkBindBufferMemory(device, vertexIndexBuffer, vertexIndexBufferMemory, 0)); @@ -572,19 +573,15 @@ int main() .allocationSize = shaderBufferMemoryRequirements.size, .memoryTypeIndex = shaderBufferMemoryTypeIndex, }; - VkDeviceMemory shaderBufferMemory; - VK_CHECK(vkAllocateMemory(device, &shaderBufferAllocateInfo, nullptr, &shaderBufferMemory)); - VK_CHECK(vkBindBufferMemory(device, shaderDataBuffers[i].buffer, shaderBufferMemory, 0)); + VK_CHECK(vkAllocateMemory(device, &shaderBufferAllocateInfo, nullptr, &shaderDataBuffers[i].memory)); + VK_CHECK(vkBindBufferMemory(device, shaderDataBuffers[i].buffer, shaderDataBuffers[i].memory, 0)); VkBufferDeviceAddressInfo shaderBufferDeviceAddressInfo{ .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, .buffer = shaderDataBuffers[i].buffer }; shaderDataBuffers[i].deviceAddress = vkGetBufferDeviceAddress(device, &shaderBufferDeviceAddressInfo); - void * mappedData; - VK_CHECK(vkMapMemory(device, shaderBufferMemory, 0, (sizeof (ShaderData)), 0, &mappedData)); - shaderDataBuffers[i].memory = shaderBufferMemory; - shaderDataBuffers[i].mappedData = mappedData; + VK_CHECK(vkMapMemory(device, shaderDataBuffers[i].memory, 0, (sizeof (ShaderData)), 0, &shaderDataBuffers[i].mappedData)); } ////////////////////////////////////////////////////////////////////// @@ -658,7 +655,6 @@ int main() .memoryTypeIndex = textureImageMemoryTypeIndex, }; - VkDeviceMemory textureImageMemory; VK_CHECK(vkAllocateMemory(device, &textureImageAllocateInfo, nullptr, &textureImageMemory)); VK_CHECK(vkBindImageMemory(device, textureImage, textureImageMemory, 0)); @@ -784,6 +780,9 @@ int main() }; VK_CHECK(vkQueueSubmit(queue, 1, &textureSubmitInfo, textureFence)); VK_CHECK(vkWaitForFences(device, 1, &textureFence, VK_TRUE, UINT64_MAX)); + vkDestroyFence(device, textureFence, nullptr); + vkDestroyBuffer(device, textureSourceBuffer, nullptr); + vkFreeMemory(device, textureSourceBufferMemory, nullptr); // texture sampler @@ -1193,4 +1192,48 @@ int main() recreateSwapchain(surfaceFormat, depthFormat, memoryProperties, surfaceCapabilities); } } + + VK_CHECK(vkDeviceWaitIdle(device)); + for (uint32_t i = 0; i < maxFramesInFlight; i++) { + vkDestroyFence(device, fences[i], nullptr); + vkDestroySemaphore(device, presentSemaphores[i], nullptr); + + vkUnmapMemory(device, shaderDataBuffers[i].memory); + vkDestroyBuffer(device, shaderDataBuffers[i].buffer, nullptr); + vkFreeMemory(device, shaderDataBuffers[i].memory, nullptr); + } + + for (uint32_t i = 0; i < swapchainImageCount; i++) { + vkDestroySemaphore(device, renderSemaphores[i], nullptr); + vkDestroyImageView(device, swapchainImageViews[i], nullptr); + } + + vkDestroyImage(device, depthImage, nullptr); + vkFreeMemory(device, depthImageMemory, nullptr); + vkDestroyImageView(device, depthImageView, nullptr); + + vkDestroyBuffer(device, vertexIndexBuffer, nullptr); + vkFreeMemory(device, vertexIndexBufferMemory, nullptr); + + vkDestroyImageView(device, textureImageView, nullptr); + vkDestroySampler(device, textureSampler, nullptr); + vkDestroyImage(device, textureImage, nullptr); + vkFreeMemory(device, textureImageMemory, nullptr); + + vkDestroyDescriptorSetLayout(device, textureDescriptorSetLayout, nullptr); + vkDestroyDescriptorPool(device, descriptorPool, nullptr); + vkDestroyPipelineLayout(device, pipelineLayout, nullptr); + vkDestroyPipeline(device, pipeline, nullptr); + vkDestroySwapchainKHR(device, swapchain, nullptr); + vkDestroySurfaceKHR(instance, surface, nullptr); + vkDestroyCommandPool(device, commandPool, nullptr); + vkDestroyShaderModule(device, vertexShaderModule, nullptr); + vkDestroyShaderModule(device, pixelShaderModule, nullptr); + + SDL_DestroyWindow(window); + SDL_QuitSubSystem(SDL_INIT_VIDEO); + SDL_Quit(); + + vkDestroyDevice(device, nullptr); + vkDestroyInstance(instance, nullptr); }