mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-04 00:13:08 +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
|
} // 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()) {
|
if (!InitializeCompiler()) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -178,12 +179,46 @@ vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, v
|
|||||||
glslang::EShTargetLanguageVersion::EShTargetSpv_1_3);
|
glslang::EShTargetLanguageVersion::EShTargetSpv_1_3);
|
||||||
shader->setStringsWithLengths(&pass_source_code, &pass_source_code_length, 1);
|
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;
|
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,
|
if (!shader->parse(&DefaultTBuiltInResource, default_version, profile, false, true, messages,
|
||||||
includer)) [[unlikely]] {
|
includer)) [[unlikely]] {
|
||||||
LOG_INFO(Render_Vulkan, "Shader Info Log:\n{}\n{}", shader->getInfoLog(),
|
LOG_ERROR(Render_Vulkan,
|
||||||
shader->getInfoDebugLog());
|
"Shader parse error\n"
|
||||||
LOG_INFO(Render_Vulkan, "Shader Source:\n{}", code);
|
"Shader Info Log:\n"
|
||||||
|
"{}\n{}",
|
||||||
|
shader->getInfoLog(), shader->getInfoDebugLog());
|
||||||
|
LOG_ERROR(Render_Vulkan, "Shader Source:\n{}", code);
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,8 +226,11 @@ vk::ShaderModule Compile(std::string_view code, vk::ShaderStageFlagBits stage, v
|
|||||||
auto program = std::make_unique<glslang::TProgram>();
|
auto program = std::make_unique<glslang::TProgram>();
|
||||||
program->addShader(shader.get());
|
program->addShader(shader.get());
|
||||||
if (!program->link(messages)) {
|
if (!program->link(messages)) {
|
||||||
LOG_INFO(Render_Vulkan, "Program Info Log:\n{}\n{}", program->getInfoLog(),
|
LOG_ERROR(Render_Vulkan,
|
||||||
program->getInfoDebugLog());
|
"Shader link error\n"
|
||||||
|
"Program Info Log:\n"
|
||||||
|
"{}\n{}",
|
||||||
|
program->getInfoLog(), program->getInfoDebugLog());
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,8 @@ namespace Vulkan {
|
|||||||
* @param stage The pipeline stage the shader will be used in.
|
* @param stage The pipeline stage the shader will be used in.
|
||||||
* @param device The vulkan device handle.
|
* @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.
|
* @brief Creates a vulkan shader module from SPIR-V bytecode.
|
||||||
|
Loading…
Reference in New Issue
Block a user