[Mesa-dev] [PATCH] glsl: Check the subroutine associated functions names

Tapani Pälli tapani.palli at intel.com
Wed Oct 10 11:15:53 UTC 2018


Reviewed-by: Tapani Pälli <tapani.palli at intel.com>

On 10/9/18 7:09 PM, Vadym Shovkoplias wrote:
> Adding compile time check for subroutine functions with
> the same names. Similar check for intrastage linking was already
> landed in commit 5f0567a4f60.
> 
>  From Section 6.1.2 (Subroutines) of the GLSL 4.00 specification
> 
>      "A program will fail to compile or link if any shader
>       or stage contains two or more functions with the same
>       name if the name is associated with a subroutine type."
> 
> Fixes:
>      * no-overloads.vert
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=108109
> Signed-off-by: Vadym Shovkoplias <vadym.shovkoplias at globallogic.com>
> ---
>   src/compiler/glsl/ast_to_hir.cpp | 36 ++++++++++++++++++++++++++++++++
>   1 file changed, 36 insertions(+)
> 
> diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
> index 1082d6c91c..6790f00526 100644
> --- a/src/compiler/glsl/ast_to_hir.cpp
> +++ b/src/compiler/glsl/ast_to_hir.cpp
> @@ -66,6 +66,9 @@ using namespace ir_builder;
>   static void
>   detect_conflicting_assignments(struct _mesa_glsl_parse_state *state,
>                                  exec_list *instructions);
> +static void
> +verify_subroutine_associated_funcs(struct _mesa_glsl_parse_state *state);
> +
>   static void
>   remove_per_vertex_blocks(exec_list *instructions,
>                            _mesa_glsl_parse_state *state, ir_variable_mode mode);
> @@ -155,6 +158,7 @@ _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state)
>      foreach_list_typed (ast_node, ast, link, & state->translation_unit)
>         ast->hir(instructions, state);
>   
> +   verify_subroutine_associated_funcs(state);
>      detect_recursion_unlinked(state, instructions);
>      detect_conflicting_assignments(state, instructions);
>   
> @@ -8684,6 +8688,38 @@ detect_conflicting_assignments(struct _mesa_glsl_parse_state *state,
>      }
>   }
>   
> +static void
> +verify_subroutine_associated_funcs(struct _mesa_glsl_parse_state *state)
> +{
> +   YYLTYPE loc;
> +   memset(&loc, 0, sizeof(loc));
> +
> +   /* Section 6.1.2 (Subroutines) of the GLSL 4.00 spec says:
> +    *
> +    *   "A program will fail to compile or link if any shader
> +    *    or stage contains two or more functions with the same
> +    *    name if the name is associated with a subroutine type."
> +    */
> +
> +   for (int i = 0; i < state->num_subroutines; i++) {
> +      unsigned definitions = 0;
> +      ir_function *fn = state->subroutines[i];
> +      /* Calculate number of function definitions with the same name */
> +      foreach_in_list(ir_function_signature, sig, &fn->signatures) {
> +         if (sig->is_defined) {
> +            if (++definitions > 1) {
> +               _mesa_glsl_error(&loc, state,
> +                     "%s shader contains two or more function "
> +                     "definitions with name `%s', which is "
> +                     "associated with a subroutine type.\n",
> +                     _mesa_shader_stage_to_string(state->stage),
> +                     fn->name);
> +               return;
> +            }
> +         }
> +      }
> +   }
> +}
>   
>   static void
>   remove_per_vertex_blocks(exec_list *instructions,
> 


More information about the mesa-dev mailing list