On Thu, Sep 10, 2015 at 03:35:42PM +0200, Iago Toral Quiroga wrote: > From: Samuel Iglesias Gonsalvez <sigles...@igalia.com> > > v2: > - Fix a missing check in has_layout() > > Signed-off-by: Samuel Iglesias Gonsalvez <sigles...@igalia.com> > Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com> > --- > src/glsl/ast.h | 1 + > src/glsl/ast_to_hir.cpp | 20 ++++++++++++++++---- > src/glsl/ast_type.cpp | 2 ++ > src/glsl/glsl_parser.yy | 2 ++ > src/glsl/glsl_types.h | 3 ++- > src/glsl/link_uniform_blocks.cpp | 15 ++++++++++++--- > src/mesa/main/mtypes.h | 3 ++- > 7 files changed, 37 insertions(+), 9 deletions(-) > > diff --git a/src/glsl/ast.h b/src/glsl/ast.h > index cca32b3..4c31436 100644 > --- a/src/glsl/ast.h > +++ b/src/glsl/ast.h > @@ -491,6 +491,7 @@ struct ast_type_qualifier { > /** \name Layout qualifiers for GL_ARB_uniform_buffer_object */ > /** \{ */ > unsigned std140:1; > + unsigned std430:1; > unsigned shared:1; > unsigned packed:1; > unsigned column_major:1; > diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp > index 92038a6..566cc87 100644 > --- a/src/glsl/ast_to_hir.cpp > +++ b/src/glsl/ast_to_hir.cpp > @@ -2920,11 +2920,12 @@ apply_type_qualifier_to_variable(const struct > ast_type_qualifier *qual, > var->data.depth_layout = ir_depth_layout_none; > > if (qual->flags.q.std140 || > + qual->flags.q.std430 || > 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 " > + "uniform block layout qualifiers std140, std430, > packed, " > + "and shared can only be applied to uniform blocks, > not " > "members");
Update the error to also mention shader storage blocks, not just ubos? > } > > @@ -5691,12 +5692,14 @@ ast_process_structure_or_interface_block(exec_list > *instructions, > const struct ast_type_qualifier *const qual = > & decl_list->type->qualifier; > if (qual->flags.q.std140 || > + qual->flags.q.std430 || > qual->flags.q.packed || > qual->flags.q.shared) { > _mesa_glsl_error(&loc, state, > "uniform/shader storage block layout qualifiers > " > - "std140, packed, and shared can only be applied > " > - "to uniform/shader storage blocks, not > members"); > + "std140, std430, packed, and shared can only be > " > + "applied to uniform/shader storage blocks, not " > + "members"); > } > > if (qual->flags.q.constant) { > @@ -5908,6 +5911,13 @@ ast_interface_block::hir(exec_list *instructions, > this->block_name); > } > > + if (!this->layout.flags.q.buffer && > + this->layout.flags.q.std430) { > + _mesa_glsl_error(&loc, state, > + "std430 storage block layout qualifier is supported " > + "only for shader storage blocks"); > + } > + > /* The ast_interface_block has a list of ast_declarator_lists. We > * need to turn those into ir_variables with an association > * with this uniform block. > @@ -5917,6 +5927,8 @@ ast_interface_block::hir(exec_list *instructions, > packing = GLSL_INTERFACE_PACKING_SHARED; > } else if (this->layout.flags.q.packed) { > packing = GLSL_INTERFACE_PACKING_PACKED; > + } else if (this->layout.flags.q.std430) { > + packing = GLSL_INTERFACE_PACKING_STD430; > } else { > /* The default layout is std140. > */ > diff --git a/src/glsl/ast_type.cpp b/src/glsl/ast_type.cpp > index a4671e2..08a4504 100644 > --- a/src/glsl/ast_type.cpp > +++ b/src/glsl/ast_type.cpp > @@ -65,6 +65,7 @@ ast_type_qualifier::has_layout() const > || this->flags.q.depth_less > || this->flags.q.depth_unchanged > || this->flags.q.std140 > + || this->flags.q.std430 > || this->flags.q.shared > || this->flags.q.column_major > || this->flags.q.row_major > @@ -123,6 +124,7 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc, > ubo_layout_mask.flags.q.std140 = 1; > ubo_layout_mask.flags.q.packed = 1; > ubo_layout_mask.flags.q.shared = 1; > + ubo_layout_mask.flags.q.std430 = 1; > > ast_type_qualifier ubo_binding_mask; > ubo_binding_mask.flags.i = 0; > diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy > index 028974e..4cb018a 100644 > --- a/src/glsl/glsl_parser.yy > +++ b/src/glsl/glsl_parser.yy > @@ -1199,6 +1199,8 @@ layout_qualifier_id: > $$.flags.q.std140 = 1; > } else if (match_layout_qualifier($1, "shared", state) == 0) { > $$.flags.q.shared = 1; > + } else if (match_layout_qualifier($1, "std430", state) == 0) { > + $$.flags.q.std430 = 1; > } else if (match_layout_qualifier($1, "column_major", state) == 0) { > $$.flags.q.column_major = 1; > /* "row_major" is a reserved word in GLSL 1.30+. Its token is parsed > diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h > index 5a6548d..36d15b0 100644 > --- a/src/glsl/glsl_types.h > +++ b/src/glsl/glsl_types.h > @@ -77,7 +77,8 @@ enum glsl_sampler_dim { > enum glsl_interface_packing { > GLSL_INTERFACE_PACKING_STD140, > GLSL_INTERFACE_PACKING_SHARED, > - GLSL_INTERFACE_PACKING_PACKED > + GLSL_INTERFACE_PACKING_PACKED, > + GLSL_INTERFACE_PACKING_STD430 > }; > > enum glsl_matrix_layout { > diff --git a/src/glsl/link_uniform_blocks.cpp > b/src/glsl/link_uniform_blocks.cpp > index 4df39e2..c891d03 100644 > --- a/src/glsl/link_uniform_blocks.cpp > +++ b/src/glsl/link_uniform_blocks.cpp > @@ -119,8 +119,16 @@ private: > v->IndexName = v->Name; > } > > - const unsigned alignment = type->std140_base_alignment(v->RowMajor); > - unsigned size = type->std140_size(v->RowMajor); > + unsigned alignment = 0; > + unsigned size = 0; > + > + if (v->Type->interface_packing == GLSL_INTERFACE_PACKING_STD430) { > + alignment = type->std430_base_alignment(v->RowMajor); > + size = type->std430_size(v->RowMajor); > + } else { > + alignment = type->std140_base_alignment(v->RowMajor); > + size = type->std140_size(v->RowMajor); > + } > > this->offset = glsl_align(this->offset, alignment); > v->Offset = this->offset; > @@ -255,7 +263,8 @@ link_uniform_blocks(void *mem_ctx, > == unsigned(ubo_packing_shared)); > STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_PACKED) > == unsigned(ubo_packing_packed)); > - > + STATIC_ASSERT(unsigned(GLSL_INTERFACE_PACKING_STD430) > + == unsigned(ubo_packing_std430)); > > hash_table_foreach (block_hash, entry) { > const struct link_uniform_block_active *const b = > diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h > index 85a9f5d..7d9d5ed 100644 > --- a/src/mesa/main/mtypes.h > +++ b/src/mesa/main/mtypes.h > @@ -2453,7 +2453,8 @@ enum gl_uniform_block_packing > { > ubo_packing_std140, > ubo_packing_shared, > - ubo_packing_packed > + ubo_packing_packed, > + ubo_packing_std430 > }; > > > -- > 1.9.1 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev