[Mesa-dev] [PATCH 1/2] glsl: add a mechanism to allow layout qualifiers on function params

Marek Olšák maraeo at gmail.com
Wed Aug 29 22:12:18 UTC 2018


Uh.

Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Wed, Aug 29, 2018 at 1:48 AM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
> The spec is quite clear this is not allowed:
>
>     From Section 4.4. (Layout Qualifiers) of the GLSL 4.60 spec:
>
>        "Layout qualifiers can appear in several forms of declaration.
>        They can appear as part of an interface block definition or
>        block member, as shown in the grammar in the previous section.
>        They can also appear with just an interface-qualifier to establish
>        layouts of other declarations made with that qualifier:
>
>           layout-qualifier interface-qualifier ;
>
>        Or, they can appear with an individual variable declared with
>        an interface qualifier:
>
>           layout-qualifier interface-qualifier declaration ;"
>
>     From Section 4.10 (Memory Qualifiers) of the GLSL 4.60 spec:
>
>        "Layout qualifiers cannot be used on formal function parameters,
>        and layout qualification is not included in parameter matching."
>
> However on the Nvidia binary driver they actually fail to compile
> if image function params don't have a layout qualifier. This results
> in applications such as No Mans Sky using layout qualifiers on params.
>
> I've submitted a CTS test to expose this problem in the Nvidia driver
> but until that is resolved this patch will help Mesa drivers work
> around the issue.
> ---
>  src/compiler/glsl/glsl_parser.yy         | 17 +++++++++++++++++
>  src/compiler/glsl/glsl_parser_extras.cpp |  2 ++
>  src/compiler/glsl/glsl_parser_extras.h   |  1 +
>  src/mesa/main/mtypes.h                   |  5 +++++
>  4 files changed, 25 insertions(+)
>
> diff --git a/src/compiler/glsl/glsl_parser.yy b/src/compiler/glsl/glsl_parser.yy
> index bc2571b6844..fd1592beca0 100644
> --- a/src/compiler/glsl/glsl_parser.yy
> +++ b/src/compiler/glsl/glsl_parser.yy
> @@ -897,6 +897,23 @@ parameter_declarator:
>        $$->identifier = $2;
>        state->symbols->add_variable(new(state) ir_variable(NULL, $2, ir_var_auto));
>     }
> +   | layout_qualifier type_specifier any_identifier
> +   {
> +      if (state->allow_layout_qualifier_on_function_parameter) {
> +         void *ctx = state->linalloc;
> +         $$ = new(ctx) ast_parameter_declarator();
> +         $$->set_location_range(@2, @3);
> +         $$->type = new(ctx) ast_fully_specified_type();
> +         $$->type->set_location(@2);
> +         $$->type->specifier = $2;
> +         $$->identifier = $3;
> +         state->symbols->add_variable(new(state) ir_variable(NULL, $3, ir_var_auto));
> +      } else {
> +         _mesa_glsl_error(&@1, state,
> +                          "is is not allowed on function parameter");
> +         YYERROR;
> +      }
> +   }
>     | type_specifier any_identifier array_specifier
>     {
>        void *ctx = state->linalloc;
> diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp
> index 0a7d0d78b14..efd1a013dbd 100644
> --- a/src/compiler/glsl/glsl_parser_extras.cpp
> +++ b/src/compiler/glsl/glsl_parser_extras.cpp
> @@ -311,6 +311,8 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
>        ctx->Const.AllowGLSLExtensionDirectiveMidShader;
>     this->allow_builtin_variable_redeclaration =
>        ctx->Const.AllowGLSLBuiltinVariableRedeclaration;
> +   this->allow_layout_qualifier_on_function_parameter =
> +      ctx->Const.AllowLayoutQualifiersOnFunctionParameters;
>
>     this->cs_input_local_size_variable_specified = false;
>
> diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h
> index 2c8353214aa..69aa6cf9cf3 100644
> --- a/src/compiler/glsl/glsl_parser_extras.h
> +++ b/src/compiler/glsl/glsl_parser_extras.h
> @@ -866,6 +866,7 @@ struct _mesa_glsl_parse_state {
>
>     bool allow_extension_directive_midshader;
>     bool allow_builtin_variable_redeclaration;
> +   bool allow_layout_qualifier_on_function_parameter;
>
>     /**
>      * Known subroutine type declarations.
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 9d058cef6d9..1f640b063c0 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -3764,6 +3764,11 @@ struct gl_constants
>      */
>     GLboolean AllowHigherCompatVersion;
>
> +   /**
> +    * Allow layout qualifiers on function parameters.
> +    */
> +   GLboolean AllowLayoutQualifiersOnFunctionParameters;
> +
>     /**
>      * Force computing the absolute value for sqrt() and inversesqrt() to follow
>      * D3D9 when apps rely on this behaviour.
> --
> 2.17.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list