OSDN Git Service

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