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:
Samuel Iglesias Gonsalvez 2014-11-25 16:36:53 +01:00
parent 19252fee46
commit 187ace73a9
3 changed files with 36 additions and 0 deletions

View file

@ -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.

View file

@ -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()
{

View file

@ -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);