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 **************************************************************************/
28 #define ATTR1FV( A, V ) ATTR( A, 1, (V)[0], 0, 0, 1 )
29 #define ATTR2FV( A, V ) ATTR( A, 2, (V)[0], (V)[1], 0, 1 )
30 #define ATTR3FV( A, V ) ATTR( A, 3, (V)[0], (V)[1], (V)[2], 1 )
31 #define ATTR4FV( A, V ) ATTR( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
33 #define ATTR1F( A, X ) ATTR( A, 1, X, 0, 0, 1 )
34 #define ATTR2F( A, X, Y ) ATTR( A, 2, X, Y, 0, 1 )
35 #define ATTR3F( A, X, Y, Z ) ATTR( A, 3, X, Y, Z, 1 )
36 #define ATTR4F( A, X, Y, Z, W ) ATTR( A, 4, X, Y, Z, W )
38 #define MAT_ATTR( A, N, V ) ATTR( A, N, (V)[0], (V)[1], (V)[2], (V)[3] )
40 static void GLAPIENTRY
TAG(Vertex2f
)( GLfloat x
, GLfloat y
)
42 GET_CURRENT_CONTEXT( ctx
);
43 ATTR2F( VBO_ATTRIB_POS
, x
, y
);
46 static void GLAPIENTRY
TAG(Vertex2fv
)( const GLfloat
*v
)
48 GET_CURRENT_CONTEXT( ctx
);
49 ATTR2FV( VBO_ATTRIB_POS
, v
);
52 static void GLAPIENTRY
TAG(Vertex3f
)( GLfloat x
, GLfloat y
, GLfloat z
)
54 GET_CURRENT_CONTEXT( ctx
);
55 ATTR3F( VBO_ATTRIB_POS
, x
, y
, z
);
58 static void GLAPIENTRY
TAG(Vertex3fv
)( const GLfloat
*v
)
60 GET_CURRENT_CONTEXT( ctx
);
61 ATTR3FV( VBO_ATTRIB_POS
, v
);
64 static void GLAPIENTRY
TAG(Vertex4f
)( GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
66 GET_CURRENT_CONTEXT( ctx
);
67 ATTR4F( VBO_ATTRIB_POS
, x
, y
, z
, w
);
70 static void GLAPIENTRY
TAG(Vertex4fv
)( const GLfloat
*v
)
72 GET_CURRENT_CONTEXT( ctx
);
73 ATTR4FV( VBO_ATTRIB_POS
, v
);
76 static void GLAPIENTRY
TAG(TexCoord1f
)( GLfloat x
)
78 GET_CURRENT_CONTEXT( ctx
);
79 ATTR1F( VBO_ATTRIB_TEX0
, x
);
82 static void GLAPIENTRY
TAG(TexCoord1fv
)( const GLfloat
*v
)
84 GET_CURRENT_CONTEXT( ctx
);
85 ATTR1FV( VBO_ATTRIB_TEX0
, v
);
88 static void GLAPIENTRY
TAG(TexCoord2f
)( GLfloat x
, GLfloat y
)
90 GET_CURRENT_CONTEXT( ctx
);
91 ATTR2F( VBO_ATTRIB_TEX0
, x
, y
);
94 static void GLAPIENTRY
TAG(TexCoord2fv
)( const GLfloat
*v
)
96 GET_CURRENT_CONTEXT( ctx
);
97 ATTR2FV( VBO_ATTRIB_TEX0
, v
);
100 static void GLAPIENTRY
TAG(TexCoord3f
)( GLfloat x
, GLfloat y
, GLfloat z
)
102 GET_CURRENT_CONTEXT( ctx
);
103 ATTR3F( VBO_ATTRIB_TEX0
, x
, y
, z
);
106 static void GLAPIENTRY
TAG(TexCoord3fv
)( const GLfloat
*v
)
108 GET_CURRENT_CONTEXT( ctx
);
109 ATTR3FV( VBO_ATTRIB_TEX0
, v
);
112 static void GLAPIENTRY
TAG(TexCoord4f
)( GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
114 GET_CURRENT_CONTEXT( ctx
);
115 ATTR4F( VBO_ATTRIB_TEX0
, x
, y
, z
, w
);
118 static void GLAPIENTRY
TAG(TexCoord4fv
)( const GLfloat
*v
)
120 GET_CURRENT_CONTEXT( ctx
);
121 ATTR4FV( VBO_ATTRIB_TEX0
, v
);
124 static void GLAPIENTRY
TAG(Normal3f
)( GLfloat x
, GLfloat y
, GLfloat z
)
126 GET_CURRENT_CONTEXT( ctx
);
127 ATTR3F( VBO_ATTRIB_NORMAL
, x
, y
, z
);
130 static void GLAPIENTRY
TAG(Normal3fv
)( const GLfloat
*v
)
132 GET_CURRENT_CONTEXT( ctx
);
133 ATTR3FV( VBO_ATTRIB_NORMAL
, v
);
136 static void GLAPIENTRY
TAG(FogCoordfEXT
)( GLfloat x
)
138 GET_CURRENT_CONTEXT( ctx
);
139 ATTR1F( VBO_ATTRIB_FOG
, x
);
142 static void GLAPIENTRY
TAG(FogCoordfvEXT
)( const GLfloat
*v
)
144 GET_CURRENT_CONTEXT( ctx
);
145 ATTR1FV( VBO_ATTRIB_FOG
, v
);
148 static void GLAPIENTRY
TAG(Color3f
)( GLfloat x
, GLfloat y
, GLfloat z
)
150 GET_CURRENT_CONTEXT( ctx
);
151 ATTR3F( VBO_ATTRIB_COLOR0
, x
, y
, z
);
154 static void GLAPIENTRY
TAG(Color3fv
)( const GLfloat
*v
)
156 GET_CURRENT_CONTEXT( ctx
);
157 ATTR3FV( VBO_ATTRIB_COLOR0
, v
);
160 static void GLAPIENTRY
TAG(Color4f
)( GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
162 GET_CURRENT_CONTEXT( ctx
);
163 ATTR4F( VBO_ATTRIB_COLOR0
, x
, y
, z
, w
);
166 static void GLAPIENTRY
TAG(Color4fv
)( const GLfloat
*v
)
168 GET_CURRENT_CONTEXT( ctx
);
169 ATTR4FV( VBO_ATTRIB_COLOR0
, v
);
172 static void GLAPIENTRY
TAG(SecondaryColor3fEXT
)( GLfloat x
, GLfloat y
, GLfloat z
)
174 GET_CURRENT_CONTEXT( ctx
);
175 ATTR3F( VBO_ATTRIB_COLOR1
, x
, y
, z
);
178 static void GLAPIENTRY
TAG(SecondaryColor3fvEXT
)( const GLfloat
*v
)
180 GET_CURRENT_CONTEXT( ctx
);
181 ATTR3FV( VBO_ATTRIB_COLOR1
, v
);
185 static void GLAPIENTRY
TAG(EdgeFlag
)( GLboolean b
)
187 GET_CURRENT_CONTEXT( ctx
);
188 ATTR1F( VBO_ATTRIB_EDGEFLAG
, (GLfloat
)b
);
191 static void GLAPIENTRY
TAG(Indexf
)( GLfloat f
)
193 GET_CURRENT_CONTEXT( ctx
);
194 ATTR1F( VBO_ATTRIB_INDEX
, f
);
197 static void GLAPIENTRY
TAG(Indexfv
)( const GLfloat
*f
)
199 GET_CURRENT_CONTEXT( ctx
);
200 ATTR1FV( VBO_ATTRIB_INDEX
, f
);
204 static void GLAPIENTRY
TAG(MultiTexCoord1f
)( GLenum target
, GLfloat x
)
206 GET_CURRENT_CONTEXT( ctx
);
207 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
211 static void GLAPIENTRY
TAG(MultiTexCoord1fv
)( GLenum target
, const GLfloat
*v
)
213 GET_CURRENT_CONTEXT( ctx
);
214 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
218 static void GLAPIENTRY
TAG(MultiTexCoord2f
)( GLenum target
, GLfloat x
, GLfloat y
)
220 GET_CURRENT_CONTEXT( ctx
);
221 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
222 ATTR2F( attr
, x
, y
);
225 static void GLAPIENTRY
TAG(MultiTexCoord2fv
)( GLenum target
, const GLfloat
*v
)
227 GET_CURRENT_CONTEXT( ctx
);
228 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
232 static void GLAPIENTRY
TAG(MultiTexCoord3f
)( GLenum target
, GLfloat x
, GLfloat y
,
235 GET_CURRENT_CONTEXT( ctx
);
236 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
237 ATTR3F( attr
, x
, y
, z
);
240 static void GLAPIENTRY
TAG(MultiTexCoord3fv
)( GLenum target
, const GLfloat
*v
)
242 GET_CURRENT_CONTEXT( ctx
);
243 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
247 static void GLAPIENTRY
TAG(MultiTexCoord4f
)( GLenum target
, GLfloat x
, GLfloat y
,
248 GLfloat z
, GLfloat w
)
250 GET_CURRENT_CONTEXT( ctx
);
251 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
252 ATTR4F( attr
, x
, y
, z
, w
);
255 static void GLAPIENTRY
TAG(MultiTexCoord4fv
)( GLenum target
, const GLfloat
*v
)
257 GET_CURRENT_CONTEXT( ctx
);
258 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
263 static void GLAPIENTRY
TAG(VertexAttrib1fARB
)( GLuint index
, GLfloat x
)
265 GET_CURRENT_CONTEXT( ctx
);
268 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
269 ATTR1F(VBO_ATTRIB_GENERIC0
+ index
, x
);
274 static void GLAPIENTRY
TAG(VertexAttrib1fvARB
)( GLuint index
,
277 GET_CURRENT_CONTEXT( ctx
);
280 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
281 ATTR1FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
286 static void GLAPIENTRY
TAG(VertexAttrib2fARB
)( GLuint index
, GLfloat x
,
289 GET_CURRENT_CONTEXT( ctx
);
292 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
293 ATTR2F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
298 static void GLAPIENTRY
TAG(VertexAttrib2fvARB
)( GLuint index
,
301 GET_CURRENT_CONTEXT( ctx
);
304 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
305 ATTR2FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
310 static void GLAPIENTRY
TAG(VertexAttrib3fARB
)( GLuint index
, GLfloat x
,
311 GLfloat y
, GLfloat z
)
313 GET_CURRENT_CONTEXT( ctx
);
316 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
317 ATTR3F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
322 static void GLAPIENTRY
TAG(VertexAttrib3fvARB
)( GLuint index
,
325 GET_CURRENT_CONTEXT( ctx
);
328 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
329 ATTR3FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
334 static void GLAPIENTRY
TAG(VertexAttrib4fARB
)( GLuint index
, GLfloat x
,
335 GLfloat y
, GLfloat z
,
338 GET_CURRENT_CONTEXT( ctx
);
340 ATTR4F(0, x
, y
, z
, w
);
341 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
342 ATTR4F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
, w
);
347 static void GLAPIENTRY
TAG(VertexAttrib4fvARB
)( GLuint index
,
350 GET_CURRENT_CONTEXT( ctx
);
353 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
354 ATTR4FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
360 /* In addition to supporting NV_vertex_program, these entrypoints are
361 * used by the display list and other code specifically because of
362 * their property of aliasing with other attributes. (See
363 * vbo_save_loopback.c)
365 static void GLAPIENTRY
TAG(VertexAttrib1fNV
)( GLuint index
, GLfloat x
)
367 GET_CURRENT_CONTEXT( ctx
);
368 if (index
< VBO_ATTRIB_MAX
)
372 static void GLAPIENTRY
TAG(VertexAttrib1fvNV
)( GLuint index
,
375 GET_CURRENT_CONTEXT( ctx
);
376 if (index
< VBO_ATTRIB_MAX
)
380 static void GLAPIENTRY
TAG(VertexAttrib2fNV
)( GLuint index
, GLfloat x
,
383 GET_CURRENT_CONTEXT( ctx
);
384 if (index
< VBO_ATTRIB_MAX
)
388 static void GLAPIENTRY
TAG(VertexAttrib2fvNV
)( GLuint index
,
391 GET_CURRENT_CONTEXT( ctx
);
392 if (index
< VBO_ATTRIB_MAX
)
396 static void GLAPIENTRY
TAG(VertexAttrib3fNV
)( GLuint index
, GLfloat x
,
397 GLfloat y
, GLfloat z
)
399 GET_CURRENT_CONTEXT( ctx
);
400 if (index
< VBO_ATTRIB_MAX
)
401 ATTR3F(index
, x
, y
, z
);
404 static void GLAPIENTRY
TAG(VertexAttrib3fvNV
)( GLuint index
,
407 GET_CURRENT_CONTEXT( ctx
);
408 if (index
< VBO_ATTRIB_MAX
)
412 static void GLAPIENTRY
TAG(VertexAttrib4fNV
)( GLuint index
, GLfloat x
,
413 GLfloat y
, GLfloat z
,
416 GET_CURRENT_CONTEXT( ctx
);
417 if (index
< VBO_ATTRIB_MAX
)
418 ATTR4F(index
, x
, y
, z
, w
);
421 static void GLAPIENTRY
TAG(VertexAttrib4fvNV
)( GLuint index
,
424 GET_CURRENT_CONTEXT( ctx
);
425 if (index
< VBO_ATTRIB_MAX
)
430 #define MAT( ATTR, N, face, params ) \
432 if (face != GL_BACK) \
433 MAT_ATTR( ATTR, N, params ); /* front */ \
434 if (face != GL_FRONT) \
435 MAT_ATTR( ATTR + 1, N, params ); /* back */ \
439 /* Colormaterial conflicts are dealt with later.
441 static void GLAPIENTRY
TAG(Materialfv
)( GLenum face
, GLenum pname
,
442 const GLfloat
*params
)
444 GET_CURRENT_CONTEXT( ctx
);
447 MAT( VBO_ATTRIB_MAT_FRONT_EMISSION
, 4, face
, params
);
450 MAT( VBO_ATTRIB_MAT_FRONT_AMBIENT
, 4, face
, params
);
453 MAT( VBO_ATTRIB_MAT_FRONT_DIFFUSE
, 4, face
, params
);
456 MAT( VBO_ATTRIB_MAT_FRONT_SPECULAR
, 4, face
, params
);
459 MAT( VBO_ATTRIB_MAT_FRONT_SHININESS
, 1, face
, params
);
461 case GL_COLOR_INDEXES
:
462 MAT( VBO_ATTRIB_MAT_FRONT_INDEXES
, 3, face
, params
);
464 case GL_AMBIENT_AND_DIFFUSE
:
465 MAT( VBO_ATTRIB_MAT_FRONT_AMBIENT
, 4, face
, params
);
466 MAT( VBO_ATTRIB_MAT_FRONT_DIFFUSE
, 4, face
, params
);