Tizen 2.0 Release
[profile/ivi/osmesa.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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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(GL_INVALID_VALUE);
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
700    if (face != GL_FRONT && face != GL_BACK && face != GL_FRONT_AND_BACK) {
701       _mesa_error(ctx, GL_INVALID_ENUM, "glMaterial(invalid face)");
702       return;
703    }
704
705    switch (pname) {
706    case GL_EMISSION:
707       MAT(VBO_ATTRIB_MAT_FRONT_EMISSION, 4, face, params);
708       break;
709    case GL_AMBIENT:
710       MAT(VBO_ATTRIB_MAT_FRONT_AMBIENT, 4, face, params);
711       break;
712    case GL_DIFFUSE:
713       MAT(VBO_ATTRIB_MAT_FRONT_DIFFUSE, 4, face, params);
714       break;
715    case GL_SPECULAR:
716       MAT(VBO_ATTRIB_MAT_FRONT_SPECULAR, 4, face, params);
717       break;
718    case GL_SHININESS:
719       if (*params < 0 || *params > ctx->Const.MaxShininess)
720          _mesa_error(ctx, GL_INVALID_VALUE,
721                      "glMaterial(invalid shininess: %f out range [0, %f])",
722                      *params, ctx->Const.MaxShininess);
723       else
724          MAT(VBO_ATTRIB_MAT_FRONT_SHININESS, 1, face, params);
725       break;
726    case GL_COLOR_INDEXES:
727       MAT(VBO_ATTRIB_MAT_FRONT_INDEXES, 3, face, params);
728       break;
729    case GL_AMBIENT_AND_DIFFUSE:
730       MAT(VBO_ATTRIB_MAT_FRONT_AMBIENT, 4, face, params);
731       MAT(VBO_ATTRIB_MAT_FRONT_DIFFUSE, 4, face, params);
732       break;
733    default:
734       ERROR(GL_INVALID_ENUM);
735       return;
736    }
737 }
738
739
740 #undef ATTR1FV
741 #undef ATTR2FV
742 #undef ATTR3FV
743 #undef ATTR4FV
744
745 #undef ATTR1F
746 #undef ATTR2F
747 #undef ATTR3F
748 #undef ATTR4F
749
750 #undef MAT
751 #undef MAT_ATTR