glsl: parse component layout qualifier
authorTimothy Arceri <timothy.arceri@collabora.com>
Tue, 10 Nov 2015 01:47:46 +0000 (12:47 +1100)
committerTimothy Arceri <timothy.arceri@collabora.com>
Sun, 1 May 2016 13:12:52 +0000 (23:12 +1000)
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/glsl/ast.h
src/compiler/glsl/ast_type.cpp
src/compiler/glsl/glsl_parser.yy

index 92aa39e64b868617787caa8b95cb1e94544a374c..fb25bb357a3df2de0a54e2406e4c3343bb5dfdd3 100644 (file)
@@ -502,6 +502,12 @@ struct ast_type_qualifier {
          */
         unsigned explicit_index:1;
 
+        /**
+         * Flag set if GL_ARB_enhanced_layouts "component" layout
+         * qualifier is used.
+         */
+        unsigned explicit_component:1;
+
          /**
           * Flag set if GL_ARB_shading_language_420pack "binding" layout
           * qualifier is used.
@@ -621,6 +627,14 @@ struct ast_type_qualifier {
     */
    ast_expression *index;
 
+   /**
+    * Component specified via GL_ARB_enhaced_layouts
+    *
+    * \note
+    * This field is only valid if \c explicit_component is set.
+    */
+   ast_expression *component;
+
    /** Maximum output vertices in GLSL 1.50 geometry shaders. */
    ast_layout_expression *max_vertices;
 
index 7a0014b5d7f924c297cb12349d22275f81342798..6d230797ea7bb046db9b17ac35123913d530ee4c 100644 (file)
@@ -337,6 +337,9 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
    if (q.flags.q.explicit_index)
       this->index = q.index;
 
+  if (q.flags.q.explicit_component)
+      this->component = q.component;
+
    if (q.flags.q.explicit_binding)
       this->binding = q.binding;
 
index 1cecc09b8c86ae9301363ee33b3a74f2a074bfd2..09e346da164e3743883d6edf0f16f7366be969ba 100644 (file)
@@ -1497,6 +1497,17 @@ layout_qualifier_id:
          $$.location = $3;
       }
 
+      if (match_layout_qualifier("component", $1, state) == 0) {
+         if (!state->has_enhanced_layouts()) {
+            _mesa_glsl_error(& @1, state,
+                             "component qualifier requires "
+                             "GLSL 4.40 or ARB_enhanced_layouts");
+         } else {
+            $$.flags.q.explicit_component = 1;
+            $$.component = $3;
+         }
+      }
+
       if (match_layout_qualifier("index", $1, state) == 0) {
          if (state->es_shader && !state->EXT_blend_func_extended_enable) {
             _mesa_glsl_error(& @3, state, "index layout qualifier requires EXT_blend_func_extended");