draw: move code to run pipeline from pt to new file
authorKeith Whitwell <keith@tungstengraphics.com>
Fri, 4 Apr 2008 12:18:09 +0000 (13:18 +0100)
committerKeith Whitwell <keith@tungstengraphics.com>
Fri, 4 Apr 2008 12:19:26 +0000 (13:19 +0100)
Add facility for draw_vbuf.c to reset these vertex ids on flushes.
Pre-initialize vertex ids correctly.

src/gallium/auxiliary/draw/Makefile
src/gallium/auxiliary/draw/SConscript
src/gallium/auxiliary/draw/draw_context.c
src/gallium/auxiliary/draw/draw_private.h
src/gallium/auxiliary/draw/draw_pt_fetch_pipeline.c
src/gallium/auxiliary/draw/draw_pt_pipeline.c [new file with mode: 0644]

index b28e516396e1b86dce31f4ba845f4289c639041b..28262a92c608b242278e2413cab6f9d10ab6d5ee 100644 (file)
@@ -19,6 +19,7 @@ C_SOURCES = \
        draw_pt_vcache.c \
        draw_pt_fetch_emit.c \
        draw_pt_fetch_pipeline.c \
+       draw_pt_pipeline.c \
        draw_pt_elts.c \
        draw_prim.c \
        draw_pstipple.c \
index 9ca4197441286452cfd9283aef7a48c78e4134dc..52107912f5e052f6fa40e8520c8bd60e43bd0007 100644 (file)
@@ -18,6 +18,7 @@ draw = env.ConvenienceLibrary(
                'draw_pt_vcache.c',
                'draw_pt_fetch_emit.c',
                'draw_pt_fetch_pipeline.c',
+               'draw_pt_pipeline.c',
                'draw_pt_elts.c',
                'draw_prim.c',
                'draw_pstipple.c',
index d0d5f66b376a1d07fb755f8f7575b6b165da34c9..470c1c571b4ffe96273cc6658113f6f2405ace88 100644 (file)
@@ -434,7 +434,8 @@ void draw_reset_vertex_ids(struct draw_context *draw)
       stage = stage->next;
    }
 
-   draw_vertex_cache_reset_vertex_ids(draw);
+   draw_vertex_cache_reset_vertex_ids(draw); /* going away soon */
+   draw_pt_reset_vertex_ids(draw);
 }
 
 
index 0c9f9c2e0365fa46e6ab30a1936ea51d632a4dfb..48545af9e2b9bfe72f2d4b38a0511cd96afd3d09 100644 (file)
@@ -227,6 +227,12 @@ struct draw_context
          struct draw_pt_front_end *vcache;
       } front;
 
+      struct {
+         char *verts;
+         unsigned vertex_stride;
+         unsigned vertex_count;
+      } pipeline;
+
    } pt;
 
    boolean flushing;
@@ -386,6 +392,14 @@ boolean draw_pt_arrays( struct draw_context *draw,
                         unsigned start,
                         unsigned count );
 
+void draw_pt_reset_vertex_ids( struct draw_context *draw );
+void draw_pt_run_pipeline( struct draw_context *draw,
+                           unsigned prim,
+                           char *verts,
+                           unsigned vertex_stride,
+                           unsigned vertex_count,
+                           const ushort *elts,
+                           unsigned count );
 
 
 /* Prototype/hack (DEPRECATED)
index 94e7d01be4bbabd0852d9a15158e97a2d70f3cb9..0ddb400f7e9dfc9d24bf2d12d311b2dfed1251e5 100644 (file)
@@ -129,7 +129,13 @@ static void emit_R32G32B32A32_FLOAT( const float *attrib,
 static void emit_header( const float *attrib,
                          float **out )
 {
-   (*out)[0] = 0;
+   struct vertex_header *header = (struct vertex_header *) (*out);
+
+   header->clipmask = 0;
+   header->edgeflag = 1;
+   header->pad = 0;
+   header->vertex_id = UNDEFINED_VERTEX_ID;
+
    (*out)[1] = 0;
    (*out)[2] = 0;
    (*out)[3] = 0;
@@ -231,99 +237,6 @@ static void fetch_pipeline_prepare( struct draw_pt_middle_end *middle,
 
 
 
-/**
- * Add a point to the primitive queue.
- * \param i0  index into user's vertex arrays
- */
-static void do_point( struct draw_context *draw,
-                     const char *v0 )
-{
-   struct prim_header prim;
-   
-   prim.reset_line_stipple = 0;
-   prim.edgeflags = 1;
-   prim.pad = 0;
-   prim.v[0] = (struct vertex_header *)v0;
-
-   draw->pipeline.first->point( draw->pipeline.first, &prim );
-}
-
-
-/**
- * Add a line to the primitive queue.
- * \param i0  index into user's vertex arrays
- * \param i1  index into user's vertex arrays
- */
-static void do_line( struct draw_context *draw,
-                    const char *v0,
-                    const char *v1 )
-{
-   struct prim_header prim;
-   
-   prim.reset_line_stipple = 1; /* fixme */
-   prim.edgeflags = 1;
-   prim.pad = 0;
-   prim.v[0] = (struct vertex_header *)v0;
-   prim.v[1] = (struct vertex_header *)v1;
-
-   draw->pipeline.first->line( draw->pipeline.first, &prim );
-}
-
-/**
- * Add a triangle to the primitive queue.
- */
-static void do_triangle( struct draw_context *draw,
-                        char *v0,
-                        char *v1,
-                        char *v2 )
-{
-   struct prim_header prim;
-   
-//   _mesa_printf("tri %d %d %d\n", i0, i1, i2);
-   prim.reset_line_stipple = 1;
-   prim.edgeflags = ~0;
-   prim.pad = 0;
-   prim.v[0] = (struct vertex_header *)v0;
-   prim.v[1] = (struct vertex_header *)v1;
-   prim.v[2] = (struct vertex_header *)v2;
-
-   draw->pipeline.first->tri( draw->pipeline.first, &prim );
-}
-
-
-static void run_pipeline( struct fetch_pipeline_middle_end *fpme,
-                          char *verts,
-                          const ushort *elts,
-                          unsigned count )
-{
-   struct draw_context *draw = fpme->draw;
-   unsigned stride = fpme->pipeline_vertex_size;
-   unsigned i;
-   
-   switch (fpme->prim) {
-   case PIPE_PRIM_POINTS:
-      for (i = 0; i < count; i++) 
-         do_point( draw, 
-                   verts + stride * elts[i] );
-      break;
-   case PIPE_PRIM_LINES:
-      for (i = 0; i+1 < count; i += 2) 
-         do_line( draw, 
-                  verts + stride * elts[i+0],
-                  verts + stride * elts[i+1]);
-      break;
-   case PIPE_PRIM_TRIANGLES:
-      for (i = 0; i+2 < count; i += 3)
-         do_triangle( draw, 
-                      verts + stride * elts[i+0],
-                      verts + stride * elts[i+1],
-                      verts + stride * elts[i+2]);
-      break;
-   }
-}
-
-
-
 
 static void fetch_pipeline_run( struct draw_pt_middle_end *middle,
                             const unsigned *fetch_elts,
@@ -351,10 +264,15 @@ static void fetch_pipeline_run( struct draw_pt_middle_end *middle,
                         fetch_count );
 
    
-   run_pipeline( fpme,
-                 pipeline_verts,
-                 draw_elts,
-                 draw_count );
+   /* Run the pipeline
+    */
+   draw_pt_run_pipeline( fpme->draw,
+                         fpme->prim,
+                         pipeline_verts,
+                         fpme->pipeline_vertex_size,
+                         fetch_count,
+                         draw_elts,
+                         draw_count );
                  
 
    /* Done -- that was easy, wasn't it: 
diff --git a/src/gallium/auxiliary/draw/draw_pt_pipeline.c b/src/gallium/auxiliary/draw/draw_pt_pipeline.c
new file mode 100644 (file)
index 0000000..6e46d39
--- /dev/null
@@ -0,0 +1,162 @@
+/**************************************************************************
+ * 
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+ /*
+  * Authors:
+  *   Keith Whitwell <keith@tungstengraphics.com>
+  */
+
+#include "pipe/p_util.h"
+#include "draw/draw_context.h"
+#include "draw/draw_private.h"
+#include "draw/draw_vertex.h"
+#include "draw/draw_pt.h"
+
+
+/**
+ * Add a point to the primitive queue.
+ * \param i0  index into user's vertex arrays
+ */
+static void do_point( struct draw_context *draw,
+                     const char *v0 )
+{
+   struct prim_header prim;
+   
+   prim.reset_line_stipple = 0;
+   prim.edgeflags = 1;
+   prim.pad = 0;
+   prim.v[0] = (struct vertex_header *)v0;
+
+   draw->pipeline.first->point( draw->pipeline.first, &prim );
+}
+
+
+/**
+ * Add a line to the primitive queue.
+ * \param i0  index into user's vertex arrays
+ * \param i1  index into user's vertex arrays
+ */
+static void do_line( struct draw_context *draw,
+                    const char *v0,
+                    const char *v1 )
+{
+   struct prim_header prim;
+   
+   prim.reset_line_stipple = 1; /* fixme */
+   prim.edgeflags = 1;
+   prim.pad = 0;
+   prim.v[0] = (struct vertex_header *)v0;
+   prim.v[1] = (struct vertex_header *)v1;
+
+   draw->pipeline.first->line( draw->pipeline.first, &prim );
+}
+
+/**
+ * Add a triangle to the primitive queue.
+ */
+static void do_triangle( struct draw_context *draw,
+                        char *v0,
+                        char *v1,
+                        char *v2 )
+{
+   struct prim_header prim;
+   
+//   _mesa_printf("tri %d %d %d\n", i0, i1, i2);
+   prim.reset_line_stipple = 1;
+   prim.edgeflags = ~0;
+   prim.pad = 0;
+   prim.v[0] = (struct vertex_header *)v0;
+   prim.v[1] = (struct vertex_header *)v1;
+   prim.v[2] = (struct vertex_header *)v2;
+
+   draw->pipeline.first->tri( draw->pipeline.first, &prim );
+}
+
+
+
+void draw_pt_reset_vertex_ids( struct draw_context *draw )
+{
+   unsigned i;
+   char *verts = draw->pt.pipeline.verts;
+   unsigned stride = draw->pt.pipeline.vertex_stride;
+
+   for (i = 0; i < draw->pt.pipeline.vertex_count; i++) {
+      ((struct vertex_header *)verts)->vertex_id = UNDEFINED_VERTEX_ID;
+      verts += stride;
+   }
+}
+
+
+/* Code to run the pipeline on a fairly arbitary collection of vertices.
+ *
+ * Vertex headers must be pre-initialized with the
+ * UNDEFINED_VERTEX_ID, this code will cause that id to become
+ * overwritten, so it may have to be reset if there is the intention
+ * to reuse the vertices.
+ *
+ * This code provides a callback to reset the vertex id's which the
+ * draw_vbuf.c code uses when it has to perform a flush.
+ */
+void draw_pt_run_pipeline( struct draw_context *draw,
+                           unsigned prim,
+                           char *verts,
+                           unsigned stride,
+                           unsigned vertex_count,
+                           const ushort *elts,
+                           unsigned count )
+{
+   unsigned i;
+
+   draw->pt.pipeline.verts = verts;
+   draw->pt.pipeline.vertex_stride = stride;
+   draw->pt.pipeline.vertex_count = vertex_count;
+   
+   switch (prim) {
+   case PIPE_PRIM_POINTS:
+      for (i = 0; i < count; i++) 
+         do_point( draw, 
+                   verts + stride * elts[i] );
+      break;
+   case PIPE_PRIM_LINES:
+      for (i = 0; i+1 < count; i += 2) 
+         do_line( draw, 
+                  verts + stride * elts[i+0],
+                  verts + stride * elts[i+1]);
+      break;
+   case PIPE_PRIM_TRIANGLES:
+      for (i = 0; i+2 < count; i += 3)
+         do_triangle( draw, 
+                      verts + stride * elts[i+0],
+                      verts + stride * elts[i+1],
+                      verts + stride * elts[i+2]);
+      break;
+   }
+   
+   draw->pt.pipeline.verts = NULL;
+   draw->pt.pipeline.vertex_count = 0;
+}
+