[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