i965/vs: Add support for copying user edge flags.
authorEric Anholt <eric@anholt.net>
Fri, 27 Jul 2012 19:57:56 +0000 (12:57 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 9 Aug 2012 16:07:49 +0000 (09:07 -0700)
Fixes the glsl skinning demo regression since changing to the new GLSL
compiler, and is part of fixing piglit gl-2.0-edgeflag.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50079
NOTE: This is a candidate for the 8.0 branch.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp

index 8f697c401eb80a96e7ce144960fd2454679e4f88..61b10e946dd6b9b0f22cf1f701630607388bfd13 100644 (file)
@@ -2270,6 +2270,17 @@ vec4_visitor::emit_urb_slot(int mrf, int vert_result)
          emit_clip_distances(hw_reg, (vert_result - VERT_RESULT_CLIP_DIST0) * 4);
       }
       break;
+   case VERT_RESULT_EDGE:
+      /* This is present when doing unfilled polygons.  We're supposed to copy
+       * the edge flag from the user-provided vertex array
+       * (glEdgeFlagPointer), or otherwise we'll copy from the current value
+       * of that attribute (starts as 1.0f).  This is then used in clipping to
+       * determine which edges should be drawn as wireframe.
+       */
+      current_annotation = "edge flag";
+      emit(MOV(reg, src_reg(dst_reg(ATTR, VERT_ATTRIB_EDGEFLAG,
+                                    glsl_type::float_type, WRITEMASK_XYZW))));
+      break;
    case BRW_VERT_RESULT_PAD:
       /* No need to write to this slot */
       break;
@@ -2326,8 +2337,6 @@ vec4_visitor::emit_urb_writes()
     */
    assert ((max_usable_mrf - base_mrf) % 2 == 0);
 
-   /* FINISHME: edgeflag */
-
    /* First mrf is the g0-based message header containing URB handles and such,
     * which is implied in VS_OPCODE_URB_WRITE.
     */