On 10/19/2016 02:17 PM, Brian Paul wrote:
On 10/19/2016 02:40 PM, 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.

The shader author is marking the gl_Position VS output as invariant and
calling ftransform():

invariant gl_Position;
void main()
{
   gl_Position = ftransform();
}

ftransform() expands into gl_ModelviewProjectionMatrix * gl_Vertex.
Then, afaict, the propagation pass marks gl_ModelviewProjectionMatrix as
invariant, but that disagrees with the original declaration of the
matrix and linking fails.

That's my superficial understanding of it.

Do you want me to hold off on pushing the patch?  I'd really like to get
this or another fix in place.

Ping. If a more elaborate fix is a ways off, I'd like to commit Ken's patch ASAP.

-Brian


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to