draw: add code to reset instance dependent data
authorZack Rusin <zackr@vmware.com>
Fri, 19 Apr 2013 23:51:27 +0000 (16:51 -0700)
committerZack Rusin <zackr@vmware.com>
Tue, 23 Apr 2013 00:36:07 +0000 (20:36 -0400)
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 <zackr@vmware.com>
Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/draw/draw_context.c
src/gallium/auxiliary/draw/draw_gs.c
src/gallium/auxiliary/draw/draw_gs.h
src/gallium/auxiliary/draw/draw_private.h
src/gallium/auxiliary/draw/draw_pt.c

index 5272951d2b377bb6f2860caaedbefbf6d3192853..25f79ae19e65000e3b593539bdfc6eaa7edf7da6 100644 (file)
@@ -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 )
 {
index 2f94eaeda4fa574c7f09eb5cf54a296629ffced5..fbb01b457d1081dea955010f37f870a80376cad7 100644 (file)
@@ -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;
+}
index ca744cebfc923bf687dd84d1046eae991864c95d..46d2d614f06996adcc7a8df698aac44ccbf7e0cf 100644 (file)
@@ -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
index d6a3e7c2cee8e6bf84d84c87c0807b954646c846..25a8ae614987a1b4786be1f391f1b54867d4d229 100644 (file)
@@ -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:
index 10f32fd929f0a5d2921a6bb6f37430285b90ebdb..602d076dce29e671c09724997fbf7a791aadc767 100644 (file)
@@ -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);
       }