glsl: reject invalid input layout qualifiers
authorTimothy Arceri <timothy.arceri@collabora.com>
Sat, 13 Feb 2016 05:17:12 +0000 (16:17 +1100)
committerTimothy Arceri <timothy.arceri@collabora.com>
Sat, 5 Mar 2016 08:07:09 +0000 (19:07 +1100)
Global in validation is already handled, this will do the validation
for variables, blocks and block members.

This fixes some CTS tests for the new enhanced layouts transform
feedback qualifiers.

V2: add some more valid input flags
Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
src/compiler/glsl/ast_type.cpp

index dcd83efa6ff0895fd1ffb19bad6f2c3008934c38..6b446a1d272605c75b9cee24321e3521c46b51d2 100644 (file)
@@ -134,6 +134,28 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
    stream_layout_mask.flags.i = 0;
    stream_layout_mask.flags.q.stream = 1;
 
+   /* FIXME: We should probably do interface and function param validation
+    * separately.
+    */
+   ast_type_qualifier input_layout_mask;
+   input_layout_mask.flags.i = 0;
+   input_layout_mask.flags.q.centroid = 1;
+   /* Function params can have constant */
+   input_layout_mask.flags.q.constant = 1;
+   input_layout_mask.flags.q.explicit_location = 1;
+   input_layout_mask.flags.q.flat = 1;
+   input_layout_mask.flags.q.in = 1;
+   input_layout_mask.flags.q.invariant = 1;
+   input_layout_mask.flags.q.noperspective = 1;
+   input_layout_mask.flags.q.origin_upper_left = 1;
+   /* Function params 'inout' will set this */
+   input_layout_mask.flags.q.out = 1;
+   input_layout_mask.flags.q.patch = 1;
+   input_layout_mask.flags.q.pixel_center_integer = 1;
+   input_layout_mask.flags.q.precise = 1;
+   input_layout_mask.flags.q.sample = 1;
+   input_layout_mask.flags.q.smooth = 1;
+
    /* Uniform block layout qualifiers get to overwrite each
     * other (rightmost having priority), while all other
     * qualifiers currently don't allow duplicates.
@@ -258,6 +280,13 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
 
    this->flags.i |= q.flags.i;
 
+   if (this->flags.q.in &&
+       (this->flags.i & ~input_layout_mask.flags.i) != 0) {
+      _mesa_glsl_error(loc, state,
+                      "invalid input layout qualifier used");
+      return false;
+   }
+
    if (q.flags.q.explicit_location)
       this->location = q.location;