[Mesa-dev] [PATCH] glsl: do not set the 'smooth' qualifier by default on ES shaders
Timothy Arceri
tarceri at itsqueeze.com
Wed Sep 13 23:00:57 UTC 2017
On 14/09/17 01:22, Nicolai Hähnle wrote:
> On 12.09.2017 03:33, Timothy Arceri wrote:
>>
>>
>> On 12/09/17 00:57, Nicolai Hähnle wrote:
>>> On 11.09.2017 16:47, Ilia Mirkin wrote:
>>>> On Mon, Sep 11, 2017 at 10:44 AM, Nicolai Hähnle
>>>> <nhaehnle at gmail.com> wrote:
>>>>> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>>>>>
>>>>> It breaks integer inputs and outputs on vertex processing stages
>>>>> (e.g. geometry stages). Instead, rely on the driver to choose
>>>>> smooth interpolation by default.
>>>>> ---
>>>>>
>>>>> How about this instead? I haven't fully thought it through, but
>>>>> that's where the INTERP_MODE_SMOOTH is coming from.
>>>>>
>>>>> To be honest I'm not 100% sure about what INTERP_MODE_NONE can
>>>>> mean, but I think it's definitely better than removing the (very
>>>>> valid!) assertion in the packing code.
>>>>
>>>> I couldn't understand what that assertion was asserting, esp in the
>>>> presence of struct in/out variables.
>>>
>>> structs can't have per-member interpolation qualifiers. So a struct
>>> that contains integer values must have FLAT or NONE interpolation as
>>> a whole.
>>>
>>> That clashes pretty hard with that ES rule, though ("When no
>>> interpolation qualifier is present, smooth interpolation is used.").
>> From what I recall, NONE is just a placeholder so that the the driver
>> knows to use the value set by glShadeModel(). ES doesn't have this and
>> so we set this up front. I believe removing it will cause a bunch of
>> tests to fail validation as they expect the default to be set and
>> cross validated against stage interfaces.
>
> So in a way, NONE just means "use the API default". The API default is
> set by glShadeModel() in compatibility profiles. In both ES and core
> profiles it's always "smooth" -- but only ES has this particular
> language about using "smooth" by default in its shading language spec.
>
> Am I really the only one weirded out by seeing integer I/O that claims
> to use smooth interpolation?
>
> I'd much rather not set smooth, as my patch proposes, and if there are
> tests that trigger linking errors, relax those to allow "smooth" and
> "none" to match.
They are CTS tests. Feel free to do it an alternative way but I don't
think this patch alone is enough, the tests seem valid enough to me.
>
>
>> I'm also a bit confused as to what the assert() is trying to catch.
>
> It's catching the weirdness of integer I/O that claims to use smooth
> interpolation. Admittedly, the comment is wrong and this is not related
> to varying packing, but I guarantee that people will be confused about
> this in the future.
>
> Cheers,
> Nicolai
>
>
>>
>>>
>>> On second thought, that assertion is actually irrelevant for varying
>>> packing itself, but it's still pretty disturbing that it's broken by
>>> this particular shader.
>>>
>>> Cheers,
>>> Nicolai
>>>
>>>
>>>>
>>>>>
>>>>> ---
>>>>> src/compiler/glsl/ast_to_hir.cpp | 11 -----------
>>>>> 1 file changed, 11 deletions(-)
>>>>>
>>>>> diff --git a/src/compiler/glsl/ast_to_hir.cpp
>>>>> b/src/compiler/glsl/ast_to_hir.cpp
>>>>> index 98d2f94e129..cb42041642d 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;
>>>>> }
>>>>>
>>>>> --
>>>>> 2.11.0
>>>>>
>>>>> _______________________________________________
>>>>> mesa-dev mailing list
>>>>> mesa-dev at lists.freedesktop.org
>>>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>>
>>>
>> _______________________________________________
>> 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