gallium: still more provoking vertex fixes
authorBrian Paul <brianp@vmware.com>
Thu, 6 May 2010 00:46:05 +0000 (18:46 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 6 May 2010 00:46:11 +0000 (18:46 -0600)
This fixes edge flags for polygons and provoking vertex for
filled quads.

src/gallium/auxiliary/draw/draw_pt_vcache.c
src/gallium/auxiliary/draw/draw_pt_vcache_tmp.h

index bfcd709f25da0948fee451d32d54970c2962ca67..6a48e61e624a1762e0f98229b0655ee06ae6dc99 100644 (file)
@@ -183,8 +183,16 @@ vcache_quad( struct vcache_frontend *vcache,
              unsigned i2,
              unsigned i3 )
 {
-   vcache_triangle( vcache, i0, i1, i3 );
-   vcache_triangle( vcache, i1, i2, i3 );
+   if (vcache->draw->rasterizer->flatshade_first) {
+      /* pass last quad vertex as first triangle vertex */
+      vcache_triangle( vcache, i3, i0, i1 );
+      vcache_triangle( vcache, i3, i1, i2 );
+   }
+   else {
+      /* pass last quad vertex as last triangle vertex */
+      vcache_triangle( vcache, i0, i1, i3 );
+      vcache_triangle( vcache, i1, i2, i3 );
+   }
 }
 
 static INLINE void 
@@ -195,6 +203,7 @@ vcache_ef_quad( struct vcache_frontend *vcache,
                 unsigned i3 )
 {
    if (vcache->draw->rasterizer->flatshade_first) {
+      /* pass last quad vertex as first triangle vertex */
       vcache_triangle_flags( vcache,
                              ( DRAW_PIPE_RESET_STIPPLE |
                                DRAW_PIPE_EDGE_FLAG_0 |
@@ -207,6 +216,7 @@ vcache_ef_quad( struct vcache_frontend *vcache,
                              i3, i1, i2 );
    }
    else {
+      /* pass last quad vertex as last triangle vertex */
       vcache_triangle_flags( vcache,
                              ( DRAW_PIPE_RESET_STIPPLE |
                                DRAW_PIPE_EDGE_FLAG_0 |
index f7a63de3ba9c6be8a1a5ec3788746b1fa1983510..dac68ad4398fd81689f5d00353a87a0a01fa9e57 100644 (file)
@@ -142,20 +142,21 @@ static void FUNC( struct draw_pt_front_end *frontend,
          /* These bitflags look a little odd because we submit the
           * vertices as (1,2,0) to satisfy flatshade requirements.  
           */
-         const ushort edge_first  = DRAW_PIPE_EDGE_FLAG_2;
-         const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_0;
-         const ushort edge_last   = DRAW_PIPE_EDGE_FLAG_1;
          ushort edge_next, edge_finish;
 
          if (flatfirst) {
-            flags = DRAW_PIPE_RESET_STIPPLE | edge_middle | edge_last;
-            edge_next = edge_last;
-            edge_finish = edge_first;
+            flags = (DRAW_PIPE_RESET_STIPPLE |
+                     DRAW_PIPE_EDGE_FLAG_1 |
+                     DRAW_PIPE_EDGE_FLAG_2);
+            edge_next = DRAW_PIPE_EDGE_FLAG_2;
+            edge_finish = DRAW_PIPE_EDGE_FLAG_0;
          }
          else {
-            flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
-            edge_next = edge_middle;
-            edge_finish = edge_last;
+            flags = (DRAW_PIPE_RESET_STIPPLE |
+                     DRAW_PIPE_EDGE_FLAG_2 |
+                     DRAW_PIPE_EDGE_FLAG_0);
+            edge_next = DRAW_PIPE_EDGE_FLAG_0;
+            edge_finish = DRAW_PIPE_EDGE_FLAG_1;
          }
 
         for (i = 0; i+2 < count; i++, flags = edge_next) {