mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 17:00:09 +01:00
glsl: A shader cannot redefine or overload built-in functions in GLSL ES 3.00
Create a new search function to look for matching built-in functions by name and use it for built-in function redefinition or overload in GLSL ES 3.00. GLSL ES 3.0 spec, chapter 6.1 "Function Definitions", page 71 "A shader cannot redefine or overload built-in functions." While in GLSL ES 1.0 specification, chapter 8 "Built-in Functions" "User code can overload the built-in functions but cannot redefine them." So this check is specific to GLSL ES 3.00. This patch fixes the following dEQP tests: dEQP-GLES3.functional.shaders.functions.invalid.overload_builtin_function_vertex dEQP-GLES3.functional.shaders.functions.invalid.overload_builtin_function_fragment dEQP-GLES3.functional.shaders.functions.invalid.redefine_builtin_function_vertex dEQP-GLES3.functional.shaders.functions.invalid.redefine_builtin_function_fragment No piglit regressions. Signed-off-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
19252fee46
commit
187ace73a9
3 changed files with 36 additions and 0 deletions
|
|
@ -4205,6 +4205,27 @@ ast_function::hir(exec_list *instructions,
|
|||
emit_function(state, f);
|
||||
}
|
||||
|
||||
/* From GLSL ES 3.0 spec, chapter 6.1 "Function Definitions", page 71:
|
||||
*
|
||||
* "A shader cannot redefine or overload built-in functions."
|
||||
*
|
||||
* While in GLSL ES 1.0 specification, chapter 8 "Built-in Functions":
|
||||
*
|
||||
* "User code can overload the built-in functions but cannot redefine
|
||||
* them."
|
||||
*/
|
||||
if (state->es_shader && state->language_version >= 300) {
|
||||
/* Local shader has no exact candidates; check the built-ins. */
|
||||
_mesa_glsl_initialize_builtin_functions();
|
||||
if (_mesa_glsl_find_builtin_function_by_name(state, name)) {
|
||||
YYLTYPE loc = this->get_location();
|
||||
_mesa_glsl_error(& loc, state,
|
||||
"A shader cannot redefine or overload built-in "
|
||||
"function `%s' in GLSL ES 3.00", name);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Verify that this function's signature either doesn't match a previously
|
||||
* seen signature for a function with the same name, or, if a match is found,
|
||||
* that the previously seen signature does not have an associated definition.
|
||||
|
|
|
|||
|
|
@ -4851,6 +4851,17 @@ _mesa_glsl_find_builtin_function(_mesa_glsl_parse_state *state,
|
|||
return s;
|
||||
}
|
||||
|
||||
ir_function *
|
||||
_mesa_glsl_find_builtin_function_by_name(_mesa_glsl_parse_state *state,
|
||||
const char *name)
|
||||
{
|
||||
ir_function *f;
|
||||
mtx_lock(&builtins_lock);
|
||||
f = builtins.shader->symbols->get_function(name);
|
||||
mtx_unlock(&builtins_lock);
|
||||
return f;
|
||||
}
|
||||
|
||||
gl_shader *
|
||||
_mesa_glsl_get_builtin_function_shader()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2439,6 +2439,10 @@ extern ir_function_signature *
|
|||
_mesa_glsl_find_builtin_function(_mesa_glsl_parse_state *state,
|
||||
const char *name, exec_list *actual_parameters);
|
||||
|
||||
extern ir_function *
|
||||
_mesa_glsl_find_builtin_function_by_name(_mesa_glsl_parse_state *state,
|
||||
const char *name);
|
||||
|
||||
extern gl_shader *
|
||||
_mesa_glsl_get_builtin_function_shader(void);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue