[Mesa-dev] [PATCH 8/8] glsl/linker: Ensure the first stage of an SSO pipeline has input locs assigned

Timothy Arceri timothy.arceri at collabora.com
Wed May 18 10:44:05 UTC 2016


On Tue, 2016-05-17 at 20:24 -0700, Ian Romanick wrote:
> On 05/17/2016 04:40 PM, Timothy Arceri wrote:
> > 
> > On Tue, 2016-05-17 at 15:11 -0700, Ian Romanick wrote:
> > > 
> > > From: Ian Romanick <ian.d.romanick at intel.com>
> > > 
> > > Previously an SSO pipeline containing only a tessellation control
> > > shader
> > > and a tessellation evaluation shader would not get locations
> > > assigned
> > > for the TCS inputs.  This would lead to assertion failures in
> > > some
> > > piglit tests, such as arb_program_interface_query-resource-query.
> > > 
> > > That piglit test still fails on some tessellation related
> > > subtests.
> > > Specifically, these subtests fail:
> > > 
> > > 'GL_PROGRAM_INPUT(tcs) active resources' expected 2 but got 3
> > > 'GL_PROGRAM_INPUT(tcs) max length name' expected 12 but got 16
> > > 'GL_PROGRAM_INPUT(tcs,tes) active resources' expected 2 but got 3
> > > 'GL_PROGRAM_INPUT(tcs,tes) max length name' expected 12 but got
> > > 16
> > > 'GL_PROGRAM_OUTPUT(tcs) active resources' expected 15 but got 3
> > > 'GL_PROGRAM_OUTPUT(tcs) max length name' expected 23 but got 12
> > > 
> > > Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> > > ---
> > >  src/compiler/glsl/linker.cpp | 9 ++++++---
> > >  1 file changed, 6 insertions(+), 3 deletions(-)
> > > 
> > > diff --git a/src/compiler/glsl/linker.cpp
> > > b/src/compiler/glsl/linker.cpp
> > > index 34b4a81..d277dd0 100644
> > > --- a/src/compiler/glsl/linker.cpp
> > > +++ b/src/compiler/glsl/linker.cpp
> > > @@ -4790,7 +4790,7 @@ link_shaders(struct gl_context *ctx, struct
> > > gl_shader_program *prog)
> > >            */
> > >           int next = last;
> > >           for (int i = next - 1; i >= 0; i--) {
> > > -            if (prog->_LinkedShaders[i] == NULL)
> > > +            if (prog->_LinkedShaders[i] == NULL && i != 0)
> > Up to you but I think i != MESA_SHADER_VERTEX makes it slightly
> > easier
> > to follow.
> I'm a little bit torn.  I thought about using MESA_SHADER_VERTEX, but
> that's not really the information that's important.  What's important
> is
> always executing at the loop bound (which is 0) even when there's no
> shader there.

In that case I don't think this won't work as intended. The
_LinkedShaders array is defined as:

   _LinkedShaders[MESA_SHADER_STAGES]

Here a zero index is the first GL stage not the first stage in the
program. So a program containing only geom and frag stages would hit
the same problem.

I think we need to do something like what is done with the last stage
above this code e.g.

   if (first < MESA_SHADER_VERTEX && prog->SeparateShader) {
      if (!assign_varying_locations(...))
         goto done;
   }

I wonder if that code should be calling check_against_output_limit()
also. I guess we probably have no SSO tests that exceed the limit.

> 
> I think I'd want to either leave both i comparisons with zero or
> change
> both to MESA_SHADER_VERTEX.  Do you have an opinion?
> 
> > 
> > Otherwise the series is Reviewed-by: Timothy Arceri
> > <timothy.arceri at collabora.com>
> > 
> > 
> > > 
> > >                 continue;
> > >  
> > >              gl_shader *const sh_i = prog->_LinkedShaders[i];
> > > @@ -4806,8 +4806,11 @@ link_shaders(struct gl_context *ctx,
> > > struct
> > > gl_shader_program *prog)
> > >                        tfeedback_decls);
> > >  
> > >              /* This must be done after all dead varyings are
> > > eliminated. */
> > > -            if (!check_against_output_limit(ctx, prog, sh_i))
> > > -               goto done;
> > > +            if (sh_i != NULL) {
> > > +               if (!check_against_output_limit(ctx, prog, sh_i))
> > > {
> > > +                  goto done;
> > > +               }
> > > +            }
> > >              if (!check_against_input_limit(ctx, prog, sh_next))
> > >                 goto done;
> > >  


More information about the mesa-dev mailing list