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, GL_FLOAT, (V)[0], 0, 0, 1 )
30 #define ATTR2FV( A, V ) ATTR( A, 2, GL_FLOAT, (V)[0], (V)[1], 0, 1 )
31 #define ATTR3FV( A, V ) ATTR( A, 3, GL_FLOAT, (V)[0], (V)[1], (V)[2], 1 )
32 #define ATTR4FV( A, V ) ATTR( A, 4, GL_FLOAT, (V)[0], (V)[1], (V)[2], (V)[3] )
34 #define ATTR1F( A, X ) ATTR( A, 1, GL_FLOAT, X, 0, 0, 1 )
35 #define ATTR2F( A, X, Y ) ATTR( A, 2, GL_FLOAT, X, Y, 0, 1 )
36 #define ATTR3F( A, X, Y, Z ) ATTR( A, 3, GL_FLOAT, X, Y, Z, 1 )
37 #define ATTR4F( A, X, Y, Z, W ) ATTR( A, 4, GL_FLOAT, X, Y, Z, W )
40 #define ATTRI( A, N, X, Y, Z, W) ATTR( A, N, GL_INT, \
41 INT_AS_FLT(X), INT_AS_FLT(Y), \
42 INT_AS_FLT(Z), INT_AS_FLT(W) )
44 #define ATTR2IV( A, V ) ATTRI( A, 2, (V)[0], (V)[1], 0, 1 )
45 #define ATTR3IV( A, V ) ATTRI( A, 3, (V)[0], (V)[1], (V)[2], 1 )
46 #define ATTR4IV( A, V ) ATTRI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
48 #define ATTR1I( A, X ) ATTRI( A, 1, X, 0, 0, 1 )
49 #define ATTR2I( A, X, Y ) ATTRI( A, 2, X, Y, 0, 1 )
50 #define ATTR3I( A, X, Y, Z ) ATTRI( A, 3, X, Y, Z, 1 )
51 #define ATTR4I( A, X, Y, Z, W ) ATTRI( A, 4, X, Y, Z, W )
55 #define ATTRUI( A, N, X, Y, Z, W) ATTR( A, N, GL_UNSIGNED_INT, \
56 UINT_AS_FLT(X), UINT_AS_FLT(Y), \
57 UINT_AS_FLT(Z), UINT_AS_FLT(W) )
59 #define ATTR2UIV( A, V ) ATTRUI( A, 2, (V)[0], (V)[1], 0, 1 )
60 #define ATTR3UIV( A, V ) ATTRUI( A, 3, (V)[0], (V)[1], (V)[2], 1 )
61 #define ATTR4UIV( A, V ) ATTRUI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
63 #define ATTR1UI( A, X ) ATTRUI( A, 1, X, 0, 0, 1 )
64 #define ATTR2UI( A, X, Y ) ATTRUI( A, 2, X, Y, 0, 1 )
65 #define ATTR3UI( A, X, Y, Z ) ATTRUI( A, 3, X, Y, Z, 1 )
66 #define ATTR4UI( A, X, Y, Z, W ) ATTRUI( A, 4, X, Y, Z, W )
68 #define MAT_ATTR( A, N, V ) ATTR( A, N, GL_FLOAT, (V)[0], (V)[1], (V)[2], (V)[3] )
70 static inline float conv_ui10_to_norm_float(unsigned ui10
)
72 return ui10
/ 1023.0f
;
75 static inline float conv_ui2_to_norm_float(unsigned ui2
)
80 #define ATTRUI10_1( A, UI ) ATTR( A, 1, GL_FLOAT, (UI) & 0x3ff, 0, 0, 1 )
81 #define ATTRUI10_2( A, UI ) ATTR( A, 2, GL_FLOAT, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, 0, 1 )
82 #define ATTRUI10_3( A, UI ) ATTR( A, 3, GL_FLOAT, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, 1 )
83 #define ATTRUI10_4( A, UI ) ATTR( A, 4, GL_FLOAT, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, ((UI) >> 30) & 0x3 )
85 #define ATTRUI10N_1( A, UI ) ATTR( A, 1, GL_FLOAT, conv_ui10_to_norm_float((UI) & 0x3ff), 0, 0, 1 )
86 #define ATTRUI10N_2( A, UI ) ATTR( A, 2, GL_FLOAT, \
87 conv_ui10_to_norm_float((UI) & 0x3ff), \
88 conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), 0, 1 )
89 #define ATTRUI10N_3( A, UI ) ATTR( A, 3, GL_FLOAT, \
90 conv_ui10_to_norm_float((UI) & 0x3ff), \
91 conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
92 conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), 1 )
93 #define ATTRUI10N_4( A, UI ) ATTR( A, 4, GL_FLOAT, \
94 conv_ui10_to_norm_float((UI) & 0x3ff), \
95 conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
96 conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), \
97 conv_ui2_to_norm_float(((UI) >> 30) & 0x3) )
99 struct attr_bits_10
{signed int x
:10;};
100 struct attr_bits_2
{signed int x
:2;};
102 static inline float conv_i10_to_i(int i10
)
104 struct attr_bits_10 val
;
109 static inline float conv_i2_to_i(int i2
)
111 struct attr_bits_2 val
;
116 static inline float conv_i10_to_norm_float(const struct gl_context
*ctx
, int i10
)
118 struct attr_bits_10 val
;
120 return (2.0F
* (float)val
.x
+ 1.0F
) * (1.0F
/ 1023.0F
);
123 static inline float conv_i2_to_norm_float(const struct gl_context
*ctx
, int i2
)
125 struct attr_bits_2 val
;
127 return (2.0F
* (float)val
.x
+ 1.0F
) * (1.0F
/ 3.0F
);
130 #define ATTRI10_1( A, I10 ) ATTR( A, 1, GL_FLOAT, conv_i10_to_i((I10) & 0x3ff), 0, 0, 1 )
131 #define ATTRI10_2( A, I10 ) ATTR( A, 2, GL_FLOAT, \
132 conv_i10_to_i((I10) & 0x3ff), \
133 conv_i10_to_i(((I10) >> 10) & 0x3ff), 0, 1 )
134 #define ATTRI10_3( A, I10 ) ATTR( A, 3, GL_FLOAT, \
135 conv_i10_to_i((I10) & 0x3ff), \
136 conv_i10_to_i(((I10) >> 10) & 0x3ff), \
137 conv_i10_to_i(((I10) >> 20) & 0x3ff), 1 )
138 #define ATTRI10_4( A, I10 ) ATTR( A, 4, GL_FLOAT, \
139 conv_i10_to_i((I10) & 0x3ff), \
140 conv_i10_to_i(((I10) >> 10) & 0x3ff), \
141 conv_i10_to_i(((I10) >> 20) & 0x3ff), \
142 conv_i2_to_i(((I10) >> 30) & 0x3))
145 #define ATTRI10N_1(ctx, A, I10) ATTR(A, 1, GL_FLOAT, conv_i10_to_norm_float(ctx, (I10) & 0x3ff), 0, 0, 1 )
146 #define ATTRI10N_2(ctx, A, I10) ATTR(A, 2, GL_FLOAT, \
147 conv_i10_to_norm_float(ctx, (I10) & 0x3ff), \
148 conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), 0, 1 )
149 #define ATTRI10N_3(ctx, A, I10) ATTR(A, 3, GL_FLOAT, \
150 conv_i10_to_norm_float(ctx, (I10) & 0x3ff), \
151 conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \
152 conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff), 1 )
153 #define ATTRI10N_4(ctx, A, I10) ATTR(A, 4, GL_FLOAT, \
154 conv_i10_to_norm_float(ctx, (I10) & 0x3ff), \
155 conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \
156 conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff), \
157 conv_i2_to_norm_float(ctx, ((I10) >> 30) & 0x3))
159 #define ATTR_UI(ctx, val, type, normalized, attr, arg) do { \
160 if ((type) == GL_UNSIGNED_INT_2_10_10_10_REV) { \
162 ATTRUI10N_##val((attr), (arg)); \
164 ATTRUI10_##val((attr), (arg)); \
166 } else if ((type) == GL_INT_2_10_10_10_REV) { \
168 ATTRI10N_##val(ctx, (attr), (arg)); \
170 ATTRI10_##val((attr), (arg)); \
173 ERROR(GL_INVALID_VALUE); \
176 #define ATTR_UI_INDEX(ctx, val, type, normalized, index, arg) do { \
177 if ((index) == 0) { \
178 ATTR_UI(ctx, val, (type), normalized, 0, (arg)); \
179 } else if ((index) < MAX_VERTEX_GENERIC_ATTRIBS) { \
180 ATTR_UI(ctx, val, (type), normalized, VBO_ATTRIB_GENERIC0 + (index), (arg)); \
182 ERROR(GL_INVALID_VALUE); \
185 static void GLAPIENTRY
186 TAG(Vertex2f
)(GLfloat x
, GLfloat y
)
188 GET_CURRENT_CONTEXT(ctx
);
189 ATTR2F(VBO_ATTRIB_POS
, x
, y
);
192 static void GLAPIENTRY
193 TAG(Vertex2fv
)(const GLfloat
* v
)
195 GET_CURRENT_CONTEXT(ctx
);
196 ATTR2FV(VBO_ATTRIB_POS
, v
);
199 static void GLAPIENTRY
200 TAG(Vertex3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
202 GET_CURRENT_CONTEXT(ctx
);
203 ATTR3F(VBO_ATTRIB_POS
, x
, y
, z
);
206 static void GLAPIENTRY
207 TAG(Vertex3fv
)(const GLfloat
* v
)
209 GET_CURRENT_CONTEXT(ctx
);
210 ATTR3FV(VBO_ATTRIB_POS
, v
);
213 static void GLAPIENTRY
214 TAG(Vertex4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
216 GET_CURRENT_CONTEXT(ctx
);
217 ATTR4F(VBO_ATTRIB_POS
, x
, y
, z
, w
);
220 static void GLAPIENTRY
221 TAG(Vertex4fv
)(const GLfloat
* v
)
223 GET_CURRENT_CONTEXT(ctx
);
224 ATTR4FV(VBO_ATTRIB_POS
, v
);
229 static void GLAPIENTRY
230 TAG(TexCoord1f
)(GLfloat x
)
232 GET_CURRENT_CONTEXT(ctx
);
233 ATTR1F(VBO_ATTRIB_TEX0
, x
);
236 static void GLAPIENTRY
237 TAG(TexCoord1fv
)(const GLfloat
* v
)
239 GET_CURRENT_CONTEXT(ctx
);
240 ATTR1FV(VBO_ATTRIB_TEX0
, v
);
243 static void GLAPIENTRY
244 TAG(TexCoord2f
)(GLfloat x
, GLfloat y
)
246 GET_CURRENT_CONTEXT(ctx
);
247 ATTR2F(VBO_ATTRIB_TEX0
, x
, y
);
250 static void GLAPIENTRY
251 TAG(TexCoord2fv
)(const GLfloat
* v
)
253 GET_CURRENT_CONTEXT(ctx
);
254 ATTR2FV(VBO_ATTRIB_TEX0
, v
);
257 static void GLAPIENTRY
258 TAG(TexCoord3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
260 GET_CURRENT_CONTEXT(ctx
);
261 ATTR3F(VBO_ATTRIB_TEX0
, x
, y
, z
);
264 static void GLAPIENTRY
265 TAG(TexCoord3fv
)(const GLfloat
* v
)
267 GET_CURRENT_CONTEXT(ctx
);
268 ATTR3FV(VBO_ATTRIB_TEX0
, v
);
271 static void GLAPIENTRY
272 TAG(TexCoord4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
274 GET_CURRENT_CONTEXT(ctx
);
275 ATTR4F(VBO_ATTRIB_TEX0
, x
, y
, z
, w
);
278 static void GLAPIENTRY
279 TAG(TexCoord4fv
)(const GLfloat
* v
)
281 GET_CURRENT_CONTEXT(ctx
);
282 ATTR4FV(VBO_ATTRIB_TEX0
, v
);
287 static void GLAPIENTRY
288 TAG(Normal3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
290 GET_CURRENT_CONTEXT(ctx
);
291 ATTR3F(VBO_ATTRIB_NORMAL
, x
, y
, z
);
294 static void GLAPIENTRY
295 TAG(Normal3fv
)(const GLfloat
* v
)
297 GET_CURRENT_CONTEXT(ctx
);
298 ATTR3FV(VBO_ATTRIB_NORMAL
, v
);
303 static void GLAPIENTRY
304 TAG(FogCoordfEXT
)(GLfloat x
)
306 GET_CURRENT_CONTEXT(ctx
);
307 ATTR1F(VBO_ATTRIB_FOG
, x
);
312 static void GLAPIENTRY
313 TAG(FogCoordfvEXT
)(const GLfloat
* v
)
315 GET_CURRENT_CONTEXT(ctx
);
316 ATTR1FV(VBO_ATTRIB_FOG
, v
);
319 static void GLAPIENTRY
320 TAG(Color3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
322 GET_CURRENT_CONTEXT(ctx
);
323 ATTR3F(VBO_ATTRIB_COLOR0
, x
, y
, z
);
326 static void GLAPIENTRY
327 TAG(Color3fv
)(const GLfloat
* v
)
329 GET_CURRENT_CONTEXT(ctx
);
330 ATTR3FV(VBO_ATTRIB_COLOR0
, v
);
333 static void GLAPIENTRY
334 TAG(Color4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
336 GET_CURRENT_CONTEXT(ctx
);
337 ATTR4F(VBO_ATTRIB_COLOR0
, x
, y
, z
, w
);
340 static void GLAPIENTRY
341 TAG(Color4fv
)(const GLfloat
* v
)
343 GET_CURRENT_CONTEXT(ctx
);
344 ATTR4FV(VBO_ATTRIB_COLOR0
, v
);
349 static void GLAPIENTRY
350 TAG(SecondaryColor3fEXT
)(GLfloat x
, GLfloat y
, GLfloat z
)
352 GET_CURRENT_CONTEXT(ctx
);
353 ATTR3F(VBO_ATTRIB_COLOR1
, x
, y
, z
);
356 static void GLAPIENTRY
357 TAG(SecondaryColor3fvEXT
)(const GLfloat
* v
)
359 GET_CURRENT_CONTEXT(ctx
);
360 ATTR3FV(VBO_ATTRIB_COLOR1
, v
);
365 static void GLAPIENTRY
366 TAG(EdgeFlag
)(GLboolean b
)
368 GET_CURRENT_CONTEXT(ctx
);
369 ATTR1F(VBO_ATTRIB_EDGEFLAG
, (GLfloat
) b
);
374 static void GLAPIENTRY
375 TAG(Indexf
)(GLfloat f
)
377 GET_CURRENT_CONTEXT(ctx
);
378 ATTR1F(VBO_ATTRIB_INDEX
, f
);
381 static void GLAPIENTRY
382 TAG(Indexfv
)(const GLfloat
* f
)
384 GET_CURRENT_CONTEXT(ctx
);
385 ATTR1FV(VBO_ATTRIB_INDEX
, f
);
390 static void GLAPIENTRY
391 TAG(MultiTexCoord1f
)(GLenum target
, GLfloat x
)
393 GET_CURRENT_CONTEXT(ctx
);
394 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
398 static void GLAPIENTRY
399 TAG(MultiTexCoord1fv
)(GLenum target
, const GLfloat
* v
)
401 GET_CURRENT_CONTEXT(ctx
);
402 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
406 static void GLAPIENTRY
407 TAG(MultiTexCoord2f
)(GLenum target
, GLfloat x
, GLfloat y
)
409 GET_CURRENT_CONTEXT(ctx
);
410 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
414 static void GLAPIENTRY
415 TAG(MultiTexCoord2fv
)(GLenum target
, const GLfloat
* v
)
417 GET_CURRENT_CONTEXT(ctx
);
418 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
422 static void GLAPIENTRY
423 TAG(MultiTexCoord3f
)(GLenum target
, GLfloat x
, GLfloat y
, GLfloat z
)
425 GET_CURRENT_CONTEXT(ctx
);
426 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
427 ATTR3F(attr
, x
, y
, z
);
430 static void GLAPIENTRY
431 TAG(MultiTexCoord3fv
)(GLenum target
, const GLfloat
* v
)
433 GET_CURRENT_CONTEXT(ctx
);
434 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
438 static void GLAPIENTRY
439 TAG(MultiTexCoord4f
)(GLenum target
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
441 GET_CURRENT_CONTEXT(ctx
);
442 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
443 ATTR4F(attr
, x
, y
, z
, w
);
446 static void GLAPIENTRY
447 TAG(MultiTexCoord4fv
)(GLenum target
, const GLfloat
* v
)
449 GET_CURRENT_CONTEXT(ctx
);
450 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
456 static void GLAPIENTRY
457 TAG(VertexAttrib1fARB
)(GLuint index
, GLfloat x
)
459 GET_CURRENT_CONTEXT(ctx
);
462 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
463 ATTR1F(VBO_ATTRIB_GENERIC0
+ index
, x
);
465 ERROR(GL_INVALID_VALUE
);
468 static void GLAPIENTRY
469 TAG(VertexAttrib1fvARB
)(GLuint index
, const GLfloat
* v
)
471 GET_CURRENT_CONTEXT(ctx
);
474 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
475 ATTR1FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
477 ERROR(GL_INVALID_VALUE
);
480 static void GLAPIENTRY
481 TAG(VertexAttrib2fARB
)(GLuint index
, GLfloat x
, GLfloat y
)
483 GET_CURRENT_CONTEXT(ctx
);
486 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
487 ATTR2F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
489 ERROR(GL_INVALID_VALUE
);
492 static void GLAPIENTRY
493 TAG(VertexAttrib2fvARB
)(GLuint index
, const GLfloat
* v
)
495 GET_CURRENT_CONTEXT(ctx
);
498 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
499 ATTR2FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
501 ERROR(GL_INVALID_VALUE
);
504 static void GLAPIENTRY
505 TAG(VertexAttrib3fARB
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
)
507 GET_CURRENT_CONTEXT(ctx
);
510 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
511 ATTR3F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
513 ERROR(GL_INVALID_VALUE
);
516 static void GLAPIENTRY
517 TAG(VertexAttrib3fvARB
)(GLuint index
, const GLfloat
* v
)
519 GET_CURRENT_CONTEXT(ctx
);
522 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
523 ATTR3FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
525 ERROR(GL_INVALID_VALUE
);
528 static void GLAPIENTRY
529 TAG(VertexAttrib4fARB
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
531 GET_CURRENT_CONTEXT(ctx
);
533 ATTR4F(0, x
, y
, z
, w
);
534 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
535 ATTR4F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
, w
);
537 ERROR(GL_INVALID_VALUE
);
540 static void GLAPIENTRY
541 TAG(VertexAttrib4fvARB
)(GLuint index
, const GLfloat
* v
)
543 GET_CURRENT_CONTEXT(ctx
);
546 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
547 ATTR4FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
549 ERROR(GL_INVALID_VALUE
);
554 /* Integer-valued generic attributes.
555 * XXX: the integers just get converted to floats at this time
557 static void GLAPIENTRY
558 TAG(VertexAttribI1i
)(GLuint index
, GLint x
)
560 GET_CURRENT_CONTEXT(ctx
);
563 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
564 ATTR1I(VBO_ATTRIB_GENERIC0
+ index
, x
);
566 ERROR(GL_INVALID_VALUE
);
569 static void GLAPIENTRY
570 TAG(VertexAttribI2i
)(GLuint index
, GLint x
, GLint y
)
572 GET_CURRENT_CONTEXT(ctx
);
575 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
576 ATTR2I(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
578 ERROR(GL_INVALID_VALUE
);
581 static void GLAPIENTRY
582 TAG(VertexAttribI3i
)(GLuint index
, GLint x
, GLint y
, GLint z
)
584 GET_CURRENT_CONTEXT(ctx
);
587 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
588 ATTR3I(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
590 ERROR(GL_INVALID_VALUE
);
593 static void GLAPIENTRY
594 TAG(VertexAttribI4i
)(GLuint index
, GLint x
, GLint y
, GLint z
, GLint w
)
596 GET_CURRENT_CONTEXT(ctx
);
598 ATTR4I(0, x
, y
, z
, w
);
599 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
600 ATTR4I(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
, w
);
602 ERROR(GL_INVALID_VALUE
);
605 static void GLAPIENTRY
606 TAG(VertexAttribI2iv
)(GLuint index
, const GLint
*v
)
608 GET_CURRENT_CONTEXT(ctx
);
611 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
612 ATTR2IV(VBO_ATTRIB_GENERIC0
+ index
, v
);
614 ERROR(GL_INVALID_VALUE
);
617 static void GLAPIENTRY
618 TAG(VertexAttribI3iv
)(GLuint index
, const GLint
*v
)
620 GET_CURRENT_CONTEXT(ctx
);
623 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
624 ATTR3IV(VBO_ATTRIB_GENERIC0
+ index
, v
);
626 ERROR(GL_INVALID_VALUE
);
629 static void GLAPIENTRY
630 TAG(VertexAttribI4iv
)(GLuint index
, const GLint
*v
)
632 GET_CURRENT_CONTEXT(ctx
);
635 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
636 ATTR4IV(VBO_ATTRIB_GENERIC0
+ index
, v
);
638 ERROR(GL_INVALID_VALUE
);
643 /* Unsigned integer-valued generic attributes.
644 * XXX: the integers just get converted to floats at this time
646 static void GLAPIENTRY
647 TAG(VertexAttribI1ui
)(GLuint index
, GLuint x
)
649 GET_CURRENT_CONTEXT(ctx
);
652 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
653 ATTR1UI(VBO_ATTRIB_GENERIC0
+ index
, x
);
655 ERROR(GL_INVALID_VALUE
);
658 static void GLAPIENTRY
659 TAG(VertexAttribI2ui
)(GLuint index
, GLuint x
, GLuint y
)
661 GET_CURRENT_CONTEXT(ctx
);
664 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
665 ATTR2UI(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
667 ERROR(GL_INVALID_VALUE
);
670 static void GLAPIENTRY
671 TAG(VertexAttribI3ui
)(GLuint index
, GLuint x
, GLuint y
, GLuint z
)
673 GET_CURRENT_CONTEXT(ctx
);
676 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
677 ATTR3UI(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
679 ERROR(GL_INVALID_VALUE
);
682 static void GLAPIENTRY
683 TAG(VertexAttribI4ui
)(GLuint index
, GLuint x
, GLuint y
, GLuint z
, GLuint w
)
685 GET_CURRENT_CONTEXT(ctx
);
687 ATTR4UI(0, x
, y
, z
, w
);
688 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
689 ATTR4UI(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
, w
);
691 ERROR(GL_INVALID_VALUE
);
694 static void GLAPIENTRY
695 TAG(VertexAttribI2uiv
)(GLuint index
, const GLuint
*v
)
697 GET_CURRENT_CONTEXT(ctx
);
700 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
701 ATTR2UIV(VBO_ATTRIB_GENERIC0
+ index
, v
);
703 ERROR(GL_INVALID_VALUE
);
706 static void GLAPIENTRY
707 TAG(VertexAttribI3uiv
)(GLuint index
, const GLuint
*v
)
709 GET_CURRENT_CONTEXT(ctx
);
712 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
713 ATTR3UIV(VBO_ATTRIB_GENERIC0
+ index
, v
);
715 ERROR(GL_INVALID_VALUE
);
718 static void GLAPIENTRY
719 TAG(VertexAttribI4uiv
)(GLuint index
, const GLuint
*v
)
721 GET_CURRENT_CONTEXT(ctx
);
724 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
725 ATTR4UIV(VBO_ATTRIB_GENERIC0
+ index
, v
);
727 ERROR(GL_INVALID_VALUE
);
732 /* In addition to supporting NV_vertex_program, these entrypoints are
733 * used by the display list and other code specifically because of
734 * their property of aliasing with other attributes. (See
735 * vbo_save_loopback.c)
737 static void GLAPIENTRY
738 TAG(VertexAttrib1fNV
)(GLuint index
, GLfloat x
)
740 GET_CURRENT_CONTEXT(ctx
);
741 if (index
< VBO_ATTRIB_MAX
)
745 static void GLAPIENTRY
746 TAG(VertexAttrib1fvNV
)(GLuint index
, const GLfloat
* v
)
748 GET_CURRENT_CONTEXT(ctx
);
749 if (index
< VBO_ATTRIB_MAX
)
753 static void GLAPIENTRY
754 TAG(VertexAttrib2fNV
)(GLuint index
, GLfloat x
, GLfloat y
)
756 GET_CURRENT_CONTEXT(ctx
);
757 if (index
< VBO_ATTRIB_MAX
)
761 static void GLAPIENTRY
762 TAG(VertexAttrib2fvNV
)(GLuint index
, const GLfloat
* v
)
764 GET_CURRENT_CONTEXT(ctx
);
765 if (index
< VBO_ATTRIB_MAX
)
769 static void GLAPIENTRY
770 TAG(VertexAttrib3fNV
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
)
772 GET_CURRENT_CONTEXT(ctx
);
773 if (index
< VBO_ATTRIB_MAX
)
774 ATTR3F(index
, x
, y
, z
);
777 static void GLAPIENTRY
778 TAG(VertexAttrib3fvNV
)(GLuint index
,
781 GET_CURRENT_CONTEXT(ctx
);
782 if (index
< VBO_ATTRIB_MAX
)
786 static void GLAPIENTRY
787 TAG(VertexAttrib4fNV
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
789 GET_CURRENT_CONTEXT(ctx
);
790 if (index
< VBO_ATTRIB_MAX
)
791 ATTR4F(index
, x
, y
, z
, w
);
794 static void GLAPIENTRY
795 TAG(VertexAttrib4fvNV
)(GLuint index
, const GLfloat
* v
)
797 GET_CURRENT_CONTEXT(ctx
);
798 if (index
< VBO_ATTRIB_MAX
)
803 static void GLAPIENTRY
804 TAG(VertexP2ui
)(GLenum type
, GLuint value
)
806 GET_CURRENT_CONTEXT(ctx
);
807 ATTR_UI(ctx
, 2, type
, 0, VBO_ATTRIB_POS
, value
);
810 static void GLAPIENTRY
811 TAG(VertexP2uiv
)(GLenum type
, const GLuint
*value
)
813 GET_CURRENT_CONTEXT(ctx
);
814 ATTR_UI(ctx
, 2, type
, 0, VBO_ATTRIB_POS
, value
[0]);
817 static void GLAPIENTRY
818 TAG(VertexP3ui
)(GLenum type
, GLuint value
)
820 GET_CURRENT_CONTEXT(ctx
);
821 ATTR_UI(ctx
, 3, type
, 0, VBO_ATTRIB_POS
, value
);
824 static void GLAPIENTRY
825 TAG(VertexP3uiv
)(GLenum type
, const GLuint
*value
)
827 GET_CURRENT_CONTEXT(ctx
);
828 ATTR_UI(ctx
, 3, type
, 0, VBO_ATTRIB_POS
, value
[0]);
831 static void GLAPIENTRY
832 TAG(VertexP4ui
)(GLenum type
, GLuint value
)
834 GET_CURRENT_CONTEXT(ctx
);
835 ATTR_UI(ctx
, 4, type
, 0, VBO_ATTRIB_POS
, value
);
838 static void GLAPIENTRY
839 TAG(VertexP4uiv
)(GLenum type
, const GLuint
*value
)
841 GET_CURRENT_CONTEXT(ctx
);
842 ATTR_UI(ctx
, 4, type
, 0, VBO_ATTRIB_POS
, value
[0]);
845 static void GLAPIENTRY
846 TAG(TexCoordP1ui
)(GLenum type
, GLuint coords
)
848 GET_CURRENT_CONTEXT(ctx
);
849 ATTR_UI(ctx
, 1, type
, 0, VBO_ATTRIB_TEX0
, coords
);
852 static void GLAPIENTRY
853 TAG(TexCoordP1uiv
)(GLenum type
, const GLuint
*coords
)
855 GET_CURRENT_CONTEXT(ctx
);
856 ATTR_UI(ctx
, 1, type
, 0, VBO_ATTRIB_TEX0
, coords
[0]);
859 static void GLAPIENTRY
860 TAG(TexCoordP2ui
)(GLenum type
, GLuint coords
)
862 GET_CURRENT_CONTEXT(ctx
);
863 ATTR_UI(ctx
, 2, type
, 0, VBO_ATTRIB_TEX0
, coords
);
866 static void GLAPIENTRY
867 TAG(TexCoordP2uiv
)(GLenum type
, const GLuint
*coords
)
869 GET_CURRENT_CONTEXT(ctx
);
870 ATTR_UI(ctx
, 2, type
, 0, VBO_ATTRIB_TEX0
, coords
[0]);
873 static void GLAPIENTRY
874 TAG(TexCoordP3ui
)(GLenum type
, GLuint coords
)
876 GET_CURRENT_CONTEXT(ctx
);
877 ATTR_UI(ctx
, 3, type
, 0, VBO_ATTRIB_TEX0
, coords
);
880 static void GLAPIENTRY
881 TAG(TexCoordP3uiv
)(GLenum type
, const GLuint
*coords
)
883 GET_CURRENT_CONTEXT(ctx
);
884 ATTR_UI(ctx
, 3, type
, 0, VBO_ATTRIB_TEX0
, coords
[0]);
887 static void GLAPIENTRY
888 TAG(TexCoordP4ui
)(GLenum type
, GLuint coords
)
890 GET_CURRENT_CONTEXT(ctx
);
891 ATTR_UI(ctx
, 4, type
, 0, VBO_ATTRIB_TEX0
, coords
);
894 static void GLAPIENTRY
895 TAG(TexCoordP4uiv
)(GLenum type
, const GLuint
*coords
)
897 GET_CURRENT_CONTEXT(ctx
);
898 ATTR_UI(ctx
, 4, type
, 0, VBO_ATTRIB_TEX0
, coords
[0]);
901 static void GLAPIENTRY
902 TAG(MultiTexCoordP1ui
)(GLenum target
, GLenum type
, GLuint coords
)
904 GET_CURRENT_CONTEXT(ctx
);
905 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
906 ATTR_UI(ctx
, 1, type
, 0, attr
, coords
);
909 static void GLAPIENTRY
910 TAG(MultiTexCoordP1uiv
)(GLenum target
, GLenum type
, const GLuint
*coords
)
912 GET_CURRENT_CONTEXT(ctx
);
913 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
914 ATTR_UI(ctx
, 1, type
, 0, attr
, coords
[0]);
917 static void GLAPIENTRY
918 TAG(MultiTexCoordP2ui
)(GLenum target
, GLenum type
, GLuint coords
)
920 GET_CURRENT_CONTEXT(ctx
);
921 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
922 ATTR_UI(ctx
, 2, type
, 0, attr
, coords
);
925 static void GLAPIENTRY
926 TAG(MultiTexCoordP2uiv
)(GLenum target
, GLenum type
, const GLuint
*coords
)
928 GET_CURRENT_CONTEXT(ctx
);
929 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
930 ATTR_UI(ctx
, 2, type
, 0, attr
, coords
[0]);
933 static void GLAPIENTRY
934 TAG(MultiTexCoordP3ui
)(GLenum target
, GLenum type
, GLuint coords
)
936 GET_CURRENT_CONTEXT(ctx
);
937 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
938 ATTR_UI(ctx
, 3, type
, 0, attr
, coords
);
941 static void GLAPIENTRY
942 TAG(MultiTexCoordP3uiv
)(GLenum target
, GLenum type
, const GLuint
*coords
)
944 GET_CURRENT_CONTEXT(ctx
);
945 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
946 ATTR_UI(ctx
, 3, type
, 0, attr
, coords
[0]);
949 static void GLAPIENTRY
950 TAG(MultiTexCoordP4ui
)(GLenum target
, GLenum type
, GLuint coords
)
952 GET_CURRENT_CONTEXT(ctx
);
953 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
954 ATTR_UI(ctx
, 4, type
, 0, attr
, coords
);
957 static void GLAPIENTRY
958 TAG(MultiTexCoordP4uiv
)(GLenum target
, GLenum type
, const GLuint
*coords
)
960 GET_CURRENT_CONTEXT(ctx
);
961 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
962 ATTR_UI(ctx
, 4, type
, 0, attr
, coords
[0]);
965 static void GLAPIENTRY
966 TAG(NormalP3ui
)(GLenum type
, GLuint coords
)
968 GET_CURRENT_CONTEXT(ctx
);
969 ATTR_UI(ctx
, 3, type
, 1, VBO_ATTRIB_NORMAL
, coords
);
972 static void GLAPIENTRY
973 TAG(NormalP3uiv
)(GLenum type
, const GLuint
*coords
)
975 GET_CURRENT_CONTEXT(ctx
);
976 ATTR_UI(ctx
, 3, type
, 1, VBO_ATTRIB_NORMAL
, coords
[0]);
979 static void GLAPIENTRY
980 TAG(ColorP3ui
)(GLenum type
, GLuint color
)
982 GET_CURRENT_CONTEXT(ctx
);
983 ATTR_UI(ctx
, 3, type
, 1, VBO_ATTRIB_COLOR0
, color
);
986 static void GLAPIENTRY
987 TAG(ColorP3uiv
)(GLenum type
, const GLuint
*color
)
989 GET_CURRENT_CONTEXT(ctx
);
990 ATTR_UI(ctx
, 3, type
, 1, VBO_ATTRIB_COLOR0
, color
[0]);
993 static void GLAPIENTRY
994 TAG(ColorP4ui
)(GLenum type
, GLuint color
)
996 GET_CURRENT_CONTEXT(ctx
);
997 ATTR_UI(ctx
, 4, type
, 1, VBO_ATTRIB_COLOR0
, color
);
1000 static void GLAPIENTRY
1001 TAG(ColorP4uiv
)(GLenum type
, const GLuint
*color
)
1003 GET_CURRENT_CONTEXT(ctx
);
1004 ATTR_UI(ctx
, 4, type
, 1, VBO_ATTRIB_COLOR0
, color
[0]);
1007 static void GLAPIENTRY
1008 TAG(SecondaryColorP3ui
)(GLenum type
, GLuint color
)
1010 GET_CURRENT_CONTEXT(ctx
);
1011 ATTR_UI(ctx
, 3, type
, 1, VBO_ATTRIB_COLOR1
, color
);
1014 static void GLAPIENTRY
1015 TAG(SecondaryColorP3uiv
)(GLenum type
, const GLuint
*color
)
1017 GET_CURRENT_CONTEXT(ctx
);
1018 ATTR_UI(ctx
, 3, type
, 1, VBO_ATTRIB_COLOR1
, color
[0]);
1021 static void GLAPIENTRY
1022 TAG(VertexAttribP1ui
)(GLuint index
, GLenum type
, GLboolean normalized
,
1025 GET_CURRENT_CONTEXT(ctx
);
1026 ATTR_UI_INDEX(ctx
, 1, type
, normalized
, index
, value
);
1029 static void GLAPIENTRY
1030 TAG(VertexAttribP2ui
)(GLuint index
, GLenum type
, GLboolean normalized
,
1033 GET_CURRENT_CONTEXT(ctx
);
1034 ATTR_UI_INDEX(ctx
, 2, type
, normalized
, index
, value
);
1037 static void GLAPIENTRY
1038 TAG(VertexAttribP3ui
)(GLuint index
, GLenum type
, GLboolean normalized
,
1041 GET_CURRENT_CONTEXT(ctx
);
1042 ATTR_UI_INDEX(ctx
, 3, type
, normalized
, index
, value
);
1045 static void GLAPIENTRY
1046 TAG(VertexAttribP4ui
)(GLuint index
, GLenum type
, GLboolean normalized
,
1049 GET_CURRENT_CONTEXT(ctx
);
1050 ATTR_UI_INDEX(ctx
, 4, type
, normalized
, index
, value
);
1053 static void GLAPIENTRY
1054 TAG(VertexAttribP1uiv
)(GLuint index
, GLenum type
, GLboolean normalized
,
1055 const GLuint
*value
)
1057 GET_CURRENT_CONTEXT(ctx
);
1058 ATTR_UI_INDEX(ctx
, 1, type
, normalized
, index
, *value
);
1061 static void GLAPIENTRY
1062 TAG(VertexAttribP2uiv
)(GLuint index
, GLenum type
, GLboolean normalized
,
1063 const GLuint
*value
)
1065 GET_CURRENT_CONTEXT(ctx
);
1066 ATTR_UI_INDEX(ctx
, 2, type
, normalized
, index
, *value
);
1069 static void GLAPIENTRY
1070 TAG(VertexAttribP3uiv
)(GLuint index
, GLenum type
, GLboolean normalized
,
1071 const GLuint
*value
)
1073 GET_CURRENT_CONTEXT(ctx
);
1074 ATTR_UI_INDEX(ctx
, 3, type
, normalized
, index
, *value
);
1077 static void GLAPIENTRY
1078 TAG(VertexAttribP4uiv
)(GLuint index
, GLenum type
, GLboolean normalized
,
1079 const GLuint
*value
)
1081 GET_CURRENT_CONTEXT(ctx
);
1082 ATTR_UI_INDEX(ctx
, 4, type
, normalized
, index
, *value
);