[Mesa-dev] [PATCH 4/6] glsl/linker: don't fail non static used inputs without matching outputs
Andres Gomez
agomez at igalia.com
Wed Feb 6 14:47:47 UTC 2019
On Wed, 2019-02-06 at 09:42 +1100, Timothy Arceri wrote:
> On 6/2/19 1:11 am, Andres Gomez wrote:
> > On Fri, 2019-02-01 at 18:37 -0500, Ilia Mirkin wrote:
> > > On Fri, Feb 1, 2019 at 1:08 PM Andres Gomez <agomez at igalia.com> wrote:
> > > > If there is no Static Use of an input variable, the linker shouldn't
> > > > fail whenever there is no defined matching output variable in the
> > > > previous stage.
> > > >
> > > > From page 47 (page 51 of the PDF) of the GLSL 4.60 v.5 spec:
> > > >
> > > > " Only the input variables that are statically read need to be
> > > > written by the previous stage; it is allowed to have superfluous
> > > > declarations of input variables."
> > > >
> > > > Now, we complete this exception whenever the input variable has an
> > > > explicit location. Previously, 18004c338f6 ("glsl: fail when a
> > > > shader's input var has not an equivalent out var in previous") took
> > > > care of the cases in which the input variable didn't have an explicit
> > > > location.
> > > >
> > > > Additionally, likewise 1aa5738e666 ("glsl: relax input->output
> > > > validation for SSO programs"), avoid failing also for programs that
> > > > utilize GL_ARB_separate_shader_objects.
> > > >
> > > > Cc: Timothy Arceri <tarceri at itsqueeze.com>
> > > > Cc: Iago Toral Quiroga <itoral at igalia.com>
> > > > Cc: Samuel Iglesias Gonsálvez <siglesias at igalia.com>
> > > > Cc: Tapani Pälli <tapani.palli at intel.com>
> > > > Cc: Ian Romanick <ian.d.romanick at intel.com>
> > > > Signed-off-by: Andres Gomez <agomez at igalia.com>
> > > > ---
> > > > src/compiler/glsl/link_varyings.cpp | 16 ++++++++++++++--
> > > > 1 file changed, 14 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp
> > > > index e5f7d3e322a..6cebc5b3c5a 100644
> > > > --- a/src/compiler/glsl/link_varyings.cpp
> > > > +++ b/src/compiler/glsl/link_varyings.cpp
> > > > @@ -808,8 +808,20 @@ cross_validate_outputs_to_inputs(struct gl_context *ctx,
> > > >
> > > > output = output_explicit_locations[idx][input->data.location_frac].var;
> > > >
> > > > - if (output == NULL ||
> > > > - input->data.location != output->data.location) {
> > > > + if (output == NULL) {
> > > > + /* A linker failure should only happen when, for programs
> > > > + * not using sso, there is no output declaration and there
> > > > + * is Static Use of the declared input.
> > > > + */
> > > > + if (input->data.used && !prog->SeparateShader) {
> > >
> > > Should this differentiate whether this is the first stage of a
> > > separable program vs a later one? Presumably the exception only
> > > applies at the separate program boundary, not to each shader within
> > > the program?
> >
> > Cc-ing Tapani and Anuj.
> >
> > As I understand the spec, it applies to every shader within the
> > separable program.
>
> No that's not what the spec says. From the quote below:
>
> "With separable program objects, interfaces between shader stages
> may involve the outputs from one program object and the inputs from a
> second program object."
>
> So if we have two "program" objects say:
>
> 1. vs->gs
> 2. fs
>
> The relaxed restrictions only apply to the gs -> fs interface. Not the
> vs -> gs interface.
After double checking specs and examples, I think you are right.
I'll update the patch and send a v2 shortly.
>
>
> > From the ARB_separate_shader_objects spec:
> >
> > " With separable program objects, interfaces between shader stages
> > may involve the outputs from one program object and the inputs
> > from a second program object. For such interfaces, it is not
> > possible to detect mismatches at link time, because the programs
> > are linked separately. When each such program is linked, all
> > inputs or outputs interfacing with another program stage are
> > treated as active. The linker will generate an executable that
> > assumes the presence of a compatible program on the other side of
> > the interface. If a mismatch between programs occurs, no GL error
> > will be generated, but some or all of the inputs on the interface
> > will be undefined."
> >
> > Notice that this has also been the interpretation from:
> >
> > 1aa5738e666 ("glsl: relax input->output validation for SSO programs")
>
> Yes this looks wrong also. We should write some piglit tests for this
> and fix it too.
I'll address reverting that commit later.
Doing so makes "arb_program_interface_query-getprogramresourceiv" and
"arb_program_interface_query-resource-query" piglit tests fail so it
seems I'll have to fix those tests and add some more to check the
interface matching in the internal interfaces of separable programs.
>
> > > > + linker_error(prog,
> > > > + "%s shader input `%s' with explicit location "
> > > > + "has no matching output\n",
> > > > + _mesa_shader_stage_to_string(consumer->Stage),
> > > > + input->name);
> > > > + break;
> > > > + }
> > > > + } else if (input->data.location != output->data.location) {
> > > > linker_error(prog,
> > > > "%s shader input `%s' with explicit location "
> > > > "has no matching output\n",
> > > > --
> > > > 2.20.1
> > > >
> > > > _______________________________________________
> > > > mesa-dev mailing list
> > > > mesa-dev at lists.freedesktop.org
> > > > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
--
Br,
Andres
More information about the mesa-dev
mailing list