glsl: Make interlock builtins follow same compiler rules as barriers
authorCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Wed, 5 Jun 2019 07:59:11 +0000 (00:59 -0700)
committerCaio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
Mon, 10 Jun 2019 21:29:26 +0000 (14:29 -0700)
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>
src/compiler/glsl/ast_function.cpp

index 6bd8987cd9b7e173d6b7f4dbc8f49c5da291e722..a35bd63fa41ef638d419ad476b5b83f49279d997 100644 (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);
             }
          }