[Mesa-dev] [PATCH] GLSL: Implementation of the GL_ARB_shading_language_420pack extension
Ian Romanick
idr at freedesktop.org
Wed May 1 15:37:07 PDT 2013
On 04/21/2013 04:08 PM, Todd Previte wrote:
> Initial work on the implementation of GL_ARB_shading_language_420pack.
> The patch adds the functionality from this extension which allows
> for C-style array initialization for GLSL. The extension enable bits
> and extension definition are also included in this patch.
I don't think this is enough. The GL_ARB_shading_language_420pack spec
says:
If an initializer is a list of initializers enclosed in curly
braces, the variable being declared must be a vector, a matrix,
an array, or a structure.
I don't think this code could handle:
struct S {
mat2 m[2];
vec2 v[2];
};
S s[] = {
{ /* m */ { 1, 2, 3, 4 },
/* v */ { 5, 6 }
},
{ /* m */ { 1, 2, 3, 4 },
/* v */ { 5, 6 }
},
{ /* m */ { 1, 2, 3, 4 },
/* v */ { 5, 6 }
}
};
I think we need to start with some tests.
> ---
> src/glsl/ast.h | 13 ++++++++++-
> src/glsl/ast_function.cpp | 25 ++++++++++++++++++++++
> src/glsl/ast_to_hir.cpp | 5 +++++
> src/glsl/glsl_parser.yy | 45 ++++++++++++++++++++++++++++++++++++++-
> src/glsl/glsl_parser_extras.cpp | 1 +
> src/glsl/glsl_parser_extras.h | 2 ++
> src/mesa/main/extensions.c | 1 +
> src/mesa/main/mtypes.h | 1 +
> 8 files changed, 91 insertions(+), 2 deletions(-)
>
> diff --git a/src/glsl/ast.h b/src/glsl/ast.h
> index 7300271..cf75250 100644
> --- a/src/glsl/ast.h
> +++ b/src/glsl/ast.h
> @@ -189,7 +189,8 @@ enum ast_operators {
> ast_float_constant,
> ast_bool_constant,
>
> - ast_sequence
> + ast_sequence,
> + ast_array_init
> };
>
> /**
> @@ -292,6 +293,16 @@ private:
> bool cons;
> };
>
> +/**
> + Array initialization class
> + */
> +class ast_array_initializer : public ast_expression {
> +public:
> + ast_array_initializer() : ast_expression(ast_array_init, NULL, NULL, NULL) { }
> + ast_type_specifier *constructor_type;
> + virtual ir_rvalue *hir(exec_list *instructions,
> + struct _mesa_glsl_parse_state *state);
> +};
>
> /**
> * Number of possible operators for an ast_expression
> diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp
> index 26f72cf..0143204 100644
> --- a/src/glsl/ast_function.cpp
> +++ b/src/glsl/ast_function.cpp
> @@ -1511,3 +1511,28 @@ ast_function_expression::hir(exec_list *instructions,
>
> return ir_rvalue::error_value(ctx);
> }
> +
> +ir_rvalue *
> +ast_array_initializer::hir(exec_list *instructions, struct _mesa_glsl_parse_state *state)
> +{
> + YYLTYPE loc = this->get_location();
> + ir_rvalue *result = NULL;
> + const char *name;
> + const glsl_type *const constructor_type = this->constructor_type->glsl_type(&name, state);
> +
> + // Check here for correct extension and extension enable
> + if (state->ARB_shading_language_420pack_enable) {
> + result = process_array_constructor(instructions,
> + constructor_type,
> + &loc,
> + &this->expressions,
> + state);
> + }
> + else {
> + _mesa_glsl_error(&loc, state, "C-style array initialization requires " \
> + "GL_ARB_shading_language_420pack extension\n");
> + }
> +
> + return result;
> +}
> +
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 2638411..44e289d 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -1026,6 +1026,11 @@ ast_expression::hir(exec_list *instructions,
> loc = this->get_location();
>
> switch (this->oper) {
> +
> + case ast_array_init:
> + assert(!"ast_array_init: Should never get here. Bad things have occurred.\n");
> + break;
> +
> case ast_assign: {
> op[0] = this->subexpressions[0]->hir(instructions, state);
> op[1] = this->subexpressions[1]->hir(instructions, state);
> diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
> index f52ed9b..d042c14 100644
> --- a/src/glsl/glsl_parser.yy
> +++ b/src/glsl/glsl_parser.yy
> @@ -220,6 +220,7 @@ static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state *st, const char *msg)
> %type <declarator_list> init_declarator_list
> %type <declarator_list> single_declaration
> %type <expression> initializer
> +%type <expression> initializer-list
> %type <node> declaration
> %type <node> declaration_statement
> %type <node> jump_statement
> @@ -1021,6 +1022,13 @@ single_declaration:
> $$ = new(ctx) ast_declarator_list($1);
> $$->set_location(yylloc);
> $$->declarations.push_tail(&decl->link);
> + if ($6->oper == ast_array_init)
> + {
> + ast_array_initializer *ai = (ast_array_initializer*)$6;
> + ai->constructor_type = new(ctx) ast_type_specifier("");
> + *ai->constructor_type = *$1->specifier;
> + ai->constructor_type->is_array = true;
> + }
> }
> | fully_specified_type any_identifier '[' constant_expression ']' '=' initializer
> {
> @@ -1030,6 +1038,14 @@ single_declaration:
> $$ = new(ctx) ast_declarator_list($1);
> $$->set_location(yylloc);
> $$->declarations.push_tail(&decl->link);
> + if ($7->oper == ast_array_init)
> + {
> + ast_array_initializer *ai = (ast_array_initializer*)$7;
> + ai->constructor_type = new(ctx) ast_type_specifier("");
> + *ai->constructor_type = *$1->specifier;
> + ai->constructor_type->is_array = true;
> + ai->constructor_type->array_size = $4;
> + }
> }
> | fully_specified_type any_identifier '=' initializer
> {
> @@ -1039,6 +1055,11 @@ single_declaration:
> $$ = new(ctx) ast_declarator_list($1);
> $$->set_location(yylloc);
> $$->declarations.push_tail(&decl->link);
> + if ($4->oper == ast_array_init)
> + {
> + ast_array_initializer *ai = (ast_array_initializer*)$4;
> + ai->constructor_type = $1->specifier;
> + }
> }
> | INVARIANT variable_identifier // Vertex only.
> {
> @@ -1563,7 +1584,29 @@ struct_declarator:
>
> initializer:
> assignment_expression
> - ;
> + | '{' initializer-list '}'
> + {
> + $$ = $2;
> + }
> + | '{' initializer-list ',' '}'
> + {
> + $$ = $2;
> + }
> + ;
> +
> +initializer-list:
> + initializer
> + {
> + void *ctx = state;
> + $$ = new(ctx) ast_array_initializer();
> + $$->set_location(yylloc);
> + $$->expressions.push_tail(& $1->link);
> + }
> + | initializer-list ',' initializer
> + {
> + $1->expressions.push_tail(& $3->link);
> + }
> + ;
>
> declaration_statement:
> declaration
> diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
> index 0992294..c954c07 100644
> --- a/src/glsl/glsl_parser_extras.cpp
> +++ b/src/glsl/glsl_parser_extras.cpp
> @@ -466,6 +466,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
> EXT(OES_standard_derivatives, false, false, true, false, true, OES_standard_derivatives),
> EXT(ARB_texture_cube_map_array, true, false, true, true, false, ARB_texture_cube_map_array),
> EXT(ARB_shading_language_packing, true, false, true, true, false, ARB_shading_language_packing),
> + EXT(ARB_shading_language_420pack, true, true, true, true, false, ARB_shading_language_420pack),
> EXT(ARB_texture_multisample, true, false, true, true, false, ARB_texture_multisample),
> EXT(ARB_texture_query_lod, false, false, true, true, false, ARB_texture_query_lod),
> };
> diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
> index 95891b5..e64cee8 100644
> --- a/src/glsl/glsl_parser_extras.h
> +++ b/src/glsl/glsl_parser_extras.h
> @@ -284,6 +284,8 @@ struct _mesa_glsl_parse_state {
> bool ARB_texture_multisample_warn;
> bool ARB_texture_query_lod_enable;
> bool ARB_texture_query_lod_warn;
> + bool ARB_shading_language_420pack_enable;
> + bool ARB_shading_language_420pack_warn;
> /*@}*/
>
> /** Extensions supported by the OpenGL implementation. */
> diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c
> index c7f038b..4ac3c08 100644
> --- a/src/mesa/main/extensions.c
> +++ b/src/mesa/main/extensions.c
> @@ -126,6 +126,7 @@ static const struct extension extension_table[] = {
> { "GL_ARB_shader_texture_lod", o(ARB_shader_texture_lod), GL, 2009 },
> { "GL_ARB_shading_language_100", o(ARB_shading_language_100), GLL, 2003 },
> { "GL_ARB_shading_language_packing", o(ARB_shading_language_packing), GL, 2011 },
> + { "GL_ARB_shading_language_420pack", o(ARB_shading_language_420pack), GL, 2011 },
> { "GL_ARB_shadow", o(ARB_shadow), GLL, 2001 },
> { "GL_ARB_sync", o(ARB_sync), GL, 2003 },
> { "GL_ARB_texture_border_clamp", o(ARB_texture_border_clamp), GLL, 2000 },
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index e46fa39..5d9fe74 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2982,6 +2982,7 @@ struct gl_extensions
> GLboolean ARB_shader_texture_lod;
> GLboolean ARB_shading_language_100;
> GLboolean ARB_shading_language_packing;
> + GLboolean ARB_shading_language_420pack;
> GLboolean ARB_shadow;
> GLboolean ARB_sync;
> GLboolean ARB_texture_border_clamp;
>
More information about the mesa-dev
mailing list