summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Galibert <[email protected]>2012-05-17 09:32:31 +0200
committerJosé Fonseca <[email protected]>2012-05-18 00:07:18 +0100
commit1ec421823b1263a7b482adf48a15b186ea91efd2 (patch)
tree201f88c87397f8f708d0a2f6d7933c0ad9f2a87c
parentc6c8a05c509b30600d2ccb4be635f05cd71c68a4 (diff)
llvmpipe: Don't mess with the provoking vertex when inverting a triangle.
Fixes a bunch of piglit tests related to flat interpolation of floats. Signed-off-by: Olivier Galibert <[email protected]> Signed-off-by: José Fonseca <[email protected]>
-rw-r--r--src/gallium/drivers/llvmpipe/lp_setup_tri.c45
1 files changed, 40 insertions, 5 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_tri.c b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
index 9916101734f..97a76d85c59 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_tri.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
@@ -815,10 +815,35 @@ 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 );
+ }
}
}