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