mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-03 16:02:26 +00:00
renderer_vulkan: add define param to compile shader utility
This commit is contained in:
parent
c617f9d002
commit
d0f0685e53
@ -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 {};
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user