gallivm: fix return opcode handling in main function of a shader
authorRoland Scheidegger <sroland@vmware.com>
Sat, 16 Mar 2013 01:55:43 +0000 (02:55 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Tue, 19 Mar 2013 17:04:05 +0000 (18:04 +0100)
commit5af7b45986d1b56c568ebe9c3a40d48853e2e9ff
tree15cf77ef3b7ed571d08c85d91f2e106309f4ffce
parentafc1b7c21f795c1bf18f1edc376624011e2dfd7c
gallivm: fix return opcode handling in main function of a shader

If we're in some conditional or loop we must not return, or the code
after the condition is never executed.
(v2): And, we also can't just continue as nothing happened, since the
mask update code would later check if we actually have a mask, so we
need to remember that there was a return in main where we didn't exit
(to illustrate this, a ret in a if clause would cause a mask update
which is still ok as we're in a conditional, but after the endif the
mask update code would drop the mask hence bringing execution back to
pixels which should have their execution mask set to zero by the ret).
Thanks to Christoph Bumiller for figuring this out.

This fixes https://bugs.freedesktop.org/show_bug.cgi?id=62357.

Note: This is a candidate for the stable branches.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c