summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/softpipe/sp_setup.c
diff options
context:
space:
mode:
authorKeith Whitwell <keith@tungstengraphics.com>2008-04-14 16:18:00 +0100
committerKeith Whitwell <keith@tungstengraphics.com>2008-04-14 16:18:00 +0100
commit871d39ec8c168fa58d8758013e99da63fa58111d (patch)
treeb57a16a3fe6bd124b9ee350e7d9fb0f0e681a386 /src/gallium/drivers/softpipe/sp_setup.c
parent8cbda9f1088718e5dbb97b9a6ddcc43737f94351 (diff)
softpipe: calculate determinant for all triangles, don't rely on draw module to do it
Diffstat (limited to 'src/gallium/drivers/softpipe/sp_setup.c')
-rw-r--r--src/gallium/drivers/softpipe/sp_setup.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/gallium/drivers/softpipe/sp_setup.c b/src/gallium/drivers/softpipe/sp_setup.c
index 5a30788850..0164d0588d 100644
--- a/src/gallium/drivers/softpipe/sp_setup.c
+++ b/src/gallium/drivers/softpipe/sp_setup.c
@@ -696,14 +696,36 @@ static void subtriangle( struct setup_context *setup,
/**
+ * Recalculate prim's determinant. This is needed as we don't have
+ * get this information through the vbuf_render interface & we must
+ * calculate it here.
+ */
+static float
+calc_det( const float (*v0)[4],
+ const float (*v1)[4],
+ const float (*v2)[4] )
+{
+ /* edge vectors e = v0 - v2, f = v1 - v2 */
+ const float ex = v0[0][0] - v2[0][0];
+ const float ey = v0[0][1] - v2[0][1];
+ const float fx = v1[0][0] - v2[0][0];
+ const float fy = v1[0][1] - v2[0][1];
+
+ /* det = cross(e,f).z */
+ return ex * fy - ey * fx;
+}
+
+
+/**
* Do setup for triangle rasterization, then render the triangle.
*/
void setup_tri( struct setup_context *setup,
- float det,
const float (*v0)[4],
const float (*v1)[4],
const float (*v2)[4] )
{
+ float det = calc_det(v0, v1, v2);
+
/*
debug_printf("%s\n", __FUNCTION__ );
*/
@@ -713,6 +735,8 @@ void setup_tri( struct setup_context *setup,
setup->numFragsWritten = 0;
#endif
+
+
if (cull_tri( setup, det ))
return;