draw: Include draw_decompose_tmp.h in draw_so_emit_tmp.h.
authorChia-I Wu <olv@lunarg.com>
Sun, 1 Aug 2010 17:38:58 +0000 (01:38 +0800)
committerChia-I Wu <olv@lunarg.com>
Fri, 6 Aug 2010 05:39:36 +0000 (13:39 +0800)
Use draw_decompose_tmp.h to replace stream out primitive decomposer.

src/gallium/auxiliary/draw/draw_pt_so_emit.c
src/gallium/auxiliary/draw/draw_so_emit_tmp.h

index 5d82934889b6ca33c872df8297803d72561698ab..c86bdd99a33bfafe2534b23ef542967ea2e3ae95 100644 (file)
@@ -218,25 +218,15 @@ static void so_tri(struct pt_so_emit *so, int i0, int i1, int i2)
 }
 
 
-#define TRIANGLE(gs,i0,i1,i2) so_tri(so,i0,i1,i2)
-#define LINE(gs,i0,i1)        so_line(so,i0,i1)
-#define POINT(gs,i0)          so_point(so,i0)
-#define FUNC so_run_linear
-#define LOCAL_VARS
+#define FUNC         so_run_linear
+#define GET_ELT(idx) (start + (idx))
 #include "draw_so_emit_tmp.h"
-#undef LOCAL_VARS
-#undef FUNC
 
 
-#define TRIANGLE(gs,i0,i1,i2) so_tri(gs,elts[i0],elts[i1],elts[i2])
-#define LINE(gs,i0,i1)        so_line(gs,elts[i0],elts[i1])
-#define POINT(gs,i0)          so_point(gs,elts[i0])
-#define FUNC so_run_elts
-#define LOCAL_VARS                         \
-   const ushort *elts = input_prims->elts;
+#define FUNC         so_run_elts
+#define LOCAL_VARS   const ushort *elts = input_prims->elts;
+#define GET_ELT(idx) (elts[start + (idx)])
 #include "draw_so_emit_tmp.h"
-#undef LOCAL_VARS
-#undef FUNC
 
 
 void draw_pt_so_emit( struct pt_so_emit *emit,
index 01212a8e536e322b93f94b9ce8eac5e66ac7c0f5..6d8937a0b41b99c289a3fee55a9b2cd1e4a2d02c 100644 (file)
-
-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
+#define FUNC_VARS                               \
+   struct pt_so_emit *so,                       \
+   const struct draw_prim_info *input_prims,    \
+   const struct draw_vertex_info *input_verts,  \
+   unsigned start,                              \
+   unsigned count
+
+#define FUNC_ENTER                                                \
+   /* declare more local vars */                                  \
+   struct draw_context *draw = so->draw;                          \
+   const unsigned prim = input_prims->prim;                       \
+   const boolean last_vertex_last =                               \
+      !(draw->rasterizer->flatshade &&                            \
+        draw->rasterizer->flatshade_first);                       \
+   do {                                                           \
+      debug_assert(input_prims->primitive_count == 1);            \
+      switch (prim) {                                             \
+      case PIPE_PRIM_LINES_ADJACENCY:                             \
+      case PIPE_PRIM_LINE_STRIP_ADJACENCY:                        \
+      case PIPE_PRIM_TRIANGLES_ADJACENCY:                         \
+      case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:                    \
+         debug_assert(!"unexpected primitive type in stream output"); \
+         return;                                                  \
+      default:                                                    \
+         break;                                                   \
+      }                                                           \
+   } while (0)                                                    \
+
+#define POINT(i0)                so_point(so,i0)
+#define LINE(flags,i0,i1)        so_line(so,i0,i1)
+#define TRIANGLE(flags,i0,i1,i2) so_tri(so,i0,i1,i2)
+
+#include "draw_decompose_tmp.h"