Fix issue with freeing resources

This commit is contained in:
Georg Hagen
2024-07-11 13:22:01 +02:00
parent 22cb48be89
commit 313b01db1b
16 changed files with 300 additions and 156 deletions

View File

@@ -0,0 +1,64 @@
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#pragma once
#include "Data/Containers/Array.hpp"
#include <functional>
#include <memory>
#include <vector>
#include <vulkan/vulkan.hpp>
namespace OpenVulkano::Vulkan
{
class Device;
class MemoryAllocation;
class ManagedBuffer;
struct ManagedBufferDeleter;
class MemoryPool
{
Device* device;
std::vector<std::unique_ptr<MemoryAllocation>> allocations;
Array<std::vector<ManagedBuffer*>> toFree;
std::vector<ManagedBuffer*> recycleBuffers;
std::function<void(ManagedBuffer*)> freeFunction;
uint64_t currentBuffer = 0;
void DoFree(ManagedBuffer* buffer);
bool FreeBuffer(ManagedBuffer* buffer);
public:
using ManagedBufferPtr = std::unique_ptr<ManagedBuffer, ManagedBufferDeleter>;
MemoryPool();
~MemoryPool();
void Init(Device* dev, int bufferCount);
void StartFrame(uint64_t bufferId);
MemoryAllocation* CreateMemoryAllocation(size_t size, uint32_t type, bool addToCache = true);
MemoryAllocation* GetFreeMemoryAllocation(size_t size, vk::DeviceSize alignment, uint32_t type, bool createIfAllFull = true);
ManagedBufferPtr CreateBuffer(vk::DeviceSize size, const vk::BufferUsageFlags& usage, const vk::MemoryPropertyFlags& properties);
ManagedBufferPtr CreateSharedMemoryBuffer(size_t size);
static void ReleaseBuffer(ManagedBuffer* buffer);
};
struct ManagedBufferDeleter
{
void operator()(ManagedBuffer* buffer)
{
MemoryPool::ReleaseBuffer(buffer);
}
};
}