It sucks, and we have someone who can do a much better job than I can starting
work on it soon. alloc_temp/free_temp is left in pass2 to workaround fragprog
temps/outputs overlapping, but this all belongs in the optimiser.
mesa: Update _Current along Current on fragment program bound.
Same as a previously committed patch for vertex program, we
update fragment program ptr _Current along the Current one
so that _Current can't end up pointing to a no more valid
program.
r300: Fix vertex program position invariant bug, force position reading.
When we have a position invariant program we need to force routing the
position otherwise you may handle transform quite random data which might
be funny but unlikely what you want :).
mesa: Update _Current ptr along Current when a new vertex program is bind.
On new vertex program bind only the Current ptr where updated to
point to the new program; this could lead to _Current pointing to
and out of date or even a no more existing program which in turn
could lead to a segfault in some driver. To avoid this _Current
ptr is updated along Current if _Current where previously pointing
to the same program.
i965: Avoid branch instructions while in single program flow mode.
There is an errata for Broadwater that threads don't have the instruction/loop
mask stacks initialized on thread spawn. In single program flow mode, those
stacks are not writable, so we can't initialize them. However, they do get
read during ELSE and ENDIF instructions. So, instead, replace branch
instructions in single program flow mode with predicated jumps (ADD to the ip
register), avoiding use of the more complicated branch instructions that may
fail. This is also a minor optimization as no ENDIF equivalent is necessary.
Signed-off-by: Keith Packard <keithp@neko.keithp.com>