Home | History | Annotate | Download | only in main
      1 /*
      2  * Mesa 3-D graphics library
      3  * Version:  6.5.1
      4  *
      5  * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  * and/or sell copies of the Software, and to permit persons to whom the
     12  * Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included
     15  * in all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     21  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     23  */
     24 
     25 /**
     26  * This file implements the glArrayElement() function.
     27  * It involves looking at the format/type of all the enabled vertex arrays
     28  * and emitting a list of pointers to functions which set the per-vertex
     29  * state for the element/index.
     30  */
     31 
     32 
     33 /* Author:
     34  *    Keith Whitwell <keith (at) tungstengraphics.com>
     35  */
     36 
     37 #include "glheader.h"
     38 #include "api_arrayelt.h"
     39 #include "bufferobj.h"
     40 #include "context.h"
     41 #include "imports.h"
     42 #include "macros.h"
     43 #include "mfeatures.h"
     44 #include "mtypes.h"
     45 #include "main/dispatch.h"
     46 
     47 typedef void (GLAPIENTRY *array_func)( const void * );
     48 
     49 typedef struct {
     50    const struct gl_client_array *array;
     51    int offset;
     52 } AEarray;
     53 
     54 typedef void (GLAPIENTRY *attrib_func)( GLuint indx, const void *data );
     55 
     56 typedef struct {
     57    const struct gl_client_array *array;
     58    attrib_func func;
     59    GLuint index;
     60 } AEattrib;
     61 
     62 typedef struct {
     63    AEarray arrays[32];
     64    AEattrib attribs[VERT_ATTRIB_MAX + 1];
     65    GLuint NewState;
     66 
     67    struct gl_buffer_object *vbo[VERT_ATTRIB_MAX];
     68    GLuint nr_vbos;
     69    GLboolean mapped_vbos;
     70 
     71 } AEcontext;
     72 
     73 #define AE_CONTEXT(ctx) ((AEcontext *)(ctx)->aelt_context)
     74 
     75 
     76 /*
     77  * Convert GL_BYTE, GL_UNSIGNED_BYTE, .. GL_DOUBLE into an integer
     78  * in the range [0, 7].  Luckily these type tokens are sequentially
     79  * numbered in gl.h, except for GL_DOUBLE.
     80  */
     81 #define TYPE_IDX(t) ( (t) == GL_DOUBLE ? 7 : (t) & 7 )
     82 
     83 #define NUM_TYPES 8
     84 
     85 
     86 #if FEATURE_arrayelt
     87 
     88 
     89 static const int ColorFuncs[2][NUM_TYPES] = {
     90    {
     91       _gloffset_Color3bv,
     92       _gloffset_Color3ubv,
     93       _gloffset_Color3sv,
     94       _gloffset_Color3usv,
     95       _gloffset_Color3iv,
     96       _gloffset_Color3uiv,
     97       _gloffset_Color3fv,
     98       _gloffset_Color3dv,
     99    },
    100    {
    101       _gloffset_Color4bv,
    102       _gloffset_Color4ubv,
    103       _gloffset_Color4sv,
    104       _gloffset_Color4usv,
    105       _gloffset_Color4iv,
    106       _gloffset_Color4uiv,
    107       _gloffset_Color4fv,
    108       _gloffset_Color4dv,
    109    },
    110 };
    111 
    112 static const int VertexFuncs[3][NUM_TYPES] = {
    113    {
    114       -1,
    115       -1,
    116       _gloffset_Vertex2sv,
    117       -1,
    118       _gloffset_Vertex2iv,
    119       -1,
    120       _gloffset_Vertex2fv,
    121       _gloffset_Vertex2dv,
    122    },
    123    {
    124       -1,
    125       -1,
    126       _gloffset_Vertex3sv,
    127       -1,
    128       _gloffset_Vertex3iv,
    129       -1,
    130       _gloffset_Vertex3fv,
    131       _gloffset_Vertex3dv,
    132    },
    133    {
    134       -1,
    135       -1,
    136       _gloffset_Vertex4sv,
    137       -1,
    138       _gloffset_Vertex4iv,
    139       -1,
    140       _gloffset_Vertex4fv,
    141       _gloffset_Vertex4dv,
    142    },
    143 };
    144 
    145 static const int IndexFuncs[NUM_TYPES] = {
    146    -1,
    147    _gloffset_Indexubv,
    148    _gloffset_Indexsv,
    149    -1,
    150    _gloffset_Indexiv,
    151    -1,
    152    _gloffset_Indexfv,
    153    _gloffset_Indexdv,
    154 };
    155 
    156 static const int NormalFuncs[NUM_TYPES] = {
    157    _gloffset_Normal3bv,
    158    -1,
    159    _gloffset_Normal3sv,
    160    -1,
    161    _gloffset_Normal3iv,
    162    -1,
    163    _gloffset_Normal3fv,
    164    _gloffset_Normal3dv,
    165 };
    166 
    167 /* Note: _gloffset_* for these may not be a compile-time constant. */
    168 static int SecondaryColorFuncs[NUM_TYPES];
    169 static int FogCoordFuncs[NUM_TYPES];
    170 
    171 
    172 /**
    173  ** GL_NV_vertex_program
    174  **/
    175 
    176 /* GL_BYTE attributes */
    177 
    178 static void GLAPIENTRY
    179 VertexAttrib1NbvNV(GLuint index, const GLbyte *v)
    180 {
    181    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0])));
    182 }
    183 
    184 static void GLAPIENTRY
    185 VertexAttrib1bvNV(GLuint index, const GLbyte *v)
    186 {
    187    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
    188 }
    189 
    190 static void GLAPIENTRY
    191 VertexAttrib2NbvNV(GLuint index, const GLbyte *v)
    192 {
    193    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1])));
    194 }
    195 
    196 static void GLAPIENTRY
    197 VertexAttrib2bvNV(GLuint index, const GLbyte *v)
    198 {
    199    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
    200 }
    201 
    202 static void GLAPIENTRY
    203 VertexAttrib3NbvNV(GLuint index, const GLbyte *v)
    204 {
    205    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]),
    206 					       BYTE_TO_FLOAT(v[1]),
    207 					       BYTE_TO_FLOAT(v[2])));
    208 }
    209 
    210 static void GLAPIENTRY
    211 VertexAttrib3bvNV(GLuint index, const GLbyte *v)
    212 {
    213    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2]));
    214 }
    215 
    216 static void GLAPIENTRY
    217 VertexAttrib4NbvNV(GLuint index, const GLbyte *v)
    218 {
    219    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]),
    220 					       BYTE_TO_FLOAT(v[1]),
    221 					       BYTE_TO_FLOAT(v[2]),
    222 					       BYTE_TO_FLOAT(v[3])));
    223 }
    224 
    225 static void GLAPIENTRY
    226 VertexAttrib4bvNV(GLuint index, const GLbyte *v)
    227 {
    228    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2], (GLfloat)v[3]));
    229 }
    230 
    231 /* GL_UNSIGNED_BYTE attributes */
    232 
    233 static void GLAPIENTRY
    234 VertexAttrib1NubvNV(GLuint index, const GLubyte *v)
    235 {
    236    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0])));
    237 }
    238 
    239 static void GLAPIENTRY
    240 VertexAttrib1ubvNV(GLuint index, const GLubyte *v)
    241 {
    242    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
    243 }
    244 
    245 static void GLAPIENTRY
    246 VertexAttrib2NubvNV(GLuint index, const GLubyte *v)
    247 {
    248    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]),
    249                                           UBYTE_TO_FLOAT(v[1])));
    250 }
    251 
    252 static void GLAPIENTRY
    253 VertexAttrib2ubvNV(GLuint index, const GLubyte *v)
    254 {
    255    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
    256 }
    257 
    258 static void GLAPIENTRY
    259 VertexAttrib3NubvNV(GLuint index, const GLubyte *v)
    260 {
    261    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]),
    262 					       UBYTE_TO_FLOAT(v[1]),
    263 					       UBYTE_TO_FLOAT(v[2])));
    264 }
    265 static void GLAPIENTRY
    266 VertexAttrib3ubvNV(GLuint index, const GLubyte *v)
    267 {
    268    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0],
    269                                           (GLfloat)v[1], (GLfloat)v[2]));
    270 }
    271 
    272 static void GLAPIENTRY
    273 VertexAttrib4NubvNV(GLuint index, const GLubyte *v)
    274 {
    275    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]),
    276                                           UBYTE_TO_FLOAT(v[1]),
    277                                           UBYTE_TO_FLOAT(v[2]),
    278                                           UBYTE_TO_FLOAT(v[3])));
    279 }
    280 
    281 static void GLAPIENTRY
    282 VertexAttrib4ubvNV(GLuint index, const GLubyte *v)
    283 {
    284    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0],
    285                                           (GLfloat)v[1], (GLfloat)v[2],
    286                                           (GLfloat)v[3]));
    287 }
    288 
    289 /* GL_SHORT attributes */
    290 
    291 static void GLAPIENTRY
    292 VertexAttrib1NsvNV(GLuint index, const GLshort *v)
    293 {
    294    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0])));
    295 }
    296 
    297 static void GLAPIENTRY
    298 VertexAttrib1svNV(GLuint index, const GLshort *v)
    299 {
    300    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
    301 }
    302 
    303 static void GLAPIENTRY
    304 VertexAttrib2NsvNV(GLuint index, const GLshort *v)
    305 {
    306    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]),
    307                                           SHORT_TO_FLOAT(v[1])));
    308 }
    309 
    310 static void GLAPIENTRY
    311 VertexAttrib2svNV(GLuint index, const GLshort *v)
    312 {
    313    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
    314 }
    315 
    316 static void GLAPIENTRY
    317 VertexAttrib3NsvNV(GLuint index, const GLshort *v)
    318 {
    319    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]),
    320 			     SHORT_TO_FLOAT(v[1]),
    321 			     SHORT_TO_FLOAT(v[2])));
    322 }
    323 
    324 static void GLAPIENTRY
    325 VertexAttrib3svNV(GLuint index, const GLshort *v)
    326 {
    327    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
    328                                           (GLfloat)v[2]));
    329 }
    330 
    331 static void GLAPIENTRY
    332 VertexAttrib4NsvNV(GLuint index, const GLshort *v)
    333 {
    334    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]),
    335 			     SHORT_TO_FLOAT(v[1]),
    336 			     SHORT_TO_FLOAT(v[2]),
    337 			     SHORT_TO_FLOAT(v[3])));
    338 }
    339 
    340 static void GLAPIENTRY
    341 VertexAttrib4svNV(GLuint index, const GLshort *v)
    342 {
    343    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
    344                                           (GLfloat)v[2], (GLfloat)v[3]));
    345 }
    346 
    347 /* GL_UNSIGNED_SHORT attributes */
    348 
    349 static void GLAPIENTRY
    350 VertexAttrib1NusvNV(GLuint index, const GLushort *v)
    351 {
    352    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0])));
    353 }
    354 
    355 static void GLAPIENTRY
    356 VertexAttrib1usvNV(GLuint index, const GLushort *v)
    357 {
    358    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
    359 }
    360 
    361 static void GLAPIENTRY
    362 VertexAttrib2NusvNV(GLuint index, const GLushort *v)
    363 {
    364    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
    365 			     USHORT_TO_FLOAT(v[1])));
    366 }
    367 
    368 static void GLAPIENTRY
    369 VertexAttrib2usvNV(GLuint index, const GLushort *v)
    370 {
    371    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0],
    372                                           (GLfloat)v[1]));
    373 }
    374 
    375 static void GLAPIENTRY
    376 VertexAttrib3NusvNV(GLuint index, const GLushort *v)
    377 {
    378    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
    379 					       USHORT_TO_FLOAT(v[1]),
    380 					       USHORT_TO_FLOAT(v[2])));
    381 }
    382 
    383 static void GLAPIENTRY
    384 VertexAttrib3usvNV(GLuint index, const GLushort *v)
    385 {
    386    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
    387                                           (GLfloat)v[2]));
    388 }
    389 
    390 static void GLAPIENTRY
    391 VertexAttrib4NusvNV(GLuint index, const GLushort *v)
    392 {
    393    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
    394 					       USHORT_TO_FLOAT(v[1]),
    395 					       USHORT_TO_FLOAT(v[2]),
    396 					       USHORT_TO_FLOAT(v[3])));
    397 }
    398 
    399 static void GLAPIENTRY
    400 VertexAttrib4usvNV(GLuint index, const GLushort *v)
    401 {
    402    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
    403                                           (GLfloat)v[2], (GLfloat)v[3]));
    404 }
    405 
    406 /* GL_INT attributes */
    407 
    408 static void GLAPIENTRY
    409 VertexAttrib1NivNV(GLuint index, const GLint *v)
    410 {
    411    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0])));
    412 }
    413 
    414 static void GLAPIENTRY
    415 VertexAttrib1ivNV(GLuint index, const GLint *v)
    416 {
    417    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
    418 }
    419 
    420 static void GLAPIENTRY
    421 VertexAttrib2NivNV(GLuint index, const GLint *v)
    422 {
    423    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
    424 					       INT_TO_FLOAT(v[1])));
    425 }
    426 
    427 static void GLAPIENTRY
    428 VertexAttrib2ivNV(GLuint index, const GLint *v)
    429 {
    430    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
    431 }
    432 
    433 static void GLAPIENTRY
    434 VertexAttrib3NivNV(GLuint index, const GLint *v)
    435 {
    436    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
    437 					       INT_TO_FLOAT(v[1]),
    438 					       INT_TO_FLOAT(v[2])));
    439 }
    440 
    441 static void GLAPIENTRY
    442 VertexAttrib3ivNV(GLuint index, const GLint *v)
    443 {
    444    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
    445                                           (GLfloat)v[2]));
    446 }
    447 
    448 static void GLAPIENTRY
    449 VertexAttrib4NivNV(GLuint index, const GLint *v)
    450 {
    451    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
    452                                           INT_TO_FLOAT(v[1]),
    453                                           INT_TO_FLOAT(v[2]),
    454                                           INT_TO_FLOAT(v[3])));
    455 }
    456 
    457 static void GLAPIENTRY
    458 VertexAttrib4ivNV(GLuint index, const GLint *v)
    459 {
    460    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
    461                                           (GLfloat)v[2], (GLfloat)v[3]));
    462 }
    463 
    464 /* GL_UNSIGNED_INT attributes */
    465 
    466 static void GLAPIENTRY
    467 VertexAttrib1NuivNV(GLuint index, const GLuint *v)
    468 {
    469    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0])));
    470 }
    471 
    472 static void GLAPIENTRY
    473 VertexAttrib1uivNV(GLuint index, const GLuint *v)
    474 {
    475    CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
    476 }
    477 
    478 static void GLAPIENTRY
    479 VertexAttrib2NuivNV(GLuint index, const GLuint *v)
    480 {
    481    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
    482                                           UINT_TO_FLOAT(v[1])));
    483 }
    484 
    485 static void GLAPIENTRY
    486 VertexAttrib2uivNV(GLuint index, const GLuint *v)
    487 {
    488    CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0],
    489                                           (GLfloat)v[1]));
    490 }
    491 
    492 static void GLAPIENTRY
    493 VertexAttrib3NuivNV(GLuint index, const GLuint *v)
    494 {
    495    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
    496 					       UINT_TO_FLOAT(v[1]),
    497 					       UINT_TO_FLOAT(v[2])));
    498 }
    499 
    500 static void GLAPIENTRY
    501 VertexAttrib3uivNV(GLuint index, const GLuint *v)
    502 {
    503    CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
    504                                           (GLfloat)v[2]));
    505 }
    506 
    507 static void GLAPIENTRY
    508 VertexAttrib4NuivNV(GLuint index, const GLuint *v)
    509 {
    510    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
    511 					       UINT_TO_FLOAT(v[1]),
    512 					       UINT_TO_FLOAT(v[2]),
    513 					       UINT_TO_FLOAT(v[3])));
    514 }
    515 
    516 static void GLAPIENTRY
    517 VertexAttrib4uivNV(GLuint index, const GLuint *v)
    518 {
    519    CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
    520                                           (GLfloat)v[2], (GLfloat)v[3]));
    521 }
    522 
    523 /* GL_FLOAT attributes */
    524 
    525 static void GLAPIENTRY
    526 VertexAttrib1fvNV(GLuint index, const GLfloat *v)
    527 {
    528    CALL_VertexAttrib1fvNV(GET_DISPATCH(), (index, v));
    529 }
    530 
    531 static void GLAPIENTRY
    532 VertexAttrib2fvNV(GLuint index, const GLfloat *v)
    533 {
    534    CALL_VertexAttrib2fvNV(GET_DISPATCH(), (index, v));
    535 }
    536 
    537 static void GLAPIENTRY
    538 VertexAttrib3fvNV(GLuint index, const GLfloat *v)
    539 {
    540    CALL_VertexAttrib3fvNV(GET_DISPATCH(), (index, v));
    541 }
    542 
    543 static void GLAPIENTRY
    544 VertexAttrib4fvNV(GLuint index, const GLfloat *v)
    545 {
    546    CALL_VertexAttrib4fvNV(GET_DISPATCH(), (index, v));
    547 }
    548 
    549 /* GL_DOUBLE attributes */
    550 
    551 static void GLAPIENTRY
    552 VertexAttrib1dvNV(GLuint index, const GLdouble *v)
    553 {
    554    CALL_VertexAttrib1dvNV(GET_DISPATCH(), (index, v));
    555 }
    556 
    557 static void GLAPIENTRY
    558 VertexAttrib2dvNV(GLuint index, const GLdouble *v)
    559 {
    560    CALL_VertexAttrib2dvNV(GET_DISPATCH(), (index, v));
    561 }
    562 
    563 static void GLAPIENTRY
    564 VertexAttrib3dvNV(GLuint index, const GLdouble *v)
    565 {
    566    CALL_VertexAttrib3dvNV(GET_DISPATCH(), (index, v));
    567 }
    568 
    569 static void GLAPIENTRY
    570 VertexAttrib4dvNV(GLuint index, const GLdouble *v)
    571 {
    572    CALL_VertexAttrib4dvNV(GET_DISPATCH(), (index, v));
    573 }
    574 
    575 
    576 /*
    577  * Array [size][type] of VertexAttrib functions
    578  */
    579 static attrib_func AttribFuncsNV[2][4][NUM_TYPES] = {
    580    {
    581       /* non-normalized */
    582       {
    583          /* size 1 */
    584          (attrib_func) VertexAttrib1bvNV,
    585          (attrib_func) VertexAttrib1ubvNV,
    586          (attrib_func) VertexAttrib1svNV,
    587          (attrib_func) VertexAttrib1usvNV,
    588          (attrib_func) VertexAttrib1ivNV,
    589          (attrib_func) VertexAttrib1uivNV,
    590          (attrib_func) VertexAttrib1fvNV,
    591          (attrib_func) VertexAttrib1dvNV
    592       },
    593       {
    594          /* size 2 */
    595          (attrib_func) VertexAttrib2bvNV,
    596          (attrib_func) VertexAttrib2ubvNV,
    597          (attrib_func) VertexAttrib2svNV,
    598          (attrib_func) VertexAttrib2usvNV,
    599          (attrib_func) VertexAttrib2ivNV,
    600          (attrib_func) VertexAttrib2uivNV,
    601          (attrib_func) VertexAttrib2fvNV,
    602          (attrib_func) VertexAttrib2dvNV
    603       },
    604       {
    605          /* size 3 */
    606          (attrib_func) VertexAttrib3bvNV,
    607          (attrib_func) VertexAttrib3ubvNV,
    608          (attrib_func) VertexAttrib3svNV,
    609          (attrib_func) VertexAttrib3usvNV,
    610          (attrib_func) VertexAttrib3ivNV,
    611          (attrib_func) VertexAttrib3uivNV,
    612          (attrib_func) VertexAttrib3fvNV,
    613          (attrib_func) VertexAttrib3dvNV
    614       },
    615       {
    616          /* size 4 */
    617          (attrib_func) VertexAttrib4bvNV,
    618          (attrib_func) VertexAttrib4ubvNV,
    619          (attrib_func) VertexAttrib4svNV,
    620          (attrib_func) VertexAttrib4usvNV,
    621          (attrib_func) VertexAttrib4ivNV,
    622          (attrib_func) VertexAttrib4uivNV,
    623          (attrib_func) VertexAttrib4fvNV,
    624          (attrib_func) VertexAttrib4dvNV
    625       }
    626    },
    627    {
    628       /* normalized (except for float/double) */
    629       {
    630          /* size 1 */
    631          (attrib_func) VertexAttrib1NbvNV,
    632          (attrib_func) VertexAttrib1NubvNV,
    633          (attrib_func) VertexAttrib1NsvNV,
    634          (attrib_func) VertexAttrib1NusvNV,
    635          (attrib_func) VertexAttrib1NivNV,
    636          (attrib_func) VertexAttrib1NuivNV,
    637          (attrib_func) VertexAttrib1fvNV,
    638          (attrib_func) VertexAttrib1dvNV
    639       },
    640       {
    641          /* size 2 */
    642          (attrib_func) VertexAttrib2NbvNV,
    643          (attrib_func) VertexAttrib2NubvNV,
    644          (attrib_func) VertexAttrib2NsvNV,
    645          (attrib_func) VertexAttrib2NusvNV,
    646          (attrib_func) VertexAttrib2NivNV,
    647          (attrib_func) VertexAttrib2NuivNV,
    648          (attrib_func) VertexAttrib2fvNV,
    649          (attrib_func) VertexAttrib2dvNV
    650       },
    651       {
    652          /* size 3 */
    653          (attrib_func) VertexAttrib3NbvNV,
    654          (attrib_func) VertexAttrib3NubvNV,
    655          (attrib_func) VertexAttrib3NsvNV,
    656          (attrib_func) VertexAttrib3NusvNV,
    657          (attrib_func) VertexAttrib3NivNV,
    658          (attrib_func) VertexAttrib3NuivNV,
    659          (attrib_func) VertexAttrib3fvNV,
    660          (attrib_func) VertexAttrib3dvNV
    661       },
    662       {
    663          /* size 4 */
    664          (attrib_func) VertexAttrib4NbvNV,
    665          (attrib_func) VertexAttrib4NubvNV,
    666          (attrib_func) VertexAttrib4NsvNV,
    667          (attrib_func) VertexAttrib4NusvNV,
    668          (attrib_func) VertexAttrib4NivNV,
    669          (attrib_func) VertexAttrib4NuivNV,
    670          (attrib_func) VertexAttrib4fvNV,
    671          (attrib_func) VertexAttrib4dvNV
    672       }
    673    }
    674 };
    675 
    676 
    677 /**
    678  ** GL_ARB_vertex_program
    679  **/
    680 
    681 /* GL_BYTE attributes */
    682 
    683 static void GLAPIENTRY
    684 VertexAttrib1NbvARB(GLuint index, const GLbyte *v)
    685 {
    686    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0])));
    687 }
    688 
    689 static void GLAPIENTRY
    690 VertexAttrib1bvARB(GLuint index, const GLbyte *v)
    691 {
    692    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
    693 }
    694 
    695 static void GLAPIENTRY
    696 VertexAttrib2NbvARB(GLuint index, const GLbyte *v)
    697 {
    698    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1])));
    699 }
    700 
    701 static void GLAPIENTRY
    702 VertexAttrib2bvARB(GLuint index, const GLbyte *v)
    703 {
    704    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
    705 }
    706 
    707 static void GLAPIENTRY
    708 VertexAttrib3NbvARB(GLuint index, const GLbyte *v)
    709 {
    710    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]),
    711 					       BYTE_TO_FLOAT(v[1]),
    712 					       BYTE_TO_FLOAT(v[2])));
    713 }
    714 
    715 static void GLAPIENTRY
    716 VertexAttrib3bvARB(GLuint index, const GLbyte *v)
    717 {
    718    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2]));
    719 }
    720 
    721 static void GLAPIENTRY
    722 VertexAttrib4NbvARB(GLuint index, const GLbyte *v)
    723 {
    724    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]),
    725 					       BYTE_TO_FLOAT(v[1]),
    726 					       BYTE_TO_FLOAT(v[2]),
    727 					       BYTE_TO_FLOAT(v[3])));
    728 }
    729 
    730 static void GLAPIENTRY
    731 VertexAttrib4bvARB(GLuint index, const GLbyte *v)
    732 {
    733    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2], (GLfloat)v[3]));
    734 }
    735 
    736 /* GL_UNSIGNED_BYTE attributes */
    737 
    738 static void GLAPIENTRY
    739 VertexAttrib1NubvARB(GLuint index, const GLubyte *v)
    740 {
    741    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0])));
    742 }
    743 
    744 static void GLAPIENTRY
    745 VertexAttrib1ubvARB(GLuint index, const GLubyte *v)
    746 {
    747    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
    748 }
    749 
    750 static void GLAPIENTRY
    751 VertexAttrib2NubvARB(GLuint index, const GLubyte *v)
    752 {
    753    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index,
    754                                            UBYTE_TO_FLOAT(v[0]),
    755                                            UBYTE_TO_FLOAT(v[1])));
    756 }
    757 
    758 static void GLAPIENTRY
    759 VertexAttrib2ubvARB(GLuint index, const GLubyte *v)
    760 {
    761    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index,
    762                                            (GLfloat)v[0], (GLfloat)v[1]));
    763 }
    764 
    765 static void GLAPIENTRY
    766 VertexAttrib3NubvARB(GLuint index, const GLubyte *v)
    767 {
    768    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index,
    769                                            UBYTE_TO_FLOAT(v[0]),
    770                                            UBYTE_TO_FLOAT(v[1]),
    771                                            UBYTE_TO_FLOAT(v[2])));
    772 }
    773 static void GLAPIENTRY
    774 VertexAttrib3ubvARB(GLuint index, const GLubyte *v)
    775 {
    776    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index,
    777                                            (GLfloat)v[0],
    778                                            (GLfloat)v[1],
    779                                            (GLfloat)v[2]));
    780 }
    781 
    782 static void GLAPIENTRY
    783 VertexAttrib4NubvARB(GLuint index, const GLubyte *v)
    784 {
    785    CALL_VertexAttrib4fARB(GET_DISPATCH(),
    786                           (index,
    787                            UBYTE_TO_FLOAT(v[0]),
    788                            UBYTE_TO_FLOAT(v[1]),
    789                            UBYTE_TO_FLOAT(v[2]),
    790                            UBYTE_TO_FLOAT(v[3])));
    791 }
    792 
    793 static void GLAPIENTRY
    794 VertexAttrib4ubvARB(GLuint index, const GLubyte *v)
    795 {
    796    CALL_VertexAttrib4fARB(GET_DISPATCH(),
    797                           (index,
    798                            (GLfloat)v[0], (GLfloat)v[1],
    799                            (GLfloat)v[2], (GLfloat)v[3]));
    800 }
    801 
    802 /* GL_SHORT attributes */
    803 
    804 static void GLAPIENTRY
    805 VertexAttrib1NsvARB(GLuint index, const GLshort *v)
    806 {
    807    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0])));
    808 }
    809 
    810 static void GLAPIENTRY
    811 VertexAttrib1svARB(GLuint index, const GLshort *v)
    812 {
    813    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
    814 }
    815 
    816 static void GLAPIENTRY
    817 VertexAttrib2NsvARB(GLuint index, const GLshort *v)
    818 {
    819    CALL_VertexAttrib2fARB(GET_DISPATCH(),
    820                           (index, SHORT_TO_FLOAT(v[0]),
    821                            SHORT_TO_FLOAT(v[1])));
    822 }
    823 
    824 static void GLAPIENTRY
    825 VertexAttrib2svARB(GLuint index, const GLshort *v)
    826 {
    827    CALL_VertexAttrib2fARB(GET_DISPATCH(),
    828                           (index, (GLfloat)v[0], (GLfloat)v[1]));
    829 }
    830 
    831 static void GLAPIENTRY
    832 VertexAttrib3NsvARB(GLuint index, const GLshort *v)
    833 {
    834    CALL_VertexAttrib3fARB(GET_DISPATCH(),
    835                           (index,
    836                            SHORT_TO_FLOAT(v[0]),
    837                            SHORT_TO_FLOAT(v[1]),
    838                            SHORT_TO_FLOAT(v[2])));
    839 }
    840 
    841 static void GLAPIENTRY
    842 VertexAttrib3svARB(GLuint index, const GLshort *v)
    843 {
    844    CALL_VertexAttrib3fARB(GET_DISPATCH(),
    845                           (index,
    846                            (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2]));
    847 }
    848 
    849 static void GLAPIENTRY
    850 VertexAttrib4NsvARB(GLuint index, const GLshort *v)
    851 {
    852    CALL_VertexAttrib4fARB(GET_DISPATCH(),
    853                           (index,
    854                            SHORT_TO_FLOAT(v[0]),
    855                            SHORT_TO_FLOAT(v[1]),
    856                            SHORT_TO_FLOAT(v[2]),
    857                            SHORT_TO_FLOAT(v[3])));
    858 }
    859 
    860 static void GLAPIENTRY
    861 VertexAttrib4svARB(GLuint index, const GLshort *v)
    862 {
    863    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
    864                                            (GLfloat)v[2], (GLfloat)v[3]));
    865 }
    866 
    867 /* GL_UNSIGNED_SHORT attributes */
    868 
    869 static void GLAPIENTRY
    870 VertexAttrib1NusvARB(GLuint index, const GLushort *v)
    871 {
    872    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0])));
    873 }
    874 
    875 static void GLAPIENTRY
    876 VertexAttrib1usvARB(GLuint index, const GLushort *v)
    877 {
    878    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
    879 }
    880 
    881 static void GLAPIENTRY
    882 VertexAttrib2NusvARB(GLuint index, const GLushort *v)
    883 {
    884    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
    885 			     USHORT_TO_FLOAT(v[1])));
    886 }
    887 
    888 static void GLAPIENTRY
    889 VertexAttrib2usvARB(GLuint index, const GLushort *v)
    890 {
    891    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
    892                                            (GLfloat)v[1]));
    893 }
    894 
    895 static void GLAPIENTRY
    896 VertexAttrib3NusvARB(GLuint index, const GLushort *v)
    897 {
    898    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
    899 					       USHORT_TO_FLOAT(v[1]),
    900 					       USHORT_TO_FLOAT(v[2])));
    901 }
    902 
    903 static void GLAPIENTRY
    904 VertexAttrib3usvARB(GLuint index, const GLushort *v)
    905 {
    906    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
    907                                            (GLfloat)v[1], (GLfloat)v[2]));
    908 }
    909 
    910 static void GLAPIENTRY
    911 VertexAttrib4NusvARB(GLuint index, const GLushort *v)
    912 {
    913    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
    914 					       USHORT_TO_FLOAT(v[1]),
    915 					       USHORT_TO_FLOAT(v[2]),
    916 					       USHORT_TO_FLOAT(v[3])));
    917 }
    918 
    919 static void GLAPIENTRY
    920 VertexAttrib4usvARB(GLuint index, const GLushort *v)
    921 {
    922    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2], (GLfloat)v[3]));
    923 }
    924 
    925 /* GL_INT attributes */
    926 
    927 static void GLAPIENTRY
    928 VertexAttrib1NivARB(GLuint index, const GLint *v)
    929 {
    930    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0])));
    931 }
    932 
    933 static void GLAPIENTRY
    934 VertexAttrib1ivARB(GLuint index, const GLint *v)
    935 {
    936    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
    937 }
    938 
    939 static void GLAPIENTRY
    940 VertexAttrib2NivARB(GLuint index, const GLint *v)
    941 {
    942    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
    943 					       INT_TO_FLOAT(v[1])));
    944 }
    945 
    946 static void GLAPIENTRY
    947 VertexAttrib2ivARB(GLuint index, const GLint *v)
    948 {
    949    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
    950                                            (GLfloat)v[1]));
    951 }
    952 
    953 static void GLAPIENTRY
    954 VertexAttrib3NivARB(GLuint index, const GLint *v)
    955 {
    956    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
    957 					       INT_TO_FLOAT(v[1]),
    958 					       INT_TO_FLOAT(v[2])));
    959 }
    960 
    961 static void GLAPIENTRY
    962 VertexAttrib3ivARB(GLuint index, const GLint *v)
    963 {
    964    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
    965                                            (GLfloat)v[1], (GLfloat)v[2]));
    966 }
    967 
    968 static void GLAPIENTRY
    969 VertexAttrib4NivARB(GLuint index, const GLint *v)
    970 {
    971    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
    972 					       INT_TO_FLOAT(v[1]),
    973 					       INT_TO_FLOAT(v[2]),
    974 					       INT_TO_FLOAT(v[3])));
    975 }
    976 
    977 static void GLAPIENTRY
    978 VertexAttrib4ivARB(GLuint index, const GLint *v)
    979 {
    980    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
    981                                            (GLfloat)v[2], (GLfloat)v[3]));
    982 }
    983 
    984 /* GL_UNSIGNED_INT attributes */
    985 
    986 static void GLAPIENTRY
    987 VertexAttrib1NuivARB(GLuint index, const GLuint *v)
    988 {
    989    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0])));
    990 }
    991 
    992 static void GLAPIENTRY
    993 VertexAttrib1uivARB(GLuint index, const GLuint *v)
    994 {
    995    CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
    996 }
    997 
    998 static void GLAPIENTRY
    999 VertexAttrib2NuivARB(GLuint index, const GLuint *v)
   1000 {
   1001    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
   1002                                            UINT_TO_FLOAT(v[1])));
   1003 }
   1004 
   1005 static void GLAPIENTRY
   1006 VertexAttrib2uivARB(GLuint index, const GLuint *v)
   1007 {
   1008    CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
   1009                                            (GLfloat)v[1]));
   1010 }
   1011 
   1012 static void GLAPIENTRY
   1013 VertexAttrib3NuivARB(GLuint index, const GLuint *v)
   1014 {
   1015    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
   1016                                            UINT_TO_FLOAT(v[1]),
   1017                                            UINT_TO_FLOAT(v[2])));
   1018 }
   1019 
   1020 static void GLAPIENTRY
   1021 VertexAttrib3uivARB(GLuint index, const GLuint *v)
   1022 {
   1023    CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
   1024                                            (GLfloat)v[1], (GLfloat)v[2]));
   1025 }
   1026 
   1027 static void GLAPIENTRY
   1028 VertexAttrib4NuivARB(GLuint index, const GLuint *v)
   1029 {
   1030    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
   1031                                            UINT_TO_FLOAT(v[1]),
   1032                                            UINT_TO_FLOAT(v[2]),
   1033                                            UINT_TO_FLOAT(v[3])));
   1034 }
   1035 
   1036 static void GLAPIENTRY
   1037 VertexAttrib4uivARB(GLuint index, const GLuint *v)
   1038 {
   1039    CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
   1040                                            (GLfloat)v[2], (GLfloat)v[3]));
   1041 }
   1042 
   1043 /* GL_FLOAT attributes */
   1044 
   1045 static void GLAPIENTRY
   1046 VertexAttrib1fvARB(GLuint index, const GLfloat *v)
   1047 {
   1048    CALL_VertexAttrib1fvARB(GET_DISPATCH(), (index, v));
   1049 }
   1050 
   1051 static void GLAPIENTRY
   1052 VertexAttrib2fvARB(GLuint index, const GLfloat *v)
   1053 {
   1054    CALL_VertexAttrib2fvARB(GET_DISPATCH(), (index, v));
   1055 }
   1056 
   1057 static void GLAPIENTRY
   1058 VertexAttrib3fvARB(GLuint index, const GLfloat *v)
   1059 {
   1060    CALL_VertexAttrib3fvARB(GET_DISPATCH(), (index, v));
   1061 }
   1062 
   1063 static void GLAPIENTRY
   1064 VertexAttrib4fvARB(GLuint index, const GLfloat *v)
   1065 {
   1066    CALL_VertexAttrib4fvARB(GET_DISPATCH(), (index, v));
   1067 }
   1068 
   1069 /* GL_DOUBLE attributes */
   1070 
   1071 static void GLAPIENTRY
   1072 VertexAttrib1dvARB(GLuint index, const GLdouble *v)
   1073 {
   1074    CALL_VertexAttrib1dvARB(GET_DISPATCH(), (index, v));
   1075 }
   1076 
   1077 static void GLAPIENTRY
   1078 VertexAttrib2dvARB(GLuint index, const GLdouble *v)
   1079 {
   1080    CALL_VertexAttrib2dvARB(GET_DISPATCH(), (index, v));
   1081 }
   1082 
   1083 static void GLAPIENTRY
   1084 VertexAttrib3dvARB(GLuint index, const GLdouble *v)
   1085 {
   1086    CALL_VertexAttrib3dvARB(GET_DISPATCH(), (index, v));
   1087 }
   1088 
   1089 static void GLAPIENTRY
   1090 VertexAttrib4dvARB(GLuint index, const GLdouble *v)
   1091 {
   1092    CALL_VertexAttrib4dvARB(GET_DISPATCH(), (index, v));
   1093 }
   1094 
   1095 
   1096 /**
   1097  * Integer-valued attributes
   1098  */
   1099 static void GLAPIENTRY
   1100 VertexAttribI1bv(GLuint index, const GLbyte *v)
   1101 {
   1102    CALL_VertexAttribI1iEXT(GET_DISPATCH(), (index, v[0]));
   1103 }
   1104 
   1105 static void GLAPIENTRY
   1106 VertexAttribI2bv(GLuint index, const GLbyte *v)
   1107 {
   1108    CALL_VertexAttribI2iEXT(GET_DISPATCH(), (index, v[0], v[1]));
   1109 }
   1110 
   1111 static void GLAPIENTRY
   1112 VertexAttribI3bv(GLuint index, const GLbyte *v)
   1113 {
   1114    CALL_VertexAttribI3iEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
   1115 }
   1116 
   1117 static void GLAPIENTRY
   1118 VertexAttribI4bv(GLuint index, const GLbyte *v)
   1119 {
   1120    CALL_VertexAttribI4bvEXT(GET_DISPATCH(), (index, v));
   1121 }
   1122 
   1123 
   1124 static void GLAPIENTRY
   1125 VertexAttribI1ubv(GLuint index, const GLubyte *v)
   1126 {
   1127    CALL_VertexAttribI1uiEXT(GET_DISPATCH(), (index, v[0]));
   1128 }
   1129 
   1130 static void GLAPIENTRY
   1131 VertexAttribI2ubv(GLuint index, const GLubyte *v)
   1132 {
   1133    CALL_VertexAttribI2uiEXT(GET_DISPATCH(), (index, v[0], v[1]));
   1134 }
   1135 
   1136 static void GLAPIENTRY
   1137 VertexAttribI3ubv(GLuint index, const GLubyte *v)
   1138 {
   1139    CALL_VertexAttribI3uiEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
   1140 }
   1141 
   1142 static void GLAPIENTRY
   1143 VertexAttribI4ubv(GLuint index, const GLubyte *v)
   1144 {
   1145    CALL_VertexAttribI4ubvEXT(GET_DISPATCH(), (index, v));
   1146 }
   1147 
   1148 
   1149 
   1150 static void GLAPIENTRY
   1151 VertexAttribI1sv(GLuint index, const GLshort *v)
   1152 {
   1153    CALL_VertexAttribI1iEXT(GET_DISPATCH(), (index, v[0]));
   1154 }
   1155 
   1156 static void GLAPIENTRY
   1157 VertexAttribI2sv(GLuint index, const GLshort *v)
   1158 {
   1159    CALL_VertexAttribI2iEXT(GET_DISPATCH(), (index, v[0], v[1]));
   1160 }
   1161 
   1162 static void GLAPIENTRY
   1163 VertexAttribI3sv(GLuint index, const GLshort *v)
   1164 {
   1165    CALL_VertexAttribI3iEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
   1166 }
   1167 
   1168 static void GLAPIENTRY
   1169 VertexAttribI4sv(GLuint index, const GLshort *v)
   1170 {
   1171    CALL_VertexAttribI4svEXT(GET_DISPATCH(), (index, v));
   1172 }
   1173 
   1174 
   1175 static void GLAPIENTRY
   1176 VertexAttribI1usv(GLuint index, const GLushort *v)
   1177 {
   1178    CALL_VertexAttribI1uiEXT(GET_DISPATCH(), (index, v[0]));
   1179 }
   1180 
   1181 static void GLAPIENTRY
   1182 VertexAttribI2usv(GLuint index, const GLushort *v)
   1183 {
   1184    CALL_VertexAttribI2uiEXT(GET_DISPATCH(), (index, v[0], v[1]));
   1185 }
   1186 
   1187 static void GLAPIENTRY
   1188 VertexAttribI3usv(GLuint index, const GLushort *v)
   1189 {
   1190    CALL_VertexAttribI3uiEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
   1191 }
   1192 
   1193 static void GLAPIENTRY
   1194 VertexAttribI4usv(GLuint index, const GLushort *v)
   1195 {
   1196    CALL_VertexAttribI4usvEXT(GET_DISPATCH(), (index, v));
   1197 }
   1198 
   1199 
   1200 
   1201 static void GLAPIENTRY
   1202 VertexAttribI1iv(GLuint index, const GLint *v)
   1203 {
   1204    CALL_VertexAttribI1iEXT(GET_DISPATCH(), (index, v[0]));
   1205 }
   1206 
   1207 static void GLAPIENTRY
   1208 VertexAttribI2iv(GLuint index, const GLint *v)
   1209 {
   1210    CALL_VertexAttribI2iEXT(GET_DISPATCH(), (index, v[0], v[1]));
   1211 }
   1212 
   1213 static void GLAPIENTRY
   1214 VertexAttribI3iv(GLuint index, const GLint *v)
   1215 {
   1216    CALL_VertexAttribI3iEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
   1217 }
   1218 
   1219 static void GLAPIENTRY
   1220 VertexAttribI4iv(GLuint index, const GLint *v)
   1221 {
   1222    CALL_VertexAttribI4ivEXT(GET_DISPATCH(), (index, v));
   1223 }
   1224 
   1225 
   1226 static void GLAPIENTRY
   1227 VertexAttribI1uiv(GLuint index, const GLuint *v)
   1228 {
   1229    CALL_VertexAttribI1uiEXT(GET_DISPATCH(), (index, v[0]));
   1230 }
   1231 
   1232 static void GLAPIENTRY
   1233 VertexAttribI2uiv(GLuint index, const GLuint *v)
   1234 {
   1235    CALL_VertexAttribI2uiEXT(GET_DISPATCH(), (index, v[0], v[1]));
   1236 }
   1237 
   1238 static void GLAPIENTRY
   1239 VertexAttribI3uiv(GLuint index, const GLuint *v)
   1240 {
   1241    CALL_VertexAttribI3uiEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
   1242 }
   1243 
   1244 static void GLAPIENTRY
   1245 VertexAttribI4uiv(GLuint index, const GLuint *v)
   1246 {
   1247    CALL_VertexAttribI4uivEXT(GET_DISPATCH(), (index, v));
   1248 }
   1249 
   1250 
   1251 
   1252 
   1253 /*
   1254  * Array [unnormalized/normalized/integer][size][type] of VertexAttrib
   1255  * functions
   1256  */
   1257 static attrib_func AttribFuncsARB[3][4][NUM_TYPES] = {
   1258    {
   1259       /* non-normalized */
   1260       {
   1261          /* size 1 */
   1262          (attrib_func) VertexAttrib1bvARB,
   1263          (attrib_func) VertexAttrib1ubvARB,
   1264          (attrib_func) VertexAttrib1svARB,
   1265          (attrib_func) VertexAttrib1usvARB,
   1266          (attrib_func) VertexAttrib1ivARB,
   1267          (attrib_func) VertexAttrib1uivARB,
   1268          (attrib_func) VertexAttrib1fvARB,
   1269          (attrib_func) VertexAttrib1dvARB
   1270       },
   1271       {
   1272          /* size 2 */
   1273          (attrib_func) VertexAttrib2bvARB,
   1274          (attrib_func) VertexAttrib2ubvARB,
   1275          (attrib_func) VertexAttrib2svARB,
   1276          (attrib_func) VertexAttrib2usvARB,
   1277          (attrib_func) VertexAttrib2ivARB,
   1278          (attrib_func) VertexAttrib2uivARB,
   1279          (attrib_func) VertexAttrib2fvARB,
   1280          (attrib_func) VertexAttrib2dvARB
   1281       },
   1282       {
   1283          /* size 3 */
   1284          (attrib_func) VertexAttrib3bvARB,
   1285          (attrib_func) VertexAttrib3ubvARB,
   1286          (attrib_func) VertexAttrib3svARB,
   1287          (attrib_func) VertexAttrib3usvARB,
   1288          (attrib_func) VertexAttrib3ivARB,
   1289          (attrib_func) VertexAttrib3uivARB,
   1290          (attrib_func) VertexAttrib3fvARB,
   1291          (attrib_func) VertexAttrib3dvARB
   1292       },
   1293       {
   1294          /* size 4 */
   1295          (attrib_func) VertexAttrib4bvARB,
   1296          (attrib_func) VertexAttrib4ubvARB,
   1297          (attrib_func) VertexAttrib4svARB,
   1298          (attrib_func) VertexAttrib4usvARB,
   1299          (attrib_func) VertexAttrib4ivARB,
   1300          (attrib_func) VertexAttrib4uivARB,
   1301          (attrib_func) VertexAttrib4fvARB,
   1302          (attrib_func) VertexAttrib4dvARB
   1303       }
   1304    },
   1305    {
   1306       /* normalized (except for float/double) */
   1307       {
   1308          /* size 1 */
   1309          (attrib_func) VertexAttrib1NbvARB,
   1310          (attrib_func) VertexAttrib1NubvARB,
   1311          (attrib_func) VertexAttrib1NsvARB,
   1312          (attrib_func) VertexAttrib1NusvARB,
   1313          (attrib_func) VertexAttrib1NivARB,
   1314          (attrib_func) VertexAttrib1NuivARB,
   1315          (attrib_func) VertexAttrib1fvARB,
   1316          (attrib_func) VertexAttrib1dvARB
   1317       },
   1318       {
   1319          /* size 2 */
   1320          (attrib_func) VertexAttrib2NbvARB,
   1321          (attrib_func) VertexAttrib2NubvARB,
   1322          (attrib_func) VertexAttrib2NsvARB,
   1323          (attrib_func) VertexAttrib2NusvARB,
   1324          (attrib_func) VertexAttrib2NivARB,
   1325          (attrib_func) VertexAttrib2NuivARB,
   1326          (attrib_func) VertexAttrib2fvARB,
   1327          (attrib_func) VertexAttrib2dvARB
   1328       },
   1329       {
   1330          /* size 3 */
   1331          (attrib_func) VertexAttrib3NbvARB,
   1332          (attrib_func) VertexAttrib3NubvARB,
   1333          (attrib_func) VertexAttrib3NsvARB,
   1334          (attrib_func) VertexAttrib3NusvARB,
   1335          (attrib_func) VertexAttrib3NivARB,
   1336          (attrib_func) VertexAttrib3NuivARB,
   1337          (attrib_func) VertexAttrib3fvARB,
   1338          (attrib_func) VertexAttrib3dvARB
   1339       },
   1340       {
   1341          /* size 4 */
   1342          (attrib_func) VertexAttrib4NbvARB,
   1343          (attrib_func) VertexAttrib4NubvARB,
   1344          (attrib_func) VertexAttrib4NsvARB,
   1345          (attrib_func) VertexAttrib4NusvARB,
   1346          (attrib_func) VertexAttrib4NivARB,
   1347          (attrib_func) VertexAttrib4NuivARB,
   1348          (attrib_func) VertexAttrib4fvARB,
   1349          (attrib_func) VertexAttrib4dvARB
   1350       }
   1351    },
   1352 
   1353    {
   1354       /* integer-valued */
   1355       {
   1356          /* size 1 */
   1357          (attrib_func) VertexAttribI1bv,
   1358          (attrib_func) VertexAttribI1ubv,
   1359          (attrib_func) VertexAttribI1sv,
   1360          (attrib_func) VertexAttribI1usv,
   1361          (attrib_func) VertexAttribI1iv,
   1362          (attrib_func) VertexAttribI1uiv,
   1363          NULL, /* GL_FLOAT */
   1364          NULL  /* GL_DOUBLE */
   1365       },
   1366       {
   1367          /* size 2 */
   1368          (attrib_func) VertexAttribI2bv,
   1369          (attrib_func) VertexAttribI2ubv,
   1370          (attrib_func) VertexAttribI2sv,
   1371          (attrib_func) VertexAttribI2usv,
   1372          (attrib_func) VertexAttribI2iv,
   1373          (attrib_func) VertexAttribI2uiv,
   1374          NULL, /* GL_FLOAT */
   1375          NULL  /* GL_DOUBLE */
   1376       },
   1377       {
   1378          /* size 3 */
   1379          (attrib_func) VertexAttribI3bv,
   1380          (attrib_func) VertexAttribI3ubv,
   1381          (attrib_func) VertexAttribI3sv,
   1382          (attrib_func) VertexAttribI3usv,
   1383          (attrib_func) VertexAttribI3iv,
   1384          (attrib_func) VertexAttribI3uiv,
   1385          NULL, /* GL_FLOAT */
   1386          NULL  /* GL_DOUBLE */
   1387       },
   1388       {
   1389          /* size 4 */
   1390          (attrib_func) VertexAttribI4bv,
   1391          (attrib_func) VertexAttribI4ubv,
   1392          (attrib_func) VertexAttribI4sv,
   1393          (attrib_func) VertexAttribI4usv,
   1394          (attrib_func) VertexAttribI4iv,
   1395          (attrib_func) VertexAttribI4uiv,
   1396          NULL, /* GL_FLOAT */
   1397          NULL  /* GL_DOUBLE */
   1398       }
   1399    }
   1400 };
   1401 
   1402 /**********************************************************************/
   1403 
   1404 
   1405 GLboolean _ae_create_context( struct gl_context *ctx )
   1406 {
   1407    if (ctx->aelt_context)
   1408       return GL_TRUE;
   1409 
   1410    /* These _gloffset_* values may not be compile-time constants */
   1411    SecondaryColorFuncs[0] = _gloffset_SecondaryColor3bvEXT;
   1412    SecondaryColorFuncs[1] = _gloffset_SecondaryColor3ubvEXT;
   1413    SecondaryColorFuncs[2] = _gloffset_SecondaryColor3svEXT;
   1414    SecondaryColorFuncs[3] = _gloffset_SecondaryColor3usvEXT;
   1415    SecondaryColorFuncs[4] = _gloffset_SecondaryColor3ivEXT;
   1416    SecondaryColorFuncs[5] = _gloffset_SecondaryColor3uivEXT;
   1417    SecondaryColorFuncs[6] = _gloffset_SecondaryColor3fvEXT;
   1418    SecondaryColorFuncs[7] = _gloffset_SecondaryColor3dvEXT;
   1419 
   1420    FogCoordFuncs[0] = -1;
   1421    FogCoordFuncs[1] = -1;
   1422    FogCoordFuncs[2] = -1;
   1423    FogCoordFuncs[3] = -1;
   1424    FogCoordFuncs[4] = -1;
   1425    FogCoordFuncs[5] = -1;
   1426    FogCoordFuncs[6] = _gloffset_FogCoordfvEXT;
   1427    FogCoordFuncs[7] = _gloffset_FogCoorddvEXT;
   1428 
   1429    ctx->aelt_context = CALLOC( sizeof(AEcontext) );
   1430    if (!ctx->aelt_context)
   1431       return GL_FALSE;
   1432 
   1433    AE_CONTEXT(ctx)->NewState = ~0;
   1434    return GL_TRUE;
   1435 }
   1436 
   1437 
   1438 void _ae_destroy_context( struct gl_context *ctx )
   1439 {
   1440    if ( AE_CONTEXT( ctx ) ) {
   1441       FREE( ctx->aelt_context );
   1442       ctx->aelt_context = NULL;
   1443    }
   1444 }
   1445 
   1446 static void check_vbo( AEcontext *actx,
   1447 		       struct gl_buffer_object *vbo )
   1448 {
   1449    if (_mesa_is_bufferobj(vbo) && !_mesa_bufferobj_mapped(vbo)) {
   1450       GLuint i;
   1451       for (i = 0; i < actx->nr_vbos; i++)
   1452 	 if (actx->vbo[i] == vbo)
   1453 	    return;
   1454       assert(actx->nr_vbos < VERT_ATTRIB_MAX);
   1455       actx->vbo[actx->nr_vbos++] = vbo;
   1456    }
   1457 }
   1458 
   1459 
   1460 /**
   1461  * Make a list of per-vertex functions to call for each glArrayElement call.
   1462  * These functions access the array data (i.e. glVertex, glColor, glNormal,
   1463  * etc).
   1464  * Note: this may be called during display list construction.
   1465  */
   1466 static void _ae_update_state( struct gl_context *ctx )
   1467 {
   1468    AEcontext *actx = AE_CONTEXT(ctx);
   1469    AEarray *aa = actx->arrays;
   1470    AEattrib *at = actx->attribs;
   1471    GLuint i;
   1472    struct gl_array_object *arrayObj = ctx->Array.ArrayObj;
   1473 
   1474    actx->nr_vbos = 0;
   1475 
   1476    /* conventional vertex arrays */
   1477    if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled) {
   1478       aa->array = &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR_INDEX];
   1479       aa->offset = IndexFuncs[TYPE_IDX(aa->array->Type)];
   1480       check_vbo(actx, aa->array->BufferObj);
   1481       aa++;
   1482    }
   1483    if (arrayObj->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Enabled) {
   1484       aa->array = &arrayObj->VertexAttrib[VERT_ATTRIB_EDGEFLAG];
   1485       aa->offset = _gloffset_EdgeFlagv;
   1486       check_vbo(actx, aa->array->BufferObj);
   1487       aa++;
   1488    }
   1489    if (arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) {
   1490       aa->array = &arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL];
   1491       aa->offset = NormalFuncs[TYPE_IDX(aa->array->Type)];
   1492       check_vbo(actx, aa->array->BufferObj);
   1493       aa++;
   1494    }
   1495    if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) {
   1496       aa->array = &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0];
   1497       aa->offset = ColorFuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)];
   1498       check_vbo(actx, aa->array->BufferObj);
   1499       aa++;
   1500    }
   1501    if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR1].Enabled) {
   1502       aa->array = &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR1];
   1503       aa->offset = SecondaryColorFuncs[TYPE_IDX(aa->array->Type)];
   1504       check_vbo(actx, aa->array->BufferObj);
   1505       aa++;
   1506    }
   1507    if (arrayObj->VertexAttrib[VERT_ATTRIB_FOG].Enabled) {
   1508       aa->array = &arrayObj->VertexAttrib[VERT_ATTRIB_FOG];
   1509       aa->offset = FogCoordFuncs[TYPE_IDX(aa->array->Type)];
   1510       check_vbo(actx, aa->array->BufferObj);
   1511       aa++;
   1512    }
   1513    for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
   1514       struct gl_client_array *attribArray = &arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)];
   1515       if (attribArray->Enabled) {
   1516          /* NOTE: we use generic glVertexAttribNV functions here.
   1517           * If we ever remove GL_NV_vertex_program this will have to change.
   1518           */
   1519          at->array = attribArray;
   1520          ASSERT(!at->array->Normalized);
   1521          at->func = AttribFuncsNV[at->array->Normalized]
   1522                                  [at->array->Size-1]
   1523                                  [TYPE_IDX(at->array->Type)];
   1524          at->index = VERT_ATTRIB_TEX0 + i;
   1525 	 check_vbo(actx, at->array->BufferObj);
   1526          at++;
   1527       }
   1528    }
   1529 
   1530    /* generic vertex attribute arrays */
   1531    for (i = 1; i < VERT_ATTRIB_GENERIC_MAX; i++) {  /* skip zero! */
   1532       struct gl_client_array *attribArray = &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)];
   1533       if (attribArray->Enabled) {
   1534          at->array = attribArray;
   1535          /* Note: we can't grab the _glapi_Dispatch->VertexAttrib1fvNV
   1536           * function pointer here (for float arrays) since the pointer may
   1537           * change from one execution of _ae_ArrayElement() to
   1538           * the next.  Doing so caused UT to break.
   1539           */
   1540          if (ctx->VertexProgram._Enabled
   1541              && ctx->VertexProgram.Current->IsNVProgram) {
   1542             at->func = AttribFuncsNV[at->array->Normalized]
   1543                                     [at->array->Size-1]
   1544                                     [TYPE_IDX(at->array->Type)];
   1545          }
   1546          else {
   1547             GLint intOrNorm;
   1548             if (at->array->Integer)
   1549                intOrNorm = 2;
   1550             else if (at->array->Normalized)
   1551                intOrNorm = 1;
   1552             else
   1553                intOrNorm = 0;
   1554 
   1555             at->func = AttribFuncsARB[intOrNorm]
   1556                                      [at->array->Size-1]
   1557                                      [TYPE_IDX(at->array->Type)];
   1558          }
   1559          at->index = i;
   1560 	 check_vbo(actx, at->array->BufferObj);
   1561          at++;
   1562       }
   1563    }
   1564 
   1565    /* finally, vertex position */
   1566    if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC0].Enabled) {
   1567       /* Use glVertex(v) instead of glVertexAttrib(0, v) to be sure it's
   1568        * issued as the last (provoking) attribute).
   1569        */
   1570       aa->array = &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC0];
   1571       assert(aa->array->Size >= 2); /* XXX fix someday? */
   1572       aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
   1573       check_vbo(actx, aa->array->BufferObj);
   1574       aa++;
   1575    }
   1576    else if (arrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled) {
   1577       aa->array = &arrayObj->VertexAttrib[VERT_ATTRIB_POS];
   1578       aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
   1579       check_vbo(actx, aa->array->BufferObj);
   1580       aa++;
   1581    }
   1582 
   1583    check_vbo(actx, arrayObj->ElementArrayBufferObj);
   1584 
   1585    ASSERT(at - actx->attribs <= VERT_ATTRIB_MAX);
   1586    ASSERT(aa - actx->arrays < 32);
   1587    at->func = NULL;  /* terminate the list */
   1588    aa->offset = -1;  /* terminate the list */
   1589 
   1590    actx->NewState = 0;
   1591 }
   1592 
   1593 void _ae_map_vbos( struct gl_context *ctx )
   1594 {
   1595    AEcontext *actx = AE_CONTEXT(ctx);
   1596    GLuint i;
   1597 
   1598    if (actx->mapped_vbos)
   1599       return;
   1600 
   1601    if (actx->NewState)
   1602       _ae_update_state(ctx);
   1603 
   1604    for (i = 0; i < actx->nr_vbos; i++)
   1605       ctx->Driver.MapBufferRange(ctx, 0,
   1606 				 actx->vbo[i]->Size,
   1607 				 GL_MAP_READ_BIT,
   1608 				 actx->vbo[i]);
   1609 
   1610    if (actx->nr_vbos)
   1611       actx->mapped_vbos = GL_TRUE;
   1612 }
   1613 
   1614 void _ae_unmap_vbos( struct gl_context *ctx )
   1615 {
   1616    AEcontext *actx = AE_CONTEXT(ctx);
   1617    GLuint i;
   1618 
   1619    if (!actx->mapped_vbos)
   1620       return;
   1621 
   1622    assert (!actx->NewState);
   1623 
   1624    for (i = 0; i < actx->nr_vbos; i++)
   1625       ctx->Driver.UnmapBuffer(ctx, actx->vbo[i]);
   1626 
   1627    actx->mapped_vbos = GL_FALSE;
   1628 }
   1629 
   1630 
   1631 /**
   1632  * Called via glArrayElement() and glDrawArrays().
   1633  * Issue the glNormal, glVertex, glColor, glVertexAttrib, etc functions
   1634  * for all enabled vertex arrays (for elt-th element).
   1635  * Note: this may be called during display list construction.
   1636  */
   1637 void GLAPIENTRY _ae_ArrayElement( GLint elt )
   1638 {
   1639    GET_CURRENT_CONTEXT(ctx);
   1640    const AEcontext *actx = AE_CONTEXT(ctx);
   1641    const AEarray *aa;
   1642    const AEattrib *at;
   1643    const struct _glapi_table * const disp = GET_DISPATCH();
   1644    GLboolean do_map;
   1645 
   1646    /* If PrimitiveRestart is enabled and the index is the RestartIndex
   1647     * then we call PrimitiveRestartNV and return.
   1648     */
   1649    if (ctx->Array.PrimitiveRestart && (elt == ctx->Array.RestartIndex)) {
   1650       CALL_PrimitiveRestartNV((struct _glapi_table *)disp, ());
   1651       return;
   1652    }
   1653 
   1654    if (actx->NewState) {
   1655       assert(!actx->mapped_vbos);
   1656       _ae_update_state( ctx );
   1657    }
   1658 
   1659    /* Determine if we need to map/unmap VBOs */
   1660    do_map = actx->nr_vbos && !actx->mapped_vbos;
   1661 
   1662    if (do_map)
   1663       _ae_map_vbos(ctx);
   1664 
   1665    /* emit generic attribute elements */
   1666    for (at = actx->attribs; at->func; at++) {
   1667       const GLubyte *src
   1668          = ADD_POINTERS(at->array->BufferObj->Pointer, at->array->Ptr)
   1669          + elt * at->array->StrideB;
   1670       at->func( at->index, src );
   1671    }
   1672 
   1673    /* emit conventional arrays elements */
   1674    for (aa = actx->arrays; aa->offset != -1 ; aa++) {
   1675       const GLubyte *src
   1676          = ADD_POINTERS(aa->array->BufferObj->Pointer, aa->array->Ptr)
   1677          + elt * aa->array->StrideB;
   1678       CALL_by_offset( disp, (array_func), aa->offset,
   1679 		      ((const void *) src) );
   1680    }
   1681 
   1682    if (do_map)
   1683       _ae_unmap_vbos(ctx);
   1684 }
   1685 
   1686 
   1687 void _ae_invalidate_state( struct gl_context *ctx, GLuint new_state )
   1688 {
   1689    AEcontext *actx = AE_CONTEXT(ctx);
   1690 
   1691 
   1692    /* Only interested in this subset of mesa state.  Need to prune
   1693     * this down as both tnl/ and the drivers can raise statechanges
   1694     * for arcane reasons in the middle of seemingly atomic operations
   1695     * like DrawElements, over which we'd like to keep a known set of
   1696     * arrays and vbo's mapped.
   1697     *
   1698     * Luckily, neither the drivers nor tnl muck with the state that
   1699     * concerns us here:
   1700     */
   1701    new_state &= _NEW_ARRAY | _NEW_PROGRAM;
   1702    if (new_state) {
   1703       assert(!actx->mapped_vbos);
   1704       actx->NewState |= new_state;
   1705    }
   1706 }
   1707 
   1708 
   1709 void _mesa_install_arrayelt_vtxfmt(struct _glapi_table *disp,
   1710                                    const GLvertexformat *vfmt)
   1711 {
   1712    SET_ArrayElement(disp, vfmt->ArrayElement);
   1713 }
   1714 
   1715 
   1716 #endif /* FEATURE_arrayelt */
   1717