On Monday 18 June 2012, Brian Paul wrote: > On 06/15/2012 03:38 PM, Fredrik Höglund wrote: > > --- > > src/mapi/glapi/gen/ARB_base_instance.xml | 40 +++++++++++ > > src/mapi/glapi/gen/Makefile | 1 + > > src/mapi/glapi/gen/gl_API.xml | 3 +- > > src/mesa/main/dd.h | 10 +++ > > src/mesa/main/dlist.c | 45 ++++++++++++ > > src/mesa/main/extensions.c | 1 + > > src/mesa/main/mtypes.h | 1 + > > src/mesa/main/vtxfmt.c | 3 + > > src/mesa/vbo/vbo.h | 1 + > > src/mesa/vbo/vbo_exec_api.c | 1 + > > src/mesa/vbo/vbo_exec_array.c | 114 > > +++++++++++++++++++++++++++--- > > src/mesa/vbo/vbo_save_api.c | 2 + > > src/mesa/vbo/vbo_split_inplace.c | 6 +- > > 13 files changed, 216 insertions(+), 12 deletions(-) > > create mode 100644 src/mapi/glapi/gen/ARB_base_instance.xml > > > > diff --git a/src/mapi/glapi/gen/ARB_base_instance.xml > > b/src/mapi/glapi/gen/ARB_base_instance.xml > > new file mode 100644 > > index 0000000..8e81553 > > --- /dev/null > > +++ b/src/mapi/glapi/gen/ARB_base_instance.xml > > @@ -0,0 +1,40 @@ > > +<?xml version="1.0"?> > > +<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd"> > > + > > +<!-- Note: no GLX protocol info yet. --> > > + > > + > > +<OpenGLAPI> > > + > > +<category name="GL_ARB_base_instance" number="107"> > > + > > +<function name="DrawArraysInstancedBaseInstance" offset="assign"> > > +<param name="mode" type="GLenum"/> > > +<param name="first" type="GLint"/> > > +<param name="count" type="GLsizei"/> > > +<param name="primcount" type="GLsizei"/> > > +<param name="baseinstance" type="GLuint"/> > > +</function> > > + > > +<function name="DrawElementsInstancedBaseInstance" offset="assign"> > > +<param name="mode" type="GLenum"/> > > +<param name="count" type="GLsizei"/> > > +<param name="type" type="GLenum"/> > > +<param name="indices" type="const GLvoid *"/> > > +<param name="primcount" type="GLsizei"/> > > +<param name="baseinstance" type="GLuint"/> > > +</function> > > + > > +<function name="DrawElementsInstancedBaseVertexBaseInstance" > > offset="assign"> > > +<param name="mode" type="GLenum"/> > > +<param name="count" type="GLsizei"/> > > +<param name="type" type="GLenum"/> > > +<param name="indices" type="const GLvoid *"/> > > +<param name="primcount" type="GLsizei"/> > > +<param name="basevertex" type="GLint"/> > > +<param name="baseinstance" type="GLuint"/> > > +</function> > > + > > +</category> > > + > > +</OpenGLAPI> > > diff --git a/src/mapi/glapi/gen/Makefile b/src/mapi/glapi/gen/Makefile > > index 75dbb14..0ac7989 100644 > > --- a/src/mapi/glapi/gen/Makefile > > +++ b/src/mapi/glapi/gen/Makefile > > @@ -63,6 +63,7 @@ XORG_OUTPUTS = \ > > > > API_XML = \ > > gl_API.xml \ > > + ARB_base_instance.xml \ > > ARB_color_buffer_float.xml \ > > ARB_copy_buffer.xml \ > > ARB_debug_output.xml \ > > diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml > > index 4bd0fc6..c96b2a0 100644 > > --- a/src/mapi/glapi/gen/gl_API.xml > > +++ b/src/mapi/glapi/gen/gl_API.xml > > @@ -7995,8 +7995,9 @@ > > > > <!-- ARB extensions #106...#116 --> > > > > -<xi:include href="ARB_texture_storage.xml" > > xmlns:xi="http://www.w3.org/2001/XInclude"/> > > +<xi:include href="ARB_base_instance.xml" > > xmlns:xi="http://www.w3.org/2001/XInclude"/> > > > > +<xi:include href="ARB_texture_storage.xml" > > xmlns:xi="http://www.w3.org/2001/XInclude"/> > > > > <!-- Non-ARB extensions sorted by extension number. --> > > > > diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h > > index 1582a8c..5bcf36b 100644 > > --- a/src/mesa/main/dd.h > > +++ b/src/mesa/main/dd.h > > @@ -1029,12 +1029,22 @@ typedef struct { > > const GLint *basevertex); > > void (GLAPIENTRYP DrawArraysInstanced)(GLenum mode, GLint first, > > GLsizei count, GLsizei > > primcount); > > + void (GLAPIENTRYP DrawArraysInstancedBaseInstance)(GLenum mode, GLint > > first, > > + GLsizei count, > > GLsizei primcount, > > + GLuint baseinstance); > > void (GLAPIENTRYP DrawElementsInstanced)(GLenum mode, GLsizei count, > > GLenum type, const GLvoid > > *indices, > > GLsizei primcount); > > + void (GLAPIENTRYP DrawElementsInstancedBaseInstance)(GLenum mode, > > GLsizei count, > > + GLenum type, const > > GLvoid *indices, > > + GLsizei primcount, > > GLuint baseinstance); > > void (GLAPIENTRYP DrawElementsInstancedBaseVertex)(GLenum mode, > > GLsizei count, > > GLenum type, const GLvoid > > *indices, > > GLsizei primcount, GLint > > basevertex); > > + void (GLAPIENTRYP DrawElementsInstancedBaseVertexBaseInstance)(GLenum > > mode, GLsizei count, > > + GLenum > > type, const GLvoid *indices, > > + GLsizei > > primcount, GLint basevertex, > > + GLuint > > baseinstance); > > void (GLAPIENTRYP DrawTransformFeedback)(GLenum mode, GLuint name); > > /*@}*/ > > > > diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c > > index e04f7ae..a0d84cf 100644 > > --- a/src/mesa/main/dlist.c > > +++ b/src/mesa/main/dlist.c > > @@ -1337,6 +1337,46 @@ save_DrawElementsInstancedBaseVertexARB(GLenum mode, > > "glDrawElementsInstancedBaseVertex() during display list > > compile"); > > } > > > > +/* GL_ARB_base_instance. */ > > +static void GLAPIENTRY > > +save_DrawArraysInstancedBaseInstance(GLenum mode, > > + GLint first, > > + GLsizei count, > > + GLsizei primcount, > > + GLuint baseinstance) > > +{ > > + GET_CURRENT_CONTEXT(ctx); > > + _mesa_error(ctx, GL_INVALID_OPERATION, > > + "glDrawArraysInstancedBaseInstance() during display list > > compile"); > > +} > > + > > +static void APIENTRY > > +save_DrawElementsInstancedBaseInstance(GLenum mode, > > + GLsizei count, > > + GLenum type, > > + const void *indices, > > + GLsizei primcount, > > + GLuint baseinstance) > > +{ > > + GET_CURRENT_CONTEXT(ctx); > > + _mesa_error(ctx, GL_INVALID_OPERATION, > > + "glDrawElementsInstancedBaseInstance() during display list > > compile"); > > +} > > + > > +static void APIENTRY > > +save_DrawElementsInstancedBaseVertexBaseInstance(GLenum mode, > > + GLsizei count, > > + GLenum type, > > + const void *indices, > > + GLsizei primcount, > > + GLint basevertex, > > + GLuint baseinstance) > > +{ > > + GET_CURRENT_CONTEXT(ctx); > > + _mesa_error(ctx, GL_INVALID_OPERATION, > > + "glDrawElementsInstancedBaseVertexBaseInstance() during display > > list compile"); > > +} > > + > > static void invalidate_saved_current_state( struct gl_context *ctx ) > > { > > GLint i; > > @@ -10816,6 +10856,11 @@ _mesa_save_vtxfmt_init(GLvertexformat * vfmt) > > /* GL_ARB_draw_elements_base_vertex */ > > vfmt->DrawElementsInstancedBaseVertex = > > save_DrawElementsInstancedBaseVertexARB; > > > > + /* GL_ARB_base_instance */ > > + vfmt->DrawArraysInstancedBaseInstance = > > save_DrawArraysInstancedBaseInstance; > > + vfmt->DrawElementsInstancedBaseInstance = > > save_DrawElementsInstancedBaseInstance; > > + vfmt->DrawElementsInstancedBaseVertexBaseInstance = > > save_DrawElementsInstancedBaseVertexBaseInstance; > > + > > /* The driver is required to implement these as > > * 1) They can probably do a better job. > > * 2) A lot of new mechanisms would have to be added to this module > > diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c > > index 2688f7a..c7ae561 100644 > > --- a/src/mesa/main/extensions.c > > +++ b/src/mesa/main/extensions.c > > @@ -78,6 +78,7 @@ struct extension { > > static const struct extension extension_table[] = { > > /* ARB Extensions */ > > { "GL_ARB_ES2_compatibility", > > o(ARB_ES2_compatibility), GL, 2009 }, > > + { "GL_ARB_base_instance", o(ARB_base_instance), > > GL, 2011 }, > > { "GL_ARB_blend_func_extended", > > o(ARB_blend_func_extended), GL, 2009 }, > > { "GL_ARB_color_buffer_float", > > o(ARB_color_buffer_float), GL, 2004 }, > > { "GL_ARB_copy_buffer", o(ARB_copy_buffer), > > GL, 2008 }, > > diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h > > index ea40ffc..e92febf 100644 > > --- a/src/mesa/main/mtypes.h > > +++ b/src/mesa/main/mtypes.h > > @@ -2869,6 +2869,7 @@ struct gl_extensions > > GLboolean dummy_true; /* Set true by _mesa_init_extensions(). */ > > GLboolean dummy_false; /* Set false by _mesa_init_extensions(). */ > > GLboolean ARB_ES2_compatibility; > > + GLboolean ARB_base_instance; > > GLboolean ARB_blend_func_extended; > > GLboolean ARB_color_buffer_float; > > GLboolean ARB_conservative_depth; > > diff --git a/src/mesa/main/vtxfmt.c b/src/mesa/main/vtxfmt.c > > index 6fb016b..a27596a 100644 > > --- a/src/mesa/main/vtxfmt.c > > +++ b/src/mesa/main/vtxfmt.c > > @@ -105,8 +105,11 @@ install_vtxfmt( struct _glapi_table *tab, const > > GLvertexformat *vfmt ) > > SET_DrawRangeElementsBaseVertex(tab, > > vfmt->DrawRangeElementsBaseVertex); > > SET_MultiDrawElementsBaseVertex(tab, > > vfmt->MultiDrawElementsBaseVertex); > > SET_DrawArraysInstancedARB(tab, vfmt->DrawArraysInstanced); > > + SET_DrawArraysInstancedBaseInstance(tab, > > vfmt->DrawArraysInstancedBaseInstance); > > SET_DrawElementsInstancedARB(tab, vfmt->DrawElementsInstanced); > > + SET_DrawElementsInstancedBaseInstance(tab, > > vfmt->DrawElementsInstancedBaseInstance); > > SET_DrawElementsInstancedBaseVertex(tab, > > vfmt->DrawElementsInstancedBaseVertex); > > + SET_DrawElementsInstancedBaseVertexBaseInstance(tab, > > vfmt->DrawElementsInstancedBaseVertexBaseInstance); > > SET_DrawTransformFeedback(tab, vfmt->DrawTransformFeedback); > > > > /* GL_NV_vertex_program */ > > diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h > > index 4387e10..7442e30 100644 > > --- a/src/mesa/vbo/vbo.h > > +++ b/src/mesa/vbo/vbo.h > > @@ -51,6 +51,7 @@ struct _mesa_prim { > > GLuint count; > > GLint basevertex; > > GLsizei num_instances; > > + GLuint baseinstance; > > I think base_instance would be more readable.
I agree. I just went with baseinstance since that's what was in the spec, and since we already had basevertex. I'll change it and send updated patches. > > }; > > > > /* Would like to call this a "vbo_index_buffer", but this would be > > diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c > > index 28d2c4d..07c04ea 100644 > > --- a/src/mesa/vbo/vbo_exec_api.c > > +++ b/src/mesa/vbo/vbo_exec_api.c > > @@ -827,6 +827,7 @@ static void GLAPIENTRY vbo_exec_Begin( GLenum mode ) > > exec->vtx.prim[i].start = exec->vtx.vert_count; > > exec->vtx.prim[i].count = 0; > > exec->vtx.prim[i].num_instances = 1; > > + exec->vtx.prim[i].baseinstance = 0; > > > > ctx->Driver.CurrentExecPrimitive = mode; > > } > > diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c > > index 3fb7c64..cac1503 100644 > > --- a/src/mesa/vbo/vbo_exec_array.c > > +++ b/src/mesa/vbo/vbo_exec_array.c > > @@ -581,7 +581,7 @@ vbo_handle_primitive_restart(struct gl_context *ctx, > > */ > > static void > > vbo_draw_arrays(struct gl_context *ctx, GLenum mode, GLint start, > > - GLsizei count, GLuint numInstances) > > + GLsizei count, GLuint numInstances, GLuint baseinstance) > > { > > struct vbo_context *vbo = vbo_context(ctx); > > struct vbo_exec_context *exec =&vbo->exec; > > @@ -595,6 +595,7 @@ vbo_draw_arrays(struct gl_context *ctx, GLenum mode, > > GLint start, > > prim[0].end = 1; > > prim[0].mode = mode; > > prim[0].num_instances = numInstances; > > + prim[0].baseinstance = baseinstance; > > > > /* Implement the primitive restart index */ > > if (ctx->Array.PrimitiveRestart&& ctx->Array.RestartIndex< count) { > > @@ -673,7 +674,7 @@ vbo_exec_DrawArrays(GLenum mode, GLint start, GLsizei > > count) > > if (0) > > check_draw_arrays_data(ctx, start, count); > > > > - vbo_draw_arrays(ctx, mode, start, count, 1); > > + vbo_draw_arrays(ctx, mode, start, count, 1, 0); > > > > if (0) > > print_draw_arrays(ctx, mode, start, count); > > @@ -702,7 +703,7 @@ vbo_exec_DrawArraysInstanced(GLenum mode, GLint start, > > GLsizei count, > > if (0) > > check_draw_arrays_data(ctx, start, count); > > > > - vbo_draw_arrays(ctx, mode, start, count, numInstances); > > + vbo_draw_arrays(ctx, mode, start, count, numInstances, 0); > > > > if (0) > > print_draw_arrays(ctx, mode, start, count); > > @@ -710,6 +711,40 @@ vbo_exec_DrawArraysInstanced(GLenum mode, GLint start, > > GLsizei count, > > > > > > /** > > + * Called from glDrawArraysInstancedBaseInstance when in immediate mode. > > + */ > > +static void GLAPIENTRY > > +vbo_exec_DrawArraysInstancedBaseInstance(GLenum mode, GLint first, GLsizei > > count, > > + GLsizei numInstances, GLuint > > baseinstance) > > +{ > > + GET_CURRENT_CONTEXT(ctx); > > + > > + if (MESA_VERBOSE& VERBOSE_DRAW) > > + _mesa_debug(ctx, "glDrawArraysInstancedBaseInstance(%s, %d, %d, %d, > > %d)\n", > > + _mesa_lookup_enum_by_nr(mode), first, count, > > + numInstances, baseinstance); > > + > > + if (!_mesa_validate_DrawArraysInstanced(ctx, mode, first, count, > > + numInstances)) > > + return; > > + > > + FLUSH_CURRENT(ctx, 0); > > + > > + if (!_mesa_valid_to_render(ctx, "glDrawArraysInstancedBaseInstance")) > > + return; > > + > > + if (0) > > + check_draw_arrays_data(ctx, first, count); > > + > > + vbo_draw_arrays(ctx, mode, first, count, numInstances, baseinstance); > > + > > + if (0) > > + print_draw_arrays(ctx, mode, first, count); > > +} > > + > > + > > + > > +/** > > * Map GL_ELEMENT_ARRAY_BUFFER and print contents. > > * For debugging. > > */ > > @@ -779,7 +814,8 @@ vbo_validated_drawrangeelements(struct gl_context *ctx, > > GLenum mode, > > GLuint start, GLuint end, > > GLsizei count, GLenum type, > > const GLvoid *indices, > > - GLint basevertex, GLint numInstances) > > + GLint basevertex, GLint numInstances, > > + GLuint baseinstance) > > I'd prefer base_instance or baseInstance here too. basevertex should > be fixed someday too. > > > > { > > struct vbo_context *vbo = vbo_context(ctx); > > struct vbo_exec_context *exec =&vbo->exec; > > @@ -803,6 +839,7 @@ vbo_validated_drawrangeelements(struct gl_context *ctx, > > GLenum mode, > > prim[0].indexed = 1; > > prim[0].basevertex = basevertex; > > prim[0].num_instances = numInstances; > > + prim[0].baseinstance = baseinstance; > > > > /* Need to give special consideration to rendering a range of > > * indices starting somewhere above zero. Typically the > > @@ -927,7 +964,7 @@ vbo_exec_DrawRangeElementsBaseVertex(GLenum mode, > > #endif > > > > vbo_validated_drawrangeelements(ctx, mode, index_bounds_valid, start, > > end, > > - count, type, indices, basevertex, 1); > > + count, type, indices, basevertex, 1, 0); > > } > > > > > > @@ -971,7 +1008,7 @@ vbo_exec_DrawElements(GLenum mode, GLsizei count, > > GLenum type, > > return; > > > > vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0, > > - count, type, indices, 0, 1); > > + count, type, indices, 0, 1, 0); > > } > > > > > > @@ -996,7 +1033,7 @@ vbo_exec_DrawElementsBaseVertex(GLenum mode, GLsizei > > count, GLenum type, > > return; > > > > vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0, > > - count, type, indices, basevertex, 1); > > + count, type, indices, basevertex, 1, 0); > > } > > > > > > @@ -1021,9 +1058,10 @@ vbo_exec_DrawElementsInstanced(GLenum mode, GLsizei > > count, GLenum type, > > return; > > > > vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0, > > - count, type, indices, 0, numInstances); > > + count, type, indices, 0, numInstances, 0); > > } > > > > + > > /** > > * Called by glDrawElementsInstancedBaseVertex() in immediate mode. > > */ > > @@ -1047,7 +1085,59 @@ vbo_exec_DrawElementsInstancedBaseVertex(GLenum > > mode, GLsizei count, GLenum type > > return; > > > > vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0, > > - count, type, indices, basevertex, > > numInstances); > > + count, type, indices, basevertex, > > numInstances, 0); > > +} > > + > > + > > +/** > > + * Called by glDrawElementsInstancedBaseInstance() in immediate mode. > > + */ > > +static void GLAPIENTRY > > +vbo_exec_DrawElementsInstancedBaseInstance(GLenum mode, GLsizei count, > > GLenum type, > > + const GLvoid *indices, GLsizei > > numInstances, > > + GLuint baseinstance) > > +{ > > + GET_CURRENT_CONTEXT(ctx); > > + > > + if (MESA_VERBOSE& VERBOSE_DRAW) > > + _mesa_debug(ctx, "glDrawElementsInstancedBaseInstance(%s, %d, %s, > > %p, %d, %d)\n", > > + _mesa_lookup_enum_by_nr(mode), count, > > + _mesa_lookup_enum_by_nr(type), indices, > > + numInstances, baseinstance); > > + > > + if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type, > > indices, > > + numInstances, 0)) > > + return; > > + > > + vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0, > > + count, type, indices, 0, numInstances, > > + baseinstance); > > +} > > + > > + > > +/** > > + * Called by glDrawElementsInstancedBaseVertexBaseInstance() in immediate > > mode. > > + */ > > +static void GLAPIENTRY > > +vbo_exec_DrawElementsInstancedBaseVertexBaseInstance(GLenum mode, GLsizei > > count, GLenum type, > > + const GLvoid > > *indices, GLsizei numInstances, > > + GLint basevertex, > > GLuint baseinstance) > > +{ > > + GET_CURRENT_CONTEXT(ctx); > > + > > + if (MESA_VERBOSE& VERBOSE_DRAW) > > + _mesa_debug(ctx, "glDrawElementsInstancedBaseVertexBaseInstance(%s, > > %d, %s, %p, %d, %d, %d)\n", > > + _mesa_lookup_enum_by_nr(mode), count, > > + _mesa_lookup_enum_by_nr(type), indices, > > + numInstances, basevertex, baseinstance); > > + > > + if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type, > > indices, > > + numInstances, basevertex)) > > + return; > > + > > + vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0, > > + count, type, indices, basevertex, > > numInstances, > > + baseinstance); > > } > > > > > > @@ -1128,6 +1218,7 @@ vbo_validated_multidrawelements(struct gl_context > > *ctx, GLenum mode, > > prim[i].count = count[i]; > > prim[i].indexed = 1; > > prim[i].num_instances = 1; > > + prim[i].baseinstance = 0; > > if (basevertex != NULL) > > prim[i].basevertex = basevertex[i]; > > else > > @@ -1154,6 +1245,7 @@ vbo_validated_multidrawelements(struct gl_context > > *ctx, GLenum mode, > > prim[0].count = count[i]; > > prim[0].indexed = 1; > > prim[0].num_instances = 1; > > + prim[0].baseinstance = 0; > > if (basevertex != NULL) > > prim[0].basevertex = basevertex[i]; > > else > > @@ -1236,6 +1328,7 @@ vbo_draw_transform_feedback(struct gl_context *ctx, > > GLenum mode, > > prim[0].end = 1; > > prim[0].mode = mode; > > prim[0].num_instances = numInstances; > > + prim[0].baseinstance = 0; > > > > /* Maybe we should do some primitive splitting for primitive restart > > * (like in DrawArrays), but we have no way to know how many vertices > > @@ -1295,8 +1388,11 @@ vbo_exec_array_init( struct vbo_exec_context *exec ) > > exec->vtxfmt.DrawRangeElementsBaseVertex = > > vbo_exec_DrawRangeElementsBaseVertex; > > exec->vtxfmt.MultiDrawElementsBaseVertex = > > vbo_exec_MultiDrawElementsBaseVertex; > > exec->vtxfmt.DrawArraysInstanced = vbo_exec_DrawArraysInstanced; > > + exec->vtxfmt.DrawArraysInstancedBaseInstance = > > vbo_exec_DrawArraysInstancedBaseInstance; > > exec->vtxfmt.DrawElementsInstanced = vbo_exec_DrawElementsInstanced; > > + exec->vtxfmt.DrawElementsInstancedBaseInstance = > > vbo_exec_DrawElementsInstancedBaseInstance; > > exec->vtxfmt.DrawElementsInstancedBaseVertex = > > vbo_exec_DrawElementsInstancedBaseVertex; > > + exec->vtxfmt.DrawElementsInstancedBaseVertexBaseInstance = > > vbo_exec_DrawElementsInstancedBaseVertexBaseInstance; > > #if FEATURE_EXT_transform_feedback > > exec->vtxfmt.DrawTransformFeedback = vbo_exec_DrawTransformFeedback; > > #endif > > diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c > > index f202375..aeefd68 100644 > > --- a/src/mesa/vbo/vbo_save_api.c > > +++ b/src/mesa/vbo/vbo_save_api.c > > @@ -471,6 +471,7 @@ _save_wrap_buffers(struct gl_context *ctx) > > save->prim[0].start = 0; > > save->prim[0].count = 0; > > save->prim[0].num_instances = 1; > > + save->prim[0].baseinstance = 0; > > save->prim_count = 1; > > } > > > > @@ -907,6 +908,7 @@ vbo_save_NotifyBegin(struct gl_context *ctx, GLenum > > mode) > > save->prim[i].start = save->vert_count; > > save->prim[i].count = 0; > > save->prim[i].num_instances = 1; > > + save->prim[i].baseinstance = 0; > > > > if (save->out_of_memory) { > > _mesa_install_save_vtxfmt(ctx,&save->vtxfmt_noop); > > diff --git a/src/mesa/vbo/vbo_split_inplace.c > > b/src/mesa/vbo/vbo_split_inplace.c > > index 0046404..02f8c80 100644 > > --- a/src/mesa/vbo/vbo_split_inplace.c > > +++ b/src/mesa/vbo/vbo_split_inplace.c > > @@ -180,13 +180,14 @@ static void split_prims( struct split_context *split) > > > > nr = MIN2( available, remaining ); > > nr -= (nr - first) % incr; > > - > > + > > outprim->mode = prim->mode; > > outprim->begin = (j == 0&& prim->begin); > > outprim->end = (nr == remaining&& prim->end); > > outprim->start = prim->start + j; > > outprim->count = nr; > > outprim->num_instances = prim->num_instances; > > + outprim->baseinstance = prim->baseinstance; > > > > update_index_bounds(split, outprim); > > > > @@ -225,12 +226,13 @@ static void split_prims( struct split_context *split) > > ib.type = GL_UNSIGNED_INT; > > ib.obj = split->ctx->Shared->NullBufferObj; > > ib.ptr = elts; > > - > > + > > tmpprim = *prim; > > tmpprim.indexed = 1; > > tmpprim.start = 0; > > tmpprim.count = count; > > tmpprim.num_instances = 1; > > + tmpprim.baseinstance = 0; > > > > flush_vertex(split); > > > > Looks good otherwise. > > Reviewed-by: Brian Paul <bri...@vmware.com> > > Do you have a piglit test for this feature? I do, I just need to clean it up a bit and add some comments before sending it to the piglit list. Fredrik _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev