1 /**************************************************************************
3 Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas.
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:
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
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.
26 **************************************************************************/
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] )
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 )
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] )
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 )
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] )
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 )
60 #define MAT_ATTR( A, N, V ) ATTR( A, N, (V)[0], (V)[1], (V)[2], (V)[3] )
64 static void GLAPIENTRY
65 TAG(Vertex2f
)(GLfloat x
, GLfloat y
)
67 GET_CURRENT_CONTEXT(ctx
);
68 ATTR2F(VBO_ATTRIB_POS
, x
, y
);
71 static void GLAPIENTRY
72 TAG(Vertex2fv
)(const GLfloat
* v
)
74 GET_CURRENT_CONTEXT(ctx
);
75 ATTR2FV(VBO_ATTRIB_POS
, v
);
78 static void GLAPIENTRY
79 TAG(Vertex3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
81 GET_CURRENT_CONTEXT(ctx
);
82 ATTR3F(VBO_ATTRIB_POS
, x
, y
, z
);
85 static void GLAPIENTRY
86 TAG(Vertex3fv
)(const GLfloat
* v
)
88 GET_CURRENT_CONTEXT(ctx
);
89 ATTR3FV(VBO_ATTRIB_POS
, v
);
92 static void GLAPIENTRY
93 TAG(Vertex4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
95 GET_CURRENT_CONTEXT(ctx
);
96 ATTR4F(VBO_ATTRIB_POS
, x
, y
, z
, w
);
99 static void GLAPIENTRY
100 TAG(Vertex4fv
)(const GLfloat
* v
)
102 GET_CURRENT_CONTEXT(ctx
);
103 ATTR4FV(VBO_ATTRIB_POS
, v
);
108 static void GLAPIENTRY
109 TAG(TexCoord1f
)(GLfloat x
)
111 GET_CURRENT_CONTEXT(ctx
);
112 ATTR1F(VBO_ATTRIB_TEX0
, x
);
115 static void GLAPIENTRY
116 TAG(TexCoord1fv
)(const GLfloat
* v
)
118 GET_CURRENT_CONTEXT(ctx
);
119 ATTR1FV(VBO_ATTRIB_TEX0
, v
);
122 static void GLAPIENTRY
123 TAG(TexCoord2f
)(GLfloat x
, GLfloat y
)
125 GET_CURRENT_CONTEXT(ctx
);
126 ATTR2F(VBO_ATTRIB_TEX0
, x
, y
);
129 static void GLAPIENTRY
130 TAG(TexCoord2fv
)(const GLfloat
* v
)
132 GET_CURRENT_CONTEXT(ctx
);
133 ATTR2FV(VBO_ATTRIB_TEX0
, v
);
136 static void GLAPIENTRY
137 TAG(TexCoord3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
139 GET_CURRENT_CONTEXT(ctx
);
140 ATTR3F(VBO_ATTRIB_TEX0
, x
, y
, z
);
143 static void GLAPIENTRY
144 TAG(TexCoord3fv
)(const GLfloat
* v
)
146 GET_CURRENT_CONTEXT(ctx
);
147 ATTR3FV(VBO_ATTRIB_TEX0
, v
);
150 static void GLAPIENTRY
151 TAG(TexCoord4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
153 GET_CURRENT_CONTEXT(ctx
);
154 ATTR4F(VBO_ATTRIB_TEX0
, x
, y
, z
, w
);
157 static void GLAPIENTRY
158 TAG(TexCoord4fv
)(const GLfloat
* v
)
160 GET_CURRENT_CONTEXT(ctx
);
161 ATTR4FV(VBO_ATTRIB_TEX0
, v
);
166 static void GLAPIENTRY
167 TAG(Normal3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
169 GET_CURRENT_CONTEXT(ctx
);
170 ATTR3F(VBO_ATTRIB_NORMAL
, x
, y
, z
);
173 static void GLAPIENTRY
174 TAG(Normal3fv
)(const GLfloat
* v
)
176 GET_CURRENT_CONTEXT(ctx
);
177 ATTR3FV(VBO_ATTRIB_NORMAL
, v
);
182 static void GLAPIENTRY
183 TAG(FogCoordfEXT
)(GLfloat x
)
185 GET_CURRENT_CONTEXT(ctx
);
186 ATTR1F(VBO_ATTRIB_FOG
, x
);
191 static void GLAPIENTRY
192 TAG(FogCoordfvEXT
)(const GLfloat
* v
)
194 GET_CURRENT_CONTEXT(ctx
);
195 ATTR1FV(VBO_ATTRIB_FOG
, v
);
198 static void GLAPIENTRY
199 TAG(Color3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
201 GET_CURRENT_CONTEXT(ctx
);
202 ATTR3F(VBO_ATTRIB_COLOR0
, x
, y
, z
);
205 static void GLAPIENTRY
206 TAG(Color3fv
)(const GLfloat
* v
)
208 GET_CURRENT_CONTEXT(ctx
);
209 ATTR3FV(VBO_ATTRIB_COLOR0
, v
);
212 static void GLAPIENTRY
213 TAG(Color4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
215 GET_CURRENT_CONTEXT(ctx
);
216 ATTR4F(VBO_ATTRIB_COLOR0
, x
, y
, z
, w
);
219 static void GLAPIENTRY
220 TAG(Color4fv
)(const GLfloat
* v
)
222 GET_CURRENT_CONTEXT(ctx
);
223 ATTR4FV(VBO_ATTRIB_COLOR0
, v
);
228 static void GLAPIENTRY
229 TAG(SecondaryColor3fEXT
)(GLfloat x
, GLfloat y
, GLfloat z
)
231 GET_CURRENT_CONTEXT(ctx
);
232 ATTR3F(VBO_ATTRIB_COLOR1
, x
, y
, z
);
235 static void GLAPIENTRY
236 TAG(SecondaryColor3fvEXT
)(const GLfloat
* v
)
238 GET_CURRENT_CONTEXT(ctx
);
239 ATTR3FV(VBO_ATTRIB_COLOR1
, v
);
244 static void GLAPIENTRY
245 TAG(EdgeFlag
)(GLboolean b
)
247 GET_CURRENT_CONTEXT(ctx
);
248 ATTR1F(VBO_ATTRIB_EDGEFLAG
, (GLfloat
) b
);
253 static void GLAPIENTRY
254 TAG(Indexf
)(GLfloat f
)
256 GET_CURRENT_CONTEXT(ctx
);
257 ATTR1F(VBO_ATTRIB_INDEX
, f
);
260 static void GLAPIENTRY
261 TAG(Indexfv
)(const GLfloat
* f
)
263 GET_CURRENT_CONTEXT(ctx
);
264 ATTR1FV(VBO_ATTRIB_INDEX
, f
);
269 static void GLAPIENTRY
270 TAG(MultiTexCoord1f
)(GLenum target
, GLfloat x
)
272 GET_CURRENT_CONTEXT(ctx
);
273 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
277 static void GLAPIENTRY
278 TAG(MultiTexCoord1fv
)(GLenum target
, const GLfloat
* v
)
280 GET_CURRENT_CONTEXT(ctx
);
281 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
285 static void GLAPIENTRY
286 TAG(MultiTexCoord2f
)(GLenum target
, GLfloat x
, GLfloat y
)
288 GET_CURRENT_CONTEXT(ctx
);
289 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
293 static void GLAPIENTRY
294 TAG(MultiTexCoord2fv
)(GLenum target
, const GLfloat
* v
)
296 GET_CURRENT_CONTEXT(ctx
);
297 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
301 static void GLAPIENTRY
302 TAG(MultiTexCoord3f
)(GLenum target
, GLfloat x
, GLfloat y
, GLfloat z
)
304 GET_CURRENT_CONTEXT(ctx
);
305 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
306 ATTR3F(attr
, x
, y
, z
);
309 static void GLAPIENTRY
310 TAG(MultiTexCoord3fv
)(GLenum target
, const GLfloat
* v
)
312 GET_CURRENT_CONTEXT(ctx
);
313 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
317 static void GLAPIENTRY
318 TAG(MultiTexCoord4f
)(GLenum target
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
320 GET_CURRENT_CONTEXT(ctx
);
321 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
322 ATTR4F(attr
, x
, y
, z
, w
);
325 static void GLAPIENTRY
326 TAG(MultiTexCoord4fv
)(GLenum target
, const GLfloat
* v
)
328 GET_CURRENT_CONTEXT(ctx
);
329 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
335 static void GLAPIENTRY
336 TAG(VertexAttrib1fARB
)(GLuint index
, GLfloat x
)
338 GET_CURRENT_CONTEXT(ctx
);
341 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
342 ATTR1F(VBO_ATTRIB_GENERIC0
+ index
, x
);
344 ERROR(GL_INVALID_VALUE
);
347 static void GLAPIENTRY
348 TAG(VertexAttrib1fvARB
)(GLuint index
, const GLfloat
* v
)
350 GET_CURRENT_CONTEXT(ctx
);
353 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
354 ATTR1FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
356 ERROR(GL_INVALID_VALUE
);
359 static void GLAPIENTRY
360 TAG(VertexAttrib2fARB
)(GLuint index
, GLfloat x
, GLfloat y
)
362 GET_CURRENT_CONTEXT(ctx
);
365 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
366 ATTR2F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
368 ERROR(GL_INVALID_VALUE
);
371 static void GLAPIENTRY
372 TAG(VertexAttrib2fvARB
)(GLuint index
, const GLfloat
* v
)
374 GET_CURRENT_CONTEXT(ctx
);
377 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
378 ATTR2FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
380 ERROR(GL_INVALID_VALUE
);
383 static void GLAPIENTRY
384 TAG(VertexAttrib3fARB
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
)
386 GET_CURRENT_CONTEXT(ctx
);
389 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
390 ATTR3F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
392 ERROR(GL_INVALID_VALUE
);
395 static void GLAPIENTRY
396 TAG(VertexAttrib3fvARB
)(GLuint index
, const GLfloat
* v
)
398 GET_CURRENT_CONTEXT(ctx
);
401 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
402 ATTR3FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
404 ERROR(GL_INVALID_VALUE
);
407 static void GLAPIENTRY
408 TAG(VertexAttrib4fARB
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
410 GET_CURRENT_CONTEXT(ctx
);
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
);
416 ERROR(GL_INVALID_VALUE
);
419 static void GLAPIENTRY
420 TAG(VertexAttrib4fvARB
)(GLuint index
, const GLfloat
* v
)
422 GET_CURRENT_CONTEXT(ctx
);
425 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
426 ATTR4FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
428 ERROR(GL_INVALID_VALUE
);
433 /* Integer-valued generic attributes.
434 * XXX: the integers just get converted to floats at this time
436 static void GLAPIENTRY
437 TAG(VertexAttribI1i
)(GLuint index
, GLint x
)
439 GET_CURRENT_CONTEXT(ctx
);
442 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
443 ATTR1I(VBO_ATTRIB_GENERIC0
+ index
, x
);
445 ERROR(GL_INVALID_VALUE
);
448 static void GLAPIENTRY
449 TAG(VertexAttribI2i
)(GLuint index
, GLint x
, GLint y
)
451 GET_CURRENT_CONTEXT(ctx
);
454 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
455 ATTR2I(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
457 ERROR(GL_INVALID_VALUE
);
460 static void GLAPIENTRY
461 TAG(VertexAttribI3i
)(GLuint index
, GLint x
, GLint y
, GLint z
)
463 GET_CURRENT_CONTEXT(ctx
);
466 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
467 ATTR3I(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
469 ERROR(GL_INVALID_VALUE
);
472 static void GLAPIENTRY
473 TAG(VertexAttribI4i
)(GLuint index
, GLint x
, GLint y
, GLint z
, GLint w
)
475 GET_CURRENT_CONTEXT(ctx
);
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
);
481 ERROR(GL_INVALID_VALUE
);
484 static void GLAPIENTRY
485 TAG(VertexAttribI2iv
)(GLuint index
, const GLint
*v
)
487 GET_CURRENT_CONTEXT(ctx
);
490 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
491 ATTR2IV(VBO_ATTRIB_GENERIC0
+ index
, v
);
493 ERROR(GL_INVALID_VALUE
);
496 static void GLAPIENTRY
497 TAG(VertexAttribI3iv
)(GLuint index
, const GLint
*v
)
499 GET_CURRENT_CONTEXT(ctx
);
502 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
503 ATTR3IV(VBO_ATTRIB_GENERIC0
+ index
, v
);
505 ERROR(GL_INVALID_VALUE
);
508 static void GLAPIENTRY
509 TAG(VertexAttribI4iv
)(GLuint index
, const GLint
*v
)
511 GET_CURRENT_CONTEXT(ctx
);
514 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
515 ATTR4IV(VBO_ATTRIB_GENERIC0
+ index
, v
);
517 ERROR(GL_INVALID_VALUE
);
522 /* Unsigned integer-valued generic attributes.
523 * XXX: the integers just get converted to floats at this time
525 static void GLAPIENTRY
526 TAG(VertexAttribI1ui
)(GLuint index
, GLuint x
)
528 GET_CURRENT_CONTEXT(ctx
);
531 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
532 ATTR1UI(VBO_ATTRIB_GENERIC0
+ index
, x
);
534 ERROR(GL_INVALID_VALUE
);
537 static void GLAPIENTRY
538 TAG(VertexAttribI2ui
)(GLuint index
, GLuint x
, GLuint y
)
540 GET_CURRENT_CONTEXT(ctx
);
543 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
544 ATTR2UI(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
546 ERROR(GL_INVALID_VALUE
);
549 static void GLAPIENTRY
550 TAG(VertexAttribI3ui
)(GLuint index
, GLuint x
, GLuint y
, GLuint z
)
552 GET_CURRENT_CONTEXT(ctx
);
555 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
556 ATTR3UI(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
558 ERROR(GL_INVALID_VALUE
);
561 static void GLAPIENTRY
562 TAG(VertexAttribI4ui
)(GLuint index
, GLuint x
, GLuint y
, GLuint z
, GLuint w
)
564 GET_CURRENT_CONTEXT(ctx
);
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
);
570 ERROR(GL_INVALID_VALUE
);
573 static void GLAPIENTRY
574 TAG(VertexAttribI2uiv
)(GLuint index
, const GLuint
*v
)
576 GET_CURRENT_CONTEXT(ctx
);
579 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
580 ATTR2UIV(VBO_ATTRIB_GENERIC0
+ index
, v
);
582 ERROR(GL_INVALID_VALUE
);
585 static void GLAPIENTRY
586 TAG(VertexAttribI3uiv
)(GLuint index
, const GLuint
*v
)
588 GET_CURRENT_CONTEXT(ctx
);
591 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
592 ATTR3UIV(VBO_ATTRIB_GENERIC0
+ index
, v
);
594 ERROR(GL_INVALID_VALUE
);
597 static void GLAPIENTRY
598 TAG(VertexAttribI4uiv
)(GLuint index
, const GLuint
*v
)
600 GET_CURRENT_CONTEXT(ctx
);
603 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
604 ATTR4UIV(VBO_ATTRIB_GENERIC0
+ index
, v
);
606 ERROR(GL_INVALID_VALUE
);
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)
616 static void GLAPIENTRY
617 TAG(VertexAttrib1fNV
)(GLuint index
, GLfloat x
)
619 GET_CURRENT_CONTEXT(ctx
);
620 if (index
< VBO_ATTRIB_MAX
)
624 static void GLAPIENTRY
625 TAG(VertexAttrib1fvNV
)(GLuint index
, const GLfloat
* v
)
627 GET_CURRENT_CONTEXT(ctx
);
628 if (index
< VBO_ATTRIB_MAX
)
632 static void GLAPIENTRY
633 TAG(VertexAttrib2fNV
)(GLuint index
, GLfloat x
, GLfloat y
)
635 GET_CURRENT_CONTEXT(ctx
);
636 if (index
< VBO_ATTRIB_MAX
)
640 static void GLAPIENTRY
641 TAG(VertexAttrib2fvNV
)(GLuint index
, const GLfloat
* v
)
643 GET_CURRENT_CONTEXT(ctx
);
644 if (index
< VBO_ATTRIB_MAX
)
648 static void GLAPIENTRY
649 TAG(VertexAttrib3fNV
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
)
651 GET_CURRENT_CONTEXT(ctx
);
652 if (index
< VBO_ATTRIB_MAX
)
653 ATTR3F(index
, x
, y
, z
);
656 static void GLAPIENTRY
657 TAG(VertexAttrib3fvNV
)(GLuint index
,
660 GET_CURRENT_CONTEXT(ctx
);
661 if (index
< VBO_ATTRIB_MAX
)
665 static void GLAPIENTRY
666 TAG(VertexAttrib4fNV
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
668 GET_CURRENT_CONTEXT(ctx
);
669 if (index
< VBO_ATTRIB_MAX
)
670 ATTR4F(index
, x
, y
, z
, w
);
673 static void GLAPIENTRY
674 TAG(VertexAttrib4fvNV
)(GLuint index
, const GLfloat
* v
)
676 GET_CURRENT_CONTEXT(ctx
);
677 if (index
< VBO_ATTRIB_MAX
)
683 #define MAT( ATTR, N, face, params ) \
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 */ \
692 /* Colormaterial conflicts are dealt with later.
694 static void GLAPIENTRY
695 TAG(Materialfv
)(GLenum face
, GLenum pname
,
696 const GLfloat
* params
)
698 GET_CURRENT_CONTEXT(ctx
);
701 MAT(VBO_ATTRIB_MAT_FRONT_EMISSION
, 4, face
, params
);
704 MAT(VBO_ATTRIB_MAT_FRONT_AMBIENT
, 4, face
, params
);
707 MAT(VBO_ATTRIB_MAT_FRONT_DIFFUSE
, 4, face
, params
);
710 MAT(VBO_ATTRIB_MAT_FRONT_SPECULAR
, 4, face
, params
);
713 MAT(VBO_ATTRIB_MAT_FRONT_SHININESS
, 1, face
, params
);
715 case GL_COLOR_INDEXES
:
716 MAT(VBO_ATTRIB_MAT_FRONT_INDEXES
, 3, face
, params
);
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
);
723 ERROR(GL_INVALID_ENUM
);