[Mesa-dev] [PATCH] glsl/linker: outputs in the same location must share interpolation

Timothy Arceri tarceri at itsqueeze.com
Thu Oct 19 06:14:39 UTC 2017



On 19/10/17 16:57, Iago Toral Quiroga wrote:
>  From ARB_enhanced_layouts:
> 
> "[...]when location aliasing, the aliases sharing the location
>   must have the same underlying numerical type (floating-point or
>   integer) and the same auxiliary storage and
>   interpolation qualification.[...]"
> 
> Add code to the linker to validate that aliased locations do
> have the same interpolation.
> 
> Fixes:
> KHR-GL45.enhanced_layouts.varying_location_aliasing_with_mixed_interpolation
> ---
>   src/compiler/glsl/link_varyings.cpp | 35 +++++++++++++++++++++++++++++++++++
>   1 file changed, 35 insertions(+)
> 
> diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp
> index 69c92bf53b..c888635e82 100644
> --- a/src/compiler/glsl/link_varyings.cpp
> +++ b/src/compiler/glsl/link_varyings.cpp
> @@ -459,6 +459,41 @@ cross_validate_outputs_to_inputs(struct gl_context *ctx,
>   
>            while (idx < slot_limit) {
>               unsigned i = var->data.location_frac;
> +
> +            /* If there are other outputs assigned to the same location
> +             * they must have the same interpolation
> +             */
> +            unsigned comp = 0;
> +            while (comp < i) {
> +               ir_variable *tmp = explicit_locations[idx][comp];
> +               if (tmp && tmp->data.interpolation != var->data.interpolation) {
> +                  linker_error(prog,
> +                               "%s shader has multiple outputs at explicit "
> +                               "location %u with different interpolation "
> +                               "settings\n",
> +                               _mesa_shader_stage_to_string(producer->Stage),
> +                               idx);
> +                  return;
> +               }
> +               comp++;
> +            }
> +
> +            comp = last_comp + 1;
> +            while (comp < 4) {
> +               ir_variable *tmp = explicit_locations[idx][comp];
> +               if (tmp && tmp->data.interpolation != var->data.interpolation) {
> +                  linker_error(prog,
> +                               "%s shader has multiple outputs at explicit "
> +                               "location %u with different interpolation "
> +                               "settings\n",
> +                               _mesa_shader_stage_to_string(producer->Stage),
> +                               idx);
> +                  return;
> +               }
> +               comp++;
> +            }

Can't we just put this check in the loop below? It should allow doubles 
to be handled without the duplication if my quick skim over the code is 
correct.


> +
> +            /* Component aliasing is not allowed */
>               while (i < last_comp) {
>                  if (explicit_locations[idx][i] != NULL) {
>                     linker_error(prog,
> 


More information about the mesa-dev mailing list