[WIP] Refactor creation of descriptorsets
This commit is contained in:
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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{}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -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);*/
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user