[Mesa-dev] [PATCH 4/6] glsl/linker: don't fail non static used inputs without matching outputs
Timothy Arceri
tarceri at itsqueeze.com
Tue Feb 5 22:42:37 UTC 2019
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.
>
> 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.
>
>>
>>> + 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
More information about the mesa-dev
mailing list