diff options
author | Pierre-Eric Pelloux-Prayer <[email protected]> | 2011-05-31 13:33:54 +0200 |
---|---|---|
committer | Brian Paul <[email protected]> | 2011-06-02 17:55:48 -0600 |
commit | 09201cc7a0c4c50871bb8aa5d00ac70aa4e9e670 (patch) | |
tree | 909a5789f5fb355f1b4dfd569d0f93b66ff7ca89 | |
parent | 0dae94610e0b70b353fd0b018833bb7c8d013abb (diff) |
mesa: add implementation of glDrawElementsInstancedBaseVertex
Signed-off-by: Brian Paul <[email protected]>
-rw-r--r-- | src/mesa/main/api_validate.c | 5 | ||||
-rw-r--r-- | src/mesa/main/api_validate.h | 3 | ||||
-rw-r--r-- | src/mesa/main/dd.h | 3 | ||||
-rw-r--r-- | src/mesa/main/vtxfmt.c | 1 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_exec_array.c | 27 |
5 files changed, 35 insertions, 4 deletions
diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c index 993519f61b2..2981d42297a 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/api_validate.c @@ -396,7 +396,8 @@ _mesa_validate_DrawArraysInstanced(struct gl_context *ctx, GLenum mode, GLint fi GLboolean _mesa_validate_DrawElementsInstanced(struct gl_context *ctx, GLenum mode, GLsizei count, GLenum type, - const GLvoid *indices, GLsizei numInstances) + const GLvoid *indices, GLsizei numInstances, + GLint basevertex) { ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); @@ -447,7 +448,7 @@ _mesa_validate_DrawElementsInstanced(struct gl_context *ctx, return GL_FALSE; } - if (!check_index_bounds(ctx, count, type, indices, 0)) + if (!check_index_bounds(ctx, count, type, indices, basevertex)) return GL_FALSE; return GL_TRUE; diff --git a/src/mesa/main/api_validate.h b/src/mesa/main/api_validate.h index 16b9c2b2647..09e9522d20e 100644 --- a/src/mesa/main/api_validate.h +++ b/src/mesa/main/api_validate.h @@ -62,7 +62,8 @@ _mesa_validate_DrawArraysInstanced(struct gl_context *ctx, GLenum mode, GLint fi extern GLboolean _mesa_validate_DrawElementsInstanced(struct gl_context *ctx, GLenum mode, GLsizei count, GLenum type, - const GLvoid *indices, GLsizei primcount); + const GLvoid *indices, GLsizei primcount, + GLint basevertex); #endif diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index d749b245e13..9fe6d527f92 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -1177,6 +1177,9 @@ typedef struct { void (GLAPIENTRYP DrawElementsInstanced)(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices, GLsizei primcount); + void (GLAPIENTRYP DrawElementsInstancedBaseVertex)(GLenum mode, GLsizei count, + GLenum type, const GLvoid *indices, + GLsizei primcount, GLint basevertex); /*@}*/ /** diff --git a/src/mesa/main/vtxfmt.c b/src/mesa/main/vtxfmt.c index 692ce080c9f..d0941477d61 100644 --- a/src/mesa/main/vtxfmt.c +++ b/src/mesa/main/vtxfmt.c @@ -106,6 +106,7 @@ install_vtxfmt( struct _glapi_table *tab, const GLvertexformat *vfmt ) SET_MultiDrawElementsBaseVertex(tab, vfmt->MultiDrawElementsBaseVertex); SET_DrawArraysInstancedARB(tab, vfmt->DrawArraysInstanced); SET_DrawElementsInstancedARB(tab, vfmt->DrawElementsInstanced); + SET_DrawElementsInstancedBaseVertex(tab, vfmt->DrawElementsInstancedBaseVertex); /* GL_NV_vertex_program */ SET_VertexAttrib1fNV(tab, vfmt->VertexAttrib1fNV); diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c index a49cd5017a3..5e9b2798c43 100644 --- a/src/mesa/vbo/vbo_exec_array.c +++ b/src/mesa/vbo/vbo_exec_array.c @@ -1045,13 +1045,37 @@ vbo_exec_DrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, _mesa_lookup_enum_by_nr(type), indices, numInstances); if (!_mesa_validate_DrawElementsInstanced(ctx, mode, count, type, indices, - numInstances)) + numInstances, 0)) return; vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0, count, type, indices, 0, numInstances); } +/** + * Called by glDrawElementsInstancedBaseVertex() in immediate mode. + */ +static void GLAPIENTRY +vbo_exec_DrawElementsInstancedBaseVertex(GLenum mode, GLsizei count, GLenum type, + const GLvoid *indices, GLsizei numInstances, + GLint basevertex) +{ + GET_CURRENT_CONTEXT(ctx); + + if (MESA_VERBOSE & VERBOSE_DRAW) + _mesa_debug(ctx, "glDrawElementsInstancedBaseVertex(%s, %d, %s, %p, %d; %d)\n", + _mesa_lookup_enum_by_nr(mode), count, + _mesa_lookup_enum_by_nr(type), indices, + numInstances, basevertex); + + 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); +} + /** * Inner support for both _mesa_MultiDrawElements() and @@ -1260,6 +1284,7 @@ vbo_exec_array_init( struct vbo_exec_context *exec ) exec->vtxfmt.MultiDrawElementsBaseVertex = vbo_exec_MultiDrawElementsBaseVertex; exec->vtxfmt.DrawArraysInstanced = vbo_exec_DrawArraysInstanced; exec->vtxfmt.DrawElementsInstanced = vbo_exec_DrawElementsInstanced; + exec->vtxfmt.DrawElementsInstancedBaseVertex = vbo_exec_DrawElementsInstancedBaseVertex; } |