summaryrefslogtreecommitdiff
path: root/sc/sc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sc/sc.cpp')
-rw-r--r--sc/sc.cpp37
1 files changed, 31 insertions, 6 deletions
diff --git a/sc/sc.cpp b/sc/sc.cpp
index d801a68..9232e10 100644
--- a/sc/sc.cpp
+++ b/sc/sc.cpp
@@ -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;
}