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 } | 	{ 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); | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Yuri Rubinsky
						Yuri Rubinsky