nv50/ir: allow gl_ViewportIndex to work on non-provoking vertices
authorTobias Klausmann <tobias.johannes.klausmann@mni.thm.de>
Mon, 23 Jun 2014 21:01:42 +0000 (23:01 +0200)
committerIlia Mirkin <imirkin@alum.mit.edu>
Mon, 23 Jun 2014 23:23:16 +0000 (19:23 -0400)
commit98a86f61a8d17eaafaf5907debc7735aa20610d5
tree0c881c244905f4beb2ddd2c549a4d0c6180a12f1
parent604e54de78aa00430b1d61d030656e387866e840
nv50/ir: allow gl_ViewportIndex to work on non-provoking vertices

Previously, if we had something like:

  gl_ViewportIndex = idx;
  for(int i = 0; i < gl_in.length(); i++) {
     gl_Position = gl_in[i].gl_Position;
     EmitVertex();
  }
  EndPrimitive();

The right viewport index would not be set on the primitive because the
last vertex is the provoking one. However blob drivers appear to move
the gl_ViewportIndex write into the for loop, allowing the application
to be ignorant of this detail.

While the application is technically wrong here, because the blob does
it and other drivers appear to implicitly work this way as well, we add
a buffer register that viewport index writes go into, which is then
exported before every EmitVertex() call.

This fixes the remaining piglit tests in ARB_viewport_array for nv50/nvc0.

Signed-off-by: Tobias Klausmann <tobias.johannes.klausmann@mni.thm.de>
Cc: "10.2" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/codegen/nv50_ir_driver.h
src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp