Free resources when VulkanGeometry is freed

This commit is contained in:
2021-01-09 22:56:17 +01:00
parent 412613c757
commit 5afb752fca
4 changed files with 28 additions and 13 deletions

View File

@@ -8,7 +8,9 @@
#define CRASH_ON_MULTIPLE_MAPPINGS_TO_SAME_ALLOCATION
#include <memory>
#include <vulkan/vulkan.hpp>
#include <functional>
namespace openVulkanoCpp::Vulkan
{
@@ -87,6 +89,8 @@ namespace openVulkanoCpp::Vulkan
struct ManagedBuffer
{
using Ptr = std::unique_ptr<ManagedBuffer, std::function<void(ManagedBuffer*)>>;
MemoryAllocation* allocation;
vk::DeviceSize offset, size;
vk::Buffer buffer;

View File

@@ -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();
}

View File

@@ -11,6 +11,7 @@
#include "IShaderOwner.hpp"
#include "ManagedResource.hpp"
#include <mutex>
#include <functional>
namespace openVulkanoCpp
{
@@ -40,6 +41,7 @@ namespace openVulkanoCpp
vk::DeviceSize uniformBufferAlignment;
std::vector<std::vector<ManagedBuffer*>> toFree;
std::vector<ManagedBuffer*> recycleBuffers;
std::function<void(ManagedBuffer*)> freeFunction;
int buffers = -1, currentBuffer = -1;