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:
@@ -5522,6 +5522,24 @@ ast_function::hir(exec_list *instructions,
|
|||||||
if (!type) {
|
if (!type) {
|
||||||
_mesa_glsl_error(& loc, state, "unknown type '%s' in subroutine function definition", decl->identifier);
|
_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;
|
f->subroutine_types[idx++] = type;
|
||||||
}
|
}
|
||||||
state->subroutines = (ir_function **)reralloc(state, state->subroutines,
|
state->subroutines = (ir_function **)reralloc(state, state->subroutines,
|
||||||
|
Reference in New Issue
Block a user