[Mesa-dev] [PATCH 1/3] glsl: remove duplicate embedded struct validation
Iago Toral
itoral at igalia.com
Thu Feb 11 15:44:24 UTC 2016
Looks good to me,
Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
On Thu, 2016-02-11 at 15:45 +1100, Timothy Arceri wrote:
> Commit c98deb18d5836f in 2010 disallowed embedded struct definitions
> in ES. Then in 2013 d9bb8b7b56ce65b disallowed it for everything but
> GLSL 1.10.
>
> Commit c98deb18d5836f seemed the cleanest way to do the check so its
> been extended to cover GL and the other version has been removed.
>
> Cc: Ian Romanick <ian.d.romanick at intel.com>
> Cc: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/compiler/glsl/ast_to_hir.cpp | 59 +++++++++-----------------------
> src/compiler/glsl/glsl_parser_extras.cpp | 2 --
> src/compiler/glsl/glsl_parser_extras.h | 7 ----
> 3 files changed, 17 insertions(+), 51 deletions(-)
>
> diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
> index f8f5d21..3840cba 100644
> --- a/src/compiler/glsl/ast_to_hir.cpp
> +++ b/src/compiler/glsl/ast_to_hir.cpp
> @@ -6301,13 +6301,24 @@ ast_process_struct_or_iface_block_members(exec_list *instructions,
>
> decl_list->type->specifier->hir(instructions, state);
>
> - /* Section 10.9 of the GLSL ES 1.00 specification states that
> - * embedded structure definitions have been removed from the language.
> + /* Section 4.1.8 (Structures) of the GLSL 1.10 spec says:
> + *
> + * "Anonymous structures are not supported; so embedded structures
> + * must have a declarator. A name given to an embedded struct is
> + * scoped at the same level as the struct it is embedded in."
> + *
> + * The same section of the GLSL 1.20 spec says:
> + *
> + * "Anonymous structures are not supported. Embedded structures are
> + * not supported."
> + *
> + * The GLSL ES 1.00 and 3.00 specs have similar langauge. So, we allow
> + * embedded structures in 1.10 only.
> */
> - if (state->es_shader && decl_list->type->specifier->structure != NULL) {
> - _mesa_glsl_error(&loc, state, "embedded structure definitions are "
> - "not allowed in GLSL ES 1.00");
> - }
> + if (state->language_version != 110 &&
> + decl_list->type->specifier->structure != NULL)
> + _mesa_glsl_error(&loc, state,
> + "embedded structure declarations are not allowed");
>
> const glsl_type *decl_type =
> decl_list->type->glsl_type(& type_name, state);
> @@ -6626,33 +6637,6 @@ ast_struct_specifier::hir(exec_list *instructions,
> {
> YYLTYPE loc = this->get_location();
>
> - /* Section 4.1.8 (Structures) of the GLSL 1.10 spec says:
> - *
> - * "Anonymous structures are not supported; so embedded structures must
> - * have a declarator. A name given to an embedded struct is scoped at
> - * the same level as the struct it is embedded in."
> - *
> - * The same section of the GLSL 1.20 spec says:
> - *
> - * "Anonymous structures are not supported. Embedded structures are not
> - * supported.
> - *
> - * struct S { float f; };
> - * struct T {
> - * S; // Error: anonymous structures disallowed
> - * struct { ... }; // Error: embedded structures disallowed
> - * S s; // Okay: nested structures with name are allowed
> - * };"
> - *
> - * The GLSL ES 1.00 and 3.00 specs have similar langauge and examples. So,
> - * we allow embedded structures in 1.10 only.
> - */
> - if (state->language_version != 110 && state->struct_specifier_depth != 0)
> - _mesa_glsl_error(&loc, state,
> - "embedded structure declarations are not allowed");
> -
> - state->struct_specifier_depth++;
> -
> unsigned expl_location = 0;
> if (layout && layout->flags.q.explicit_location) {
> if (!process_qualifier_constant(state, &loc, "location",
> @@ -6696,8 +6680,6 @@ ast_struct_specifier::hir(exec_list *instructions,
> }
> }
>
> - state->struct_specifier_depth--;
> -
> /* Structure type definitions do not have r-values.
> */
> return NULL;
> @@ -6817,11 +6799,6 @@ ast_interface_block::hir(exec_list *instructions,
> exec_list declared_variables;
> glsl_struct_field *fields;
>
> - /* Treat an interface block as one level of nesting, so that embedded struct
> - * specifiers will be disallowed.
> - */
> - state->struct_specifier_depth++;
> -
> /* For blocks that accept memory qualifiers (i.e. shader storage), verify
> * that we don't have incompatible qualifiers
> */
> @@ -6885,8 +6862,6 @@ ast_interface_block::hir(exec_list *instructions,
> expl_location,
> expl_align);
>
> - state->struct_specifier_depth--;
> -
> if (!redeclaring_per_vertex) {
> validate_identifier(this->block_name, loc, state);
>
> diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp
> index 20ec89d..99a0428 100644
> --- a/src/compiler/glsl/glsl_parser_extras.cpp
> +++ b/src/compiler/glsl/glsl_parser_extras.cpp
> @@ -69,8 +69,6 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
> this->error = false;
> this->loop_nesting_ast = NULL;
>
> - this->struct_specifier_depth = 0;
> -
> this->uses_builtin_functions = false;
>
> /* Set default language version and extensions */
> diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h
> index a905b56..4dacc2a 100644
> --- a/src/compiler/glsl/glsl_parser_extras.h
> +++ b/src/compiler/glsl/glsl_parser_extras.h
> @@ -290,13 +290,6 @@ struct _mesa_glsl_parse_state {
> gl_shader_stage stage;
>
> /**
> - * Number of nested struct_specifier levels
> - *
> - * Outside a struct_specifier, this is zero.
> - */
> - unsigned struct_specifier_depth;
> -
> - /**
> * Default uniform layout qualifiers tracked during parsing.
> * Currently affects uniform blocks and uniform buffer variables in
> * those blocks.
More information about the mesa-dev
mailing list