[Mesa-dev] [PATCH] glsl: Skip invariant/precision linker checks for built-in variables.

Jason Ekstrand jason at jlekstrand.net
Wed Oct 19 23:52:27 UTC 2016


On Wed, Oct 19, 2016 at 3:44 PM, Ian Romanick <idr at freedesktop.org> wrote:

> On 10/19/2016 02:31 PM, Kenneth Graunke wrote:
> > On Wednesday, October 19, 2016 1:40:39 PM PDT Ian Romanick wrote:
> >> On 10/19/2016 11:11 AM, Kenneth Graunke wrote:
> >>> Brian found a bug with my "inline built-ins immediately" code for
> shaders
> >>> which use ftransform() and declare gl_Position invariant:
> >>>
> >>> https://lists.freedesktop.org/archives/mesa-dev/2016-
> October/132452.html
> >>>
> >>> Before my patch, things worked due to a specific order of operations:
> >>>
> >>> 1. link_intrastage_varyings imported the ftransform function into the
> VS
> >>> 2. cross_validate_uniforms() ran and signed off that everything matched
> >>> 3. do_common_optimization did both inlining and invariance propagation,
> >>>    making the VS/FS versions of gl_ModelViewProjectionMatrix have
> >>>    different invariant qualifiers...but after the check in step 2,
> >>>    so we never raised an error.
> >>>
> >>> After my patch, ftransform() is inlined right away, and at compile
> time,
> >>> do_common_optimization propagates the invariant qualifier to the
> >>> gl_ModelViewProjectionMatrix.  When the linker eventually happens, it
> >>> detects the mismatch.
> >>
> >> Why are we marking a uniform as invariant in the first place?  That
> >> sounds boats.
> >
> > I agree.  Propagating invariant/precise to ir_variables used in
> > expressions is pretty bogus.  We should really track this with an
> > ir_expression::exact flag similar to NIR's "exact" flag on ALU
> > expressions.  I don't recall why it was done this way.
> >
> > I've hit problems with invariant on uniforms before.  I tried not
> > propagating it to uniforms back in the day and Curro convinced me
> > it was wrong and would break things.
> >
> > This is a hack - it fixes some cases, but won't fix them all.
> > Not propagating to uniforms will fix some cases, but I think it
> > breaks others.  I don't think we have tests for those cases.
>
> Right... I think the problem case would be expression trees that involve
> only uniforms wouldn't necessarily get the invariant treatment.  If one
> shader had
>
>     uniform mat4 u0;
>     uniform mat4 u1;
>     invariant out vec4 o;
>     in vec4 i;
>
>     void main()
>     {
>         o = u0 * u1 * i;
>     }
>
> and the other shader had
>
>     uniform mat4 u0;
>     uniform mat4 u1;
>     invariant out vec4 o0;
>     out vec4 o1;
>     in vec4 i;
>
>     void main()
>     {
>         o0 = u0 * u1 * i;
>         o1 = u0 * i;
>     }
>
> The 'u0 * u1' part of the invariant expression might get optimized
> differently in each shader.
>

I don't think so.  As soon as o0 gets flagged as invariant, piles of stuff
gets shut off including otherwise "safe" things such as CSE and tree
grafting.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161019/03985a81/attachment.html>


More information about the mesa-dev mailing list