/* GL_EXT_multi_draw_arrays */ void GLAPIENTRY _mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount ) { GET_CURRENT_CONTEXT(ctx); GLint i; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 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; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 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] )); } } }
void __glXDispSwap_DrawArrays(GLbyte * pc) { __GLXdispatchDrawArraysHeader *hdr = (__GLXdispatchDrawArraysHeader *) pc; __GLXdispatchDrawArraysComponentHeader *compHeader; GLint numVertexes = hdr->numVertexes; GLint numComponents = hdr->numComponents; GLenum primType = hdr->primType; GLint stride = 0; int i; __GLX_DECLARE_SWAP_VARIABLES; __GLX_SWAP_INT(&numVertexes); __GLX_SWAP_INT(&numComponents); __GLX_SWAP_INT(&primType); pc += sizeof(__GLXdispatchDrawArraysHeader); compHeader = (__GLXdispatchDrawArraysComponentHeader *) pc; /* compute stride (same for all component arrays) */ for (i = 0; i < numComponents; i++) { GLenum datatype = compHeader[i].datatype; GLint numVals = compHeader[i].numVals; GLenum component = compHeader[i].component; __GLX_SWAP_INT(&datatype); __GLX_SWAP_INT(&numVals); __GLX_SWAP_INT(&component); stride += __GLX_PAD(numVals * __glXTypeSize(datatype)); } pc += numComponents * sizeof(__GLXdispatchDrawArraysComponentHeader); /* set up component arrays */ for (i = 0; i < numComponents; i++) { GLenum datatype = compHeader[i].datatype; GLint numVals = compHeader[i].numVals; GLenum component = compHeader[i].component; __GLX_SWAP_INT(&datatype); __GLX_SWAP_INT(&numVals); __GLX_SWAP_INT(&component); swapArray(numVals, datatype, stride, numVertexes, pc); switch (component) { case GL_VERTEX_ARRAY: CALL_EnableClientState(GET_DISPATCH(), (GL_VERTEX_ARRAY)); CALL_VertexPointer(GET_DISPATCH(), (numVals, datatype, stride, pc)); break; case GL_NORMAL_ARRAY: CALL_EnableClientState(GET_DISPATCH(), (GL_NORMAL_ARRAY)); CALL_NormalPointer(GET_DISPATCH(), (datatype, stride, pc)); break; case GL_COLOR_ARRAY: CALL_EnableClientState(GET_DISPATCH(), (GL_COLOR_ARRAY)); CALL_ColorPointer(GET_DISPATCH(), (numVals, datatype, stride, pc)); break; case GL_INDEX_ARRAY: CALL_EnableClientState(GET_DISPATCH(), (GL_INDEX_ARRAY)); CALL_IndexPointer(GET_DISPATCH(), (datatype, stride, pc)); break; case GL_TEXTURE_COORD_ARRAY: CALL_EnableClientState(GET_DISPATCH(), (GL_TEXTURE_COORD_ARRAY)); CALL_TexCoordPointer(GET_DISPATCH(), (numVals, datatype, stride, pc)); break; case GL_EDGE_FLAG_ARRAY: CALL_EnableClientState(GET_DISPATCH(), (GL_EDGE_FLAG_ARRAY)); CALL_EdgeFlagPointer(GET_DISPATCH(), (stride, (const GLboolean *) pc)); break; case GL_SECONDARY_COLOR_ARRAY: CALL_EnableClientState(GET_DISPATCH(), (GL_SECONDARY_COLOR_ARRAY)); CALL_SecondaryColorPointer(GET_DISPATCH(), (numVals, datatype, stride, pc)); break; case GL_FOG_COORD_ARRAY: CALL_EnableClientState(GET_DISPATCH(), (GL_FOG_COORD_ARRAY)); CALL_FogCoordPointer(GET_DISPATCH(), (datatype, stride, pc)); break; default: break; } pc += __GLX_PAD(numVals * __glXTypeSize(datatype)); } CALL_DrawArrays(GET_DISPATCH(), (primType, 0, numVertexes)); /* turn off anything we might have turned on */ CALL_DisableClientState(GET_DISPATCH(), (GL_VERTEX_ARRAY)); CALL_DisableClientState(GET_DISPATCH(), (GL_NORMAL_ARRAY)); CALL_DisableClientState(GET_DISPATCH(), (GL_COLOR_ARRAY)); CALL_DisableClientState(GET_DISPATCH(), (GL_INDEX_ARRAY)); CALL_DisableClientState(GET_DISPATCH(), (GL_TEXTURE_COORD_ARRAY)); CALL_DisableClientState(GET_DISPATCH(), (GL_EDGE_FLAG_ARRAY)); CALL_DisableClientState(GET_DISPATCH(), (GL_SECONDARY_COLOR_ARRAY)); CALL_DisableClientState(GET_DISPATCH(), (GL_FOG_COORD_ARRAY)); }