glsl: Check the subroutine associated functions names
Adding compile time check for subroutine functions with
the same names. Similar check for intrastage linking was already
landed in commit 5f0567a4f6
.
From Section 6.1.2 (Subroutines) of the GLSL 4.00 specification
"A program will fail to compile or link if any shader
or stage contains two or more functions with the same
name if the name is associated with a subroutine type."
Fixes:
* no-overloads.vert
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108109
Signed-off-by: Vadym Shovkoplias <vadym.shovkoplias@globallogic.com>
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
This commit is contained in:

committed by
Tapani Pälli

parent
d2ea3d4a76
commit
ad558408ff
@@ -66,6 +66,9 @@ using namespace ir_builder;
|
||||
static void
|
||||
detect_conflicting_assignments(struct _mesa_glsl_parse_state *state,
|
||||
exec_list *instructions);
|
||||
static void
|
||||
verify_subroutine_associated_funcs(struct _mesa_glsl_parse_state *state);
|
||||
|
||||
static void
|
||||
remove_per_vertex_blocks(exec_list *instructions,
|
||||
_mesa_glsl_parse_state *state, ir_variable_mode mode);
|
||||
@@ -155,6 +158,7 @@ _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state)
|
||||
foreach_list_typed (ast_node, ast, link, & state->translation_unit)
|
||||
ast->hir(instructions, state);
|
||||
|
||||
verify_subroutine_associated_funcs(state);
|
||||
detect_recursion_unlinked(state, instructions);
|
||||
detect_conflicting_assignments(state, instructions);
|
||||
|
||||
@@ -8680,6 +8684,38 @@ detect_conflicting_assignments(struct _mesa_glsl_parse_state *state,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
verify_subroutine_associated_funcs(struct _mesa_glsl_parse_state *state)
|
||||
{
|
||||
YYLTYPE loc;
|
||||
memset(&loc, 0, sizeof(loc));
|
||||
|
||||
/* Section 6.1.2 (Subroutines) of the GLSL 4.00 spec says:
|
||||
*
|
||||
* "A program will fail to compile or link if any shader
|
||||
* or stage contains two or more functions with the same
|
||||
* name if the name is associated with a subroutine type."
|
||||
*/
|
||||
|
||||
for (int i = 0; i < state->num_subroutines; i++) {
|
||||
unsigned definitions = 0;
|
||||
ir_function *fn = state->subroutines[i];
|
||||
/* Calculate number of function definitions with the same name */
|
||||
foreach_in_list(ir_function_signature, sig, &fn->signatures) {
|
||||
if (sig->is_defined) {
|
||||
if (++definitions > 1) {
|
||||
_mesa_glsl_error(&loc, state,
|
||||
"%s shader contains two or more function "
|
||||
"definitions with name `%s', which is "
|
||||
"associated with a subroutine type.\n",
|
||||
_mesa_shader_stage_to_string(state->stage),
|
||||
fn->name);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
remove_per_vertex_blocks(exec_list *instructions,
|
||||
|
Reference in New Issue
Block a user