From be7a48dc09f05e980071a3a51645b10e1923202d Mon Sep 17 00:00:00 2001 From: GeorgH93 Date: Fri, 1 Sep 2023 14:59:11 +0200 Subject: [PATCH] Allow custom input descriptors --- openVulkanoCpp/Scene/Camera.hpp | 5 +++-- .../Shader/DescriptorInputDescription.hpp | 7 ++----- openVulkanoCpp/Scene/Shader/Shader.hpp | 19 ++++++++++--------- .../Vulkan/Resources/ResourceManager.cpp | 12 ++++++++++++ .../Vulkan/Resources/ResourceManager.hpp | 2 ++ .../Vulkan/Resources/UniformBuffer.hpp | 2 +- openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp | 14 ++++++++++---- 7 files changed, 40 insertions(+), 21 deletions(-) diff --git a/openVulkanoCpp/Scene/Camera.hpp b/openVulkanoCpp/Scene/Camera.hpp index 3b145ed..7d1cfba 100644 --- a/openVulkanoCpp/Scene/Camera.hpp +++ b/openVulkanoCpp/Scene/Camera.hpp @@ -15,6 +15,9 @@ namespace openVulkanoCpp::Scene { class Camera : public Node { + public: + ICloseable* renderCamera = nullptr; + protected: Math::Matrix4f m_viewProjection{1}, m_view{1}, m_projection{1}; Math::Vector4f m_camPosition{}; @@ -35,8 +38,6 @@ namespace openVulkanoCpp::Scene public: static constexpr size_t SIZE = sizeof(Math::Matrix4f) * 3 + sizeof(Math::Vector4f) + sizeof(float) * 8; - ICloseable* renderCamera = nullptr; - void* GetData() { return &m_viewProjection; } void Init(float width, float height, float nearPlane, float farPlane) diff --git a/openVulkanoCpp/Scene/Shader/DescriptorInputDescription.hpp b/openVulkanoCpp/Scene/Shader/DescriptorInputDescription.hpp index 7cbd7fb..69af433 100644 --- a/openVulkanoCpp/Scene/Shader/DescriptorInputDescription.hpp +++ b/openVulkanoCpp/Scene/Shader/DescriptorInputDescription.hpp @@ -56,11 +56,8 @@ namespace openVulkanoCpp constexpr bool operator <(const DescriptorSetLayoutBinding& rhs) const { - return bindingId < rhs.bindingId && - descriptorType < rhs.descriptorType && - descriptorCount < rhs.descriptorCount && - stageFlags < rhs.stageFlags && - immutableSamplers < rhs.immutableSamplers; + return std::tie(bindingId, descriptorType, descriptorCount, stageFlags, immutableSamplers) < + std::tie(rhs.bindingId, rhs.descriptorType, rhs.descriptorCount, rhs.stageFlags, rhs.immutableSamplers); } }; diff --git a/openVulkanoCpp/Scene/Shader/Shader.hpp b/openVulkanoCpp/Scene/Shader/Shader.hpp index d06174a..dd8b32a 100644 --- a/openVulkanoCpp/Scene/Shader/Shader.hpp +++ b/openVulkanoCpp/Scene/Shader/Shader.hpp @@ -71,7 +71,7 @@ namespace openVulkanoCpp::Scene public: std::vector shaderPrograms{}; std::vector vertexInputDescriptions{}; - std::vector descriptorSetLayoutBindings{}; + std::vector> descriptorSets; Topology topology = Topology::TRIANGLE_LIST; CullMode cullMode = CullMode::BACK; ICloseable* renderShader = nullptr; @@ -121,22 +121,23 @@ namespace openVulkanoCpp::Scene return *this; } - Shader& AddDescriptorSetLayoutBinding(const DescriptorSetLayoutBinding& binding, int bindingId = -1) + Shader& AddDescriptorSetLayoutBinding(const DescriptorSetLayoutBinding& binding, int setId = -1) { CheckShaderInitState(); - if (bindingId < 0) bindingId = static_cast(descriptorSetLayoutBindings.size()); - while (bindingId > descriptorSetLayoutBindings.size()) + if (setId < 0) setId = static_cast(descriptorSets.size() + 2); + if (setId < 2) throw std::runtime_error("Cant bind set id 0 or 1!"); + setId -= 2; + while (setId >= descriptorSets.size()) { - descriptorSetLayoutBindings.emplace_back().bindingId = descriptorSetLayoutBindings.size() - 1; + descriptorSets.emplace_back(); } - if (bindingId == vertexInputDescriptions.size()) + if (setId == vertexInputDescriptions.size()) { - descriptorSetLayoutBindings.emplace_back(bindingId, binding); + descriptorSets.emplace_back().push_back(binding); } else { - descriptorSetLayoutBindings[bindingId] = binding; - descriptorSetLayoutBindings[bindingId].bindingId = bindingId; + descriptorSets[setId].push_back(binding); } return *this; } diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp index 63e48bc..a99ff27 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.cpp @@ -189,6 +189,18 @@ namespace openVulkanoCpp::Vulkan } } + UniformBuffer* ResourceManager::CreateUniformBuffer(const DescriptorSetLayoutBinding& binding, size_t size, void* data, uint32_t setId) + { + const std::unique_lock lock(mutex); + const vk::DeviceSize allocSize = Utils::Align(size, uniformBufferAlignment); + + auto buffer = CreateDeviceOnlyBufferWithData(allocSize, vk::BufferUsageFlagBits::eUniformBuffer, data); + + UniformBuffer* uBuffer = new UniformBuffer(); + uBuffer->Init(buffer, 0, allocSize, GetDescriptorLayoutSet(binding), binding, setId); + return uBuffer; + } + vk::DescriptorSetLayout* ResourceManager::GetDescriptorLayoutSet(const DescriptorSetLayoutBinding& descriptorSetLayoutBinding) { auto& layout = descriptorSetLayoutCache[descriptorSetLayoutBinding]; diff --git a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp index ee88c8b..fb9b7cb 100644 --- a/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp +++ b/openVulkanoCpp/Vulkan/Resources/ResourceManager.hpp @@ -97,6 +97,8 @@ namespace openVulkanoCpp [[nodiscard]] vk::Device GetDevice() const { return device; } + UniformBuffer* CreateUniformBuffer(const DescriptorSetLayoutBinding& binding, size_t size, void* data, uint32_t setId = 2); + protected: // Allocation management void DoFreeBuffer(ManagedBuffer* buffer); diff --git a/openVulkanoCpp/Vulkan/Resources/UniformBuffer.hpp b/openVulkanoCpp/Vulkan/Resources/UniformBuffer.hpp index 7a893bf..774eb34 100644 --- a/openVulkanoCpp/Vulkan/Resources/UniformBuffer.hpp +++ b/openVulkanoCpp/Vulkan/Resources/UniformBuffer.hpp @@ -51,7 +51,7 @@ namespace openVulkanoCpp::Vulkan void Record(VulkanDrawContext* drawContext) override { uint32_t frameOffset = m_frameOffset * drawContext->currentImageId; - drawContext->commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, drawContext->GetShader()->pipelineLayout, m_setOffset, m_setCount, &m_descriptorSet, 1, &frameOffset); + drawContext->commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, drawContext->GetShader()->pipelineLayout, m_setOffset, m_setCount, &m_descriptorSet, (m_frameOffset) ? 1 : 0, &frameOffset); } void Update(void* data, uint32_t size, uint32_t bufferId) const diff --git a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp index 6183582..e235d72 100644 --- a/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp +++ b/openVulkanoCpp/Vulkan/Scene/VulkanShader.cpp @@ -133,10 +133,16 @@ namespace openVulkanoCpp::Vulkan //std::array camPushConstantDescs = { camPushConstantDesc }; std::array layoutBindings1 = { reinterpret_cast(NODE_LAYOUT_BINDING) }; std::array layoutBindings2 = { reinterpret_cast(CAM_LAYOUT_BINDING) }; - vk::DescriptorSetLayoutCreateInfo dslci = { {}, layoutBindings1.size(), layoutBindings1.data() }; - vk::DescriptorSetLayoutCreateInfo dslci2 = { {}, layoutBindings2.size(), layoutBindings2.data() }; - descriptorSetLayouts.push_back(device.createDescriptorSetLayout(dslci)); - descriptorSetLayouts.push_back(device.createDescriptorSetLayout(dslci2)); + descriptorSetLayouts.push_back(device.createDescriptorSetLayout({ {}, layoutBindings1.size(), layoutBindings1.data() })); + descriptorSetLayouts.push_back(device.createDescriptorSetLayout({ {}, layoutBindings2.size(), layoutBindings2.data() })); + + for(const auto& set : shader->descriptorSets) + { + vk::DescriptorSetLayoutCreateInfo createInfo { {}, static_cast(set.size()), reinterpret_cast(set.data()) }; + descriptorSetLayouts.push_back(device.createDescriptorSetLayout(createInfo)); + } + + vk::PipelineLayoutCreateInfo plci = { {}, static_cast(descriptorSetLayouts.size()), descriptorSetLayouts.data(), 0, nullptr }; pipelineLayout = this->device.createPipelineLayout(plci); }