[Mesa-dev] [PATCH 07/11] glsl: Merge UBO layout qualifiers in a qualifier list.

Eric Anholt eric at anholt.net
Fri Jul 20 15:33:18 PDT 2012


Yes, you get to say things like "layout(row_major, column_major)" and
get column major.

Part of fixing piglit ARB_uniform_buffer_object/row_major.
---
 src/glsl/glsl_parser.yy |   24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index 0ed424d..2787721 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -1106,13 +1106,35 @@ layout_qualifier_id_list:
 	layout_qualifier_id
 	| layout_qualifier_id_list ',' layout_qualifier_id
 	{
-	   if (($1.flags.i & $3.flags.i) != 0) {
+	   ast_type_qualifier ubo_mat_mask;
+	   ubo_mat_mask.flags.i = 0;
+	   ubo_mat_mask.flags.q.row_major = 1;
+	   ubo_mat_mask.flags.q.column_major = 1;
+
+	   ast_type_qualifier ubo_layout_mask;
+	   ubo_layout_mask.flags.i = 0;
+	   ubo_layout_mask.flags.q.std140 = 1;
+	   ubo_layout_mask.flags.q.packed = 1;
+	   ubo_layout_mask.flags.q.shared = 1;
+
+	   /* Uniform block layout qualifiers get to overwrite each
+	    * other (rightmost having priority), while all other
+	    * qualifiers currently don't allow duplicates.
+	    */
+	   if (($1.flags.i & $3.flags.i & ~(ubo_mat_mask.flags.i |
+					    ubo_layout_mask.flags.i)) != 0) {
 	      _mesa_glsl_error(& @3, state,
 			       "duplicate layout qualifiers used\n");
 	      YYERROR;
 	   }
 
 	   $$ = $1;
+
+	   if (($3.flags.i & ubo_mat_mask.flags.i) != 0)
+	      $$.flags.i &= ~ubo_mat_mask.flags.i;
+	   if (($3.flags.i & ubo_layout_mask.flags.i) != 0)
+	      $$.flags.i &= ~ubo_layout_mask.flags.i;
+
 	   $$.flags.i |= $3.flags.i;
 
 	   if ($3.flags.q.explicit_location)
-- 
1.7.10.4



More information about the mesa-dev mailing list