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