diff options
author | quou <quou@disroot.org> | 2025-02-22 17:42:38 +1100 |
---|---|---|
committer | quou <quou@disroot.org> | 2025-02-22 17:42:38 +1100 |
commit | d5d0bcfbb72e976c03f4a6fb6d79bf2b8ed51101 (patch) | |
tree | 2dc1c85907204a64df3826a689b57760401216d3 /sc | |
parent | 04db6b0ccd81d988cfe3a1d09e4eb00eeea77273 (diff) |
"#include" working for shaders
Diffstat (limited to 'sc')
-rw-r--r-- | sc/sc.cpp | 37 |
1 files changed, 31 insertions, 6 deletions
@@ -19,22 +19,33 @@ extern "C" { const char* glsl_version_s = "#version 440 core"; const int glsl_version = 440; -const char* builtin_src = ""; +const char* builtin_src = "#extension GL_GOOGLE_include_directive : require\n"; static const auto client_version = glslang::EShTargetVulkan_1_0; static const auto target_version = glslang::EShTargetSpv_1_0; const int desc_parse_memory = 4096 * 1024; -std::string get_desc(const char* src) { +std::string get_desc(const char* filename, const char* src) { const char* srcs[] = { glsl_version_s, "\n", "#define DESC", "\n", builtin_src, src }; + const char* src_names[] = { + filename, filename, + filename, filename, + filename, filename, + }; + static_assert(sizeof srcs == sizeof src_names); glslang::TShader shader(EShLangVertex); Includer inc; std::string prepr; - shader.setStrings(srcs, sizeof srcs / sizeof *srcs); + shader.setStringsWithLengthsAndNames( + srcs, + 0, + src_names, + sizeof srcs / sizeof *srcs + ); shader.setEnvClient(glslang::EShClientVulkan, client_version); shader.setEnvTarget(glslang::EShTargetSpv, target_version); if (!shader.preprocess( @@ -609,6 +620,7 @@ struct Desc { std::vector<uint32_t> compile_shader( Desc& d, + const char* sname, const char* fname, const char* presrc, const char* src, @@ -624,6 +636,12 @@ std::vector<uint32_t> compile_shader( presrc, src }; + const char* src_names[] = { + sname, sname, + sname, sname, sname, + sname, sname, sname + }; + static_assert(sizeof srcs == sizeof src_names); glslang::TShader shader(lang); glslang::TProgram program; glslang::TIntermediate* ir; @@ -642,7 +660,12 @@ std::vector<uint32_t> compile_shader( options.stripDebugInfo = true; #endif EShMessages msg = (EShMessages)(EShMsgSpvRules | EShMsgVulkanRules); - shader.setStrings(srcs, sizeof srcs / sizeof *srcs); + shader.setStringsWithLengthsAndNames( + srcs, + 0, + src_names, + sizeof srcs / sizeof *srcs + ); shader.setEnvClient(glslang::EShClientVulkan, client_version); shader.setEnvTarget(glslang::EShTargetSpv, target_version); shader.setEntryPoint(d.entrypoints[stage].c_str()); @@ -712,6 +735,7 @@ void configure( } void compile_shaders( + const char* sname, const char* fname, std::vector<uint32_t>* spv, const char* src, @@ -726,6 +750,7 @@ void compile_shaders( configure(d, i, define, lang, ps); spv[i] = compile_shader( d, + sname, fname, ps.c_str(), src, @@ -830,10 +855,10 @@ int main(int argc, const char** argv) { print_err("Failed to read %s\n", argv[1]); return 1; } - desc_src = get_desc(src); + desc_src = get_desc(argv[1], src); cdesc = parse_desc(dp_mem, desc_src.c_str()); desc.build(cdesc); - compile_shaders(argv[2], spv, src, desc); + compile_shaders(argv[1], argv[2], spv, src, desc); write_csh(argv[2], desc, spv); return 0; } |