Free resources when VulkanGeometry is freed
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user