Kenneth Graunke <kenn...@whitecape.org> writes: > On 07/02/2012 05:38 PM, Eric Anholt wrote: >> 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); > > Too many lists!! > > foreach_list_typed(ast_declarator_list, decl_list, link, &declarations) { > decl_list->hir(&instructions, state); > } > > ...should work just fine. Otherwise, this looks OK to me.
The next commit would be introducing declared_variables, then. I've dropped ubo_variables, though.
pgpN5Z45dLtNT.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev