Mesa (master): tnl: implement instanced drawing

Brian Paul brianp at kemper.freedesktop.org
Sat Jan 15 17:25:56 UTC 2011


Module: Mesa
Branch: master
Commit: a63486ac680acc0bfb895037aca130a457caa01a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a63486ac680acc0bfb895037aca130a457caa01a

Author: Brian Paul <brianp at vmware.com>
Date:   Fri Dec 10 09:29:13 2010 -0700

tnl: implement instanced drawing

---

 src/mesa/tnl/t_context.h    |    2 ++
 src/mesa/tnl/t_draw.c       |   19 ++++++++++++-------
 src/mesa/tnl/t_vb_program.c |    7 +++++--
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/src/mesa/tnl/t_context.h b/src/mesa/tnl/t_context.h
index bc01646..6a94442 100644
--- a/src/mesa/tnl/t_context.h
+++ b/src/mesa/tnl/t_context.h
@@ -527,6 +527,8 @@ typedef struct
    GLubyte *block[VERT_ATTRIB_MAX];
    GLuint nr_blocks;
 
+   GLuint CurInstance;
+
 } TNLcontext;
 
 
diff --git a/src/mesa/tnl/t_draw.c b/src/mesa/tnl/t_draw.c
index 30f1bf3..bdb893e 100644
--- a/src/mesa/tnl/t_draw.c
+++ b/src/mesa/tnl/t_draw.c
@@ -453,6 +453,7 @@ void _tnl_draw_prims( struct gl_context *ctx,
        */
       struct gl_buffer_object *bo[VERT_ATTRIB_MAX + 1];
       GLuint nr_bo = 0;
+      GLuint inst;
 
       for (i = 0; i < nr_prims;) {
 	 GLuint this_nr_prims;
@@ -470,15 +471,19 @@ void _tnl_draw_prims( struct gl_context *ctx,
 	 /* Binding inputs may imply mapping some vertex buffer objects.
 	  * They will need to be unmapped below.
 	  */
-	 bind_prims(ctx, &prim[i], this_nr_prims);
-	 bind_inputs(ctx, arrays, max_index + prim[i].basevertex + 1,
-		     bo, &nr_bo);
-	 bind_indices(ctx, ib, bo, &nr_bo);
+         for (inst = 0; inst < prim[i].num_instances; inst++) {
 
-	 TNL_CONTEXT(ctx)->Driver.RunPipeline(ctx);
+            bind_prims(ctx, &prim[i], this_nr_prims);
+            bind_inputs(ctx, arrays, max_index + prim[i].basevertex + 1,
+                        bo, &nr_bo);
+            bind_indices(ctx, ib, bo, &nr_bo);
 
-	 unmap_vbos(ctx, bo, nr_bo);
-	 free_space(ctx);
+            tnl->CurInstance = inst;
+            TNL_CONTEXT(ctx)->Driver.RunPipeline(ctx);
+
+            unmap_vbos(ctx, bo, nr_bo);
+            free_space(ctx);
+         }
 
 	 i += this_nr_prims;
       }
diff --git a/src/mesa/tnl/t_vb_program.c b/src/mesa/tnl/t_vb_program.c
index 76f8fde..a185368 100644
--- a/src/mesa/tnl/t_vb_program.c
+++ b/src/mesa/tnl/t_vb_program.c
@@ -218,7 +218,8 @@ _tnl_program_string(struct gl_context *ctx, GLenum target, struct gl_program *pr
  * Initialize virtual machine state prior to executing vertex program.
  */
 static void
-init_machine(struct gl_context *ctx, struct gl_program_machine *machine)
+init_machine(struct gl_context *ctx, struct gl_program_machine *machine,
+             GLuint instID)
 {
    /* Input registers get initialized from the current vertex attribs */
    memcpy(machine->VertAttribs, ctx->Current.Attrib,
@@ -254,6 +255,8 @@ init_machine(struct gl_context *ctx, struct gl_program_machine *machine)
    machine->FetchTexelDeriv = NULL; /* not used by vertex programs */
 
    machine->Samplers = ctx->VertexProgram._Current->Base.SamplerUnits;
+
+   machine->SystemValues[SYSTEM_VALUE_INSTANCE_ID][0] = (GLfloat) instID;
 }
 
 
@@ -339,7 +342,7 @@ run_vp( struct gl_context *ctx, struct tnl_pipeline_stage *stage )
    for (i = 0; i < VB->Count; i++) {
       GLuint attr;
 
-      init_machine(ctx, &machine);
+      init_machine(ctx, &machine, tnl->CurInstance);
 
 #if 0
       printf("Input  %d: %f, %f, %f, %f\n", i,




More information about the mesa-commit mailing list