diff --git a/config/Sources.cmake b/config/Sources.cmake index 8fc0aa9a2605a629596e26d5eeb0772164e6ec7a..fcc24b15ba0c0e5c7c88d13aa823f5d705e09016 100644 --- a/config/Sources.cmake +++ b/config/Sources.cmake @@ -72,4 +72,6 @@ set(vkcv_sources ${vkcv_source}/vkcv/SamplerManager.cpp ${vkcv_include}/vkcv/DescriptorWrites.hpp + + ${vkcv_include}/vkcv/DescriptorSetLayout.hpp ) diff --git a/include/vkcv/DescriptorSetLayout.hpp b/include/vkcv/DescriptorSetLayout.hpp new file mode 100644 index 0000000000000000000000000000000000000000..8194c04b323c85c3443c7b65300f847f04240c1f --- /dev/null +++ b/include/vkcv/DescriptorSetLayout.hpp @@ -0,0 +1,34 @@ +#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 ef5d1f00ea3eeb97d97d8824439ded1ed326f33c..48a8c7672c57a560ca4eaeba2149b62aef1b10ed 100644 --- a/include/vkcv/ShaderProgram.hpp +++ b/include/vkcv/ShaderProgram.hpp @@ -12,6 +12,7 @@ #include <vulkan/vulkan.hpp> #include <spirv_cross.hpp> #include "vkcv/VertexLayout.hpp" +#include "vkcv/DescriptorSetLayout.hpp" namespace vkcv { @@ -59,9 +60,12 @@ namespace vkcv { const VertexLayout &getVertexLayout() const; + const DescriptorSetLayout &getDescriptorSetLayout() const; + private: std::unordered_map<ShaderStage, Shader> m_Shaders; VertexLayout m_VertexLayout; + DescriptorSetLayout m_DescriptorSetLayout; }; } diff --git a/src/vkcv/ShaderProgram.cpp b/src/vkcv/ShaderProgram.cpp index 5185b8b402eae5cd514689ba51a06e1a437271bf..f7899eb26a13ca14afbe29102b987f84949b4b12 100644 --- a/src/vkcv/ShaderProgram.cpp +++ b/src/vkcv/ShaderProgram.cpp @@ -66,7 +66,8 @@ namespace vkcv { ShaderProgram::ShaderProgram() noexcept : m_Shaders{}, - m_VertexLayout{} + m_VertexLayout{}, + m_DescriptorSetLayout{} {} bool ShaderProgram::addShader(ShaderStage shaderStage, const std::filesystem::path &shaderPath) @@ -125,12 +126,50 @@ namespace vkcv { inputVec.push_back(input); offset += base_type.vecsize * base_type.width / 8; } - m_VertexLayout = VertexLayout(inputVec); } + + //Descriptor Sets + //Storage buffer, uniform Buffer, storage image, sampled image, sampler (?) + + std::vector<uint32_t> sampledImageVec; + for (uint32_t i = 0; i < resources.sampled_images.size(); i++) { + auto &u = resources.sampled_images[i]; + sampledImageVec.push_back(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)); + } + + 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)); + } + + 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)); + } + + 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)); + } + + m_DescriptorSetLayout = DescriptorSetLayout(sampledImageVec, storageImageVec, uniformBufferVec, storageBufferVec, samplerVec); } const VertexLayout& ShaderProgram::getVertexLayout() const{ return m_VertexLayout; } + + const DescriptorSetLayout& ShaderProgram::getDescriptorSetLayout() const { + return m_DescriptorSetLayout; + } }