mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 13:41:03 +00:00 
			
		
		
		
	Prevent using built-ins for func names in shaders
This commit is contained in:
		
							parent
							
								
									e7dd6f11ed
								
							
						
					
					
						commit
						aecc4cbc47
					
				
					 2 changed files with 21 additions and 3 deletions
				
			
		|  | @ -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); | ||||
|  |  | |||
|  | @ -884,7 +884,7 @@ public: | |||
| 		bool can_discard = 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); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Yuri Rubinsky
						Yuri Rubinsky