draw: hack around weird primitive id input in gs
authorRoland Scheidegger <sroland@vmware.com>
Thu, 7 Aug 2014 18:34:17 +0000 (20:34 +0200)
committerRoland Scheidegger <sroland@vmware.com>
Fri, 8 Aug 2014 16:54:08 +0000 (18:54 +0200)
commit394ea139c7cf577fe00d38634e697c3a740d4ccd
tree7146e69615561518c79e668b15f3aa9a97e57f1b
parent92a059d294501380d1acce793ce1a97002982147
draw: hack around weird primitive id input in gs

The distinction between system values and ordinary inputs is not very
obvious in gallium - further fueled by the fact that they use the same
semantic names.
Still, if there's any value which imho really is a system value, it's the
primitive id input into the gs (while earlier (tessleation) stages could read
it, it is _always_ generated by the system). For some odd reason though (which
I'd classify as a bug but seems too complicated to fix) the glsl compiler in
mesa treats this as an ordinary varying, and everything else after that
(including the state tracker and other drivers) just go along with that.
But input fetching in gs for llvm based draw was definitely limited to the
ordinary (2-dimensional) inputs so only worked with other state trackers,
the code was also additionally relying on tgsi_scan_shader filling
uses_primid correctly which did not happen neither (would set it only for
all stages if it was a system value, but only set it for the fragment shader
if it was an input value).
This fixes piglit glsl-1.50-geometry-primitive-id-restart and primitive-id-in
in llvmpipe.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/auxiliary/draw/draw_gs.c
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
src/gallium/auxiliary/tgsi/tgsi_scan.c