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] )
42 static void GLAPIENTRY
43 TAG(Vertex2f
)(GLfloat x
, GLfloat y
)
45 GET_CURRENT_CONTEXT(ctx
);
46 ATTR2F(VBO_ATTRIB_POS
, x
, y
);
49 static void GLAPIENTRY
50 TAG(Vertex2fv
)(const GLfloat
* v
)
52 GET_CURRENT_CONTEXT(ctx
);
53 ATTR2FV(VBO_ATTRIB_POS
, v
);
56 static void GLAPIENTRY
57 TAG(Vertex3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
59 GET_CURRENT_CONTEXT(ctx
);
60 ATTR3F(VBO_ATTRIB_POS
, x
, y
, z
);
63 static void GLAPIENTRY
64 TAG(Vertex3fv
)(const GLfloat
* v
)
66 GET_CURRENT_CONTEXT(ctx
);
67 ATTR3FV(VBO_ATTRIB_POS
, v
);
70 static void GLAPIENTRY
71 TAG(Vertex4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
73 GET_CURRENT_CONTEXT(ctx
);
74 ATTR4F(VBO_ATTRIB_POS
, x
, y
, z
, w
);
77 static void GLAPIENTRY
78 TAG(Vertex4fv
)(const GLfloat
* v
)
80 GET_CURRENT_CONTEXT(ctx
);
81 ATTR4FV(VBO_ATTRIB_POS
, v
);
86 static void GLAPIENTRY
87 TAG(TexCoord1f
)(GLfloat x
)
89 GET_CURRENT_CONTEXT(ctx
);
90 ATTR1F(VBO_ATTRIB_TEX0
, x
);
93 static void GLAPIENTRY
94 TAG(TexCoord1fv
)(const GLfloat
* v
)
96 GET_CURRENT_CONTEXT(ctx
);
97 ATTR1FV(VBO_ATTRIB_TEX0
, v
);
100 static void GLAPIENTRY
101 TAG(TexCoord2f
)(GLfloat x
, GLfloat y
)
103 GET_CURRENT_CONTEXT(ctx
);
104 ATTR2F(VBO_ATTRIB_TEX0
, x
, y
);
107 static void GLAPIENTRY
108 TAG(TexCoord2fv
)(const GLfloat
* v
)
110 GET_CURRENT_CONTEXT(ctx
);
111 ATTR2FV(VBO_ATTRIB_TEX0
, v
);
114 static void GLAPIENTRY
115 TAG(TexCoord3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
117 GET_CURRENT_CONTEXT(ctx
);
118 ATTR3F(VBO_ATTRIB_TEX0
, x
, y
, z
);
121 static void GLAPIENTRY
122 TAG(TexCoord3fv
)(const GLfloat
* v
)
124 GET_CURRENT_CONTEXT(ctx
);
125 ATTR3FV(VBO_ATTRIB_TEX0
, v
);
128 static void GLAPIENTRY
129 TAG(TexCoord4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
131 GET_CURRENT_CONTEXT(ctx
);
132 ATTR4F(VBO_ATTRIB_TEX0
, x
, y
, z
, w
);
135 static void GLAPIENTRY
136 TAG(TexCoord4fv
)(const GLfloat
* v
)
138 GET_CURRENT_CONTEXT(ctx
);
139 ATTR4FV(VBO_ATTRIB_TEX0
, v
);
144 static void GLAPIENTRY
145 TAG(Normal3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
147 GET_CURRENT_CONTEXT(ctx
);
148 ATTR3F(VBO_ATTRIB_NORMAL
, x
, y
, z
);
151 static void GLAPIENTRY
152 TAG(Normal3fv
)(const GLfloat
* v
)
154 GET_CURRENT_CONTEXT(ctx
);
155 ATTR3FV(VBO_ATTRIB_NORMAL
, v
);
160 static void GLAPIENTRY
161 TAG(FogCoordfEXT
)(GLfloat x
)
163 GET_CURRENT_CONTEXT(ctx
);
164 ATTR1F(VBO_ATTRIB_FOG
, x
);
169 static void GLAPIENTRY
170 TAG(FogCoordfvEXT
)(const GLfloat
* v
)
172 GET_CURRENT_CONTEXT(ctx
);
173 ATTR1FV(VBO_ATTRIB_FOG
, v
);
176 static void GLAPIENTRY
177 TAG(Color3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
179 GET_CURRENT_CONTEXT(ctx
);
180 ATTR3F(VBO_ATTRIB_COLOR0
, x
, y
, z
);
183 static void GLAPIENTRY
184 TAG(Color3fv
)(const GLfloat
* v
)
186 GET_CURRENT_CONTEXT(ctx
);
187 ATTR3FV(VBO_ATTRIB_COLOR0
, v
);
190 static void GLAPIENTRY
191 TAG(Color4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
193 GET_CURRENT_CONTEXT(ctx
);
194 ATTR4F(VBO_ATTRIB_COLOR0
, x
, y
, z
, w
);
197 static void GLAPIENTRY
198 TAG(Color4fv
)(const GLfloat
* v
)
200 GET_CURRENT_CONTEXT(ctx
);
201 ATTR4FV(VBO_ATTRIB_COLOR0
, v
);
206 static void GLAPIENTRY
207 TAG(SecondaryColor3fEXT
)(GLfloat x
, GLfloat y
, GLfloat z
)
209 GET_CURRENT_CONTEXT(ctx
);
210 ATTR3F(VBO_ATTRIB_COLOR1
, x
, y
, z
);
213 static void GLAPIENTRY
214 TAG(SecondaryColor3fvEXT
)(const GLfloat
* v
)
216 GET_CURRENT_CONTEXT(ctx
);
217 ATTR3FV(VBO_ATTRIB_COLOR1
, v
);
222 static void GLAPIENTRY
223 TAG(EdgeFlag
)(GLboolean b
)
225 GET_CURRENT_CONTEXT(ctx
);
226 ATTR1F(VBO_ATTRIB_EDGEFLAG
, (GLfloat
) b
);
231 static void GLAPIENTRY
232 TAG(Indexf
)(GLfloat f
)
234 GET_CURRENT_CONTEXT(ctx
);
235 ATTR1F(VBO_ATTRIB_INDEX
, f
);
238 static void GLAPIENTRY
239 TAG(Indexfv
)(const GLfloat
* f
)
241 GET_CURRENT_CONTEXT(ctx
);
242 ATTR1FV(VBO_ATTRIB_INDEX
, f
);
247 static void GLAPIENTRY
248 TAG(MultiTexCoord1f
)(GLenum target
, GLfloat x
)
250 GET_CURRENT_CONTEXT(ctx
);
251 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
255 static void GLAPIENTRY
256 TAG(MultiTexCoord1fv
)(GLenum target
, const GLfloat
* v
)
258 GET_CURRENT_CONTEXT(ctx
);
259 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
263 static void GLAPIENTRY
264 TAG(MultiTexCoord2f
)(GLenum target
, GLfloat x
, GLfloat y
)
266 GET_CURRENT_CONTEXT(ctx
);
267 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
271 static void GLAPIENTRY
272 TAG(MultiTexCoord2fv
)(GLenum target
, const GLfloat
* v
)
274 GET_CURRENT_CONTEXT(ctx
);
275 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
279 static void GLAPIENTRY
280 TAG(MultiTexCoord3f
)(GLenum target
, GLfloat x
, GLfloat y
, GLfloat z
)
282 GET_CURRENT_CONTEXT(ctx
);
283 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
284 ATTR3F(attr
, x
, y
, z
);
287 static void GLAPIENTRY
288 TAG(MultiTexCoord3fv
)(GLenum target
, const GLfloat
* v
)
290 GET_CURRENT_CONTEXT(ctx
);
291 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
295 static void GLAPIENTRY
296 TAG(MultiTexCoord4f
)(GLenum target
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
298 GET_CURRENT_CONTEXT(ctx
);
299 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
300 ATTR4F(attr
, x
, y
, z
, w
);
303 static void GLAPIENTRY
304 TAG(MultiTexCoord4fv
)(GLenum target
, const GLfloat
* v
)
306 GET_CURRENT_CONTEXT(ctx
);
307 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
313 static void GLAPIENTRY
314 TAG(VertexAttrib1fARB
)(GLuint index
, GLfloat x
)
316 GET_CURRENT_CONTEXT(ctx
);
319 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
320 ATTR1F(VBO_ATTRIB_GENERIC0
+ index
, x
);
325 static void GLAPIENTRY
326 TAG(VertexAttrib1fvARB
)(GLuint index
, const GLfloat
* v
)
328 GET_CURRENT_CONTEXT(ctx
);
331 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
332 ATTR1FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
337 static void GLAPIENTRY
338 TAG(VertexAttrib2fARB
)(GLuint index
, GLfloat x
, GLfloat y
)
340 GET_CURRENT_CONTEXT(ctx
);
343 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
344 ATTR2F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
349 static void GLAPIENTRY
350 TAG(VertexAttrib2fvARB
)(GLuint index
, const GLfloat
* v
)
352 GET_CURRENT_CONTEXT(ctx
);
355 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
356 ATTR2FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
361 static void GLAPIENTRY
362 TAG(VertexAttrib3fARB
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
)
364 GET_CURRENT_CONTEXT(ctx
);
367 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
368 ATTR3F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
373 static void GLAPIENTRY
374 TAG(VertexAttrib3fvARB
)(GLuint index
, const GLfloat
* v
)
376 GET_CURRENT_CONTEXT(ctx
);
379 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
380 ATTR3FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
385 static void GLAPIENTRY
386 TAG(VertexAttrib4fARB
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
388 GET_CURRENT_CONTEXT(ctx
);
390 ATTR4F(0, x
, y
, z
, w
);
391 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
392 ATTR4F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
, w
);
397 static void GLAPIENTRY
398 TAG(VertexAttrib4fvARB
)(GLuint index
, const GLfloat
* v
)
400 GET_CURRENT_CONTEXT(ctx
);
403 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
404 ATTR4FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
410 /* In addition to supporting NV_vertex_program, these entrypoints are
411 * used by the display list and other code specifically because of
412 * their property of aliasing with other attributes. (See
413 * vbo_save_loopback.c)
415 static void GLAPIENTRY
416 TAG(VertexAttrib1fNV
)(GLuint index
, GLfloat x
)
418 GET_CURRENT_CONTEXT(ctx
);
419 if (index
< VBO_ATTRIB_MAX
)
423 static void GLAPIENTRY
424 TAG(VertexAttrib1fvNV
)(GLuint index
, const GLfloat
* v
)
426 GET_CURRENT_CONTEXT(ctx
);
427 if (index
< VBO_ATTRIB_MAX
)
431 static void GLAPIENTRY
432 TAG(VertexAttrib2fNV
)(GLuint index
, GLfloat x
, GLfloat y
)
434 GET_CURRENT_CONTEXT(ctx
);
435 if (index
< VBO_ATTRIB_MAX
)
439 static void GLAPIENTRY
440 TAG(VertexAttrib2fvNV
)(GLuint index
, const GLfloat
* v
)
442 GET_CURRENT_CONTEXT(ctx
);
443 if (index
< VBO_ATTRIB_MAX
)
447 static void GLAPIENTRY
448 TAG(VertexAttrib3fNV
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
)
450 GET_CURRENT_CONTEXT(ctx
);
451 if (index
< VBO_ATTRIB_MAX
)
452 ATTR3F(index
, x
, y
, z
);
455 static void GLAPIENTRY
456 TAG(VertexAttrib3fvNV
)(GLuint index
,
459 GET_CURRENT_CONTEXT(ctx
);
460 if (index
< VBO_ATTRIB_MAX
)
464 static void GLAPIENTRY
465 TAG(VertexAttrib4fNV
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
467 GET_CURRENT_CONTEXT(ctx
);
468 if (index
< VBO_ATTRIB_MAX
)
469 ATTR4F(index
, x
, y
, z
, w
);
472 static void GLAPIENTRY
473 TAG(VertexAttrib4fvNV
)(GLuint index
, const GLfloat
* v
)
475 GET_CURRENT_CONTEXT(ctx
);
476 if (index
< VBO_ATTRIB_MAX
)
482 #define MAT( ATTR, N, face, params ) \
484 if (face != GL_BACK) \
485 MAT_ATTR( ATTR, N, params ); /* front */ \
486 if (face != GL_FRONT) \
487 MAT_ATTR( ATTR + 1, N, params ); /* back */ \
491 /* Colormaterial conflicts are dealt with later.
493 static void GLAPIENTRY
494 TAG(Materialfv
)(GLenum face
, GLenum pname
,
495 const GLfloat
* params
)
497 GET_CURRENT_CONTEXT(ctx
);
500 MAT(VBO_ATTRIB_MAT_FRONT_EMISSION
, 4, face
, params
);
503 MAT(VBO_ATTRIB_MAT_FRONT_AMBIENT
, 4, face
, params
);
506 MAT(VBO_ATTRIB_MAT_FRONT_DIFFUSE
, 4, face
, params
);
509 MAT(VBO_ATTRIB_MAT_FRONT_SPECULAR
, 4, face
, params
);
512 MAT(VBO_ATTRIB_MAT_FRONT_SHININESS
, 1, face
, params
);
514 case GL_COLOR_INDEXES
:
515 MAT(VBO_ATTRIB_MAT_FRONT_INDEXES
, 3, face
, params
);
517 case GL_AMBIENT_AND_DIFFUSE
:
518 MAT(VBO_ATTRIB_MAT_FRONT_AMBIENT
, 4, face
, params
);
519 MAT(VBO_ATTRIB_MAT_FRONT_DIFFUSE
, 4, face
, params
);