mesa: implement integer-valued vertex attribute functions
[mesa.git] / src / mesa / vbo / vbo_attrib_tmp.h
1 /**************************************************************************
2
3 Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas.
4
5 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 on the rights to use, copy, modify, merge, publish, distribute, sub
11 license, and/or sell copies of the Software, and to permit persons to whom
12 the Software is furnished to do so, subject to the following conditions:
13
14 The above copyright notice and this permission notice (including the next
15 paragraph) shall be included in all copies or substantial portions of the
16 Software.
17
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21 TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22 DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24 USE OR OTHER DEALINGS IN THE SOFTWARE.
25
26 **************************************************************************/
27
28 /* float */
29 #define ATTR1FV( A, V ) ATTR( A, 1, (V)[0], 0, 0, 1 )
30 #define ATTR2FV( A, V ) ATTR( A, 2, (V)[0], (V)[1], 0, 1 )
31 #define ATTR3FV( A, V ) ATTR( A, 3, (V)[0], (V)[1], (V)[2], 1 )
32 #define ATTR4FV( A, V ) ATTR( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
33
34 #define ATTR1F( A, X ) ATTR( A, 1, X, 0, 0, 1 )
35 #define ATTR2F( A, X, Y ) ATTR( A, 2, X, Y, 0, 1 )
36 #define ATTR3F( A, X, Y, Z ) ATTR( A, 3, X, Y, Z, 1 )
37 #define ATTR4F( A, X, Y, Z, W ) ATTR( A, 4, X, Y, Z, W )
38
39 /* int */
40 #define ATTR2IV( A, V ) ATTR( A, 2, (V)[0], (V)[1], 0, 1 )
41 #define ATTR3IV( A, V ) ATTR( A, 3, (V)[0], (V)[1], (V)[2], 1 )
42 #define ATTR4IV( A, V ) ATTR( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
43
44 #define ATTR1I( A, X ) ATTR( A, 1, X, 0, 0, 1 )
45 #define ATTR2I( A, X, Y ) ATTR( A, 2, X, Y, 0, 1 )
46 #define ATTR3I( A, X, Y, Z ) ATTR( A, 3, X, Y, Z, 1 )
47 #define ATTR4I( A, X, Y, Z, W ) ATTR( A, 4, X, Y, Z, W )
48
49
50 /* uint */
51 #define ATTR2UIV( A, V ) ATTR( A, 2, (V)[0], (V)[1], 0, 1 )
52 #define ATTR3UIV( A, V ) ATTR( A, 3, (V)[0], (V)[1], (V)[2], 1 )
53 #define ATTR4UIV( A, V ) ATTR( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
54
55 #define ATTR1UI( A, X ) ATTR( A, 1, X, 0, 0, 1 )
56 #define ATTR2UI( A, X, Y ) ATTR( A, 2, X, Y, 0, 1 )
57 #define ATTR3UI( A, X, Y, Z ) ATTR( A, 3, X, Y, Z, 1 )
58 #define ATTR4UI( A, X, Y, Z, W ) ATTR( A, 4, X, Y, Z, W )
59
60 #define MAT_ATTR( A, N, V ) ATTR( A, N, (V)[0], (V)[1], (V)[2], (V)[3] )
61
62
63
64 static void GLAPIENTRY
65 TAG(Vertex2f)(GLfloat x, GLfloat y)
66 {
67 GET_CURRENT_CONTEXT(ctx);
68 ATTR2F(VBO_ATTRIB_POS, x, y);
69 }
70
71 static void GLAPIENTRY
72 TAG(Vertex2fv)(const GLfloat * v)
73 {
74 GET_CURRENT_CONTEXT(ctx);
75 ATTR2FV(VBO_ATTRIB_POS, v);
76 }
77
78 static void GLAPIENTRY
79 TAG(Vertex3f)(GLfloat x, GLfloat y, GLfloat z)
80 {
81 GET_CURRENT_CONTEXT(ctx);
82 ATTR3F(VBO_ATTRIB_POS, x, y, z);
83 }
84
85 static void GLAPIENTRY
86 TAG(Vertex3fv)(const GLfloat * v)
87 {
88 GET_CURRENT_CONTEXT(ctx);
89 ATTR3FV(VBO_ATTRIB_POS, v);
90 }
91
92 static void GLAPIENTRY
93 TAG(Vertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
94 {
95 GET_CURRENT_CONTEXT(ctx);
96 ATTR4F(VBO_ATTRIB_POS, x, y, z, w);
97 }
98
99 static void GLAPIENTRY
100 TAG(Vertex4fv)(const GLfloat * v)
101 {
102 GET_CURRENT_CONTEXT(ctx);
103 ATTR4FV(VBO_ATTRIB_POS, v);
104 }
105
106
107
108 static void GLAPIENTRY
109 TAG(TexCoord1f)(GLfloat x)
110 {
111 GET_CURRENT_CONTEXT(ctx);
112 ATTR1F(VBO_ATTRIB_TEX0, x);
113 }
114
115 static void GLAPIENTRY
116 TAG(TexCoord1fv)(const GLfloat * v)
117 {
118 GET_CURRENT_CONTEXT(ctx);
119 ATTR1FV(VBO_ATTRIB_TEX0, v);
120 }
121
122 static void GLAPIENTRY
123 TAG(TexCoord2f)(GLfloat x, GLfloat y)
124 {
125 GET_CURRENT_CONTEXT(ctx);
126 ATTR2F(VBO_ATTRIB_TEX0, x, y);
127 }
128
129 static void GLAPIENTRY
130 TAG(TexCoord2fv)(const GLfloat * v)
131 {
132 GET_CURRENT_CONTEXT(ctx);
133 ATTR2FV(VBO_ATTRIB_TEX0, v);
134 }
135
136 static void GLAPIENTRY
137 TAG(TexCoord3f)(GLfloat x, GLfloat y, GLfloat z)
138 {
139 GET_CURRENT_CONTEXT(ctx);
140 ATTR3F(VBO_ATTRIB_TEX0, x, y, z);
141 }
142
143 static void GLAPIENTRY
144 TAG(TexCoord3fv)(const GLfloat * v)
145 {
146 GET_CURRENT_CONTEXT(ctx);
147 ATTR3FV(VBO_ATTRIB_TEX0, v);
148 }
149
150 static void GLAPIENTRY
151 TAG(TexCoord4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
152 {
153 GET_CURRENT_CONTEXT(ctx);
154 ATTR4F(VBO_ATTRIB_TEX0, x, y, z, w);
155 }
156
157 static void GLAPIENTRY
158 TAG(TexCoord4fv)(const GLfloat * v)
159 {
160 GET_CURRENT_CONTEXT(ctx);
161 ATTR4FV(VBO_ATTRIB_TEX0, v);
162 }
163
164
165
166 static void GLAPIENTRY
167 TAG(Normal3f)(GLfloat x, GLfloat y, GLfloat z)
168 {
169 GET_CURRENT_CONTEXT(ctx);
170 ATTR3F(VBO_ATTRIB_NORMAL, x, y, z);
171 }
172
173 static void GLAPIENTRY
174 TAG(Normal3fv)(const GLfloat * v)
175 {
176 GET_CURRENT_CONTEXT(ctx);
177 ATTR3FV(VBO_ATTRIB_NORMAL, v);
178 }
179
180
181
182 static void GLAPIENTRY
183 TAG(FogCoordfEXT)(GLfloat x)
184 {
185 GET_CURRENT_CONTEXT(ctx);
186 ATTR1F(VBO_ATTRIB_FOG, x);
187 }
188
189
190
191 static void GLAPIENTRY
192 TAG(FogCoordfvEXT)(const GLfloat * v)
193 {
194 GET_CURRENT_CONTEXT(ctx);
195 ATTR1FV(VBO_ATTRIB_FOG, v);
196 }
197
198 static void GLAPIENTRY
199 TAG(Color3f)(GLfloat x, GLfloat y, GLfloat z)
200 {
201 GET_CURRENT_CONTEXT(ctx);
202 ATTR3F(VBO_ATTRIB_COLOR0, x, y, z);
203 }
204
205 static void GLAPIENTRY
206 TAG(Color3fv)(const GLfloat * v)
207 {
208 GET_CURRENT_CONTEXT(ctx);
209 ATTR3FV(VBO_ATTRIB_COLOR0, v);
210 }
211
212 static void GLAPIENTRY
213 TAG(Color4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
214 {
215 GET_CURRENT_CONTEXT(ctx);
216 ATTR4F(VBO_ATTRIB_COLOR0, x, y, z, w);
217 }
218
219 static void GLAPIENTRY
220 TAG(Color4fv)(const GLfloat * v)
221 {
222 GET_CURRENT_CONTEXT(ctx);
223 ATTR4FV(VBO_ATTRIB_COLOR0, v);
224 }
225
226
227
228 static void GLAPIENTRY
229 TAG(SecondaryColor3fEXT)(GLfloat x, GLfloat y, GLfloat z)
230 {
231 GET_CURRENT_CONTEXT(ctx);
232 ATTR3F(VBO_ATTRIB_COLOR1, x, y, z);
233 }
234
235 static void GLAPIENTRY
236 TAG(SecondaryColor3fvEXT)(const GLfloat * v)
237 {
238 GET_CURRENT_CONTEXT(ctx);
239 ATTR3FV(VBO_ATTRIB_COLOR1, v);
240 }
241
242
243
244 static void GLAPIENTRY
245 TAG(EdgeFlag)(GLboolean b)
246 {
247 GET_CURRENT_CONTEXT(ctx);
248 ATTR1F(VBO_ATTRIB_EDGEFLAG, (GLfloat) b);
249 }
250
251
252
253 static void GLAPIENTRY
254 TAG(Indexf)(GLfloat f)
255 {
256 GET_CURRENT_CONTEXT(ctx);
257 ATTR1F(VBO_ATTRIB_INDEX, f);
258 }
259
260 static void GLAPIENTRY
261 TAG(Indexfv)(const GLfloat * f)
262 {
263 GET_CURRENT_CONTEXT(ctx);
264 ATTR1FV(VBO_ATTRIB_INDEX, f);
265 }
266
267
268
269 static void GLAPIENTRY
270 TAG(MultiTexCoord1f)(GLenum target, GLfloat x)
271 {
272 GET_CURRENT_CONTEXT(ctx);
273 GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
274 ATTR1F(attr, x);
275 }
276
277 static void GLAPIENTRY
278 TAG(MultiTexCoord1fv)(GLenum target, const GLfloat * v)
279 {
280 GET_CURRENT_CONTEXT(ctx);
281 GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
282 ATTR1FV(attr, v);
283 }
284
285 static void GLAPIENTRY
286 TAG(MultiTexCoord2f)(GLenum target, GLfloat x, GLfloat y)
287 {
288 GET_CURRENT_CONTEXT(ctx);
289 GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
290 ATTR2F(attr, x, y);
291 }
292
293 static void GLAPIENTRY
294 TAG(MultiTexCoord2fv)(GLenum target, const GLfloat * v)
295 {
296 GET_CURRENT_CONTEXT(ctx);
297 GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
298 ATTR2FV(attr, v);
299 }
300
301 static void GLAPIENTRY
302 TAG(MultiTexCoord3f)(GLenum target, GLfloat x, GLfloat y, GLfloat z)
303 {
304 GET_CURRENT_CONTEXT(ctx);
305 GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
306 ATTR3F(attr, x, y, z);
307 }
308
309 static void GLAPIENTRY
310 TAG(MultiTexCoord3fv)(GLenum target, const GLfloat * v)
311 {
312 GET_CURRENT_CONTEXT(ctx);
313 GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
314 ATTR3FV(attr, v);
315 }
316
317 static void GLAPIENTRY
318 TAG(MultiTexCoord4f)(GLenum target, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
319 {
320 GET_CURRENT_CONTEXT(ctx);
321 GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
322 ATTR4F(attr, x, y, z, w);
323 }
324
325 static void GLAPIENTRY
326 TAG(MultiTexCoord4fv)(GLenum target, const GLfloat * v)
327 {
328 GET_CURRENT_CONTEXT(ctx);
329 GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
330 ATTR4FV(attr, v);
331 }
332
333
334
335 static void GLAPIENTRY
336 TAG(VertexAttrib1fARB)(GLuint index, GLfloat x)
337 {
338 GET_CURRENT_CONTEXT(ctx);
339 if (index == 0)
340 ATTR1F(0, x);
341 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
342 ATTR1F(VBO_ATTRIB_GENERIC0 + index, x);
343 else
344 ERROR();
345 }
346
347 static void GLAPIENTRY
348 TAG(VertexAttrib1fvARB)(GLuint index, const GLfloat * v)
349 {
350 GET_CURRENT_CONTEXT(ctx);
351 if (index == 0)
352 ATTR1FV(0, v);
353 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
354 ATTR1FV(VBO_ATTRIB_GENERIC0 + index, v);
355 else
356 ERROR();
357 }
358
359 static void GLAPIENTRY
360 TAG(VertexAttrib2fARB)(GLuint index, GLfloat x, GLfloat y)
361 {
362 GET_CURRENT_CONTEXT(ctx);
363 if (index == 0)
364 ATTR2F(0, x, y);
365 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
366 ATTR2F(VBO_ATTRIB_GENERIC0 + index, x, y);
367 else
368 ERROR();
369 }
370
371 static void GLAPIENTRY
372 TAG(VertexAttrib2fvARB)(GLuint index, const GLfloat * v)
373 {
374 GET_CURRENT_CONTEXT(ctx);
375 if (index == 0)
376 ATTR2FV(0, v);
377 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
378 ATTR2FV(VBO_ATTRIB_GENERIC0 + index, v);
379 else
380 ERROR();
381 }
382
383 static void GLAPIENTRY
384 TAG(VertexAttrib3fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z)
385 {
386 GET_CURRENT_CONTEXT(ctx);
387 if (index == 0)
388 ATTR3F(0, x, y, z);
389 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
390 ATTR3F(VBO_ATTRIB_GENERIC0 + index, x, y, z);
391 else
392 ERROR();
393 }
394
395 static void GLAPIENTRY
396 TAG(VertexAttrib3fvARB)(GLuint index, const GLfloat * v)
397 {
398 GET_CURRENT_CONTEXT(ctx);
399 if (index == 0)
400 ATTR3FV(0, v);
401 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
402 ATTR3FV(VBO_ATTRIB_GENERIC0 + index, v);
403 else
404 ERROR();
405 }
406
407 static void GLAPIENTRY
408 TAG(VertexAttrib4fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
409 {
410 GET_CURRENT_CONTEXT(ctx);
411 if (index == 0)
412 ATTR4F(0, x, y, z, w);
413 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
414 ATTR4F(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
415 else
416 ERROR();
417 }
418
419 static void GLAPIENTRY
420 TAG(VertexAttrib4fvARB)(GLuint index, const GLfloat * v)
421 {
422 GET_CURRENT_CONTEXT(ctx);
423 if (index == 0)
424 ATTR4FV(0, v);
425 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
426 ATTR4FV(VBO_ATTRIB_GENERIC0 + index, v);
427 else
428 ERROR();
429 }
430
431
432
433 /* Integer-valued generic attributes.
434 * XXX: the integers just get converted to floats at this time
435 */
436 static void GLAPIENTRY
437 TAG(VertexAttribI1i)(GLuint index, GLint x)
438 {
439 GET_CURRENT_CONTEXT(ctx);
440 if (index == 0)
441 ATTR1I(0, x);
442 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
443 ATTR1I(VBO_ATTRIB_GENERIC0 + index, x);
444 else
445 ERROR();
446 }
447
448 static void GLAPIENTRY
449 TAG(VertexAttribI2i)(GLuint index, GLint x, GLint y)
450 {
451 GET_CURRENT_CONTEXT(ctx);
452 if (index == 0)
453 ATTR2I(0, x, y);
454 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
455 ATTR2I(VBO_ATTRIB_GENERIC0 + index, x, y);
456 else
457 ERROR();
458 }
459
460 static void GLAPIENTRY
461 TAG(VertexAttribI3i)(GLuint index, GLint x, GLint y, GLint z)
462 {
463 GET_CURRENT_CONTEXT(ctx);
464 if (index == 0)
465 ATTR3I(0, x, y, z);
466 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
467 ATTR3I(VBO_ATTRIB_GENERIC0 + index, x, y, z);
468 else
469 ERROR();
470 }
471
472 static void GLAPIENTRY
473 TAG(VertexAttribI4i)(GLuint index, GLint x, GLint y, GLint z, GLint w)
474 {
475 GET_CURRENT_CONTEXT(ctx);
476 if (index == 0)
477 ATTR4I(0, x, y, z, w);
478 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
479 ATTR4I(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
480 else
481 ERROR();
482 }
483
484 static void GLAPIENTRY
485 TAG(VertexAttribI2iv)(GLuint index, const GLint *v)
486 {
487 GET_CURRENT_CONTEXT(ctx);
488 if (index == 0)
489 ATTR2IV(0, v);
490 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
491 ATTR2IV(VBO_ATTRIB_GENERIC0 + index, v);
492 else
493 ERROR();
494 }
495
496 static void GLAPIENTRY
497 TAG(VertexAttribI3iv)(GLuint index, const GLint *v)
498 {
499 GET_CURRENT_CONTEXT(ctx);
500 if (index == 0)
501 ATTR3IV(0, v);
502 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
503 ATTR3IV(VBO_ATTRIB_GENERIC0 + index, v);
504 else
505 ERROR();
506 }
507
508 static void GLAPIENTRY
509 TAG(VertexAttribI4iv)(GLuint index, const GLint *v)
510 {
511 GET_CURRENT_CONTEXT(ctx);
512 if (index == 0)
513 ATTR4IV(0, v);
514 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
515 ATTR4IV(VBO_ATTRIB_GENERIC0 + index, v);
516 else
517 ERROR();
518 }
519
520
521
522 /* Unsigned integer-valued generic attributes.
523 * XXX: the integers just get converted to floats at this time
524 */
525 static void GLAPIENTRY
526 TAG(VertexAttribI1ui)(GLuint index, GLuint x)
527 {
528 GET_CURRENT_CONTEXT(ctx);
529 if (index == 0)
530 ATTR1UI(0, x);
531 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
532 ATTR1UI(VBO_ATTRIB_GENERIC0 + index, x);
533 else
534 ERROR();
535 }
536
537 static void GLAPIENTRY
538 TAG(VertexAttribI2ui)(GLuint index, GLuint x, GLuint y)
539 {
540 GET_CURRENT_CONTEXT(ctx);
541 if (index == 0)
542 ATTR2UI(0, x, y);
543 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
544 ATTR2UI(VBO_ATTRIB_GENERIC0 + index, x, y);
545 else
546 ERROR();
547 }
548
549 static void GLAPIENTRY
550 TAG(VertexAttribI3ui)(GLuint index, GLuint x, GLuint y, GLuint z)
551 {
552 GET_CURRENT_CONTEXT(ctx);
553 if (index == 0)
554 ATTR3UI(0, x, y, z);
555 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
556 ATTR3UI(VBO_ATTRIB_GENERIC0 + index, x, y, z);
557 else
558 ERROR();
559 }
560
561 static void GLAPIENTRY
562 TAG(VertexAttribI4ui)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
563 {
564 GET_CURRENT_CONTEXT(ctx);
565 if (index == 0)
566 ATTR4UI(0, x, y, z, w);
567 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
568 ATTR4UI(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
569 else
570 ERROR();
571 }
572
573 static void GLAPIENTRY
574 TAG(VertexAttribI2uiv)(GLuint index, const GLuint *v)
575 {
576 GET_CURRENT_CONTEXT(ctx);
577 if (index == 0)
578 ATTR2UIV(0, v);
579 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
580 ATTR2UIV(VBO_ATTRIB_GENERIC0 + index, v);
581 else
582 ERROR();
583 }
584
585 static void GLAPIENTRY
586 TAG(VertexAttribI3uiv)(GLuint index, const GLuint *v)
587 {
588 GET_CURRENT_CONTEXT(ctx);
589 if (index == 0)
590 ATTR3UIV(0, v);
591 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
592 ATTR3UIV(VBO_ATTRIB_GENERIC0 + index, v);
593 else
594 ERROR();
595 }
596
597 static void GLAPIENTRY
598 TAG(VertexAttribI4uiv)(GLuint index, const GLuint *v)
599 {
600 GET_CURRENT_CONTEXT(ctx);
601 if (index == 0)
602 ATTR4UIV(0, v);
603 else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
604 ATTR4UIV(VBO_ATTRIB_GENERIC0 + index, v);
605 else
606 ERROR();
607 }
608
609
610
611 /* In addition to supporting NV_vertex_program, these entrypoints are
612 * used by the display list and other code specifically because of
613 * their property of aliasing with other attributes. (See
614 * vbo_save_loopback.c)
615 */
616 static void GLAPIENTRY
617 TAG(VertexAttrib1fNV)(GLuint index, GLfloat x)
618 {
619 GET_CURRENT_CONTEXT(ctx);
620 if (index < VBO_ATTRIB_MAX)
621 ATTR1F(index, x);
622 }
623
624 static void GLAPIENTRY
625 TAG(VertexAttrib1fvNV)(GLuint index, const GLfloat * v)
626 {
627 GET_CURRENT_CONTEXT(ctx);
628 if (index < VBO_ATTRIB_MAX)
629 ATTR1FV(index, v);
630 }
631
632 static void GLAPIENTRY
633 TAG(VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y)
634 {
635 GET_CURRENT_CONTEXT(ctx);
636 if (index < VBO_ATTRIB_MAX)
637 ATTR2F(index, x, y);
638 }
639
640 static void GLAPIENTRY
641 TAG(VertexAttrib2fvNV)(GLuint index, const GLfloat * v)
642 {
643 GET_CURRENT_CONTEXT(ctx);
644 if (index < VBO_ATTRIB_MAX)
645 ATTR2FV(index, v);
646 }
647
648 static void GLAPIENTRY
649 TAG(VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z)
650 {
651 GET_CURRENT_CONTEXT(ctx);
652 if (index < VBO_ATTRIB_MAX)
653 ATTR3F(index, x, y, z);
654 }
655
656 static void GLAPIENTRY
657 TAG(VertexAttrib3fvNV)(GLuint index,
658 const GLfloat * v)
659 {
660 GET_CURRENT_CONTEXT(ctx);
661 if (index < VBO_ATTRIB_MAX)
662 ATTR3FV(index, v);
663 }
664
665 static void GLAPIENTRY
666 TAG(VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
667 {
668 GET_CURRENT_CONTEXT(ctx);
669 if (index < VBO_ATTRIB_MAX)
670 ATTR4F(index, x, y, z, w);
671 }
672
673 static void GLAPIENTRY
674 TAG(VertexAttrib4fvNV)(GLuint index, const GLfloat * v)
675 {
676 GET_CURRENT_CONTEXT(ctx);
677 if (index < VBO_ATTRIB_MAX)
678 ATTR4FV(index, v);
679 }
680
681
682
683 #define MAT( ATTR, N, face, params ) \
684 do { \
685 if (face != GL_BACK) \
686 MAT_ATTR( ATTR, N, params ); /* front */ \
687 if (face != GL_FRONT) \
688 MAT_ATTR( ATTR + 1, N, params ); /* back */ \
689 } while (0)
690
691
692 /* Colormaterial conflicts are dealt with later.
693 */
694 static void GLAPIENTRY
695 TAG(Materialfv)(GLenum face, GLenum pname,
696 const GLfloat * params)
697 {
698 GET_CURRENT_CONTEXT(ctx);
699 switch (pname) {
700 case GL_EMISSION:
701 MAT(VBO_ATTRIB_MAT_FRONT_EMISSION, 4, face, params);
702 break;
703 case GL_AMBIENT:
704 MAT(VBO_ATTRIB_MAT_FRONT_AMBIENT, 4, face, params);
705 break;
706 case GL_DIFFUSE:
707 MAT(VBO_ATTRIB_MAT_FRONT_DIFFUSE, 4, face, params);
708 break;
709 case GL_SPECULAR:
710 MAT(VBO_ATTRIB_MAT_FRONT_SPECULAR, 4, face, params);
711 break;
712 case GL_SHININESS:
713 MAT(VBO_ATTRIB_MAT_FRONT_SHININESS, 1, face, params);
714 break;
715 case GL_COLOR_INDEXES:
716 MAT(VBO_ATTRIB_MAT_FRONT_INDEXES, 3, face, params);
717 break;
718 case GL_AMBIENT_AND_DIFFUSE:
719 MAT(VBO_ATTRIB_MAT_FRONT_AMBIENT, 4, face, params);
720 MAT(VBO_ATTRIB_MAT_FRONT_DIFFUSE, 4, face, params);
721 break;
722 default:
723 ERROR();
724 return;
725 }
726 }
727
728
729 #undef ATTR1FV
730 #undef ATTR2FV
731 #undef ATTR3FV
732 #undef ATTR4FV
733
734 #undef ATTR1F
735 #undef ATTR2F
736 #undef ATTR3F
737 #undef ATTR4F
738
739 #undef MAT
740 #undef MAT_ATTR