• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**************************************************************************
2 
3 Copyright 2002 VMware, Inc.
4 Copyright 2011 Dave Airlie (ARB_vertex_type_2_10_10_10_rev support)
5 All Rights Reserved.
6 
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:
13 
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
16 Software.
17 
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 VMWARE 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.
25 
26 **************************************************************************/
27 
28 #include "util/format_r11g11b10f.h"
29 #include "main/varray.h"
30 
31 
32 /* ATTR */
33 #define ATTRI( A, N, V0, V1, V2, V3 ) \
34     ATTR_UNION(A, N, GL_INT, fi_type, INT_AS_UNION(V0), INT_AS_UNION(V1), \
35         INT_AS_UNION(V2), INT_AS_UNION(V3))
36 #define ATTRUI( A, N, V0, V1, V2, V3 ) \
37     ATTR_UNION(A, N, GL_UNSIGNED_INT, fi_type, UINT_AS_UNION(V0), UINT_AS_UNION(V1), \
38         UINT_AS_UNION(V2), UINT_AS_UNION(V3))
39 #define ATTRF( A, N, V0, V1, V2, V3 ) \
40     ATTR_UNION(A, N, GL_FLOAT, fi_type, FLOAT_AS_UNION(V0), FLOAT_AS_UNION(V1),\
41         FLOAT_AS_UNION(V2), FLOAT_AS_UNION(V3))
42 #define ATTRD( A, N, V0, V1, V2, V3 ) \
43     ATTR_UNION(A, N, GL_DOUBLE, double, V0, V1, V2, V3)
44 #define ATTRUI64( A, N, V0, V1, V2, V3 ) \
45     ATTR_UNION(A, N, GL_UNSIGNED_INT64_ARB, uint64_t, V0, V1, V2, V3)
46 
47 
48 /* float */
49 #define ATTR1FV( A, V ) ATTRF( A, 1, (V)[0], 0, 0, 1 )
50 #define ATTR2FV( A, V ) ATTRF( A, 2, (V)[0], (V)[1], 0, 1 )
51 #define ATTR3FV( A, V ) ATTRF( A, 3, (V)[0], (V)[1], (V)[2], 1 )
52 #define ATTR4FV( A, V ) ATTRF( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
53 
54 #define ATTR1F( A, X )          ATTRF( A, 1, X, 0, 0, 1 )
55 #define ATTR2F( A, X, Y )       ATTRF( A, 2, X, Y, 0, 1 )
56 #define ATTR3F( A, X, Y, Z )    ATTRF( A, 3, X, Y, Z, 1 )
57 #define ATTR4F( A, X, Y, Z, W ) ATTRF( A, 4, X, Y, Z, W )
58 
59 
60 /* int */
61 #define ATTR2IV( A, V ) ATTRI( A, 2, (V)[0], (V)[1], 0, 1 )
62 #define ATTR3IV( A, V ) ATTRI( A, 3, (V)[0], (V)[1], (V)[2], 1 )
63 #define ATTR4IV( A, V ) ATTRI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
64 
65 #define ATTR1I( A, X )          ATTRI( A, 1, X, 0, 0, 1 )
66 #define ATTR2I( A, X, Y )       ATTRI( A, 2, X, Y, 0, 1 )
67 #define ATTR3I( A, X, Y, Z )    ATTRI( A, 3, X, Y, Z, 1 )
68 #define ATTR4I( A, X, Y, Z, W ) ATTRI( A, 4, X, Y, Z, W )
69 
70 
71 /* uint */
72 #define ATTR2UIV( A, V ) ATTRUI( A, 2, (V)[0], (V)[1], 0, 1 )
73 #define ATTR3UIV( A, V ) ATTRUI( A, 3, (V)[0], (V)[1], (V)[2], 1 )
74 #define ATTR4UIV( A, V ) ATTRUI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
75 
76 #define ATTR1UI( A, X )          ATTRUI( A, 1, X, 0, 0, 1 )
77 #define ATTR2UI( A, X, Y )       ATTRUI( A, 2, X, Y, 0, 1 )
78 #define ATTR3UI( A, X, Y, Z )    ATTRUI( A, 3, X, Y, Z, 1 )
79 #define ATTR4UI( A, X, Y, Z, W ) ATTRUI( A, 4, X, Y, Z, W )
80 
81 #define MAT_ATTR( A, N, V ) ATTRF( A, N, (V)[0], (V)[1], (V)[2], (V)[3] )
82 
conv_ui10_to_norm_float(unsigned ui10)83 static inline float conv_ui10_to_norm_float(unsigned ui10)
84 {
85    return ui10 / 1023.0f;
86 }
87 
conv_ui2_to_norm_float(unsigned ui2)88 static inline float conv_ui2_to_norm_float(unsigned ui2)
89 {
90    return ui2 / 3.0f;
91 }
92 
93 #define ATTRUI10_1( A, UI ) ATTRF( A, 1, (UI) & 0x3ff, 0, 0, 1 )
94 #define ATTRUI10_2( A, UI ) ATTRF( A, 2, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, 0, 1 )
95 #define ATTRUI10_3( A, UI ) ATTRF( A, 3, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, 1 )
96 #define ATTRUI10_4( A, UI ) ATTRF( A, 4, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, ((UI) >> 30) & 0x3 )
97 
98 #define ATTRUI10N_1( A, UI ) ATTRF( A, 1, conv_ui10_to_norm_float((UI) & 0x3ff), 0, 0, 1 )
99 #define ATTRUI10N_2( A, UI ) ATTRF( A, 2, \
100 				   conv_ui10_to_norm_float((UI) & 0x3ff), \
101 				   conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), 0, 1 )
102 #define ATTRUI10N_3( A, UI ) ATTRF( A, 3, \
103 				   conv_ui10_to_norm_float((UI) & 0x3ff), \
104 				   conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
105 				   conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), 1 )
106 #define ATTRUI10N_4( A, UI ) ATTRF( A, 4, \
107 				   conv_ui10_to_norm_float((UI) & 0x3ff), \
108 				   conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
109 				   conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), \
110 				   conv_ui2_to_norm_float(((UI) >> 30) & 0x3) )
111 
112 struct attr_bits_10 {signed int x:10;};
113 struct attr_bits_2 {signed int x:2;};
114 
conv_i10_to_i(int i10)115 static inline float conv_i10_to_i(int i10)
116 {
117    struct attr_bits_10 val;
118    val.x = i10;
119    return (float)val.x;
120 }
121 
conv_i2_to_i(int i2)122 static inline float conv_i2_to_i(int i2)
123 {
124    struct attr_bits_2 val;
125    val.x = i2;
126    return (float)val.x;
127 }
128 
conv_i10_to_norm_float(const struct gl_context * ctx,int i10)129 static inline float conv_i10_to_norm_float(const struct gl_context *ctx, int i10)
130 {
131    struct attr_bits_10 val;
132    val.x = i10;
133 
134    /* Traditionally, OpenGL has had two equations for converting from
135     * normalized fixed-point data to floating-point data.  In the OpenGL 3.2
136     * specification, these are equations 2.2 and 2.3, respectively:
137     *
138     *    f = (2c + 1)/(2^b - 1).                                (2.2)
139     *
140     * Comments below this equation state: "In general, this representation is
141     * used for signed normalized fixed-point parameters in GL commands, such
142     * as vertex attribute values."  Which is what we're doing here.
143     *
144     *    f = max{c/(2^(b-1) - 1), -1.0}                         (2.3)
145     *
146     * Comments below this equation state: "In general, this representation is
147     * used for signed normalized fixed-point texture or floating point values."
148     *
149     * OpenGL 4.2+ and ES 3.0 remedy this and state that equation 2.3 (above)
150     * is used in every case.  They remove equation 2.2 completely.
151     */
152    if (_mesa_is_gles3(ctx) ||
153        (ctx->API == API_OPENGL_CORE && ctx->Version >= 42)) {
154       /* Equation 2.3 above. */
155       float f = ((float) val.x) / 511.0F;
156       return MAX2(f, -1.0f);
157    } else {
158       /* Equation 2.2 above. */
159       return (2.0F * (float)val.x + 1.0F) * (1.0F  / 1023.0F);
160    }
161 }
162 
conv_i2_to_norm_float(const struct gl_context * ctx,int i2)163 static inline float conv_i2_to_norm_float(const struct gl_context *ctx, int i2)
164 {
165    struct attr_bits_2 val;
166    val.x = i2;
167 
168    if (_mesa_is_gles3(ctx) ||
169        (ctx->API == API_OPENGL_CORE && ctx->Version >= 42)) {
170       /* Equation 2.3 above. */
171       float f = (float) val.x;
172       return MAX2(f, -1.0f);
173    } else {
174       /* Equation 2.2 above. */
175       return (2.0F * (float)val.x + 1.0F) * (1.0F / 3.0F);
176    }
177 }
178 
179 #define ATTRI10_1( A, I10 ) ATTRF( A, 1, conv_i10_to_i((I10) & 0x3ff), 0, 0, 1 )
180 #define ATTRI10_2( A, I10 ) ATTRF( A, 2, \
181 				conv_i10_to_i((I10) & 0x3ff),		\
182 				conv_i10_to_i(((I10) >> 10) & 0x3ff), 0, 1 )
183 #define ATTRI10_3( A, I10 ) ATTRF( A, 3, \
184 				conv_i10_to_i((I10) & 0x3ff),	    \
185 				conv_i10_to_i(((I10) >> 10) & 0x3ff), \
186 				conv_i10_to_i(((I10) >> 20) & 0x3ff), 1 )
187 #define ATTRI10_4( A, I10 ) ATTRF( A, 4, \
188 				conv_i10_to_i((I10) & 0x3ff),		\
189 				conv_i10_to_i(((I10) >> 10) & 0x3ff), \
190 				conv_i10_to_i(((I10) >> 20) & 0x3ff), \
191 				conv_i2_to_i(((I10) >> 30) & 0x3))
192 
193 
194 #define ATTRI10N_1(ctx, A, I10) ATTRF(A, 1, conv_i10_to_norm_float(ctx, (I10) & 0x3ff), 0, 0, 1 )
195 #define ATTRI10N_2(ctx, A, I10) ATTRF(A, 2, \
196 				conv_i10_to_norm_float(ctx, (I10) & 0x3ff),		\
197 				conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), 0, 1 )
198 #define ATTRI10N_3(ctx, A, I10) ATTRF(A, 3, \
199 				conv_i10_to_norm_float(ctx, (I10) & 0x3ff),	    \
200 				conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \
201 				conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff), 1 )
202 #define ATTRI10N_4(ctx, A, I10) ATTRF(A, 4, \
203 				conv_i10_to_norm_float(ctx, (I10) & 0x3ff),		\
204 				conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \
205 				conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff), \
206 				conv_i2_to_norm_float(ctx, ((I10) >> 30) & 0x3))
207 
208 #define ATTR_UI(ctx, val, type, normalized, attr, arg) do {	\
209    if ((type) == GL_UNSIGNED_INT_2_10_10_10_REV) {		\
210       if (normalized) {						\
211 	 ATTRUI10N_##val((attr), (arg));			\
212       } else {							\
213 	 ATTRUI10_##val((attr), (arg));				\
214       }								\
215    } else if ((type) == GL_INT_2_10_10_10_REV) {		\
216       if (normalized) {						\
217 	 ATTRI10N_##val(ctx, (attr), (arg));			\
218       } else {							\
219 	 ATTRI10_##val((attr), (arg));				\
220       }								\
221    } else if ((type) == GL_UNSIGNED_INT_10F_11F_11F_REV) {	\
222       float res[4];						\
223       res[3] = 1;                                               \
224       r11g11b10f_to_float3((arg), res);				\
225       ATTR##val##FV((attr), res);				\
226    } else							\
227       ERROR(GL_INVALID_VALUE);					\
228    } while(0)
229 
230 #define ATTR_UI_INDEX(ctx, val, type, normalized, index, arg) do {	\
231       if ((index) == 0 && _mesa_attr_zero_aliases_vertex(ctx)) {	\
232 	 ATTR_UI(ctx, val, (type), normalized, 0, (arg));		\
233       } else if ((index) < MAX_VERTEX_GENERIC_ATTRIBS) {		\
234 	 ATTR_UI(ctx, val, (type), normalized, VBO_ATTRIB_GENERIC0 + (index), (arg)); \
235       } else								\
236 	 ERROR(GL_INVALID_VALUE);					\
237    } while(0)
238 
239 
240 /* Doubles */
241 #define ATTR1DV( A, V ) ATTRD( A, 1, (V)[0], 0, 0, 1 )
242 #define ATTR2DV( A, V ) ATTRD( A, 2, (V)[0], (V)[1], 0, 1 )
243 #define ATTR3DV( A, V ) ATTRD( A, 3, (V)[0], (V)[1], (V)[2], 1 )
244 #define ATTR4DV( A, V ) ATTRD( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
245 
246 #define ATTR1D( A, X )          ATTRD( A, 1, X, 0, 0, 1 )
247 #define ATTR2D( A, X, Y )       ATTRD( A, 2, X, Y, 0, 1 )
248 #define ATTR3D( A, X, Y, Z )    ATTRD( A, 3, X, Y, Z, 1 )
249 #define ATTR4D( A, X, Y, Z, W ) ATTRD( A, 4, X, Y, Z, W )
250 
251 #define ATTR1UIV64( A, V ) ATTRUI64( A, 1, (V)[0], 0, 0, 0 )
252 #define ATTR1UI64( A, X )  ATTRUI64( A, 1, X, 0, 0, 0 )
253 
254 
255 static void GLAPIENTRY
TAG(Vertex2f)256 TAG(Vertex2f)(GLfloat x, GLfloat y)
257 {
258    GET_CURRENT_CONTEXT(ctx);
259    ATTR2F(VBO_ATTRIB_POS, x, y);
260 }
261 
262 static void GLAPIENTRY
TAG(Vertex2fv)263 TAG(Vertex2fv)(const GLfloat * v)
264 {
265    GET_CURRENT_CONTEXT(ctx);
266    ATTR2FV(VBO_ATTRIB_POS, v);
267 }
268 
269 static void GLAPIENTRY
TAG(Vertex3f)270 TAG(Vertex3f)(GLfloat x, GLfloat y, GLfloat z)
271 {
272    GET_CURRENT_CONTEXT(ctx);
273    ATTR3F(VBO_ATTRIB_POS, x, y, z);
274 }
275 
276 static void GLAPIENTRY
TAG(Vertex3fv)277 TAG(Vertex3fv)(const GLfloat * v)
278 {
279    GET_CURRENT_CONTEXT(ctx);
280    ATTR3FV(VBO_ATTRIB_POS, v);
281 }
282 
283 static void GLAPIENTRY
TAG(Vertex4f)284 TAG(Vertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
285 {
286    GET_CURRENT_CONTEXT(ctx);
287    ATTR4F(VBO_ATTRIB_POS, x, y, z, w);
288 }
289 
290 static void GLAPIENTRY
TAG(Vertex4fv)291 TAG(Vertex4fv)(const GLfloat * v)
292 {
293    GET_CURRENT_CONTEXT(ctx);
294    ATTR4FV(VBO_ATTRIB_POS, v);
295 }
296 
297 
298 
299 static void GLAPIENTRY
TAG(TexCoord1f)300 TAG(TexCoord1f)(GLfloat x)
301 {
302    GET_CURRENT_CONTEXT(ctx);
303    ATTR1F(VBO_ATTRIB_TEX0, x);
304 }
305 
306 static void GLAPIENTRY
TAG(TexCoord1fv)307 TAG(TexCoord1fv)(const GLfloat * v)
308 {
309    GET_CURRENT_CONTEXT(ctx);
310    ATTR1FV(VBO_ATTRIB_TEX0, v);
311 }
312 
313 static void GLAPIENTRY
TAG(TexCoord2f)314 TAG(TexCoord2f)(GLfloat x, GLfloat y)
315 {
316    GET_CURRENT_CONTEXT(ctx);
317    ATTR2F(VBO_ATTRIB_TEX0, x, y);
318 }
319 
320 static void GLAPIENTRY
TAG(TexCoord2fv)321 TAG(TexCoord2fv)(const GLfloat * v)
322 {
323    GET_CURRENT_CONTEXT(ctx);
324    ATTR2FV(VBO_ATTRIB_TEX0, v);
325 }
326 
327 static void GLAPIENTRY
TAG(TexCoord3f)328 TAG(TexCoord3f)(GLfloat x, GLfloat y, GLfloat z)
329 {
330    GET_CURRENT_CONTEXT(ctx);
331    ATTR3F(VBO_ATTRIB_TEX0, x, y, z);
332 }
333 
334 static void GLAPIENTRY
TAG(TexCoord3fv)335 TAG(TexCoord3fv)(const GLfloat * v)
336 {
337    GET_CURRENT_CONTEXT(ctx);
338    ATTR3FV(VBO_ATTRIB_TEX0, v);
339 }
340 
341 static void GLAPIENTRY
TAG(TexCoord4f)342 TAG(TexCoord4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
343 {
344    GET_CURRENT_CONTEXT(ctx);
345    ATTR4F(VBO_ATTRIB_TEX0, x, y, z, w);
346 }
347 
348 static void GLAPIENTRY
TAG(TexCoord4fv)349 TAG(TexCoord4fv)(const GLfloat * v)
350 {
351    GET_CURRENT_CONTEXT(ctx);
352    ATTR4FV(VBO_ATTRIB_TEX0, v);
353 }
354 
355 
356 
357 static void GLAPIENTRY
TAG(Normal3f)358 TAG(Normal3f)(GLfloat x, GLfloat y, GLfloat z)
359 {
360    GET_CURRENT_CONTEXT(ctx);
361    ATTR3F(VBO_ATTRIB_NORMAL, x, y, z);
362 }
363 
364 static void GLAPIENTRY
TAG(Normal3fv)365 TAG(Normal3fv)(const GLfloat * v)
366 {
367    GET_CURRENT_CONTEXT(ctx);
368    ATTR3FV(VBO_ATTRIB_NORMAL, v);
369 }
370 
371 
372 
373 static void GLAPIENTRY
TAG(FogCoordfEXT)374 TAG(FogCoordfEXT)(GLfloat x)
375 {
376    GET_CURRENT_CONTEXT(ctx);
377    ATTR1F(VBO_ATTRIB_FOG, x);
378 }
379 
380 
381 
382 static void GLAPIENTRY
TAG(FogCoordfvEXT)383 TAG(FogCoordfvEXT)(const GLfloat * v)
384 {
385    GET_CURRENT_CONTEXT(ctx);
386    ATTR1FV(VBO_ATTRIB_FOG, v);
387 }
388 
389 static void GLAPIENTRY
TAG(Color3f)390 TAG(Color3f)(GLfloat x, GLfloat y, GLfloat z)
391 {
392    GET_CURRENT_CONTEXT(ctx);
393    ATTR3F(VBO_ATTRIB_COLOR0, x, y, z);
394 }
395 
396 static void GLAPIENTRY
TAG(Color3fv)397 TAG(Color3fv)(const GLfloat * v)
398 {
399    GET_CURRENT_CONTEXT(ctx);
400    ATTR3FV(VBO_ATTRIB_COLOR0, v);
401 }
402 
403 static void GLAPIENTRY
TAG(Color4f)404 TAG(Color4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
405 {
406    GET_CURRENT_CONTEXT(ctx);
407    ATTR4F(VBO_ATTRIB_COLOR0, x, y, z, w);
408 }
409 
410 static void GLAPIENTRY
TAG(Color4fv)411 TAG(Color4fv)(const GLfloat * v)
412 {
413    GET_CURRENT_CONTEXT(ctx);
414    ATTR4FV(VBO_ATTRIB_COLOR0, v);
415 }
416 
417 
418 
419 static void GLAPIENTRY
TAG(SecondaryColor3fEXT)420 TAG(SecondaryColor3fEXT)(GLfloat x, GLfloat y, GLfloat z)
421 {
422    GET_CURRENT_CONTEXT(ctx);
423    ATTR3F(VBO_ATTRIB_COLOR1, x, y, z);
424 }
425 
426 static void GLAPIENTRY
TAG(SecondaryColor3fvEXT)427 TAG(SecondaryColor3fvEXT)(const GLfloat * v)
428 {
429    GET_CURRENT_CONTEXT(ctx);
430    ATTR3FV(VBO_ATTRIB_COLOR1, v);
431 }
432 
433 
434 
435 static void GLAPIENTRY
TAG(EdgeFlag)436 TAG(EdgeFlag)(GLboolean b)
437 {
438    GET_CURRENT_CONTEXT(ctx);
439    ATTR1F(VBO_ATTRIB_EDGEFLAG, (GLfloat) b);
440 }
441 
442 
443 
444 static void GLAPIENTRY
TAG(Indexf)445 TAG(Indexf)(GLfloat f)
446 {
447    GET_CURRENT_CONTEXT(ctx);
448    ATTR1F(VBO_ATTRIB_INDEX, f);
449 }
450 
451 static void GLAPIENTRY
TAG(Indexfv)452 TAG(Indexfv)(const GLfloat * f)
453 {
454    GET_CURRENT_CONTEXT(ctx);
455    ATTR1FV(VBO_ATTRIB_INDEX, f);
456 }
457 
458 
459 
460 static void GLAPIENTRY
TAG(MultiTexCoord1f)461 TAG(MultiTexCoord1f)(GLenum target, GLfloat x)
462 {
463    GET_CURRENT_CONTEXT(ctx);
464    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
465    ATTR1F(attr, x);
466 }
467 
468 static void GLAPIENTRY
TAG(MultiTexCoord1fv)469 TAG(MultiTexCoord1fv)(GLenum target, const GLfloat * v)
470 {
471    GET_CURRENT_CONTEXT(ctx);
472    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
473    ATTR1FV(attr, v);
474 }
475 
476 static void GLAPIENTRY
TAG(MultiTexCoord2f)477 TAG(MultiTexCoord2f)(GLenum target, GLfloat x, GLfloat y)
478 {
479    GET_CURRENT_CONTEXT(ctx);
480    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
481    ATTR2F(attr, x, y);
482 }
483 
484 static void GLAPIENTRY
TAG(MultiTexCoord2fv)485 TAG(MultiTexCoord2fv)(GLenum target, const GLfloat * v)
486 {
487    GET_CURRENT_CONTEXT(ctx);
488    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
489    ATTR2FV(attr, v);
490 }
491 
492 static void GLAPIENTRY
TAG(MultiTexCoord3f)493 TAG(MultiTexCoord3f)(GLenum target, GLfloat x, GLfloat y, GLfloat z)
494 {
495    GET_CURRENT_CONTEXT(ctx);
496    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
497    ATTR3F(attr, x, y, z);
498 }
499 
500 static void GLAPIENTRY
TAG(MultiTexCoord3fv)501 TAG(MultiTexCoord3fv)(GLenum target, const GLfloat * v)
502 {
503    GET_CURRENT_CONTEXT(ctx);
504    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
505    ATTR3FV(attr, v);
506 }
507 
508 static void GLAPIENTRY
TAG(MultiTexCoord4f)509 TAG(MultiTexCoord4f)(GLenum target, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
510 {
511    GET_CURRENT_CONTEXT(ctx);
512    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
513    ATTR4F(attr, x, y, z, w);
514 }
515 
516 static void GLAPIENTRY
TAG(MultiTexCoord4fv)517 TAG(MultiTexCoord4fv)(GLenum target, const GLfloat * v)
518 {
519    GET_CURRENT_CONTEXT(ctx);
520    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
521    ATTR4FV(attr, v);
522 }
523 
524 
525 /**
526  * If index=0, does glVertexAttrib*() alias glVertex() to emit a vertex?
527  * It depends on a few things, including whether we're inside or outside
528  * of glBegin/glEnd.
529  */
530 static inline bool
is_vertex_position(const struct gl_context * ctx,GLuint index)531 is_vertex_position(const struct gl_context *ctx, GLuint index)
532 {
533    return (index == 0 &&
534            _mesa_attr_zero_aliases_vertex(ctx) &&
535            _mesa_inside_begin_end(ctx));
536 }
537 
538 
539 static void GLAPIENTRY
TAG(VertexAttrib1fARB)540 TAG(VertexAttrib1fARB)(GLuint index, GLfloat x)
541 {
542    GET_CURRENT_CONTEXT(ctx);
543    if (is_vertex_position(ctx, index))
544       ATTR1F(0, x);
545    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
546       ATTR1F(VBO_ATTRIB_GENERIC0 + index, x);
547    else
548       ERROR(GL_INVALID_VALUE);
549 }
550 
551 static void GLAPIENTRY
TAG(VertexAttrib1fvARB)552 TAG(VertexAttrib1fvARB)(GLuint index, const GLfloat * v)
553 {
554    GET_CURRENT_CONTEXT(ctx);
555    if (is_vertex_position(ctx, index))
556       ATTR1FV(0, v);
557    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
558       ATTR1FV(VBO_ATTRIB_GENERIC0 + index, v);
559    else
560       ERROR(GL_INVALID_VALUE);
561 }
562 
563 static void GLAPIENTRY
TAG(VertexAttrib2fARB)564 TAG(VertexAttrib2fARB)(GLuint index, GLfloat x, GLfloat y)
565 {
566    GET_CURRENT_CONTEXT(ctx);
567    if (is_vertex_position(ctx, index))
568       ATTR2F(0, x, y);
569    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
570       ATTR2F(VBO_ATTRIB_GENERIC0 + index, x, y);
571    else
572       ERROR(GL_INVALID_VALUE);
573 }
574 
575 static void GLAPIENTRY
TAG(VertexAttrib2fvARB)576 TAG(VertexAttrib2fvARB)(GLuint index, const GLfloat * v)
577 {
578    GET_CURRENT_CONTEXT(ctx);
579    if (is_vertex_position(ctx, index))
580       ATTR2FV(0, v);
581    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
582       ATTR2FV(VBO_ATTRIB_GENERIC0 + index, v);
583    else
584       ERROR(GL_INVALID_VALUE);
585 }
586 
587 static void GLAPIENTRY
TAG(VertexAttrib3fARB)588 TAG(VertexAttrib3fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z)
589 {
590    GET_CURRENT_CONTEXT(ctx);
591    if (is_vertex_position(ctx, index))
592       ATTR3F(0, x, y, z);
593    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
594       ATTR3F(VBO_ATTRIB_GENERIC0 + index, x, y, z);
595    else
596       ERROR(GL_INVALID_VALUE);
597 }
598 
599 static void GLAPIENTRY
TAG(VertexAttrib3fvARB)600 TAG(VertexAttrib3fvARB)(GLuint index, const GLfloat * v)
601 {
602    GET_CURRENT_CONTEXT(ctx);
603    if (is_vertex_position(ctx, index))
604       ATTR3FV(0, v);
605    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
606       ATTR3FV(VBO_ATTRIB_GENERIC0 + index, v);
607    else
608       ERROR(GL_INVALID_VALUE);
609 }
610 
611 static void GLAPIENTRY
TAG(VertexAttrib4fARB)612 TAG(VertexAttrib4fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
613 {
614    GET_CURRENT_CONTEXT(ctx);
615    if (is_vertex_position(ctx, index))
616       ATTR4F(0, x, y, z, w);
617    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
618       ATTR4F(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
619    else
620       ERROR(GL_INVALID_VALUE);
621 }
622 
623 static void GLAPIENTRY
TAG(VertexAttrib4fvARB)624 TAG(VertexAttrib4fvARB)(GLuint index, const GLfloat * v)
625 {
626    GET_CURRENT_CONTEXT(ctx);
627    if (is_vertex_position(ctx, index))
628       ATTR4FV(0, v);
629    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
630       ATTR4FV(VBO_ATTRIB_GENERIC0 + index, v);
631    else
632       ERROR(GL_INVALID_VALUE);
633 }
634 
635 
636 
637 /* Integer-valued generic attributes.
638  * XXX: the integers just get converted to floats at this time
639  */
640 static void GLAPIENTRY
TAG(VertexAttribI1i)641 TAG(VertexAttribI1i)(GLuint index, GLint x)
642 {
643    GET_CURRENT_CONTEXT(ctx);
644    if (is_vertex_position(ctx, index))
645       ATTR1I(0, x);
646    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
647       ATTR1I(VBO_ATTRIB_GENERIC0 + index, x);
648    else
649       ERROR(GL_INVALID_VALUE);
650 }
651 
652 static void GLAPIENTRY
TAG(VertexAttribI2i)653 TAG(VertexAttribI2i)(GLuint index, GLint x, GLint y)
654 {
655    GET_CURRENT_CONTEXT(ctx);
656    if (is_vertex_position(ctx, index))
657       ATTR2I(0, x, y);
658    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
659       ATTR2I(VBO_ATTRIB_GENERIC0 + index, x, y);
660    else
661       ERROR(GL_INVALID_VALUE);
662 }
663 
664 static void GLAPIENTRY
TAG(VertexAttribI3i)665 TAG(VertexAttribI3i)(GLuint index, GLint x, GLint y, GLint z)
666 {
667    GET_CURRENT_CONTEXT(ctx);
668    if (is_vertex_position(ctx, index))
669       ATTR3I(0, x, y, z);
670    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
671       ATTR3I(VBO_ATTRIB_GENERIC0 + index, x, y, z);
672    else
673       ERROR(GL_INVALID_VALUE);
674 }
675 
676 static void GLAPIENTRY
TAG(VertexAttribI4i)677 TAG(VertexAttribI4i)(GLuint index, GLint x, GLint y, GLint z, GLint w)
678 {
679    GET_CURRENT_CONTEXT(ctx);
680    if (is_vertex_position(ctx, index))
681       ATTR4I(0, x, y, z, w);
682    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
683       ATTR4I(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
684    else
685       ERROR(GL_INVALID_VALUE);
686 }
687 
688 static void GLAPIENTRY
TAG(VertexAttribI2iv)689 TAG(VertexAttribI2iv)(GLuint index, const GLint *v)
690 {
691    GET_CURRENT_CONTEXT(ctx);
692    if (is_vertex_position(ctx, index))
693       ATTR2IV(0, v);
694    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
695       ATTR2IV(VBO_ATTRIB_GENERIC0 + index, v);
696    else
697       ERROR(GL_INVALID_VALUE);
698 }
699 
700 static void GLAPIENTRY
TAG(VertexAttribI3iv)701 TAG(VertexAttribI3iv)(GLuint index, const GLint *v)
702 {
703    GET_CURRENT_CONTEXT(ctx);
704    if (is_vertex_position(ctx, index))
705       ATTR3IV(0, v);
706    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
707       ATTR3IV(VBO_ATTRIB_GENERIC0 + index, v);
708    else
709       ERROR(GL_INVALID_VALUE);
710 }
711 
712 static void GLAPIENTRY
TAG(VertexAttribI4iv)713 TAG(VertexAttribI4iv)(GLuint index, const GLint *v)
714 {
715    GET_CURRENT_CONTEXT(ctx);
716    if (is_vertex_position(ctx, index))
717       ATTR4IV(0, v);
718    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
719       ATTR4IV(VBO_ATTRIB_GENERIC0 + index, v);
720    else
721       ERROR(GL_INVALID_VALUE);
722 }
723 
724 
725 
726 /* Unsigned integer-valued generic attributes.
727  * XXX: the integers just get converted to floats at this time
728  */
729 static void GLAPIENTRY
TAG(VertexAttribI1ui)730 TAG(VertexAttribI1ui)(GLuint index, GLuint x)
731 {
732    GET_CURRENT_CONTEXT(ctx);
733    if (is_vertex_position(ctx, index))
734       ATTR1UI(0, x);
735    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
736       ATTR1UI(VBO_ATTRIB_GENERIC0 + index, x);
737    else
738       ERROR(GL_INVALID_VALUE);
739 }
740 
741 static void GLAPIENTRY
TAG(VertexAttribI2ui)742 TAG(VertexAttribI2ui)(GLuint index, GLuint x, GLuint y)
743 {
744    GET_CURRENT_CONTEXT(ctx);
745    if (is_vertex_position(ctx, index))
746       ATTR2UI(0, x, y);
747    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
748       ATTR2UI(VBO_ATTRIB_GENERIC0 + index, x, y);
749    else
750       ERROR(GL_INVALID_VALUE);
751 }
752 
753 static void GLAPIENTRY
TAG(VertexAttribI3ui)754 TAG(VertexAttribI3ui)(GLuint index, GLuint x, GLuint y, GLuint z)
755 {
756    GET_CURRENT_CONTEXT(ctx);
757    if (is_vertex_position(ctx, index))
758       ATTR3UI(0, x, y, z);
759    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
760       ATTR3UI(VBO_ATTRIB_GENERIC0 + index, x, y, z);
761    else
762       ERROR(GL_INVALID_VALUE);
763 }
764 
765 static void GLAPIENTRY
TAG(VertexAttribI4ui)766 TAG(VertexAttribI4ui)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
767 {
768    GET_CURRENT_CONTEXT(ctx);
769    if (is_vertex_position(ctx, index))
770       ATTR4UI(0, x, y, z, w);
771    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
772       ATTR4UI(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
773    else
774       ERROR(GL_INVALID_VALUE);
775 }
776 
777 static void GLAPIENTRY
TAG(VertexAttribI2uiv)778 TAG(VertexAttribI2uiv)(GLuint index, const GLuint *v)
779 {
780    GET_CURRENT_CONTEXT(ctx);
781    if (is_vertex_position(ctx, index))
782       ATTR2UIV(0, v);
783    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
784       ATTR2UIV(VBO_ATTRIB_GENERIC0 + index, v);
785    else
786       ERROR(GL_INVALID_VALUE);
787 }
788 
789 static void GLAPIENTRY
TAG(VertexAttribI3uiv)790 TAG(VertexAttribI3uiv)(GLuint index, const GLuint *v)
791 {
792    GET_CURRENT_CONTEXT(ctx);
793    if (is_vertex_position(ctx, index))
794       ATTR3UIV(0, v);
795    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
796       ATTR3UIV(VBO_ATTRIB_GENERIC0 + index, v);
797    else
798       ERROR(GL_INVALID_VALUE);
799 }
800 
801 static void GLAPIENTRY
TAG(VertexAttribI4uiv)802 TAG(VertexAttribI4uiv)(GLuint index, const GLuint *v)
803 {
804    GET_CURRENT_CONTEXT(ctx);
805    if (is_vertex_position(ctx, index))
806       ATTR4UIV(0, v);
807    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
808       ATTR4UIV(VBO_ATTRIB_GENERIC0 + index, v);
809    else
810       ERROR(GL_INVALID_VALUE);
811 }
812 
813 
814 
815 /* These entrypoints are no longer used for NV_vertex_program but they are
816  * used by the display list and other code specifically because of their
817  * property of aliasing with the legacy Vertex, TexCoord, Normal, etc
818  * attributes.  (See vbo_save_loopback.c)
819  */
820 static void GLAPIENTRY
TAG(VertexAttrib1fNV)821 TAG(VertexAttrib1fNV)(GLuint index, GLfloat x)
822 {
823    GET_CURRENT_CONTEXT(ctx);
824    if (index < VBO_ATTRIB_MAX)
825       ATTR1F(index, x);
826 }
827 
828 static void GLAPIENTRY
TAG(VertexAttrib1fvNV)829 TAG(VertexAttrib1fvNV)(GLuint index, const GLfloat * v)
830 {
831    GET_CURRENT_CONTEXT(ctx);
832    if (index < VBO_ATTRIB_MAX)
833       ATTR1FV(index, v);
834 }
835 
836 static void GLAPIENTRY
TAG(VertexAttrib2fNV)837 TAG(VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y)
838 {
839    GET_CURRENT_CONTEXT(ctx);
840    if (index < VBO_ATTRIB_MAX)
841       ATTR2F(index, x, y);
842 }
843 
844 static void GLAPIENTRY
TAG(VertexAttrib2fvNV)845 TAG(VertexAttrib2fvNV)(GLuint index, const GLfloat * v)
846 {
847    GET_CURRENT_CONTEXT(ctx);
848    if (index < VBO_ATTRIB_MAX)
849       ATTR2FV(index, v);
850 }
851 
852 static void GLAPIENTRY
TAG(VertexAttrib3fNV)853 TAG(VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z)
854 {
855    GET_CURRENT_CONTEXT(ctx);
856    if (index < VBO_ATTRIB_MAX)
857       ATTR3F(index, x, y, z);
858 }
859 
860 static void GLAPIENTRY
TAG(VertexAttrib3fvNV)861 TAG(VertexAttrib3fvNV)(GLuint index,
862  const GLfloat * v)
863 {
864    GET_CURRENT_CONTEXT(ctx);
865    if (index < VBO_ATTRIB_MAX)
866       ATTR3FV(index, v);
867 }
868 
869 static void GLAPIENTRY
TAG(VertexAttrib4fNV)870 TAG(VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
871 {
872    GET_CURRENT_CONTEXT(ctx);
873    if (index < VBO_ATTRIB_MAX)
874       ATTR4F(index, x, y, z, w);
875 }
876 
877 static void GLAPIENTRY
TAG(VertexAttrib4fvNV)878 TAG(VertexAttrib4fvNV)(GLuint index, const GLfloat * v)
879 {
880    GET_CURRENT_CONTEXT(ctx);
881    if (index < VBO_ATTRIB_MAX)
882       ATTR4FV(index, v);
883 }
884 
885 
886 #define ERROR_IF_NOT_PACKED_TYPE(ctx, type, func) \
887    if (type != GL_INT_2_10_10_10_REV && type != GL_UNSIGNED_INT_2_10_10_10_REV) { \
888       _mesa_error(ctx, GL_INVALID_ENUM, "%s(type)", func); \
889       return; \
890    }
891 
892 /* Extended version of ERROR_IF_NOT_PACKED_TYPE which also
893  * accepts GL_UNSIGNED_INT_10F_11F_11F_REV.
894  *
895  * Only used for VertexAttribP[123]ui[v]; VertexAttribP4* cannot use this type,
896  * and neither can legacy vertex attribs.
897  */
898 #define ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, func) \
899    if (type != GL_INT_2_10_10_10_REV && type != GL_UNSIGNED_INT_2_10_10_10_REV && \
900        type != GL_UNSIGNED_INT_10F_11F_11F_REV) { \
901       _mesa_error(ctx, GL_INVALID_ENUM, "%s(type)", func); \
902       return; \
903    }
904 
905 static void GLAPIENTRY
TAG(VertexP2ui)906 TAG(VertexP2ui)(GLenum type, GLuint value)
907 {
908    GET_CURRENT_CONTEXT(ctx);
909    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP2ui");
910    ATTR_UI(ctx, 2, type, 0, VBO_ATTRIB_POS, value);
911 }
912 
913 static void GLAPIENTRY
TAG(VertexP2uiv)914 TAG(VertexP2uiv)(GLenum type, const GLuint *value)
915 {
916    GET_CURRENT_CONTEXT(ctx);
917    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP2uiv");
918    ATTR_UI(ctx, 2, type, 0, VBO_ATTRIB_POS, value[0]);
919 }
920 
921 static void GLAPIENTRY
TAG(VertexP3ui)922 TAG(VertexP3ui)(GLenum type, GLuint value)
923 {
924    GET_CURRENT_CONTEXT(ctx);
925    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP3ui");
926    ATTR_UI(ctx, 3, type, 0, VBO_ATTRIB_POS, value);
927 }
928 
929 static void GLAPIENTRY
TAG(VertexP3uiv)930 TAG(VertexP3uiv)(GLenum type, const GLuint *value)
931 {
932    GET_CURRENT_CONTEXT(ctx);
933    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP3uiv");
934    ATTR_UI(ctx, 3, type, 0, VBO_ATTRIB_POS, value[0]);
935 }
936 
937 static void GLAPIENTRY
TAG(VertexP4ui)938 TAG(VertexP4ui)(GLenum type, GLuint value)
939 {
940    GET_CURRENT_CONTEXT(ctx);
941    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP4ui");
942    ATTR_UI(ctx, 4, type, 0, VBO_ATTRIB_POS, value);
943 }
944 
945 static void GLAPIENTRY
TAG(VertexP4uiv)946 TAG(VertexP4uiv)(GLenum type, const GLuint *value)
947 {
948    GET_CURRENT_CONTEXT(ctx);
949    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP4uiv");
950    ATTR_UI(ctx, 4, type, 0, VBO_ATTRIB_POS, value[0]);
951 }
952 
953 static void GLAPIENTRY
TAG(TexCoordP1ui)954 TAG(TexCoordP1ui)(GLenum type, GLuint coords)
955 {
956    GET_CURRENT_CONTEXT(ctx);
957    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP1ui");
958    ATTR_UI(ctx, 1, type, 0, VBO_ATTRIB_TEX0, coords);
959 }
960 
961 static void GLAPIENTRY
TAG(TexCoordP1uiv)962 TAG(TexCoordP1uiv)(GLenum type, const GLuint *coords)
963 {
964    GET_CURRENT_CONTEXT(ctx);
965    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP1uiv");
966    ATTR_UI(ctx, 1, type, 0, VBO_ATTRIB_TEX0, coords[0]);
967 }
968 
969 static void GLAPIENTRY
TAG(TexCoordP2ui)970 TAG(TexCoordP2ui)(GLenum type, GLuint coords)
971 {
972    GET_CURRENT_CONTEXT(ctx);
973    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP2ui");
974    ATTR_UI(ctx, 2, type, 0, VBO_ATTRIB_TEX0, coords);
975 }
976 
977 static void GLAPIENTRY
TAG(TexCoordP2uiv)978 TAG(TexCoordP2uiv)(GLenum type, const GLuint *coords)
979 {
980    GET_CURRENT_CONTEXT(ctx);
981    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP2uiv");
982    ATTR_UI(ctx, 2, type, 0, VBO_ATTRIB_TEX0, coords[0]);
983 }
984 
985 static void GLAPIENTRY
TAG(TexCoordP3ui)986 TAG(TexCoordP3ui)(GLenum type, GLuint coords)
987 {
988    GET_CURRENT_CONTEXT(ctx);
989    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP3ui");
990    ATTR_UI(ctx, 3, type, 0, VBO_ATTRIB_TEX0, coords);
991 }
992 
993 static void GLAPIENTRY
TAG(TexCoordP3uiv)994 TAG(TexCoordP3uiv)(GLenum type, const GLuint *coords)
995 {
996    GET_CURRENT_CONTEXT(ctx);
997    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP3uiv");
998    ATTR_UI(ctx, 3, type, 0, VBO_ATTRIB_TEX0, coords[0]);
999 }
1000 
1001 static void GLAPIENTRY
TAG(TexCoordP4ui)1002 TAG(TexCoordP4ui)(GLenum type, GLuint coords)
1003 {
1004    GET_CURRENT_CONTEXT(ctx);
1005    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP4ui");
1006    ATTR_UI(ctx, 4, type, 0, VBO_ATTRIB_TEX0, coords);
1007 }
1008 
1009 static void GLAPIENTRY
TAG(TexCoordP4uiv)1010 TAG(TexCoordP4uiv)(GLenum type, const GLuint *coords)
1011 {
1012    GET_CURRENT_CONTEXT(ctx);
1013    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP4uiv");
1014    ATTR_UI(ctx, 4, type, 0, VBO_ATTRIB_TEX0, coords[0]);
1015 }
1016 
1017 static void GLAPIENTRY
TAG(MultiTexCoordP1ui)1018 TAG(MultiTexCoordP1ui)(GLenum target, GLenum type, GLuint coords)
1019 {
1020    GET_CURRENT_CONTEXT(ctx);
1021    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1022    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP1ui");
1023    ATTR_UI(ctx, 1, type, 0, attr, coords);
1024 }
1025 
1026 static void GLAPIENTRY
TAG(MultiTexCoordP1uiv)1027 TAG(MultiTexCoordP1uiv)(GLenum target, GLenum type, const GLuint *coords)
1028 {
1029    GET_CURRENT_CONTEXT(ctx);
1030    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1031    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP1uiv");
1032    ATTR_UI(ctx, 1, type, 0, attr, coords[0]);
1033 }
1034 
1035 static void GLAPIENTRY
TAG(MultiTexCoordP2ui)1036 TAG(MultiTexCoordP2ui)(GLenum target, GLenum type, GLuint coords)
1037 {
1038    GET_CURRENT_CONTEXT(ctx);
1039    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1040    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP2ui");
1041    ATTR_UI(ctx, 2, type, 0, attr, coords);
1042 }
1043 
1044 static void GLAPIENTRY
TAG(MultiTexCoordP2uiv)1045 TAG(MultiTexCoordP2uiv)(GLenum target, GLenum type, const GLuint *coords)
1046 {
1047    GET_CURRENT_CONTEXT(ctx);
1048    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1049    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP2uiv");
1050    ATTR_UI(ctx, 2, type, 0, attr, coords[0]);
1051 }
1052 
1053 static void GLAPIENTRY
TAG(MultiTexCoordP3ui)1054 TAG(MultiTexCoordP3ui)(GLenum target, GLenum type, GLuint coords)
1055 {
1056    GET_CURRENT_CONTEXT(ctx);
1057    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1058    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP3ui");
1059    ATTR_UI(ctx, 3, type, 0, attr, coords);
1060 }
1061 
1062 static void GLAPIENTRY
TAG(MultiTexCoordP3uiv)1063 TAG(MultiTexCoordP3uiv)(GLenum target, GLenum type, const GLuint *coords)
1064 {
1065    GET_CURRENT_CONTEXT(ctx);
1066    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1067    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP3uiv");
1068    ATTR_UI(ctx, 3, type, 0, attr, coords[0]);
1069 }
1070 
1071 static void GLAPIENTRY
TAG(MultiTexCoordP4ui)1072 TAG(MultiTexCoordP4ui)(GLenum target, GLenum type, GLuint coords)
1073 {
1074    GET_CURRENT_CONTEXT(ctx);
1075    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1076    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP4ui");
1077    ATTR_UI(ctx, 4, type, 0, attr, coords);
1078 }
1079 
1080 static void GLAPIENTRY
TAG(MultiTexCoordP4uiv)1081 TAG(MultiTexCoordP4uiv)(GLenum target, GLenum type, const GLuint *coords)
1082 {
1083    GET_CURRENT_CONTEXT(ctx);
1084    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1085    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP4uiv");
1086    ATTR_UI(ctx, 4, type, 0, attr, coords[0]);
1087 }
1088 
1089 static void GLAPIENTRY
TAG(NormalP3ui)1090 TAG(NormalP3ui)(GLenum type, GLuint coords)
1091 {
1092    GET_CURRENT_CONTEXT(ctx);
1093    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glNormalP3ui");
1094    ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_NORMAL, coords);
1095 }
1096 
1097 static void GLAPIENTRY
TAG(NormalP3uiv)1098 TAG(NormalP3uiv)(GLenum type, const GLuint *coords)
1099 {
1100    GET_CURRENT_CONTEXT(ctx);
1101    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glNormalP3uiv");
1102    ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_NORMAL, coords[0]);
1103 }
1104 
1105 static void GLAPIENTRY
TAG(ColorP3ui)1106 TAG(ColorP3ui)(GLenum type, GLuint color)
1107 {
1108    GET_CURRENT_CONTEXT(ctx);
1109    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP3ui");
1110    ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_COLOR0, color);
1111 }
1112 
1113 static void GLAPIENTRY
TAG(ColorP3uiv)1114 TAG(ColorP3uiv)(GLenum type, const GLuint *color)
1115 {
1116    GET_CURRENT_CONTEXT(ctx);
1117    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP3uiv");
1118    ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_COLOR0, color[0]);
1119 }
1120 
1121 static void GLAPIENTRY
TAG(ColorP4ui)1122 TAG(ColorP4ui)(GLenum type, GLuint color)
1123 {
1124    GET_CURRENT_CONTEXT(ctx);
1125    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP4ui");
1126    ATTR_UI(ctx, 4, type, 1, VBO_ATTRIB_COLOR0, color);
1127 }
1128 
1129 static void GLAPIENTRY
TAG(ColorP4uiv)1130 TAG(ColorP4uiv)(GLenum type, const GLuint *color)
1131 {
1132    GET_CURRENT_CONTEXT(ctx);
1133    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP4uiv");
1134    ATTR_UI(ctx, 4, type, 1, VBO_ATTRIB_COLOR0, color[0]);
1135 }
1136 
1137 static void GLAPIENTRY
TAG(SecondaryColorP3ui)1138 TAG(SecondaryColorP3ui)(GLenum type, GLuint color)
1139 {
1140    GET_CURRENT_CONTEXT(ctx);
1141    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glSecondaryColorP3ui");
1142    ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_COLOR1, color);
1143 }
1144 
1145 static void GLAPIENTRY
TAG(SecondaryColorP3uiv)1146 TAG(SecondaryColorP3uiv)(GLenum type, const GLuint *color)
1147 {
1148    GET_CURRENT_CONTEXT(ctx);
1149    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glSecondaryColorP3uiv");
1150    ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_COLOR1, color[0]);
1151 }
1152 
1153 static void GLAPIENTRY
TAG(VertexAttribP1ui)1154 TAG(VertexAttribP1ui)(GLuint index, GLenum type, GLboolean normalized,
1155 		      GLuint value)
1156 {
1157    GET_CURRENT_CONTEXT(ctx);
1158    ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP1ui");
1159    ATTR_UI_INDEX(ctx, 1, type, normalized, index, value);
1160 }
1161 
1162 static void GLAPIENTRY
TAG(VertexAttribP2ui)1163 TAG(VertexAttribP2ui)(GLuint index, GLenum type, GLboolean normalized,
1164 		      GLuint value)
1165 {
1166    GET_CURRENT_CONTEXT(ctx);
1167    ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP2ui");
1168    ATTR_UI_INDEX(ctx, 2, type, normalized, index, value);
1169 }
1170 
1171 static void GLAPIENTRY
TAG(VertexAttribP3ui)1172 TAG(VertexAttribP3ui)(GLuint index, GLenum type, GLboolean normalized,
1173 		      GLuint value)
1174 {
1175    GET_CURRENT_CONTEXT(ctx);
1176    ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP3ui");
1177    ATTR_UI_INDEX(ctx, 3, type, normalized, index, value);
1178 }
1179 
1180 static void GLAPIENTRY
TAG(VertexAttribP4ui)1181 TAG(VertexAttribP4ui)(GLuint index, GLenum type, GLboolean normalized,
1182 		      GLuint value)
1183 {
1184    GET_CURRENT_CONTEXT(ctx);
1185    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexAttribP4ui");
1186    ATTR_UI_INDEX(ctx, 4, type, normalized, index, value);
1187 }
1188 
1189 static void GLAPIENTRY
TAG(VertexAttribP1uiv)1190 TAG(VertexAttribP1uiv)(GLuint index, GLenum type, GLboolean normalized,
1191 		       const GLuint *value)
1192 {
1193    GET_CURRENT_CONTEXT(ctx);
1194    ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP1uiv");
1195    ATTR_UI_INDEX(ctx, 1, type, normalized, index, *value);
1196 }
1197 
1198 static void GLAPIENTRY
TAG(VertexAttribP2uiv)1199 TAG(VertexAttribP2uiv)(GLuint index, GLenum type, GLboolean normalized,
1200 		       const GLuint *value)
1201 {
1202    GET_CURRENT_CONTEXT(ctx);
1203    ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP2uiv");
1204    ATTR_UI_INDEX(ctx, 2, type, normalized, index, *value);
1205 }
1206 
1207 static void GLAPIENTRY
TAG(VertexAttribP3uiv)1208 TAG(VertexAttribP3uiv)(GLuint index, GLenum type, GLboolean normalized,
1209 		       const GLuint *value)
1210 {
1211    GET_CURRENT_CONTEXT(ctx);
1212    ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP3uiv");
1213    ATTR_UI_INDEX(ctx, 3, type, normalized, index, *value);
1214 }
1215 
1216 static void GLAPIENTRY
TAG(VertexAttribP4uiv)1217 TAG(VertexAttribP4uiv)(GLuint index, GLenum type, GLboolean normalized,
1218 		      const GLuint *value)
1219 {
1220    GET_CURRENT_CONTEXT(ctx);
1221    ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexAttribP4uiv");
1222    ATTR_UI_INDEX(ctx, 4, type, normalized, index, *value);
1223 }
1224 
1225 
1226 
1227 static void GLAPIENTRY
TAG(VertexAttribL1d)1228 TAG(VertexAttribL1d)(GLuint index, GLdouble x)
1229 {
1230    GET_CURRENT_CONTEXT(ctx);
1231    if (is_vertex_position(ctx, index))
1232       ATTR1D(0, x);
1233    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1234       ATTR1D(VBO_ATTRIB_GENERIC0 + index, x);
1235    else
1236       ERROR(GL_INVALID_VALUE);
1237 }
1238 
1239 static void GLAPIENTRY
TAG(VertexAttribL1dv)1240 TAG(VertexAttribL1dv)(GLuint index, const GLdouble * v)
1241 {
1242    GET_CURRENT_CONTEXT(ctx);
1243    if (is_vertex_position(ctx, index))
1244       ATTR1DV(0, v);
1245    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1246       ATTR1DV(VBO_ATTRIB_GENERIC0 + index, v);
1247    else
1248       ERROR(GL_INVALID_VALUE);
1249 }
1250 
1251 static void GLAPIENTRY
TAG(VertexAttribL2d)1252 TAG(VertexAttribL2d)(GLuint index, GLdouble x, GLdouble y)
1253 {
1254    GET_CURRENT_CONTEXT(ctx);
1255    if (is_vertex_position(ctx, index))
1256       ATTR2D(0, x, y);
1257    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1258       ATTR2D(VBO_ATTRIB_GENERIC0 + index, x, y);
1259    else
1260       ERROR(GL_INVALID_VALUE);
1261 }
1262 
1263 static void GLAPIENTRY
TAG(VertexAttribL2dv)1264 TAG(VertexAttribL2dv)(GLuint index, const GLdouble * v)
1265 {
1266    GET_CURRENT_CONTEXT(ctx);
1267    if (is_vertex_position(ctx, index))
1268       ATTR2DV(0, v);
1269    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1270       ATTR2DV(VBO_ATTRIB_GENERIC0 + index, v);
1271    else
1272       ERROR(GL_INVALID_VALUE);
1273 }
1274 
1275 static void GLAPIENTRY
TAG(VertexAttribL3d)1276 TAG(VertexAttribL3d)(GLuint index, GLdouble x, GLdouble y, GLdouble z)
1277 {
1278    GET_CURRENT_CONTEXT(ctx);
1279    if (is_vertex_position(ctx, index))
1280       ATTR3D(0, x, y, z);
1281    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1282       ATTR3D(VBO_ATTRIB_GENERIC0 + index, x, y, z);
1283    else
1284       ERROR(GL_INVALID_VALUE);
1285 }
1286 
1287 static void GLAPIENTRY
TAG(VertexAttribL3dv)1288 TAG(VertexAttribL3dv)(GLuint index, const GLdouble * v)
1289 {
1290    GET_CURRENT_CONTEXT(ctx);
1291    if (is_vertex_position(ctx, index))
1292       ATTR3DV(0, v);
1293    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1294       ATTR3DV(VBO_ATTRIB_GENERIC0 + index, v);
1295    else
1296       ERROR(GL_INVALID_VALUE);
1297 }
1298 
1299 static void GLAPIENTRY
TAG(VertexAttribL4d)1300 TAG(VertexAttribL4d)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
1301 {
1302    GET_CURRENT_CONTEXT(ctx);
1303    if (is_vertex_position(ctx, index))
1304       ATTR4D(0, x, y, z, w);
1305    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1306       ATTR4D(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
1307    else
1308       ERROR(GL_INVALID_VALUE);
1309 }
1310 
1311 static void GLAPIENTRY
TAG(VertexAttribL4dv)1312 TAG(VertexAttribL4dv)(GLuint index, const GLdouble * v)
1313 {
1314    GET_CURRENT_CONTEXT(ctx);
1315    if (is_vertex_position(ctx, index))
1316       ATTR4DV(0, v);
1317    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1318       ATTR4DV(VBO_ATTRIB_GENERIC0 + index, v);
1319    else
1320       ERROR(GL_INVALID_VALUE);
1321 }
1322 
1323 static void GLAPIENTRY
TAG(VertexAttribL1ui64ARB)1324 TAG(VertexAttribL1ui64ARB)(GLuint index, GLuint64EXT x)
1325 {
1326    GET_CURRENT_CONTEXT(ctx);
1327    if (is_vertex_position(ctx, index))
1328       ATTR1UI64(0, x);
1329    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1330       ATTR1UI64(VBO_ATTRIB_GENERIC0 + index, x);
1331    else
1332       ERROR(GL_INVALID_VALUE);
1333 }
1334 
1335 static void GLAPIENTRY
TAG(VertexAttribL1ui64vARB)1336 TAG(VertexAttribL1ui64vARB)(GLuint index, const GLuint64EXT *v)
1337 {
1338    GET_CURRENT_CONTEXT(ctx);
1339    if (is_vertex_position(ctx, index))
1340       ATTR1UIV64(0, v);
1341    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1342       ATTR1UIV64(VBO_ATTRIB_GENERIC0 + index, v);
1343    else
1344       ERROR(GL_INVALID_VALUE);
1345 }
1346 
1347 #undef ATTR1FV
1348 #undef ATTR2FV
1349 #undef ATTR3FV
1350 #undef ATTR4FV
1351 
1352 #undef ATTR1F
1353 #undef ATTR2F
1354 #undef ATTR3F
1355 #undef ATTR4F
1356 
1357 #undef ATTR_UI
1358 
1359 #undef MAT
1360