i965/cs: Use exec all for CS terminate
[mesa.git] / src / glsl / ast_type.cpp
index de4c1a410f6ae2b481226024f27d9db155c4ce6e..1bcf6a2e81f98511ca1e369224b184634b8392d6 100644 (file)
@@ -168,6 +168,16 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
       this->max_vertices = q.max_vertices;
    }
 
+   if (q.flags.q.invocations) {
+      if (this->flags.q.invocations && this->invocations != q.invocations) {
+         _mesa_glsl_error(loc, state,
+                          "geometry shader set conflicting invocations "
+                          "(%d and %d)", this->invocations, q.invocations);
+         return false;
+      }
+      this->invocations = q.invocations;
+   }
+
    if (state->stage == MESA_SHADER_GEOMETRY &&
        state->has_explicit_attrib_stream()) {
       if (q.flags.q.stream && q.stream >= state->ctx->Const.MaxVertexStreams) {
@@ -283,11 +293,7 @@ ast_type_qualifier::merge_in_qualifier(YYLTYPE *loc,
       valid_in_mask.flags.q.invocations = 1;
       break;
    case MESA_SHADER_FRAGMENT:
-      if (q.flags.q.early_fragment_tests) {
-         state->early_fragment_tests = true;
-      } else {
-         _mesa_glsl_error(loc, state, "invalid input layout qualifier");
-      }
+      valid_in_mask.flags.q.early_fragment_tests = 1;
       break;
    case MESA_SHADER_COMPUTE:
       create_cs_ast |=
@@ -335,6 +341,10 @@ ast_type_qualifier::merge_in_qualifier(YYLTYPE *loc,
       this->invocations = q.invocations;
    }
 
+   if (q.flags.q.early_fragment_tests) {
+      state->fs_early_fragment_tests = true;
+   }
+
    if (create_gs_ast) {
       node = new(mem_ctx) ast_gs_input_layout(*loc, q.prim_type);
    } else if (create_cs_ast) {