Skip to content

Commit

Permalink
resource: use shaderc's --define parameter
Browse files Browse the repository at this point in the history
  • Loading branch information
dbartolini committed Feb 12, 2025
1 parent b607413 commit e043254
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 31 deletions.
1 change: 1 addition & 0 deletions docs/changelog.rst
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Changelog
* Fixed a crash when moving many objects simultaneusly.
* Fixed a crash when reloading unloaded or unsupported resources.
* Added support to shaders and materials hot-reloading.
* Data Compiler: #defines are now correctly exposed in vs_input_output and fs_input_output.

0.54.0 --- 13 Jan 2025
----------------------
Expand Down
70 changes: 39 additions & 31 deletions src/resource/shader_resource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -499,40 +499,46 @@ namespace shader_resource_internal
, const char *varying
, const char *type
, const char *platform
, const Vector<DynamicString> &defines
)
{
const char *argv[] =
{
shaderc,
"-f",
infile,
"-o",
outfile,
"--varyingdef",
varying,
"--type",
type,
"--platform",
platform,
NULL,
NULL,
NULL,
};
Array<const char *> argv(default_allocator());
array::push_back(argv, shaderc);
array::push_back(argv, (const char *)"-f");
array::push_back(argv, infile);
array::push_back(argv, (const char *)"-o");
array::push_back(argv, outfile);
array::push_back(argv, (const char *)"--varyingdef");
array::push_back(argv, varying);
array::push_back(argv, (const char *)"--type");
array::push_back(argv, type);
array::push_back(argv, (const char *)"--platform");
array::push_back(argv, platform);

StringStream defines_string(default_allocator());
for (u32 i = 0; i < vector::size(defines); ++i)
defines_string << defines[i].c_str() << ";";

if (array::size(defines_string) > 0) {
array::push_back(argv, (const char *)"--define");
array::push_back(argv, string_stream::c_str(defines_string));
}

if (strcmp(platform, "android") == 0 || strcmp(platform, "asm.js") == 0) {
argv[11] = "--profile";
argv[12] = "300_es"; // GLES3
array::push_back(argv, (const char *)"--profile");
array::push_back(argv, (const char *)"300_es"); // GLES
} else if (strcmp(platform, "linux") == 0) {
argv[11] = "--profile";
argv[12] = "150"; // OpenGL 3.2+
array::push_back(argv, (const char *)"--profile");
array::push_back(argv, (const char *)"150"); // OpenGL 3.2+
} else if (strcmp(platform, "windows") == 0) {
argv[11] = "--profile";
argv[12] = "s_4_0";
array::push_back(argv, (const char *)"--profile");
array::push_back(argv, (const char *)"s_4_0");
} else {
return -1;
}

return pr.spawn(argv, CROWN_PROCESS_STDOUT_PIPE | CROWN_PROCESS_STDERR_MERGE);
array::push_back(argv, (const char *)NULL);
return pr.spawn(array::begin(argv), CROWN_PROCESS_STDOUT_PIPE | CROWN_PROCESS_STDERR_MERGE);
}

struct RenderState
Expand Down Expand Up @@ -1549,26 +1555,26 @@ namespace shader_resource_internal
included_code = included._code;
}

// Generate final shader code.
StringStream varying_code(default_allocator());
StringStream vs_code(default_allocator());
StringStream fs_code(default_allocator());
// Generate varying.
varying_code << shader._varying.c_str();
// Generate vertex shader.
vs_code << shader._vs_input_output.c_str();
for (u32 i = 0; i < vector::size(defines); ++i) {
vs_code << "#define " << defines[i].c_str() << "\n";
}
vs_code << included_code.c_str();
vs_code << shader._code.c_str();
vs_code << shader._vs_code.c_str();
// Generate fragment shader.
fs_code << shader._fs_input_output.c_str();
for (u32 i = 0; i < vector::size(defines); ++i) {
fs_code << "#define " << defines[i].c_str() << "\n";
}
fs_code << included_code.c_str();
fs_code << shader._code.c_str();
fs_code << shader._fs_code.c_str();

_opts.write_temporary(_vs_src_path.c_str(), vs_code);
_opts.write_temporary(_fs_src_path.c_str(), fs_code);
_opts.write_temporary(_varying_path.c_str(), shader._varying.c_str(), shader._varying.length());
_opts.write_temporary(_varying_path.c_str(), varying_code);

const char *shaderc = _opts.exe_path(shaderc_paths, countof(shaderc_paths));
RETURN_IF_FALSE(shaderc != NULL, _opts, "shaderc not found");
Expand All @@ -1585,6 +1591,7 @@ namespace shader_resource_internal
, _varying_path.c_str()
, "vertex"
, shaderc_platform[_opts._platform]
, defines
);
if (sc != 0) {
delete_temp_files();
Expand All @@ -1602,6 +1609,7 @@ namespace shader_resource_internal
, _varying_path.c_str()
, "fragment"
, shaderc_platform[_opts._platform]
, defines
);
if (sc != 0) {
delete_temp_files();
Expand Down

0 comments on commit e043254

Please sign in to comment.