1 /**************************************************************************
3 Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas.
4 Copyright 2011 Dave Airlie (ARB_vertex_type_2_10_10_10_rev support)
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] )
62 static inline float conv_ui10_to_norm_float(unsigned ui10
)
64 return (float)(ui10
) / 1023.0;
67 static inline float conv_ui2_to_norm_float(unsigned ui2
)
69 return (float)(ui2
) / 3.0;
72 #define ATTRUI10_1( A, UI ) ATTR( A, 1, (UI) & 0x3ff, 0, 0, 1 )
73 #define ATTRUI10_2( A, UI ) ATTR( A, 2, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, 0, 1 )
74 #define ATTRUI10_3( A, UI ) ATTR( A, 3, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, 1 )
75 #define ATTRUI10_4( A, UI ) ATTR( A, 4, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, ((UI) >> 30) & 0x3 )
77 #define ATTRUI10N_1( A, UI ) ATTR( A, 1, conv_ui10_to_norm_float((UI) & 0x3ff), 0, 0, 1 )
78 #define ATTRUI10N_2( A, UI ) ATTR( A, 2, \
79 conv_ui10_to_norm_float((UI) & 0x3ff), \
80 conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), 0, 1 )
81 #define ATTRUI10N_3( A, UI ) ATTR( A, 3, \
82 conv_ui10_to_norm_float((UI) & 0x3ff), \
83 conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
84 conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), 1 )
85 #define ATTRUI10N_4( A, UI ) ATTR( A, 4, \
86 conv_ui10_to_norm_float((UI) & 0x3ff), \
87 conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
88 conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), \
89 conv_ui2_to_norm_float(((UI) >> 30) & 0x3) )
91 struct attr_bits_10
{signed int x
:10;};
92 struct attr_bits_2
{signed int x
:2;};
94 static inline float conv_i10_to_i(int i10
)
96 struct attr_bits_10 val
;
101 static inline float conv_i2_to_i(int i2
)
103 struct attr_bits_2 val
;
108 static inline float conv_i10_to_norm_float(int i10
)
110 struct attr_bits_10 val
;
112 return (2.0F
* (float)val
.x
+ 1.0F
) * (1.0F
/ 511.0F
);
115 static inline float conv_i2_to_norm_float(int i2
)
117 struct attr_bits_2 val
;
122 #define ATTRI10_1( A, I10 ) ATTR( A, 1, conv_i10_to_i((I10) & 0x3ff), 0, 0, 1 )
123 #define ATTRI10_2( A, I10 ) ATTR( A, 2, \
124 conv_i10_to_i((I10) & 0x3ff), \
125 conv_i10_to_i(((I10) >> 10) & 0x3ff), 0, 1 )
126 #define ATTRI10_3( A, I10 ) ATTR( A, 3, \
127 conv_i10_to_i((I10) & 0x3ff), \
128 conv_i10_to_i(((I10) >> 10) & 0x3ff), \
129 conv_i10_to_i(((I10) >> 20) & 0x3ff), 1 )
130 #define ATTRI10_4( A, I10 ) ATTR( A, 4, \
131 conv_i10_to_i((I10) & 0x3ff), \
132 conv_i10_to_i(((I10) >> 10) & 0x3ff), \
133 conv_i10_to_i(((I10) >> 20) & 0x3ff), \
134 conv_i2_to_i(((I10) >> 30) & 0x3))
137 #define ATTRI10N_1( A, I10 ) ATTR( A, 1, conv_i10_to_norm_float((I10) & 0x3ff), 0, 0, 1 )
138 #define ATTRI10N_2( A, I10 ) ATTR( A, 2, \
139 conv_i10_to_norm_float((I10) & 0x3ff), \
140 conv_i10_to_norm_float(((I10) >> 10) & 0x3ff), 0, 1 )
141 #define ATTRI10N_3( A, I10 ) ATTR( A, 3, \
142 conv_i10_to_norm_float((I10) & 0x3ff), \
143 conv_i10_to_norm_float(((I10) >> 10) & 0x3ff), \
144 conv_i10_to_norm_float(((I10) >> 20) & 0x3ff), 1 )
145 #define ATTRI10N_4( A, I10 ) ATTR( A, 4, \
146 conv_i10_to_norm_float((I10) & 0x3ff), \
147 conv_i10_to_norm_float(((I10) >> 10) & 0x3ff), \
148 conv_i10_to_norm_float(((I10) >> 20) & 0x3ff), \
149 conv_i2_to_norm_float(((I10) >> 30) & 0x3))
151 #define ATTR_UI(val, type, normalized, attr, arg) do { \
152 if ((type) == GL_UNSIGNED_INT_2_10_10_10_REV) { \
154 ATTRUI10N_##val((attr), (arg)); \
156 ATTRUI10_##val((attr), (arg)); \
158 } else if ((type) == GL_INT_2_10_10_10_REV) { \
160 ATTRI10N_##val((attr), (arg)); \
162 ATTRI10_##val((attr), (arg)); \
165 ERROR(GL_INVALID_VALUE); \
168 #define ATTR_UI_INDEX(val, type, normalized, index, arg) do { \
169 if ((index) == 0) { \
170 ATTR_UI(val, (type), normalized, 0, (arg)); \
171 } else if ((index) < MAX_VERTEX_GENERIC_ATTRIBS) { \
172 ATTR_UI(val, (type), normalized, VBO_ATTRIB_GENERIC0 + (index), (arg)); \
174 ERROR(GL_INVALID_VALUE); \
177 static void GLAPIENTRY
178 TAG(Vertex2f
)(GLfloat x
, GLfloat y
)
180 GET_CURRENT_CONTEXT(ctx
);
181 ATTR2F(VBO_ATTRIB_POS
, x
, y
);
184 static void GLAPIENTRY
185 TAG(Vertex2fv
)(const GLfloat
* v
)
187 GET_CURRENT_CONTEXT(ctx
);
188 ATTR2FV(VBO_ATTRIB_POS
, v
);
191 static void GLAPIENTRY
192 TAG(Vertex3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
194 GET_CURRENT_CONTEXT(ctx
);
195 ATTR3F(VBO_ATTRIB_POS
, x
, y
, z
);
198 static void GLAPIENTRY
199 TAG(Vertex3fv
)(const GLfloat
* v
)
201 GET_CURRENT_CONTEXT(ctx
);
202 ATTR3FV(VBO_ATTRIB_POS
, v
);
205 static void GLAPIENTRY
206 TAG(Vertex4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
208 GET_CURRENT_CONTEXT(ctx
);
209 ATTR4F(VBO_ATTRIB_POS
, x
, y
, z
, w
);
212 static void GLAPIENTRY
213 TAG(Vertex4fv
)(const GLfloat
* v
)
215 GET_CURRENT_CONTEXT(ctx
);
216 ATTR4FV(VBO_ATTRIB_POS
, v
);
221 static void GLAPIENTRY
222 TAG(TexCoord1f
)(GLfloat x
)
224 GET_CURRENT_CONTEXT(ctx
);
225 ATTR1F(VBO_ATTRIB_TEX0
, x
);
228 static void GLAPIENTRY
229 TAG(TexCoord1fv
)(const GLfloat
* v
)
231 GET_CURRENT_CONTEXT(ctx
);
232 ATTR1FV(VBO_ATTRIB_TEX0
, v
);
235 static void GLAPIENTRY
236 TAG(TexCoord2f
)(GLfloat x
, GLfloat y
)
238 GET_CURRENT_CONTEXT(ctx
);
239 ATTR2F(VBO_ATTRIB_TEX0
, x
, y
);
242 static void GLAPIENTRY
243 TAG(TexCoord2fv
)(const GLfloat
* v
)
245 GET_CURRENT_CONTEXT(ctx
);
246 ATTR2FV(VBO_ATTRIB_TEX0
, v
);
249 static void GLAPIENTRY
250 TAG(TexCoord3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
252 GET_CURRENT_CONTEXT(ctx
);
253 ATTR3F(VBO_ATTRIB_TEX0
, x
, y
, z
);
256 static void GLAPIENTRY
257 TAG(TexCoord3fv
)(const GLfloat
* v
)
259 GET_CURRENT_CONTEXT(ctx
);
260 ATTR3FV(VBO_ATTRIB_TEX0
, v
);
263 static void GLAPIENTRY
264 TAG(TexCoord4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
266 GET_CURRENT_CONTEXT(ctx
);
267 ATTR4F(VBO_ATTRIB_TEX0
, x
, y
, z
, w
);
270 static void GLAPIENTRY
271 TAG(TexCoord4fv
)(const GLfloat
* v
)
273 GET_CURRENT_CONTEXT(ctx
);
274 ATTR4FV(VBO_ATTRIB_TEX0
, v
);
279 static void GLAPIENTRY
280 TAG(Normal3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
282 GET_CURRENT_CONTEXT(ctx
);
283 ATTR3F(VBO_ATTRIB_NORMAL
, x
, y
, z
);
286 static void GLAPIENTRY
287 TAG(Normal3fv
)(const GLfloat
* v
)
289 GET_CURRENT_CONTEXT(ctx
);
290 ATTR3FV(VBO_ATTRIB_NORMAL
, v
);
295 static void GLAPIENTRY
296 TAG(FogCoordfEXT
)(GLfloat x
)
298 GET_CURRENT_CONTEXT(ctx
);
299 ATTR1F(VBO_ATTRIB_FOG
, x
);
304 static void GLAPIENTRY
305 TAG(FogCoordfvEXT
)(const GLfloat
* v
)
307 GET_CURRENT_CONTEXT(ctx
);
308 ATTR1FV(VBO_ATTRIB_FOG
, v
);
311 static void GLAPIENTRY
312 TAG(Color3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
314 GET_CURRENT_CONTEXT(ctx
);
315 ATTR3F(VBO_ATTRIB_COLOR0
, x
, y
, z
);
318 static void GLAPIENTRY
319 TAG(Color3fv
)(const GLfloat
* v
)
321 GET_CURRENT_CONTEXT(ctx
);
322 ATTR3FV(VBO_ATTRIB_COLOR0
, v
);
325 static void GLAPIENTRY
326 TAG(Color4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
328 GET_CURRENT_CONTEXT(ctx
);
329 ATTR4F(VBO_ATTRIB_COLOR0
, x
, y
, z
, w
);
332 static void GLAPIENTRY
333 TAG(Color4fv
)(const GLfloat
* v
)
335 GET_CURRENT_CONTEXT(ctx
);
336 ATTR4FV(VBO_ATTRIB_COLOR0
, v
);
341 static void GLAPIENTRY
342 TAG(SecondaryColor3fEXT
)(GLfloat x
, GLfloat y
, GLfloat z
)
344 GET_CURRENT_CONTEXT(ctx
);
345 ATTR3F(VBO_ATTRIB_COLOR1
, x
, y
, z
);
348 static void GLAPIENTRY
349 TAG(SecondaryColor3fvEXT
)(const GLfloat
* v
)
351 GET_CURRENT_CONTEXT(ctx
);
352 ATTR3FV(VBO_ATTRIB_COLOR1
, v
);
357 static void GLAPIENTRY
358 TAG(EdgeFlag
)(GLboolean b
)
360 GET_CURRENT_CONTEXT(ctx
);
361 ATTR1F(VBO_ATTRIB_EDGEFLAG
, (GLfloat
) b
);
366 static void GLAPIENTRY
367 TAG(Indexf
)(GLfloat f
)
369 GET_CURRENT_CONTEXT(ctx
);
370 ATTR1F(VBO_ATTRIB_INDEX
, f
);
373 static void GLAPIENTRY
374 TAG(Indexfv
)(const GLfloat
* f
)
376 GET_CURRENT_CONTEXT(ctx
);
377 ATTR1FV(VBO_ATTRIB_INDEX
, f
);
382 static void GLAPIENTRY
383 TAG(MultiTexCoord1f
)(GLenum target
, GLfloat x
)
385 GET_CURRENT_CONTEXT(ctx
);
386 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
390 static void GLAPIENTRY
391 TAG(MultiTexCoord1fv
)(GLenum target
, const GLfloat
* v
)
393 GET_CURRENT_CONTEXT(ctx
);
394 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
398 static void GLAPIENTRY
399 TAG(MultiTexCoord2f
)(GLenum target
, GLfloat x
, GLfloat y
)
401 GET_CURRENT_CONTEXT(ctx
);
402 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
406 static void GLAPIENTRY
407 TAG(MultiTexCoord2fv
)(GLenum target
, const GLfloat
* v
)
409 GET_CURRENT_CONTEXT(ctx
);
410 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
414 static void GLAPIENTRY
415 TAG(MultiTexCoord3f
)(GLenum target
, GLfloat x
, GLfloat y
, GLfloat z
)
417 GET_CURRENT_CONTEXT(ctx
);
418 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
419 ATTR3F(attr
, x
, y
, z
);
422 static void GLAPIENTRY
423 TAG(MultiTexCoord3fv
)(GLenum target
, const GLfloat
* v
)
425 GET_CURRENT_CONTEXT(ctx
);
426 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
430 static void GLAPIENTRY
431 TAG(MultiTexCoord4f
)(GLenum target
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
433 GET_CURRENT_CONTEXT(ctx
);
434 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
435 ATTR4F(attr
, x
, y
, z
, w
);
438 static void GLAPIENTRY
439 TAG(MultiTexCoord4fv
)(GLenum target
, const GLfloat
* v
)
441 GET_CURRENT_CONTEXT(ctx
);
442 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
448 static void GLAPIENTRY
449 TAG(VertexAttrib1fARB
)(GLuint index
, GLfloat x
)
451 GET_CURRENT_CONTEXT(ctx
);
454 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
455 ATTR1F(VBO_ATTRIB_GENERIC0
+ index
, x
);
457 ERROR(GL_INVALID_VALUE
);
460 static void GLAPIENTRY
461 TAG(VertexAttrib1fvARB
)(GLuint index
, const GLfloat
* v
)
463 GET_CURRENT_CONTEXT(ctx
);
466 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
467 ATTR1FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
469 ERROR(GL_INVALID_VALUE
);
472 static void GLAPIENTRY
473 TAG(VertexAttrib2fARB
)(GLuint index
, GLfloat x
, GLfloat y
)
475 GET_CURRENT_CONTEXT(ctx
);
478 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
479 ATTR2F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
481 ERROR(GL_INVALID_VALUE
);
484 static void GLAPIENTRY
485 TAG(VertexAttrib2fvARB
)(GLuint index
, const GLfloat
* v
)
487 GET_CURRENT_CONTEXT(ctx
);
490 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
491 ATTR2FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
493 ERROR(GL_INVALID_VALUE
);
496 static void GLAPIENTRY
497 TAG(VertexAttrib3fARB
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
)
499 GET_CURRENT_CONTEXT(ctx
);
502 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
503 ATTR3F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
505 ERROR(GL_INVALID_VALUE
);
508 static void GLAPIENTRY
509 TAG(VertexAttrib3fvARB
)(GLuint index
, const GLfloat
* v
)
511 GET_CURRENT_CONTEXT(ctx
);
514 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
515 ATTR3FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
517 ERROR(GL_INVALID_VALUE
);
520 static void GLAPIENTRY
521 TAG(VertexAttrib4fARB
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
523 GET_CURRENT_CONTEXT(ctx
);
525 ATTR4F(0, x
, y
, z
, w
);
526 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
527 ATTR4F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
, w
);
529 ERROR(GL_INVALID_VALUE
);
532 static void GLAPIENTRY
533 TAG(VertexAttrib4fvARB
)(GLuint index
, const GLfloat
* v
)
535 GET_CURRENT_CONTEXT(ctx
);
538 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
539 ATTR4FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
541 ERROR(GL_INVALID_VALUE
);
546 /* Integer-valued generic attributes.
547 * XXX: the integers just get converted to floats at this time
549 static void GLAPIENTRY
550 TAG(VertexAttribI1i
)(GLuint index
, GLint x
)
552 GET_CURRENT_CONTEXT(ctx
);
555 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
556 ATTR1I(VBO_ATTRIB_GENERIC0
+ index
, x
);
558 ERROR(GL_INVALID_VALUE
);
561 static void GLAPIENTRY
562 TAG(VertexAttribI2i
)(GLuint index
, GLint x
, GLint y
)
564 GET_CURRENT_CONTEXT(ctx
);
567 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
568 ATTR2I(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
570 ERROR(GL_INVALID_VALUE
);
573 static void GLAPIENTRY
574 TAG(VertexAttribI3i
)(GLuint index
, GLint x
, GLint y
, GLint z
)
576 GET_CURRENT_CONTEXT(ctx
);
579 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
580 ATTR3I(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
582 ERROR(GL_INVALID_VALUE
);
585 static void GLAPIENTRY
586 TAG(VertexAttribI4i
)(GLuint index
, GLint x
, GLint y
, GLint z
, GLint w
)
588 GET_CURRENT_CONTEXT(ctx
);
590 ATTR4I(0, x
, y
, z
, w
);
591 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
592 ATTR4I(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
, w
);
594 ERROR(GL_INVALID_VALUE
);
597 static void GLAPIENTRY
598 TAG(VertexAttribI2iv
)(GLuint index
, const GLint
*v
)
600 GET_CURRENT_CONTEXT(ctx
);
603 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
604 ATTR2IV(VBO_ATTRIB_GENERIC0
+ index
, v
);
606 ERROR(GL_INVALID_VALUE
);
609 static void GLAPIENTRY
610 TAG(VertexAttribI3iv
)(GLuint index
, const GLint
*v
)
612 GET_CURRENT_CONTEXT(ctx
);
615 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
616 ATTR3IV(VBO_ATTRIB_GENERIC0
+ index
, v
);
618 ERROR(GL_INVALID_VALUE
);
621 static void GLAPIENTRY
622 TAG(VertexAttribI4iv
)(GLuint index
, const GLint
*v
)
624 GET_CURRENT_CONTEXT(ctx
);
627 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
628 ATTR4IV(VBO_ATTRIB_GENERIC0
+ index
, v
);
630 ERROR(GL_INVALID_VALUE
);
635 /* Unsigned integer-valued generic attributes.
636 * XXX: the integers just get converted to floats at this time
638 static void GLAPIENTRY
639 TAG(VertexAttribI1ui
)(GLuint index
, GLuint x
)
641 GET_CURRENT_CONTEXT(ctx
);
644 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
645 ATTR1UI(VBO_ATTRIB_GENERIC0
+ index
, x
);
647 ERROR(GL_INVALID_VALUE
);
650 static void GLAPIENTRY
651 TAG(VertexAttribI2ui
)(GLuint index
, GLuint x
, GLuint y
)
653 GET_CURRENT_CONTEXT(ctx
);
656 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
657 ATTR2UI(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
659 ERROR(GL_INVALID_VALUE
);
662 static void GLAPIENTRY
663 TAG(VertexAttribI3ui
)(GLuint index
, GLuint x
, GLuint y
, GLuint z
)
665 GET_CURRENT_CONTEXT(ctx
);
668 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
669 ATTR3UI(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
671 ERROR(GL_INVALID_VALUE
);
674 static void GLAPIENTRY
675 TAG(VertexAttribI4ui
)(GLuint index
, GLuint x
, GLuint y
, GLuint z
, GLuint w
)
677 GET_CURRENT_CONTEXT(ctx
);
679 ATTR4UI(0, x
, y
, z
, w
);
680 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
681 ATTR4UI(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
, w
);
683 ERROR(GL_INVALID_VALUE
);
686 static void GLAPIENTRY
687 TAG(VertexAttribI2uiv
)(GLuint index
, const GLuint
*v
)
689 GET_CURRENT_CONTEXT(ctx
);
692 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
693 ATTR2UIV(VBO_ATTRIB_GENERIC0
+ index
, v
);
695 ERROR(GL_INVALID_VALUE
);
698 static void GLAPIENTRY
699 TAG(VertexAttribI3uiv
)(GLuint index
, const GLuint
*v
)
701 GET_CURRENT_CONTEXT(ctx
);
704 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
705 ATTR3UIV(VBO_ATTRIB_GENERIC0
+ index
, v
);
707 ERROR(GL_INVALID_VALUE
);
710 static void GLAPIENTRY
711 TAG(VertexAttribI4uiv
)(GLuint index
, const GLuint
*v
)
713 GET_CURRENT_CONTEXT(ctx
);
716 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
717 ATTR4UIV(VBO_ATTRIB_GENERIC0
+ index
, v
);
719 ERROR(GL_INVALID_VALUE
);
724 /* In addition to supporting NV_vertex_program, these entrypoints are
725 * used by the display list and other code specifically because of
726 * their property of aliasing with other attributes. (See
727 * vbo_save_loopback.c)
729 static void GLAPIENTRY
730 TAG(VertexAttrib1fNV
)(GLuint index
, GLfloat x
)
732 GET_CURRENT_CONTEXT(ctx
);
733 if (index
< VBO_ATTRIB_MAX
)
737 static void GLAPIENTRY
738 TAG(VertexAttrib1fvNV
)(GLuint index
, const GLfloat
* v
)
740 GET_CURRENT_CONTEXT(ctx
);
741 if (index
< VBO_ATTRIB_MAX
)
745 static void GLAPIENTRY
746 TAG(VertexAttrib2fNV
)(GLuint index
, GLfloat x
, GLfloat y
)
748 GET_CURRENT_CONTEXT(ctx
);
749 if (index
< VBO_ATTRIB_MAX
)
753 static void GLAPIENTRY
754 TAG(VertexAttrib2fvNV
)(GLuint index
, const GLfloat
* v
)
756 GET_CURRENT_CONTEXT(ctx
);
757 if (index
< VBO_ATTRIB_MAX
)
761 static void GLAPIENTRY
762 TAG(VertexAttrib3fNV
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
)
764 GET_CURRENT_CONTEXT(ctx
);
765 if (index
< VBO_ATTRIB_MAX
)
766 ATTR3F(index
, x
, y
, z
);
769 static void GLAPIENTRY
770 TAG(VertexAttrib3fvNV
)(GLuint index
,
773 GET_CURRENT_CONTEXT(ctx
);
774 if (index
< VBO_ATTRIB_MAX
)
778 static void GLAPIENTRY
779 TAG(VertexAttrib4fNV
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
781 GET_CURRENT_CONTEXT(ctx
);
782 if (index
< VBO_ATTRIB_MAX
)
783 ATTR4F(index
, x
, y
, z
, w
);
786 static void GLAPIENTRY
787 TAG(VertexAttrib4fvNV
)(GLuint index
, const GLfloat
* v
)
789 GET_CURRENT_CONTEXT(ctx
);
790 if (index
< VBO_ATTRIB_MAX
)
796 #define MAT( ATTR, N, face, params ) \
798 if (face != GL_BACK) \
799 MAT_ATTR( ATTR, N, params ); /* front */ \
800 if (face != GL_FRONT) \
801 MAT_ATTR( ATTR + 1, N, params ); /* back */ \
805 /* Colormaterial conflicts are dealt with later.
807 static void GLAPIENTRY
808 TAG(Materialfv
)(GLenum face
, GLenum pname
,
809 const GLfloat
* params
)
811 GET_CURRENT_CONTEXT(ctx
);
814 MAT(VBO_ATTRIB_MAT_FRONT_EMISSION
, 4, face
, params
);
817 MAT(VBO_ATTRIB_MAT_FRONT_AMBIENT
, 4, face
, params
);
820 MAT(VBO_ATTRIB_MAT_FRONT_DIFFUSE
, 4, face
, params
);
823 MAT(VBO_ATTRIB_MAT_FRONT_SPECULAR
, 4, face
, params
);
826 MAT(VBO_ATTRIB_MAT_FRONT_SHININESS
, 1, face
, params
);
828 case GL_COLOR_INDEXES
:
829 MAT(VBO_ATTRIB_MAT_FRONT_INDEXES
, 3, face
, params
);
831 case GL_AMBIENT_AND_DIFFUSE
:
832 MAT(VBO_ATTRIB_MAT_FRONT_AMBIENT
, 4, face
, params
);
833 MAT(VBO_ATTRIB_MAT_FRONT_DIFFUSE
, 4, face
, params
);
836 ERROR(GL_INVALID_ENUM
);
841 static void GLAPIENTRY
842 TAG(VertexP2ui
)(GLenum type
, GLuint value
)
844 GET_CURRENT_CONTEXT(ctx
);
845 ATTR_UI(2, type
, 0, VBO_ATTRIB_POS
, value
);
848 static void GLAPIENTRY
849 TAG(VertexP2uiv
)(GLenum type
, const GLuint
*value
)
851 GET_CURRENT_CONTEXT(ctx
);
852 ATTR_UI(2, type
, 0, VBO_ATTRIB_POS
, value
[0]);
855 static void GLAPIENTRY
856 TAG(VertexP3ui
)(GLenum type
, GLuint value
)
858 GET_CURRENT_CONTEXT(ctx
);
859 ATTR_UI(3, type
, 0, VBO_ATTRIB_POS
, value
);
862 static void GLAPIENTRY
863 TAG(VertexP3uiv
)(GLenum type
, const GLuint
*value
)
865 GET_CURRENT_CONTEXT(ctx
);
866 ATTR_UI(3, type
, 0, VBO_ATTRIB_POS
, value
[0]);
869 static void GLAPIENTRY
870 TAG(VertexP4ui
)(GLenum type
, GLuint value
)
872 GET_CURRENT_CONTEXT(ctx
);
873 ATTR_UI(4, type
, 0, VBO_ATTRIB_POS
, value
);
876 static void GLAPIENTRY
877 TAG(VertexP4uiv
)(GLenum type
, const GLuint
*value
)
879 GET_CURRENT_CONTEXT(ctx
);
880 ATTR_UI(4, type
, 0, VBO_ATTRIB_POS
, value
[0]);
883 static void GLAPIENTRY
884 TAG(TexCoordP1ui
)(GLenum type
, GLuint coords
)
886 GET_CURRENT_CONTEXT(ctx
);
887 ATTR_UI(1, type
, 0, VBO_ATTRIB_TEX0
, coords
);
890 static void GLAPIENTRY
891 TAG(TexCoordP1uiv
)(GLenum type
, const GLuint
*coords
)
893 GET_CURRENT_CONTEXT(ctx
);
894 ATTR_UI(1, type
, 0, VBO_ATTRIB_TEX0
, coords
[0]);
897 static void GLAPIENTRY
898 TAG(TexCoordP2ui
)(GLenum type
, GLuint coords
)
900 GET_CURRENT_CONTEXT(ctx
);
901 ATTR_UI(2, type
, 0, VBO_ATTRIB_TEX0
, coords
);
904 static void GLAPIENTRY
905 TAG(TexCoordP2uiv
)(GLenum type
, const GLuint
*coords
)
907 GET_CURRENT_CONTEXT(ctx
);
908 ATTR_UI(2, type
, 0, VBO_ATTRIB_TEX0
, coords
[0]);
911 static void GLAPIENTRY
912 TAG(TexCoordP3ui
)(GLenum type
, GLuint coords
)
914 GET_CURRENT_CONTEXT(ctx
);
915 ATTR_UI(3, type
, 0, VBO_ATTRIB_TEX0
, coords
);
918 static void GLAPIENTRY
919 TAG(TexCoordP3uiv
)(GLenum type
, const GLuint
*coords
)
921 GET_CURRENT_CONTEXT(ctx
);
922 ATTR_UI(3, type
, 0, VBO_ATTRIB_TEX0
, coords
[0]);
925 static void GLAPIENTRY
926 TAG(TexCoordP4ui
)(GLenum type
, GLuint coords
)
928 GET_CURRENT_CONTEXT(ctx
);
929 ATTR_UI(4, type
, 0, VBO_ATTRIB_TEX0
, coords
);
932 static void GLAPIENTRY
933 TAG(TexCoordP4uiv
)(GLenum type
, const GLuint
*coords
)
935 GET_CURRENT_CONTEXT(ctx
);
936 ATTR_UI(4, type
, 0, VBO_ATTRIB_TEX0
, coords
[0]);
939 static void GLAPIENTRY
940 TAG(MultiTexCoordP1ui
)(GLenum target
, GLenum type
, GLuint coords
)
942 GET_CURRENT_CONTEXT(ctx
);
943 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
944 ATTR_UI(1, type
, 0, attr
, coords
);
947 static void GLAPIENTRY
948 TAG(MultiTexCoordP1uiv
)(GLenum target
, GLenum type
, const GLuint
*coords
)
950 GET_CURRENT_CONTEXT(ctx
);
951 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
952 ATTR_UI(1, type
, 0, attr
, coords
[0]);
955 static void GLAPIENTRY
956 TAG(MultiTexCoordP2ui
)(GLenum target
, GLenum type
, GLuint coords
)
958 GET_CURRENT_CONTEXT(ctx
);
959 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
960 ATTR_UI(2, type
, 0, attr
, coords
);
963 static void GLAPIENTRY
964 TAG(MultiTexCoordP2uiv
)(GLenum target
, GLenum type
, const GLuint
*coords
)
966 GET_CURRENT_CONTEXT(ctx
);
967 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
968 ATTR_UI(2, type
, 0, attr
, coords
[0]);
971 static void GLAPIENTRY
972 TAG(MultiTexCoordP3ui
)(GLenum target
, GLenum type
, GLuint coords
)
974 GET_CURRENT_CONTEXT(ctx
);
975 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
976 ATTR_UI(3, type
, 0, attr
, coords
);
979 static void GLAPIENTRY
980 TAG(MultiTexCoordP3uiv
)(GLenum target
, GLenum type
, const GLuint
*coords
)
982 GET_CURRENT_CONTEXT(ctx
);
983 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
984 ATTR_UI(3, type
, 0, attr
, coords
[0]);
987 static void GLAPIENTRY
988 TAG(MultiTexCoordP4ui
)(GLenum target
, GLenum type
, GLuint coords
)
990 GET_CURRENT_CONTEXT(ctx
);
991 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
992 ATTR_UI(4, type
, 0, attr
, coords
);
995 static void GLAPIENTRY
996 TAG(MultiTexCoordP4uiv
)(GLenum target
, GLenum type
, const GLuint
*coords
)
998 GET_CURRENT_CONTEXT(ctx
);
999 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
1000 ATTR_UI(4, type
, 0, attr
, coords
[0]);
1003 static void GLAPIENTRY
1004 TAG(NormalP3ui
)(GLenum type
, GLuint coords
)
1006 GET_CURRENT_CONTEXT(ctx
);
1007 ATTR_UI(3, type
, 1, VBO_ATTRIB_NORMAL
, coords
);
1010 static void GLAPIENTRY
1011 TAG(NormalP3uiv
)(GLenum type
, const GLuint
*coords
)
1013 GET_CURRENT_CONTEXT(ctx
);
1014 ATTR_UI(3, type
, 1, VBO_ATTRIB_NORMAL
, coords
[0]);
1017 static void GLAPIENTRY
1018 TAG(ColorP3ui
)(GLenum type
, GLuint color
)
1020 GET_CURRENT_CONTEXT(ctx
);
1021 ATTR_UI(3, type
, 1, VBO_ATTRIB_COLOR0
, color
);
1024 static void GLAPIENTRY
1025 TAG(ColorP3uiv
)(GLenum type
, const GLuint
*color
)
1027 GET_CURRENT_CONTEXT(ctx
);
1028 ATTR_UI(3, type
, 1, VBO_ATTRIB_COLOR0
, color
[0]);
1031 static void GLAPIENTRY
1032 TAG(ColorP4ui
)(GLenum type
, GLuint color
)
1034 GET_CURRENT_CONTEXT(ctx
);
1035 ATTR_UI(4, type
, 1, VBO_ATTRIB_COLOR0
, color
);
1038 static void GLAPIENTRY
1039 TAG(ColorP4uiv
)(GLenum type
, const GLuint
*color
)
1041 GET_CURRENT_CONTEXT(ctx
);
1042 ATTR_UI(4, type
, 1, VBO_ATTRIB_COLOR0
, color
[0]);
1045 static void GLAPIENTRY
1046 TAG(SecondaryColorP3ui
)(GLenum type
, GLuint color
)
1048 GET_CURRENT_CONTEXT(ctx
);
1049 ATTR_UI(3, type
, 1, VBO_ATTRIB_COLOR1
, color
);
1052 static void GLAPIENTRY
1053 TAG(SecondaryColorP3uiv
)(GLenum type
, const GLuint
*color
)
1055 GET_CURRENT_CONTEXT(ctx
);
1056 ATTR_UI(3, type
, 1, VBO_ATTRIB_COLOR1
, color
[0]);
1059 static void GLAPIENTRY
1060 TAG(VertexAttribP1ui
)(GLuint index
, GLenum type
, GLboolean normalized
,
1063 GET_CURRENT_CONTEXT(ctx
);
1064 ATTR_UI_INDEX(1, type
, normalized
, index
, value
);
1067 static void GLAPIENTRY
1068 TAG(VertexAttribP2ui
)(GLuint index
, GLenum type
, GLboolean normalized
,
1071 GET_CURRENT_CONTEXT(ctx
);
1072 ATTR_UI_INDEX(2, type
, normalized
, index
, value
);
1075 static void GLAPIENTRY
1076 TAG(VertexAttribP3ui
)(GLuint index
, GLenum type
, GLboolean normalized
,
1079 GET_CURRENT_CONTEXT(ctx
);
1080 ATTR_UI_INDEX(3, type
, normalized
, index
, value
);
1083 static void GLAPIENTRY
1084 TAG(VertexAttribP4ui
)(GLuint index
, GLenum type
, GLboolean normalized
,
1087 GET_CURRENT_CONTEXT(ctx
);
1088 ATTR_UI_INDEX(4, type
, normalized
, index
, value
);
1091 static void GLAPIENTRY
1092 TAG(VertexAttribP1uiv
)(GLuint index
, GLenum type
, GLboolean normalized
,
1093 const GLuint
*value
)
1095 GET_CURRENT_CONTEXT(ctx
);
1096 ATTR_UI_INDEX(1, type
, normalized
, index
, *value
);
1099 static void GLAPIENTRY
1100 TAG(VertexAttribP2uiv
)(GLuint index
, GLenum type
, GLboolean normalized
,
1101 const GLuint
*value
)
1103 GET_CURRENT_CONTEXT(ctx
);
1104 ATTR_UI_INDEX(2, type
, normalized
, index
, *value
);
1107 static void GLAPIENTRY
1108 TAG(VertexAttribP3uiv
)(GLuint index
, GLenum type
, GLboolean normalized
,
1109 const GLuint
*value
)
1111 GET_CURRENT_CONTEXT(ctx
);
1112 ATTR_UI_INDEX(3, type
, normalized
, index
, *value
);
1115 static void GLAPIENTRY
1116 TAG(VertexAttribP4uiv
)(GLuint index
, GLenum type
, GLboolean normalized
,
1117 const GLuint
*value
)
1119 GET_CURRENT_CONTEXT(ctx
);
1120 ATTR_UI_INDEX(4, type
, normalized
, index
, *value
);