[Mesa-dev] [PATCH 06/18] glsl: Turn UBO variable declarations into ir_variables and check qualifiers.

Eric Anholt eric at anholt.net
Wed Jul 4 11:34:31 PDT 2012


Kenneth Graunke <kenneth at 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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20120704/2a701368/attachment.pgp>


More information about the mesa-dev mailing list