glsl: validate subroutine types match function signature.

This fixes:
GL43-CTS.shader_subroutine.subroutines_incompatible_with_subroutine_type

It just makes sure the signatures match as well as the return
types.

Reviewed-by: Chris Forbes <chrisforbes@google.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie
2016-05-06 11:28:40 +10:00
parent ba3414d832
commit b572b599ef

View File

@@ -5522,6 +5522,24 @@ ast_function::hir(exec_list *instructions,
if (!type) {
_mesa_glsl_error(& loc, state, "unknown type '%s' in subroutine function definition", decl->identifier);
}
for (int i = 0; i < state->num_subroutine_types; i++) {
ir_function *fn = state->subroutine_types[i];
ir_function_signature *tsig = NULL;
if (strcmp(fn->name, decl->identifier))
continue;
tsig = fn->matching_signature(state, &sig->parameters,
false);
if (!tsig) {
_mesa_glsl_error(& loc, state, "subroutine type mismatch '%s' - signatures do not match\n", decl->identifier);
} else {
if (tsig->return_type != sig->return_type) {
_mesa_glsl_error(& loc, state, "subroutine type mismatch '%s' - return types do not match\n", decl->identifier);
}
}
}
f->subroutine_types[idx++] = type;
}
state->subroutines = (ir_function **)reralloc(state, state->subroutines,