Improve resource handling
This commit is contained in:
@@ -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* m_geometry;
|
||||
ManagedBuffer* m_vertexBuffer;
|
||||
ManagedBuffer* 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(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
|
||||
{
|
||||
Scene::Geometry* geometry = nullptr;
|
||||
vk::Buffer vertexBuffer, indexBuffer;
|
||||
vk::IndexType indexType;
|
||||
vk::DeviceSize* offsets = new vk::DeviceSize();
|
||||
if (m_vertexBuffer) VulkanGeometry::Close();
|
||||
}
|
||||
|
||||
public:
|
||||
VulkanGeometry() = default;
|
||||
virtual ~VulkanGeometry() { if (vertexBuffer) VulkanGeometry::Close(); };
|
||||
void Init(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;
|
||||
}
|
||||
|
||||
void Init(Scene::Geometry* geo, vk::Buffer vertexBuffer, vk::Buffer indexBuffer)
|
||||
{
|
||||
this->geometry = geo;
|
||||
offsets[0] = 0;
|
||||
indexType = (geo->indexType == Scene::VertexIndexType::UINT16) ? vk::IndexType::eUint16 : vk::IndexType::eUint32;
|
||||
this->vertexBuffer = vertexBuffer;
|
||||
this->indexBuffer = indexBuffer;
|
||||
}
|
||||
void RecordBind(vk::CommandBuffer& cmdBuffer)
|
||||
{
|
||||
cmdBuffer.bindVertexBuffers(0, 1, &m_vertexBuffer->buffer, &m_offsets);
|
||||
cmdBuffer.bindIndexBuffer(m_indexBuffer->buffer, 0, m_indexType);
|
||||
}
|
||||
|
||||
void Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId) override
|
||||
{
|
||||
cmdBuffer.bindVertexBuffers(0, 1, &vertexBuffer, offsets);
|
||||
cmdBuffer.bindIndexBuffer(indexBuffer, 0, indexType);
|
||||
}
|
||||
void RecordDraw(vk::CommandBuffer& cmdBuffer)
|
||||
{
|
||||
cmdBuffer.drawIndexed(m_geometry->GetIndexCount(), 1, 0, 0, 0);
|
||||
}
|
||||
|
||||
void Close() override
|
||||
{
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
void Close() override
|
||||
{
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user