Mesa (ext-provoking-vertex): softpipe: implement flatshade_first for triangles

Brian Paul brianp at kemper.freedesktop.org
Wed Jun 10 04:03:30 UTC 2009


Module: Mesa
Branch: ext-provoking-vertex
Commit: 5aec03aaf45ce83cb203849bb3f13c336b232822
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5aec03aaf45ce83cb203849bb3f13c336b232822

Author: Brian Paul <brianp at vmware.com>
Date:   Tue Jun  9 21:52:37 2009 -0600

softpipe: implement flatshade_first for triangles

---

 src/gallium/drivers/softpipe/sp_prim_vbuf.c |  240 ++++++++++++++++++++-------
 1 files changed, 182 insertions(+), 58 deletions(-)

diff --git a/src/gallium/drivers/softpipe/sp_prim_vbuf.c b/src/gallium/drivers/softpipe/sp_prim_vbuf.c
index eef6e58..93eea69 100644
--- a/src/gallium/drivers/softpipe/sp_prim_vbuf.c
+++ b/src/gallium/drivers/softpipe/sp_prim_vbuf.c
@@ -239,57 +239,120 @@ sp_vbuf_draw(struct vbuf_render *vbr, const ushort *indices, uint nr)
 
    case PIPE_PRIM_TRIANGLES:
       for (i = 2; i < nr; i += 3) {
-         setup_tri( setup_ctx,
-                    get_vert(vertex_buffer, indices[i-2], stride),
-                    get_vert(vertex_buffer, indices[i-1], stride),
-                    get_vert(vertex_buffer, indices[i-0], stride));
+         if (softpipe->rasterizer->flatshade_first) {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i-1], stride),
+                       get_vert(vertex_buffer, indices[i-0], stride),
+                       get_vert(vertex_buffer, indices[i-2], stride) );
+         }
+         else {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i-2], stride),
+                       get_vert(vertex_buffer, indices[i-1], stride),
+                       get_vert(vertex_buffer, indices[i-0], stride) );
+         }
       }
       break;
 
    case PIPE_PRIM_TRIANGLE_STRIP:
       for (i = 2; i < nr; i += 1) {
-         setup_tri( setup_ctx,
-                    get_vert(vertex_buffer, indices[i+(i&1)-2], stride),
-                    get_vert(vertex_buffer, indices[i-(i&1)-1], stride),
-                    get_vert(vertex_buffer, indices[i-0], stride));
+         if (softpipe->rasterizer->flatshade_first) {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i+(i&1)-1], stride),
+                       get_vert(vertex_buffer, indices[i-(i&1)], stride),
+                       get_vert(vertex_buffer, indices[i-2], stride) );
+         }
+         else {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i+(i&1)-2], stride),
+                       get_vert(vertex_buffer, indices[i-(i&1)-1], stride),
+                       get_vert(vertex_buffer, indices[i-0], stride) );
+         }
       }
       break;
 
    case PIPE_PRIM_TRIANGLE_FAN:
-   case PIPE_PRIM_POLYGON:
       for (i = 2; i < nr; i += 1) {
-         setup_tri( setup_ctx,
-                    get_vert(vertex_buffer, indices[0], stride),
-                    get_vert(vertex_buffer, indices[i-1], stride),
-                    get_vert(vertex_buffer, indices[i-0], stride));
+         if (softpipe->rasterizer->flatshade_first) {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i-0], stride),
+                       get_vert(vertex_buffer, indices[0], stride),
+                       get_vert(vertex_buffer, indices[i-1], stride) );
+         }
+         else {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[0], stride),
+                       get_vert(vertex_buffer, indices[i-1], stride),
+                       get_vert(vertex_buffer, indices[i-0], stride) );
+         }
       }
       break;
+
    case PIPE_PRIM_QUADS:
       for (i = 3; i < nr; i += 4) {
-         setup_tri( setup_ctx,
-                    get_vert(vertex_buffer, indices[i-3], stride),
-                    get_vert(vertex_buffer, indices[i-2], stride),
-                    get_vert(vertex_buffer, indices[i-0], stride));
-
-         setup_tri( setup_ctx,
-                    get_vert(vertex_buffer, indices[i-2], stride),
-                    get_vert(vertex_buffer, indices[i-1], stride),
-                    get_vert(vertex_buffer, indices[i-0], stride));
+         if (softpipe->rasterizer->flatshade_first) {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i-2], stride),
+                       get_vert(vertex_buffer, indices[i-1], stride),
+                       get_vert(vertex_buffer, indices[i-3], stride) );
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i-1], stride),
+                       get_vert(vertex_buffer, indices[i-0], stride),
+                       get_vert(vertex_buffer, indices[i-3], stride) );
+         }
+         else {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i-3], stride),
+                       get_vert(vertex_buffer, indices[i-2], stride),
+                       get_vert(vertex_buffer, indices[i-0], stride) );
+
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i-2], stride),
+                       get_vert(vertex_buffer, indices[i-1], stride),
+                       get_vert(vertex_buffer, indices[i-0], stride) );
+         }
       }
       break;
+
    case PIPE_PRIM_QUAD_STRIP:
       for (i = 3; i < nr; i += 2) {
-         setup_tri( setup_ctx,
-                    get_vert(vertex_buffer, indices[i-3], stride),
-                    get_vert(vertex_buffer, indices[i-2], stride),
-                    get_vert(vertex_buffer, indices[i-0], stride));
+         if (softpipe->rasterizer->flatshade_first) {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i-0], stride),
+                       get_vert(vertex_buffer, indices[i-1], stride),
+                       get_vert(vertex_buffer, indices[i-3], stride));
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i-2], stride),
+                       get_vert(vertex_buffer, indices[i-0], stride),
+                       get_vert(vertex_buffer, indices[i-3], stride) );
+         }
+         else {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i-3], stride),
+                       get_vert(vertex_buffer, indices[i-2], stride),
+                       get_vert(vertex_buffer, indices[i-0], stride) );
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, indices[i-1], stride),
+                       get_vert(vertex_buffer, indices[i-3], stride),
+                       get_vert(vertex_buffer, indices[i-0], stride) );
+         }
+      }
+      break;
 
+   case PIPE_PRIM_POLYGON:
+      /* Almost same as tri fan but the _first_ vertex specifies the flat
+       * shading color.  Note that the first polygon vertex is passed as
+       * the last triangle vertex here.
+       * flatshade_first state makes no difference.
+       */
+      for (i = 2; i < nr; i += 1) {
          setup_tri( setup_ctx,
+                    get_vert(vertex_buffer, indices[i-0], stride),
                     get_vert(vertex_buffer, indices[i-1], stride),
-                    get_vert(vertex_buffer, indices[i-3], stride),
-                    get_vert(vertex_buffer, indices[i-0], stride));
+                    get_vert(vertex_buffer, indices[0], stride) );
       }
       break;
+
    default:
       assert(0);
    }
@@ -358,60 +421,121 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)
       }
       break;
 
-
    case PIPE_PRIM_TRIANGLES:
       for (i = 2; i < nr; i += 3) {
-         setup_tri( setup_ctx,
-                    get_vert(vertex_buffer, i-2, stride),
-                    get_vert(vertex_buffer, i-1, stride),
-                    get_vert(vertex_buffer, i-0, stride));
+         if (softpipe->rasterizer->flatshade_first) {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i-1, stride),
+                       get_vert(vertex_buffer, i-0, stride),
+                       get_vert(vertex_buffer, i-2, stride) );
+         }
+         else {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i-2, stride),
+                       get_vert(vertex_buffer, i-1, stride),
+                       get_vert(vertex_buffer, i-0, stride) );
+         }
       }
       break;
 
    case PIPE_PRIM_TRIANGLE_STRIP:
-      for (i = 2; i < nr; i += 1) {
-         setup_tri( setup_ctx,
-                    get_vert(vertex_buffer, i+(i&1)-2, stride),
-                    get_vert(vertex_buffer, i-(i&1)-1, stride),
-                    get_vert(vertex_buffer, i-0, stride));
+      for (i = 2; i < nr; i++) {
+         if (softpipe->rasterizer->flatshade_first) {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i+(i&1)-1, stride),
+                       get_vert(vertex_buffer, i-(i&1), stride),
+                       get_vert(vertex_buffer, i-2, stride) );
+         }
+         else {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i+(i&1)-2, stride),
+                       get_vert(vertex_buffer, i-(i&1)-1, stride),
+                       get_vert(vertex_buffer, i-0, stride) );
+         }
       }
       break;
 
    case PIPE_PRIM_TRIANGLE_FAN:
-   case PIPE_PRIM_POLYGON:
       for (i = 2; i < nr; i += 1) {
-         setup_tri( setup_ctx,
-                    get_vert(vertex_buffer, 0, stride),
-                    get_vert(vertex_buffer, i-1, stride),
-                    get_vert(vertex_buffer, i-0, stride));
+         if (softpipe->rasterizer->flatshade_first) {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i-0, stride),
+                       get_vert(vertex_buffer, 0, stride),
+                       get_vert(vertex_buffer, i-1, stride) );
+         }
+         else {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, 0, stride),
+                       get_vert(vertex_buffer, i-1, stride),
+                       get_vert(vertex_buffer, i-0, stride) );
+         }
       }
       break;
+
    case PIPE_PRIM_QUADS:
       for (i = 3; i < nr; i += 4) {
-         setup_tri( setup_ctx,
-                    get_vert(vertex_buffer, i-3, stride),
-                    get_vert(vertex_buffer, i-2, stride),
-                    get_vert(vertex_buffer, i-0, stride));
-
-         setup_tri( setup_ctx,
-                    get_vert(vertex_buffer, i-2, stride),
-                    get_vert(vertex_buffer, i-1, stride),
-                    get_vert(vertex_buffer, i-0, stride));
+         if (softpipe->rasterizer->flatshade_first) {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i-2, stride),
+                       get_vert(vertex_buffer, i-1, stride),
+                       get_vert(vertex_buffer, i-3, stride) );
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i-1, stride),
+                       get_vert(vertex_buffer, i-0, stride),
+                       get_vert(vertex_buffer, i-3, stride) );
+         }
+         else {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i-3, stride),
+                       get_vert(vertex_buffer, i-2, stride),
+                       get_vert(vertex_buffer, i-0, stride) );
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i-2, stride),
+                       get_vert(vertex_buffer, i-1, stride),
+                       get_vert(vertex_buffer, i-0, stride) );
+         }
       }
       break;
+
    case PIPE_PRIM_QUAD_STRIP:
       for (i = 3; i < nr; i += 2) {
-         setup_tri( setup_ctx,
-                    get_vert(vertex_buffer, i-3, stride),
-                    get_vert(vertex_buffer, i-2, stride),
-                    get_vert(vertex_buffer, i-0, stride));
+         if (softpipe->rasterizer->flatshade_first) {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i-0, stride),
+                       get_vert(vertex_buffer, i-1, stride),
+                       get_vert(vertex_buffer, i-3, stride) );
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i-2, stride),
+                       get_vert(vertex_buffer, i-0, stride),
+                       get_vert(vertex_buffer, i-3, stride) );
+         }
+         else {
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i-3, stride),
+                       get_vert(vertex_buffer, i-2, stride),
+                       get_vert(vertex_buffer, i-0, stride) );
+            setup_tri( setup_ctx,
+                       get_vert(vertex_buffer, i-1, stride),
+                       get_vert(vertex_buffer, i-3, stride),
+                       get_vert(vertex_buffer, i-0, stride) );
+         }
+      }
+      break;
 
+   case PIPE_PRIM_POLYGON:
+      /* Almost same as tri fan but the _first_ vertex specifies the flat
+       * shading color.  Note that the first polygon vertex is passed as
+       * the last triangle vertex here.
+       * flatshade_first state makes no difference.
+       */
+      for (i = 2; i < nr; i += 1) {
          setup_tri( setup_ctx,
                     get_vert(vertex_buffer, i-1, stride),
-                    get_vert(vertex_buffer, i-3, stride),
-                    get_vert(vertex_buffer, i-0, stride));
+                    get_vert(vertex_buffer, i-0, stride),
+                    get_vert(vertex_buffer, 0, stride) );
       }
       break;
+
    default:
       assert(0);
    }




More information about the mesa-commit mailing list