Mesa (master): draw: add stream output decomposition file

Zack Rusin zack at kemper.freedesktop.org
Wed Jun 16 12:04:20 PDT 2010


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

Author: Zack Rusin <zackr at vmware.com>
Date:   Wed Jun 16 15:03:55 2010 -0400

draw: add stream output decomposition file

---

 src/gallium/auxiliary/draw/draw_so_emit_tmp.h |  123 +++++++++++++++++++++++++
 1 files changed, 123 insertions(+), 0 deletions(-)

diff --git a/src/gallium/auxiliary/draw/draw_so_emit_tmp.h b/src/gallium/auxiliary/draw/draw_so_emit_tmp.h
new file mode 100644
index 0000000..01212a8
--- /dev/null
+++ b/src/gallium/auxiliary/draw/draw_so_emit_tmp.h
@@ -0,0 +1,123 @@
+
+static void FUNC( struct pt_so_emit *so,
+                  const struct draw_prim_info *input_prims,
+                  const struct draw_vertex_info *input_verts,
+                  unsigned start,
+                  unsigned count)
+{
+   struct draw_context *draw = so->draw;
+
+   boolean flatfirst = (draw->rasterizer->flatshade &&
+                        draw->rasterizer->flatshade_first);
+   unsigned i;
+   LOCAL_VARS
+
+   if (0) debug_printf("%s %d\n", __FUNCTION__, count);
+
+   debug_assert(input_prims->primitive_count == 1);
+
+   switch (input_prims->prim) {
+   case PIPE_PRIM_POINTS:
+      for (i = 0; i < count; i++) {
+	 POINT( so, start + i + 0 );
+      }
+      break;
+
+   case PIPE_PRIM_LINES:
+      for (i = 0; i+1 < count; i += 2) {
+         LINE( so , start + i + 0 , start + i + 1 );
+      }
+      break;
+
+   case PIPE_PRIM_LINE_LOOP:
+      if (count >= 2) {
+
+         for (i = 1; i < count; i++) {
+            LINE( so, start + i - 1, start + i );
+         }
+
+	 LINE( so, start + i - 1, start );
+      }
+      break;
+
+   case PIPE_PRIM_LINE_STRIP:
+      for (i = 1; i < count; i++) {
+         LINE( so, start + i - 1, start + i );
+      }
+      break;
+
+   case PIPE_PRIM_TRIANGLES:
+      for (i = 0; i+2 < count; i += 3) {
+         TRIANGLE( so, start + i + 0, start + i + 1, start + i + 2 );
+      }
+      break;
+
+   case PIPE_PRIM_TRIANGLE_STRIP:
+      if (flatfirst) {
+         for (i = 0; i+2 < count; i++) {
+            TRIANGLE( so,
+                      start + i + 0,
+                      start + i + 1 + (i&1),
+                      start + i + 2 - (i&1) );
+         }
+      }
+      else {
+         for (i = 0; i+2 < count; i++) {
+            TRIANGLE( so,
+                      start + i + 0 + (i&1),
+                      start + i + 1 - (i&1),
+                      start + i + 2 );
+         }
+      }
+      break;
+
+   case PIPE_PRIM_TRIANGLE_FAN:
+      if (count >= 3) {
+         if (flatfirst) {
+            for (i = 0; i+2 < count; i++) {
+               TRIANGLE( so,
+                         start + i + 1,
+                         start + i + 2,
+                         start );
+            }
+         }
+         else {
+            for (i = 0; i+2 < count; i++) {
+               TRIANGLE( so,
+                         start,
+                         start + i + 1,
+                         start + i + 2 );
+            }
+         }
+      }
+      break;
+
+   case PIPE_PRIM_POLYGON:
+      {
+         /* These bitflags look a little odd because we submit the
+          * vertices as (1,2,0) to satisfy flatshade requirements.
+          */
+
+	 for (i = 0; i+2 < count; i++) {
+
+            if (flatfirst) {
+               TRIANGLE( so, start + 0, start + i + 1, start + i + 2 );
+            }
+            else {
+               TRIANGLE( so, start + i + 1, start + i + 2, start + 0 );
+            }
+	 }
+      }
+      break;
+
+   default:
+      debug_assert(!"Unsupported primitive in stream output");
+      break;
+   }
+}
+
+
+#undef TRIANGLE
+#undef POINT
+#undef LINE
+#undef FUNC



More information about the mesa-commit mailing list