From 5a8125550013c655afb97a8876de1e35570c6d62 Mon Sep 17 00:00:00 2001 From: Simeon Hermann <shermann04@uni-koblenz.de> Date: Wed, 9 Jun 2021 18:43:06 +0200 Subject: [PATCH] [#36] add reflection of descriptor sets, not working yet --- config/Sources.cmake | 2 - include/vkcv/DescriptorConfig.hpp | 4 +- include/vkcv/DescriptorSetLayout.hpp | 34 ------------- include/vkcv/ShaderProgram.hpp | 7 +-- projects/first_mesh/src/main.cpp | 4 +- src/vkcv/DescriptorConfig.cpp | 2 + src/vkcv/DescriptorManager.cpp | 2 +- src/vkcv/ShaderProgram.cpp | 74 ++++++++++++++++++---------- 8 files changed, 60 insertions(+), 69 deletions(-) delete mode 100644 include/vkcv/DescriptorSetLayout.hpp diff --git a/config/Sources.cmake b/config/Sources.cmake index e991fa51..a5b2ddae 100644 --- a/config/Sources.cmake +++ b/config/Sources.cmake @@ -69,8 +69,6 @@ set(vkcv_sources ${vkcv_source}/vkcv/SamplerManager.cpp ${vkcv_include}/vkcv/DescriptorWrites.hpp - - ${vkcv_include}/vkcv/DescriptorSetLayout.hpp ${vkcv_include}/vkcv/DrawcallRecording.hpp ${vkcv_source}/vkcv/DrawcallRecording.cpp diff --git a/include/vkcv/DescriptorConfig.hpp b/include/vkcv/DescriptorConfig.hpp index 86c2e20e..5f33c9ad 100644 --- a/include/vkcv/DescriptorConfig.hpp +++ b/include/vkcv/DescriptorConfig.hpp @@ -33,11 +33,13 @@ namespace vkcv struct DescriptorBinding { DescriptorBinding( + uint32_t bindingID, DescriptorType descriptorType, uint32_t descriptorCount, ShaderStage shaderStage ) noexcept; - + + uint32_t bindingID; DescriptorType descriptorType; uint32_t descriptorCount; ShaderStage shaderStage; diff --git a/include/vkcv/DescriptorSetLayout.hpp b/include/vkcv/DescriptorSetLayout.hpp deleted file mode 100644 index 8194c04b..00000000 --- a/include/vkcv/DescriptorSetLayout.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include <unordered_map> -#include <vector> -#include <iostream> - -namespace vkcv{ - - - struct DescriptorSetLayout{ - inline DescriptorSetLayout() noexcept: sampledImages(), - storageImages(), - uniformBuffers(), - storageBuffers(), - samplers() {}; - inline DescriptorSetLayout(std::vector<uint32_t> sampledImageVec, - std::vector<uint32_t> storageImageVec, - std::vector<uint32_t> uniformBufferVec, - std::vector<uint32_t> storageBufferVec, - std::vector<uint32_t> samplerVec) noexcept: - sampledImages(sampledImageVec), - storageImages(storageImageVec), - uniformBuffers(uniformBufferVec), - storageBuffers(storageBufferVec), - samplers(samplerVec) {}; - - std::vector<uint32_t> sampledImages; - std::vector<uint32_t> storageImages; - std::vector<uint32_t> uniformBuffers; - std::vector<uint32_t> storageBuffers; - std::vector<uint32_t> samplers; - }; - -} diff --git a/include/vkcv/ShaderProgram.hpp b/include/vkcv/ShaderProgram.hpp index fe637f28..a5586ab7 100644 --- a/include/vkcv/ShaderProgram.hpp +++ b/include/vkcv/ShaderProgram.hpp @@ -8,11 +8,12 @@ #include <unordered_map> #include <fstream> #include <iostream> +#include <algorithm> #include <filesystem> #include <vulkan/vulkan.hpp> #include <spirv_cross.hpp> #include "vkcv/VertexLayout.hpp" -#include "vkcv/DescriptorSetLayout.hpp" +#include "vkcv/DescriptorConfig.hpp" namespace vkcv { @@ -61,13 +62,13 @@ namespace vkcv { const VertexLayout &getVertexLayout() const; size_t getPushConstantSize() const; - const DescriptorSetLayout &getDescriptorSetLayout() const; + const std::vector<std::vector<DescriptorBinding>> getReflectedDescriptors() const; private: std::unordered_map<ShaderStage, Shader> m_Shaders; VertexLayout m_VertexLayout; - DescriptorSetLayout m_DescriptorSetLayout; + std::vector<std::vector<DescriptorBinding>> m_DescriptorSets; size_t m_pushConstantSize = 0; }; } diff --git a/projects/first_mesh/src/main.cpp b/projects/first_mesh/src/main.cpp index 599eae46..55f70034 100644 --- a/projects/first_mesh/src/main.cpp +++ b/projects/first_mesh/src/main.cpp @@ -94,9 +94,9 @@ int main(int argc, const char** argv) { return static_cast<uint32_t>(x.type) < static_cast<uint32_t>(y.type); }); + uint32_t setID = 0; std::vector<vkcv::DescriptorBinding> descriptorBindings = { - vkcv::DescriptorBinding(vkcv::DescriptorType::IMAGE_SAMPLED, 1, vkcv::ShaderStage::FRAGMENT), - vkcv::DescriptorBinding(vkcv::DescriptorType::SAMPLER, 1, vkcv::ShaderStage::FRAGMENT) }; + triangleShaderProgram.getReflectedDescriptors()[setID] }; vkcv::DescriptorSetHandle descriptorSet = core.createDescriptorSet(descriptorBindings); const vkcv::PipelineConfig trianglePipelineDefinition( diff --git a/src/vkcv/DescriptorConfig.cpp b/src/vkcv/DescriptorConfig.cpp index be6cfc9b..54e879ac 100644 --- a/src/vkcv/DescriptorConfig.cpp +++ b/src/vkcv/DescriptorConfig.cpp @@ -2,10 +2,12 @@ namespace vkcv { DescriptorBinding::DescriptorBinding( + uint32_t bindingID, DescriptorType descriptorType, uint32_t descriptorCount, ShaderStage shaderStage) noexcept : + bindingID(bindingID), descriptorType(descriptorType), descriptorCount(descriptorCount), shaderStage(shaderStage) {} diff --git a/src/vkcv/DescriptorManager.cpp b/src/vkcv/DescriptorManager.cpp index a2efecbe..99e9928d 100644 --- a/src/vkcv/DescriptorManager.cpp +++ b/src/vkcv/DescriptorManager.cpp @@ -40,7 +40,7 @@ namespace vkcv //create each set's binding for (uint32_t i = 0; i < bindings.size(); i++) { vk::DescriptorSetLayoutBinding descriptorSetLayoutBinding( - i, + bindings[i].bindingID, convertDescriptorTypeFlag(bindings[i].descriptorType), bindings[i].descriptorCount, convertShaderStageFlag(bindings[i].shaderStage)); diff --git a/src/vkcv/ShaderProgram.cpp b/src/vkcv/ShaderProgram.cpp index 0a3ce87b..79bfc04e 100644 --- a/src/vkcv/ShaderProgram.cpp +++ b/src/vkcv/ShaderProgram.cpp @@ -5,7 +5,6 @@ */ #include "vkcv/ShaderProgram.hpp" -#include <algorithm> namespace vkcv { /** @@ -68,7 +67,7 @@ namespace vkcv { ShaderProgram::ShaderProgram() noexcept : m_Shaders{}, m_VertexLayout{}, - m_DescriptorSetLayout{} + m_DescriptorSets{} {} bool ShaderProgram::addShader(ShaderStage shaderStage, const std::filesystem::path &shaderPath) @@ -131,40 +130,63 @@ namespace vkcv { } //Descriptor Sets - //Storage buffer, uniform Buffer, storage image, sampled image, sampler (?) + //Uniform buffer, storage buffer, sampler, sampled image, storage image - std::vector<uint32_t> separateImageVec; - for (uint32_t i = 0; i < resources.separate_images.size(); i++) { - auto &u = resources.separate_images[i]; - separateImageVec.push_back(comp.get_decoration(u.id, spv::DecorationDescriptorSet)); + std::vector<std::pair<uint32_t, DescriptorBinding>> bindings; + int32_t maxSetID = -1; + for (uint32_t i = 0; i < resources.uniform_buffers.size(); i++) { + auto& u = resources.uniform_buffers[i]; + const spirv_cross::SPIRType& base_type = comp.get_type(u.base_type_id); + std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet), + DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::UNIFORM_BUFFER, base_type.vecsize, shaderStage)); + bindings.push_back(descriptor); + if (comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID) maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet); } - std::vector<uint32_t> storageImageVec; - for (uint32_t i = 0; i < resources.storage_images.size(); i++) { - auto &u = resources.storage_images[i]; - storageImageVec.push_back(comp.get_decoration(u.id, spv::DecorationDescriptorSet)); + for (uint32_t i = 0; i < resources.storage_buffers.size(); i++) { + auto& u = resources.storage_buffers[i]; + const spirv_cross::SPIRType& base_type = comp.get_type(u.base_type_id); + std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet), + DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::STORAGE_BUFFER, base_type.vecsize, shaderStage)); + bindings.push_back(descriptor); + if (comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID) maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet); } - std::vector<uint32_t> uniformBufferVec; - for (uint32_t i = 0; i < resources.uniform_buffers.size(); i++) { - auto &u = resources.uniform_buffers[i]; - uniformBufferVec.push_back(comp.get_decoration(u.id, spv::DecorationDescriptorSet)); + for (uint32_t i = 0; i < resources.separate_samplers.size(); i++) { + auto& u = resources.separate_samplers[i]; + const spirv_cross::SPIRType& base_type = comp.get_type(u.base_type_id); + std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet), + DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::SAMPLER, base_type.vecsize, shaderStage)); + bindings.push_back(descriptor); + if (comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID) maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet); } - std::vector<uint32_t> storageBufferVec; - for (uint32_t i = 0; i < resources.storage_buffers.size(); i++) { - auto &u = resources.storage_buffers[i]; - storageBufferVec.push_back(comp.get_decoration(u.id, spv::DecorationDescriptorSet)); + for (uint32_t i = 0; i < resources.separate_images.size(); i++) { + auto& u = resources.separate_images[i]; + const spirv_cross::SPIRType& base_type = comp.get_type(u.base_type_id); + std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet), + DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::IMAGE_SAMPLED, base_type.vecsize, shaderStage)); + bindings.push_back(descriptor); + if (comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID) maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet); + } - std::vector<uint32_t> samplerVec; - for (uint32_t i = 0; i < resources.separate_samplers.size(); i++) { - auto &u = resources.separate_samplers[i]; - samplerVec.push_back(comp.get_decoration(u.id, spv::DecorationDescriptorSet)); + for (uint32_t i = 0; i < resources.storage_images.size(); i++) { + auto& u = resources.storage_images[i]; + const spirv_cross::SPIRType& base_type = comp.get_type(u.base_type_id); + std::pair descriptor(comp.get_decoration(u.id, spv::DecorationDescriptorSet), + DescriptorBinding(comp.get_decoration(u.id, spv::DecorationBinding), DescriptorType::IMAGE_STORAGE, base_type.vecsize, shaderStage)); + bindings.push_back(descriptor); + if (comp.get_decoration(u.id, spv::DecorationDescriptorSet) > maxSetID) maxSetID = comp.get_decoration(u.id, spv::DecorationDescriptorSet); + } + + m_DescriptorSets.resize(maxSetID); + for (auto binding : bindings) { + m_DescriptorSets[binding.first].push_back(binding.second); } - m_DescriptorSetLayout = DescriptorSetLayout(separateImageVec, storageImageVec, uniformBufferVec, storageBufferVec, samplerVec); + //reflect push constants for (const auto &pushConstantBuffer : resources.push_constant_buffers) { for (const auto &range : comp.get_active_buffer_ranges(pushConstantBuffer.id)) { const size_t size = range.range + range.offset; @@ -177,8 +199,8 @@ namespace vkcv { return m_VertexLayout; } - const DescriptorSetLayout& ShaderProgram::getDescriptorSetLayout() const { - return m_DescriptorSetLayout; + const std::vector<std::vector<DescriptorBinding>> ShaderProgram::getReflectedDescriptors() const { + return m_DescriptorSets; } size_t ShaderProgram::getPushConstantSize() const { return m_pushConstantSize; -- GitLab