On 11/13/2013 10:38 AM, Brian Paul wrote: > To trim down the varray.c file so it's just vertex array functions.
Is that the only motivation? This will prevent us from optimizing the implementation of, say, _mesa_MultiDrawArrays. It also seems weird that _mesa_MultiDrawModeDrawArraysIBM and _mesa_MultiDrawElementsEXT are in different .c files but the same .h file. > --- > src/mapi/glapi/gen/gl_genexec.py | 1 + > src/mesa/Makefile.sources | 1 + > src/mesa/SConscript | 1 + > src/mesa/drivers/common/meta.c | 1 + > src/mesa/main/draw.c | 136 > ++++++++++++++++++++++++++++++++++ > src/mesa/main/draw.h | 87 ++++++++++++++++++++++ > src/mesa/main/varray.c | 105 -------------------------- > src/mesa/main/varray.h | 55 -------------- > src/mesa/vbo/vbo_exec_array.c | 1 + > src/mesa/vbo/vbo_primitive_restart.c | 2 +- > 10 files changed, 229 insertions(+), 161 deletions(-) > create mode 100644 src/mesa/main/draw.c > create mode 100644 src/mesa/main/draw.h > > diff --git a/src/mapi/glapi/gen/gl_genexec.py > b/src/mapi/glapi/gen/gl_genexec.py > index 3ce190f..516acc3 100644 > --- a/src/mapi/glapi/gen/gl_genexec.py > +++ b/src/mapi/glapi/gen/gl_genexec.py > @@ -62,6 +62,7 @@ header = """/** > #include "main/convolve.h" > #include "main/depth.h" > #include "main/dlist.h" > +#include "main/draw.h" > #include "main/drawpix.h" > #include "main/drawtex.h" > #include "main/rastpos.h" > diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources > index a84f8a7..d400fb9 100644 > --- a/src/mesa/Makefile.sources > +++ b/src/mesa/Makefile.sources > @@ -30,6 +30,7 @@ MAIN_FILES = \ > $(SRCDIR)main/debug.c \ > $(SRCDIR)main/depth.c \ > $(SRCDIR)main/dlist.c \ > + $(SRCDIR)main/draw.c \ > $(SRCDIR)main/drawpix.c \ > $(SRCDIR)main/drawtex.c \ > $(SRCDIR)main/enable.c \ > diff --git a/src/mesa/SConscript b/src/mesa/SConscript > index 4213498..64e19aa 100644 > --- a/src/mesa/SConscript > +++ b/src/mesa/SConscript > @@ -61,6 +61,7 @@ main_sources = [ > 'main/debug.c', > 'main/depth.c', > 'main/dlist.c', > + 'main/draw.c', > 'main/drawpix.c', > 'main/drawtex.c', > 'main/enable.c', > diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c > index 99b02ba..d04d9eb 100644 > --- a/src/mesa/drivers/common/meta.c > +++ b/src/mesa/drivers/common/meta.c > @@ -42,6 +42,7 @@ > #include "main/colortab.h" > #include "main/condrender.h" > #include "main/depth.h" > +#include "main/draw.h" > #include "main/enable.h" > #include "main/fbobject.h" > #include "main/feedback.h" > diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c > new file mode 100644 > index 0000000..6b8c58b > --- /dev/null > +++ b/src/mesa/main/draw.c > @@ -0,0 +1,136 @@ > +/* > + * Mesa 3-D graphics library > + * > + * Copyright (C) 2013 VMware, Inc. All Rights Reserved. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included > + * in all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS > + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > + * OTHER DEALINGS IN THE SOFTWARE. > + */ > + > + > +#include "context.h" > +#include "dispatch.h" > +#include "draw.h" > + > + > +/* GL_EXT_multi_draw_arrays */ > +void GLAPIENTRY > +_mesa_MultiDrawArrays(GLenum mode, const GLint *first, > + const GLsizei *count, GLsizei primcount) > +{ > + GET_CURRENT_CONTEXT(ctx); > + GLint i; > + > + FLUSH_VERTICES(ctx, 0); > + > + for (i = 0; i < primcount; i++) { > + if (count[i] > 0) { > + CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i])); > + } > + } > +} > + > + > +/* GL_IBM_multimode_draw_arrays */ > +void GLAPIENTRY > +_mesa_MultiModeDrawArraysIBM(const GLenum *mode, const GLint *first, > + const GLsizei *count, > + GLsizei primcount, GLint modestride) > +{ > + GET_CURRENT_CONTEXT(ctx); > + GLint i; > + > + FLUSH_VERTICES(ctx, 0); > + > + for (i = 0 ; i < primcount ; i++) { > + if (count[i] > 0) { > + GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); > + CALL_DrawArrays(ctx->Exec, (m, first[i], count[i])); > + } > + } > +} > + > + > +/* GL_IBM_multimode_draw_arrays */ > +void GLAPIENTRY > +_mesa_MultiModeDrawElementsIBM(const GLenum *mode, const GLsizei *count, > + GLenum type, const GLvoid * const *indices, > + GLsizei primcount, GLint modestride) > +{ > + GET_CURRENT_CONTEXT(ctx); > + GLint i; > + > + FLUSH_VERTICES(ctx, 0); > + > + /* XXX not sure about ARB_vertex_buffer_object handling here */ > + > + for (i = 0 ; i < primcount ; i++) { > + if (count[i] > 0) { > + GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); > + CALL_DrawElements(ctx->Exec, (m, count[i], type, indices[i])); > + } > + } > +} > + > + > +/** > + * GL_NV_primitive_restart and GL 3.1 > + */ > +void GLAPIENTRY > +_mesa_PrimitiveRestartIndex(GLuint index) > +{ > + GET_CURRENT_CONTEXT(ctx); > + > + if (!ctx->Extensions.NV_primitive_restart && ctx->Version < 31) { > + _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()"); > + return; > + } > + > + if (ctx->Array.RestartIndex != index) { > + FLUSH_VERTICES(ctx, _NEW_TRANSFORM); > + ctx->Array.RestartIndex = index; > + } > +} > + > + > +/** > + * Returns the current/active primitive restart index value. > + */ > +unsigned > +_mesa_primitive_restart_index(const struct gl_context *ctx, GLenum ib_type) > +{ > + /* From the OpenGL 4.3 core specification, page 302: > + * "If both PRIMITIVE_RESTART and PRIMITIVE_RESTART_FIXED_INDEX are > + * enabled, the index value determined by PRIMITIVE_RESTART_FIXED_INDEX > + * is used." > + */ > + if (ctx->Array.PrimitiveRestartFixedIndex) { > + switch (ib_type) { > + case GL_UNSIGNED_BYTE: > + return 0xff; > + case GL_UNSIGNED_SHORT: > + return 0xffff; > + case GL_UNSIGNED_INT: > + return 0xffffffff; > + default: > + assert(!"_mesa_primitive_restart_index: Invalid index buffer > type."); > + } > + } > + > + return ctx->Array.RestartIndex; > +} > diff --git a/src/mesa/main/draw.h b/src/mesa/main/draw.h > new file mode 100644 > index 0000000..fc5679c > --- /dev/null > +++ b/src/mesa/main/draw.h > @@ -0,0 +1,87 @@ > +/* > + * Mesa 3-D graphics library > + * > + * Copyright (C) 2013 VMware, Inc. All Rights Reserved. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice shall be included > + * in all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS > + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR > + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, > + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > + * OTHER DEALINGS IN THE SOFTWARE. > + */ > + > + > +#ifndef DRAW_H > +#define DRAW_H > + > + > +#include "glheader.h" > + > + > +extern void GLAPIENTRY > +_mesa_DrawArrays(GLenum mode, GLint first, GLsizei count); > + > +extern void GLAPIENTRY > +_mesa_DrawElements(GLenum mode, GLsizei count, GLenum type, > + const GLvoid *indices); > + > +extern void GLAPIENTRY > +_mesa_DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, > + GLenum type, const GLvoid *indices); > + > +extern void GLAPIENTRY > +_mesa_DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, > + const GLvoid *indices, GLint basevertex); > + > +extern void GLAPIENTRY > +_mesa_DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, > + GLsizei count, GLenum type, > + const GLvoid *indices, GLint basevertex); > + > +extern void GLAPIENTRY > +_mesa_DrawTransformFeedback(GLenum mode, GLuint name); > + > + > +extern void GLAPIENTRY > +_mesa_MultiDrawArrays(GLenum mode, const GLint *first, > + const GLsizei *count, GLsizei primcount); > + > +extern void GLAPIENTRY > +_mesa_MultiDrawElementsEXT(GLenum mode, const GLsizei *count, GLenum type, > + const GLvoid **indices, GLsizei primcount); > + > +extern void GLAPIENTRY > +_mesa_MultiDrawElementsBaseVertex(GLenum mode, const GLsizei *count, > + GLenum type, const GLvoid **indices, > + GLsizei primcount, const GLint > *basevertex); > + > +extern void GLAPIENTRY > +_mesa_MultiModeDrawArraysIBM(const GLenum *mode, const GLint *first, > + const GLsizei *count, > + GLsizei primcount, GLint modestride); > + > + > +extern void GLAPIENTRY > +_mesa_MultiModeDrawElementsIBM(const GLenum *mode, const GLsizei *count, > + GLenum type, const GLvoid * const *indices, > + GLsizei primcount, GLint modestride); > + > +extern void GLAPIENTRY > +_mesa_PrimitiveRestartIndex(GLuint index); > + > +extern unsigned > +_mesa_primitive_restart_index(const struct gl_context *ctx, GLenum ib_type); > + > +#endif /* DRAW_H */ > diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c > index 0f38270..3786c74 100644 > --- a/src/mesa/main/varray.c > +++ b/src/mesa/main/varray.c > @@ -1211,86 +1211,6 @@ _mesa_UnlockArraysEXT( void ) > } > > > -/* GL_EXT_multi_draw_arrays */ > -void GLAPIENTRY > -_mesa_MultiDrawArrays( GLenum mode, const GLint *first, > - const GLsizei *count, GLsizei primcount ) > -{ > - GET_CURRENT_CONTEXT(ctx); > - GLint i; > - > - FLUSH_VERTICES(ctx, 0); > - > - for (i = 0; i < primcount; i++) { > - if (count[i] > 0) { > - CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i])); > - } > - } > -} > - > - > -/* GL_IBM_multimode_draw_arrays */ > -void GLAPIENTRY > -_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, > - const GLsizei * count, > - GLsizei primcount, GLint modestride ) > -{ > - GET_CURRENT_CONTEXT(ctx); > - GLint i; > - > - FLUSH_VERTICES(ctx, 0); > - > - for ( i = 0 ; i < primcount ; i++ ) { > - if ( count[i] > 0 ) { > - GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); > - CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] )); > - } > - } > -} > - > - > -/* GL_IBM_multimode_draw_arrays */ > -void GLAPIENTRY > -_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, > - GLenum type, const GLvoid * const * indices, > - GLsizei primcount, GLint modestride ) > -{ > - GET_CURRENT_CONTEXT(ctx); > - GLint i; > - > - FLUSH_VERTICES(ctx, 0); > - > - /* XXX not sure about ARB_vertex_buffer_object handling here */ > - > - for ( i = 0 ; i < primcount ; i++ ) { > - if ( count[i] > 0 ) { > - GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); > - CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] )); > - } > - } > -} > - > - > -/** > - * GL_NV_primitive_restart and GL 3.1 > - */ > -void GLAPIENTRY > -_mesa_PrimitiveRestartIndex(GLuint index) > -{ > - GET_CURRENT_CONTEXT(ctx); > - > - if (!ctx->Extensions.NV_primitive_restart && ctx->Version < 31) { > - _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()"); > - return; > - } > - > - if (ctx->Array.RestartIndex != index) { > - FLUSH_VERTICES(ctx, _NEW_TRANSFORM); > - ctx->Array.RestartIndex = index; > - } > -} > - > - > /** > * See GL_ARB_instanced_arrays. > * Note that the instance divisor only applies to generic arrays, not > @@ -1332,31 +1252,6 @@ _mesa_VertexAttribDivisor(GLuint index, GLuint divisor) > } > > > -unsigned > -_mesa_primitive_restart_index(const struct gl_context *ctx, GLenum ib_type) > -{ > - /* From the OpenGL 4.3 core specification, page 302: > - * "If both PRIMITIVE_RESTART and PRIMITIVE_RESTART_FIXED_INDEX are > - * enabled, the index value determined by PRIMITIVE_RESTART_FIXED_INDEX > - * is used." > - */ > - if (ctx->Array.PrimitiveRestartFixedIndex) { > - switch (ib_type) { > - case GL_UNSIGNED_BYTE: > - return 0xff; > - case GL_UNSIGNED_SHORT: > - return 0xffff; > - case GL_UNSIGNED_INT: > - return 0xffffffff; > - default: > - assert(!"_mesa_primitive_restart_index: Invalid index buffer > type."); > - } > - } > - > - return ctx->Array.RestartIndex; > -} > - > - > /** > * GL_ARB_vertex_attrib_binding > */ > diff --git a/src/mesa/main/varray.h b/src/mesa/main/varray.h > index bc820ed..83ebcc1 100644 > --- a/src/mesa/main/varray.h > +++ b/src/mesa/main/varray.h > @@ -221,31 +221,6 @@ _mesa_InterleavedArrays(GLenum format, GLsizei stride, > const GLvoid *pointer); > > > extern void GLAPIENTRY > -_mesa_MultiDrawArrays( GLenum mode, const GLint *first, > - const GLsizei *count, GLsizei primcount ); > - > -extern void GLAPIENTRY > -_mesa_MultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type, > - const GLvoid **indices, GLsizei primcount ); > - > -extern void GLAPIENTRY > -_mesa_MultiDrawElementsBaseVertex( GLenum mode, > - const GLsizei *count, GLenum type, > - const GLvoid **indices, GLsizei primcount, > - const GLint *basevertex); > - > -extern void GLAPIENTRY > -_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, > - const GLsizei * count, > - GLsizei primcount, GLint modestride ); > - > - > -extern void GLAPIENTRY > -_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, > - GLenum type, const GLvoid * const * indices, > - GLsizei primcount, GLint modestride ); > - > -extern void GLAPIENTRY > _mesa_LockArraysEXT(GLint first, GLsizei count); > > extern void GLAPIENTRY > @@ -253,38 +228,8 @@ _mesa_UnlockArraysEXT( void ); > > > extern void GLAPIENTRY > -_mesa_DrawArrays(GLenum mode, GLint first, GLsizei count); > - > -extern void GLAPIENTRY > -_mesa_DrawElements(GLenum mode, GLsizei count, GLenum type, > - const GLvoid *indices); > - > -extern void GLAPIENTRY > -_mesa_DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, > - GLenum type, const GLvoid *indices); > - > -extern void GLAPIENTRY > -_mesa_DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, > - const GLvoid *indices, GLint basevertex); > - > -extern void GLAPIENTRY > -_mesa_DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end, > - GLsizei count, GLenum type, > - const GLvoid *indices, > - GLint basevertex); > - > -extern void GLAPIENTRY > -_mesa_DrawTransformFeedback(GLenum mode, GLuint name); > - > -extern void GLAPIENTRY > -_mesa_PrimitiveRestartIndex(GLuint index); > - > - > -extern void GLAPIENTRY > _mesa_VertexAttribDivisor(GLuint index, GLuint divisor); > > -extern unsigned > -_mesa_primitive_restart_index(const struct gl_context *ctx, GLenum ib_type); > > extern void GLAPIENTRY > _mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset, > diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c > index d723823..286a03c 100644 > --- a/src/mesa/vbo/vbo_exec_array.c > +++ b/src/mesa/vbo/vbo_exec_array.c > @@ -28,6 +28,7 @@ > > #include "main/glheader.h" > #include "main/context.h" > +#include "main/draw.h" > #include "main/state.h" > #include "main/api_validate.h" > #include "main/dispatch.h" > diff --git a/src/mesa/vbo/vbo_primitive_restart.c > b/src/mesa/vbo/vbo_primitive_restart.c > index 418f882..d84ba19 100644 > --- a/src/mesa/vbo/vbo_primitive_restart.c > +++ b/src/mesa/vbo/vbo_primitive_restart.c > @@ -30,8 +30,8 @@ > > #include "main/imports.h" > #include "main/bufferobj.h" > +#include "main/draw.h" > #include "main/macros.h" > -#include "main/varray.h" > > #include "vbo.h" > #include "vbo_context.h" > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev