diff --git a/openVulkanoCpp/Vulkan/Resources/MemoryPool.cpp b/openVulkanoCpp/Vulkan/Resources/MemoryPool.cpp index 3194984..6fe32c5 100644 --- a/openVulkanoCpp/Vulkan/Resources/MemoryPool.cpp +++ b/openVulkanoCpp/Vulkan/Resources/MemoryPool.cpp @@ -26,16 +26,28 @@ namespace OpenVulkano::Vulkan delete buffer; } - MemoryPool::MemoryPool() - { - freeFunction = [this](ManagedBuffer* buffer) { this->FreeBuffer(buffer); }; - MEM_POOLS.push_back(this); - Logger::RENDER->info("Created gpu memory pool"); - } - MemoryPool::~MemoryPool() + { + if (!allocations.empty()) Close(); + } + + void MemoryPool::Close() { Utils::Remove(MEM_POOLS, this); + for(ManagedBuffer* buffer : recycleBuffers) + { + delete buffer; + } + recycleBuffers.clear(); + for(auto& fF : toFree) + { + for(ManagedBuffer* buffer : fF) + { + delete buffer; + } + fF.clear(); + } + allocations.clear(); Logger::RENDER->info("Destroyed gpu memory pool"); } @@ -43,6 +55,7 @@ namespace OpenVulkano::Vulkan { device = dev; toFree = decltype(toFree)(bufferCount); + MEM_POOLS.push_back(this); } void MemoryPool::StartFrame(uint64_t bufferId) diff --git a/openVulkanoCpp/Vulkan/Resources/MemoryPool.hpp b/openVulkanoCpp/Vulkan/Resources/MemoryPool.hpp index 26530f4..abd75df 100644 --- a/openVulkanoCpp/Vulkan/Resources/MemoryPool.hpp +++ b/openVulkanoCpp/Vulkan/Resources/MemoryPool.hpp @@ -35,12 +35,14 @@ namespace OpenVulkano::Vulkan public: using ManagedBufferPtr = std::unique_ptr; - MemoryPool(); + MemoryPool() = default; ~MemoryPool(); void Init(Device* dev, int bufferCount); + void Close(); + void StartFrame(uint64_t bufferId); MemoryAllocation* CreateMemoryAllocation(size_t size, uint32_t type, bool addToCache = true); diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index 5e03db3..7aad414 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -114,6 +114,7 @@ namespace OpenVulkano::Vulkan } descriptorSetLayoutCache.clear(); shaders.clear(); + memPool.Close(); device = nullptr; }