|
@@ -3067,6 +3067,8 @@ const ShaderLanguage::BuiltinFuncDef ShaderLanguage::builtin_func_defs[] = {
|
|
|
{ nullptr, TYPE_VOID, { TYPE_VOID }, { "" }, TAG_GLOBAL, false }
|
|
|
};
|
|
|
|
|
|
+HashSet<StringName> global_func_set;
|
|
|
+
|
|
|
const ShaderLanguage::BuiltinFuncOutArgs ShaderLanguage::builtin_func_out_args[] = {
|
|
|
{ "modf", { 1, -1 } },
|
|
|
{ "umulExtended", { 2, 3 } },
|
|
@@ -9211,7 +9213,7 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
|
|
|
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));
|
|
|
return ERR_PARSE_ERROR;
|
|
|
}
|
|
@@ -9831,7 +9833,11 @@ Error ShaderLanguage::_parse_shader(const HashMap<StringName, FunctionInfo> &p_f
|
|
|
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) {
|
|
|
if (E.value.built_ins.has(p_name)) {
|
|
|
return true;
|
|
@@ -10701,6 +10707,18 @@ ShaderLanguage::ShaderLanguage() {
|
|
|
nodes = nullptr;
|
|
|
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
|
|
|
warnings_check_map.insert(ShaderWarning::UNUSED_CONSTANT, &used_constants);
|
|
|
warnings_check_map.insert(ShaderWarning::UNUSED_FUNCTION, &used_functions);
|