[Mesa-dev] [PATCH 06/32] glsl: Parse interface array size

Paul Berry stereotype441 at gmail.com
Wed Jan 23 13:54:43 PST 2013


On 22 January 2013 00:51, Ian Romanick <idr at freedesktop.org> wrote:

> From: Ian Romanick <ian.d.romanick at intel.com>
>
> For now, just drop the value on the floor.
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/glsl/ast.h          | 12 ++++++-----
>  src/glsl/glsl_parser.yy | 55
> ++++++++++++++++++++++++++++++++++++++-----------
>  2 files changed, 50 insertions(+), 17 deletions(-)
>
> diff --git a/src/glsl/ast.h b/src/glsl/ast.h
> index bcec6bb..e525cb2 100644
> --- a/src/glsl/ast.h
> +++ b/src/glsl/ast.h
> @@ -804,12 +804,12 @@ public:
>  class ast_uniform_block : public ast_node {
>  public:
>     ast_uniform_block(ast_type_qualifier layout,
> -                    const char *block_name,
> -                    ast_declarator_list *member_list,
> -                     const char *instance_name)
> -   : layout(layout), block_name(block_name), instance_name(instance_name)
> +                     const char *instance_name,
> +                    ast_expression *array_size)
> +   : layout(layout), block_name(NULL), instance_name(instance_name),
> +     array_size(array_size)
>     {
> -      declarations.push_degenerate_list_at_head(&member_list->link);
> +      /* empty */
>     }
>
>     virtual ir_rvalue *hir(exec_list *instructions,
> @@ -820,6 +820,8 @@ public:
>     const char *instance_name;
>     /** List of ast_declarator_list * */
>     exec_list declarations;
> +
> +   ast_expression *array_size;
>

It would be nice to have a comment here explaining that this member is NULL
if the ast_uniform_block lacks array nature.


>  };
>  /*@}*/
>
> diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
> index 81ae5d5..154ce2d 100644
> --- a/src/glsl/glsl_parser.yy
> +++ b/src/glsl/glsl_parser.yy
> @@ -79,6 +79,7 @@ static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state
> *st, const char *msg)
>     ast_case_label_list *case_label_list;
>     ast_case_statement *case_statement;
>     ast_case_statement_list *case_statement_list;
> +   ast_uniform_block *uniform_block;
>
>     struct {
>        ast_node *cond;
> @@ -112,7 +113,7 @@ static void yyerror(YYLTYPE *loc,
> _mesa_glsl_parse_state *st, const char *msg)
>  %token STRUCT VOID_TOK WHILE
>  %token <identifier> IDENTIFIER TYPE_IDENTIFIER NEW_IDENTIFIER
>  %type <identifier> any_identifier
> -%type <identifier> instance_name_opt
> +%type <uniform_block> instance_name_opt
>  %token <real> FLOATCONSTANT
>  %token <n> INTCONSTANT UINTCONSTANT BOOLCONSTANT
>  %token <identifier> FIELD_SELECTION
> @@ -221,7 +222,8 @@ static void yyerror(YYLTYPE *loc,
> _mesa_glsl_parse_state *st, const char *msg)
>  %type <node> declaration
>  %type <node> declaration_statement
>  %type <node> jump_statement
> -%type <node> uniform_block basic_uniform_block
> +%type <node> uniform_block
> +%type <uniform_block> basic_uniform_block
>  %type <struct_specifier> struct_specifier
>  %type <declarator_list> struct_declaration_list
>  %type <declarator_list> struct_declaration
> @@ -1891,7 +1893,7 @@ uniform_block:
>         }
>         | layout_qualifier basic_uniform_block
>         {
> -          ast_uniform_block *block = (ast_uniform_block *) $2;
> +          ast_uniform_block *block = $2;
>            if (!block->layout.merge_qualifier(& @1, state, $1)) {
>               YYERROR;
>            }
> @@ -1902,9 +1904,10 @@ uniform_block:
>  basic_uniform_block:
>         UNIFORM NEW_IDENTIFIER '{' member_list '}' instance_name_opt ';'
>         {
> -          void *ctx = state;
> -          $$ = new(ctx)
> ast_uniform_block(*state->default_uniform_qualifier,
> -                                          $2, $4, $6);
> +          ast_uniform_block *const block = $6;
> +
> +          block->block_name = $2;
> +          block->declarations.push_degenerate_list_at_head(& $4->link);
>
>            if (!state->ARB_uniform_buffer_object_enable) {
>               _mesa_glsl_error(& @1, state,
> @@ -1915,21 +1918,49 @@ basic_uniform_block:
>                                  "#version 140 /
> GL_ARB_uniform_buffer_object "
>                                  "required for defining uniform blocks\n");
>            }
> +
> +          /* Since block arrays require names, and both features are
> added in
> +           * the same language versions, we don't have to explicitly
> +           * version-check both things.
> +           */
> +          if (block->instance_name != NULL
> +              && !(state->language_version == 300 && state->es_shader)) {
>

This would be another good place to use
_mesa_glsl_parse_state::is_version().  Or, if you prefer, you can use
_mesa_glsl_parse_state::check_version(), which also takes care of
generating an appropriate error message.


> +             _mesa_glsl_error(& @1, state,
> +                              "#version 300 es required for using uniform
> "
> +                              "blocks with an instance name\n");
> +          }
> +
> +          $$ = block;
>         }
>         ;
>
>  instance_name_opt:
>         /* empty */
>         {
> -          $$ = NULL;
> +          $$ = new(state)
> ast_uniform_block(*state->default_uniform_qualifier,
> +                                            NULL,
> +                                            NULL);
>         }
>         | NEW_IDENTIFIER
>         {
> -          if (!(state->language_version == 300 && state->es_shader)) {
> -             _mesa_glsl_error(& @1, state,
> -                              "#version 300 es required for using uniform
> "
> -                              "blocks with an instance name\n");
> -          }
> +          $$ = new(state)
> ast_uniform_block(*state->default_uniform_qualifier,
> +                                            $1,
> +                                            NULL);
> +       }
> +       | NEW_IDENTIFIER '[' constant_expression ']'
> +       {
> +          $$ = new(state)
> ast_uniform_block(*state->default_uniform_qualifier,
> +                                            $1,
> +                                            $3);
> +       }
> +       | NEW_IDENTIFIER '[' ']'
> +       {
> +          _mesa_glsl_error(& @1, state,
> +                           "instance block arrays must be explicitly
> sized\n");
> +
> +          $$ = new(state)
> ast_uniform_block(*state->default_uniform_qualifier,
> +                                            $1,
> +                                            NULL);
>         }
>         ;
>
> --
> 1.7.11.7
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>

With those changes,

Reviewed-by: Paul Berry <stereotype441 at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130123/b7cfed93/attachment.html>


More information about the mesa-dev mailing list