Reset temporary vertices ids.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Wed, 7 Nov 2007 13:07:20 +0000 (13:07 +0000)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Wed, 7 Nov 2007 13:41:09 +0000 (13:41 +0000)
src/mesa/pipe/draw/draw_context.c
src/mesa/pipe/draw/draw_private.h
src/mesa/pipe/i915simple/i915_prim_vbuf.c
src/mesa/pipe/softpipe/sp_prim_vbuf.c

index 80317dd6cf53eda603879808f44c826d5978a0cb..0de8bed52974d1f3fb61b05f90b88af9aa703513 100644 (file)
@@ -243,6 +243,18 @@ void draw_alloc_tmps( struct draw_stage *stage, unsigned nr )
    }
 }
 
+/**
+ * Reset the verticies ids of this and subsequent stages.
+ */
+void draw_reset_tmps( struct draw_stage *stage )
+{
+   unsigned i;
+   
+   if (stage->tmp)
+      for (i = 0; i < stage->nr_tmps; i++)
+        stage->tmp[i]->vertex_id = UNDEFINED_VERTEX_ID;
+}
+
 void draw_free_tmps( struct draw_stage *stage )
 {
    if (stage->tmp) {
@@ -251,9 +263,24 @@ void draw_free_tmps( struct draw_stage *stage )
    }
 }
 
+
 boolean draw_use_sse(struct draw_context *draw)
 {
    return (boolean) draw->use_sse;
 }
 
 
+void draw_reset_vertex_ids(struct draw_context *draw)
+{
+   struct draw_stage *stage = draw->pipeline.first;
+   
+   while (stage) {
+      if (stage->reset_tmps)
+        stage->reset_tmps(stage);
+      else
+        draw_reset_tmps(stage);
+      stage = stage->next;
+   }
+
+   draw_vertex_cache_reset_vertex_ids(draw);
+}
index bdc3a6b9e7eb2e69c5a81f95d967141522d6163a..dc4057bff3b1c6ed05b12fc1979f8664cc695b03 100644 (file)
@@ -116,6 +116,13 @@ struct draw_stage
 
    void (*end)( struct draw_stage * );
 
+   /** 
+    * Reset temporary vertices ids in this stage 
+    * 
+    * draw_free_tmps will be called instead if null.
+    */
+   void (*reset_tmps)( struct draw_stage * );
+
    void (*reset_stipple_counter)( struct draw_stage * );
 };
 
@@ -254,8 +261,11 @@ extern struct draw_stage *draw_validate_stage( struct draw_context *context );
 
 
 extern void draw_free_tmps( struct draw_stage *stage );
+extern void draw_reset_tmps( struct draw_stage *stage );
 extern void draw_alloc_tmps( struct draw_stage *stage, unsigned nr );
 
+extern void draw_reset_vertex_ids( struct draw_context *draw );
+
 
 extern int draw_vertex_cache_check_space( struct draw_context *draw, 
                                          unsigned nr_verts );
index 8881d16c885cc07cd0da184132ada902a7ffc523..a78c2b0a6c82ad33b6cfd4959725cc8773f8d641 100644 (file)
@@ -290,9 +290,11 @@ static void vbuf_flush_elements( struct draw_stage *stage )
       break;
    case PIPE_PRIM_LINES:
       hwprim = PRIM3D_LINELIST;
+      assert(nr % 2 == 0);
       break;
    case PIPE_PRIM_TRIANGLES:
       hwprim = PRIM3D_TRILIST;
+      assert(nr % 3 == 0);
       break;
    default:
       assert(0);
@@ -365,7 +367,7 @@ static void vbuf_flush_vertices( struct draw_stage *stage )
        * issues uploading vertices if the hardware wants to flush when
        * we flush.
        */
-      draw_vertex_cache_reset_vertex_ids( vbuf->i915->draw );
+      draw_reset_vertex_ids( vbuf->i915->draw );
    }
    
    /* FIXME: handle failure */
index 7cb3da6feb1e6ab78693b0a30747b70aad242c7d..59cf1c4eb7544fe0bdce5289c9a3cfcfdc7c8ca4 100644 (file)
@@ -243,7 +243,7 @@ static void vbuf_flush_elements( struct draw_stage *stage )
        * issues uploading vertices if the hardware wants to flush when
        * we flush.
        */
-      draw_vertex_cache_reset_vertex_ids( vbuf->draw_context );
+      draw_reset_vertex_ids( vbuf->draw_context );
    }
 
    stage->tri = vbuf_first_tri;