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