From 5afb752fca43a2a8998b8b902f2e6baaf75a3bfa Mon Sep 17 00:00:00 2001 From: GeorgH93 Date: Sat, 9 Jan 2021 22:56:17 +0100 Subject: [PATCH] Free resources when VulkanGeometry is freed --- .../Vulkan/Resources/ManagedResource.hpp | 4 ++++ .../Vulkan/Resources/ResourceManager.cpp | 15 ++++++++++---- .../Vulkan/Resources/ResourceManager.hpp | 2 ++ .../Vulkan/Scene/VulkanGeometry.hpp | 20 ++++++++++--------- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/openVulkanoCpp/Vulkan/Resources/ManagedResource.hpp b/openVulkanoCpp/Vulkan/Resources/ManagedResource.hpp index 27c2d22..9d25e7e 100644 --- a/openVulkanoCpp/Vulkan/Resources/ManagedResource.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ManagedResource.hpp @@ -8,7 +8,9 @@ #define CRASH_ON_MULTIPLE_MAPPINGS_TO_SAME_ALLOCATION +#include #include +#include namespace openVulkanoCpp::Vulkan { @@ -87,6 +89,8 @@ namespace openVulkanoCpp::Vulkan struct ManagedBuffer { + using Ptr = std::unique_ptr>; + MemoryAllocation* allocation; vk::DeviceSize offset, size; vk::Buffer buffer; diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index fa8d068..ad82608 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -14,7 +14,10 @@ namespace openVulkanoCpp::Vulkan { ResourceManager* ResourceManager::INSTANCE; - ResourceManager::ResourceManager() = default; + ResourceManager::ResourceManager() + { + freeFunction = [this](ManagedBuffer* buffer) { this->FreeBuffer(buffer); }; + } ResourceManager::~ResourceManager() noexcept { @@ -91,8 +94,12 @@ namespace openVulkanoCpp::Vulkan const std::unique_lock lock(mutex); if(!geometry->renderGeo) { - ManagedBuffer* vertexBuffer = CreateDeviceOnlyBufferWithData(sizeof(Vertex) * geometry->GetVertexCount(), vk::BufferUsageFlagBits::eVertexBuffer, geometry->GetVertices()); - ManagedBuffer* indexBuffer = CreateDeviceOnlyBufferWithData(Utils::EnumAsInt(geometry->indexType) * geometry->GetIndexCount(), vk::BufferUsageFlagBits::eIndexBuffer, geometry->GetIndices()); + ManagedBuffer::Ptr vertexBuffer( + CreateDeviceOnlyBufferWithData(sizeof(Vertex) * geometry->GetVertexCount(), vk::BufferUsageFlagBits::eVertexBuffer, geometry->GetVertices()), + freeFunction); + ManagedBuffer::Ptr indexBuffer( + CreateDeviceOnlyBufferWithData(Utils::EnumAsInt(geometry->indexType) * geometry->GetIndexCount(), vk::BufferUsageFlagBits::eIndexBuffer, geometry->GetIndices()), + freeFunction); VulkanGeometry* vkGeo = new VulkanGeometry(geometry, vertexBuffer, indexBuffer); geometry->renderGeo = vkGeo; return vkGeo; @@ -121,7 +128,7 @@ namespace openVulkanoCpp::Vulkan if (node->GetUpdateFrequency() != Scene::UpdateFrequency::Never) { vkNode = new VulkanNodeDynamic(); - uint32_t imgs = context->swapChain.GetImageCount(); + const uint32_t imgs = context->swapChain.GetImageCount(); buffer = CreateBuffer(imgs * allocSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible); buffer->Map(); } diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp index 646daf5..89d7e37 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp @@ -11,6 +11,7 @@ #include "IShaderOwner.hpp" #include "ManagedResource.hpp" #include +#include namespace openVulkanoCpp { @@ -40,6 +41,7 @@ namespace openVulkanoCpp vk::DeviceSize uniformBufferAlignment; std::vector> toFree; std::vector recycleBuffers; + std::function freeFunction; int buffers = -1, currentBuffer = -1; diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp b/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp index c449da5..51920cf 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanGeometry.hpp @@ -14,18 +14,18 @@ namespace openVulkanoCpp::Vulkan class VulkanGeometry final : virtual public ICloseable { Scene::Geometry* m_geometry; - ManagedBuffer* m_vertexBuffer; - ManagedBuffer* m_indexBuffer; + ManagedBuffer::Ptr m_vertexBuffer; + ManagedBuffer::Ptr m_indexBuffer; vk::IndexType m_indexType; vk::DeviceSize m_offsets = 0; public: - VulkanGeometry() : m_geometry(nullptr), m_vertexBuffer(nullptr) - , m_indexBuffer(nullptr), m_indexType(vk::IndexType::eUint32) + VulkanGeometry() : m_geometry(nullptr), m_vertexBuffer(nullptr, nullptr) + , m_indexBuffer(nullptr, nullptr), m_indexType(vk::IndexType::eUint32) {} - VulkanGeometry(Scene::Geometry* geo, ManagedBuffer* vertexBuffer, ManagedBuffer* indexBuffer) - : m_geometry(geo), m_vertexBuffer(vertexBuffer), m_indexBuffer(indexBuffer) + VulkanGeometry(Scene::Geometry* geo, ManagedBuffer::Ptr& vertexBuffer, ManagedBuffer::Ptr& indexBuffer) + : m_geometry(geo), m_vertexBuffer(std::move(vertexBuffer)), m_indexBuffer(std::move(indexBuffer)) , m_indexType((geo->indexType == Scene::VertexIndexType::UINT16) ? vk::IndexType::eUint16 : vk::IndexType::eUint32) {} @@ -34,11 +34,11 @@ namespace openVulkanoCpp::Vulkan if (m_vertexBuffer) VulkanGeometry::Close(); } - void Init(Scene::Geometry* geo, ManagedBuffer* vertexBuffer, ManagedBuffer* indexBuffer) + void Init(Scene::Geometry* geo, ManagedBuffer::Ptr& vertexBuffer, ManagedBuffer::Ptr& indexBuffer) { m_geometry = geo; - m_vertexBuffer = vertexBuffer; - m_indexBuffer = indexBuffer; + m_vertexBuffer = std::move(vertexBuffer); + m_indexBuffer = std::move(indexBuffer); m_indexType = (geo->indexType == Scene::VertexIndexType::UINT16) ? vk::IndexType::eUint16 : vk::IndexType::eUint32; } @@ -55,6 +55,8 @@ namespace openVulkanoCpp::Vulkan void Close() override { + m_vertexBuffer.reset(); + m_indexBuffer.reset(); } }; }