From 2d2a35ed120b21afb77d5d1375afc1d968ebdf4c Mon Sep 17 00:00:00 2001
From: Leonie Franken <lfranken@uni-koblenz.de>
Date: Thu, 27 May 2021 15:51:43 +0200
Subject: [PATCH] shader reflection attempt throws error Invalid SPIRV format

---
 include/vkcv/ShaderProgram.hpp       |  2 +-
 projects/first_triangle/src/main.cpp |  2 ++
 src/vkcv/ShaderProgram.cpp           | 22 ++++++++++++++++++++--
 3 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/include/vkcv/ShaderProgram.hpp b/include/vkcv/ShaderProgram.hpp
index 53e75aba..0a8470a9 100644
--- a/include/vkcv/ShaderProgram.hpp
+++ b/include/vkcv/ShaderProgram.hpp
@@ -10,7 +10,7 @@
 #include <iostream>
 #include <filesystem>
 #include <vulkan/vulkan.hpp>
-#include <spirv_glsl.hpp>
+#include <spirv_cross.hpp>
 
 namespace vkcv {
 
diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp
index 3c3f91de..84fe7b74 100644
--- a/projects/first_triangle/src/main.cpp
+++ b/projects/first_triangle/src/main.cpp
@@ -72,6 +72,8 @@ int main(int argc, const char** argv) {
 	vkcv::ShaderProgram triangleShaderProgram{};
 	triangleShaderProgram.addShader(vkcv::ShaderStage::VERTEX, std::filesystem::path("shaders/vert.spv"));
 	triangleShaderProgram.addShader(vkcv::ShaderStage::FRAGMENT, std::filesystem::path("shaders/frag.spv"));
+	triangleShaderProgram.reflectShader(vkcv::ShaderStage::VERTEX);
+    triangleShaderProgram.reflectShader(vkcv::ShaderStage::FRAGMENT);
 
 	const vkcv::PipelineConfig trianglePipelineDefinition(triangleShaderProgram, windowWidth, windowHeight, trianglePass);
 	vkcv::PipelineHandle trianglePipeline = core.createGraphicsPipeline(trianglePipelineDefinition);
diff --git a/src/vkcv/ShaderProgram.cpp b/src/vkcv/ShaderProgram.cpp
index e5569e00..fce6ea35 100644
--- a/src/vkcv/ShaderProgram.cpp
+++ b/src/vkcv/ShaderProgram.cpp
@@ -62,7 +62,25 @@ namespace vkcv {
 
     void ShaderProgram::reflectShader(ShaderStage shaderStage) const
     {
-        auto shaderCode = m_Shaders.at(shaderStage).shaderCode;
-        //TODO
+        auto shaderCodeChar = m_Shaders.at(shaderStage).shaderCode;
+        std::vector<uint32_t> shaderCode; //convert from char to uint 32. Is this the best way? Prob not.
+
+        for (uint32_t i = 0; i < shaderCodeChar.size(); i++) {
+            shaderCode.push_back((uint32_t) shaderCodeChar[i]);
+        }
+
+        //spirv_cross::Compiler comp(move(shaderCode));
+
+        /*
+        spirv_cross::ShaderResources resources = comp.get_shader_resources();
+
+        //testprint
+        for (auto &u : resources.uniform_buffers)
+        {
+            uint32_t set = comp.get_decoration(u.id, spv::DecorationDescriptorSet);
+            uint32_t binding = comp.get_decoration(u.id, spv::DecorationBinding);
+            std::cout << 'Found UBO ' << &u << ' at set = ' << set << ', binding = ' << binding << std::endl;
+        }
+         */
     }
 }
-- 
GitLab