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 **************************************************************************/
28 #include "util/u_format_r11g11b10f.h"
31 #define ATTR1FV( A, V ) ATTR( A, 1, GL_FLOAT, (V)[0], 0, 0, 1 )
32 #define ATTR2FV( A, V ) ATTR( A, 2, GL_FLOAT, (V)[0], (V)[1], 0, 1 )
33 #define ATTR3FV( A, V ) ATTR( A, 3, GL_FLOAT, (V)[0], (V)[1], (V)[2], 1 )
34 #define ATTR4FV( A, V ) ATTR( A, 4, GL_FLOAT, (V)[0], (V)[1], (V)[2], (V)[3] )
36 #define ATTR1F( A, X ) ATTR( A, 1, GL_FLOAT, X, 0, 0, 1 )
37 #define ATTR2F( A, X, Y ) ATTR( A, 2, GL_FLOAT, X, Y, 0, 1 )
38 #define ATTR3F( A, X, Y, Z ) ATTR( A, 3, GL_FLOAT, X, Y, Z, 1 )
39 #define ATTR4F( A, X, Y, Z, W ) ATTR( A, 4, GL_FLOAT, X, Y, Z, W )
42 #define ATTRI( A, N, X, Y, Z, W) ATTR( A, N, GL_INT, \
43 INT_AS_FLT(X), INT_AS_FLT(Y), \
44 INT_AS_FLT(Z), INT_AS_FLT(W) )
46 #define ATTR2IV( A, V ) ATTRI( A, 2, (V)[0], (V)[1], 0, 1 )
47 #define ATTR3IV( A, V ) ATTRI( A, 3, (V)[0], (V)[1], (V)[2], 1 )
48 #define ATTR4IV( A, V ) ATTRI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
50 #define ATTR1I( A, X ) ATTRI( A, 1, X, 0, 0, 1 )
51 #define ATTR2I( A, X, Y ) ATTRI( A, 2, X, Y, 0, 1 )
52 #define ATTR3I( A, X, Y, Z ) ATTRI( A, 3, X, Y, Z, 1 )
53 #define ATTR4I( A, X, Y, Z, W ) ATTRI( A, 4, X, Y, Z, W )
57 #define ATTRUI( A, N, X, Y, Z, W) ATTR( A, N, GL_UNSIGNED_INT, \
58 UINT_AS_FLT(X), UINT_AS_FLT(Y), \
59 UINT_AS_FLT(Z), UINT_AS_FLT(W) )
61 #define ATTR2UIV( A, V ) ATTRUI( A, 2, (V)[0], (V)[1], 0, 1 )
62 #define ATTR3UIV( A, V ) ATTRUI( A, 3, (V)[0], (V)[1], (V)[2], 1 )
63 #define ATTR4UIV( A, V ) ATTRUI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
65 #define ATTR1UI( A, X ) ATTRUI( A, 1, X, 0, 0, 1 )
66 #define ATTR2UI( A, X, Y ) ATTRUI( A, 2, X, Y, 0, 1 )
67 #define ATTR3UI( A, X, Y, Z ) ATTRUI( A, 3, X, Y, Z, 1 )
68 #define ATTR4UI( A, X, Y, Z, W ) ATTRUI( A, 4, X, Y, Z, W )
70 #define MAT_ATTR( A, N, V ) ATTR( A, N, GL_FLOAT, (V)[0], (V)[1], (V)[2], (V)[3] )
72 static inline float conv_ui10_to_norm_float(unsigned ui10
)
74 return ui10
/ 1023.0f
;
77 static inline float conv_ui2_to_norm_float(unsigned ui2
)
82 #define ATTRUI10_1( A, UI ) ATTR( A, 1, GL_FLOAT, (UI) & 0x3ff, 0, 0, 1 )
83 #define ATTRUI10_2( A, UI ) ATTR( A, 2, GL_FLOAT, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, 0, 1 )
84 #define ATTRUI10_3( A, UI ) ATTR( A, 3, GL_FLOAT, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, 1 )
85 #define ATTRUI10_4( A, UI ) ATTR( A, 4, GL_FLOAT, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, ((UI) >> 30) & 0x3 )
87 #define ATTRUI10N_1( A, UI ) ATTR( A, 1, GL_FLOAT, conv_ui10_to_norm_float((UI) & 0x3ff), 0, 0, 1 )
88 #define ATTRUI10N_2( A, UI ) ATTR( A, 2, GL_FLOAT, \
89 conv_ui10_to_norm_float((UI) & 0x3ff), \
90 conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), 0, 1 )
91 #define ATTRUI10N_3( A, UI ) ATTR( A, 3, GL_FLOAT, \
92 conv_ui10_to_norm_float((UI) & 0x3ff), \
93 conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
94 conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), 1 )
95 #define ATTRUI10N_4( A, UI ) ATTR( A, 4, GL_FLOAT, \
96 conv_ui10_to_norm_float((UI) & 0x3ff), \
97 conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
98 conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), \
99 conv_ui2_to_norm_float(((UI) >> 30) & 0x3) )
101 struct attr_bits_10
{signed int x
:10;};
102 struct attr_bits_2
{signed int x
:2;};
104 static inline float conv_i10_to_i(int i10
)
106 struct attr_bits_10 val
;
111 static inline float conv_i2_to_i(int i2
)
113 struct attr_bits_2 val
;
118 static inline float conv_i10_to_norm_float(const struct gl_context
*ctx
, int i10
)
120 struct attr_bits_10 val
;
123 /* Traditionally, OpenGL has had two equations for converting from
124 * normalized fixed-point data to floating-point data. In the OpenGL 3.2
125 * specification, these are equations 2.2 and 2.3, respectively:
127 * f = (2c + 1)/(2^b - 1). (2.2)
129 * Comments below this equation state: "In general, this representation is
130 * used for signed normalized fixed-point parameters in GL commands, such
131 * as vertex attribute values." Which is what we're doing here.
133 * f = max{c/(2^(b-1) - 1), -1.0} (2.3)
135 * Comments below this equation state: "In general, this representation is
136 * used for signed normalized fixed-point texture or floating point values."
138 * OpenGL 4.2+ and ES 3.0 remedy this and state that equation 2.3 (above)
139 * is used in every case. They remove equation 2.2 completely.
141 if (_mesa_is_gles3(ctx
) ||
142 (ctx
->API
== API_OPENGL_CORE
&& ctx
->Version
>= 42)) {
143 /* Equation 2.3 above. */
144 float f
= ((float) val
.x
) / 511.0F
;
145 return MAX2(f
, -1.0f
);
147 /* Equation 2.2 above. */
148 return (2.0F
* (float)val
.x
+ 1.0F
) * (1.0F
/ 1023.0F
);
152 static inline float conv_i2_to_norm_float(const struct gl_context
*ctx
, int i2
)
154 struct attr_bits_2 val
;
157 if (_mesa_is_gles3(ctx
) ||
158 (ctx
->API
== API_OPENGL_CORE
&& ctx
->Version
>= 42)) {
159 /* Equation 2.3 above. */
160 float f
= (float) val
.x
;
161 return MAX2(f
, -1.0f
);
163 /* Equation 2.2 above. */
164 return (2.0F
* (float)val
.x
+ 1.0F
) * (1.0F
/ 3.0F
);
168 #define ATTRI10_1( A, I10 ) ATTR( A, 1, GL_FLOAT, conv_i10_to_i((I10) & 0x3ff), 0, 0, 1 )
169 #define ATTRI10_2( A, I10 ) ATTR( A, 2, GL_FLOAT, \
170 conv_i10_to_i((I10) & 0x3ff), \
171 conv_i10_to_i(((I10) >> 10) & 0x3ff), 0, 1 )
172 #define ATTRI10_3( A, I10 ) ATTR( A, 3, GL_FLOAT, \
173 conv_i10_to_i((I10) & 0x3ff), \
174 conv_i10_to_i(((I10) >> 10) & 0x3ff), \
175 conv_i10_to_i(((I10) >> 20) & 0x3ff), 1 )
176 #define ATTRI10_4( A, I10 ) ATTR( A, 4, GL_FLOAT, \
177 conv_i10_to_i((I10) & 0x3ff), \
178 conv_i10_to_i(((I10) >> 10) & 0x3ff), \
179 conv_i10_to_i(((I10) >> 20) & 0x3ff), \
180 conv_i2_to_i(((I10) >> 30) & 0x3))
183 #define ATTRI10N_1(ctx, A, I10) ATTR(A, 1, GL_FLOAT, conv_i10_to_norm_float(ctx, (I10) & 0x3ff), 0, 0, 1 )
184 #define ATTRI10N_2(ctx, A, I10) ATTR(A, 2, GL_FLOAT, \
185 conv_i10_to_norm_float(ctx, (I10) & 0x3ff), \
186 conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), 0, 1 )
187 #define ATTRI10N_3(ctx, A, I10) ATTR(A, 3, GL_FLOAT, \
188 conv_i10_to_norm_float(ctx, (I10) & 0x3ff), \
189 conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \
190 conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff), 1 )
191 #define ATTRI10N_4(ctx, A, I10) ATTR(A, 4, GL_FLOAT, \
192 conv_i10_to_norm_float(ctx, (I10) & 0x3ff), \
193 conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \
194 conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff), \
195 conv_i2_to_norm_float(ctx, ((I10) >> 30) & 0x3))
197 #define ATTR_UI(ctx, val, type, normalized, attr, arg) do { \
198 if ((type) == GL_UNSIGNED_INT_2_10_10_10_REV) { \
200 ATTRUI10N_##val((attr), (arg)); \
202 ATTRUI10_##val((attr), (arg)); \
204 } else if ((type) == GL_INT_2_10_10_10_REV) { \
206 ATTRI10N_##val(ctx, (attr), (arg)); \
208 ATTRI10_##val((attr), (arg)); \
210 } else if ((type) == GL_UNSIGNED_INT_10F_11F_11F_REV) { \
212 r11g11b10f_to_float3((arg), res); \
213 ATTR##val##FV((attr), res); \
215 ERROR(GL_INVALID_VALUE); \
218 #define ATTR_UI_INDEX(ctx, val, type, normalized, index, arg) do { \
219 if ((index) == 0) { \
220 ATTR_UI(ctx, val, (type), normalized, 0, (arg)); \
221 } else if ((index) < MAX_VERTEX_GENERIC_ATTRIBS) { \
222 ATTR_UI(ctx, val, (type), normalized, VBO_ATTRIB_GENERIC0 + (index), (arg)); \
224 ERROR(GL_INVALID_VALUE); \
227 static void GLAPIENTRY
228 TAG(Vertex2f
)(GLfloat x
, GLfloat y
)
230 GET_CURRENT_CONTEXT(ctx
);
231 ATTR2F(VBO_ATTRIB_POS
, x
, y
);
234 static void GLAPIENTRY
235 TAG(Vertex2fv
)(const GLfloat
* v
)
237 GET_CURRENT_CONTEXT(ctx
);
238 ATTR2FV(VBO_ATTRIB_POS
, v
);
241 static void GLAPIENTRY
242 TAG(Vertex3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
244 GET_CURRENT_CONTEXT(ctx
);
245 ATTR3F(VBO_ATTRIB_POS
, x
, y
, z
);
248 static void GLAPIENTRY
249 TAG(Vertex3fv
)(const GLfloat
* v
)
251 GET_CURRENT_CONTEXT(ctx
);
252 ATTR3FV(VBO_ATTRIB_POS
, v
);
255 static void GLAPIENTRY
256 TAG(Vertex4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
258 GET_CURRENT_CONTEXT(ctx
);
259 ATTR4F(VBO_ATTRIB_POS
, x
, y
, z
, w
);
262 static void GLAPIENTRY
263 TAG(Vertex4fv
)(const GLfloat
* v
)
265 GET_CURRENT_CONTEXT(ctx
);
266 ATTR4FV(VBO_ATTRIB_POS
, v
);
271 static void GLAPIENTRY
272 TAG(TexCoord1f
)(GLfloat x
)
274 GET_CURRENT_CONTEXT(ctx
);
275 ATTR1F(VBO_ATTRIB_TEX0
, x
);
278 static void GLAPIENTRY
279 TAG(TexCoord1fv
)(const GLfloat
* v
)
281 GET_CURRENT_CONTEXT(ctx
);
282 ATTR1FV(VBO_ATTRIB_TEX0
, v
);
285 static void GLAPIENTRY
286 TAG(TexCoord2f
)(GLfloat x
, GLfloat y
)
288 GET_CURRENT_CONTEXT(ctx
);
289 ATTR2F(VBO_ATTRIB_TEX0
, x
, y
);
292 static void GLAPIENTRY
293 TAG(TexCoord2fv
)(const GLfloat
* v
)
295 GET_CURRENT_CONTEXT(ctx
);
296 ATTR2FV(VBO_ATTRIB_TEX0
, v
);
299 static void GLAPIENTRY
300 TAG(TexCoord3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
302 GET_CURRENT_CONTEXT(ctx
);
303 ATTR3F(VBO_ATTRIB_TEX0
, x
, y
, z
);
306 static void GLAPIENTRY
307 TAG(TexCoord3fv
)(const GLfloat
* v
)
309 GET_CURRENT_CONTEXT(ctx
);
310 ATTR3FV(VBO_ATTRIB_TEX0
, v
);
313 static void GLAPIENTRY
314 TAG(TexCoord4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
316 GET_CURRENT_CONTEXT(ctx
);
317 ATTR4F(VBO_ATTRIB_TEX0
, x
, y
, z
, w
);
320 static void GLAPIENTRY
321 TAG(TexCoord4fv
)(const GLfloat
* v
)
323 GET_CURRENT_CONTEXT(ctx
);
324 ATTR4FV(VBO_ATTRIB_TEX0
, v
);
329 static void GLAPIENTRY
330 TAG(Normal3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
332 GET_CURRENT_CONTEXT(ctx
);
333 ATTR3F(VBO_ATTRIB_NORMAL
, x
, y
, z
);
336 static void GLAPIENTRY
337 TAG(Normal3fv
)(const GLfloat
* v
)
339 GET_CURRENT_CONTEXT(ctx
);
340 ATTR3FV(VBO_ATTRIB_NORMAL
, v
);
345 static void GLAPIENTRY
346 TAG(FogCoordfEXT
)(GLfloat x
)
348 GET_CURRENT_CONTEXT(ctx
);
349 ATTR1F(VBO_ATTRIB_FOG
, x
);
354 static void GLAPIENTRY
355 TAG(FogCoordfvEXT
)(const GLfloat
* v
)
357 GET_CURRENT_CONTEXT(ctx
);
358 ATTR1FV(VBO_ATTRIB_FOG
, v
);
361 static void GLAPIENTRY
362 TAG(Color3f
)(GLfloat x
, GLfloat y
, GLfloat z
)
364 GET_CURRENT_CONTEXT(ctx
);
365 ATTR3F(VBO_ATTRIB_COLOR0
, x
, y
, z
);
368 static void GLAPIENTRY
369 TAG(Color3fv
)(const GLfloat
* v
)
371 GET_CURRENT_CONTEXT(ctx
);
372 ATTR3FV(VBO_ATTRIB_COLOR0
, v
);
375 static void GLAPIENTRY
376 TAG(Color4f
)(GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
378 GET_CURRENT_CONTEXT(ctx
);
379 ATTR4F(VBO_ATTRIB_COLOR0
, x
, y
, z
, w
);
382 static void GLAPIENTRY
383 TAG(Color4fv
)(const GLfloat
* v
)
385 GET_CURRENT_CONTEXT(ctx
);
386 ATTR4FV(VBO_ATTRIB_COLOR0
, v
);
391 static void GLAPIENTRY
392 TAG(SecondaryColor3fEXT
)(GLfloat x
, GLfloat y
, GLfloat z
)
394 GET_CURRENT_CONTEXT(ctx
);
395 ATTR3F(VBO_ATTRIB_COLOR1
, x
, y
, z
);
398 static void GLAPIENTRY
399 TAG(SecondaryColor3fvEXT
)(const GLfloat
* v
)
401 GET_CURRENT_CONTEXT(ctx
);
402 ATTR3FV(VBO_ATTRIB_COLOR1
, v
);
407 static void GLAPIENTRY
408 TAG(EdgeFlag
)(GLboolean b
)
410 GET_CURRENT_CONTEXT(ctx
);
411 ATTR1F(VBO_ATTRIB_EDGEFLAG
, (GLfloat
) b
);
416 static void GLAPIENTRY
417 TAG(Indexf
)(GLfloat f
)
419 GET_CURRENT_CONTEXT(ctx
);
420 ATTR1F(VBO_ATTRIB_INDEX
, f
);
423 static void GLAPIENTRY
424 TAG(Indexfv
)(const GLfloat
* f
)
426 GET_CURRENT_CONTEXT(ctx
);
427 ATTR1FV(VBO_ATTRIB_INDEX
, f
);
432 static void GLAPIENTRY
433 TAG(MultiTexCoord1f
)(GLenum target
, GLfloat x
)
435 GET_CURRENT_CONTEXT(ctx
);
436 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
440 static void GLAPIENTRY
441 TAG(MultiTexCoord1fv
)(GLenum target
, const GLfloat
* v
)
443 GET_CURRENT_CONTEXT(ctx
);
444 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
448 static void GLAPIENTRY
449 TAG(MultiTexCoord2f
)(GLenum target
, GLfloat x
, GLfloat y
)
451 GET_CURRENT_CONTEXT(ctx
);
452 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
456 static void GLAPIENTRY
457 TAG(MultiTexCoord2fv
)(GLenum target
, const GLfloat
* v
)
459 GET_CURRENT_CONTEXT(ctx
);
460 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
464 static void GLAPIENTRY
465 TAG(MultiTexCoord3f
)(GLenum target
, GLfloat x
, GLfloat y
, GLfloat z
)
467 GET_CURRENT_CONTEXT(ctx
);
468 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
469 ATTR3F(attr
, x
, y
, z
);
472 static void GLAPIENTRY
473 TAG(MultiTexCoord3fv
)(GLenum target
, const GLfloat
* v
)
475 GET_CURRENT_CONTEXT(ctx
);
476 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
480 static void GLAPIENTRY
481 TAG(MultiTexCoord4f
)(GLenum target
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
483 GET_CURRENT_CONTEXT(ctx
);
484 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
485 ATTR4F(attr
, x
, y
, z
, w
);
488 static void GLAPIENTRY
489 TAG(MultiTexCoord4fv
)(GLenum target
, const GLfloat
* v
)
491 GET_CURRENT_CONTEXT(ctx
);
492 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
498 static void GLAPIENTRY
499 TAG(VertexAttrib1fARB
)(GLuint index
, GLfloat x
)
501 GET_CURRENT_CONTEXT(ctx
);
504 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
505 ATTR1F(VBO_ATTRIB_GENERIC0
+ index
, x
);
507 ERROR(GL_INVALID_VALUE
);
510 static void GLAPIENTRY
511 TAG(VertexAttrib1fvARB
)(GLuint index
, const GLfloat
* v
)
513 GET_CURRENT_CONTEXT(ctx
);
516 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
517 ATTR1FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
519 ERROR(GL_INVALID_VALUE
);
522 static void GLAPIENTRY
523 TAG(VertexAttrib2fARB
)(GLuint index
, GLfloat x
, GLfloat y
)
525 GET_CURRENT_CONTEXT(ctx
);
528 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
529 ATTR2F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
531 ERROR(GL_INVALID_VALUE
);
534 static void GLAPIENTRY
535 TAG(VertexAttrib2fvARB
)(GLuint index
, const GLfloat
* v
)
537 GET_CURRENT_CONTEXT(ctx
);
540 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
541 ATTR2FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
543 ERROR(GL_INVALID_VALUE
);
546 static void GLAPIENTRY
547 TAG(VertexAttrib3fARB
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
)
549 GET_CURRENT_CONTEXT(ctx
);
552 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
553 ATTR3F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
555 ERROR(GL_INVALID_VALUE
);
558 static void GLAPIENTRY
559 TAG(VertexAttrib3fvARB
)(GLuint index
, const GLfloat
* v
)
561 GET_CURRENT_CONTEXT(ctx
);
564 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
565 ATTR3FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
567 ERROR(GL_INVALID_VALUE
);
570 static void GLAPIENTRY
571 TAG(VertexAttrib4fARB
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
573 GET_CURRENT_CONTEXT(ctx
);
575 ATTR4F(0, x
, y
, z
, w
);
576 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
577 ATTR4F(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
, w
);
579 ERROR(GL_INVALID_VALUE
);
582 static void GLAPIENTRY
583 TAG(VertexAttrib4fvARB
)(GLuint index
, const GLfloat
* v
)
585 GET_CURRENT_CONTEXT(ctx
);
588 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
589 ATTR4FV(VBO_ATTRIB_GENERIC0
+ index
, v
);
591 ERROR(GL_INVALID_VALUE
);
596 /* Integer-valued generic attributes.
597 * XXX: the integers just get converted to floats at this time
599 static void GLAPIENTRY
600 TAG(VertexAttribI1i
)(GLuint index
, GLint x
)
602 GET_CURRENT_CONTEXT(ctx
);
605 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
606 ATTR1I(VBO_ATTRIB_GENERIC0
+ index
, x
);
608 ERROR(GL_INVALID_VALUE
);
611 static void GLAPIENTRY
612 TAG(VertexAttribI2i
)(GLuint index
, GLint x
, GLint y
)
614 GET_CURRENT_CONTEXT(ctx
);
617 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
618 ATTR2I(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
620 ERROR(GL_INVALID_VALUE
);
623 static void GLAPIENTRY
624 TAG(VertexAttribI3i
)(GLuint index
, GLint x
, GLint y
, GLint z
)
626 GET_CURRENT_CONTEXT(ctx
);
629 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
630 ATTR3I(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
632 ERROR(GL_INVALID_VALUE
);
635 static void GLAPIENTRY
636 TAG(VertexAttribI4i
)(GLuint index
, GLint x
, GLint y
, GLint z
, GLint w
)
638 GET_CURRENT_CONTEXT(ctx
);
640 ATTR4I(0, x
, y
, z
, w
);
641 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
642 ATTR4I(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
, w
);
644 ERROR(GL_INVALID_VALUE
);
647 static void GLAPIENTRY
648 TAG(VertexAttribI2iv
)(GLuint index
, const GLint
*v
)
650 GET_CURRENT_CONTEXT(ctx
);
653 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
654 ATTR2IV(VBO_ATTRIB_GENERIC0
+ index
, v
);
656 ERROR(GL_INVALID_VALUE
);
659 static void GLAPIENTRY
660 TAG(VertexAttribI3iv
)(GLuint index
, const GLint
*v
)
662 GET_CURRENT_CONTEXT(ctx
);
665 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
666 ATTR3IV(VBO_ATTRIB_GENERIC0
+ index
, v
);
668 ERROR(GL_INVALID_VALUE
);
671 static void GLAPIENTRY
672 TAG(VertexAttribI4iv
)(GLuint index
, const GLint
*v
)
674 GET_CURRENT_CONTEXT(ctx
);
677 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
678 ATTR4IV(VBO_ATTRIB_GENERIC0
+ index
, v
);
680 ERROR(GL_INVALID_VALUE
);
685 /* Unsigned integer-valued generic attributes.
686 * XXX: the integers just get converted to floats at this time
688 static void GLAPIENTRY
689 TAG(VertexAttribI1ui
)(GLuint index
, GLuint x
)
691 GET_CURRENT_CONTEXT(ctx
);
694 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
695 ATTR1UI(VBO_ATTRIB_GENERIC0
+ index
, x
);
697 ERROR(GL_INVALID_VALUE
);
700 static void GLAPIENTRY
701 TAG(VertexAttribI2ui
)(GLuint index
, GLuint x
, GLuint y
)
703 GET_CURRENT_CONTEXT(ctx
);
706 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
707 ATTR2UI(VBO_ATTRIB_GENERIC0
+ index
, x
, y
);
709 ERROR(GL_INVALID_VALUE
);
712 static void GLAPIENTRY
713 TAG(VertexAttribI3ui
)(GLuint index
, GLuint x
, GLuint y
, GLuint z
)
715 GET_CURRENT_CONTEXT(ctx
);
718 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
719 ATTR3UI(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
);
721 ERROR(GL_INVALID_VALUE
);
724 static void GLAPIENTRY
725 TAG(VertexAttribI4ui
)(GLuint index
, GLuint x
, GLuint y
, GLuint z
, GLuint w
)
727 GET_CURRENT_CONTEXT(ctx
);
729 ATTR4UI(0, x
, y
, z
, w
);
730 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
731 ATTR4UI(VBO_ATTRIB_GENERIC0
+ index
, x
, y
, z
, w
);
733 ERROR(GL_INVALID_VALUE
);
736 static void GLAPIENTRY
737 TAG(VertexAttribI2uiv
)(GLuint index
, const GLuint
*v
)
739 GET_CURRENT_CONTEXT(ctx
);
742 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
743 ATTR2UIV(VBO_ATTRIB_GENERIC0
+ index
, v
);
745 ERROR(GL_INVALID_VALUE
);
748 static void GLAPIENTRY
749 TAG(VertexAttribI3uiv
)(GLuint index
, const GLuint
*v
)
751 GET_CURRENT_CONTEXT(ctx
);
754 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
755 ATTR3UIV(VBO_ATTRIB_GENERIC0
+ index
, v
);
757 ERROR(GL_INVALID_VALUE
);
760 static void GLAPIENTRY
761 TAG(VertexAttribI4uiv
)(GLuint index
, const GLuint
*v
)
763 GET_CURRENT_CONTEXT(ctx
);
766 else if (index
< MAX_VERTEX_GENERIC_ATTRIBS
)
767 ATTR4UIV(VBO_ATTRIB_GENERIC0
+ index
, v
);
769 ERROR(GL_INVALID_VALUE
);
774 /* In addition to supporting NV_vertex_program, these entrypoints are
775 * used by the display list and other code specifically because of
776 * their property of aliasing with other attributes. (See
777 * vbo_save_loopback.c)
779 static void GLAPIENTRY
780 TAG(VertexAttrib1fNV
)(GLuint index
, GLfloat x
)
782 GET_CURRENT_CONTEXT(ctx
);
783 if (index
< VBO_ATTRIB_MAX
)
787 static void GLAPIENTRY
788 TAG(VertexAttrib1fvNV
)(GLuint index
, const GLfloat
* v
)
790 GET_CURRENT_CONTEXT(ctx
);
791 if (index
< VBO_ATTRIB_MAX
)
795 static void GLAPIENTRY
796 TAG(VertexAttrib2fNV
)(GLuint index
, GLfloat x
, GLfloat y
)
798 GET_CURRENT_CONTEXT(ctx
);
799 if (index
< VBO_ATTRIB_MAX
)
803 static void GLAPIENTRY
804 TAG(VertexAttrib2fvNV
)(GLuint index
, const GLfloat
* v
)
806 GET_CURRENT_CONTEXT(ctx
);
807 if (index
< VBO_ATTRIB_MAX
)
811 static void GLAPIENTRY
812 TAG(VertexAttrib3fNV
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
)
814 GET_CURRENT_CONTEXT(ctx
);
815 if (index
< VBO_ATTRIB_MAX
)
816 ATTR3F(index
, x
, y
, z
);
819 static void GLAPIENTRY
820 TAG(VertexAttrib3fvNV
)(GLuint index
,
823 GET_CURRENT_CONTEXT(ctx
);
824 if (index
< VBO_ATTRIB_MAX
)
828 static void GLAPIENTRY
829 TAG(VertexAttrib4fNV
)(GLuint index
, GLfloat x
, GLfloat y
, GLfloat z
, GLfloat w
)
831 GET_CURRENT_CONTEXT(ctx
);
832 if (index
< VBO_ATTRIB_MAX
)
833 ATTR4F(index
, x
, y
, z
, w
);
836 static void GLAPIENTRY
837 TAG(VertexAttrib4fvNV
)(GLuint index
, const GLfloat
* v
)
839 GET_CURRENT_CONTEXT(ctx
);
840 if (index
< VBO_ATTRIB_MAX
)
845 #define ERROR_IF_NOT_PACKED_TYPE(ctx, type, func) \
846 if (type != GL_INT_2_10_10_10_REV && type != GL_UNSIGNED_INT_2_10_10_10_REV) { \
847 _mesa_error(ctx, GL_INVALID_ENUM, "%s(type)", func); \
851 /* Extended version of ERROR_IF_NOT_PACKED_TYPE which also
852 * accepts GL_UNSIGNED_INT_10F_11F_11F_REV.
854 * Only used for VertexAttribP[123]ui[v]; VertexAttribP4* cannot use this type,
855 * and neither can legacy vertex attribs.
857 #define ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, func) \
858 if (type != GL_INT_2_10_10_10_REV && type != GL_UNSIGNED_INT_2_10_10_10_REV && \
859 type != GL_UNSIGNED_INT_10F_11F_11F_REV) { \
860 _mesa_error(ctx, GL_INVALID_ENUM, "%s(type)", func); \
864 static void GLAPIENTRY
865 TAG(VertexP2ui
)(GLenum type
, GLuint value
)
867 GET_CURRENT_CONTEXT(ctx
);
868 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glVertexP2ui");
869 ATTR_UI(ctx
, 2, type
, 0, VBO_ATTRIB_POS
, value
);
872 static void GLAPIENTRY
873 TAG(VertexP2uiv
)(GLenum type
, const GLuint
*value
)
875 GET_CURRENT_CONTEXT(ctx
);
876 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glVertexP2uiv");
877 ATTR_UI(ctx
, 2, type
, 0, VBO_ATTRIB_POS
, value
[0]);
880 static void GLAPIENTRY
881 TAG(VertexP3ui
)(GLenum type
, GLuint value
)
883 GET_CURRENT_CONTEXT(ctx
);
884 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glVertexP3ui");
885 ATTR_UI(ctx
, 3, type
, 0, VBO_ATTRIB_POS
, value
);
888 static void GLAPIENTRY
889 TAG(VertexP3uiv
)(GLenum type
, const GLuint
*value
)
891 GET_CURRENT_CONTEXT(ctx
);
892 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glVertexP3uiv");
893 ATTR_UI(ctx
, 3, type
, 0, VBO_ATTRIB_POS
, value
[0]);
896 static void GLAPIENTRY
897 TAG(VertexP4ui
)(GLenum type
, GLuint value
)
899 GET_CURRENT_CONTEXT(ctx
);
900 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glVertexP4ui");
901 ATTR_UI(ctx
, 4, type
, 0, VBO_ATTRIB_POS
, value
);
904 static void GLAPIENTRY
905 TAG(VertexP4uiv
)(GLenum type
, const GLuint
*value
)
907 GET_CURRENT_CONTEXT(ctx
);
908 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glVertexP4uiv");
909 ATTR_UI(ctx
, 4, type
, 0, VBO_ATTRIB_POS
, value
[0]);
912 static void GLAPIENTRY
913 TAG(TexCoordP1ui
)(GLenum type
, GLuint coords
)
915 GET_CURRENT_CONTEXT(ctx
);
916 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glTexCoordP1ui");
917 ATTR_UI(ctx
, 1, type
, 0, VBO_ATTRIB_TEX0
, coords
);
920 static void GLAPIENTRY
921 TAG(TexCoordP1uiv
)(GLenum type
, const GLuint
*coords
)
923 GET_CURRENT_CONTEXT(ctx
);
924 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glTexCoordP1uiv");
925 ATTR_UI(ctx
, 1, type
, 0, VBO_ATTRIB_TEX0
, coords
[0]);
928 static void GLAPIENTRY
929 TAG(TexCoordP2ui
)(GLenum type
, GLuint coords
)
931 GET_CURRENT_CONTEXT(ctx
);
932 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glTexCoordP2ui");
933 ATTR_UI(ctx
, 2, type
, 0, VBO_ATTRIB_TEX0
, coords
);
936 static void GLAPIENTRY
937 TAG(TexCoordP2uiv
)(GLenum type
, const GLuint
*coords
)
939 GET_CURRENT_CONTEXT(ctx
);
940 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glTexCoordP2uiv");
941 ATTR_UI(ctx
, 2, type
, 0, VBO_ATTRIB_TEX0
, coords
[0]);
944 static void GLAPIENTRY
945 TAG(TexCoordP3ui
)(GLenum type
, GLuint coords
)
947 GET_CURRENT_CONTEXT(ctx
);
948 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glTexCoordP3ui");
949 ATTR_UI(ctx
, 3, type
, 0, VBO_ATTRIB_TEX0
, coords
);
952 static void GLAPIENTRY
953 TAG(TexCoordP3uiv
)(GLenum type
, const GLuint
*coords
)
955 GET_CURRENT_CONTEXT(ctx
);
956 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glTexCoordP3uiv");
957 ATTR_UI(ctx
, 3, type
, 0, VBO_ATTRIB_TEX0
, coords
[0]);
960 static void GLAPIENTRY
961 TAG(TexCoordP4ui
)(GLenum type
, GLuint coords
)
963 GET_CURRENT_CONTEXT(ctx
);
964 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glTexCoordP4ui");
965 ATTR_UI(ctx
, 4, type
, 0, VBO_ATTRIB_TEX0
, coords
);
968 static void GLAPIENTRY
969 TAG(TexCoordP4uiv
)(GLenum type
, const GLuint
*coords
)
971 GET_CURRENT_CONTEXT(ctx
);
972 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glTexCoordP4uiv");
973 ATTR_UI(ctx
, 4, type
, 0, VBO_ATTRIB_TEX0
, coords
[0]);
976 static void GLAPIENTRY
977 TAG(MultiTexCoordP1ui
)(GLenum target
, GLenum type
, GLuint coords
)
979 GET_CURRENT_CONTEXT(ctx
);
980 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
981 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glMultiTexCoordP1ui");
982 ATTR_UI(ctx
, 1, type
, 0, attr
, coords
);
985 static void GLAPIENTRY
986 TAG(MultiTexCoordP1uiv
)(GLenum target
, GLenum type
, const GLuint
*coords
)
988 GET_CURRENT_CONTEXT(ctx
);
989 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
990 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glMultiTexCoordP1uiv");
991 ATTR_UI(ctx
, 1, type
, 0, attr
, coords
[0]);
994 static void GLAPIENTRY
995 TAG(MultiTexCoordP2ui
)(GLenum target
, GLenum type
, GLuint coords
)
997 GET_CURRENT_CONTEXT(ctx
);
998 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
999 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glMultiTexCoordP2ui");
1000 ATTR_UI(ctx
, 2, type
, 0, attr
, coords
);
1003 static void GLAPIENTRY
1004 TAG(MultiTexCoordP2uiv
)(GLenum target
, GLenum type
, const GLuint
*coords
)
1006 GET_CURRENT_CONTEXT(ctx
);
1007 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
1008 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glMultiTexCoordP2uiv");
1009 ATTR_UI(ctx
, 2, type
, 0, attr
, coords
[0]);
1012 static void GLAPIENTRY
1013 TAG(MultiTexCoordP3ui
)(GLenum target
, GLenum type
, GLuint coords
)
1015 GET_CURRENT_CONTEXT(ctx
);
1016 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
1017 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glMultiTexCoordP3ui");
1018 ATTR_UI(ctx
, 3, type
, 0, attr
, coords
);
1021 static void GLAPIENTRY
1022 TAG(MultiTexCoordP3uiv
)(GLenum target
, GLenum type
, const GLuint
*coords
)
1024 GET_CURRENT_CONTEXT(ctx
);
1025 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
1026 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glMultiTexCoordP3uiv");
1027 ATTR_UI(ctx
, 3, type
, 0, attr
, coords
[0]);
1030 static void GLAPIENTRY
1031 TAG(MultiTexCoordP4ui
)(GLenum target
, GLenum type
, GLuint coords
)
1033 GET_CURRENT_CONTEXT(ctx
);
1034 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
1035 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glMultiTexCoordP4ui");
1036 ATTR_UI(ctx
, 4, type
, 0, attr
, coords
);
1039 static void GLAPIENTRY
1040 TAG(MultiTexCoordP4uiv
)(GLenum target
, GLenum type
, const GLuint
*coords
)
1042 GET_CURRENT_CONTEXT(ctx
);
1043 GLuint attr
= (target
& 0x7) + VBO_ATTRIB_TEX0
;
1044 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glMultiTexCoordP4uiv");
1045 ATTR_UI(ctx
, 4, type
, 0, attr
, coords
[0]);
1048 static void GLAPIENTRY
1049 TAG(NormalP3ui
)(GLenum type
, GLuint coords
)
1051 GET_CURRENT_CONTEXT(ctx
);
1052 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glNormalP3ui");
1053 ATTR_UI(ctx
, 3, type
, 1, VBO_ATTRIB_NORMAL
, coords
);
1056 static void GLAPIENTRY
1057 TAG(NormalP3uiv
)(GLenum type
, const GLuint
*coords
)
1059 GET_CURRENT_CONTEXT(ctx
);
1060 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glNormalP3uiv");
1061 ATTR_UI(ctx
, 3, type
, 1, VBO_ATTRIB_NORMAL
, coords
[0]);
1064 static void GLAPIENTRY
1065 TAG(ColorP3ui
)(GLenum type
, GLuint color
)
1067 GET_CURRENT_CONTEXT(ctx
);
1068 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glColorP3ui");
1069 ATTR_UI(ctx
, 3, type
, 1, VBO_ATTRIB_COLOR0
, color
);
1072 static void GLAPIENTRY
1073 TAG(ColorP3uiv
)(GLenum type
, const GLuint
*color
)
1075 GET_CURRENT_CONTEXT(ctx
);
1076 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glColorP3uiv");
1077 ATTR_UI(ctx
, 3, type
, 1, VBO_ATTRIB_COLOR0
, color
[0]);
1080 static void GLAPIENTRY
1081 TAG(ColorP4ui
)(GLenum type
, GLuint color
)
1083 GET_CURRENT_CONTEXT(ctx
);
1084 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glColorP4ui");
1085 ATTR_UI(ctx
, 4, type
, 1, VBO_ATTRIB_COLOR0
, color
);
1088 static void GLAPIENTRY
1089 TAG(ColorP4uiv
)(GLenum type
, const GLuint
*color
)
1091 GET_CURRENT_CONTEXT(ctx
);
1092 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glColorP4uiv");
1093 ATTR_UI(ctx
, 4, type
, 1, VBO_ATTRIB_COLOR0
, color
[0]);
1096 static void GLAPIENTRY
1097 TAG(SecondaryColorP3ui
)(GLenum type
, GLuint color
)
1099 GET_CURRENT_CONTEXT(ctx
);
1100 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glSecondaryColorP3ui");
1101 ATTR_UI(ctx
, 3, type
, 1, VBO_ATTRIB_COLOR1
, color
);
1104 static void GLAPIENTRY
1105 TAG(SecondaryColorP3uiv
)(GLenum type
, const GLuint
*color
)
1107 GET_CURRENT_CONTEXT(ctx
);
1108 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glSecondaryColorP3uiv");
1109 ATTR_UI(ctx
, 3, type
, 1, VBO_ATTRIB_COLOR1
, color
[0]);
1112 static void GLAPIENTRY
1113 TAG(VertexAttribP1ui
)(GLuint index
, GLenum type
, GLboolean normalized
,
1116 GET_CURRENT_CONTEXT(ctx
);
1117 ERROR_IF_NOT_PACKED_TYPE_EXT(ctx
, type
, "glVertexAttribP1ui");
1118 ATTR_UI_INDEX(ctx
, 1, type
, normalized
, index
, value
);
1121 static void GLAPIENTRY
1122 TAG(VertexAttribP2ui
)(GLuint index
, GLenum type
, GLboolean normalized
,
1125 GET_CURRENT_CONTEXT(ctx
);
1126 ERROR_IF_NOT_PACKED_TYPE_EXT(ctx
, type
, "glVertexAttribP2ui");
1127 ATTR_UI_INDEX(ctx
, 2, type
, normalized
, index
, value
);
1130 static void GLAPIENTRY
1131 TAG(VertexAttribP3ui
)(GLuint index
, GLenum type
, GLboolean normalized
,
1134 GET_CURRENT_CONTEXT(ctx
);
1135 ERROR_IF_NOT_PACKED_TYPE_EXT(ctx
, type
, "glVertexAttribP3ui");
1136 ATTR_UI_INDEX(ctx
, 3, type
, normalized
, index
, value
);
1139 static void GLAPIENTRY
1140 TAG(VertexAttribP4ui
)(GLuint index
, GLenum type
, GLboolean normalized
,
1143 GET_CURRENT_CONTEXT(ctx
);
1144 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glVertexAttribP4ui");
1145 ATTR_UI_INDEX(ctx
, 4, type
, normalized
, index
, value
);
1148 static void GLAPIENTRY
1149 TAG(VertexAttribP1uiv
)(GLuint index
, GLenum type
, GLboolean normalized
,
1150 const GLuint
*value
)
1152 GET_CURRENT_CONTEXT(ctx
);
1153 ERROR_IF_NOT_PACKED_TYPE_EXT(ctx
, type
, "glVertexAttribP1uiv");
1154 ATTR_UI_INDEX(ctx
, 1, type
, normalized
, index
, *value
);
1157 static void GLAPIENTRY
1158 TAG(VertexAttribP2uiv
)(GLuint index
, GLenum type
, GLboolean normalized
,
1159 const GLuint
*value
)
1161 GET_CURRENT_CONTEXT(ctx
);
1162 ERROR_IF_NOT_PACKED_TYPE_EXT(ctx
, type
, "glVertexAttribP2uiv");
1163 ATTR_UI_INDEX(ctx
, 2, type
, normalized
, index
, *value
);
1166 static void GLAPIENTRY
1167 TAG(VertexAttribP3uiv
)(GLuint index
, GLenum type
, GLboolean normalized
,
1168 const GLuint
*value
)
1170 GET_CURRENT_CONTEXT(ctx
);
1171 ERROR_IF_NOT_PACKED_TYPE_EXT(ctx
, type
, "glVertexAttribP3uiv");
1172 ATTR_UI_INDEX(ctx
, 3, type
, normalized
, index
, *value
);
1175 static void GLAPIENTRY
1176 TAG(VertexAttribP4uiv
)(GLuint index
, GLenum type
, GLboolean normalized
,
1177 const GLuint
*value
)
1179 GET_CURRENT_CONTEXT(ctx
);
1180 ERROR_IF_NOT_PACKED_TYPE(ctx
, type
, "glVertexAttribP4uiv");
1181 ATTR_UI_INDEX(ctx
, 4, type
, normalized
, index
, *value
);