Improve resource handling

This commit is contained in:
2021-01-08 22:11:00 +01:00
parent dea40fea84
commit 412613c757
6 changed files with 202 additions and 171 deletions

View File

@@ -59,6 +59,8 @@ namespace openVulkanoCpp
void SetMatrix(const Math::Matrix4f& mat);
[[nodiscard]] Math::Matrix3f GetRotationMatrix() const { return static_cast<const Math::Matrix3f>(localMat); }
[[nodiscard]] const Math::Matrix4f& GetMatrix() const { return localMat; }
[[nodiscard]] const Math::Matrix4f& GetWorldMatrix() const { return worldMat; }

View File

@@ -150,10 +150,11 @@ namespace openVulkanoCpp::Vulkan
{
Scene::Drawable* drawable = *drawablePointer;
Scene::Geometry* mesh = drawable->mesh;
VulkanGeometry* renderGeo = dynamic_cast<VulkanGeometry*>(mesh->renderGeo);
if (mesh != lastGeo)
{
if (!mesh->renderGeo) resourceManager.PrepareGeometry(mesh);
dynamic_cast<VulkanGeometry*>(mesh->renderGeo)->Record(cmdHelper->cmdBuffer, currentImageId);
if (!mesh->renderGeo) renderGeo = resourceManager.PrepareGeometry(mesh);
renderGeo->RecordBind(cmdHelper->cmdBuffer);
lastGeo = mesh;
}
for(Scene::Node* node : drawable->nodes)
@@ -164,7 +165,7 @@ namespace openVulkanoCpp::Vulkan
dynamic_cast<VulkanNode*>(node->renderNode)->Record(cmdHelper->cmdBuffer, currentImageId);
lastNode = node;
}
cmdHelper->cmdBuffer.drawIndexed(mesh->GetIndexCount(), 1, 0, 0, 0);
renderGeo->RecordDraw(cmdHelper->cmdBuffer);
}
}
cmdHelper->cmdBuffer.end();

View File

@@ -10,9 +10,7 @@
#include <vulkan/vulkan.hpp>
namespace openVulkanoCpp
{
namespace Vulkan
namespace openVulkanoCpp::Vulkan
{
struct MemoryAllocation
{
@@ -63,7 +61,7 @@ namespace openVulkanoCpp
}
}
bool IsChildMapped() const
[[nodiscard]] bool IsChildMapped() const
{
return mappedCount & CHILD_MAPPED_FLAG;
}
@@ -96,12 +94,12 @@ namespace openVulkanoCpp
vk::MemoryPropertyFlags properties;
void* mapped = nullptr;
bool IsLast() const
[[nodiscard]] bool IsLast() const
{
return (offset + size == allocation->used);
}
bool IsMapped() const
[[nodiscard]] bool IsMapped() const
{
return mapped || allocation->mapped;
}
@@ -178,4 +176,3 @@ namespace openVulkanoCpp
}
};
}
}

View File

@@ -12,6 +12,8 @@
namespace openVulkanoCpp::Vulkan
{
ResourceManager* ResourceManager::INSTANCE;
ResourceManager::ResourceManager() = default;
ResourceManager::~ResourceManager() noexcept
@@ -39,6 +41,8 @@ namespace openVulkanoCpp::Vulkan
toFree.resize(buffers);
transferQueue = this->device.getQueue(context->device->queueIndices.transfer, 0);
INSTANCE = this;
}
void ResourceManager::Close()
@@ -82,17 +86,18 @@ namespace openVulkanoCpp::Vulkan
}
}
void ResourceManager::PrepareGeometry(Scene::Geometry* geometry)
VulkanGeometry* ResourceManager::PrepareGeometry(Scene::Geometry* geometry)
{
const std::unique_lock lock(mutex);
if(!geometry->renderGeo)
{
VulkanGeometry* vkGeometry = new VulkanGeometry();
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());
vkGeometry->Init(geometry, vertexBuffer->buffer, indexBuffer->buffer);
geometry->renderGeo = vkGeometry;
VulkanGeometry* vkGeo = new VulkanGeometry(geometry, vertexBuffer, indexBuffer);
geometry->renderGeo = vkGeo;
return vkGeo;
}
return dynamic_cast<VulkanGeometry*>(geometry->renderGeo);
}
void ResourceManager::PrepareMaterial(Scene::Material* material)
@@ -131,6 +136,13 @@ namespace openVulkanoCpp::Vulkan
}
}
ManagedBuffer* ResourceManager::CreateSharedMemoryBuffer(const size_t size)
{
const std::unique_lock lock(mutex);
ManagedBuffer* buffer = CreateBuffer(size, vk::BufferUsageFlagBits::eVertexBuffer, vk::MemoryPropertyFlagBits::eHostCoherent);
return buffer;
}
void ResourceManager::RemoveShader(VulkanShader* shader)
{
Utils::Remove(shaders, shader);

View File

@@ -23,6 +23,8 @@ namespace openVulkanoCpp
namespace Vulkan
{
class VulkanGeometry;
class ResourceManager : virtual public ICloseable, virtual public IShaderOwner
{
Context* context;
@@ -42,7 +44,10 @@ namespace openVulkanoCpp
int buffers = -1, currentBuffer = -1;
public:
static ResourceManager* INSTANCE;
ResourceManager();
virtual ~ResourceManager() noexcept;
void Init(Context* context, int buffers = 2);
@@ -55,7 +60,7 @@ namespace openVulkanoCpp
void Resize();
void PrepareGeometry(Scene::Geometry* geometry);
VulkanGeometry* PrepareGeometry(Scene::Geometry* geometry);
void PrepareMaterial(Scene::Material* material);
@@ -63,6 +68,8 @@ namespace openVulkanoCpp
void RemoveShader(VulkanShader* shader) override;
ManagedBuffer* CreateSharedMemoryBuffer(size_t size);
protected: // Allocation management
void FreeBuffer(ManagedBuffer* buffer);

View File

@@ -9,40 +9,52 @@
#include "IRecordable.hpp"
#include "Scene/Scene.hpp"
namespace openVulkanoCpp
namespace openVulkanoCpp::Vulkan
{
namespace Vulkan
class VulkanGeometry final : virtual public ICloseable
{
class VulkanGeometry : virtual public IRecordable, virtual public ICloseable
{
Scene::Geometry* geometry = nullptr;
vk::Buffer vertexBuffer, indexBuffer;
vk::IndexType indexType;
vk::DeviceSize* offsets = new vk::DeviceSize();
Scene::Geometry* m_geometry;
ManagedBuffer* m_vertexBuffer;
ManagedBuffer* m_indexBuffer;
vk::IndexType m_indexType;
vk::DeviceSize m_offsets = 0;
public:
VulkanGeometry() = default;
virtual ~VulkanGeometry() { if (vertexBuffer) VulkanGeometry::Close(); };
VulkanGeometry() : m_geometry(nullptr), m_vertexBuffer(nullptr)
, m_indexBuffer(nullptr), m_indexType(vk::IndexType::eUint32)
{}
void Init(Scene::Geometry* geo, vk::Buffer vertexBuffer, vk::Buffer indexBuffer)
VulkanGeometry(Scene::Geometry* geo, ManagedBuffer* vertexBuffer, ManagedBuffer* indexBuffer)
: m_geometry(geo), m_vertexBuffer(vertexBuffer), m_indexBuffer(indexBuffer)
, m_indexType((geo->indexType == Scene::VertexIndexType::UINT16) ? vk::IndexType::eUint16 : vk::IndexType::eUint32)
{}
~VulkanGeometry() override
{
this->geometry = geo;
offsets[0] = 0;
indexType = (geo->indexType == Scene::VertexIndexType::UINT16) ? vk::IndexType::eUint16 : vk::IndexType::eUint32;
this->vertexBuffer = vertexBuffer;
this->indexBuffer = indexBuffer;
if (m_vertexBuffer) VulkanGeometry::Close();
}
void Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId) override
void Init(Scene::Geometry* geo, ManagedBuffer* vertexBuffer, ManagedBuffer* indexBuffer)
{
cmdBuffer.bindVertexBuffers(0, 1, &vertexBuffer, offsets);
cmdBuffer.bindIndexBuffer(indexBuffer, 0, indexType);
m_geometry = geo;
m_vertexBuffer = vertexBuffer;
m_indexBuffer = indexBuffer;
m_indexType = (geo->indexType == Scene::VertexIndexType::UINT16) ? vk::IndexType::eUint16 : vk::IndexType::eUint32;
}
void RecordBind(vk::CommandBuffer& cmdBuffer)
{
cmdBuffer.bindVertexBuffers(0, 1, &m_vertexBuffer->buffer, &m_offsets);
cmdBuffer.bindIndexBuffer(m_indexBuffer->buffer, 0, m_indexType);
}
void RecordDraw(vk::CommandBuffer& cmdBuffer)
{
cmdBuffer.drawIndexed(m_geometry->GetIndexCount(), 1, 0, 0, 0);
}
void Close() override
{
}
};
}
}