From 6ccef62ad350aea40c170e5e942cc9553df8d3c1 Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Sat, 4 Jan 2025 20:56:53 +0100 Subject: [PATCH] Add VertexBuffer class --- openVulkanoCpp/Scene/VertexBuffer.hpp | 54 +++++++++++++++++++ .../Vulkan/Resources/ResourceManager.cpp | 19 +++++++ .../Vulkan/Resources/ResourceManager.hpp | 7 ++- .../Vulkan/Scene/VulkanVertexBuffer.hpp | 43 +++++++++++++++ 4 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 openVulkanoCpp/Scene/VertexBuffer.hpp create mode 100644 openVulkanoCpp/Vulkan/Scene/VulkanVertexBuffer.hpp diff --git a/openVulkanoCpp/Scene/VertexBuffer.hpp b/openVulkanoCpp/Scene/VertexBuffer.hpp new file mode 100644 index 0000000..3655881 --- /dev/null +++ b/openVulkanoCpp/Scene/VertexBuffer.hpp @@ -0,0 +1,54 @@ +/* + * 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 "Base/Render/RenderResource.hpp" +#include "Scene/UpdateFrequency.hpp" + +namespace OpenVulkano::Scene +{ + class VertexBuffer final : public RenderResourceHolder + { + public: + size_t size = 0; + const void* data = nullptr; + UpdateFrequency updateFrequency = UpdateFrequency::Never; + bool updated = true; + bool ownsMemory = true; + + ~VertexBuffer() { Close(); } + + void Init(size_t size, const void* data) + { + this->size = size; + this->data = data; + this->ownsMemory = false; + } + + void Init(size_t size) + { + this->size = size; + this->data = malloc(size); + this->ownsMemory = true; + } + + template + T* Init(size_t count) + { + Init(count * sizeof(T)); + return static_cast(const_cast(data)); + } + + void Close() + { + if (ownsMemory && data) free(const_cast(data)); + data = nullptr; + } + + UpdateFrequency GetUpdateFrequency() const { return updateFrequency; } + }; +} \ No newline at end of file diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index 452e907..bd88819 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -5,6 +5,9 @@ */ #include "ResourceManager.hpp" + +#include + #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()) diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp index 9274a32..100c767 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp @@ -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> shaders; std::vector> geometries; + std::vector> vertexBuffers; std::vector> nodes; std::vector> textures; std::vector> 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); diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanVertexBuffer.hpp b/openVulkanoCpp/Vulkan/Scene/VulkanVertexBuffer.hpp new file mode 100644 index 0000000..f774ab9 --- /dev/null +++ b/openVulkanoCpp/Vulkan/Scene/VulkanVertexBuffer.hpp @@ -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 + { + ManagedBuffer::Ptr m_vertexBuffer; + + public: + VulkanVertexBuffer(Scene::VertexBuffer* vbo, ManagedBuffer::Ptr& vertexBuffer) + : IRenderResource(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 + } + }; +}