replace color table FloatTable boolean with Type enum
[mesa.git] / src / mesa / main / api_arrayelt.c
1 /*
2 * Mesa 3-D graphics library
3 * Version: 6.1
4 *
5 * Copyright (C) 1999-2004 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 /* Author:
26 * Keith Whitwell <keith@tungstengraphics.com>
27 */
28
29 #include "glheader.h"
30 #include "api_arrayelt.h"
31 #include "context.h"
32 #include "glapi.h"
33 #include "imports.h"
34 #include "macros.h"
35 #include "mtypes.h"
36
37 typedef void (GLAPIENTRY *array_func)( const void * );
38
39 typedef struct {
40 const struct gl_client_array *array;
41 array_func func;
42 } AEarray;
43
44 typedef void (GLAPIENTRY *attrib_func)( GLuint indx, const void *data );
45
46 typedef struct {
47 const struct gl_client_array *array;
48 attrib_func func;
49 GLuint index;
50 } AEattrib;
51
52 typedef struct {
53 AEarray arrays[32];
54 AEattrib attribs[VERT_ATTRIB_MAX + 1];
55 GLuint NewState;
56 } AEcontext;
57
58 #define AE_CONTEXT(ctx) ((AEcontext *)(ctx)->aelt_context)
59
60 /*
61 * Convert GL_BYTE, GL_UNSIGNED_BYTE, .. GL_DOUBLE into an integer
62 * in the range [0, 7]. Luckily these type tokens are sequentially
63 * numbered in gl.h
64 */
65 #define TYPE_IDX(t) ((t) & 0xf)
66
67
68 static array_func ColorFuncs[2][8] = {
69 { (array_func)glColor3bv,
70 (array_func)glColor3ubv,
71 (array_func)glColor3sv,
72 (array_func)glColor3usv,
73 (array_func)glColor3iv,
74 (array_func)glColor3uiv,
75 (array_func)glColor3fv,
76 (array_func)glColor3dv },
77
78 { (array_func)glColor4bv,
79 (array_func)glColor4ubv,
80 (array_func)glColor4sv,
81 (array_func)glColor4usv,
82 (array_func)glColor4iv,
83 (array_func)glColor4uiv,
84 (array_func)glColor4fv,
85 (array_func)glColor4dv }
86 };
87
88 static array_func VertexFuncs[3][8] = {
89 { 0,
90 0,
91 (array_func)glVertex2sv,
92 0,
93 (array_func)glVertex2iv,
94 0,
95 (array_func)glVertex2fv,
96 (array_func)glVertex2dv },
97
98 { 0,
99 0,
100 (array_func)glVertex3sv,
101 0,
102 (array_func)glVertex3iv,
103 0,
104 (array_func)glVertex3fv,
105 (array_func)glVertex3dv },
106
107 { 0,
108 0,
109 (array_func)glVertex4sv,
110 0,
111 (array_func)glVertex4iv,
112 0,
113 (array_func)glVertex4fv,
114 (array_func)glVertex4dv }
115 };
116
117 static array_func IndexFuncs[8] = {
118 0,
119 (array_func)glIndexubv,
120 (array_func)glIndexsv,
121 0,
122 (array_func)glIndexiv,
123 0,
124 (array_func)glIndexfv,
125 (array_func)glIndexdv
126 };
127
128 static array_func NormalFuncs[8] = {
129 (array_func)glNormal3bv,
130 0,
131 (array_func)glNormal3sv,
132 0,
133 (array_func)glNormal3iv,
134 0,
135 (array_func)glNormal3fv,
136 (array_func)glNormal3dv,
137 };
138
139
140 /* Wrapper functions in case glSecondaryColor*EXT doesn't exist */
141 static void GLAPIENTRY SecondaryColor3bvEXT(const GLbyte *c)
142 {
143 _glapi_Dispatch->SecondaryColor3bvEXT(c);
144 }
145
146 static void GLAPIENTRY SecondaryColor3ubvEXT(const GLubyte *c)
147 {
148 _glapi_Dispatch->SecondaryColor3ubvEXT(c);
149 }
150
151 static void GLAPIENTRY SecondaryColor3svEXT(const GLshort *c)
152 {
153 _glapi_Dispatch->SecondaryColor3svEXT(c);
154 }
155
156 static void GLAPIENTRY SecondaryColor3usvEXT(const GLushort *c)
157 {
158 _glapi_Dispatch->SecondaryColor3usvEXT(c);
159 }
160
161 static void GLAPIENTRY SecondaryColor3ivEXT(const GLint *c)
162 {
163 _glapi_Dispatch->SecondaryColor3ivEXT(c);
164 }
165
166 static void GLAPIENTRY SecondaryColor3uivEXT(const GLuint *c)
167 {
168 _glapi_Dispatch->SecondaryColor3uivEXT(c);
169 }
170
171 static void GLAPIENTRY SecondaryColor3fvEXT(const GLfloat *c)
172 {
173 _glapi_Dispatch->SecondaryColor3fvEXT(c);
174 }
175
176 static void GLAPIENTRY SecondaryColor3dvEXT(const GLdouble *c)
177 {
178 _glapi_Dispatch->SecondaryColor3dvEXT(c);
179 }
180
181 static array_func SecondaryColorFuncs[8] = {
182 (array_func) SecondaryColor3bvEXT,
183 (array_func) SecondaryColor3ubvEXT,
184 (array_func) SecondaryColor3svEXT,
185 (array_func) SecondaryColor3usvEXT,
186 (array_func) SecondaryColor3ivEXT,
187 (array_func) SecondaryColor3uivEXT,
188 (array_func) SecondaryColor3fvEXT,
189 (array_func) SecondaryColor3dvEXT,
190 };
191
192
193 /* Again, wrapper functions in case glSecondaryColor*EXT doesn't exist */
194 static void GLAPIENTRY FogCoordfvEXT(const GLfloat *f)
195 {
196 _glapi_Dispatch->FogCoordfvEXT(f);
197 }
198
199 static void GLAPIENTRY FogCoorddvEXT(const GLdouble *f)
200 {
201 _glapi_Dispatch->FogCoorddvEXT(f);
202 }
203
204 static array_func FogCoordFuncs[8] = {
205 0,
206 0,
207 0,
208 0,
209 0,
210 0,
211 (array_func) FogCoordfvEXT,
212 (array_func) FogCoorddvEXT
213 };
214
215
216 /**********************************************************************/
217
218 /* GL_BYTE attributes */
219
220 static void GLAPIENTRY VertexAttrib1Nbv(GLuint index, const GLbyte *v)
221 {
222 _glapi_Dispatch->VertexAttrib1fNV(index, BYTE_TO_FLOAT(v[0]));
223 }
224
225 static void GLAPIENTRY VertexAttrib1bv(GLuint index, const GLbyte *v)
226 {
227 _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
228 }
229
230 static void GLAPIENTRY VertexAttrib2Nbv(GLuint index, const GLbyte *v)
231 {
232 _glapi_Dispatch->VertexAttrib2fNV(index, BYTE_TO_FLOAT(v[0]),
233 BYTE_TO_FLOAT(v[1]));
234 }
235
236 static void GLAPIENTRY VertexAttrib2bv(GLuint index, const GLbyte *v)
237 {
238 _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
239 }
240
241 static void GLAPIENTRY VertexAttrib3Nbv(GLuint index, const GLbyte *v)
242 {
243 _glapi_Dispatch->VertexAttrib3fNV(index, BYTE_TO_FLOAT(v[0]),
244 BYTE_TO_FLOAT(v[1]),
245 BYTE_TO_FLOAT(v[2]));
246 }
247
248 static void GLAPIENTRY VertexAttrib3bv(GLuint index, const GLbyte *v)
249 {
250 _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
251 }
252
253 static void GLAPIENTRY VertexAttrib4Nbv(GLuint index, const GLbyte *v)
254 {
255 _glapi_Dispatch->VertexAttrib4fNV(index, BYTE_TO_FLOAT(v[0]),
256 BYTE_TO_FLOAT(v[1]),
257 BYTE_TO_FLOAT(v[2]),
258 BYTE_TO_FLOAT(v[3]));
259 }
260
261 static void GLAPIENTRY VertexAttrib4bv(GLuint index, const GLbyte *v)
262 {
263 _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
264 }
265
266 /* GL_UNSIGNED_BYTE attributes */
267
268 static void GLAPIENTRY VertexAttrib1Nubv(GLuint index, const GLubyte *v)
269 {
270 _glapi_Dispatch->VertexAttrib1fNV(index, UBYTE_TO_FLOAT(v[0]));
271 }
272
273 static void GLAPIENTRY VertexAttrib1ubv(GLuint index, const GLubyte *v)
274 {
275 _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
276 }
277
278 static void GLAPIENTRY VertexAttrib2Nubv(GLuint index, const GLubyte *v)
279 {
280 _glapi_Dispatch->VertexAttrib2fNV(index, UBYTE_TO_FLOAT(v[0]),
281 UBYTE_TO_FLOAT(v[1]));
282 }
283
284 static void GLAPIENTRY VertexAttrib2ubv(GLuint index, const GLubyte *v)
285 {
286 _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
287 }
288
289 static void GLAPIENTRY VertexAttrib3Nubv(GLuint index, const GLubyte *v)
290 {
291 _glapi_Dispatch->VertexAttrib3fNV(index, UBYTE_TO_FLOAT(v[0]),
292 UBYTE_TO_FLOAT(v[1]),
293 UBYTE_TO_FLOAT(v[2]));
294 }
295 static void GLAPIENTRY VertexAttrib3ubv(GLuint index, const GLubyte *v)
296 {
297 _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
298 }
299
300 static void GLAPIENTRY VertexAttrib4Nubv(GLuint index, const GLubyte *v)
301 {
302 _glapi_Dispatch->VertexAttrib4fNV(index, UBYTE_TO_FLOAT(v[0]),
303 UBYTE_TO_FLOAT(v[1]),
304 UBYTE_TO_FLOAT(v[2]),
305 UBYTE_TO_FLOAT(v[3]));
306 }
307
308 static void GLAPIENTRY VertexAttrib4ubv(GLuint index, const GLubyte *v)
309 {
310 _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
311 }
312
313 /* GL_SHORT attributes */
314
315 static void GLAPIENTRY VertexAttrib1Nsv(GLuint index, const GLshort *v)
316 {
317 _glapi_Dispatch->VertexAttrib1fNV(index, SHORT_TO_FLOAT(v[0]));
318 }
319
320 static void GLAPIENTRY VertexAttrib1sv(GLuint index, const GLshort *v)
321 {
322 _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
323 }
324
325 static void GLAPIENTRY VertexAttrib2Nsv(GLuint index, const GLshort *v)
326 {
327 _glapi_Dispatch->VertexAttrib2fNV(index, SHORT_TO_FLOAT(v[0]),
328 SHORT_TO_FLOAT(v[1]));
329 }
330
331 static void GLAPIENTRY VertexAttrib2sv(GLuint index, const GLshort *v)
332 {
333 _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
334 }
335
336 static void GLAPIENTRY VertexAttrib3Nsv(GLuint index, const GLshort *v)
337 {
338 _glapi_Dispatch->VertexAttrib3fNV(index, SHORT_TO_FLOAT(v[0]),
339 SHORT_TO_FLOAT(v[1]),
340 SHORT_TO_FLOAT(v[2]));
341 }
342
343 static void GLAPIENTRY VertexAttrib3sv(GLuint index, const GLshort *v)
344 {
345 _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
346 }
347
348 static void GLAPIENTRY VertexAttrib4Nsv(GLuint index, const GLshort *v)
349 {
350 _glapi_Dispatch->VertexAttrib4fNV(index, SHORT_TO_FLOAT(v[0]),
351 SHORT_TO_FLOAT(v[1]),
352 SHORT_TO_FLOAT(v[2]),
353 SHORT_TO_FLOAT(v[3]));
354 }
355
356 static void GLAPIENTRY VertexAttrib4sv(GLuint index, const GLshort *v)
357 {
358 _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
359 }
360
361 /* GL_UNSIGNED_SHORT attributes */
362
363 static void GLAPIENTRY VertexAttrib1Nusv(GLuint index, const GLushort *v)
364 {
365 _glapi_Dispatch->VertexAttrib1fNV(index, USHORT_TO_FLOAT(v[0]));
366 }
367
368 static void GLAPIENTRY VertexAttrib1usv(GLuint index, const GLushort *v)
369 {
370 _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
371 }
372
373 static void GLAPIENTRY VertexAttrib2Nusv(GLuint index, const GLushort *v)
374 {
375 _glapi_Dispatch->VertexAttrib2fNV(index, USHORT_TO_FLOAT(v[0]),
376 USHORT_TO_FLOAT(v[1]));
377 }
378
379 static void GLAPIENTRY VertexAttrib2usv(GLuint index, const GLushort *v)
380 {
381 _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
382 }
383
384 static void GLAPIENTRY VertexAttrib3Nusv(GLuint index, const GLushort *v)
385 {
386 _glapi_Dispatch->VertexAttrib3fNV(index, USHORT_TO_FLOAT(v[0]),
387 USHORT_TO_FLOAT(v[1]),
388 USHORT_TO_FLOAT(v[2]));
389 }
390
391 static void GLAPIENTRY VertexAttrib3usv(GLuint index, const GLushort *v)
392 {
393 _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
394 }
395
396 static void GLAPIENTRY VertexAttrib4Nusv(GLuint index, const GLushort *v)
397 {
398 _glapi_Dispatch->VertexAttrib4fNV(index, USHORT_TO_FLOAT(v[0]),
399 USHORT_TO_FLOAT(v[1]),
400 USHORT_TO_FLOAT(v[2]),
401 USHORT_TO_FLOAT(v[3]));
402 }
403
404 static void GLAPIENTRY VertexAttrib4usv(GLuint index, const GLushort *v)
405 {
406 _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
407 }
408
409 /* GL_INT attributes */
410
411 static void GLAPIENTRY VertexAttrib1Niv(GLuint index, const GLint *v)
412 {
413 _glapi_Dispatch->VertexAttrib1fNV(index, INT_TO_FLOAT(v[0]));
414 }
415
416 static void GLAPIENTRY VertexAttrib1iv(GLuint index, const GLint *v)
417 {
418 _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
419 }
420
421 static void GLAPIENTRY VertexAttrib2Niv(GLuint index, const GLint *v)
422 {
423 _glapi_Dispatch->VertexAttrib2fNV(index, INT_TO_FLOAT(v[0]),
424 INT_TO_FLOAT(v[1]));
425 }
426
427 static void GLAPIENTRY VertexAttrib2iv(GLuint index, const GLint *v)
428 {
429 _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
430 }
431
432 static void GLAPIENTRY VertexAttrib3Niv(GLuint index, const GLint *v)
433 {
434 _glapi_Dispatch->VertexAttrib3fNV(index, INT_TO_FLOAT(v[0]),
435 INT_TO_FLOAT(v[1]),
436 INT_TO_FLOAT(v[2]));
437 }
438
439 static void GLAPIENTRY VertexAttrib3iv(GLuint index, const GLint *v)
440 {
441 _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
442 }
443
444 static void GLAPIENTRY VertexAttrib4Niv(GLuint index, const GLint *v)
445 {
446 _glapi_Dispatch->VertexAttrib4fNV(index, INT_TO_FLOAT(v[0]),
447 INT_TO_FLOAT(v[1]),
448 INT_TO_FLOAT(v[2]),
449 INT_TO_FLOAT(v[3]));
450 }
451
452 static void GLAPIENTRY VertexAttrib4iv(GLuint index, const GLint *v)
453 {
454 _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
455 }
456
457 /* GL_UNSIGNED_INT attributes */
458
459 static void GLAPIENTRY VertexAttrib1Nuiv(GLuint index, const GLuint *v)
460 {
461 _glapi_Dispatch->VertexAttrib1fNV(index, UINT_TO_FLOAT(v[0]));
462 }
463
464 static void GLAPIENTRY VertexAttrib1uiv(GLuint index, const GLuint *v)
465 {
466 _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
467 }
468
469 static void GLAPIENTRY VertexAttrib2Nuiv(GLuint index, const GLuint *v)
470 {
471 _glapi_Dispatch->VertexAttrib2fNV(index, UINT_TO_FLOAT(v[0]),
472 UINT_TO_FLOAT(v[1]));
473 }
474
475 static void GLAPIENTRY VertexAttrib2uiv(GLuint index, const GLuint *v)
476 {
477 _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
478 }
479
480 static void GLAPIENTRY VertexAttrib3Nuiv(GLuint index, const GLuint *v)
481 {
482 _glapi_Dispatch->VertexAttrib3fNV(index, UINT_TO_FLOAT(v[0]),
483 UINT_TO_FLOAT(v[1]),
484 UINT_TO_FLOAT(v[2]));
485 }
486
487 static void GLAPIENTRY VertexAttrib3uiv(GLuint index, const GLuint *v)
488 {
489 _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
490 }
491
492 static void GLAPIENTRY VertexAttrib4Nuiv(GLuint index, const GLuint *v)
493 {
494 _glapi_Dispatch->VertexAttrib4fNV(index, UINT_TO_FLOAT(v[0]),
495 UINT_TO_FLOAT(v[1]),
496 UINT_TO_FLOAT(v[2]),
497 UINT_TO_FLOAT(v[3]));
498 }
499
500 static void GLAPIENTRY VertexAttrib4uiv(GLuint index, const GLuint *v)
501 {
502 _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
503 }
504
505 /* GL_FLOAT attributes */
506
507 static void GLAPIENTRY VertexAttrib1fv(GLuint index, const GLfloat *v)
508 {
509 _glapi_Dispatch->VertexAttrib1fvNV(index, v);
510 }
511
512 static void GLAPIENTRY VertexAttrib2fv(GLuint index, const GLfloat *v)
513 {
514 _glapi_Dispatch->VertexAttrib2fvNV(index, v);
515 }
516
517 static void GLAPIENTRY VertexAttrib3fv(GLuint index, const GLfloat *v)
518 {
519 _glapi_Dispatch->VertexAttrib3fvNV(index, v);
520 }
521
522 static void GLAPIENTRY VertexAttrib4fv(GLuint index, const GLfloat *v)
523 {
524 _glapi_Dispatch->VertexAttrib4fvNV(index, v);
525 }
526
527 /* GL_DOUBLE attributes */
528
529 static void GLAPIENTRY VertexAttrib1dv(GLuint index, const GLdouble *v)
530 {
531 _glapi_Dispatch->VertexAttrib1dvNV(index, v);
532 }
533
534 static void GLAPIENTRY VertexAttrib2dv(GLuint index, const GLdouble *v)
535 {
536 _glapi_Dispatch->VertexAttrib2dvNV(index, v);
537 }
538
539 static void GLAPIENTRY VertexAttrib3dv(GLuint index, const GLdouble *v)
540 {
541 _glapi_Dispatch->VertexAttrib3dvNV(index, v);
542 }
543
544 static void GLAPIENTRY VertexAttrib4dv(GLuint index, const GLdouble *v)
545 {
546 _glapi_Dispatch->VertexAttrib4dvNV(index, v);
547 }
548
549
550 /*
551 * Array [size][type] of VertexAttrib functions
552 */
553 static attrib_func AttribFuncs[2][4][8] = {
554 {
555 /* non-normalized */
556 {
557 /* size 1 */
558 (attrib_func) VertexAttrib1bv,
559 (attrib_func) VertexAttrib1ubv,
560 (attrib_func) VertexAttrib1sv,
561 (attrib_func) VertexAttrib1usv,
562 (attrib_func) VertexAttrib1iv,
563 (attrib_func) VertexAttrib1uiv,
564 (attrib_func) VertexAttrib1fv,
565 (attrib_func) VertexAttrib1dv
566 },
567 {
568 /* size 2 */
569 (attrib_func) VertexAttrib2bv,
570 (attrib_func) VertexAttrib2ubv,
571 (attrib_func) VertexAttrib2sv,
572 (attrib_func) VertexAttrib2usv,
573 (attrib_func) VertexAttrib2iv,
574 (attrib_func) VertexAttrib2uiv,
575 (attrib_func) VertexAttrib2fv,
576 (attrib_func) VertexAttrib2dv
577 },
578 {
579 /* size 3 */
580 (attrib_func) VertexAttrib3bv,
581 (attrib_func) VertexAttrib3ubv,
582 (attrib_func) VertexAttrib3sv,
583 (attrib_func) VertexAttrib3usv,
584 (attrib_func) VertexAttrib3iv,
585 (attrib_func) VertexAttrib3uiv,
586 (attrib_func) VertexAttrib3fv,
587 (attrib_func) VertexAttrib3dv
588 },
589 {
590 /* size 4 */
591 (attrib_func) VertexAttrib4bv,
592 (attrib_func) VertexAttrib4ubv,
593 (attrib_func) VertexAttrib4sv,
594 (attrib_func) VertexAttrib4usv,
595 (attrib_func) VertexAttrib4iv,
596 (attrib_func) VertexAttrib4uiv,
597 (attrib_func) VertexAttrib4fv,
598 (attrib_func) VertexAttrib4dv
599 }
600 },
601 {
602 /* normalized (except for float/double) */
603 {
604 /* size 1 */
605 (attrib_func) VertexAttrib1Nbv,
606 (attrib_func) VertexAttrib1Nubv,
607 (attrib_func) VertexAttrib1Nsv,
608 (attrib_func) VertexAttrib1Nusv,
609 (attrib_func) VertexAttrib1Niv,
610 (attrib_func) VertexAttrib1Nuiv,
611 (attrib_func) VertexAttrib1fv,
612 (attrib_func) VertexAttrib1dv
613 },
614 {
615 /* size 2 */
616 (attrib_func) VertexAttrib2Nbv,
617 (attrib_func) VertexAttrib2Nubv,
618 (attrib_func) VertexAttrib2Nsv,
619 (attrib_func) VertexAttrib2Nusv,
620 (attrib_func) VertexAttrib2Niv,
621 (attrib_func) VertexAttrib2Nuiv,
622 (attrib_func) VertexAttrib2fv,
623 (attrib_func) VertexAttrib2dv
624 },
625 {
626 /* size 3 */
627 (attrib_func) VertexAttrib3Nbv,
628 (attrib_func) VertexAttrib3Nubv,
629 (attrib_func) VertexAttrib3Nsv,
630 (attrib_func) VertexAttrib3Nusv,
631 (attrib_func) VertexAttrib3Niv,
632 (attrib_func) VertexAttrib3Nuiv,
633 (attrib_func) VertexAttrib3fv,
634 (attrib_func) VertexAttrib3dv
635 },
636 {
637 /* size 4 */
638 (attrib_func) VertexAttrib4Nbv,
639 (attrib_func) VertexAttrib4Nubv,
640 (attrib_func) VertexAttrib4Nsv,
641 (attrib_func) VertexAttrib4Nusv,
642 (attrib_func) VertexAttrib4Niv,
643 (attrib_func) VertexAttrib4Nuiv,
644 (attrib_func) VertexAttrib4fv,
645 (attrib_func) VertexAttrib4dv
646 }
647 }
648 };
649
650 /**********************************************************************/
651
652
653 GLboolean _ae_create_context( GLcontext *ctx )
654 {
655 if (ctx->aelt_context)
656 return GL_TRUE;
657
658 ctx->aelt_context = MALLOC( sizeof(AEcontext) );
659 if (!ctx->aelt_context)
660 return GL_FALSE;
661
662 AE_CONTEXT(ctx)->NewState = ~0;
663 return GL_TRUE;
664 }
665
666
667 void _ae_destroy_context( GLcontext *ctx )
668 {
669 if ( AE_CONTEXT( ctx ) ) {
670 FREE( ctx->aelt_context );
671 ctx->aelt_context = 0;
672 }
673 }
674
675
676 /**
677 * Make a list of per-vertex functions to call for each glArrayElement call.
678 * These functions access the array data (i.e. glVertex, glColor, glNormal,
679 * etc).
680 * Note: this may be called during display list construction.
681 */
682 static void _ae_update_state( GLcontext *ctx )
683 {
684 AEcontext *actx = AE_CONTEXT(ctx);
685 AEarray *aa = actx->arrays;
686 AEattrib *at = actx->attribs;
687 GLuint i;
688
689 /* conventional vertex arrays */
690 if (ctx->Array.Index.Enabled) {
691 aa->array = &ctx->Array.Index;
692 aa->func = IndexFuncs[TYPE_IDX(aa->array->Type)];
693 aa++;
694 }
695 if (ctx->Array.EdgeFlag.Enabled) {
696 aa->array = &ctx->Array.EdgeFlag;
697 aa->func = (array_func) glEdgeFlagv;
698 aa++;
699 }
700 if (ctx->Array.Normal.Enabled) {
701 aa->array = &ctx->Array.Normal;
702 aa->func = NormalFuncs[TYPE_IDX(aa->array->Type)];
703 aa++;
704 }
705 if (ctx->Array.Color.Enabled) {
706 aa->array = &ctx->Array.Color;
707 aa->func = ColorFuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)];
708 aa++;
709 }
710 if (ctx->Array.SecondaryColor.Enabled) {
711 aa->array = &ctx->Array.SecondaryColor;
712 aa->func = SecondaryColorFuncs[TYPE_IDX(aa->array->Type)];
713 aa++;
714 }
715 if (ctx->Array.FogCoord.Enabled) {
716 aa->array = &ctx->Array.FogCoord;
717 aa->func = FogCoordFuncs[TYPE_IDX(aa->array->Type)];
718 aa++;
719 }
720 for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
721 if (ctx->Array.TexCoord[i].Enabled) {
722 /* NOTE: we use generic glVertexAttrib functions here.
723 * If we ever de-alias conventional/generic vertex attribs this
724 * will have to change.
725 */
726 struct gl_client_array *attribArray = &ctx->Array.TexCoord[i];
727 at->array = attribArray;
728 at->func = AttribFuncs[at->array->Normalized][at->array->Size-1][TYPE_IDX(at->array->Type)];
729 at->index = VERT_ATTRIB_TEX0 + i;
730 at++;
731 }
732 }
733
734 /* generic vertex attribute arrays */
735 for (i = 1; i < VERT_ATTRIB_MAX; i++) { /* skip zero! */
736 if (ctx->Array.VertexAttrib[i].Enabled) {
737 struct gl_client_array *attribArray = &ctx->Array.VertexAttrib[i];
738 at->array = attribArray;
739 /* Note: we can't grab the _glapi_Dispatch->VertexAttrib1fvNV
740 * function pointer here (for float arrays) since the pointer may
741 * change from one execution of _ae_loopback_array_elt() to
742 * the next. Doing so caused UT to break.
743 */
744 at->func = AttribFuncs[at->array->Normalized][at->array->Size-1][TYPE_IDX(at->array->Type)];
745 at->index = i;
746 at++;
747 }
748 }
749
750 /* finally, vertex position */
751 if (ctx->Array.VertexAttrib[0].Enabled) {
752 /* Use glVertex(v) instead of glVertexAttrib(0, v) to be sure it's
753 * issued as the last (proviking) attribute).
754 */
755 aa->array = &ctx->Array.VertexAttrib[0];
756 assert(aa->array->Size >= 2); /* XXX fix someday? */
757 aa->func = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
758 aa++;
759 }
760 else if (ctx->Array.Vertex.Enabled) {
761 aa->array = &ctx->Array.Vertex;
762 aa->func = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
763 aa++;
764 }
765
766 ASSERT(at - actx->attribs <= VERT_ATTRIB_MAX);
767 ASSERT(aa - actx->arrays < 32);
768 at->func = NULL; /* terminate the list */
769 aa->func = NULL; /* terminate the list */
770
771 actx->NewState = 0;
772 }
773
774
775 /**
776 * Called via glArrayElement() and glDrawArrays().
777 * Issue the glNormal, glVertex, glColor, glVertexAttrib, etc functions
778 * for all enabled vertex arrays (for elt-th element).
779 * Note: this may be called during display list construction.
780 */
781 void GLAPIENTRY _ae_loopback_array_elt( GLint elt )
782 {
783 GET_CURRENT_CONTEXT(ctx);
784 const AEcontext *actx = AE_CONTEXT(ctx);
785 const AEarray *aa;
786 const AEattrib *at;
787
788 if (actx->NewState)
789 _ae_update_state( ctx );
790
791 /* generic attributes */
792 for (at = actx->attribs; at->func; at++) {
793 const GLubyte *src = at->array->BufferObj->Data
794 + (GLuint) at->array->Ptr
795 + elt * at->array->StrideB;
796 at->func( at->index, src );
797 }
798
799 /* conventional arrays */
800 for (aa = actx->arrays; aa->func ; aa++) {
801 const GLubyte *src = aa->array->BufferObj->Data
802 + (GLuint) aa->array->Ptr
803 + elt * aa->array->StrideB;
804 aa->func( src );
805 }
806 }
807
808
809
810 void _ae_invalidate_state( GLcontext *ctx, GLuint new_state )
811 {
812 AE_CONTEXT(ctx)->NewState |= new_state;
813 }