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