llvmpipe: Don't mess with the provoking vertex when inverting a triangle.
authorOlivier Galibert <galibert@pobox.com>
Thu, 17 May 2012 07:32:31 +0000 (09:32 +0200)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 17 May 2012 23:07:18 +0000 (00:07 +0100)
Fixes a bunch of piglit tests related to flat interpolation of floats.

Signed-off-by: Olivier Galibert <galibert@pobox.com>
Signed-off-by: José Fonseca <jose.r.fonseca@gmail.com>
src/gallium/drivers/llvmpipe/lp_setup_tri.c

index 9916101734f993c4d0c42458ec71dfad428c429c..97a76d85c59a1fbe40a99932e40bad2464da6836 100644 (file)
@@ -813,12 +813,37 @@ calc_fixed_position( struct lp_setup_context *setup,
 }
 
 
+/**
+ * Rotate a triangle, flipping its clockwise direction,
+ * Swaps values for xy[0] and xy[1]
+ */
+static INLINE void
+rotate_fixed_position_01( struct fixed_position* position )
+{
+   int x, y;
+
+   x = position->x[1];
+   y = position->y[1];
+   position->x[1] = position->x[0];
+   position->y[1] = position->y[0];
+   position->x[0] = x;
+   position->y[0] = y;
+
+   position->dx01 = -position->dx01;
+   position->dy01 = -position->dy01;
+   position->dx20 = position->x[2] - position->x[0];
+   position->dy20 = position->y[2] - position->y[0];
+
+   position->area = -position->area;
+}
+
+
 /**
  * Rotate a triangle, flipping its clockwise direction,
  * Swaps values for xy[1] and xy[2]
  */
 static INLINE void
-rotate_fixed_position( struct fixed_position* position )
+rotate_fixed_position_12( struct fixed_position* position )
 {
    int x, y;
 
@@ -852,8 +877,13 @@ static void triangle_cw( struct lp_setup_context *setup,
    calc_fixed_position(setup, &position, v0, v1, v2);
 
    if (position.area < 0) {
-      rotate_fixed_position(&position);
-      retry_triangle_ccw(setup, &position, v0, v2, v1, !setup->ccw_is_frontface);
+      if (setup->flatshade_first) {
+         rotate_fixed_position_12(&position);
+         retry_triangle_ccw(setup, &position, v0, v2, v1, !setup->ccw_is_frontface);
+      } else {
+         rotate_fixed_position_01(&position);
+         retry_triangle_ccw(setup, &position, v1, v0, v2, !setup->ccw_is_frontface);
+      }
    }
 }
 
@@ -893,8 +923,13 @@ static void triangle_both( struct lp_setup_context *setup,
    if (position.area > 0)
       retry_triangle_ccw( setup, &position, v0, v1, v2, setup->ccw_is_frontface );
    else if (position.area < 0) {
-      rotate_fixed_position( &position );
-      retry_triangle_ccw( setup, &position, v0, v2, v1, !setup->ccw_is_frontface );
+      if (setup->flatshade_first) {
+         rotate_fixed_position_12( &position );
+         retry_triangle_ccw( setup, &position, v0, v2, v1, !setup->ccw_is_frontface );
+      } else {
+         rotate_fixed_position_01( &position );
+         retry_triangle_ccw( setup, &position, v1, v0, v2, !setup->ccw_is_frontface );
+      }
    }
 }