Merge branch 'wip'

This commit is contained in:
2024-09-12 22:17:37 +02:00
24 changed files with 346 additions and 244 deletions

View File

@@ -19,12 +19,12 @@ namespace OpenVulkano::Vulkan
ArBackgroundDrawable* bgDrawable = static_cast<ArBackgroundDrawable*>(instance);
bgDrawable->Tick();
const Texture* texture = bgDrawable->GetTexture();
VulkanTexture* vkTexture = static_cast<VulkanTexture*>(texture->renderTexture);
VulkanTexture* vkTexture = texture->GetRenderResource();
if (!vkTexture)
{
vkTexture = drawContext->renderer->GetResourceManager().PrepareTexture(const_cast<Texture*>(texture));
}
VulkanUniformBuffer* vkBuffer = static_cast<VulkanUniformBuffer*>(bgDrawable->GetBuffer().renderBuffer);
VulkanUniformBuffer* vkBuffer = bgDrawable->GetBuffer().GetRenderResource();
if (!vkBuffer)
{
vkBuffer = drawContext->renderer->GetResourceManager().PrepareUniformBuffer(&bgDrawable->GetBuffer());

View File

@@ -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"
@@ -21,14 +20,13 @@ namespace OpenVulkano::Vulkan
{
SimpleDrawable* drawable = static_cast<SimpleDrawable*>(instance);
Geometry* mesh = drawable->GetMesh();
VulkanGeometry* renderGeo = static_cast<VulkanGeometry*>(mesh->renderGeo);
VulkanGeometry* renderGeo = mesh->GetRenderResource();
if (!renderGeo) renderGeo = drawContext->renderer->GetResourceManager().PrepareGeometry(mesh);
renderGeo->RecordBind(drawContext->commandBuffer);
if (drawable->GetBuffer())
{
VulkanUniformBuffer* vkBuffer = static_cast<VulkanUniformBuffer*>(drawable->GetBuffer()->renderBuffer);
VulkanUniformBuffer* vkBuffer = drawable->GetBuffer()->GetRenderResource();
if (!vkBuffer)
{
vkBuffer = drawContext->renderer->GetResourceManager().PrepareUniformBuffer(drawable->GetBuffer());
@@ -40,11 +38,11 @@ namespace OpenVulkano::Vulkan
{
if (Texture* texture = material->texture)
{
VulkanTexture* renderTexture = static_cast<VulkanTexture*>(texture->renderTexture);
VulkanTexture* renderTexture = texture->GetRenderResource();
if (!renderTexture)
{
drawContext->renderer->GetResourceManager().PrepareMaterial(drawable->GetMaterial());
renderTexture = static_cast<VulkanTexture*>(texture->renderTexture);
renderTexture = texture->GetRenderResource();
}
renderTexture->Record(drawContext);
}

View File

@@ -6,41 +6,34 @@
#pragma once
#include "Base/ICloseable.hpp"
#include "Scene/Camera.hpp"
#include "IRecordable.hpp"
#include "Vulkan/Resources/UniformBuffer.hpp"
namespace OpenVulkano::Vulkan
{
class VulkanCamera : public ICloseable, public IRecordable
class VulkanCamera : public IRenderResource<Scene::Camera>, public IRecordable
{
Scene::Camera* m_camera = nullptr;
UniformBuffer* m_buffer = nullptr;
const Unique<UniformBuffer> m_buffer;
public:
~VulkanCamera() override { if (m_camera) VulkanCamera::Close(); }
VulkanCamera(Scene::Camera* camera, UniformBuffer* uniformBuffer)
: IRenderResource<Scene::Camera>(camera), m_buffer(uniformBuffer)
{}
void Init(Scene::Camera* camera, UniformBuffer* uniformBuffer)
{
m_camera = camera;
m_buffer = uniformBuffer;
}
~VulkanCamera() override = default;
void Record(VulkanDrawContext* context) override
{
m_buffer->Update(m_camera->GetData(), Scene::Camera::SIZE, context->currentImageId);
m_buffer->Update(GetCamera()->GetData(), Scene::Camera::SIZE, context->currentImageId);
m_buffer->Record(context);
}
void Close() override
{
m_camera->renderCamera = nullptr;
m_buffer->Close();
m_camera = nullptr;
delete m_buffer;
}
[[nodiscard]] Scene::Camera* GetCamera() const { return m_camera; }
[[nodiscard]] Scene::Camera* GetCamera() const { return GetOwner(); }
void Release() override
{
/* TODO */
}
};
}

View File

@@ -13,36 +13,21 @@
namespace OpenVulkano::Vulkan
{
class VulkanGeometry final : public ICloseable
class VulkanGeometry final : public IRenderResource<Scene::Geometry>
{
Scene::Geometry* m_geometry;
ManagedBuffer::Ptr m_vertexBuffer;
ManagedBuffer::Ptr m_indexBuffer;
vk::IndexType m_indexType;
vk::DeviceSize m_offsets = 0;
public:
VulkanGeometry() : m_geometry(nullptr), m_vertexBuffer(nullptr)
, m_indexBuffer(nullptr), m_indexType(vk::IndexType::eUint32)
{}
VulkanGeometry(Scene::Geometry* geo, ManagedBuffer::Ptr& vertexBuffer, ManagedBuffer::Ptr& indexBuffer)
: m_geometry(geo), m_vertexBuffer(std::move(vertexBuffer)), m_indexBuffer(std::move(indexBuffer))
: IRenderResource<Scene::Geometry>(geo)
, m_vertexBuffer(std::move(vertexBuffer)), m_indexBuffer(std::move(indexBuffer))
, m_indexType((geo->indexType == Scene::VertexIndexType::UINT16) ? vk::IndexType::eUint16 : vk::IndexType::eUint32)
{}
~VulkanGeometry() override
{
if (m_vertexBuffer) VulkanGeometry::Close();
}
void Init(Scene::Geometry* geo, ManagedBuffer::Ptr& vertexBuffer, ManagedBuffer::Ptr& indexBuffer)
{
m_geometry = geo;
m_vertexBuffer = std::move(vertexBuffer);
m_indexBuffer = std::move(indexBuffer);
m_indexType = (geo->indexType == Scene::VertexIndexType::UINT16) ? vk::IndexType::eUint16 : vk::IndexType::eUint32;
}
~VulkanGeometry() override = default;
void RecordBind(vk::CommandBuffer& cmdBuffer)
{
@@ -52,15 +37,13 @@ namespace OpenVulkano::Vulkan
void RecordDraw(vk::CommandBuffer& cmdBuffer)
{
if (m_geometry->GetIndexCount()) { cmdBuffer.drawIndexed(m_geometry->GetIndexCount(), 1, 0, 0, 0); }
else { cmdBuffer.draw(m_geometry->GetVertexCount(), 1, 0, 0); }
if (GetOwner()->GetIndexCount()) { cmdBuffer.drawIndexed(GetOwner()->GetIndexCount(), 1, 0, 0, 0); }
else { cmdBuffer.draw(GetOwner()->GetVertexCount(), 1, 0, 0); }
}
void Close() override
void Release() override
{
m_geometry->renderGeo = nullptr;
m_vertexBuffer.reset();
m_indexBuffer.reset();
//TODO
}
};
}

View File

@@ -6,28 +6,23 @@
#pragma once
#include "Base/ICloseable.hpp"
#include "Base/Render/RenderResource.hpp"
#include "IRecordable.hpp"
#include "Scene/Camera.hpp"
#include "Vulkan/Resources/UniformBuffer.hpp"
namespace OpenVulkano::Vulkan
{
class VulkanNode : public IRecordable, public ICloseable
class VulkanNode : public IRenderResource<Scene::Node>, public IRecordable
{
public:
Scene::Node* node = nullptr;
UniformBuffer* buffer = nullptr;
Unique<UniformBuffer> buffer = nullptr;
~VulkanNode() override
{
if (node) VulkanNode::Close();
}
~VulkanNode() override = default;
virtual void Init(Scene::Node* node, UniformBuffer* uniformBuffer)
VulkanNode(Scene::Node* node, UniformBuffer* uniformBuffer)
: IRenderResource<Scene::Node>(node), buffer(uniformBuffer)
{
this->node = node;
this->buffer = uniformBuffer;
}
void Record(VulkanDrawContext* context) override
@@ -35,12 +30,9 @@ namespace OpenVulkano::Vulkan
buffer->Record(context);
}
void Close() override
void Release() override
{
if (node) node->renderNode = nullptr;
delete buffer;
node = nullptr;
buffer = nullptr;
//TODO
}
};
@@ -48,18 +40,16 @@ namespace OpenVulkano::Vulkan
{
//uint32_t lastUpdate = -1;
void Init(Scene::Node* node, UniformBuffer* uniformBuffer) override
{
VulkanNode::Init(node, uniformBuffer);
//lastUpdate = -1;
}
VulkanNodeDynamic(Scene::Node* node, UniformBuffer* uniformBuffer)
: VulkanNode(node, uniformBuffer)
{}
void Record(VulkanDrawContext* context) override
{
//if(context->currentImageId != lastUpdate) //TODO fix
{
//lastUpdate = bufferId;
buffer->Update(&node->worldMat, sizeof(Math::Matrix4f), context->currentImageId);
buffer->Update(&GetOwner()->worldMat, sizeof(Math::Matrix4f), context->currentImageId);
}
buffer->Record(context);
}

View File

@@ -17,7 +17,8 @@ namespace OpenVulkano::Vulkan
VulkanShader::~VulkanShader()
{
if (shader) Close();
if (owner) owner->RemoveShader(this);
owner = nullptr;
device.destroyPipeline(pipeline);
for(auto& shaderModule : shaderModules)
{
@@ -28,12 +29,9 @@ namespace OpenVulkano::Vulkan
device.destroyDescriptorSetLayout(descriptorSetLayout);
}
void VulkanShader::Init(Context* context, Scene::Shader* shader, IShaderOwner* owner)
VulkanShader::VulkanShader(Context* context, Scene::Shader* shader, IShaderOwner* owner)
: IRenderResource<Scene::Shader>(shader), device(context->device->device), owner(owner), context(context)
{
this->device = context->device->device;
this->shader = shader;
this->owner = owner;
this->context = context;
shaderModules.reserve(shader->shaderPrograms.size());
shaderStageCreateInfo.resize(shader->shaderPrograms.size());
int i = 0;
@@ -45,11 +43,11 @@ namespace OpenVulkano::Vulkan
i++;
}
BuildPipeline();
shader->renderShader = this;
}
void VulkanShader::BuildPipeline()
{
Scene::Shader* shader = GetOwner();
std::vector<vk::VertexInputBindingDescription> vertexBindDesc;
std::vector<vk::VertexInputAttributeDescription> attributeDescriptions;
vertexBindDesc.reserve(shader->vertexInputDescriptions.size());
@@ -129,14 +127,6 @@ namespace OpenVulkano::Vulkan
context->commandBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline);
}
void VulkanShader::Close()
{
shader->renderShader = nullptr;
shader = nullptr;
if (owner) owner->RemoveShader(this);
owner = nullptr;
}
void VulkanShader::CreatePipelineLayout()
{
if (!descriptorSetLayouts.empty())
@@ -150,6 +140,7 @@ namespace OpenVulkano::Vulkan
descriptorSetLayouts.push_back(device.createDescriptorSetLayout({ {}, layoutBindings1.size(), layoutBindings1.data() }));
descriptorSetLayouts.push_back(device.createDescriptorSetLayout({ {}, layoutBindings2.size(), layoutBindings2.data() }));
Scene::Shader* shader = GetOwner();
for(const auto& set : shader->descriptorSets)
{
vk::DescriptorSetLayoutCreateInfo createInfo { {}, static_cast<uint32_t>(set.size()), reinterpret_cast<const vk::DescriptorSetLayoutBinding*>(set.data()) };
@@ -159,4 +150,9 @@ namespace OpenVulkano::Vulkan
vk::PipelineLayoutCreateInfo plci = {{}, static_cast<uint32_t>(descriptorSetLayouts.size()), descriptorSetLayouts.data(), static_cast<uint32_t>(shader->pushConstantRanges.size()), pcRanges };
pipelineLayout = this->device.createPipelineLayout(plci);
}
void VulkanShader::Release()
{
if (owner) owner->RemoveShader(this);
}
}

View File

@@ -7,26 +7,20 @@
#pragma once
#include "IRecordable.hpp"
#include "Base/ICloseable.hpp"
#include "Scene/Shader/Shader.hpp"
#include <vulkan/vulkan.hpp>
#include <vector>
namespace OpenVulkano
{
namespace Scene
{
class Shader;
}
namespace Vulkan
{
class Context;
class IShaderOwner;
class VulkanShader final : public ICloseable, public IRecordable
class VulkanShader final : public IRenderResource<Scene::Shader>, public IRecordable
{
public:
Scene::Shader* shader = nullptr;
vk::Device device;
std::vector<vk::ShaderModule> shaderModules; // TODO manage live time somewhere else to allow sharing of shader programs
std::vector<vk::PipelineShaderStageCreateInfo> shaderStageCreateInfo;
@@ -36,17 +30,15 @@ namespace OpenVulkano
IShaderOwner* owner = nullptr;
Context* context = nullptr;
VulkanShader() = default;
VulkanShader(Context* context, Scene::Shader* shader, IShaderOwner* owner);
~VulkanShader() override;
void Init(Context* context, Scene::Shader* shader, IShaderOwner* owner);
void Resize();
void Record(VulkanDrawContext* context) override;
void Close() override;
void Release() override;
private:
void BuildPipeline();

View File

@@ -16,28 +16,29 @@
namespace OpenVulkano::Vulkan
{
class VulkanTexture : public Scene::RenderTexture, public IRecordable, public Image
class VulkanTexture : public IRenderResource<Scene::Texture>, public IRecordable, public Image
{
public:
vk::Sampler m_sampler;
vk::DescriptorSet m_descriptorSet;
VulkanTexture() : IRenderResource<Scene::Texture>(nullptr) {}
virtual void Init(ResourceManager* resManager, Scene::Texture* texture, vk::DescriptorSetLayout* descriptorSetLayout, const DescriptorSetLayoutBinding& binding)
{
m_texture = texture;
Image::Init(resManager->GetContext()->device.get(), texture->format, { texture->resolution.x, texture->resolution.y, texture->resolution.z });
resManager->CopyDataToImage(m_texture->size, m_texture->textureBuffer, this);
resManager->CopyDataToImage(texture->size, texture->textureBuffer, this);
texture->updated = false;
m_sampler = resManager->CreateSampler(reinterpret_cast<const vk::SamplerCreateInfo&>(*texture->m_samplerConfig));
SetDescriptorSet(resManager, descriptorSetLayout, binding);
texture->renderTexture = this;
UpdateAddress(texture);
UpdateRenderResource(GetOwnerResource());
}
void InitSharedMem(ResourceManager* resManager, Scene::Texture* texture, vk::DescriptorSetLayout* descriptorSetLayout, const DescriptorSetLayoutBinding& binding)
{
m_texture = texture;
Image::Init(resManager->GetContext()->device.get(), texture->format, { texture->resolution.x, texture->resolution.y, texture->resolution.z }, vk::MemoryPropertyFlagBits::eDeviceLocal | vk::MemoryPropertyFlagBits::eHostVisible);
texture->updated = false;
texture->textureBuffer = Map();
@@ -45,7 +46,8 @@ namespace OpenVulkano::Vulkan
m_sampler = resManager->CreateSampler(reinterpret_cast<const vk::SamplerCreateInfo&>(*texture->m_samplerConfig));
SetDescriptorSet(resManager, descriptorSetLayout, binding);
texture->renderTexture = this;
UpdateAddress(texture);
UpdateRenderResource(GetOwnerResource());
}
virtual ~VulkanTexture() override
@@ -55,9 +57,8 @@ namespace OpenVulkano::Vulkan
void Close() override
{
ResetRenderResource(GetOwnerResource());
Image::Close();
if (m_texture) m_texture->renderTexture = nullptr;
m_texture = nullptr;
}
void SetDescriptorSet(ResourceManager* resManager, vk::DescriptorSetLayout* descriptorSetLayout, const DescriptorSetLayoutBinding& binding)
@@ -75,7 +76,7 @@ namespace OpenVulkano::Vulkan
void Record(VulkanDrawContext* context) override
{
int setId = -1, i = 0;
for (const auto& descriptorSet : context->GetShader()->shader->descriptorSets)
for (const auto& descriptorSet : context->GetShader()->GetOwner()->descriptorSets)
{
for (const auto& descriptor : descriptorSet)
{
@@ -106,6 +107,11 @@ namespace OpenVulkano::Vulkan
{
context->commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, context->GetShader()->pipelineLayout, setId, 1, &m_descriptorSet, 0, nullptr);
}
void Release() override
{
//TODO
}
};
class VulkanTextureDynamic : public VulkanTexture
@@ -118,20 +124,20 @@ namespace OpenVulkano::Vulkan
void Record(VulkanDrawContext* context) override
{
if(m_texture->updated)
if(GetOwner()->updated)
{
context->renderer->GetResourceManager().CopyDataToImage(m_texture->size, m_texture->textureBuffer, this);
m_texture->updated = false;
context->renderer->GetResourceManager().CopyDataToImage(GetOwner()->size, GetOwner()->textureBuffer, this);
GetOwner()->updated = false;
}
VulkanTexture::Record(context);
}
void Record(VulkanDrawContext* context, int setId) override
{
if(m_texture->updated)
if(GetOwner()->updated)
{
context->renderer->GetResourceManager().CopyDataToImage(m_texture->size, m_texture->textureBuffer, this);
m_texture->updated = false;
context->renderer->GetResourceManager().CopyDataToImage(GetOwner()->size, GetOwner()->textureBuffer, this);
GetOwner()->updated = false;
}
VulkanTexture::Record(context, setId);
}

View File

@@ -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<Scene::UniformBuffer>, public IRecordable
{
public:
Scene::UniformBuffer* uBuffer = nullptr;
UniformBuffer* buffer = nullptr;
Unique<UniformBuffer> 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<Scene::UniformBuffer>(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);
}