renderer_vulkan: add define param to compile shader utility

This commit is contained in:
Vinicius Rangel 2025-03-08 11:47:27 -03:00
parent c617f9d002
commit d0f0685e53
No known key found for this signature in database
GPG Key ID: A5B154D904B761D9
2 changed files with 46 additions and 7 deletions

View File

@ -159,7 +159,8 @@ bool InitializeCompiler() {
}
} // Anonymous namespace
vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, vk::Device device) {
vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, vk::Device device,
std::vector<std::string> defines) {
if (!InitializeCompiler()) {
return {};
}
@ -178,12 +179,46 @@ vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, v
glslang::EShTargetLanguageVersion::EShTargetSpv_1_3);
shader->setStringsWithLengths(&pass_source_code, &pass_source_code_length, 1);
std::string preambleString;
std::vector<std::string> processes;
for (auto& def : defines) {
processes.push_back("define-macro ");
processes.back().append(def);
preambleString.append("#define ");
if (const size_t equal = def.find_first_of("="); equal != def.npos) {
def[equal] = ' ';
}
preambleString.append(def);
preambleString.append("\n");
}
shader->setPreamble(preambleString.c_str());
shader->addProcesses(processes);
glslang::TShader::ForbidIncluder includer;
std::string preprocessedStr;
if (!shader->preprocess(&DefaultTBuiltInResource, default_version, profile, false, true,
messages, &preprocessedStr, includer)) [[unlikely]] {
LOG_ERROR(Render_Vulkan,
"Shader preprocess error\n"
"Shader Info Log:\n"
"{}\n{}",
shader->getInfoLog(), shader->getInfoDebugLog());
LOG_ERROR(Render_Vulkan, "Shader Source:\n{}", code);
return {};
}
if (!shader->parse(&DefaultTBuiltInResource, default_version, profile, false, true, messages,
includer)) [[unlikely]] {
LOG_INFO(Render_Vulkan, "Shader Info Log:\n{}\n{}", shader->getInfoLog(),
shader->getInfoDebugLog());
LOG_INFO(Render_Vulkan, "Shader Source:\n{}", code);
LOG_ERROR(Render_Vulkan,
"Shader parse error\n"
"Shader Info Log:\n"
"{}\n{}",
shader->getInfoLog(), shader->getInfoDebugLog());
LOG_ERROR(Render_Vulkan, "Shader Source:\n{}", code);
return {};
}
@ -191,8 +226,11 @@ vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, v
auto program = std::make_unique<glslang::TProgram>();
program->addShader(shader.get());
if (!program->link(messages)) {
LOG_INFO(Render_Vulkan, "Program Info Log:\n{}\n{}", program->getInfoLog(),
program->getInfoDebugLog());
LOG_ERROR(Render_Vulkan,
"Shader link error\n"
"Program Info Log:\n"
"{}\n{}",
program->getInfoLog(), program->getInfoDebugLog());
return {};
}

View File

@ -16,7 +16,8 @@ namespace Vulkan {
* @param stage The pipeline stage the shader will be used in.
* @param device The vulkan device handle.
*/
vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, vk::Device device);
vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, vk::Device device,
std::vector<std::string> defines = {});
/**
* @brief Creates a vulkan shader module from SPIR-V bytecode.