Use RenderResource for uniform buffers
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user