From 827a2edf7559f78490716dcaf5b16cac63a61fbd Mon Sep 17 00:00:00 2001 From: Leonie Franken <lfranken@uni-koblenz.de> Date: Thu, 3 Jun 2021 15:00:11 +0200 Subject: [PATCH] [#36] basic DescriptorSet Reflection --- config/Sources.cmake | 2 ++ include/vkcv/DescriptorSetLayout.hpp | 34 ++++++++++++++++++++++ include/vkcv/ShaderProgram.hpp | 4 +++ src/vkcv/ShaderProgram.cpp | 43 ++++++++++++++++++++++++++-- 4 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 include/vkcv/DescriptorSetLayout.hpp diff --git a/config/Sources.cmake b/config/Sources.cmake index 8fc0aa9a..fcc24b15 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 00000000..8194c04b --- /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 ef5d1f00..48a8c767 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 5185b8b4..f7899eb2 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; + } } -- GitLab