If another layout qualifier appeared to the left of `invocations` in the
GS input layout declaration, the invocation count would be dropped on
the floor.

Fixes the piglit test:

spec/ARB_transform_feedback3/arb_transform_feedback3-ext_interleaved_two_bufs_gs_max

Signed-off-by: Chris Forbes <chr...@ijw.co.nz>
Cc: Ilia Mirkin <imir...@alum.mit.edu>
---

Note that the handling of the special rules for layout declarations in general 
is a bit of a disaster -- merge_in_qualifier tries to do the right thing, but 
merge_qualifier still ends up coming into play in various cases. It's probably 
better to dispose of the distinction within the parser, and disallow qualifiers 
appearing in the wrong contexts later. (This is what is already done to 
disallow layout-declaration-only qualifiers on variables)

 src/glsl/ast_type.cpp | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/src/glsl/ast_type.cpp b/src/glsl/ast_type.cpp
index 77053d5..ddd1f4e 100644
--- a/src/glsl/ast_type.cpp
+++ b/src/glsl/ast_type.cpp
@@ -154,6 +154,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 ((q.flags.i & ubo_mat_mask.flags.i) != 0)
       this->flags.i &= ~ubo_mat_mask.flags.i;
    if ((q.flags.i & ubo_layout_mask.flags.i) != 0)
-- 
2.0.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to