Add VertexBuffer class

This commit is contained in:
Georg Hagen
2025-01-04 20:56:53 +01:00
parent 8250b2a396
commit 6ccef62ad3
4 changed files with 122 additions and 1 deletions

View File

@@ -5,6 +5,9 @@
*/
#include "ResourceManager.hpp"
#include <Scene/VertexBuffer.hpp>
#include "ManagedBuffer.hpp"
#include "MemoryAllocation.hpp"
#include "Scene/Vertex.hpp"
@@ -21,6 +24,7 @@
#include "Vulkan/Scene/VulkanTexture.hpp"
#include "Vulkan/Scene/VulkanCamera.hpp"
#include "Vulkan/Scene/VulkanUniformBuffer.hpp"
#include "Vulkan/Scene/VulkanVertexBuffer.hpp"
namespace OpenVulkano::Vulkan
{
@@ -173,6 +177,21 @@ namespace OpenVulkano::Vulkan
return geometry->GetRenderResource();
}
VulkanVertexBuffer* ResourceManager::PrepareVertexBuffer(Scene::VertexBuffer* vbo)
{
const std::unique_lock lock(mutex);
if(!vbo->HasRenderResource())
{
ManagedBuffer::Ptr vertexBuffer =
CreateDeviceOnlyBufferWithData(vbo->size, vk::BufferUsageFlagBits::eVertexBuffer, vbo->data);
ManagedBuffer::Ptr indexBuffer;
VulkanVertexBuffer* vkVbo = new VulkanVertexBuffer(vbo, vertexBuffer);
vertexBuffers.emplace_back(vkVbo);
return vkVbo;
}
return vbo->GetRenderResource();
}
void ResourceManager::PrepareMaterial(Scene::Material* material)
{
if (material->texture && !material->texture->HasRenderResource())

View File

@@ -34,6 +34,7 @@ namespace OpenVulkano
class Shader;
class Camera;
class UniformBuffer;
class VertexBuffer;
}
namespace Vulkan
@@ -45,11 +46,12 @@ namespace OpenVulkano
class VulkanNode;
class VulkanShader;
class VulkanUniformBuffer;
class VulkanVertexBuffer;
class UniformBuffer;
class ManagedBuffer;
class MemoryAllocation;
class ResourceManager : public IShaderOwner, public IResourceManager
class ResourceManager final : public IShaderOwner, public IResourceManager
{
friend UniformBuffer;
friend VulkanTexture;
@@ -63,6 +65,7 @@ namespace OpenVulkano
MemoryPool memPool;
std::vector<Unique<VulkanShader>> shaders;
std::vector<Unique<VulkanGeometry>> geometries;
std::vector<Unique<VulkanVertexBuffer>> vertexBuffers;
std::vector<Unique<VulkanNode>> nodes;
std::vector<Unique<VulkanTexture>> textures;
std::vector<Unique<VulkanCamera>> cameras;
@@ -100,6 +103,8 @@ namespace OpenVulkano
VulkanUniformBuffer* PrepareUniformBuffer(Scene::UniformBuffer* buffer);
VulkanVertexBuffer* PrepareVertexBuffer(Scene::VertexBuffer* vbo);
VulkanNode* PrepareNode(Scene::Node* node);
VulkanTexture* PrepareTexture(Scene::Texture* texture);

View File

@@ -0,0 +1,43 @@
/*
* 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 "IRecordable.hpp"
#include "Scene/Scene.hpp"
#include "Scene/VertexBuffer.hpp"
#include "Vulkan/Resources/ManagedBuffer.hpp"
namespace OpenVulkano::Vulkan
{
class VulkanVertexBuffer final : public IRenderResource<Scene::VertexBuffer>
{
ManagedBuffer::Ptr m_vertexBuffer;
public:
VulkanVertexBuffer(Scene::VertexBuffer* vbo, ManagedBuffer::Ptr& vertexBuffer)
: IRenderResource<Scene::VertexBuffer>(vbo) , m_vertexBuffer(std::move(vertexBuffer))
{}
~VulkanVertexBuffer() override = default;
void RecordBind(vk::CommandBuffer& cmdBuffer)
{
const vk::DeviceSize m_offsets = 0;
cmdBuffer.bindVertexBuffers(0, 1, &m_vertexBuffer->buffer, &m_offsets);
}
void RecordDraw(vk::CommandBuffer& cmdBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex = 0, uint32_t firstInstance = 0)
{
cmdBuffer.draw(vertexCount, instanceCount, firstVertex, firstInstance);
}
void Release() override
{
//TODO
}
};
}