diff --git a/config/Sources.cmake b/config/Sources.cmake index e991fa51c17a3d893be24a7ff324a563f60d3267..a5b2ddae5e0a194e4ee887da5f37097821e41d0f 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 86c2e20eb37633e4519749bef507161133e57425..5f33c9ad8827d61eb841e2f54f37c3c2c0d2351e 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 8194c04b323c85c3443c7b65300f847f04240c1f..0000000000000000000000000000000000000000 --- 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 fe637f288947e539bc57723a443ae6b67ade0c05..a5586ab789691c646bfa8d0d1daea668dfee704f 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 599eae46ca0243d7eaacc06ec59c713edd5f1e72..55f700348f4e81ecbcf36952e5c80ae09ae430c9 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 be6cfc9b40baad6636e6bc6a2b6e803aacd7ddc0..54e879ac7e6ec7825a4c003899e3c264454c547f 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 a2efecbe7055122d28a864b7c722a5998be460e4..99e9928d21ad7e501634c93b59694d3c5faeaf6c 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 0a3ce87b93b5fa868c44cfc1e0c6ef4be0b8045f..79bfc04e650cd89859045e6310492f85792fe395 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;