From 913ed25f18aa9e24fc34fcf0b637d73ce355025d Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Fri, 19 Apr 2013 16:51:27 -0700 Subject: [PATCH] draw: add code to reset instance dependent data MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit We want to be able to reset certain parts of the pipeline, in particular the input primitive index, but only either with seperate invocations of the draw_vbo or new instances. In all other cases (e.g. new invocations due to primitive restart) that data needs to be preserved. Add a function through which we can reset instance dependent data. Signed-off-by: Zack Rusin Reviewed-by: José Fonseca --- src/gallium/auxiliary/draw/draw_context.c | 13 +++++++++++++ src/gallium/auxiliary/draw/draw_gs.c | 14 +++++++++++++- src/gallium/auxiliary/draw/draw_gs.h | 2 ++ src/gallium/auxiliary/draw/draw_private.h | 1 + src/gallium/auxiliary/draw/draw_pt.c | 2 ++ 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c index 5272951d2b3..25f79ae19e6 100644 --- a/src/gallium/auxiliary/draw/draw_context.c +++ b/src/gallium/auxiliary/draw/draw_context.c @@ -156,6 +156,19 @@ boolean draw_init(struct draw_context *draw) return TRUE; } +/* + * Called whenever we're starting to draw a new instance. + * Some internal structures don't want to have to reset internal + * members on each invocation (because their state might have to persist + * between multiple primitive restart rendering call) but might have to + * for each new instance. + * This is particularly the case for primitive id's in geometry shader. + */ +void draw_new_instance(struct draw_context *draw) +{ + draw_geometry_shader_new_instance(draw->gs.geometry_shader); +} + void draw_destroy( struct draw_context *draw ) { diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c index 2f94eaeda4f..fbb01b457d1 100644 --- a/src/gallium/auxiliary/draw/draw_gs.c +++ b/src/gallium/auxiliary/draw/draw_gs.c @@ -560,7 +560,6 @@ int draw_geometry_shader_run(struct draw_geometry_shader *shader, shader->emitted_primitives = 0; shader->vertex_size = vertex_size; shader->tmp_output = (float (*)[4])output_verts->verts->data; - shader->in_prim_idx = 0; shader->fetched_prim_count = 0; shader->input_vertex_stride = input_stride; shader->input = input; @@ -869,3 +868,16 @@ void draw_gs_set_current_variant(struct draw_geometry_shader *shader, shader->current_variant = variant; } #endif + +/* + * Called at the very begin of the draw call with a new instance + * Used to reset state that should persist between primitive restart. + */ +void +draw_geometry_shader_new_instance(struct draw_geometry_shader *gs) +{ + if (!gs) + return; + + gs->in_prim_idx = 0; +} diff --git a/src/gallium/auxiliary/draw/draw_gs.h b/src/gallium/auxiliary/draw/draw_gs.h index ca744cebfc9..46d2d614f06 100644 --- a/src/gallium/auxiliary/draw/draw_gs.h +++ b/src/gallium/auxiliary/draw/draw_gs.h @@ -114,6 +114,8 @@ struct draw_geometry_shader { unsigned input_primitives); }; +void draw_geometry_shader_new_instance(struct draw_geometry_shader *gs); + /* * Returns the number of vertices emitted. * The vertex shader can emit any number of vertices as long as it's diff --git a/src/gallium/auxiliary/draw/draw_private.h b/src/gallium/auxiliary/draw/draw_private.h index d6a3e7c2cee..25a8ae61498 100644 --- a/src/gallium/auxiliary/draw/draw_private.h +++ b/src/gallium/auxiliary/draw/draw_private.h @@ -355,6 +355,7 @@ struct draw_prim_info { * Draw common initialization code */ boolean draw_init(struct draw_context *draw); +void draw_new_instance(struct draw_context *draw); /******************************************************************************* * Vertex shader code: diff --git a/src/gallium/auxiliary/draw/draw_pt.c b/src/gallium/auxiliary/draw/draw_pt.c index 10f32fd929f..602d076dce2 100644 --- a/src/gallium/auxiliary/draw/draw_pt.c +++ b/src/gallium/auxiliary/draw/draw_pt.c @@ -561,6 +561,8 @@ draw_vbo(struct draw_context *draw, for (instance = 0; instance < info->instance_count; instance++) { draw->instance_id = instance + info->start_instance; + draw_new_instance(draw); + if (info->primitive_restart) { draw_pt_arrays_restart(draw, info); } -- 2.30.2