[Mesa-dev] [PATCH] glsl: Allow precision mismatch on dead uniform with GLSL ES 1.00 (v3)

Tomasz Figa tfiga at chromium.org
Fri Oct 20 04:02:20 UTC 2017


Hi Ian, Kenneth,

On Wed, Sep 27, 2017 at 2:57 AM, Tomasz Figa <tfiga at chromium.org> wrote:
> Commit 259fc505454ea6a67aeacf6cdebf1398d9947759 added linker error for
> mismatching uniform precision, as required by GLES 3.0 specification and
> conformance test-suite.
>
> Several Android applications, including Forge of Empires, have shaders
> which violate this rule, on uniforms that are declared but not used
> further in shader code. The problem affects a big number of Android
> games, including ones built on top of one of the common 2D graphics
> engines and other GLES implementations accept this, which poses a serious
> application compatibility issue.
>
> Starting from GLSL ES 3.0, declarations with conflicting precision
> qualifiers are explicitly prohibited. However GLSL ES 1.00 does not
> clearly specify the behavior, except that
>
>   "Uniforms are defined to behave as if they are using the same storage in
>   the vertex and fragment processors and may be implemented this way.
>   If uniforms are used in both the vertex and fragment shaders, developers
>   should be warned if the precisions are different. Conversion of
>   precision should never be implicit."
>
> The word "used" is not clear in this context and might refer to
>  1) declared (same as GLES 3.x)
>  2) referred after post-processing, or
>  3) linked after all optimizations are done.
>
> Looking at existing applications, 2) or 3) seems to be widely adopted.
> To avoid compatibility issues, turn the error into a warning if GLSL ES
> version is lower than 3.0 and the data is dead in at least one of the
> shaders.
>
> v3:
>  - Add a comment explaining the behavior.
>  - Fix bad copy/paste in commit message (s/varyings/uniforms).

Would you be able to take a look?

Ian, I believe your previous NAK was due to the confusing erroneous
copy/paste from the freedesktop bug I made in commit message. Looking
at last comment from Kenneth there, we were going to go with my patch,
but things remained quiet after that.

Thanks,
Tomasz

> v2:
>  - Change the behavior only for GLSL ES 1.00 shaders.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97532
> Signed-off-by: Tomasz Figa <tfiga at chromium.org>
> ---
>  src/compiler/glsl/linker.cpp | 32 ++++++++++++++++++++++++++++----
>  1 file changed, 28 insertions(+), 4 deletions(-)
>
> diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
> index f352c5385ca..693c5ae3664 100644
> --- a/src/compiler/glsl/linker.cpp
> +++ b/src/compiler/glsl/linker.cpp
> @@ -1121,10 +1121,34 @@ cross_validate_globals(struct gl_shader_program *prog,
>           if (prog->IsES && (prog->data->Version != 310 ||
>                              !var->get_interface_type()) &&
>               existing->data.precision != var->data.precision) {
> -            linker_error(prog, "declarations for %s `%s` have "
> -                         "mismatching precision qualifiers\n",
> -                         mode_string(var), var->name);
> -            return;
> +            /*
> +             * GLSL ES 3.00 is the first version that explicitly requires
> +             * that uniform declarations have matching precision qualifiers.
> +             *
> +             * The only relevant part of GLSL ES 1.00 spec,
> +             *
> +             *  "If uniforms are used in both the vertex and fragment shaders,
> +             *   developers should be warned if the precisions are different.
> +             *   Conversion of precision should never be implicit."
> +             *
> +             * leaves too wide field for intepretation. However, judging by
> +             * applications and implementations existing in the wild, it seems
> +             * to be widely assumed that declarations alone are not enough to
> +             * fail the link.
> +             *
> +             * Thus, in case of GLSL ES < 3.00, trigger an error only if the
> +             * uniform is actually referenced in the code of both shaders.
> +             */
> +            if ((existing->data.used && var->data.used) || prog->data->Version >= 300) {
> +               linker_error(prog, "declarations for %s `%s` have "
> +                            "mismatching precision qualifiers\n",
> +                            mode_string(var), var->name);
> +               return;
> +            } else {
> +               linker_warning(prog, "declarations for %s `%s` have "
> +                              "mismatching precision qualifiers\n",
> +                              mode_string(var), var->name);
> +            }
>           }
>        } else
>           variables->add_variable(var);
> --
> 2.14.1.992.g2c7b836f3a-goog
>


More information about the mesa-dev mailing list