glsl: Make interlock builtins follow same compiler rules as barriers

Generalize the barrier code to provide correct error messages for
other builtins.

Fixes most of piglit compilation tests for
ARB_fragment_shader_interlock.

Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Plamena Manolova <plamena.manolova@intel.com>
This commit is contained in:
Caio Marcelo de Oliveira Filho 2019-06-05 00:59:11 -07:00
parent fb2169040a
commit b7c9fc72fd
1 changed files with 10 additions and 5 deletions

View File

@ -2387,22 +2387,27 @@ ast_function_expression::hir(exec_list *instructions,
new(ctx) ir_dereference_variable(mvp),
new(ctx) ir_dereference_variable(vtx));
} else {
if (state->stage == MESA_SHADER_TESS_CTRL &&
sig->is_builtin() && strcmp(func_name, "barrier") == 0) {
if (sig->is_builtin() &&
((state->stage == MESA_SHADER_TESS_CTRL &&
strcmp(func_name, "barrier") == 0) ||
(state->stage == MESA_SHADER_FRAGMENT &&
state->ARB_fragment_shader_interlock_enable &&
(strcmp(func_name, "beginInvocationInterlockARB") == 0 ||
strcmp(func_name, "endInvocationInterlockARB") == 0)))) {
if (state->current_function == NULL ||
strcmp(state->current_function->function_name(), "main") != 0) {
_mesa_glsl_error(&loc, state,
"barrier() may only be used in main()");
"%s() may only be used in main()", func_name);
}
if (state->found_return) {
_mesa_glsl_error(&loc, state,
"barrier() may not be used after return");
"%s() may not be used after return", func_name);
}
if (instructions != &state->current_function->body) {
_mesa_glsl_error(&loc, state,
"barrier() may not be used in control flow");
"%s() may not be used in control flow", func_name);
}
}