draw: add stream output decomposition file
authorZack Rusin <zackr@vmware.com>
Wed, 16 Jun 2010 19:03:55 +0000 (15:03 -0400)
committerZack Rusin <zackr@vmware.com>
Wed, 16 Jun 2010 19:03:55 +0000 (15:03 -0400)
src/gallium/auxiliary/draw/draw_so_emit_tmp.h [new file with mode: 0644]

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 (file)
index 0000000..01212a8
--- /dev/null
@@ -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