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