Fix #116623: GL/VK: Specialization constant error

Using defines leads to syntax errors. Use global
constants instead.
This commit is contained in:
Clément Foucault
2023-12-30 11:05:01 +13:00
parent 719d1176f8
commit 7d6b8737bf
2 changed files with 10 additions and 10 deletions

View File

@@ -621,20 +621,20 @@ std::string GLShader::resources_declare(const ShaderCreateInfo &info) const
ss << "\n/* Specialization Constants (pass-through). */\n";
for (const ShaderCreateInfo::SpecializationConstant &sc : info.specialization_constants_) {
ss << "#define " << sc.name;
switch (sc.type) {
case Type::INT:
ss << " " << std::to_string(sc.default_value.i) << "\n";
ss << "const int " << sc.name << "=" << std::to_string(sc.default_value.i) << ";\n";
break;
case Type::UINT:
ss << " " << std::to_string(sc.default_value.u) << "u\n";
ss << "const uint " << sc.name << "=" << std::to_string(sc.default_value.u) << "u;\n";
break;
case Type::BOOL:
ss << " bool(" << std::to_string(sc.default_value.u) << ")\n";
ss << "const bool " << sc.name << "=" << (sc.default_value.u ? "true" : "false") << ";\n";
break;
case Type::FLOAT:
/* Use uint representation to allow exact same bit pattern even if NaN. */
ss << " uintBitsToFloat(" << std::to_string(sc.default_value.u) << ")\n";
ss << "const float " << sc.name << "= uintBitsToFloat("
<< std::to_string(sc.default_value.u) << "u);\n";
break;
default:
BLI_assert_unreachable();

View File

@@ -1004,20 +1004,20 @@ std::string VKShader::resources_declare(const shader::ShaderCreateInfo &info) co
/* TODO: Add support for specialization constants at compile time. */
ss << "\n/* Specialization Constants (pass-through). */\n";
for (const ShaderCreateInfo::SpecializationConstant &sc : info.specialization_constants_) {
ss << "#define " << sc.name;
switch (sc.type) {
case Type::INT:
ss << " " << std::to_string(sc.default_value.i) << "\n";
ss << "const int " << sc.name << "=" << std::to_string(sc.default_value.i) << ";\n";
break;
case Type::UINT:
ss << " " << std::to_string(sc.default_value.u) << "u\n";
ss << "const uint " << sc.name << "=" << std::to_string(sc.default_value.u) << "u;\n";
break;
case Type::BOOL:
ss << " bool(" << std::to_string(sc.default_value.u) << ")\n";
ss << "const bool " << sc.name << "=" << (sc.default_value.u ? "true" : "false") << ";\n";
break;
case Type::FLOAT:
/* Use uint representation to allow exact same bit pattern even if NaN. */
ss << " uintBitsToFloat(" << std::to_string(sc.default_value.u) << ")\n";
ss << "const float " << sc.name << "= uintBitsToFloat("
<< std::to_string(sc.default_value.u) << "u);\n";
break;
default:
BLI_assert_unreachable();