mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 07:00:12 +01:00
glsl/linker: Check the subroutine associated functions names
>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."
v2:
- error out earlier (Tapani)
- style fixes (Iago)
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: Iago Toral Quiroga <itoral@igalia.com>
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
This commit is contained in:
parent
ed53a79cf8
commit
5f0567a4f6
1 changed files with 40 additions and 0 deletions
|
|
@ -4639,6 +4639,45 @@ link_assign_subroutine_types(struct gl_shader_program *prog)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
verify_subroutine_associated_funcs(struct gl_shader_program *prog)
|
||||||
|
{
|
||||||
|
unsigned mask = prog->data->linked_stages;
|
||||||
|
while (mask) {
|
||||||
|
const int i = u_bit_scan(&mask);
|
||||||
|
gl_program *p = prog->_LinkedShaders[i]->Program;
|
||||||
|
glsl_symbol_table *symbols = prog->_LinkedShaders[i]->symbols;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* From OpenGL ES Shading Language 4.00 specification
|
||||||
|
* (6.1.2 Subroutines):
|
||||||
|
* "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 (unsigned j = 0; j < p->sh.NumSubroutineFunctions; j++) {
|
||||||
|
unsigned definitions = 0;
|
||||||
|
char *name = p->sh.SubroutineFunctions[j].name;
|
||||||
|
ir_function *fn = symbols->get_function(name);
|
||||||
|
|
||||||
|
/* 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) {
|
||||||
|
linker_error(prog, "%s shader contains two or more function "
|
||||||
|
"definitions with name `%s', which is "
|
||||||
|
"associated with a subroutine type.\n",
|
||||||
|
_mesa_shader_stage_to_string(i),
|
||||||
|
fn->name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_always_active_io(exec_list *ir, ir_variable_mode io_mode)
|
set_always_active_io(exec_list *ir, ir_variable_mode io_mode)
|
||||||
{
|
{
|
||||||
|
|
@ -5024,6 +5063,7 @@ link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
|
||||||
|
|
||||||
check_explicit_uniform_locations(ctx, prog);
|
check_explicit_uniform_locations(ctx, prog);
|
||||||
link_assign_subroutine_types(prog);
|
link_assign_subroutine_types(prog);
|
||||||
|
verify_subroutine_associated_funcs(prog);
|
||||||
|
|
||||||
if (!prog->data->LinkStatus)
|
if (!prog->data->LinkStatus)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue