[Mesa-dev] [PATCH] glsl: Allow precision mismatch on dead data with GLSL ES 1.00
Tomasz Figa
tfiga at chromium.org
Wed Sep 27 00:33:04 UTC 2017
On Wed, Sep 27, 2017 at 9:29 AM, Ian Romanick <idr at freedesktop.org> wrote:
> NAK.
>
> You mention varyings in the commit message, but then you quote spec text
> about uniforms.
Sorry, the part about varyings was a bad copy paste from the old
workaround patch on the bugzilla. The problem here is about uniforms.
> This bugged me, so I actually went and looked at the
> GLSL ES 1.00 specification.
>
> Section 4.3.5 (Varying) of the GLSL ES 1.00 specification says:
>
> The precision of varying variables does not need to match.
>
> SO... for GLSL ES 1.00 we should not even emit a warning for varyings
> with mismatched precision. The above spec quotation should appear in
> the patch that does this. We should also add a piglit test and,
> frankly, a CTS test! We've been rejecting completely valid shaders for
> over a year now, and the CTS should have caught that.
>
> If there are actually shaders in the wild that expect mismatched
> precision on uniforms in GLSL ES 1.00 shaders, we should deal with that
> in a separate patch.
Given the commit message corrected to refer to "uniforms" instead,
would it remove your NAK?
Best regards,
Tomasz
>
> On 09/26/2017 01:35 AM, Tomasz Figa 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 a dead varying that will be eliminated.
>> The problem affects a big number of applications using Cocos2D engine
>> and other GLES implementations accept this, this 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.
>>
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97532
>> Signed-off-by: Tomasz Figa <tfiga at chromium.org>
>> ---
>> src/compiler/glsl/linker.cpp | 14 ++++++++++----
>> 1 file changed, 10 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
>> index f352c5385ca..ff2e6b7a0d3 100644
>> --- a/src/compiler/glsl/linker.cpp
>> +++ b/src/compiler/glsl/linker.cpp
>> @@ -1121,10 +1121,16 @@ 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;
>> + 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);
>>
>
More information about the mesa-dev
mailing list