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
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