On 18/09/15 20:14, Kristian Høgsberg wrote: > 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? >
OK, I will do it. Sam >> } >> >> @@ -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