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