[Mesa-dev] [PATCH] glsl: Fix merging of layout(invocations) with other qualifiers

Chris Forbes chrisf at ijw.co.nz
Fri Jun 27 02:21:32 PDT 2014


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 <chrisf at ijw.co.nz>
Cc: Ilia Mirkin <imirkin at 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



More information about the mesa-dev mailing list