gallivm: fix exec_mask interaction with geometry shader after end of main
authorRoland Scheidegger <sroland@vmware.com>
Mon, 12 Aug 2013 19:18:58 +0000 (21:18 +0200)
committerRoland Scheidegger <sroland@vmware.com>
Mon, 12 Aug 2013 21:33:00 +0000 (23:33 +0200)
commitcd2f26090a3857703bc85bd58ac5922800b06bc0
treea140aa56f7dd23bc48c7d0100392e04a24dcb45a
parentdfa7b725638bf4b1396516dca732a3720b3625a9
gallivm: fix exec_mask interaction with geometry shader after end of main

Because we must maintain an exec_mask even if there's currently nothing
on the mask stack, we can still have an exec_mask at the end of the program.
Effectively, this mask should be set back to default when returning from main.
Without relying on END/RET opcode (I think it's valid to have neither) it is
actually difficult to do this, as there doesn't seem any reasonable place to
do it, so instead let's just say the exec_mask is invalid outside main (which
it really is effectively).
The problem is that geometry shader called end_primitive outside the shader
(in the epilogue), and as a result used a bogus mask, leading to bugs if we
had to set the (somewhat misnamed) ret_in_main bit anywhere. So just avoid
the mask combining function when called from outside the shader.

Reviewed-by: Zack Rusin <zackr@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_tgsi.c
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c