Mesa (master): draw: Preserve the provoking vertex both when decomposing and clipping.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Tue May 4 23:48:54 UTC 2010


Module: Mesa
Branch: master
Commit: ddb0e18f6c5582d4d2cc59ffd16ad9c4639ed059
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ddb0e18f6c5582d4d2cc59ffd16ad9c4639ed059

Author: José Fonseca <jfonseca at vmware.com>
Date:   Wed May  5 00:40:56 2010 +0100

draw: Preserve the provoking vertex both when decomposing and clipping.

Based on John Lawless' feedback.

---

 src/gallium/auxiliary/draw/draw_pipe_clip.c    |   29 +++++++++++++++++++-----
 src/gallium/auxiliary/draw/draw_pt_decompose.h |   25 ++++++--------------
 2 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_pipe_clip.c b/src/gallium/auxiliary/draw/draw_pipe_clip.c
index 51a6115..428ef4e 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_clip.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_clip.c
@@ -175,9 +175,17 @@ static void emit_poly( struct draw_stage *stage,
    header.pad = 0;
 
    for (i = 2; i < n; i++, header.flags = edge_middle) {
-      header.v[0] = inlist[i-1];
-      header.v[1] = inlist[i];
-      header.v[2] = inlist[0];	/* keep in v[2] for flatshading */
+      /* keep in provoking vertex for flatshading */
+      if (stage->draw->rasterizer->flatshade_first) {
+         header.v[0] = inlist[0];
+         header.v[1] = inlist[i-1];
+         header.v[2] = inlist[i];
+      }
+      else {
+         header.v[0] = inlist[i-1];
+         header.v[1] = inlist[i];
+         header.v[2] = inlist[0];
+      }
 
       if (i == n-1)
          header.flags |= edge_last;
@@ -293,12 +301,21 @@ do_clip_tri( struct draw_stage *stage,
 
    /* If flat-shading, copy color to new provoking vertex.
     */
-   if (clipper->flat && inlist[0] != header->v[2]) {
-      inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
+   if (stage->draw->rasterizer->flatshade_first) {
+      if (clipper->flat && inlist[0] != header->v[0]) {
+         inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
+
+         copy_colors(stage, inlist[0], header->v[0]);
+      }
+   } else {
+      if (clipper->flat && inlist[0] != header->v[2]) {
+         inlist[0] = dup_vert(stage, inlist[0], tmpnr++);
 
-      copy_colors(stage, inlist[0], header->v[2]);
+         copy_colors(stage, inlist[0], header->v[2]);
+      }
    }
 
+
    /* Emit the polygon as triangles to the setup stage:
     */
    if (n >= 3)
diff --git a/src/gallium/auxiliary/draw/draw_pt_decompose.h b/src/gallium/auxiliary/draw/draw_pt_decompose.h
index 3c44f7c..02567d9 100644
--- a/src/gallium/auxiliary/draw/draw_pt_decompose.h
+++ b/src/gallium/auxiliary/draw/draw_pt_decompose.h
@@ -47,19 +47,10 @@ static void FUNC( ARGS,
 
    case PIPE_PRIM_TRIANGLES:
       for (i = 0; i+2 < count; i += 3) {
-         if (flatfirst) {
-            /* put provoking vertex in last pos for clipper */
-            TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
-                      (i + 1),
-                      (i + 2),
-                      (i + 0 ));
-         }
-         else {
-            TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
-                      (i + 0),
-                      (i + 1),
-                      (i + 2 ));
-         }
+         TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
+                   (i + 0),
+                   (i + 1),
+                   (i + 2 ));
       }
       break;
 
@@ -67,9 +58,9 @@ static void FUNC( ARGS,
       if (flatfirst) {
          for (i = 0; i+2 < count; i++) {
             TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
+                      (i + 0),
                       (i + 1 + (i&1)),
-                      (i + 2 - (i&1)),
-                      (i + 0) );
+                      (i + 2 - (i&1)) );
          }
       }
       else {
@@ -87,9 +78,9 @@ static void FUNC( ARGS,
          if (flatfirst) {
             for (i = 0; i+2 < count; i++) {
                TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
+                         (i + 1),
                          (i + 2),
-                         0,
-                         (i + 1) );
+                         0 );
             }
          }
          else {




More information about the mesa-commit mailing list