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

src/gallium/auxiliary/draw/draw_pipe.c
src/gallium/auxiliary/draw/draw_pt_decompose.h

index 144f10a5d0537a2ac8ef3803bd0d02a1c8355393..3421b826d9d1f7b8498140b27771d3b3d19e830a 100644 (file)
@@ -169,77 +169,41 @@ static void do_triangle( struct draw_context *draw,
 /*
  * Set up macros for draw_pt_decompose.h template code.
  * This code uses vertex indexes / elements.
+ *
+ * Flags are needed by the stipple and unfilled stages.  When the two stages
+ * are active, vcache_run_extras is called and the flags are stored in the
+ * higher bits of i0.  Otherwise, flags do not matter.
  */
 
-/* emit first quad vertex as first vertex in triangles */
-#define QUAD_FIRST_PV(i0,i1,i2,i3)              \
-   do_triangle( draw,                           \
-                ( DRAW_PIPE_RESET_STIPPLE |     \
-                  DRAW_PIPE_EDGE_FLAG_0 |       \
-                  DRAW_PIPE_EDGE_FLAG_1 ),      \
-                verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK),     \
-                verts + stride * (elts[i1] & ~DRAW_PIPE_FLAG_MASK),     \
-                verts + stride * (elts[i2] & ~DRAW_PIPE_FLAG_MASK));    \
-   do_triangle( draw,                           \
-                ( DRAW_PIPE_EDGE_FLAG_1 |       \
-                  DRAW_PIPE_EDGE_FLAG_2 ),      \
-                verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK),     \
-                verts + stride * (elts[i2] & ~DRAW_PIPE_FLAG_MASK),     \
-                verts + stride * (elts[i3] & ~DRAW_PIPE_FLAG_MASK))
-
-/* emit last quad vertex as last vertex in triangles */
-#define QUAD_LAST_PV(i0,i1,i2,i3)               \
-   do_triangle( draw,                           \
-                ( DRAW_PIPE_RESET_STIPPLE |     \
-                  DRAW_PIPE_EDGE_FLAG_0 |       \
-                  DRAW_PIPE_EDGE_FLAG_2 ),      \
-                verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK),     \
-                verts + stride * (elts[i1] & ~DRAW_PIPE_FLAG_MASK),     \
-                verts + stride * (elts[i3] & ~DRAW_PIPE_FLAG_MASK));    \
-   do_triangle( draw,                           \
-                ( DRAW_PIPE_EDGE_FLAG_0 |       \
-                  DRAW_PIPE_EDGE_FLAG_1 ),      \
-                verts + stride * (elts[i1] & ~DRAW_PIPE_FLAG_MASK),     \
-                verts + stride * (elts[i2] & ~DRAW_PIPE_FLAG_MASK),     \
-                verts + stride * (elts[i3] & ~DRAW_PIPE_FLAG_MASK))
-
-#define TRIANGLE(flags,i0,i1,i2)                                        \
-   do_triangle( draw,                                                   \
-                elts[i0],  /* flags */                                  \
-                verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK),     \
-                verts + stride * (elts[i1] & ~DRAW_PIPE_FLAG_MASK),     \
-                verts + stride * (elts[i2] & ~DRAW_PIPE_FLAG_MASK) );
-
-#define LINE(flags,i0,i1)                                       \
-   do_line( draw,                                               \
-            elts[i0],                                           \
-            verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK), \
-            verts + stride * (elts[i1] & ~DRAW_PIPE_FLAG_MASK) );
+#define TRIANGLE(flags,i0,i1,i2)                               \
+   do_triangle( draw,                                          \
+                i0,  /* flags */                               \
+                verts + stride * (i0 & ~DRAW_PIPE_FLAG_MASK),  \
+                verts + stride * (i1 & ~DRAW_PIPE_FLAG_MASK),  \
+                verts + stride * (i2 & ~DRAW_PIPE_FLAG_MASK) )
+
+#define LINE(flags,i0,i1)                                      \
+   do_line( draw,                                              \
+            i0, /* flags */                                    \
+            verts + stride * (i0 & ~DRAW_PIPE_FLAG_MASK),      \
+            verts + stride * (i1 & ~DRAW_PIPE_FLAG_MASK) )
 
 #define POINT(i0)                               \
    do_point( draw,                              \
-             verts + stride * (elts[i0] & ~DRAW_PIPE_FLAG_MASK) )
+             verts + stride * (i0 & ~DRAW_PIPE_FLAG_MASK) )
+
+#define GET_ELT(idx) (elts[idx])
 
 #define FUNC pipe_run_elts
-#define ARGS                                    \
+#define FUNC_VARS                               \
     struct draw_context *draw,                  \
     unsigned prim,                              \
     struct vertex_header *vertices,             \
     unsigned stride,                            \
-    const ushort *elts
-
-#define LOCAL_VARS                                           \
-   char *verts = (char *)vertices;                           \
-   boolean flatfirst = (draw->rasterizer->flatshade &&       \
-                        draw->rasterizer->flatshade_first);  \
-   unsigned i;                                               \
-   ushort flags
-
-#define FLUSH
+    const ushort *elts,                         \
+    unsigned count
 
 #include "draw_pt_decompose.h"
-#undef ARGS
-#undef LOCAL_VARS
 
 
 
@@ -304,38 +268,6 @@ void draw_pipeline_run( struct draw_context *draw,
  * This code is for non-indexed (aka linear) rendering (no elts).
  */
 
-/* emit first quad vertex as first vertex in triangles */
-#define QUAD_FIRST_PV(i0,i1,i2,i3)                               \
-   do_triangle( draw,                                            \
-                ( DRAW_PIPE_RESET_STIPPLE |                      \
-                  DRAW_PIPE_EDGE_FLAG_0 |                        \
-                  DRAW_PIPE_EDGE_FLAG_1 ),                       \
-                verts + stride * ((i0) & ~DRAW_PIPE_FLAG_MASK),  \
-                verts + stride * ((i1) & ~DRAW_PIPE_FLAG_MASK),  \
-                verts + stride * ((i2) & ~DRAW_PIPE_FLAG_MASK)); \
-   do_triangle( draw,                                            \
-                ( DRAW_PIPE_EDGE_FLAG_1 |                        \
-                  DRAW_PIPE_EDGE_FLAG_2 ),                       \
-                verts + stride * ((i0) & ~DRAW_PIPE_FLAG_MASK),  \
-                verts + stride * ((i2) & ~DRAW_PIPE_FLAG_MASK),  \
-                verts + stride * ((i3) & ~DRAW_PIPE_FLAG_MASK))
-
-/* emit last quad vertex as last vertex in triangles */
-#define QUAD_LAST_PV(i0,i1,i2,i3)                                \
-   do_triangle( draw,                                            \
-                ( DRAW_PIPE_RESET_STIPPLE |                      \
-                  DRAW_PIPE_EDGE_FLAG_0 |                        \
-                  DRAW_PIPE_EDGE_FLAG_2 ),                       \
-                verts + stride * ((i0) & ~DRAW_PIPE_FLAG_MASK),  \
-                verts + stride * ((i1) & ~DRAW_PIPE_FLAG_MASK),  \
-                verts + stride * ((i3) & ~DRAW_PIPE_FLAG_MASK)); \
-   do_triangle( draw,                                            \
-                ( DRAW_PIPE_EDGE_FLAG_0 |                        \
-                  DRAW_PIPE_EDGE_FLAG_1 ),                       \
-                verts + stride * ((i1) & ~DRAW_PIPE_FLAG_MASK),  \
-                verts + stride * ((i2) & ~DRAW_PIPE_FLAG_MASK),  \
-                verts + stride * ((i3) & ~DRAW_PIPE_FLAG_MASK))
-
 #define TRIANGLE(flags,i0,i1,i2)                                 \
    do_triangle( draw,                                            \
                 flags,  /* flags */                              \
@@ -353,21 +285,16 @@ void draw_pipeline_run( struct draw_context *draw,
    do_point( draw,                              \
              verts + stride * ((i0) & ~DRAW_PIPE_FLAG_MASK) )
 
-#define FUNC pipe_run_linear
-#define ARGS                                    \
-    struct draw_context *draw,                  \
-    unsigned prim,                              \
-    struct vertex_header *vertices,             \
-    unsigned stride
 
-#define LOCAL_VARS                                           \
-   char *verts = (char *)vertices;                           \
-   boolean flatfirst = (draw->rasterizer->flatshade &&       \
-                        draw->rasterizer->flatshade_first);  \
-   unsigned i;                                               \
-   ushort flags
+#define GET_ELT(idx) (idx)
 
-#define FLUSH
+#define FUNC pipe_run_linear
+#define FUNC_VARS                      \
+    struct draw_context *draw,         \
+    unsigned prim,                     \
+    struct vertex_header *vertices,    \
+    unsigned stride,                   \
+    unsigned count
 
 #include "draw_pt_decompose.h"
 
index 52f9593d46ed535f199cecab6f7b7641a918aa5f..e7ae9c4449944bd8fd838f6d2672d9e7fecd251c 100644 (file)
@@ -1,194 +1,7 @@
+#define LOCAL_VARS                           \
+   char *verts = (char *) vertices;          \
+   const boolean last_vertex_last =          \
+      !(draw->rasterizer->flatshade &&       \
+        draw->rasterizer->flatshade_first)
 
-
-static void FUNC( ARGS,
-                  unsigned count )
-{
-   LOCAL_VARS;
-
-   switch (prim) {
-   case PIPE_PRIM_POINTS:
-      for (i = 0; i < count; i ++) {
-        POINT( (i + 0) );
-      }
-      break;
-
-   case PIPE_PRIM_LINES:
-      for (i = 0; i+1 < count; i += 2) {
-         LINE( DRAW_PIPE_RESET_STIPPLE,
-               (i + 0),
-               (i + 1));
-      }
-      break;
-
-   case PIPE_PRIM_LINE_LOOP:
-      if (count >= 2) {
-         flags = DRAW_PIPE_RESET_STIPPLE;
-
-         for (i = 1; i < count; i++, flags = 0) {
-            LINE( flags,
-                  (i - 1),
-                  (i ));
-         }
-
-        LINE( flags,
-               (i - 1),
-               (0 ));
-      }
-      break;
-
-   case PIPE_PRIM_LINE_STRIP:
-      flags = DRAW_PIPE_RESET_STIPPLE;
-      for (i = 1; i < count; i++, flags = 0) {
-         LINE( flags,
-               (i - 1),
-               (i ));
-      }
-      break;
-
-   case PIPE_PRIM_TRIANGLES:
-      for (i = 0; i+2 < count; i += 3) {
-         TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
-                   (i + 0),
-                   (i + 1),
-                   (i + 2 ));
-      }
-      break;
-
-   case PIPE_PRIM_TRIANGLE_STRIP:
-      if (flatfirst) {
-         for (i = 0; i+2 < count; i++) {
-            /* Emit first triangle vertex as first triangle vertex */
-            TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
-                      (i + 0),
-                      (i + 1 + (i&1)),
-                      (i + 2 - (i&1)) );
-         }
-      }
-      else {
-         for (i = 0; i+2 < count; i++) {
-            /* Emit last triangle vertex as last triangle vertex */
-            TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
-                      (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( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
-                         (i + 1),
-                         (i + 2),
-                         0 );
-            }
-         }
-         else {
-            for (i = 0; i+2 < count; i++) {
-               TRIANGLE( DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL,
-                         (0),
-                         (i + 1),
-                         (i + 2 ));
-            }
-         }
-      }
-      break;
-
-
-   case PIPE_PRIM_QUADS:
-      /* GL quads don't follow provoking vertex convention */
-      if (flatfirst) {
-         for (i = 0; i+3 < count; i += 4) {
-            /* emit last quad vertex as first triangle vertex */
-            QUAD_FIRST_PV( (i + 3),
-                           (i + 0),
-                           (i + 1),
-                           (i + 2) );
-         }
-      }
-      else {
-         for (i = 0; i+3 < count; i += 4) {
-            /* emit last quad vertex as last triangle vertex */
-            QUAD_LAST_PV( (i + 0),
-                          (i + 1),
-                          (i + 2),
-                          (i + 3) );
-         }
-      }
-      break;
-
-   case PIPE_PRIM_QUAD_STRIP:
-      /* GL quad strips don't follow provoking vertex convention */
-      if (flatfirst) {
-         for (i = 0; i+3 < count; i += 2) {
-            /* emit last quad vertex as first triangle vertex */
-            QUAD_FIRST_PV( (i + 3),
-                           (i + 2),
-                           (i + 0),
-                           (i + 1) );
-
-         }
-      }
-      else {
-         for (i = 0; i+3 < count; i += 2) {
-            /* emit last quad vertex as last triangle vertex */
-            QUAD_LAST_PV( (i + 2),
-                          (i + 0),
-                          (i + 1),
-                          (i + 3) );
-         }
-      }
-      break;
-
-   case PIPE_PRIM_POLYGON:
-      /* GL polygons don't follow provoking vertex convention */
-      {
-         /* These bitflags look a little odd because we submit the
-          * vertices as (1,2,0) to satisfy flatshade requirements.
-          */
-         const ushort edge_first  = DRAW_PIPE_EDGE_FLAG_2;
-         const ushort edge_middle = DRAW_PIPE_EDGE_FLAG_0;
-         const ushort edge_last   = DRAW_PIPE_EDGE_FLAG_1;
-
-         flags = DRAW_PIPE_RESET_STIPPLE | edge_first | edge_middle;
-
-        for (i = 0; i+2 < count; i++, flags = edge_middle) {
-
-            if (i + 3 == count)
-               flags |= edge_last;
-
-            if (flatfirst) {
-               /* emit first polygon vertex as first triangle vertex */
-               TRIANGLE( flags,
-                         (0),
-                         (i + 1),
-                         (i + 2) );
-            }
-            else {
-               /* emit first polygon vertex as last triangle vertex */
-               TRIANGLE( flags,
-                         (i + 1),
-                         (i + 2),
-                         (0));
-            }
-        }
-      }
-      break;
-
-   default:
-      assert(0);
-      break;
-   }
-
-   FLUSH;
-}
-
-
-#undef TRIANGLE
-#undef QUAD_FIRST_PV
-#undef QUAD_LAST_PV
-#undef POINT
-#undef LINE
-#undef FUNC
+#include "draw_decompose_tmp.h"