示例#1
0
/* 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]));
      }
   }
}
示例#2
0
/* 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] ));
      }
   }
}
示例#3
0
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));
}