Fixes piglit layout-*-non-uniform and layout-*-within-block.
---
 src/glsl/ast.h                  |    6 ++++++
 src/glsl/ast_to_hir.cpp         |   36 +++++++++++++++++++++++++++++++++---
 src/glsl/glsl_parser.yy         |    2 ++
 src/glsl/glsl_parser_extras.cpp |    1 +
 4 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/src/glsl/ast.h b/src/glsl/ast.h
index 4438b85..de3f2df 100644
--- a/src/glsl/ast.h
+++ b/src/glsl/ast.h
@@ -513,6 +513,12 @@ public:
     * is used to note these cases when no type is specified.
     */
    int invariant;
+
+   /**
+    * Flag indicating that these declarators are in a uniform block,
+    * allowing UBO type qualifiers.
+    */
+   bool ubo_qualifiers_valid;
 };
 
 
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index bbe8f05..fc3b547 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -1917,7 +1917,8 @@ static void
 apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
                                 ir_variable *var,
                                 struct _mesa_glsl_parse_state *state,
-                                YYLTYPE *loc)
+                                YYLTYPE *loc,
+                                bool ubo_qualifiers_valid)
 {
    if (qual->flags.q.invariant) {
       if (var->used) {
@@ -2191,6 +2192,23 @@ apply_type_qualifier_to_variable(const struct 
ast_type_qualifier *qual,
        var->depth_layout = ir_depth_layout_unchanged;
    else
        var->depth_layout = ir_depth_layout_none;
+
+   if (qual->flags.q.std140 ||
+       qual->flags.q.packed ||
+       qual->flags.q.shared) {
+      _mesa_glsl_error(loc, state,
+                       "uniform block layout qualifiers std140, packed, and "
+                      "shared can only be applied to uniform blocks, not "
+                      "members");
+   }
+
+   if (!ubo_qualifiers_valid &&
+       (qual->flags.q.row_major || qual->flags.q.column_major)) {
+      _mesa_glsl_error(loc, state,
+                       "uniform block layout qualifiers row_major and "
+                      "column_major can only be applied to uniform block "
+                      "members");
+   }
 }
 
 /**
@@ -2611,7 +2629,7 @@ ast_declarator_list::hir(exec_list *instructions,
       }
 
       apply_type_qualifier_to_variable(& this->type->qualifier, var, state,
-                                      & loc);
+                                      & loc, this->ubo_qualifiers_valid);
 
       if (this->type->qualifier.flags.q.invariant) {
         if ((state->target == vertex_shader) && !(var->mode == ir_var_out ||
@@ -3028,7 +3046,8 @@ ast_parameter_declarator::hir(exec_list *instructions,
    /* Apply any specified qualifiers to the parameter declaration.  Note that
     * for function parameters the default mode is 'in'.
     */
-   apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & 
loc);
+   apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc,
+                                   false);
 
    /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
     *
@@ -3997,6 +4016,17 @@ ast_uniform_block::hir(exec_list *instructions,
     * need to turn those into ir_variables with an association
     * with this uniform block.
     */
+   exec_list ubo_variables;
+
+   foreach_list_typed(ast_declarator_list, decl_list, link, &declarations) {
+      exec_list declared_variables;
+
+      decl_list->hir(&declared_variables, state);
+
+      ubo_variables.append_list(&declared_variables);
+   }
+
+   instructions->append_list(&ubo_variables);
    return NULL;
 }
 
diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index ccc1abb..09c37d1 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -1962,6 +1962,7 @@ member_declaration:
           type->specifier = $3;
           $$ = new(ctx) ast_declarator_list(type);
           $$->set_location(yylloc);
+          $$->ubo_qualifiers_valid = true;
 
           $$->declarations.push_degenerate_list_at_head(& $4->link);
        }
@@ -1975,6 +1976,7 @@ member_declaration:
           type->specifier = $2;
           $$ = new(ctx) ast_declarator_list(type);
           $$->set_location(yylloc);
+          $$->ubo_qualifiers_valid = true;
 
           $$->declarations.push_degenerate_list_at_head(& $3->link);
        }
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
index d9ee406..df40459 100644
--- a/src/glsl/glsl_parser_extras.cpp
+++ b/src/glsl/glsl_parser_extras.cpp
@@ -773,6 +773,7 @@ 
ast_declarator_list::ast_declarator_list(ast_fully_specified_type *type)
 {
    this->type = type;
    this->invariant = false;
+   this->ubo_qualifiers_valid = false;
 }
 
 void
-- 
1.7.10

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

Reply via email to