Hi,

opt_constant_variable was marking a variable as constant as long as there
was exactly one constant assignment to it, but did not take into account
that this assignment might be in a dynamic branch or a loop.

Was happening on a fragment shader like this:

uniform float mode;
float func (float c) {
    if (mode == 2.0)
        return c; // was returning 0.1 after optimization!
    if (mode == 3.0)
    discard;
    if (mode == 10.0)
        c = 0.1;
    return c;
}
void main() {
    vec4 c = gl_FragCoord;
    c.x = func(c.x);
    gl_FragColor = c;
}


Now, looking further this optimization pass should also not mark variables
as const if there was a dereference of them before that first assignment. I
had code to do this (a hashtable that would track dereferences before
assignment is done). But couldn't come up with a test case that would break
the whole set of optimizations that Mesa does (lower jumps, or inlining,
... were getting in the way and hide the bug).


-- 
Aras Pranckevičius
work: http://unity3d.com
home: http://aras-p.info

Attachment: glsl-constant-variable-fix.diff
Description: Binary data

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

Reply via email to