From b572b599efb29f1d28ab0595b762e2d24012d9ed Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Fri, 6 May 2016 11:28:40 +1000 Subject: 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 Signed-off-by: Dave Airlie --- src/compiler/glsl/ast_to_hir.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/compiler/glsl') diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index a524fbdc56f..434734d09af 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -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, -- cgit v1.2.3