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

Tapani Pälli tapani.palli at intel.com
Wed Oct 3 04:38:17 UTC 2018



On 10/2/18 7:38 PM, Vadym Shovkoplias wrote:
> Hi Tapani,
> 
> Thanks for the review!
> 
> Completely agree with the first comment, I'll change that and resend the 
> patch.
> Regarding second comment. I'm not sure if it is possible to do this 
> check after the optimization loop. From my observations compiler inlines 
> everything
> and only after that it removes dead functions (actually all funcs except 
> "main"). After the optimization I don't see any possible way how to
> implement this subroutine functions check because all functions and 
> functions signatures are removed at that point.

Yeah I was considering it could be done by storing some data but it 
seems this is probably the most straightforward version.

> On Tue, Oct 2, 2018 at 10:02 AM Tapani Pälli <tapani.palli at intel.com 
> <mailto:tapani.palli at intel.com>> wrote:
> 
> 
>     On 10/1/18 5:03 PM, Vadym Shovkoplias wrote:
>      >  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
>     <mailto:vadym.shovkoplias at globallogic.com>>
>      > ---
>      >   src/compiler/glsl/linker.cpp | 40
>     ++++++++++++++++++++++++++++++++++++
>      >   1 file changed, 40 insertions(+)
>      >
>      > diff --git a/src/compiler/glsl/linker.cpp
>     b/src/compiler/glsl/linker.cpp
>      > index 3fde7e78d3..d0d017c7ff 100644
>      > --- a/src/compiler/glsl/linker.cpp
>      > +++ b/src/compiler/glsl/linker.cpp
>      > @@ -4639,6 +4639,45 @@ link_assign_subroutine_types(struct
>     gl_shader_program *prog)
>      >      }
>      >   }
>      >
>      > +static void
>      > +verify_subroutine_associated_funcs(struct gl_shader_program *prog)
>      > +{
>      > +   unsigned mask = prog->data->linked_stages;
>      > +   while (mask) {
>      > +      const int i = u_bit_scan(&mask);
>      > +      gl_program *p = prog->_LinkedShaders[i]->Program;
>      > +      glsl_symbol_table *symbols = prog->_LinkedShaders[i]->symbols;
>      > +
>      > +      /*
>      > +       * From OpenGL ES Shading Language 4.00 specification
>      > +       * (6.1.2 Subroutines):
>      > +       *     "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 (unsigned j = 0; j < p->sh.NumSubroutineFunctions; j++) {
>      > +         unsigned definitions = 0;
>      > +         char *name = p->sh.SubroutineFunctions[j].name;
>      > +         ir_function *fn = symbols->get_function(name);
>      > +
>      > +         /* Calculate number of function definitions with the
>     same name */
>      > +         foreach_in_list(ir_function_signature, sig,
>     &fn->signatures) {
>      > +            if (sig->is_defined)
>      > +               definitions++;
> 
>     You can just error out here, no need to calculate further.
> 
>     I'm wondering a bit though should we fail here even if that function
>     was
>     not used at all (optimized out)? I can see that the Piglit test does
>     not
>     have a call to the function defined.
> 
> 
>      > +         }
>      > +
>      > +         if (definitions > 1) {
>      > +            linker_error(prog, "%s shader contains %u function "
>      > +                  "definitions with name `%s', which is
>     associated with"
>      > +                  " a subroutine type.\n",
>      > +                  _mesa_shader_stage_to_string(i), definitions,
>     fn->name);
>      > +            return;
>      > +         }
>      > +      }
>      > +   }
>      > +}
>      > +
>      > +
>      >   static void
>      >   set_always_active_io(exec_list *ir, ir_variable_mode io_mode)
>      >   {
>      > @@ -5024,6 +5063,7 @@ link_shaders(struct gl_context *ctx, struct
>     gl_shader_program *prog)
>      >
>      >      check_explicit_uniform_locations(ctx, prog);
>      >      link_assign_subroutine_types(prog);
>      > +   verify_subroutine_associated_funcs(prog);
>      >
>      >      if (!prog->data->LinkStatus)
>      >         goto done;
>      >
>     _______________________________________________
>     mesa-dev mailing list
>     mesa-dev at lists.freedesktop.org <mailto:mesa-dev at lists.freedesktop.org>
>     https://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
> 
> 
> -- 
> 
> Vadym Shovkoplias | Senior Software Engineer
> GlobalLogic
> P +380.57.766.7667  M +3.8050.931.7304  S vadym.shovkoplias
> www.globallogic.com <http://www.globallogic.com/>
> <http://www.globallogic.com/>
> http://www.globallogic.com/email_disclaimer.txt


More information about the mesa-dev mailing list