Use RenderResource for uniform buffers

This commit is contained in:
Georg Hagen
2024-08-21 10:17:45 +02:00
parent 4ebaa622b4
commit 33c8b74342
5 changed files with 22 additions and 39 deletions

View File

@@ -6,20 +6,19 @@
#pragma once #pragma once
#include "Base/ICloseable.hpp" #include "Base/Render/RenderResource.hpp"
#include "Scene/Shader/DescriptorInputDescription.hpp" #include "Scene/Shader/DescriptorInputDescription.hpp"
#include "Scene/UpdateFrequency.hpp" #include "Scene/UpdateFrequency.hpp"
namespace OpenVulkano::Scene namespace OpenVulkano::Scene
{ {
class UniformBuffer class UniformBuffer : public RenderResourceHolder<UniformBuffer>
{ {
public: public:
static constexpr inline DescriptorSetLayoutBinding DESCRIPTOR_SET_LAYOUT_BINDING = { 0, DescriptorSetLayoutBinding::Type::TYPE_UNIFORM_BUFFER, 1, ShaderProgramType::ALL_GRAPHICS }; static constexpr inline DescriptorSetLayoutBinding DESCRIPTOR_SET_LAYOUT_BINDING = { 0, DescriptorSetLayoutBinding::Type::TYPE_UNIFORM_BUFFER, 1, ShaderProgramType::ALL_GRAPHICS };
DescriptorSetLayoutBinding binding; DescriptorSetLayoutBinding binding;
uint32_t setId; uint32_t setId;
ICloseable* renderBuffer = nullptr;
size_t size = 0; size_t size = 0;
const void* data = nullptr; const void* data = nullptr;
UpdateFrequency updateFrequency = UpdateFrequency::Never; UpdateFrequency updateFrequency = UpdateFrequency::Never;

View File

@@ -335,31 +335,29 @@ namespace OpenVulkano::Vulkan
VulkanUniformBuffer* ResourceManager::PrepareUniformBuffer(Scene::UniformBuffer* buffer) VulkanUniformBuffer* ResourceManager::PrepareUniformBuffer(Scene::UniformBuffer* buffer)
{ {
const std::unique_lock lock(mutex); const std::unique_lock lock(mutex);
if (buffer->renderBuffer) return static_cast<VulkanUniformBuffer*>(buffer->renderBuffer); if (buffer->HasRenderResource()) return static_cast<VulkanUniformBuffer*>(buffer->GetRenderResource());
VulkanUniformBuffer* vkBuffer; VulkanUniformBuffer* vkBuffer;
ManagedBuffer::Ptr mBuffer; ManagedBuffer::Ptr mBuffer;
const vk::DeviceSize allocSize = Utils::Align(buffer->size, uniformBufferAlignment); const vk::DeviceSize allocSize = Utils::Align(buffer->size, uniformBufferAlignment);
UniformBuffer* uBuffer = new UniformBuffer();
if (buffer->GetUpdateFrequency() != Scene::UpdateFrequency::Never) if (buffer->GetUpdateFrequency() != Scene::UpdateFrequency::Never)
{ {
vkBuffer = new VulkanUniformBufferDynamic();
const uint32_t imgs = context->swapChain.GetImageCount(); const uint32_t imgs = context->swapChain.GetImageCount();
mBuffer = memPool.CreateBuffer(imgs * allocSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible); mBuffer = memPool.CreateBuffer(imgs * allocSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible);
mBuffer->Map(); mBuffer->Map();
vkBuffer = new VulkanUniformBufferDynamic(buffer, uBuffer);
} }
else else
{ {
vkBuffer = new VulkanUniformBuffer();
mBuffer = CreateDeviceOnlyBufferWithData(Scene::Node::SIZE, vk::BufferUsageFlagBits::eUniformBuffer, buffer->data); mBuffer = CreateDeviceOnlyBufferWithData(Scene::Node::SIZE, vk::BufferUsageFlagBits::eUniformBuffer, buffer->data);
buffer->updated = false; buffer->updated = false;
vkBuffer = new VulkanUniformBuffer(buffer, uBuffer);
} }
UniformBuffer* uBuffer = new UniformBuffer();
const uint64_t s = mBuffer->size; const uint64_t s = mBuffer->size;
uBuffer->Init(std::move(mBuffer), 0, s, GetDescriptorLayoutSet(buffer->binding), buffer->binding, buffer->setId); uBuffer->Init(std::move(mBuffer), 0, s, GetDescriptorLayoutSet(buffer->binding), buffer->binding, buffer->setId);
vkBuffer->Init(buffer, uBuffer);
uniforms.emplace_back(vkBuffer); uniforms.emplace_back(vkBuffer);
return vkBuffer; return vkBuffer;
} }

View File

@@ -24,7 +24,7 @@ namespace OpenVulkano::Vulkan
{ {
vkTexture = drawContext->renderer->GetResourceManager().PrepareTexture(const_cast<Texture*>(texture)); vkTexture = drawContext->renderer->GetResourceManager().PrepareTexture(const_cast<Texture*>(texture));
} }
VulkanUniformBuffer* vkBuffer = static_cast<VulkanUniformBuffer*>(bgDrawable->GetBuffer().renderBuffer); VulkanUniformBuffer* vkBuffer = bgDrawable->GetBuffer().GetRenderResource();
if (!vkBuffer) if (!vkBuffer)
{ {
vkBuffer = drawContext->renderer->GetResourceManager().PrepareUniformBuffer(&bgDrawable->GetBuffer()); vkBuffer = drawContext->renderer->GetResourceManager().PrepareUniformBuffer(&bgDrawable->GetBuffer());

View File

@@ -6,7 +6,6 @@
#include "Scene/SimpleDrawable.hpp" #include "Scene/SimpleDrawable.hpp"
#include "Scene/Material.hpp" #include "Scene/Material.hpp"
#include "Scene/UniformBuffer.hpp"
#include "VulkanGeometry.hpp" #include "VulkanGeometry.hpp"
#include "VulkanNode.hpp" #include "VulkanNode.hpp"
#include "Vulkan/VulkanDrawContext.hpp" #include "Vulkan/VulkanDrawContext.hpp"
@@ -28,7 +27,7 @@ namespace OpenVulkano::Vulkan
if (drawable->GetBuffer()) if (drawable->GetBuffer())
{ {
VulkanUniformBuffer* vkBuffer = static_cast<VulkanUniformBuffer*>(drawable->GetBuffer()->renderBuffer); VulkanUniformBuffer* vkBuffer = drawable->GetBuffer()->GetRenderResource();
if (!vkBuffer) if (!vkBuffer)
{ {
vkBuffer = drawContext->renderer->GetResourceManager().PrepareUniformBuffer(drawable->GetBuffer()); vkBuffer = drawContext->renderer->GetResourceManager().PrepareUniformBuffer(drawable->GetBuffer());

View File

@@ -6,42 +6,31 @@
#pragma once #pragma once
#include "Base/ICloseable.hpp"
#include "IRecordable.hpp" #include "IRecordable.hpp"
#include "Scene/UniformBuffer.hpp" #include "Scene/UniformBuffer.hpp"
#include "Vulkan/Resources/UniformBuffer.hpp" #include "Vulkan/Resources/UniformBuffer.hpp"
namespace OpenVulkano::Vulkan namespace OpenVulkano::Vulkan
{ {
class VulkanUniformBuffer : public IRecordable, public ICloseable class VulkanUniformBuffer : public IRenderResource<Scene::UniformBuffer>, public IRecordable
{ {
public: public:
Scene::UniformBuffer* uBuffer = nullptr; Unique<UniformBuffer> buffer = nullptr;
UniformBuffer* buffer = nullptr;
~VulkanUniformBuffer() override ~VulkanUniformBuffer() override = default;
{
if (uBuffer) VulkanUniformBuffer::Close();
}
virtual void Init(Scene::UniformBuffer* uBuffer, UniformBuffer* uniformBuffer) VulkanUniformBuffer(Scene::UniformBuffer* sceneBuffer, UniformBuffer* uniformBuffer)
{ : IRenderResource<Scene::UniformBuffer>(sceneBuffer), buffer(uniformBuffer)
this->uBuffer = uBuffer; {}
this->buffer = uniformBuffer;
uBuffer->renderBuffer = this;
}
void Record(VulkanDrawContext* context) override void Record(VulkanDrawContext* context) override
{ {
buffer->Record(context); buffer->Record(context);
} }
void Close() override void Release() override
{ {
if (uBuffer) uBuffer->renderBuffer = nullptr; //TODO
delete buffer;
uBuffer = nullptr;
buffer = nullptr;
} }
}; };
@@ -49,18 +38,16 @@ namespace OpenVulkano::Vulkan
{ {
uint32_t lastUpdate = 0; uint32_t lastUpdate = 0;
void Init(Scene::UniformBuffer* buffer, UniformBuffer* uniformBuffer) override VulkanUniformBufferDynamic(Scene::UniformBuffer* sceneBuffer, UniformBuffer* uniformBuffer)
{ : VulkanUniformBuffer(sceneBuffer, uniformBuffer)
VulkanUniformBuffer::Init(buffer, uniformBuffer); {}
lastUpdate = -1;
}
void Record(VulkanDrawContext* context) override void Record(VulkanDrawContext* context) override
{ {
if(uBuffer->updated) //TODO fix if(GetOwner()->updated) //TODO fix
{ {
uBuffer->updated = false; GetOwner()->updated = false;
buffer->Update(uBuffer->data, uBuffer->size, context->currentImageId); buffer->Update(GetOwner()->data, GetOwner()->size, context->currentImageId);
} }
buffer->Record(context); buffer->Record(context);
} }