draw: Include draw_decompose_tmp.h in draw_gs_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 GS primitive decomposer.

src/gallium/auxiliary/draw/draw_gs.c
src/gallium/auxiliary/draw/draw_gs_tmp.h

index cff859a42b7ef32e6f7aee8cfdca7c1afb096f1b..f2535c5a549b51555eb06c35f9c87f7db5f522e1 100644 (file)
@@ -373,28 +373,14 @@ static void gs_tri_adj(struct draw_geometry_shader *shader,
    gs_flush(shader, 1);
 }
 
-#define TRIANGLE(gs,i0,i1,i2) gs_tri(gs,i0,i1,i2)
-#define TRI_ADJ(gs,i0,i1,i2,i3,i4,i5)  gs_tri_adj(gs,i0,i1,i2,i3,i4,i5)
-#define LINE(gs,i0,i1)        gs_line(gs,i0,i1)
-#define LINE_ADJ(gs,i0,i1,i2,i3)    gs_line_adj(gs,i0,i1,i2,i3)
-#define POINT(gs,i0)          gs_point(gs,i0)
-#define FUNC gs_run
-#define LOCAL_VARS
+#define FUNC         gs_run
+#define GET_ELT(idx) (idx)
 #include "draw_gs_tmp.h"
 
 
-#define TRIANGLE(gs,i0,i1,i2) gs_tri(gs,elts[i0],elts[i1],elts[i2])
-#define TRI_ADJ(gs,i0,i1,i2,i3,i4,i5)           \
-   gs_tri_adj(gs,elts[i0],elts[i1],elts[i2],elts[i3], \
-              elts[i4],elts[i5])
-#define LINE(gs,i0,i1)        gs_line(gs,elts[i0],elts[i1])
-#define LINE_ADJ(gs,i0,i1,i2,i3)  gs_line_adj(gs,elts[i0],      \
-                                              elts[i1],         \
-                                              elts[i2],elts[i3])
-#define POINT(gs,i0)          gs_point(gs,elts[i0])
-#define FUNC gs_run_elts
-#define LOCAL_VARS                         \
-   const ushort *elts = input_prims->elts;
+#define FUNC         gs_run_elts
+#define LOCAL_VARS   const ushort *elts = input_prims->elts;
+#define GET_ELT(idx) (elts[idx])
 #include "draw_gs_tmp.h"
 
 
index 7a8683cf7c2a39b988af1b67d7ee1c30ca173b33..4a17af0dea34bf542110b655ec7955d9e9f3699e 100644 (file)
-
-static void FUNC( struct draw_geometry_shader *shader,
-                  const struct draw_prim_info *input_prims,
-                  const struct draw_vertex_info *input_verts,
-                  struct draw_prim_info *output_prims,
-                  struct draw_vertex_info *output_verts)
-{
-   struct draw_context *draw = shader->draw;
-
-   boolean flatfirst = (draw->rasterizer->flatshade &&
-                        draw->rasterizer->flatshade_first);
-   unsigned i, j;
-   unsigned count = input_prims->count;
-   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( shader, i + 0 );
-      }
-      break;
-
-   case PIPE_PRIM_LINES:
-      for (i = 0; i+1 < count; i += 2) {
-         LINE( shader , i + 0 , i + 1 );
-      }
-      break;
-
-   case PIPE_PRIM_LINE_LOOP:
-      if (count >= 2) {
-
-         for (i = 1; i < count; i++) {
-            LINE( shader, i - 1, i );
-         }
-
-        LINE( shader, i - 1, 0 );
-      }
-      break;
-
-   case PIPE_PRIM_LINE_STRIP:
-      for (i = 1; i < count; i++) {
-         LINE( shader, i - 1, i );
-      }
-      break;
-
-   case PIPE_PRIM_TRIANGLES:
-      for (i = 0; i+2 < count; i += 3) {
-         TRIANGLE( shader, i + 0, i + 1, i + 2 );
-      }
-      break;
-
-   case PIPE_PRIM_TRIANGLE_STRIP:
-      if (flatfirst) {
-         for (i = 0; i+2 < count; i++) {
-            TRIANGLE( shader,
-                      i + 0,
-                      i + 1 + (i&1),
-                      i + 2 - (i&1) );
-         }
-      }
-      else {
-         for (i = 0; i+2 < count; i++) {
-            TRIANGLE( shader,
-                      i + 0 + (i&1),
-                      i + 1 - (i&1),
-                      i + 2 );
-         }
-      }
-      break;
-
-   case PIPE_PRIM_TRIANGLE_FAN:
-      if (count >= 3) {
-         if (flatfirst) {
-            for (i = 0; i+2 < count; i++) {
-               TRIANGLE( shader,
-                         i + 1,
-                         i + 2,
-                         0 );
-            }
-         }
-         else {
-            for (i = 0; i+2 < count; i++) {
-               TRIANGLE( shader,
-                         0,
-                         i + 1,
-                         i + 2 );
-            }
-         }
-      }
-      break;
-
-   case PIPE_PRIM_POLYGON:
-      {
-        for (i = 0; i+2 < count; i++) {
-
-            if (flatfirst) {
-               TRIANGLE( shader, 0, i + 1, i + 2 );
-            }
-            else {
-               TRIANGLE( shader, i + 1, i + 2, 0 );
-            }
-        }
-      }
-      break;
-
-   case PIPE_PRIM_LINES_ADJACENCY:
-      for (i = 0; i+3 < count; i += 4) {
-         LINE_ADJ( shader , i + 0 , i + 1, i + 2, i + 3 );
-      }
-      break;
-   case PIPE_PRIM_LINE_STRIP_ADJACENCY:
-      for (i = 1; i + 2 < count; i++) {
-         LINE_ADJ( shader, i - 1, i, i + 1, i + 2 );
-      }
-      break;
-
-   case PIPE_PRIM_TRIANGLES_ADJACENCY:
-      for (i = 0; i+5 < count; i += 5) {
-         TRI_ADJ( shader, i + 0, i + 1, i + 2,
-                  i + 3, i + 4, i + 5);
-      }
-      break;
-   case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
-      for (i = 0, j = 0; i+5 < count; i += 2, ++j) {
-         TRI_ADJ( shader,
-                  i + 0,
-                  i + 1 + 2*(j&1),
-                  i + 2 + 2*(j&1),
-                  i + 3 - 2*(j&1),
-                  i + 4 - 2*(j&1),
-                  i + 5);
-      }
-      break;
-
-   default:
-      debug_assert(!"Unsupported primitive in geometry shader");
-      break;
-   }
-}
-
-
-#undef TRIANGLE
-#undef TRI_ADJ
-#undef POINT
-#undef LINE
-#undef LINE_ADJ
-#undef FUNC
-#undef LOCAL_VARS
+#define FUNC_VARS struct draw_geometry_shader *gs,             \
+                  const struct draw_prim_info *input_prims,    \
+                  const struct draw_vertex_info *input_verts,  \
+                  struct draw_prim_info *output_prims,         \
+                  struct draw_vertex_info *output_verts
+
+#define FUNC_ENTER                                                \
+   /* declare more local vars */                                  \
+   struct draw_context *draw = gs->draw;                          \
+   const unsigned prim = input_prims->prim;                       \
+   const unsigned count = input_prims->count;                     \
+   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_QUADS:                                       \
+      case PIPE_PRIM_QUAD_STRIP:                                  \
+      case PIPE_PRIM_POLYGON:                                     \
+         debug_assert(!"unexpected primitive type in GS");        \
+         return;                                                  \
+      default:                                                    \
+         break;                                                   \
+      }                                                           \
+   } while (0)                                                    \
+
+#define POINT(i0)                             gs_point(gs,i0)
+#define LINE(flags,i0,i1)                     gs_line(gs,i0,i1)
+#define TRIANGLE(flags,i0,i1,i2)              gs_tri(gs,i0,i1,i2)
+#define LINE_ADJ(flags,i0,i1,i2,i3)           gs_line_adj(gs,i0,i1,i2,i3)
+#define TRIANGLE_ADJ(flags,i0,i1,i2,i3,i4,i5) gs_tri_adj(gs,i0,i1,i2,i3,i4,i5)
+
+#include "draw_decompose_tmp.h"