Prevent using built-ins for func names in shaders

This commit is contained in:
Yuri Rubinsky 2024-05-30 21:15:21 +03:00
parent e7dd6f11ed
commit aecc4cbc47
2 changed files with 21 additions and 3 deletions

View File

@ -3067,6 +3067,8 @@ const ShaderLanguage::BuiltinFuncDef ShaderLanguage::builtin_func_defs[] = {
{ nullptr, TYPE_VOID, { TYPE_VOID }, { "" }, TAG_GLOBAL, false } { nullptr, TYPE_VOID, { TYPE_VOID }, { "" }, TAG_GLOBAL, false }
}; };
HashSet<StringName> global_func_set;
const ShaderLanguage::BuiltinFuncOutArgs ShaderLanguage::builtin_func_out_args[] = { const ShaderLanguage::BuiltinFuncOutArgs ShaderLanguage::builtin_func_out_args[] = {
{ "modf", { 1, -1 } }, { "modf", { 1, -1 } },
{ "umulExtended", { 2, 3 } }, { "umulExtended", { 2, 3 } },
@ -9211,7 +9213,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
return ERR_PARSE_ERROR; return ERR_PARSE_ERROR;
} }
if (shader->structs.has(name) || _find_identifier(nullptr, false, constants, name) || has_builtin(p_functions, name)) { if (shader->structs.has(name) || _find_identifier(nullptr, false, constants, name) || has_builtin(p_functions, name, !is_constant)) {
_set_redefinition_error(String(name)); _set_redefinition_error(String(name));
return ERR_PARSE_ERROR; return ERR_PARSE_ERROR;
} }
@ -9831,7 +9833,11 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
return OK; return OK;
} }
bool ShaderLanguage::has_builtin(const HashMap<StringName, ShaderLanguage::FunctionInfo> &p_functions, const StringName &p_name) { bool ShaderLanguage::has_builtin(const HashMap<StringName, ShaderLanguage::FunctionInfo> &p_functions, const StringName &p_name, bool p_check_global_funcs) {
if (p_check_global_funcs && global_func_set.has(p_name)) {
return true;
}
for (const KeyValue<StringName, ShaderLanguage::FunctionInfo> &E : p_functions) { for (const KeyValue<StringName, ShaderLanguage::FunctionInfo> &E : p_functions) {
if (E.value.built_ins.has(p_name)) { if (E.value.built_ins.has(p_name)) {
return true; return true;
@ -10701,6 +10707,18 @@ ShaderLanguage::ShaderLanguage() {
nodes = nullptr; nodes = nullptr;
completion_class = TAG_GLOBAL; completion_class = TAG_GLOBAL;
int idx = 0;
while (builtin_func_defs[idx].name) {
if (builtin_func_defs[idx].tag == SubClassTag::TAG_GLOBAL) {
const StringName &name = StringName(builtin_func_defs[idx].name);
if (!global_func_set.has(name)) {
global_func_set.insert(name);
}
}
idx++;
}
#ifdef DEBUG_ENABLED #ifdef DEBUG_ENABLED
warnings_check_map.insert(ShaderWarning::UNUSED_CONSTANT, &used_constants); warnings_check_map.insert(ShaderWarning::UNUSED_CONSTANT, &used_constants);
warnings_check_map.insert(ShaderWarning::UNUSED_FUNCTION, &used_functions); warnings_check_map.insert(ShaderWarning::UNUSED_FUNCTION, &used_functions);

View File

@ -884,7 +884,7 @@ public:
bool can_discard = false; bool can_discard = false;
bool main_function = false; bool main_function = false;
}; };
static bool has_builtin(const HashMap<StringName, ShaderLanguage::FunctionInfo> &p_functions, const StringName &p_name); static bool has_builtin(const HashMap<StringName, ShaderLanguage::FunctionInfo> &p_functions, const StringName &p_name, bool p_check_global_funcs = false);
typedef DataType (*GlobalShaderUniformGetTypeFunc)(const StringName &p_name); typedef DataType (*GlobalShaderUniformGetTypeFunc)(const StringName &p_name);