[WIP] Refactor creation of descriptorsets

This commit is contained in:
2023-08-30 23:11:11 +02:00
parent 5aec41ead4
commit 93c75763c7
19 changed files with 201 additions and 173 deletions

View File

@@ -6,17 +6,15 @@
#pragma once
#include "Vulkan/VulkanDrawContext.hpp"
#include <vulkan/vulkan.hpp>
namespace openVulkanoCpp
namespace openVulkanoCpp::Vulkan
{
namespace Vulkan
class IRecordable
{
class IRecordable
{
public:
virtual ~IRecordable() = default;
virtual void Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId) = 0;
};
}
public:
virtual ~IRecordable() = default;
virtual void Record(VulkanDrawContext* context) = 0;
};
}

View File

@@ -22,7 +22,7 @@ namespace openVulkanoCpp::Vulkan
for(Node* node : instance->GetNodes())
{
if (!node->renderNode) drawContext->renderer->GetResourceManager().PrepareNode(node);
static_cast<VulkanNode*>(node->renderNode)->Record(drawContext->commandBuffer, drawContext->currentImageId);
static_cast<VulkanNode*>(node->renderNode)->Record(drawContext);
renderGeo->RecordDraw(drawContext->commandBuffer);
}
}

View File

@@ -11,50 +11,47 @@
#include "Scene/Camera.hpp"
#include "Vulkan/Resources/UniformBuffer.hpp"
namespace openVulkanoCpp
namespace openVulkanoCpp::Vulkan
{
namespace Vulkan
struct VulkanNode : IRecordable, ICloseable
{
struct VulkanNode : IRecordable, ICloseable
Scene::Node* node = nullptr;
UniformBuffer* buffer = nullptr;
virtual void Init(Scene::Node* node, UniformBuffer* uniformBuffer)
{
Scene::Node* node = nullptr;
UniformBuffer* buffer = nullptr;
this->node = node;
this->buffer = uniformBuffer;
}
virtual void Init(Scene::Node* node, UniformBuffer* uniformBuffer)
{
this->node = node;
this->buffer = uniformBuffer;
}
void Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId) override
{
buffer->Record(cmdBuffer, 0);
}
void Close() override {}
};
struct VulkanNodeDynamic : VulkanNode
void Record(VulkanDrawContext* context) override
{
uint32_t lastUpdate = -1;
buffer->Record(context);
}
void Init(Scene::Node* node, UniformBuffer* uniformBuffer) override
void Close() override {}
};
struct VulkanNodeDynamic : VulkanNode
{
uint32_t lastUpdate = -1;
void Init(Scene::Node* node, UniformBuffer* uniformBuffer) override
{
VulkanNode::Init(node, uniformBuffer);
lastUpdate = -1;
}
void Record(VulkanDrawContext* context) override
{
//if(context->currentImageId != lastUpdate) //TODO fix
{
VulkanNode::Init(node, uniformBuffer);
lastUpdate = -1;
//lastUpdate = bufferId;
buffer->Update(&node->worldMat, sizeof(Math::Matrix4f), context->currentImageId);
}
buffer->Record(context);
}
void Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId) override
{
if(bufferId != lastUpdate)
{
lastUpdate = bufferId;
buffer->Update(&node->worldMat, sizeof(Math::Matrix4f), bufferId);
}
buffer->Record(cmdBuffer, bufferId);
}
void Close() override{}
};
}
void Close() override{}
};
}

View File

@@ -8,9 +8,12 @@
#include "Vulkan/Context.hpp"
#include "Scene/Shader/Shader.hpp"
#include "Vulkan/Resources/IShaderOwner.hpp"
#include "Scene/Shader/DescriptorInputDescription.hpp"
namespace openVulkanoCpp::Vulkan
{
static_assert(sizeof(vk::DescriptorSetLayoutBinding) == sizeof(DescriptorSetLayoutBinding));
VulkanShader::~VulkanShader()
{
if (!shader) return;
@@ -19,6 +22,8 @@ namespace openVulkanoCpp::Vulkan
{
device.destroyShaderModule(shaderModule);
}
device.destroyPipelineLayout(pipelineLayout);
device.destroyDescriptorSetLayout(descriptorSetLayout);
}
void VulkanShader::Init(Context* context, Scene::Shader* shader, IShaderOwner* owner)
@@ -98,10 +103,10 @@ namespace openVulkanoCpp::Vulkan
colorInfo.attachmentCount = 1;
colorInfo.pAttachments = &colorBlendAttachment;
CreatePipelineLayout();
vk::GraphicsPipelineCreateInfo pipelineCreateInfo = { {}, static_cast<uint32_t>(shaderStageCreateInfo.size()), shaderStageCreateInfo.data(), &pipelineVertexInputStateCreateInfo, &inputAssembly,
nullptr, &viewportStateCreateInfo, &rasterizer, &msaa, &depth, &colorInfo, nullptr, context->pipeline.pipelineLayout, context->swapChainRenderPass.renderPass };
nullptr, &viewportStateCreateInfo, &rasterizer, &msaa, &depth, &colorInfo, nullptr, pipelineLayout, context->swapChainRenderPass.renderPass };
pipeline = this->device.createGraphicsPipeline({}, pipelineCreateInfo).value;
}
@@ -111,13 +116,24 @@ namespace openVulkanoCpp::Vulkan
BuildPipeline();
}
void VulkanShader::Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId)
void VulkanShader::Record(VulkanDrawContext* context)
{
cmdBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline);
context->commandBuffer.bindPipeline(vk::PipelineBindPoint::eGraphics, pipeline);
}
void VulkanShader::Close()
{
owner->RemoveShader(this);
}
void VulkanShader::CreatePipelineLayout()
{
vk::PushConstantRange camPushConstantDesc = { vk::ShaderStageFlagBits::eVertex | vk::ShaderStageFlagBits::eFragment, 0, 3 * sizeof(Math::Matrix4f) + sizeof(Math::Vector4f) + 8 * sizeof(float) };
std::array<vk::PushConstantRange, 1> camPushConstantDescs = { camPushConstantDesc };
std::array<vk::DescriptorSetLayoutBinding, 1> layoutBindings = { reinterpret_cast<const vk::DescriptorSetLayoutBinding&>(NODE_LAYOUT_BINDING) };
vk::DescriptorSetLayoutCreateInfo dslci = { {}, layoutBindings.size(), layoutBindings.data() };
descriptorSetLayout = device.createDescriptorSetLayout(dslci);
vk::PipelineLayoutCreateInfo plci = { {}, 1, &descriptorSetLayout, camPushConstantDescs.size(), camPushConstantDescs.data() };
pipelineLayout = this->device.createPipelineLayout(plci);
}
}

View File

@@ -30,6 +30,8 @@ namespace openVulkanoCpp
std::vector<vk::ShaderModule> shaderModules; // TODO manage live time somewhere else to allow sharing of shader programs
std::vector<vk::PipelineShaderStageCreateInfo> shaderStageCreateInfo;
vk::Pipeline pipeline; // TODO pipeline and shader config should be split
vk::DescriptorSetLayout descriptorSetLayout;
vk::PipelineLayout pipelineLayout;
IShaderOwner* owner = nullptr;
Context* context = nullptr;
@@ -41,12 +43,14 @@ namespace openVulkanoCpp
void Resize();
void Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId) override;
void Record(VulkanDrawContext* context) override;
void Close() override;
private:
void BuildPipeline();
void CreatePipelineLayout();
};
}
}

View File

@@ -24,7 +24,7 @@ namespace openVulkanoCpp::Vulkan
texture->updated = false;
}
void Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId) override
void Record(VulkanDrawContext* context) override
{
//cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, )
}
@@ -42,15 +42,15 @@ namespace openVulkanoCpp::Vulkan
lastUpdate = -1;
}
void Record(vk::CommandBuffer& cmdBuffer, uint32_t bufferId) override
void Record(VulkanDrawContext* context) override
{
if(bufferId != lastUpdate && m_texture->updated)
/*if(bufferId != lastUpdate && m_texture->updated)
{
lastUpdate = bufferId;
resourceManager->CopyDataToImage(m_texture->size, m_texture->textureBuffer, this);
m_texture->updated = false;
}
VulkanTexture::Record(cmdBuffer, bufferId);
VulkanTexture::Record(cmdBuffer, bufferId);*/
}
};
}