diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/pipe/draw/draw_context.c | 27 | ||||
-rw-r--r-- | src/mesa/pipe/draw/draw_private.h | 10 | ||||
-rw-r--r-- | src/mesa/pipe/i915simple/i915_prim_vbuf.c | 4 | ||||
-rw-r--r-- | src/mesa/pipe/softpipe/sp_prim_vbuf.c | 2 |
4 files changed, 41 insertions, 2 deletions
diff --git a/src/mesa/pipe/draw/draw_context.c b/src/mesa/pipe/draw/draw_context.c index 80317dd6cf5..0de8bed5297 100644 --- a/src/mesa/pipe/draw/draw_context.c +++ b/src/mesa/pipe/draw/draw_context.c @@ -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); +} diff --git a/src/mesa/pipe/draw/draw_private.h b/src/mesa/pipe/draw/draw_private.h index bdc3a6b9e7e..dc4057bff3b 100644 --- a/src/mesa/pipe/draw/draw_private.h +++ b/src/mesa/pipe/draw/draw_private.h @@ -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 ); diff --git a/src/mesa/pipe/i915simple/i915_prim_vbuf.c b/src/mesa/pipe/i915simple/i915_prim_vbuf.c index 8881d16c885..a78c2b0a6c8 100644 --- a/src/mesa/pipe/i915simple/i915_prim_vbuf.c +++ b/src/mesa/pipe/i915simple/i915_prim_vbuf.c @@ -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 */ diff --git a/src/mesa/pipe/softpipe/sp_prim_vbuf.c b/src/mesa/pipe/softpipe/sp_prim_vbuf.c index 7cb3da6feb1..59cf1c4eb75 100644 --- a/src/mesa/pipe/softpipe/sp_prim_vbuf.c +++ b/src/mesa/pipe/softpipe/sp_prim_vbuf.c @@ -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; |