[Mesa-dev] [PATCH] glsl: do not set the 'smooth' qualifier by default on ES shaders

Dieter Nützel Dieter at nuetzel-hh.de
Wed Sep 27 15:25:33 UTC 2017


Tested-by: Dieter Nützel <Dieter at nuetzel-hh.de>

Dieter

Am 26.09.2017 17:11, schrieb Nicolai Hähnle:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
> 
> It leads to surprising states with integer inputs and outputs on
> vertex processing stages (e.g. geometry stages). Instead, rely on the
> driver to choose smooth interpolation by default.
> 
> We still allow varyings to match when one stage declares it as smooth
> and the other declares it without interpolation qualifiers.
> --
> This should cover all the relevant I/O checks, tested with dEQP.
> ---
>  src/compiler/glsl/ast_to_hir.cpp    | 11 -----------
>  src/compiler/glsl/link_varyings.cpp | 17 ++++++++++++++++-
>  src/mesa/main/shader_query.cpp      |  8 +++++++-
>  3 files changed, 23 insertions(+), 13 deletions(-)
> 
> diff --git a/src/compiler/glsl/ast_to_hir.cpp 
> b/src/compiler/glsl/ast_to_hir.cpp
> index c46454956d7..1999e68158c 100644
> --- a/src/compiler/glsl/ast_to_hir.cpp
> +++ b/src/compiler/glsl/ast_to_hir.cpp
> @@ -3119,31 +3119,20 @@ interpret_interpolation_qualifier(const struct
> ast_type_qualifier *qual,
>                                    struct _mesa_glsl_parse_state 
> *state,
>                                    YYLTYPE *loc)
>  {
>     glsl_interp_mode interpolation;
>     if (qual->flags.q.flat)
>        interpolation = INTERP_MODE_FLAT;
>     else if (qual->flags.q.noperspective)
>        interpolation = INTERP_MODE_NOPERSPECTIVE;
>     else if (qual->flags.q.smooth)
>        interpolation = INTERP_MODE_SMOOTH;
> -   else if (state->es_shader &&
> -            ((mode == ir_var_shader_in &&
> -              state->stage != MESA_SHADER_VERTEX) ||
> -             (mode == ir_var_shader_out &&
> -              state->stage != MESA_SHADER_FRAGMENT)))
> -      /* Section 4.3.9 (Interpolation) of the GLSL ES 3.00 spec says:
> -       *
> -       *    "When no interpolation qualifier is present, smooth 
> interpolation
> -       *    is used."
> -       */
> -      interpolation = INTERP_MODE_SMOOTH;
>     else
>        interpolation = INTERP_MODE_NONE;
> 
>     validate_interpolation_qualifier(state, loc,
>                                      interpolation,
>                                      qual, var_type, mode);
> 
>     return interpolation;
>  }
> 
> diff --git a/src/compiler/glsl/link_varyings.cpp
> b/src/compiler/glsl/link_varyings.cpp
> index 528506fd0eb..7c90de393ad 100644
> --- a/src/compiler/glsl/link_varyings.cpp
> +++ b/src/compiler/glsl/link_varyings.cpp
> @@ -318,22 +318,37 @@ cross_validate_types_and_qualifiers(struct
> gl_shader_program *prog,
>     }
> 
>     /* GLSL >= 4.40 removes text requiring interpolation qualifiers
>      * to match cross stage, they must only match within the same 
> stage.
>      *
>      * From page 84 (page 90 of the PDF) of the GLSL 4.40 spec:
>      *
>      *     "It is a link-time error if, within the same stage, the 
> interpolation
>      *     qualifiers of variables of the same name do not match.
>      *
> +    * Section 4.3.9 (Interpolation) of the GLSL ES 3.00 spec says:
> +    *
> +    *    "When no interpolation qualifier is present, smooth 
> interpolation
> +    *    is used."
> +    *
> +    * So we match variables where one is smooth and the other has no 
> explicit
> +    * qualifier.
>      */
> -   if (input->data.interpolation != output->data.interpolation &&
> +   unsigned input_interpolation = input->data.interpolation;
> +   unsigned output_interpolation = output->data.interpolation;
> +   if (prog->IsES) {
> +      if (input_interpolation == INTERP_MODE_NONE)
> +         input_interpolation = INTERP_MODE_SMOOTH;
> +      if (output_interpolation == INTERP_MODE_NONE)
> +         output_interpolation = INTERP_MODE_SMOOTH;
> +   }
> +   if (input_interpolation != output_interpolation &&
>         prog->data->Version < 440) {
>        linker_error(prog,
>                     "%s shader output `%s' specifies %s "
>                     "interpolation qualifier, "
>                     "but %s shader input specifies %s "
>                     "interpolation qualifier\n",
>                     _mesa_shader_stage_to_string(producer_stage),
>                     output->name,
>                     interpolation_string(output->data.interpolation),
>                     _mesa_shader_stage_to_string(consumer_stage),
> diff --git a/src/mesa/main/shader_query.cpp 
> b/src/mesa/main/shader_query.cpp
> index 64e68b4a26d..6712bb45fb2 100644
> --- a/src/mesa/main/shader_query.cpp
> +++ b/src/mesa/main/shader_query.cpp
> @@ -1627,21 +1627,27 @@ validate_io(struct gl_program *producer,
> struct gl_program *consumer)
>         *    Precision      |   mediump   |  Yes
>         *                   |    highp    |
>         *    ---------------+-------------+------
>         *    Variance       |  invariant  |   No
>         *    ---------------+-------------+------
>         *    Memory         |     all     |  N/A
>         *
>         * Note that location mismatches are detected by the loops above 
> that
>         * find the producer variable that goes with the consumer 
> variable.
>         */
> -      if (producer_var->interpolation != consumer_var->interpolation) 
> {
> +      unsigned producer_interpolation = producer_var->interpolation;
> +      unsigned consumer_interpolation = consumer_var->interpolation;
> +      if (producer_interpolation == INTERP_MODE_NONE)
> +         producer_interpolation = INTERP_MODE_SMOOTH;
> +      if (consumer_interpolation == INTERP_MODE_NONE)
> +         consumer_interpolation = INTERP_MODE_SMOOTH;
> +      if (producer_interpolation != consumer_interpolation) {
>           valid = false;
>           goto out;
>        }
> 
>        if (producer_var->precision != consumer_var->precision) {
>           valid = false;
>           goto out;
>        }
> 
>        if (producer_var->outermost_struct_type !=
> consumer_var->outermost_struct_type) {


More information about the mesa-dev mailing list