diff --git a/openVulkanoCpp/Scene/UniformBuffer.hpp b/openVulkanoCpp/Scene/UniformBuffer.hpp index f198c3e..ec6370a 100644 --- a/openVulkanoCpp/Scene/UniformBuffer.hpp +++ b/openVulkanoCpp/Scene/UniformBuffer.hpp @@ -6,20 +6,19 @@ #pragma once -#include "Base/ICloseable.hpp" +#include "Base/Render/RenderResource.hpp" #include "Scene/Shader/DescriptorInputDescription.hpp" #include "Scene/UpdateFrequency.hpp" namespace OpenVulkano::Scene { - class UniformBuffer + class UniformBuffer : public RenderResourceHolder { public: static constexpr inline DescriptorSetLayoutBinding DESCRIPTOR_SET_LAYOUT_BINDING = { 0, DescriptorSetLayoutBinding::Type::TYPE_UNIFORM_BUFFER, 1, ShaderProgramType::ALL_GRAPHICS }; DescriptorSetLayoutBinding binding; uint32_t setId; - ICloseable* renderBuffer = nullptr; size_t size = 0; const void* data = nullptr; UpdateFrequency updateFrequency = UpdateFrequency::Never; diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index fa4f719..7f40247 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -335,31 +335,29 @@ namespace OpenVulkano::Vulkan VulkanUniformBuffer* ResourceManager::PrepareUniformBuffer(Scene::UniformBuffer* buffer) { const std::unique_lock lock(mutex); - if (buffer->renderBuffer) return static_cast(buffer->renderBuffer); + if (buffer->HasRenderResource()) return static_cast(buffer->GetRenderResource()); VulkanUniformBuffer* vkBuffer; ManagedBuffer::Ptr mBuffer; const vk::DeviceSize allocSize = Utils::Align(buffer->size, uniformBufferAlignment); + UniformBuffer* uBuffer = new UniformBuffer(); if (buffer->GetUpdateFrequency() != Scene::UpdateFrequency::Never) { - vkBuffer = new VulkanUniformBufferDynamic(); const uint32_t imgs = context->swapChain.GetImageCount(); mBuffer = memPool.CreateBuffer(imgs * allocSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible); mBuffer->Map(); + vkBuffer = new VulkanUniformBufferDynamic(buffer, uBuffer); } else { - vkBuffer = new VulkanUniformBuffer(); mBuffer = CreateDeviceOnlyBufferWithData(Scene::Node::SIZE, vk::BufferUsageFlagBits::eUniformBuffer, buffer->data); buffer->updated = false; + vkBuffer = new VulkanUniformBuffer(buffer, uBuffer); } - - UniformBuffer* uBuffer = new UniformBuffer(); const uint64_t s = mBuffer->size; uBuffer->Init(std::move(mBuffer), 0, s, GetDescriptorLayoutSet(buffer->binding), buffer->binding, buffer->setId); - vkBuffer->Init(buffer, uBuffer); uniforms.emplace_back(vkBuffer); return vkBuffer; } diff --git a/openVulkanoCpp/Vulkan/Scene/ArBackgroundDrawableVulkanEncoder.cpp b/openVulkanoCpp/Vulkan/Scene/ArBackgroundDrawableVulkanEncoder.cpp index eec522c..dcdb1b1 100644 --- a/openVulkanoCpp/Vulkan/Scene/ArBackgroundDrawableVulkanEncoder.cpp +++ b/openVulkanoCpp/Vulkan/Scene/ArBackgroundDrawableVulkanEncoder.cpp @@ -24,7 +24,7 @@ namespace OpenVulkano::Vulkan { vkTexture = drawContext->renderer->GetResourceManager().PrepareTexture(const_cast(texture)); } - VulkanUniformBuffer* vkBuffer = static_cast(bgDrawable->GetBuffer().renderBuffer); + VulkanUniformBuffer* vkBuffer = bgDrawable->GetBuffer().GetRenderResource(); if (!vkBuffer) { vkBuffer = drawContext->renderer->GetResourceManager().PrepareUniformBuffer(&bgDrawable->GetBuffer()); diff --git a/openVulkanoCpp/Vulkan/Scene/SimpleDrawableVulkanEncoder.cpp b/openVulkanoCpp/Vulkan/Scene/SimpleDrawableVulkanEncoder.cpp index 54ba990..c943b89 100644 --- a/openVulkanoCpp/Vulkan/Scene/SimpleDrawableVulkanEncoder.cpp +++ b/openVulkanoCpp/Vulkan/Scene/SimpleDrawableVulkanEncoder.cpp @@ -6,7 +6,6 @@ #include "Scene/SimpleDrawable.hpp" #include "Scene/Material.hpp" -#include "Scene/UniformBuffer.hpp" #include "VulkanGeometry.hpp" #include "VulkanNode.hpp" #include "Vulkan/VulkanDrawContext.hpp" @@ -28,7 +27,7 @@ namespace OpenVulkano::Vulkan if (drawable->GetBuffer()) { - VulkanUniformBuffer* vkBuffer = static_cast(drawable->GetBuffer()->renderBuffer); + VulkanUniformBuffer* vkBuffer = drawable->GetBuffer()->GetRenderResource(); if (!vkBuffer) { vkBuffer = drawContext->renderer->GetResourceManager().PrepareUniformBuffer(drawable->GetBuffer()); diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanUniformBuffer.hpp b/openVulkanoCpp/Vulkan/Scene/VulkanUniformBuffer.hpp index 2d50c9a..412ffd5 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanUniformBuffer.hpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanUniformBuffer.hpp @@ -6,42 +6,31 @@ #pragma once -#include "Base/ICloseable.hpp" #include "IRecordable.hpp" #include "Scene/UniformBuffer.hpp" #include "Vulkan/Resources/UniformBuffer.hpp" namespace OpenVulkano::Vulkan { - class VulkanUniformBuffer : public IRecordable, public ICloseable + class VulkanUniformBuffer : public IRenderResource, public IRecordable { public: - Scene::UniformBuffer* uBuffer = nullptr; - UniformBuffer* buffer = nullptr; + Unique buffer = nullptr; - ~VulkanUniformBuffer() override - { - if (uBuffer) VulkanUniformBuffer::Close(); - } + ~VulkanUniformBuffer() override = default; - virtual void Init(Scene::UniformBuffer* uBuffer, UniformBuffer* uniformBuffer) - { - this->uBuffer = uBuffer; - this->buffer = uniformBuffer; - uBuffer->renderBuffer = this; - } + VulkanUniformBuffer(Scene::UniformBuffer* sceneBuffer, UniformBuffer* uniformBuffer) + : IRenderResource(sceneBuffer), buffer(uniformBuffer) + {} void Record(VulkanDrawContext* context) override { buffer->Record(context); } - void Close() override + void Release() override { - if (uBuffer) uBuffer->renderBuffer = nullptr; - delete buffer; - uBuffer = nullptr; - buffer = nullptr; + //TODO } }; @@ -49,18 +38,16 @@ namespace OpenVulkano::Vulkan { uint32_t lastUpdate = 0; - void Init(Scene::UniformBuffer* buffer, UniformBuffer* uniformBuffer) override - { - VulkanUniformBuffer::Init(buffer, uniformBuffer); - lastUpdate = -1; - } + VulkanUniformBufferDynamic(Scene::UniformBuffer* sceneBuffer, UniformBuffer* uniformBuffer) + : VulkanUniformBuffer(sceneBuffer, uniformBuffer) + {} void Record(VulkanDrawContext* context) override { - if(uBuffer->updated) //TODO fix + if(GetOwner()->updated) //TODO fix { - uBuffer->updated = false; - buffer->Update(uBuffer->data, uBuffer->size, context->currentImageId); + GetOwner()->updated = false; + buffer->Update(GetOwner()->data, GetOwner()->size, context->currentImageId); } buffer->Record(context); }