i965: Fix component mask and varying_to_slot mapping for gl_ViewportIndex
authorAnuj Phogat <anuj.phogat@gmail.com>
Fri, 11 Apr 2014 17:56:50 +0000 (10:56 -0700)
committerAnuj Phogat <anuj.phogat@gmail.com>
Thu, 17 Apr 2014 17:08:28 +0000 (10:08 -0700)
gl_ViewportIndex doesn't get its own varying slot. It is stored
in VARYING_SLOT_PSIZ.z. This patch fixes the issue for both gen7
and gen8 because gen7_upload_3dstate_so_decl_list() is shared
between them.

Fixes failures in OpenGL Khronos CTS test transform_feedback_builtins.
Makes new piglit test glsl-1.50-transform-feedback-builtins pass for
'gl_ViewportIndex'.

Cc: <mesa-stable@lists.freedesktop.org>
Signed-off-by: Anuj Phogat <anuj.phogat@gmail.com>
Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/gen7_sol_state.c

index 3623238d3f69a586fda111773743758523be406d..8e554af9384a4a0d7df2bc21dc8401e8ed236082 100644 (file)
@@ -123,6 +123,7 @@ gen7_upload_3dstate_so_decl_list(struct brw_context *brw,
 
       /* gl_PointSize is stored in VARYING_SLOT_PSIZ.w
        * gl_Layer is stored in VARYING_SLOT_PSIZ.y
+       * gl_ViewportIndex is stored in VARYING_SLOT_PSIZ.z
        */
       if (varying == VARYING_SLOT_PSIZ) {
          assert(components == 1);
@@ -130,6 +131,9 @@ gen7_upload_3dstate_so_decl_list(struct brw_context *brw,
       } else if (varying == VARYING_SLOT_LAYER) {
          assert(components == 1);
          component_mask <<= 1;
+      } else if (varying == VARYING_SLOT_VIEWPORT) {
+         assert(components == 1);
+         component_mask <<= 2;
       } else {
          component_mask <<= linked_xfb_info->Outputs[i].ComponentOffset;
       }
@@ -137,7 +141,7 @@ gen7_upload_3dstate_so_decl_list(struct brw_context *brw,
       buffer_mask |= 1 << buffer;
 
       decl |= buffer << SO_DECL_OUTPUT_BUFFER_SLOT_SHIFT;
-      if (varying == VARYING_SLOT_LAYER) {
+      if (varying == VARYING_SLOT_LAYER || varying == VARYING_SLOT_VIEWPORT) {
          decl |= vue_map->varying_to_slot[VARYING_SLOT_PSIZ] <<
             SO_DECL_REGISTER_INDEX_SHIFT;
       } else {