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