1/**************************************************************************
2
3Copyright 2002 VMware, Inc.
4Copyright 2011 Dave Airlie (ARB_vertex_type_2_10_10_10_rev support)
5All Rights Reserved.
6
7Permission is hereby granted, free of charge, to any person obtaining a
8copy of this software and associated documentation files (the "Software"),
9to deal in the Software without restriction, including without limitation
10on the rights to use, copy, modify, merge, publish, distribute, sub
11license, and/or sell copies of the Software, and to permit persons to whom
12the Software is furnished to do so, subject to the following conditions:
13
14The above copyright notice and this permission notice (including the next
15paragraph) shall be included in all copies or substantial portions of the
16Software.
17
18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24USE OR OTHER DEALINGS IN THE SOFTWARE.
25
26**************************************************************************/
27
28#include "util/format_r11g11b10f.h"
29#include "main/varray.h"
30#include "vbo_util.h"
31#include "util/half_float.h"
32
33#ifdef SUPPRESS_STATIC
34#define static
35#endif
36
37/* ATTR */
38#define ATTRI( A, N, V0, V1, V2, V3 ) \
39    ATTR_UNION(A, N, GL_INT, uint32_t, INT_AS_UINT(V0), INT_AS_UINT(V1), \
40        INT_AS_UINT(V2), INT_AS_UINT(V3))
41#define ATTRUI( A, N, V0, V1, V2, V3 ) \
42    ATTR_UNION(A, N, GL_UNSIGNED_INT, uint32_t, (uint32_t)(V0), (uint32_t)(V1), \
43        (uint32_t)(V2), (uint32_t)(V3))
44#define ATTRF( A, N, V0, V1, V2, V3 ) \
45    ATTR_UNION(A, N, GL_FLOAT, uint32_t, FLOAT_AS_UINT(V0), FLOAT_AS_UINT(V1),\
46        FLOAT_AS_UINT(V2), FLOAT_AS_UINT(V3))
47#define ATTRD( A, N, V0, V1, V2, V3 ) \
48    ATTR_UNION(A, N, GL_DOUBLE, uint64_t, DOUBLE_AS_UINT64(V0), \
49        DOUBLE_AS_UINT64(V1), DOUBLE_AS_UINT64(V2), DOUBLE_AS_UINT64(V3))
50#define ATTRUI64( A, N, V0, V1, V2, V3 ) \
51    ATTR_UNION(A, N, GL_UNSIGNED_INT64_ARB, uint64_t, V0, V1, V2, V3)
52
53
54/* float */
55#define ATTR1FV( A, V ) ATTRF( A, 1, (V)[0], 0, 0, 1 )
56#define ATTR2FV( A, V ) ATTRF( A, 2, (V)[0], (V)[1], 0, 1 )
57#define ATTR3FV( A, V ) ATTRF( A, 3, (V)[0], (V)[1], (V)[2], 1 )
58#define ATTR4FV( A, V ) ATTRF( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
59
60#define ATTR1F( A, X )          ATTRF( A, 1, X, 0, 0, 1 )
61#define ATTR2F( A, X, Y )       ATTRF( A, 2, X, Y, 0, 1 )
62#define ATTR3F( A, X, Y, Z )    ATTRF( A, 3, X, Y, Z, 1 )
63#define ATTR4F( A, X, Y, Z, W ) ATTRF( A, 4, X, Y, Z, W )
64
65
66/* half */
67#define ATTR1HV( A, V ) ATTRF( A, 1, _mesa_half_to_float((uint16_t)(V)[0]), \
68                               0, 0, 1 )
69#define ATTR2HV( A, V ) ATTRF( A, 2, _mesa_half_to_float((uint16_t)(V)[0]), \
70                               _mesa_half_to_float((uint16_t)(V)[1]), 0, 1 )
71#define ATTR3HV( A, V ) ATTRF( A, 3, _mesa_half_to_float((uint16_t)(V)[0]), \
72                               _mesa_half_to_float((uint16_t)(V)[1]), \
73                               _mesa_half_to_float((uint16_t)(V)[2]), 1 )
74#define ATTR4HV( A, V ) ATTRF( A, 4, _mesa_half_to_float((uint16_t)(V)[0]), \
75                               _mesa_half_to_float((uint16_t)(V)[1]), \
76                               _mesa_half_to_float((uint16_t)(V)[2]), \
77                               _mesa_half_to_float((uint16_t)(V)[3]) )
78
79#define ATTR1H( A, X )          ATTRF( A, 1, _mesa_half_to_float(X), 0, 0, 1 )
80#define ATTR2H( A, X, Y )       ATTRF( A, 2, _mesa_half_to_float(X), \
81                                       _mesa_half_to_float(Y), 0, 1 )
82#define ATTR3H( A, X, Y, Z )    ATTRF( A, 3, _mesa_half_to_float(X), \
83                                       _mesa_half_to_float(Y), \
84                                       _mesa_half_to_float(Z), 1 )
85#define ATTR4H( A, X, Y, Z, W ) ATTRF( A, 4, _mesa_half_to_float(X), \
86                                       _mesa_half_to_float(Y), \
87                                       _mesa_half_to_float(Z), \
88                                       _mesa_half_to_float(W) )
89
90
91/* int */
92#define ATTR2IV( A, V ) ATTRI( A, 2, (V)[0], (V)[1], 0, 1 )
93#define ATTR3IV( A, V ) ATTRI( A, 3, (V)[0], (V)[1], (V)[2], 1 )
94#define ATTR4IV( A, V ) ATTRI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
95
96#define ATTR1I( A, X )          ATTRI( A, 1, X, 0, 0, 1 )
97#define ATTR2I( A, X, Y )       ATTRI( A, 2, X, Y, 0, 1 )
98#define ATTR3I( A, X, Y, Z )    ATTRI( A, 3, X, Y, Z, 1 )
99#define ATTR4I( A, X, Y, Z, W ) ATTRI( A, 4, X, Y, Z, W )
100
101
102/* uint */
103#define ATTR2UIV( A, V ) ATTRUI( A, 2, (V)[0], (V)[1], 0, 1 )
104#define ATTR3UIV( A, V ) ATTRUI( A, 3, (V)[0], (V)[1], (V)[2], 1 )
105#define ATTR4UIV( A, V ) ATTRUI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
106
107#define ATTR1UI( A, X )          ATTRUI( A, 1, X, 0, 0, 1 )
108#define ATTR2UI( A, X, Y )       ATTRUI( A, 2, X, Y, 0, 1 )
109#define ATTR3UI( A, X, Y, Z )    ATTRUI( A, 3, X, Y, Z, 1 )
110#define ATTR4UI( A, X, Y, Z, W ) ATTRUI( A, 4, X, Y, Z, W )
111
112#define MAT_ATTR( A, N, V ) ATTRF( A, N, (V)[0], (V)[1], (V)[2], (V)[3] )
113
114#define ATTRUI10_1( A, UI ) ATTRF( A, 1, (UI) & 0x3ff, 0, 0, 1 )
115#define ATTRUI10_2( A, UI ) ATTRF( A, 2, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, 0, 1 )
116#define ATTRUI10_3( A, UI ) ATTRF( A, 3, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, 1 )
117#define ATTRUI10_4( A, UI ) ATTRF( A, 4, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, ((UI) >> 30) & 0x3 )
118
119#define ATTRUI10N_1( A, UI ) ATTRF( A, 1, conv_ui10_to_norm_float((UI) & 0x3ff), 0, 0, 1 )
120#define ATTRUI10N_2( A, UI ) ATTRF( A, 2, \
121				   conv_ui10_to_norm_float((UI) & 0x3ff), \
122				   conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), 0, 1 )
123#define ATTRUI10N_3( A, UI ) ATTRF( A, 3, \
124				   conv_ui10_to_norm_float((UI) & 0x3ff), \
125				   conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
126				   conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), 1 )
127#define ATTRUI10N_4( A, UI ) ATTRF( A, 4, \
128				   conv_ui10_to_norm_float((UI) & 0x3ff), \
129				   conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
130				   conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), \
131				   conv_ui2_to_norm_float(((UI) >> 30) & 0x3) )
132
133#define ATTRI10_1( A, I10 ) ATTRF( A, 1, conv_i10_to_i((I10) & 0x3ff), 0, 0, 1 )
134#define ATTRI10_2( A, I10 ) ATTRF( A, 2, \
135				conv_i10_to_i((I10) & 0x3ff),		\
136				conv_i10_to_i(((I10) >> 10) & 0x3ff), 0, 1 )
137#define ATTRI10_3( A, I10 ) ATTRF( A, 3, \
138				conv_i10_to_i((I10) & 0x3ff),	    \
139				conv_i10_to_i(((I10) >> 10) & 0x3ff), \
140				conv_i10_to_i(((I10) >> 20) & 0x3ff), 1 )
141#define ATTRI10_4( A, I10 ) ATTRF( A, 4, \
142				conv_i10_to_i((I10) & 0x3ff),		\
143				conv_i10_to_i(((I10) >> 10) & 0x3ff), \
144				conv_i10_to_i(((I10) >> 20) & 0x3ff), \
145				conv_i2_to_i(((I10) >> 30) & 0x3))
146
147
148#define ATTRI10N_1(ctx, A, I10) ATTRF(A, 1, conv_i10_to_norm_float(ctx, (I10) & 0x3ff), 0, 0, 1 )
149#define ATTRI10N_2(ctx, A, I10) ATTRF(A, 2, \
150				conv_i10_to_norm_float(ctx, (I10) & 0x3ff),		\
151				conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), 0, 1 )
152#define ATTRI10N_3(ctx, A, I10) ATTRF(A, 3, \
153				conv_i10_to_norm_float(ctx, (I10) & 0x3ff),	    \
154				conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \
155				conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff), 1 )
156#define ATTRI10N_4(ctx, A, I10) ATTRF(A, 4, \
157				conv_i10_to_norm_float(ctx, (I10) & 0x3ff),		\
158				conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \
159				conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff), \
160				conv_i2_to_norm_float(ctx, ((I10) >> 30) & 0x3))
161
162#define ATTR_UI(ctx, val, type, normalized, attr, arg) do {	\
163   if ((type) == GL_UNSIGNED_INT_2_10_10_10_REV) {		\
164      if (normalized) {						\
165	 ATTRUI10N_##val((attr), (arg));			\
166      } else {							\
167	 ATTRUI10_##val((attr), (arg));				\
168      }								\
169   } else if ((type) == GL_INT_2_10_10_10_REV) {		\
170      if (normalized) {						\
171	 ATTRI10N_##val(ctx, (attr), (arg));			\
172      } else {							\
173	 ATTRI10_##val((attr), (arg));				\
174      }								\
175   } else if ((type) == GL_UNSIGNED_INT_10F_11F_11F_REV) {	\
176      float res[4];						\
177      res[3] = 1;                                               \
178      r11g11b10f_to_float3((arg), res);				\
179      ATTR##val##FV((attr), res);				\
180   } else							\
181      ERROR(GL_INVALID_VALUE);					\
182   } while(0)
183
184#define ATTR_UI_INDEX(ctx, val, type, normalized, index, arg) do {	\
185      if ((index) == 0 && _mesa_attr_zero_aliases_vertex(ctx)) {	\
186	 ATTR_UI(ctx, val, (type), normalized, 0, (arg));		\
187      } else if ((index) < MAX_VERTEX_GENERIC_ATTRIBS) {		\
188	 ATTR_UI(ctx, val, (type), normalized, VBO_ATTRIB_GENERIC0 + (index), (arg)); \
189      } else								\
190	 ERROR(GL_INVALID_VALUE);					\
191   } while(0)
192
193
194/* Doubles */
195#define ATTR1DV( A, V ) ATTRD( A, 1, (V)[0], 0, 0, 1 )
196#define ATTR2DV( A, V ) ATTRD( A, 2, (V)[0], (V)[1], 0, 1 )
197#define ATTR3DV( A, V ) ATTRD( A, 3, (V)[0], (V)[1], (V)[2], 1 )
198#define ATTR4DV( A, V ) ATTRD( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
199
200#define ATTR1D( A, X )          ATTRD( A, 1, X, 0, 0, 1 )
201#define ATTR2D( A, X, Y )       ATTRD( A, 2, X, Y, 0, 1 )
202#define ATTR3D( A, X, Y, Z )    ATTRD( A, 3, X, Y, Z, 1 )
203#define ATTR4D( A, X, Y, Z, W ) ATTRD( A, 4, X, Y, Z, W )
204
205#define ATTR1UIV64( A, V ) ATTRUI64( A, 1, (V)[0], 0, 0, 0 )
206#define ATTR1UI64( A, X )  ATTRUI64( A, 1, X, 0, 0, 0 )
207
208
209static void GLAPIENTRY
210TAG(Vertex2f)(GLfloat x, GLfloat y)
211{
212   GET_CURRENT_CONTEXT(ctx);
213   ATTR2F(VBO_ATTRIB_POS, x, y);
214}
215
216static void GLAPIENTRY
217TAG(Vertex2fv)(const GLfloat * v)
218{
219   GET_CURRENT_CONTEXT(ctx);
220   ATTR2FV(VBO_ATTRIB_POS, v);
221}
222
223static void GLAPIENTRY
224TAG(Vertex3f)(GLfloat x, GLfloat y, GLfloat z)
225{
226   GET_CURRENT_CONTEXT(ctx);
227   ATTR3F(VBO_ATTRIB_POS, x, y, z);
228}
229
230static void GLAPIENTRY
231TAG(Vertex3fv)(const GLfloat * v)
232{
233   GET_CURRENT_CONTEXT(ctx);
234   ATTR3FV(VBO_ATTRIB_POS, v);
235}
236
237static void GLAPIENTRY
238TAG(Vertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
239{
240   GET_CURRENT_CONTEXT(ctx);
241   ATTR4F(VBO_ATTRIB_POS, x, y, z, w);
242}
243
244static void GLAPIENTRY
245TAG(Vertex4fv)(const GLfloat * v)
246{
247   GET_CURRENT_CONTEXT(ctx);
248   ATTR4FV(VBO_ATTRIB_POS, v);
249}
250
251static void GLAPIENTRY
252TAG(VertexAttrib1fARB)(GLuint index, GLfloat x)
253{
254   GET_CURRENT_CONTEXT(ctx);
255   if (is_vertex_position(ctx, index))
256      ATTR1F(0, x);
257   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
258      ATTR1F(VBO_ATTRIB_GENERIC0 + index, x);
259   else
260      ERROR(GL_INVALID_VALUE);
261}
262
263static void GLAPIENTRY
264TAG(VertexAttrib1fvARB)(GLuint index, const GLfloat * v)
265{
266   GET_CURRENT_CONTEXT(ctx);
267   if (is_vertex_position(ctx, index))
268      ATTR1FV(0, v);
269   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
270      ATTR1FV(VBO_ATTRIB_GENERIC0 + index, v);
271   else
272      ERROR(GL_INVALID_VALUE);
273}
274
275static void GLAPIENTRY
276TAG(VertexAttrib2fARB)(GLuint index, GLfloat x, GLfloat y)
277{
278   GET_CURRENT_CONTEXT(ctx);
279   if (is_vertex_position(ctx, index))
280      ATTR2F(0, x, y);
281   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
282      ATTR2F(VBO_ATTRIB_GENERIC0 + index, x, y);
283   else
284      ERROR(GL_INVALID_VALUE);
285}
286
287static void GLAPIENTRY
288TAG(VertexAttrib2fvARB)(GLuint index, const GLfloat * v)
289{
290   GET_CURRENT_CONTEXT(ctx);
291   if (is_vertex_position(ctx, index))
292      ATTR2FV(0, v);
293   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
294      ATTR2FV(VBO_ATTRIB_GENERIC0 + index, v);
295   else
296      ERROR(GL_INVALID_VALUE);
297}
298
299static void GLAPIENTRY
300TAG(VertexAttrib3fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z)
301{
302   GET_CURRENT_CONTEXT(ctx);
303   if (is_vertex_position(ctx, index))
304      ATTR3F(0, x, y, z);
305   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
306      ATTR3F(VBO_ATTRIB_GENERIC0 + index, x, y, z);
307   else
308      ERROR(GL_INVALID_VALUE);
309}
310
311static void GLAPIENTRY
312TAG(VertexAttrib3fvARB)(GLuint index, const GLfloat * v)
313{
314   GET_CURRENT_CONTEXT(ctx);
315   if (is_vertex_position(ctx, index))
316      ATTR3FV(0, v);
317   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
318      ATTR3FV(VBO_ATTRIB_GENERIC0 + index, v);
319   else
320      ERROR(GL_INVALID_VALUE);
321}
322
323static void GLAPIENTRY
324TAG(VertexAttrib4fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
325{
326   GET_CURRENT_CONTEXT(ctx);
327   if (is_vertex_position(ctx, index))
328      ATTR4F(0, x, y, z, w);
329   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
330      ATTR4F(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
331   else
332      ERROR(GL_INVALID_VALUE);
333}
334
335static void GLAPIENTRY
336TAG(VertexAttrib4fvARB)(GLuint index, const GLfloat * v)
337{
338   GET_CURRENT_CONTEXT(ctx);
339   if (is_vertex_position(ctx, index))
340      ATTR4FV(0, v);
341   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
342      ATTR4FV(VBO_ATTRIB_GENERIC0 + index, v);
343   else
344      ERROR(GL_INVALID_VALUE);
345}
346
347
348
349/* Integer-valued generic attributes.
350 * XXX: the integers just get converted to floats at this time
351 */
352static void GLAPIENTRY
353TAG(VertexAttribI1iEXT)(GLuint index, GLint x)
354{
355   GET_CURRENT_CONTEXT(ctx);
356   if (is_vertex_position(ctx, index))
357      ATTR1I(0, x);
358   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
359      ATTR1I(VBO_ATTRIB_GENERIC0 + index, x);
360   else
361      ERROR(GL_INVALID_VALUE);
362}
363
364static void GLAPIENTRY
365TAG(VertexAttribI2iEXT)(GLuint index, GLint x, GLint y)
366{
367   GET_CURRENT_CONTEXT(ctx);
368   if (is_vertex_position(ctx, index))
369      ATTR2I(0, x, y);
370   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
371      ATTR2I(VBO_ATTRIB_GENERIC0 + index, x, y);
372   else
373      ERROR(GL_INVALID_VALUE);
374}
375
376static void GLAPIENTRY
377TAG(VertexAttribI3iEXT)(GLuint index, GLint x, GLint y, GLint z)
378{
379   GET_CURRENT_CONTEXT(ctx);
380   if (is_vertex_position(ctx, index))
381      ATTR3I(0, x, y, z);
382   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
383      ATTR3I(VBO_ATTRIB_GENERIC0 + index, x, y, z);
384   else
385      ERROR(GL_INVALID_VALUE);
386}
387
388static void GLAPIENTRY
389TAG(VertexAttribI4iEXT)(GLuint index, GLint x, GLint y, GLint z, GLint w)
390{
391   GET_CURRENT_CONTEXT(ctx);
392   if (is_vertex_position(ctx, index))
393      ATTR4I(0, x, y, z, w);
394   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
395      ATTR4I(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
396   else
397      ERROR(GL_INVALID_VALUE);
398}
399
400static void GLAPIENTRY
401TAG(VertexAttribI2ivEXT)(GLuint index, const GLint *v)
402{
403   GET_CURRENT_CONTEXT(ctx);
404   if (is_vertex_position(ctx, index))
405      ATTR2IV(0, v);
406   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
407      ATTR2IV(VBO_ATTRIB_GENERIC0 + index, v);
408   else
409      ERROR(GL_INVALID_VALUE);
410}
411
412static void GLAPIENTRY
413TAG(VertexAttribI3ivEXT)(GLuint index, const GLint *v)
414{
415   GET_CURRENT_CONTEXT(ctx);
416   if (is_vertex_position(ctx, index))
417      ATTR3IV(0, v);
418   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
419      ATTR3IV(VBO_ATTRIB_GENERIC0 + index, v);
420   else
421      ERROR(GL_INVALID_VALUE);
422}
423
424static void GLAPIENTRY
425TAG(VertexAttribI4ivEXT)(GLuint index, const GLint *v)
426{
427   GET_CURRENT_CONTEXT(ctx);
428   if (is_vertex_position(ctx, index))
429      ATTR4IV(0, v);
430   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
431      ATTR4IV(VBO_ATTRIB_GENERIC0 + index, v);
432   else
433      ERROR(GL_INVALID_VALUE);
434}
435
436
437
438/* Unsigned integer-valued generic attributes.
439 * XXX: the integers just get converted to floats at this time
440 */
441static void GLAPIENTRY
442TAG(VertexAttribI1uiEXT)(GLuint index, GLuint x)
443{
444   GET_CURRENT_CONTEXT(ctx);
445   if (is_vertex_position(ctx, index))
446      ATTR1UI(0, x);
447   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
448      ATTR1UI(VBO_ATTRIB_GENERIC0 + index, x);
449   else
450      ERROR(GL_INVALID_VALUE);
451}
452
453static void GLAPIENTRY
454TAG(VertexAttribI2uiEXT)(GLuint index, GLuint x, GLuint y)
455{
456   GET_CURRENT_CONTEXT(ctx);
457   if (is_vertex_position(ctx, index))
458      ATTR2UI(0, x, y);
459   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
460      ATTR2UI(VBO_ATTRIB_GENERIC0 + index, x, y);
461   else
462      ERROR(GL_INVALID_VALUE);
463}
464
465static void GLAPIENTRY
466TAG(VertexAttribI3uiEXT)(GLuint index, GLuint x, GLuint y, GLuint z)
467{
468   GET_CURRENT_CONTEXT(ctx);
469   if (is_vertex_position(ctx, index))
470      ATTR3UI(0, x, y, z);
471   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
472      ATTR3UI(VBO_ATTRIB_GENERIC0 + index, x, y, z);
473   else
474      ERROR(GL_INVALID_VALUE);
475}
476
477static void GLAPIENTRY
478TAG(VertexAttribI4uiEXT)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
479{
480   GET_CURRENT_CONTEXT(ctx);
481   if (is_vertex_position(ctx, index))
482      ATTR4UI(0, x, y, z, w);
483   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
484      ATTR4UI(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
485   else
486      ERROR(GL_INVALID_VALUE);
487}
488
489static void GLAPIENTRY
490TAG(VertexAttribI2uivEXT)(GLuint index, const GLuint *v)
491{
492   GET_CURRENT_CONTEXT(ctx);
493   if (is_vertex_position(ctx, index))
494      ATTR2UIV(0, v);
495   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
496      ATTR2UIV(VBO_ATTRIB_GENERIC0 + index, v);
497   else
498      ERROR(GL_INVALID_VALUE);
499}
500
501static void GLAPIENTRY
502TAG(VertexAttribI3uivEXT)(GLuint index, const GLuint *v)
503{
504   GET_CURRENT_CONTEXT(ctx);
505   if (is_vertex_position(ctx, index))
506      ATTR3UIV(0, v);
507   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
508      ATTR3UIV(VBO_ATTRIB_GENERIC0 + index, v);
509   else
510      ERROR(GL_INVALID_VALUE);
511}
512
513static void GLAPIENTRY
514TAG(VertexAttribI4uivEXT)(GLuint index, const GLuint *v)
515{
516   GET_CURRENT_CONTEXT(ctx);
517   if (is_vertex_position(ctx, index))
518      ATTR4UIV(0, v);
519   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
520      ATTR4UIV(VBO_ATTRIB_GENERIC0 + index, v);
521   else
522      ERROR(GL_INVALID_VALUE);
523}
524
525
526
527/* These entrypoints are no longer used for NV_vertex_program but they are
528 * used by the display list and other code specifically because of their
529 * property of aliasing with the legacy Vertex, TexCoord, Normal, etc
530 * attributes.  (See vbo_save_loopback.c)
531 */
532static void GLAPIENTRY
533TAG(VertexAttrib1fNV)(GLuint index, GLfloat x)
534{
535   GET_CURRENT_CONTEXT(ctx);
536   if (index < VBO_ATTRIB_MAX)
537      ATTR1F(index, x);
538}
539
540static void GLAPIENTRY
541TAG(VertexAttrib1fvNV)(GLuint index, const GLfloat * v)
542{
543   GET_CURRENT_CONTEXT(ctx);
544   if (index < VBO_ATTRIB_MAX)
545      ATTR1FV(index, v);
546}
547
548static void GLAPIENTRY
549TAG(VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y)
550{
551   GET_CURRENT_CONTEXT(ctx);
552   if (index < VBO_ATTRIB_MAX)
553      ATTR2F(index, x, y);
554}
555
556static void GLAPIENTRY
557TAG(VertexAttrib2fvNV)(GLuint index, const GLfloat * v)
558{
559   GET_CURRENT_CONTEXT(ctx);
560   if (index < VBO_ATTRIB_MAX)
561      ATTR2FV(index, v);
562}
563
564static void GLAPIENTRY
565TAG(VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z)
566{
567   GET_CURRENT_CONTEXT(ctx);
568   if (index < VBO_ATTRIB_MAX)
569      ATTR3F(index, x, y, z);
570}
571
572static void GLAPIENTRY
573TAG(VertexAttrib3fvNV)(GLuint index,
574 const GLfloat * v)
575{
576   GET_CURRENT_CONTEXT(ctx);
577   if (index < VBO_ATTRIB_MAX)
578      ATTR3FV(index, v);
579}
580
581static void GLAPIENTRY
582TAG(VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
583{
584   GET_CURRENT_CONTEXT(ctx);
585   if (index < VBO_ATTRIB_MAX)
586      ATTR4F(index, x, y, z, w);
587}
588
589static void GLAPIENTRY
590TAG(VertexAttrib4fvNV)(GLuint index, const GLfloat * v)
591{
592   GET_CURRENT_CONTEXT(ctx);
593   if (index < VBO_ATTRIB_MAX)
594      ATTR4FV(index, v);
595}
596
597static void GLAPIENTRY
598TAG(VertexP2ui)(GLenum type, GLuint value)
599{
600   GET_CURRENT_CONTEXT(ctx);
601   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP2ui");
602   ATTR_UI(ctx, 2, type, 0, VBO_ATTRIB_POS, value);
603}
604
605static void GLAPIENTRY
606TAG(VertexP2uiv)(GLenum type, const GLuint *value)
607{
608   GET_CURRENT_CONTEXT(ctx);
609   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP2uiv");
610   ATTR_UI(ctx, 2, type, 0, VBO_ATTRIB_POS, value[0]);
611}
612
613static void GLAPIENTRY
614TAG(VertexP3ui)(GLenum type, GLuint value)
615{
616   GET_CURRENT_CONTEXT(ctx);
617   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP3ui");
618   ATTR_UI(ctx, 3, type, 0, VBO_ATTRIB_POS, value);
619}
620
621static void GLAPIENTRY
622TAG(VertexP3uiv)(GLenum type, const GLuint *value)
623{
624   GET_CURRENT_CONTEXT(ctx);
625   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP3uiv");
626   ATTR_UI(ctx, 3, type, 0, VBO_ATTRIB_POS, value[0]);
627}
628
629static void GLAPIENTRY
630TAG(VertexP4ui)(GLenum type, GLuint value)
631{
632   GET_CURRENT_CONTEXT(ctx);
633   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP4ui");
634   ATTR_UI(ctx, 4, type, 0, VBO_ATTRIB_POS, value);
635}
636
637static void GLAPIENTRY
638TAG(VertexP4uiv)(GLenum type, const GLuint *value)
639{
640   GET_CURRENT_CONTEXT(ctx);
641   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP4uiv");
642   ATTR_UI(ctx, 4, type, 0, VBO_ATTRIB_POS, value[0]);
643}
644
645static void GLAPIENTRY
646TAG(VertexAttribP1ui)(GLuint index, GLenum type, GLboolean normalized,
647		      GLuint value)
648{
649   GET_CURRENT_CONTEXT(ctx);
650   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP1ui");
651   ATTR_UI_INDEX(ctx, 1, type, normalized, index, value);
652}
653
654static void GLAPIENTRY
655TAG(VertexAttribP2ui)(GLuint index, GLenum type, GLboolean normalized,
656		      GLuint value)
657{
658   GET_CURRENT_CONTEXT(ctx);
659   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP2ui");
660   ATTR_UI_INDEX(ctx, 2, type, normalized, index, value);
661}
662
663static void GLAPIENTRY
664TAG(VertexAttribP3ui)(GLuint index, GLenum type, GLboolean normalized,
665		      GLuint value)
666{
667   GET_CURRENT_CONTEXT(ctx);
668   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP3ui");
669   ATTR_UI_INDEX(ctx, 3, type, normalized, index, value);
670}
671
672static void GLAPIENTRY
673TAG(VertexAttribP4ui)(GLuint index, GLenum type, GLboolean normalized,
674		      GLuint value)
675{
676   GET_CURRENT_CONTEXT(ctx);
677   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexAttribP4ui");
678   ATTR_UI_INDEX(ctx, 4, type, normalized, index, value);
679}
680
681static void GLAPIENTRY
682TAG(VertexAttribP1uiv)(GLuint index, GLenum type, GLboolean normalized,
683		       const GLuint *value)
684{
685   GET_CURRENT_CONTEXT(ctx);
686   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP1uiv");
687   ATTR_UI_INDEX(ctx, 1, type, normalized, index, *value);
688}
689
690static void GLAPIENTRY
691TAG(VertexAttribP2uiv)(GLuint index, GLenum type, GLboolean normalized,
692		       const GLuint *value)
693{
694   GET_CURRENT_CONTEXT(ctx);
695   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP2uiv");
696   ATTR_UI_INDEX(ctx, 2, type, normalized, index, *value);
697}
698
699static void GLAPIENTRY
700TAG(VertexAttribP3uiv)(GLuint index, GLenum type, GLboolean normalized,
701		       const GLuint *value)
702{
703   GET_CURRENT_CONTEXT(ctx);
704   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP3uiv");
705   ATTR_UI_INDEX(ctx, 3, type, normalized, index, *value);
706}
707
708static void GLAPIENTRY
709TAG(VertexAttribP4uiv)(GLuint index, GLenum type, GLboolean normalized,
710		      const GLuint *value)
711{
712   GET_CURRENT_CONTEXT(ctx);
713   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexAttribP4uiv");
714   ATTR_UI_INDEX(ctx, 4, type, normalized, index, *value);
715}
716
717
718
719static void GLAPIENTRY
720TAG(VertexAttribL1d)(GLuint index, GLdouble x)
721{
722   GET_CURRENT_CONTEXT(ctx);
723   if (is_vertex_position(ctx, index))
724      ATTR1D(0, x);
725   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
726      ATTR1D(VBO_ATTRIB_GENERIC0 + index, x);
727   else
728      ERROR(GL_INVALID_VALUE);
729}
730
731static void GLAPIENTRY
732TAG(VertexAttribL1dv)(GLuint index, const GLdouble * v)
733{
734   GET_CURRENT_CONTEXT(ctx);
735   if (is_vertex_position(ctx, index))
736      ATTR1DV(0, v);
737   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
738      ATTR1DV(VBO_ATTRIB_GENERIC0 + index, v);
739   else
740      ERROR(GL_INVALID_VALUE);
741}
742
743static void GLAPIENTRY
744TAG(VertexAttribL2d)(GLuint index, GLdouble x, GLdouble y)
745{
746   GET_CURRENT_CONTEXT(ctx);
747   if (is_vertex_position(ctx, index))
748      ATTR2D(0, x, y);
749   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
750      ATTR2D(VBO_ATTRIB_GENERIC0 + index, x, y);
751   else
752      ERROR(GL_INVALID_VALUE);
753}
754
755static void GLAPIENTRY
756TAG(VertexAttribL2dv)(GLuint index, const GLdouble * v)
757{
758   GET_CURRENT_CONTEXT(ctx);
759   if (is_vertex_position(ctx, index))
760      ATTR2DV(0, v);
761   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
762      ATTR2DV(VBO_ATTRIB_GENERIC0 + index, v);
763   else
764      ERROR(GL_INVALID_VALUE);
765}
766
767static void GLAPIENTRY
768TAG(VertexAttribL3d)(GLuint index, GLdouble x, GLdouble y, GLdouble z)
769{
770   GET_CURRENT_CONTEXT(ctx);
771   if (is_vertex_position(ctx, index))
772      ATTR3D(0, x, y, z);
773   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
774      ATTR3D(VBO_ATTRIB_GENERIC0 + index, x, y, z);
775   else
776      ERROR(GL_INVALID_VALUE);
777}
778
779static void GLAPIENTRY
780TAG(VertexAttribL3dv)(GLuint index, const GLdouble * v)
781{
782   GET_CURRENT_CONTEXT(ctx);
783   if (is_vertex_position(ctx, index))
784      ATTR3DV(0, v);
785   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
786      ATTR3DV(VBO_ATTRIB_GENERIC0 + index, v);
787   else
788      ERROR(GL_INVALID_VALUE);
789}
790
791static void GLAPIENTRY
792TAG(VertexAttribL4d)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
793{
794   GET_CURRENT_CONTEXT(ctx);
795   if (is_vertex_position(ctx, index))
796      ATTR4D(0, x, y, z, w);
797   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
798      ATTR4D(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
799   else
800      ERROR(GL_INVALID_VALUE);
801}
802
803static void GLAPIENTRY
804TAG(VertexAttribL4dv)(GLuint index, const GLdouble * v)
805{
806   GET_CURRENT_CONTEXT(ctx);
807   if (is_vertex_position(ctx, index))
808      ATTR4DV(0, v);
809   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
810      ATTR4DV(VBO_ATTRIB_GENERIC0 + index, v);
811   else
812      ERROR(GL_INVALID_VALUE);
813}
814
815static void GLAPIENTRY
816TAG(VertexAttribL1ui64ARB)(GLuint index, GLuint64EXT x)
817{
818   GET_CURRENT_CONTEXT(ctx);
819   if (is_vertex_position(ctx, index))
820      ATTR1UI64(0, x);
821   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
822      ATTR1UI64(VBO_ATTRIB_GENERIC0 + index, x);
823   else
824      ERROR(GL_INVALID_VALUE);
825}
826
827static void GLAPIENTRY
828TAG(VertexAttribL1ui64vARB)(GLuint index, const GLuint64EXT *v)
829{
830   GET_CURRENT_CONTEXT(ctx);
831   if (is_vertex_position(ctx, index))
832      ATTR1UIV64(0, v);
833   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
834      ATTR1UIV64(VBO_ATTRIB_GENERIC0 + index, v);
835   else
836      ERROR(GL_INVALID_VALUE);
837}
838
839/* GL_NV_half_float */
840static void GLAPIENTRY
841TAG(Vertex2hNV)(GLhalfNV x, GLhalfNV y)
842{
843   GET_CURRENT_CONTEXT(ctx);
844   ATTR2H(VBO_ATTRIB_POS, x, y);
845}
846
847static void GLAPIENTRY
848TAG(Vertex2hvNV)(const GLhalfNV * v)
849{
850   GET_CURRENT_CONTEXT(ctx);
851   ATTR2HV(VBO_ATTRIB_POS, v);
852}
853
854static void GLAPIENTRY
855TAG(Vertex3hNV)(GLhalfNV x, GLhalfNV y, GLhalfNV z)
856{
857   GET_CURRENT_CONTEXT(ctx);
858   ATTR3H(VBO_ATTRIB_POS, x, y, z);
859}
860
861static void GLAPIENTRY
862TAG(Vertex3hvNV)(const GLhalfNV * v)
863{
864   GET_CURRENT_CONTEXT(ctx);
865   ATTR3HV(VBO_ATTRIB_POS, v);
866}
867
868static void GLAPIENTRY
869TAG(Vertex4hNV)(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w)
870{
871   GET_CURRENT_CONTEXT(ctx);
872   ATTR4H(VBO_ATTRIB_POS, x, y, z, w);
873}
874
875static void GLAPIENTRY
876TAG(Vertex4hvNV)(const GLhalfNV * v)
877{
878   GET_CURRENT_CONTEXT(ctx);
879   ATTR4HV(VBO_ATTRIB_POS, v);
880}
881
882static void GLAPIENTRY
883TAG(VertexAttrib1hNV)(GLuint index, GLhalfNV x)
884{
885   GET_CURRENT_CONTEXT(ctx);
886   if (is_vertex_position(ctx, index))
887      ATTR1H(0, x);
888   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
889      ATTR1H(VBO_ATTRIB_GENERIC0 + index, x);
890   else
891      ERROR(GL_INVALID_VALUE);
892}
893
894static void GLAPIENTRY
895TAG(VertexAttrib2hNV)(GLuint index, GLhalfNV x, GLhalfNV y)
896{
897   GET_CURRENT_CONTEXT(ctx);
898   if (is_vertex_position(ctx, index))
899      ATTR2H(0, x, y);
900   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
901      ATTR2H(VBO_ATTRIB_GENERIC0 + index, x, y);
902   else
903      ERROR(GL_INVALID_VALUE);
904}
905
906static void GLAPIENTRY
907TAG(VertexAttrib3hNV)(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z)
908{
909   GET_CURRENT_CONTEXT(ctx);
910   if (is_vertex_position(ctx, index))
911      ATTR3H(0, x, y, z);
912   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
913      ATTR3H(VBO_ATTRIB_GENERIC0 + index, x, y, z);
914   else
915      ERROR(GL_INVALID_VALUE);
916}
917
918static void GLAPIENTRY
919TAG(VertexAttrib4hNV)(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w)
920{
921   GET_CURRENT_CONTEXT(ctx);
922   if (is_vertex_position(ctx, index))
923      ATTR4H(0, x, y, z, w);
924   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
925      ATTR4H(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
926   else
927      ERROR(GL_INVALID_VALUE);
928}
929
930static void GLAPIENTRY
931TAG(VertexAttrib1hvNV)(GLuint index, const GLhalfNV * v)
932{
933   GET_CURRENT_CONTEXT(ctx);
934   if (is_vertex_position(ctx, index))
935      ATTR1HV(0, v);
936   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
937      ATTR1HV(VBO_ATTRIB_GENERIC0 + index, v);
938   else
939      ERROR(GL_INVALID_VALUE);
940}
941
942static void GLAPIENTRY
943TAG(VertexAttrib2hvNV)(GLuint index, const GLhalfNV * v)
944{
945   GET_CURRENT_CONTEXT(ctx);
946   if (is_vertex_position(ctx, index))
947      ATTR2HV(0, v);
948   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
949      ATTR2HV(VBO_ATTRIB_GENERIC0 + index, v);
950   else
951      ERROR(GL_INVALID_VALUE);
952}
953
954static void GLAPIENTRY
955TAG(VertexAttrib3hvNV)(GLuint index, const GLhalfNV * v)
956{
957   GET_CURRENT_CONTEXT(ctx);
958   if (is_vertex_position(ctx, index))
959      ATTR3HV(0, v);
960   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
961      ATTR3HV(VBO_ATTRIB_GENERIC0 + index, v);
962   else
963      ERROR(GL_INVALID_VALUE);
964}
965
966static void GLAPIENTRY
967TAG(VertexAttrib4hvNV)(GLuint index, const GLhalfNV * v)
968{
969   GET_CURRENT_CONTEXT(ctx);
970   if (is_vertex_position(ctx, index))
971      ATTR4HV(0, v);
972   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
973      ATTR4HV(VBO_ATTRIB_GENERIC0 + index, v);
974   else
975      ERROR(GL_INVALID_VALUE);
976}
977
978static void GLAPIENTRY
979TAG(VertexAttribs1hvNV)(GLuint index, GLsizei n, const GLhalfNV *v)
980{
981   GET_CURRENT_CONTEXT(ctx);
982   n = MIN2(n, VBO_ATTRIB_MAX - index);
983   for (GLint i = n - 1; i >= 0; i--)
984      ATTR1H(index + i, v[i]);
985}
986
987static void GLAPIENTRY
988TAG(VertexAttribs2hvNV)(GLuint index, GLsizei n, const GLhalfNV *v)
989{
990   GET_CURRENT_CONTEXT(ctx);
991   n = MIN2(n, VBO_ATTRIB_MAX - index);
992   for (GLint i = n - 1; i >= 0; i--)
993      ATTR2H(index + i, v[2 * i], v[2 * i + 1]);
994}
995
996static void GLAPIENTRY
997TAG(VertexAttribs3hvNV)(GLuint index, GLsizei n, const GLhalfNV *v)
998{
999   GET_CURRENT_CONTEXT(ctx);
1000   n = MIN2(n, VBO_ATTRIB_MAX - index);
1001   for (GLint i = n - 1; i >= 0; i--)
1002      ATTR3H(index + i, v[3 * i], v[3 * i + 1], v[3 * i + 2]);
1003}
1004
1005
1006static void GLAPIENTRY
1007TAG(VertexAttribs4hvNV)(GLuint index, GLsizei n, const GLhalfNV *v)
1008{
1009   GET_CURRENT_CONTEXT(ctx);
1010   n = MIN2(n, VBO_ATTRIB_MAX - index);
1011   for (GLint i = n - 1; i >= 0; i--)
1012      ATTR4H(index + i, v[4 * i], v[4 * i + 1], v[4 * i + 2], v[4 * i + 3]);
1013}
1014
1015static void GLAPIENTRY
1016TAG(Vertex2d)(GLdouble x, GLdouble y)
1017{
1018   GET_CURRENT_CONTEXT(ctx);
1019   ATTR2F(VBO_ATTRIB_POS, (GLfloat) x, (GLfloat) y);
1020}
1021
1022static void GLAPIENTRY
1023TAG(Vertex2i)(GLint x, GLint y)
1024{
1025   GET_CURRENT_CONTEXT(ctx);
1026   ATTR2F(VBO_ATTRIB_POS, (GLfloat) x, (GLfloat) y);
1027}
1028
1029static void GLAPIENTRY
1030TAG(Vertex2s)(GLshort x, GLshort y)
1031{
1032   GET_CURRENT_CONTEXT(ctx);
1033   ATTR2F(VBO_ATTRIB_POS, (GLfloat) x, (GLfloat) y);
1034}
1035
1036static void GLAPIENTRY
1037TAG(Vertex3d)(GLdouble x, GLdouble y, GLdouble z)
1038{
1039   GET_CURRENT_CONTEXT(ctx);
1040   ATTR3F(VBO_ATTRIB_POS, (GLfloat) x, (GLfloat) y, (GLfloat) z);
1041}
1042
1043static void GLAPIENTRY
1044TAG(Vertex3i)(GLint x, GLint y, GLint z)
1045{
1046   GET_CURRENT_CONTEXT(ctx);
1047   ATTR3F(VBO_ATTRIB_POS, (GLfloat) x, (GLfloat) y, (GLfloat) z);
1048}
1049
1050static void GLAPIENTRY
1051TAG(Vertex3s)(GLshort x, GLshort y, GLshort z)
1052{
1053   GET_CURRENT_CONTEXT(ctx);
1054   ATTR3F(VBO_ATTRIB_POS, (GLfloat) x, (GLfloat) y, (GLfloat) z);
1055}
1056
1057static void GLAPIENTRY
1058TAG(Vertex4d)(GLdouble x, GLdouble y, GLdouble z, GLdouble w)
1059{
1060   GET_CURRENT_CONTEXT(ctx);
1061   ATTR4F(VBO_ATTRIB_POS, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
1062}
1063
1064static void GLAPIENTRY
1065TAG(Vertex4i)(GLint x, GLint y, GLint z, GLint w)
1066{
1067   GET_CURRENT_CONTEXT(ctx);
1068   ATTR4F(VBO_ATTRIB_POS, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
1069}
1070
1071static void GLAPIENTRY
1072TAG(Vertex4s)(GLshort x, GLshort y, GLshort z, GLshort w)
1073{
1074   GET_CURRENT_CONTEXT(ctx);
1075   ATTR4F(VBO_ATTRIB_POS, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
1076}
1077
1078static void GLAPIENTRY
1079TAG(Vertex2dv)(const GLdouble *v)
1080{
1081   GET_CURRENT_CONTEXT(ctx);
1082   ATTR2F(VBO_ATTRIB_POS, (GLfloat) v[0], (GLfloat) v[1]);
1083}
1084
1085static void GLAPIENTRY
1086TAG(Vertex2iv)(const GLint *v)
1087{
1088   GET_CURRENT_CONTEXT(ctx);
1089   ATTR2F(VBO_ATTRIB_POS, (GLfloat) v[0], (GLfloat) v[1]);
1090}
1091
1092static void GLAPIENTRY
1093TAG(Vertex2sv)(const GLshort *v)
1094{
1095   GET_CURRENT_CONTEXT(ctx);
1096   ATTR2F(VBO_ATTRIB_POS, (GLfloat) v[0], (GLfloat) v[1]);
1097}
1098
1099static void GLAPIENTRY
1100TAG(Vertex3dv)(const GLdouble *v)
1101{
1102   GET_CURRENT_CONTEXT(ctx);
1103   ATTR3F(VBO_ATTRIB_POS, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
1104}
1105
1106static void GLAPIENTRY
1107TAG(Vertex3iv)(const GLint *v)
1108{
1109   GET_CURRENT_CONTEXT(ctx);
1110   ATTR3F(VBO_ATTRIB_POS, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
1111}
1112
1113static void GLAPIENTRY
1114TAG(Vertex3sv)(const GLshort *v)
1115{
1116   GET_CURRENT_CONTEXT(ctx);
1117   ATTR3F(VBO_ATTRIB_POS, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
1118}
1119
1120static void GLAPIENTRY
1121TAG(Vertex4dv)(const GLdouble *v)
1122{
1123   GET_CURRENT_CONTEXT(ctx);
1124   ATTR4F(VBO_ATTRIB_POS, (GLfloat) v[0], (GLfloat) v[1],
1125         (GLfloat) v[2], (GLfloat) v[3]);
1126}
1127
1128static void GLAPIENTRY
1129TAG(Vertex4iv)(const GLint *v)
1130{
1131   GET_CURRENT_CONTEXT(ctx);
1132   ATTR4F(VBO_ATTRIB_POS, (GLfloat) v[0], (GLfloat) v[1],
1133         (GLfloat) v[2], (GLfloat) v[3]);
1134}
1135
1136static void GLAPIENTRY
1137TAG(Vertex4sv)(const GLshort *v)
1138{
1139   GET_CURRENT_CONTEXT(ctx);
1140   ATTR4F(VBO_ATTRIB_POS, (GLfloat) v[0], (GLfloat) v[1],
1141         (GLfloat) v[2], (GLfloat) v[3]);
1142}
1143
1144/*
1145 * GL_NV_vertex_program:
1146 * Note that attribute indexes DO alias conventional vertex attributes.
1147 */
1148
1149static void GLAPIENTRY
1150TAG(VertexAttrib1sNV)(GLuint index, GLshort x)
1151{
1152   GET_CURRENT_CONTEXT(ctx);
1153   if (index < VBO_ATTRIB_MAX) ATTR1F(index, (GLfloat) x);
1154}
1155
1156static void GLAPIENTRY
1157TAG(VertexAttrib1dNV)(GLuint index, GLdouble x)
1158{
1159   GET_CURRENT_CONTEXT(ctx);
1160   if (index < VBO_ATTRIB_MAX) ATTR1F(index, (GLfloat) x);
1161}
1162
1163static void GLAPIENTRY
1164TAG(VertexAttrib2sNV)(GLuint index, GLshort x, GLshort y)
1165{
1166   GET_CURRENT_CONTEXT(ctx);
1167   if (index < VBO_ATTRIB_MAX) ATTR2F(index, (GLfloat) x, y);
1168}
1169
1170static void GLAPIENTRY
1171TAG(VertexAttrib2dNV)(GLuint index, GLdouble x, GLdouble y)
1172{
1173   GET_CURRENT_CONTEXT(ctx);
1174   if (index < VBO_ATTRIB_MAX) ATTR2F(index, (GLfloat) x, (GLfloat) y);
1175}
1176
1177static void GLAPIENTRY
1178TAG(VertexAttrib3sNV)(GLuint index, GLshort x, GLshort y, GLshort z)
1179{
1180   GET_CURRENT_CONTEXT(ctx);
1181   if (index < VBO_ATTRIB_MAX) ATTR3F(index, (GLfloat) x, (GLfloat) y, (GLfloat) z);
1182}
1183
1184static void GLAPIENTRY
1185TAG(VertexAttrib3dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z)
1186{
1187   GET_CURRENT_CONTEXT(ctx);
1188   if (index < VBO_ATTRIB_MAX) ATTR4F(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, 1.0F);
1189}
1190
1191static void GLAPIENTRY
1192TAG(VertexAttrib4sNV)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
1193{
1194   GET_CURRENT_CONTEXT(ctx);
1195   if (index < VBO_ATTRIB_MAX) ATTR4F(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
1196}
1197
1198static void GLAPIENTRY
1199TAG(VertexAttrib4dNV)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
1200{
1201   GET_CURRENT_CONTEXT(ctx);
1202   if (index < VBO_ATTRIB_MAX) ATTR4F(index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
1203}
1204
1205static void GLAPIENTRY
1206TAG(VertexAttrib4ubNV)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
1207{
1208   GET_CURRENT_CONTEXT(ctx);
1209   if (index < VBO_ATTRIB_MAX) ATTR4F(index, UBYTE_TO_FLOAT(x), UBYTE_TO_FLOAT(y),
1210                                      UBYTE_TO_FLOAT(z), UBYTE_TO_FLOAT(w));
1211}
1212
1213static void GLAPIENTRY
1214TAG(VertexAttrib1svNV)(GLuint index, const GLshort *v)
1215{
1216   GET_CURRENT_CONTEXT(ctx);
1217   if (index < VBO_ATTRIB_MAX) ATTR1F(index, (GLfloat) v[0]);
1218}
1219
1220static void GLAPIENTRY
1221TAG(VertexAttrib1dvNV)(GLuint index, const GLdouble *v)
1222{
1223   GET_CURRENT_CONTEXT(ctx);
1224   if (index < VBO_ATTRIB_MAX) ATTR1F(index, (GLfloat) v[0]);
1225}
1226
1227static void GLAPIENTRY
1228TAG(VertexAttrib2svNV)(GLuint index, const GLshort *v)
1229{
1230   GET_CURRENT_CONTEXT(ctx);
1231   if (index < VBO_ATTRIB_MAX) ATTR2F(index, (GLfloat) v[0], (GLfloat) v[1]);
1232}
1233
1234static void GLAPIENTRY
1235TAG(VertexAttrib2dvNV)(GLuint index, const GLdouble *v)
1236{
1237   GET_CURRENT_CONTEXT(ctx);
1238   if (index < VBO_ATTRIB_MAX) ATTR2F(index, (GLfloat) v[0], (GLfloat) v[1]);
1239}
1240
1241static void GLAPIENTRY
1242TAG(VertexAttrib3svNV)(GLuint index, const GLshort *v)
1243{
1244   GET_CURRENT_CONTEXT(ctx);
1245   if (index < VBO_ATTRIB_MAX) ATTR3F(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
1246}
1247
1248static void GLAPIENTRY
1249TAG(VertexAttrib3dvNV)(GLuint index, const GLdouble *v)
1250{
1251   GET_CURRENT_CONTEXT(ctx);
1252   if (index < VBO_ATTRIB_MAX) ATTR3F(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
1253}
1254
1255static void GLAPIENTRY
1256TAG(VertexAttrib4svNV)(GLuint index, const GLshort *v)
1257{
1258   GET_CURRENT_CONTEXT(ctx);
1259   if (index < VBO_ATTRIB_MAX) ATTR4F(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2],
1260         (GLfloat)v[3]);
1261}
1262
1263static void GLAPIENTRY
1264TAG(VertexAttrib4dvNV)(GLuint index, const GLdouble *v)
1265{
1266   GET_CURRENT_CONTEXT(ctx);
1267   if (index < VBO_ATTRIB_MAX) ATTR4F(index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
1268}
1269
1270static void GLAPIENTRY
1271TAG(VertexAttrib4ubvNV)(GLuint index, const GLubyte *v)
1272{
1273   GET_CURRENT_CONTEXT(ctx);
1274   if (index < VBO_ATTRIB_MAX) ATTR4F(index, UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]),
1275         UBYTE_TO_FLOAT(v[2]), UBYTE_TO_FLOAT(v[3]));
1276}
1277
1278
1279static void GLAPIENTRY
1280TAG(VertexAttribs1svNV)(GLuint index, GLsizei n, const GLshort *v)
1281{
1282   GET_CURRENT_CONTEXT(ctx);
1283   GLint i;
1284   n = MIN2(n, VBO_ATTRIB_MAX - index);
1285   for (i = n - 1; i >= 0; i--)
1286      ATTR1F(index + i, (GLfloat) v[i]);
1287}
1288
1289static void GLAPIENTRY
1290TAG(VertexAttribs1fvNV)(GLuint index, GLsizei n, const GLfloat *v)
1291{
1292   GET_CURRENT_CONTEXT(ctx);
1293   GLint i;
1294   n = MIN2(n, VBO_ATTRIB_MAX - index);
1295   for (i = n - 1; i >= 0; i--)
1296      ATTR1F(index + i, v[i]);
1297}
1298
1299static void GLAPIENTRY
1300TAG(VertexAttribs1dvNV)(GLuint index, GLsizei n, const GLdouble *v)
1301{
1302   GET_CURRENT_CONTEXT(ctx);
1303   GLint i;
1304   n = MIN2(n, VBO_ATTRIB_MAX - index);
1305   for (i = n - 1; i >= 0; i--)
1306      ATTR1F(index + i, (GLfloat) v[i]);
1307}
1308
1309static void GLAPIENTRY
1310TAG(VertexAttribs2svNV)(GLuint index, GLsizei n, const GLshort *v)
1311{
1312   GET_CURRENT_CONTEXT(ctx);
1313   GLint i;
1314   n = MIN2(n, VBO_ATTRIB_MAX - index);
1315   for (i = n - 1; i >= 0; i--)
1316      ATTR2F(index + i, (GLfloat) v[2 * i], (GLfloat) v[2 * i + 1]);
1317}
1318
1319static void GLAPIENTRY
1320TAG(VertexAttribs2fvNV)(GLuint index, GLsizei n, const GLfloat *v)
1321{
1322   GET_CURRENT_CONTEXT(ctx);
1323   GLint i;
1324   n = MIN2(n, VBO_ATTRIB_MAX - index);
1325   for (i = n - 1; i >= 0; i--)
1326      ATTR2F(index + i, v[2 * i], v[2 * i + 1]);
1327}
1328
1329static void GLAPIENTRY
1330TAG(VertexAttribs2dvNV)(GLuint index, GLsizei n, const GLdouble *v)
1331{
1332   GET_CURRENT_CONTEXT(ctx);
1333   GLint i;
1334   n = MIN2(n, VBO_ATTRIB_MAX - index);
1335   for (i = n - 1; i >= 0; i--)
1336      ATTR2F(index + i, (GLfloat) v[2 * i], (GLfloat) v[2 * i + 1]);
1337}
1338
1339static void GLAPIENTRY
1340TAG(VertexAttribs3svNV)(GLuint index, GLsizei n, const GLshort *v)
1341{
1342   GET_CURRENT_CONTEXT(ctx);
1343   GLint i;
1344   n = MIN2(n, VBO_ATTRIB_MAX - index);
1345   for (i = n - 1; i >= 0; i--)
1346      ATTR3F(index + i, (GLfloat) v[3 * i], (GLfloat) v[3 * i + 1], (GLfloat) v[3 * i + 2]);
1347}
1348
1349static void GLAPIENTRY
1350TAG(VertexAttribs3fvNV)(GLuint index, GLsizei n, const GLfloat *v)
1351{
1352   GET_CURRENT_CONTEXT(ctx);
1353   GLint i;
1354   n = MIN2(n, VBO_ATTRIB_MAX - index);
1355   for (i = n - 1; i >= 0; i--)
1356      ATTR3F(index + i, v[3 * i], v[3 * i + 1], v[3 * i + 2]);
1357}
1358
1359static void GLAPIENTRY
1360TAG(VertexAttribs3dvNV)(GLuint index, GLsizei n, const GLdouble *v)
1361{
1362   GET_CURRENT_CONTEXT(ctx);
1363   GLint i;
1364   n = MIN2(n, VBO_ATTRIB_MAX - index);
1365   for (i = n - 1; i >= 0; i--)
1366      ATTR3F(index + i, (GLfloat) v[3 * i], (GLfloat) v[3 * i + 1], (GLfloat) v[3 * i + 2]);
1367}
1368
1369static void GLAPIENTRY
1370TAG(VertexAttribs4svNV)(GLuint index, GLsizei n, const GLshort *v)
1371{
1372   GET_CURRENT_CONTEXT(ctx);
1373   GLint i;
1374   n = MIN2(n, VBO_ATTRIB_MAX - index);
1375   for (i = n - 1; i >= 0; i--)
1376      ATTR4F(index + i, (GLfloat) v[4 * i], (GLfloat) v[4 * i + 1], (GLfloat) v[4 * i + 2], (GLfloat) v[4 * i + 3]);
1377}
1378
1379static void GLAPIENTRY
1380TAG(VertexAttribs4fvNV)(GLuint index, GLsizei n, const GLfloat *v)
1381{
1382   GET_CURRENT_CONTEXT(ctx);
1383   GLint i;
1384   n = MIN2(n, VBO_ATTRIB_MAX - index);
1385   for (i = n - 1; i >= 0; i--)
1386      ATTR4F(index + i, v[4 * i], v[4 * i + 1], v[4 * i + 2], v[4 * i + 3]);
1387}
1388
1389static void GLAPIENTRY
1390TAG(VertexAttribs4dvNV)(GLuint index, GLsizei n, const GLdouble *v)
1391{
1392   GET_CURRENT_CONTEXT(ctx);
1393   GLint i;
1394   n = MIN2(n, VBO_ATTRIB_MAX - index);
1395   for (i = n - 1; i >= 0; i--)
1396      ATTR4F(index + i, (GLfloat) v[4 * i], (GLfloat) v[4 * i + 1], (GLfloat) v[4 * i + 2], (GLfloat) v[4 * i + 3]);
1397}
1398
1399static void GLAPIENTRY
1400TAG(VertexAttribs4ubvNV)(GLuint index, GLsizei n, const GLubyte *v)
1401{
1402   GET_CURRENT_CONTEXT(ctx);
1403   GLint i;
1404   n = MIN2(n, VBO_ATTRIB_MAX - index);
1405   for (i = n - 1; i >= 0; i--)
1406      ATTR4F(index + i, UBYTE_TO_FLOAT(v[4 * i]), UBYTE_TO_FLOAT(v[4 * i + 1]),
1407             UBYTE_TO_FLOAT(v[4 * i + 2]), UBYTE_TO_FLOAT(v[4 * i + 3]));
1408}
1409
1410
1411/*
1412 * GL_ARB_vertex_program
1413 * Note that attribute indexes do NOT alias conventional attributes.
1414 */
1415
1416static void GLAPIENTRY
1417TAG(VertexAttrib1s)(GLuint index, GLshort x)
1418{
1419   GET_CURRENT_CONTEXT(ctx);
1420   if (is_vertex_position(ctx, index))
1421      ATTR1F(0, (GLfloat) x);
1422   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1423      ATTR1F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) x);
1424   else
1425      ERROR(GL_INVALID_VALUE);
1426}
1427
1428static void GLAPIENTRY
1429TAG(VertexAttrib1d)(GLuint index, GLdouble x)
1430{
1431   GET_CURRENT_CONTEXT(ctx);
1432   if (is_vertex_position(ctx, index))
1433      ATTR1F(0, (GLfloat) x);
1434   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1435      ATTR1F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) x);
1436   else
1437      ERROR(GL_INVALID_VALUE);
1438}
1439
1440static void GLAPIENTRY
1441TAG(VertexAttrib2s)(GLuint index, GLshort x, GLshort y)
1442{
1443   GET_CURRENT_CONTEXT(ctx);
1444   if (is_vertex_position(ctx, index))
1445      ATTR2F(0, (GLfloat) x, (GLfloat) y);
1446   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1447      ATTR2F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) x, (GLfloat) y);
1448   else
1449      ERROR(GL_INVALID_VALUE);
1450}
1451
1452static void GLAPIENTRY
1453TAG(VertexAttrib2d)(GLuint index, GLdouble x, GLdouble y)
1454{
1455   GET_CURRENT_CONTEXT(ctx);
1456   if (is_vertex_position(ctx, index))
1457      ATTR2F(0, (GLfloat) x, (GLfloat) y);
1458   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1459      ATTR2F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) x, (GLfloat) y);
1460   else
1461      ERROR(GL_INVALID_VALUE);
1462}
1463
1464static void GLAPIENTRY
1465TAG(VertexAttrib3s)(GLuint index, GLshort x, GLshort y, GLshort z)
1466{
1467   GET_CURRENT_CONTEXT(ctx);
1468   if (is_vertex_position(ctx, index))
1469      ATTR3F(0, (GLfloat) x, (GLfloat) y, (GLfloat) z);
1470   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1471      ATTR3F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) x, (GLfloat) y, (GLfloat) z);
1472   else
1473      ERROR(GL_INVALID_VALUE);
1474}
1475
1476static void GLAPIENTRY
1477TAG(VertexAttrib3d)(GLuint index, GLdouble x, GLdouble y, GLdouble z)
1478{
1479   GET_CURRENT_CONTEXT(ctx);
1480   if (is_vertex_position(ctx, index))
1481      ATTR3F(0, (GLfloat) x, (GLfloat) y, (GLfloat) z);
1482   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1483      ATTR3F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) x, (GLfloat) y, (GLfloat) z);
1484   else
1485      ERROR(GL_INVALID_VALUE);
1486}
1487
1488static void GLAPIENTRY
1489TAG(VertexAttrib4s)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w)
1490{
1491   GET_CURRENT_CONTEXT(ctx);
1492   if (is_vertex_position(ctx, index))
1493      ATTR4F(0, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
1494   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1495      ATTR4F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
1496   else
1497      ERROR(GL_INVALID_VALUE);
1498}
1499
1500static void GLAPIENTRY
1501TAG(VertexAttrib4d)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
1502{
1503   GET_CURRENT_CONTEXT(ctx);
1504   if (is_vertex_position(ctx, index))
1505      ATTR4F(0, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
1506   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1507      ATTR4F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) x, (GLfloat) y, (GLfloat) z, (GLfloat) w);
1508   else
1509      ERROR(GL_INVALID_VALUE);
1510}
1511
1512static void GLAPIENTRY
1513TAG(VertexAttrib1sv)(GLuint index, const GLshort *v)
1514{
1515   GET_CURRENT_CONTEXT(ctx);
1516   if (is_vertex_position(ctx, index))
1517      ATTR1F(0, (GLfloat) v[0]);
1518   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1519      ATTR1F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0]);
1520   else
1521      ERROR(GL_INVALID_VALUE);
1522}
1523
1524static void GLAPIENTRY
1525TAG(VertexAttrib1dv)(GLuint index, const GLdouble *v)
1526{
1527   GET_CURRENT_CONTEXT(ctx);
1528   if (is_vertex_position(ctx, index))
1529      ATTR1F(0, (GLfloat) v[0]);
1530   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1531      ATTR1F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0]);
1532   else
1533      ERROR(GL_INVALID_VALUE);
1534}
1535
1536static void GLAPIENTRY
1537TAG(VertexAttrib2sv)(GLuint index, const GLshort *v)
1538{
1539   GET_CURRENT_CONTEXT(ctx);
1540   if (is_vertex_position(ctx, index))
1541      ATTR2F(0, (GLfloat) v[0], (GLfloat) v[1]);
1542   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1543      ATTR2F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0], (GLfloat) v[1]);
1544   else
1545      ERROR(GL_INVALID_VALUE);
1546}
1547
1548static void GLAPIENTRY
1549TAG(VertexAttrib2dv)(GLuint index, const GLdouble *v)
1550{
1551   GET_CURRENT_CONTEXT(ctx);
1552   if (is_vertex_position(ctx, index))
1553      ATTR2F(0, (GLfloat) v[0], (GLfloat) v[1]);
1554   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1555      ATTR2F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0], (GLfloat) v[1]);
1556   else
1557      ERROR(GL_INVALID_VALUE);
1558}
1559
1560static void GLAPIENTRY
1561TAG(VertexAttrib3sv)(GLuint index, const GLshort *v)
1562{
1563   GET_CURRENT_CONTEXT(ctx);
1564   if (is_vertex_position(ctx, index))
1565      ATTR3F(0, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
1566   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1567      ATTR3F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
1568   else
1569      ERROR(GL_INVALID_VALUE);
1570}
1571
1572static void GLAPIENTRY
1573TAG(VertexAttrib3dv)(GLuint index, const GLdouble *v)
1574{
1575   GET_CURRENT_CONTEXT(ctx);
1576   if (is_vertex_position(ctx, index))
1577      ATTR3F(0, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
1578   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1579      ATTR3F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
1580   else
1581      ERROR(GL_INVALID_VALUE);
1582}
1583
1584static void GLAPIENTRY
1585TAG(VertexAttrib4sv)(GLuint index, const GLshort *v)
1586{
1587   GET_CURRENT_CONTEXT(ctx);
1588   if (is_vertex_position(ctx, index))
1589      ATTR4F(0, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1590   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1591      ATTR4F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1592   else
1593      ERROR(GL_INVALID_VALUE);
1594}
1595
1596static void GLAPIENTRY
1597TAG(VertexAttrib4dv)(GLuint index, const GLdouble *v)
1598{
1599   GET_CURRENT_CONTEXT(ctx);
1600   if (is_vertex_position(ctx, index))
1601      ATTR4F(0, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1602   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1603      ATTR4F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1604   else
1605      ERROR(GL_INVALID_VALUE);
1606}
1607
1608static void GLAPIENTRY
1609TAG(VertexAttrib4bv)(GLuint index, const GLbyte * v)
1610{
1611   GET_CURRENT_CONTEXT(ctx);
1612   if (is_vertex_position(ctx, index))
1613      ATTR4F(0, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1614   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1615      ATTR4F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1616   else
1617      ERROR(GL_INVALID_VALUE);
1618}
1619
1620static void GLAPIENTRY
1621TAG(VertexAttrib4iv)(GLuint index, const GLint * v)
1622{
1623   GET_CURRENT_CONTEXT(ctx);
1624   if (is_vertex_position(ctx, index))
1625      ATTR4F(0, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1626   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1627      ATTR4F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1628   else
1629      ERROR(GL_INVALID_VALUE);
1630}
1631
1632static void GLAPIENTRY
1633TAG(VertexAttrib4ubv)(GLuint index, const GLubyte * v)
1634{
1635   GET_CURRENT_CONTEXT(ctx);
1636   if (is_vertex_position(ctx, index))
1637      ATTR4F(0, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1638   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1639      ATTR4F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1640   else
1641      ERROR(GL_INVALID_VALUE);
1642}
1643
1644static void GLAPIENTRY
1645TAG(VertexAttrib4usv)(GLuint index, const GLushort * v)
1646{
1647   GET_CURRENT_CONTEXT(ctx);
1648   if (is_vertex_position(ctx, index))
1649      ATTR4F(0, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1650   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1651      ATTR4F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1652   else
1653      ERROR(GL_INVALID_VALUE);
1654}
1655
1656static void GLAPIENTRY
1657TAG(VertexAttrib4uiv)(GLuint index, const GLuint * v)
1658{
1659   GET_CURRENT_CONTEXT(ctx);
1660   if (is_vertex_position(ctx, index))
1661      ATTR4F(0, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1662   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1663      ATTR4F(VBO_ATTRIB_GENERIC0 + index, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat)v[3]);
1664   else
1665      ERROR(GL_INVALID_VALUE);
1666}
1667
1668static void GLAPIENTRY
1669TAG(VertexAttrib4Nbv)(GLuint index, const GLbyte * v)
1670{
1671   GET_CURRENT_CONTEXT(ctx);
1672   if (is_vertex_position(ctx, index))
1673      ATTR4F(0, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]), BYTE_TO_FLOAT(v[2]), BYTE_TO_FLOAT(v[3]));
1674   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1675      ATTR4F(VBO_ATTRIB_GENERIC0 + index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]), BYTE_TO_FLOAT(v[2]), BYTE_TO_FLOAT(v[3]));
1676   else
1677      ERROR(GL_INVALID_VALUE);
1678}
1679
1680static void GLAPIENTRY
1681TAG(VertexAttrib4Nsv)(GLuint index, const GLshort * v)
1682{
1683   GET_CURRENT_CONTEXT(ctx);
1684   if (is_vertex_position(ctx, index))
1685      ATTR4F(0, SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]), SHORT_TO_FLOAT(v[2]), SHORT_TO_FLOAT(v[3]));
1686   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1687      ATTR4F(VBO_ATTRIB_GENERIC0 + index, SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]), SHORT_TO_FLOAT(v[2]), SHORT_TO_FLOAT(v[3]));
1688   else
1689      ERROR(GL_INVALID_VALUE);
1690}
1691
1692static void GLAPIENTRY
1693TAG(VertexAttrib4Niv)(GLuint index, const GLint * v)
1694{
1695   GET_CURRENT_CONTEXT(ctx);
1696   if (is_vertex_position(ctx, index))
1697      ATTR4F(0, INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]), INT_TO_FLOAT(v[2]), INT_TO_FLOAT(v[3]));
1698   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1699      ATTR4F(VBO_ATTRIB_GENERIC0 + index, INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]), INT_TO_FLOAT(v[2]), INT_TO_FLOAT(v[3]));
1700   else
1701      ERROR(GL_INVALID_VALUE);
1702}
1703
1704static void GLAPIENTRY
1705TAG(VertexAttrib4Nub)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w)
1706{
1707   GET_CURRENT_CONTEXT(ctx);
1708   if (is_vertex_position(ctx, index))
1709      ATTR4F(0, UBYTE_TO_FLOAT(x), UBYTE_TO_FLOAT(y), UBYTE_TO_FLOAT(z), UBYTE_TO_FLOAT(w));
1710   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1711      ATTR4F(VBO_ATTRIB_GENERIC0 + index, UBYTE_TO_FLOAT(x), UBYTE_TO_FLOAT(y), UBYTE_TO_FLOAT(z), UBYTE_TO_FLOAT(w));
1712   else
1713      ERROR(GL_INVALID_VALUE);
1714}
1715
1716static void GLAPIENTRY
1717TAG(VertexAttrib4Nubv)(GLuint index, const GLubyte * v)
1718{
1719   GET_CURRENT_CONTEXT(ctx);
1720   if (is_vertex_position(ctx, index))
1721      ATTR4F(0, UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]), UBYTE_TO_FLOAT(v[2]), UBYTE_TO_FLOAT(v[3]));
1722   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1723      ATTR4F(VBO_ATTRIB_GENERIC0 + index, UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]), UBYTE_TO_FLOAT(v[2]), UBYTE_TO_FLOAT(v[3]));
1724   else
1725      ERROR(GL_INVALID_VALUE);
1726}
1727
1728static void GLAPIENTRY
1729TAG(VertexAttrib4Nusv)(GLuint index, const GLushort * v)
1730{
1731   GET_CURRENT_CONTEXT(ctx);
1732   if (is_vertex_position(ctx, index))
1733      ATTR4F(0, USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]), USHORT_TO_FLOAT(v[2]), USHORT_TO_FLOAT(v[3]));
1734   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1735      ATTR4F(VBO_ATTRIB_GENERIC0 + index, USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]), USHORT_TO_FLOAT(v[2]), USHORT_TO_FLOAT(v[3]));
1736   else
1737      ERROR(GL_INVALID_VALUE);
1738}
1739
1740static void GLAPIENTRY
1741TAG(VertexAttrib4Nuiv)(GLuint index, const GLuint * v)
1742{
1743   GET_CURRENT_CONTEXT(ctx);
1744   if (is_vertex_position(ctx, index))
1745      ATTR4F(0, UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]), UINT_TO_FLOAT(v[2]), UINT_TO_FLOAT(v[3]));
1746   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1747      ATTR4F(VBO_ATTRIB_GENERIC0 + index, UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]), UINT_TO_FLOAT(v[2]), UINT_TO_FLOAT(v[3]));
1748   else
1749      ERROR(GL_INVALID_VALUE);
1750}
1751
1752/**
1753 * GL_EXT_gpu_shader / GL 3.0 signed/unsigned integer-valued attributes.
1754 * Note that attribute indexes do NOT alias conventional attributes.
1755 */
1756
1757static void GLAPIENTRY
1758TAG(VertexAttribI1iv)(GLuint index, const GLint *v)
1759{
1760   GET_CURRENT_CONTEXT(ctx);
1761   if (is_vertex_position(ctx, index))
1762      ATTR1I(0, v[0]);
1763   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1764      ATTR1I(VBO_ATTRIB_GENERIC0 + index, v[0]);
1765   else
1766      ERROR(GL_INVALID_VALUE);
1767}
1768
1769static void GLAPIENTRY
1770TAG(VertexAttribI1uiv)(GLuint index, const GLuint *v)
1771{
1772   GET_CURRENT_CONTEXT(ctx);
1773   if (is_vertex_position(ctx, index))
1774      ATTR1UI(0, v[0]);
1775   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1776      ATTR1UI(VBO_ATTRIB_GENERIC0 + index, v[0]);
1777   else
1778      ERROR(GL_INVALID_VALUE);
1779}
1780
1781static void GLAPIENTRY
1782TAG(VertexAttribI4bv)(GLuint index, const GLbyte *v)
1783{
1784   GET_CURRENT_CONTEXT(ctx);
1785   if (is_vertex_position(ctx, index))
1786      ATTR4I(0, v[0], v[1], v[2], v[3]);
1787   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1788      ATTR4I(VBO_ATTRIB_GENERIC0 + index, v[0], v[1], v[2], v[3]);
1789   else
1790      ERROR(GL_INVALID_VALUE);
1791}
1792
1793static void GLAPIENTRY
1794TAG(VertexAttribI4sv)(GLuint index, const GLshort *v)
1795{
1796   GET_CURRENT_CONTEXT(ctx);
1797   if (is_vertex_position(ctx, index))
1798      ATTR4I(0, v[0], v[1], v[2], v[3]);
1799   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1800      ATTR4I(VBO_ATTRIB_GENERIC0 + index, v[0], v[1], v[2], v[3]);
1801   else
1802      ERROR(GL_INVALID_VALUE);
1803}
1804
1805static void GLAPIENTRY
1806TAG(VertexAttribI4ubv)(GLuint index, const GLubyte *v)
1807{
1808   GET_CURRENT_CONTEXT(ctx);
1809   if (is_vertex_position(ctx, index))
1810      ATTR4UI(0, v[0], v[1], v[2], v[3]);
1811   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1812      ATTR4UI(VBO_ATTRIB_GENERIC0 + index, v[0], v[1], v[2], v[3]);
1813   else
1814      ERROR(GL_INVALID_VALUE);
1815}
1816
1817static void GLAPIENTRY
1818TAG(VertexAttribI4usv)(GLuint index, const GLushort *v)
1819{
1820   GET_CURRENT_CONTEXT(ctx);
1821   if (is_vertex_position(ctx, index))
1822      ATTR4UI(0, v[0], v[1], v[2], v[3]);
1823   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1824      ATTR4UI(VBO_ATTRIB_GENERIC0 + index, v[0], v[1], v[2], v[3]);
1825   else
1826      ERROR(GL_INVALID_VALUE);
1827}
1828
1829/* define this macro to exclude folllowing none-vertex functions */
1830#ifndef HW_SELECT_MODE
1831
1832static void GLAPIENTRY
1833TAG(TexCoord1f)(GLfloat x)
1834{
1835   GET_CURRENT_CONTEXT(ctx);
1836   ATTR1F(VBO_ATTRIB_TEX0, x);
1837}
1838
1839static void GLAPIENTRY
1840TAG(TexCoord1fv)(const GLfloat * v)
1841{
1842   GET_CURRENT_CONTEXT(ctx);
1843   ATTR1FV(VBO_ATTRIB_TEX0, v);
1844}
1845
1846static void GLAPIENTRY
1847TAG(TexCoord2f)(GLfloat x, GLfloat y)
1848{
1849   GET_CURRENT_CONTEXT(ctx);
1850   ATTR2F(VBO_ATTRIB_TEX0, x, y);
1851}
1852
1853static void GLAPIENTRY
1854TAG(TexCoord2fv)(const GLfloat * v)
1855{
1856   GET_CURRENT_CONTEXT(ctx);
1857   ATTR2FV(VBO_ATTRIB_TEX0, v);
1858}
1859
1860static void GLAPIENTRY
1861TAG(TexCoord3f)(GLfloat x, GLfloat y, GLfloat z)
1862{
1863   GET_CURRENT_CONTEXT(ctx);
1864   ATTR3F(VBO_ATTRIB_TEX0, x, y, z);
1865}
1866
1867static void GLAPIENTRY
1868TAG(TexCoord3fv)(const GLfloat * v)
1869{
1870   GET_CURRENT_CONTEXT(ctx);
1871   ATTR3FV(VBO_ATTRIB_TEX0, v);
1872}
1873
1874static void GLAPIENTRY
1875TAG(TexCoord4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1876{
1877   GET_CURRENT_CONTEXT(ctx);
1878   ATTR4F(VBO_ATTRIB_TEX0, x, y, z, w);
1879}
1880
1881static void GLAPIENTRY
1882TAG(TexCoord4fv)(const GLfloat * v)
1883{
1884   GET_CURRENT_CONTEXT(ctx);
1885   ATTR4FV(VBO_ATTRIB_TEX0, v);
1886}
1887
1888
1889
1890static void GLAPIENTRY
1891TAG(Normal3f)(GLfloat x, GLfloat y, GLfloat z)
1892{
1893   GET_CURRENT_CONTEXT(ctx);
1894   ATTR3F(VBO_ATTRIB_NORMAL, x, y, z);
1895}
1896
1897static void GLAPIENTRY
1898TAG(Normal3fv)(const GLfloat * v)
1899{
1900   GET_CURRENT_CONTEXT(ctx);
1901   ATTR3FV(VBO_ATTRIB_NORMAL, v);
1902}
1903
1904
1905
1906static void GLAPIENTRY
1907TAG(FogCoordfEXT)(GLfloat x)
1908{
1909   GET_CURRENT_CONTEXT(ctx);
1910   ATTR1F(VBO_ATTRIB_FOG, x);
1911}
1912
1913
1914
1915static void GLAPIENTRY
1916TAG(FogCoordfvEXT)(const GLfloat * v)
1917{
1918   GET_CURRENT_CONTEXT(ctx);
1919   ATTR1FV(VBO_ATTRIB_FOG, v);
1920}
1921
1922static void GLAPIENTRY
1923TAG(Color3f)(GLfloat x, GLfloat y, GLfloat z)
1924{
1925   GET_CURRENT_CONTEXT(ctx);
1926   ATTR3F(VBO_ATTRIB_COLOR0, x, y, z);
1927}
1928
1929static void GLAPIENTRY
1930TAG(Color3fv)(const GLfloat * v)
1931{
1932   GET_CURRENT_CONTEXT(ctx);
1933   ATTR3FV(VBO_ATTRIB_COLOR0, v);
1934}
1935
1936static void GLAPIENTRY
1937TAG(Color4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
1938{
1939   GET_CURRENT_CONTEXT(ctx);
1940   ATTR4F(VBO_ATTRIB_COLOR0, x, y, z, w);
1941}
1942
1943static void GLAPIENTRY
1944TAG(Color4fv)(const GLfloat * v)
1945{
1946   GET_CURRENT_CONTEXT(ctx);
1947   ATTR4FV(VBO_ATTRIB_COLOR0, v);
1948}
1949
1950
1951
1952static void GLAPIENTRY
1953TAG(SecondaryColor3fEXT)(GLfloat x, GLfloat y, GLfloat z)
1954{
1955   GET_CURRENT_CONTEXT(ctx);
1956   ATTR3F(VBO_ATTRIB_COLOR1, x, y, z);
1957}
1958
1959static void GLAPIENTRY
1960TAG(SecondaryColor3fvEXT)(const GLfloat * v)
1961{
1962   GET_CURRENT_CONTEXT(ctx);
1963   ATTR3FV(VBO_ATTRIB_COLOR1, v);
1964}
1965
1966
1967
1968static void GLAPIENTRY
1969TAG(EdgeFlag)(GLboolean b)
1970{
1971   GET_CURRENT_CONTEXT(ctx);
1972   ATTR1F(VBO_ATTRIB_EDGEFLAG, (GLfloat) b);
1973}
1974
1975
1976
1977static void GLAPIENTRY
1978TAG(Indexf)(GLfloat f)
1979{
1980   GET_CURRENT_CONTEXT(ctx);
1981   ATTR1F(VBO_ATTRIB_COLOR_INDEX, f);
1982}
1983
1984static void GLAPIENTRY
1985TAG(Indexfv)(const GLfloat * f)
1986{
1987   GET_CURRENT_CONTEXT(ctx);
1988   ATTR1FV(VBO_ATTRIB_COLOR_INDEX, f);
1989}
1990
1991
1992
1993static void GLAPIENTRY
1994TAG(MultiTexCoord1fARB)(GLenum target, GLfloat x)
1995{
1996   GET_CURRENT_CONTEXT(ctx);
1997   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1998   ATTR1F(attr, x);
1999}
2000
2001static void GLAPIENTRY
2002TAG(MultiTexCoord1fvARB)(GLenum target, const GLfloat * v)
2003{
2004   GET_CURRENT_CONTEXT(ctx);
2005   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2006   ATTR1FV(attr, v);
2007}
2008
2009static void GLAPIENTRY
2010TAG(MultiTexCoord2fARB)(GLenum target, GLfloat x, GLfloat y)
2011{
2012   GET_CURRENT_CONTEXT(ctx);
2013   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2014   ATTR2F(attr, x, y);
2015}
2016
2017static void GLAPIENTRY
2018TAG(MultiTexCoord2fvARB)(GLenum target, const GLfloat * v)
2019{
2020   GET_CURRENT_CONTEXT(ctx);
2021   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2022   ATTR2FV(attr, v);
2023}
2024
2025static void GLAPIENTRY
2026TAG(MultiTexCoord3fARB)(GLenum target, GLfloat x, GLfloat y, GLfloat z)
2027{
2028   GET_CURRENT_CONTEXT(ctx);
2029   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2030   ATTR3F(attr, x, y, z);
2031}
2032
2033static void GLAPIENTRY
2034TAG(MultiTexCoord3fvARB)(GLenum target, const GLfloat * v)
2035{
2036   GET_CURRENT_CONTEXT(ctx);
2037   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2038   ATTR3FV(attr, v);
2039}
2040
2041static void GLAPIENTRY
2042TAG(MultiTexCoord4fARB)(GLenum target, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
2043{
2044   GET_CURRENT_CONTEXT(ctx);
2045   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2046   ATTR4F(attr, x, y, z, w);
2047}
2048
2049static void GLAPIENTRY
2050TAG(MultiTexCoord4fvARB)(GLenum target, const GLfloat * v)
2051{
2052   GET_CURRENT_CONTEXT(ctx);
2053   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2054   ATTR4FV(attr, v);
2055}
2056
2057static void GLAPIENTRY
2058TAG(TexCoordP1ui)(GLenum type, GLuint coords)
2059{
2060   GET_CURRENT_CONTEXT(ctx);
2061   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP1ui");
2062   ATTR_UI(ctx, 1, type, 0, VBO_ATTRIB_TEX0, coords);
2063}
2064
2065static void GLAPIENTRY
2066TAG(TexCoordP1uiv)(GLenum type, const GLuint *coords)
2067{
2068   GET_CURRENT_CONTEXT(ctx);
2069   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP1uiv");
2070   ATTR_UI(ctx, 1, type, 0, VBO_ATTRIB_TEX0, coords[0]);
2071}
2072
2073static void GLAPIENTRY
2074TAG(TexCoordP2ui)(GLenum type, GLuint coords)
2075{
2076   GET_CURRENT_CONTEXT(ctx);
2077   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP2ui");
2078   ATTR_UI(ctx, 2, type, 0, VBO_ATTRIB_TEX0, coords);
2079}
2080
2081static void GLAPIENTRY
2082TAG(TexCoordP2uiv)(GLenum type, const GLuint *coords)
2083{
2084   GET_CURRENT_CONTEXT(ctx);
2085   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP2uiv");
2086   ATTR_UI(ctx, 2, type, 0, VBO_ATTRIB_TEX0, coords[0]);
2087}
2088
2089static void GLAPIENTRY
2090TAG(TexCoordP3ui)(GLenum type, GLuint coords)
2091{
2092   GET_CURRENT_CONTEXT(ctx);
2093   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP3ui");
2094   ATTR_UI(ctx, 3, type, 0, VBO_ATTRIB_TEX0, coords);
2095}
2096
2097static void GLAPIENTRY
2098TAG(TexCoordP3uiv)(GLenum type, const GLuint *coords)
2099{
2100   GET_CURRENT_CONTEXT(ctx);
2101   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP3uiv");
2102   ATTR_UI(ctx, 3, type, 0, VBO_ATTRIB_TEX0, coords[0]);
2103}
2104
2105static void GLAPIENTRY
2106TAG(TexCoordP4ui)(GLenum type, GLuint coords)
2107{
2108   GET_CURRENT_CONTEXT(ctx);
2109   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP4ui");
2110   ATTR_UI(ctx, 4, type, 0, VBO_ATTRIB_TEX0, coords);
2111}
2112
2113static void GLAPIENTRY
2114TAG(TexCoordP4uiv)(GLenum type, const GLuint *coords)
2115{
2116   GET_CURRENT_CONTEXT(ctx);
2117   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP4uiv");
2118   ATTR_UI(ctx, 4, type, 0, VBO_ATTRIB_TEX0, coords[0]);
2119}
2120
2121static void GLAPIENTRY
2122TAG(MultiTexCoordP1ui)(GLenum target, GLenum type, GLuint coords)
2123{
2124   GET_CURRENT_CONTEXT(ctx);
2125   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2126   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP1ui");
2127   ATTR_UI(ctx, 1, type, 0, attr, coords);
2128}
2129
2130static void GLAPIENTRY
2131TAG(MultiTexCoordP1uiv)(GLenum target, GLenum type, const GLuint *coords)
2132{
2133   GET_CURRENT_CONTEXT(ctx);
2134   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2135   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP1uiv");
2136   ATTR_UI(ctx, 1, type, 0, attr, coords[0]);
2137}
2138
2139static void GLAPIENTRY
2140TAG(MultiTexCoordP2ui)(GLenum target, GLenum type, GLuint coords)
2141{
2142   GET_CURRENT_CONTEXT(ctx);
2143   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2144   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP2ui");
2145   ATTR_UI(ctx, 2, type, 0, attr, coords);
2146}
2147
2148static void GLAPIENTRY
2149TAG(MultiTexCoordP2uiv)(GLenum target, GLenum type, const GLuint *coords)
2150{
2151   GET_CURRENT_CONTEXT(ctx);
2152   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2153   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP2uiv");
2154   ATTR_UI(ctx, 2, type, 0, attr, coords[0]);
2155}
2156
2157static void GLAPIENTRY
2158TAG(MultiTexCoordP3ui)(GLenum target, GLenum type, GLuint coords)
2159{
2160   GET_CURRENT_CONTEXT(ctx);
2161   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2162   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP3ui");
2163   ATTR_UI(ctx, 3, type, 0, attr, coords);
2164}
2165
2166static void GLAPIENTRY
2167TAG(MultiTexCoordP3uiv)(GLenum target, GLenum type, const GLuint *coords)
2168{
2169   GET_CURRENT_CONTEXT(ctx);
2170   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2171   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP3uiv");
2172   ATTR_UI(ctx, 3, type, 0, attr, coords[0]);
2173}
2174
2175static void GLAPIENTRY
2176TAG(MultiTexCoordP4ui)(GLenum target, GLenum type, GLuint coords)
2177{
2178   GET_CURRENT_CONTEXT(ctx);
2179   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2180   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP4ui");
2181   ATTR_UI(ctx, 4, type, 0, attr, coords);
2182}
2183
2184static void GLAPIENTRY
2185TAG(MultiTexCoordP4uiv)(GLenum target, GLenum type, const GLuint *coords)
2186{
2187   GET_CURRENT_CONTEXT(ctx);
2188   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2189   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP4uiv");
2190   ATTR_UI(ctx, 4, type, 0, attr, coords[0]);
2191}
2192
2193static void GLAPIENTRY
2194TAG(NormalP3ui)(GLenum type, GLuint coords)
2195{
2196   GET_CURRENT_CONTEXT(ctx);
2197   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glNormalP3ui");
2198   ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_NORMAL, coords);
2199}
2200
2201static void GLAPIENTRY
2202TAG(NormalP3uiv)(GLenum type, const GLuint *coords)
2203{
2204   GET_CURRENT_CONTEXT(ctx);
2205   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glNormalP3uiv");
2206   ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_NORMAL, coords[0]);
2207}
2208
2209static void GLAPIENTRY
2210TAG(ColorP3ui)(GLenum type, GLuint color)
2211{
2212   GET_CURRENT_CONTEXT(ctx);
2213   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP3ui");
2214   ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_COLOR0, color);
2215}
2216
2217static void GLAPIENTRY
2218TAG(ColorP3uiv)(GLenum type, const GLuint *color)
2219{
2220   GET_CURRENT_CONTEXT(ctx);
2221   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP3uiv");
2222   ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_COLOR0, color[0]);
2223}
2224
2225static void GLAPIENTRY
2226TAG(ColorP4ui)(GLenum type, GLuint color)
2227{
2228   GET_CURRENT_CONTEXT(ctx);
2229   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP4ui");
2230   ATTR_UI(ctx, 4, type, 1, VBO_ATTRIB_COLOR0, color);
2231}
2232
2233static void GLAPIENTRY
2234TAG(ColorP4uiv)(GLenum type, const GLuint *color)
2235{
2236   GET_CURRENT_CONTEXT(ctx);
2237   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP4uiv");
2238   ATTR_UI(ctx, 4, type, 1, VBO_ATTRIB_COLOR0, color[0]);
2239}
2240
2241static void GLAPIENTRY
2242TAG(SecondaryColorP3ui)(GLenum type, GLuint color)
2243{
2244   GET_CURRENT_CONTEXT(ctx);
2245   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glSecondaryColorP3ui");
2246   ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_COLOR1, color);
2247}
2248
2249static void GLAPIENTRY
2250TAG(SecondaryColorP3uiv)(GLenum type, const GLuint *color)
2251{
2252   GET_CURRENT_CONTEXT(ctx);
2253   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glSecondaryColorP3uiv");
2254   ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_COLOR1, color[0]);
2255}
2256
2257static void GLAPIENTRY
2258TAG(Normal3hNV)(GLhalfNV x, GLhalfNV y, GLhalfNV z)
2259{
2260   GET_CURRENT_CONTEXT(ctx);
2261   ATTR3H(VBO_ATTRIB_NORMAL, x, y, z);
2262}
2263
2264static void GLAPIENTRY
2265TAG(Normal3hvNV)(const GLhalfNV * v)
2266{
2267   GET_CURRENT_CONTEXT(ctx);
2268   ATTR3HV(VBO_ATTRIB_NORMAL, v);
2269}
2270
2271
2272
2273static void GLAPIENTRY
2274TAG(Color3hNV)(GLhalfNV x, GLhalfNV y, GLhalfNV z)
2275{
2276   GET_CURRENT_CONTEXT(ctx);
2277   ATTR3H(VBO_ATTRIB_COLOR0, x, y, z);
2278}
2279
2280static void GLAPIENTRY
2281TAG(Color3hvNV)(const GLhalfNV * v)
2282{
2283   GET_CURRENT_CONTEXT(ctx);
2284   ATTR3HV(VBO_ATTRIB_COLOR0, v);
2285}
2286
2287static void GLAPIENTRY
2288TAG(Color4hNV)(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w)
2289{
2290   GET_CURRENT_CONTEXT(ctx);
2291   ATTR4H(VBO_ATTRIB_COLOR0, x, y, z, w);
2292}
2293
2294static void GLAPIENTRY
2295TAG(Color4hvNV)(const GLhalfNV * v)
2296{
2297   GET_CURRENT_CONTEXT(ctx);
2298   ATTR4HV(VBO_ATTRIB_COLOR0, v);
2299}
2300
2301
2302
2303static void GLAPIENTRY
2304TAG(TexCoord1hNV)(GLhalfNV x)
2305{
2306   GET_CURRENT_CONTEXT(ctx);
2307   ATTR1H(VBO_ATTRIB_TEX0, x);
2308}
2309
2310static void GLAPIENTRY
2311TAG(TexCoord1hvNV)(const GLhalfNV * v)
2312{
2313   GET_CURRENT_CONTEXT(ctx);
2314   ATTR1HV(VBO_ATTRIB_TEX0, v);
2315}
2316
2317static void GLAPIENTRY
2318TAG(TexCoord2hNV)(GLhalfNV x, GLhalfNV y)
2319{
2320   GET_CURRENT_CONTEXT(ctx);
2321   ATTR2H(VBO_ATTRIB_TEX0, x, y);
2322}
2323
2324static void GLAPIENTRY
2325TAG(TexCoord2hvNV)(const GLhalfNV * v)
2326{
2327   GET_CURRENT_CONTEXT(ctx);
2328   ATTR2HV(VBO_ATTRIB_TEX0, v);
2329}
2330
2331static void GLAPIENTRY
2332TAG(TexCoord3hNV)(GLhalfNV x, GLhalfNV y, GLhalfNV z)
2333{
2334   GET_CURRENT_CONTEXT(ctx);
2335   ATTR3H(VBO_ATTRIB_TEX0, x, y, z);
2336}
2337
2338static void GLAPIENTRY
2339TAG(TexCoord3hvNV)(const GLhalfNV * v)
2340{
2341   GET_CURRENT_CONTEXT(ctx);
2342   ATTR3HV(VBO_ATTRIB_TEX0, v);
2343}
2344
2345static void GLAPIENTRY
2346TAG(TexCoord4hNV)(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w)
2347{
2348   GET_CURRENT_CONTEXT(ctx);
2349   ATTR4H(VBO_ATTRIB_TEX0, x, y, z, w);
2350}
2351
2352static void GLAPIENTRY
2353TAG(TexCoord4hvNV)(const GLhalfNV * v)
2354{
2355   GET_CURRENT_CONTEXT(ctx);
2356   ATTR4HV(VBO_ATTRIB_TEX0, v);
2357}
2358
2359
2360
2361static void GLAPIENTRY
2362TAG(MultiTexCoord1hNV)(GLenum target, GLhalfNV x)
2363{
2364   GET_CURRENT_CONTEXT(ctx);
2365   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2366   ATTR1H(attr, x);
2367}
2368
2369static void GLAPIENTRY
2370TAG(MultiTexCoord1hvNV)(GLenum target, const GLhalfNV * v)
2371{
2372   GET_CURRENT_CONTEXT(ctx);
2373   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2374   ATTR1HV(attr, v);
2375}
2376
2377static void GLAPIENTRY
2378TAG(MultiTexCoord2hNV)(GLenum target, GLhalfNV x, GLhalfNV y)
2379{
2380   GET_CURRENT_CONTEXT(ctx);
2381   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2382   ATTR2H(attr, x, y);
2383}
2384
2385static void GLAPIENTRY
2386TAG(MultiTexCoord2hvNV)(GLenum target, const GLhalfNV * v)
2387{
2388   GET_CURRENT_CONTEXT(ctx);
2389   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2390   ATTR2HV(attr, v);
2391}
2392
2393static void GLAPIENTRY
2394TAG(MultiTexCoord3hNV)(GLenum target, GLhalfNV x, GLhalfNV y, GLhalfNV z)
2395{
2396   GET_CURRENT_CONTEXT(ctx);
2397   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2398   ATTR3H(attr, x, y, z);
2399}
2400
2401static void GLAPIENTRY
2402TAG(MultiTexCoord3hvNV)(GLenum target, const GLhalfNV * v)
2403{
2404   GET_CURRENT_CONTEXT(ctx);
2405   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2406   ATTR3HV(attr, v);
2407}
2408
2409static void GLAPIENTRY
2410TAG(MultiTexCoord4hNV)(GLenum target, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w)
2411{
2412   GET_CURRENT_CONTEXT(ctx);
2413   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2414   ATTR4H(attr, x, y, z, w);
2415}
2416
2417static void GLAPIENTRY
2418TAG(MultiTexCoord4hvNV)(GLenum target, const GLhalfNV * v)
2419{
2420   GET_CURRENT_CONTEXT(ctx);
2421   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2422   ATTR4HV(attr, v);
2423}
2424
2425
2426static void GLAPIENTRY
2427TAG(FogCoordhNV)(GLhalf x)
2428{
2429   GET_CURRENT_CONTEXT(ctx);
2430   ATTR1H(VBO_ATTRIB_FOG, x);
2431}
2432
2433static void GLAPIENTRY
2434TAG(FogCoordhvNV)(const GLhalf * v)
2435{
2436   GET_CURRENT_CONTEXT(ctx);
2437   ATTR1HV(VBO_ATTRIB_FOG, v);
2438}
2439
2440
2441
2442static void GLAPIENTRY
2443TAG(SecondaryColor3hNV)(GLhalfNV x, GLhalfNV y, GLhalfNV z)
2444{
2445   GET_CURRENT_CONTEXT(ctx);
2446   ATTR3H(VBO_ATTRIB_COLOR1, x, y, z);
2447}
2448
2449static void GLAPIENTRY
2450TAG(SecondaryColor3hvNV)(const GLhalfNV * v)
2451{
2452   GET_CURRENT_CONTEXT(ctx);
2453   ATTR3HV(VBO_ATTRIB_COLOR1, v);
2454}
2455
2456
2457static void GLAPIENTRY
2458TAG(Color3b)(GLbyte red, GLbyte green, GLbyte blue)
2459{
2460   GET_CURRENT_CONTEXT(ctx);
2461   ATTR4F(VBO_ATTRIB_COLOR0, BYTE_TO_FLOAT(red),
2462          BYTE_TO_FLOAT(green),
2463          BYTE_TO_FLOAT(blue),
2464          1.0);
2465}
2466
2467static void GLAPIENTRY
2468TAG(Color3d)(GLdouble red, GLdouble green, GLdouble blue)
2469{
2470   GET_CURRENT_CONTEXT(ctx);
2471   ATTR4F(VBO_ATTRIB_COLOR0, (GLfloat) red, (GLfloat) green, (GLfloat) blue, 1.0);
2472}
2473
2474static void GLAPIENTRY
2475TAG(Color3i)(GLint red, GLint green, GLint blue)
2476{
2477   GET_CURRENT_CONTEXT(ctx);
2478   ATTR4F(VBO_ATTRIB_COLOR0, INT_TO_FLOAT(red), INT_TO_FLOAT(green),
2479          INT_TO_FLOAT(blue), 1.0);
2480}
2481
2482static void GLAPIENTRY
2483TAG(Color3s)(GLshort red, GLshort green, GLshort blue)
2484{
2485   GET_CURRENT_CONTEXT(ctx);
2486   ATTR4F(VBO_ATTRIB_COLOR0, SHORT_TO_FLOAT(red), SHORT_TO_FLOAT(green),
2487          SHORT_TO_FLOAT(blue), 1.0);
2488}
2489
2490static void GLAPIENTRY
2491TAG(Color3ui)(GLuint red, GLuint green, GLuint blue)
2492{
2493   GET_CURRENT_CONTEXT(ctx);
2494   ATTR4F(VBO_ATTRIB_COLOR0, UINT_TO_FLOAT(red), UINT_TO_FLOAT(green),
2495          UINT_TO_FLOAT(blue), 1.0);
2496}
2497
2498static void GLAPIENTRY
2499TAG(Color3us)(GLushort red, GLushort green, GLushort blue)
2500{
2501   GET_CURRENT_CONTEXT(ctx);
2502   ATTR4F(VBO_ATTRIB_COLOR0, USHORT_TO_FLOAT(red), USHORT_TO_FLOAT(green),
2503          USHORT_TO_FLOAT(blue), 1.0);
2504}
2505
2506static void GLAPIENTRY
2507TAG(Color3ub)(GLubyte red, GLubyte green, GLubyte blue)
2508{
2509   GET_CURRENT_CONTEXT(ctx);
2510   ATTR4F(VBO_ATTRIB_COLOR0, UBYTE_TO_FLOAT(red), UBYTE_TO_FLOAT(green),
2511          UBYTE_TO_FLOAT(blue), 1.0);
2512}
2513
2514
2515static void GLAPIENTRY
2516TAG(Color3bv)(const GLbyte *v)
2517{
2518   GET_CURRENT_CONTEXT(ctx);
2519   ATTR4F(VBO_ATTRIB_COLOR0, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]),
2520         BYTE_TO_FLOAT(v[2]), 1.0);
2521}
2522
2523static void GLAPIENTRY
2524TAG(Color3dv)(const GLdouble *v)
2525{
2526   GET_CURRENT_CONTEXT(ctx);
2527   ATTR4F(VBO_ATTRIB_COLOR0, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], 1.0);
2528}
2529
2530static void GLAPIENTRY
2531TAG(Color3iv)(const GLint *v)
2532{
2533   GET_CURRENT_CONTEXT(ctx);
2534   ATTR4F(VBO_ATTRIB_COLOR0, INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]),
2535         INT_TO_FLOAT(v[2]), 1.0);
2536}
2537
2538static void GLAPIENTRY
2539TAG(Color3sv)(const GLshort *v)
2540{
2541   GET_CURRENT_CONTEXT(ctx);
2542   ATTR4F(VBO_ATTRIB_COLOR0, SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]),
2543         SHORT_TO_FLOAT(v[2]), 1.0);
2544}
2545
2546static void GLAPIENTRY
2547TAG(Color3uiv)(const GLuint *v)
2548{
2549   GET_CURRENT_CONTEXT(ctx);
2550   ATTR4F(VBO_ATTRIB_COLOR0, UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]),
2551         UINT_TO_FLOAT(v[2]), 1.0);
2552}
2553
2554static void GLAPIENTRY
2555TAG(Color3usv)(const GLushort *v)
2556{
2557   GET_CURRENT_CONTEXT(ctx);
2558   ATTR4F(VBO_ATTRIB_COLOR0, USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]),
2559         USHORT_TO_FLOAT(v[2]), 1.0);
2560}
2561
2562static void GLAPIENTRY
2563TAG(Color3ubv)(const GLubyte *v)
2564{
2565   GET_CURRENT_CONTEXT(ctx);
2566   ATTR4F(VBO_ATTRIB_COLOR0, UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]),
2567         UBYTE_TO_FLOAT(v[2]), 1.0);
2568}
2569
2570
2571static void GLAPIENTRY
2572TAG(Color4b)(GLbyte red, GLbyte green, GLbyte blue,
2573              GLbyte alpha)
2574{
2575   GET_CURRENT_CONTEXT(ctx);
2576   ATTR4F(VBO_ATTRIB_COLOR0, BYTE_TO_FLOAT(red), BYTE_TO_FLOAT(green),
2577          BYTE_TO_FLOAT(blue), BYTE_TO_FLOAT(alpha));
2578}
2579
2580static void GLAPIENTRY
2581TAG(Color4d)(GLdouble red, GLdouble green, GLdouble blue,
2582              GLdouble alpha)
2583{
2584   GET_CURRENT_CONTEXT(ctx);
2585   ATTR4F(VBO_ATTRIB_COLOR0, (GLfloat) red, (GLfloat) green, (GLfloat) blue, (GLfloat) alpha);
2586}
2587
2588static void GLAPIENTRY
2589TAG(Color4i)(GLint red, GLint green, GLint blue, GLint alpha)
2590{
2591   GET_CURRENT_CONTEXT(ctx);
2592   ATTR4F(VBO_ATTRIB_COLOR0, INT_TO_FLOAT(red), INT_TO_FLOAT(green),
2593          INT_TO_FLOAT(blue), INT_TO_FLOAT(alpha));
2594}
2595
2596static void GLAPIENTRY
2597TAG(Color4s)(GLshort red, GLshort green, GLshort blue,
2598              GLshort alpha)
2599{
2600   GET_CURRENT_CONTEXT(ctx);
2601   ATTR4F(VBO_ATTRIB_COLOR0, SHORT_TO_FLOAT(red), SHORT_TO_FLOAT(green),
2602          SHORT_TO_FLOAT(blue), SHORT_TO_FLOAT(alpha));
2603}
2604
2605static void GLAPIENTRY
2606TAG(Color4ui)(GLuint red, GLuint green, GLuint blue, GLuint alpha)
2607{
2608   GET_CURRENT_CONTEXT(ctx);
2609   ATTR4F(VBO_ATTRIB_COLOR0, UINT_TO_FLOAT(red), UINT_TO_FLOAT(green),
2610          UINT_TO_FLOAT(blue), UINT_TO_FLOAT(alpha));
2611}
2612
2613static void GLAPIENTRY
2614TAG(Color4us)(GLushort red, GLushort green, GLushort blue, GLushort alpha)
2615{
2616   GET_CURRENT_CONTEXT(ctx);
2617   ATTR4F(VBO_ATTRIB_COLOR0, USHORT_TO_FLOAT(red), USHORT_TO_FLOAT(green),
2618          USHORT_TO_FLOAT(blue), USHORT_TO_FLOAT(alpha));
2619}
2620
2621static void GLAPIENTRY
2622TAG(Color4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
2623{
2624   GET_CURRENT_CONTEXT(ctx);
2625   ATTR4F(VBO_ATTRIB_COLOR0, UBYTE_TO_FLOAT(red), UBYTE_TO_FLOAT(green),
2626          UBYTE_TO_FLOAT(blue), UBYTE_TO_FLOAT(alpha));
2627}
2628
2629
2630static void GLAPIENTRY
2631TAG(Color4iv)(const GLint *v)
2632{
2633   GET_CURRENT_CONTEXT(ctx);
2634   ATTR4F(VBO_ATTRIB_COLOR0, INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]),
2635         INT_TO_FLOAT(v[2]), INT_TO_FLOAT(v[3]));
2636}
2637
2638
2639static void GLAPIENTRY
2640TAG(Color4bv)(const GLbyte *v)
2641{
2642   GET_CURRENT_CONTEXT(ctx);
2643   ATTR4F(VBO_ATTRIB_COLOR0, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]),
2644         BYTE_TO_FLOAT(v[2]), BYTE_TO_FLOAT(v[3]));
2645}
2646
2647static void GLAPIENTRY
2648TAG(Color4dv)(const GLdouble *v)
2649{
2650   GET_CURRENT_CONTEXT(ctx);
2651   ATTR4F(VBO_ATTRIB_COLOR0, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
2652}
2653
2654
2655static void GLAPIENTRY
2656TAG(Color4sv)(const GLshort *v)
2657{
2658   GET_CURRENT_CONTEXT(ctx);
2659   ATTR4F(VBO_ATTRIB_COLOR0, SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]),
2660         SHORT_TO_FLOAT(v[2]), SHORT_TO_FLOAT(v[3]));
2661}
2662
2663
2664static void GLAPIENTRY
2665TAG(Color4uiv)(const GLuint *v)
2666{
2667   GET_CURRENT_CONTEXT(ctx);
2668   ATTR4F(VBO_ATTRIB_COLOR0, UINT_TO_FLOAT(v[0]), UINT_TO_FLOAT(v[1]),
2669         UINT_TO_FLOAT(v[2]), UINT_TO_FLOAT(v[3]));
2670}
2671
2672static void GLAPIENTRY
2673TAG(Color4usv)(const GLushort *v)
2674{
2675   GET_CURRENT_CONTEXT(ctx);
2676   ATTR4F(VBO_ATTRIB_COLOR0, USHORT_TO_FLOAT(v[0]), USHORT_TO_FLOAT(v[1]),
2677         USHORT_TO_FLOAT(v[2]), USHORT_TO_FLOAT(v[3]));
2678}
2679
2680static void GLAPIENTRY
2681TAG(Color4ubv)(const GLubyte *v)
2682{
2683   GET_CURRENT_CONTEXT(ctx);
2684   ATTR4F(VBO_ATTRIB_COLOR0, UBYTE_TO_FLOAT(v[0]), UBYTE_TO_FLOAT(v[1]),
2685         UBYTE_TO_FLOAT(v[2]), UBYTE_TO_FLOAT(v[3]));
2686}
2687
2688
2689static void GLAPIENTRY
2690TAG(FogCoordd)(GLdouble d)
2691{
2692   GET_CURRENT_CONTEXT(ctx);
2693   ATTR1F(VBO_ATTRIB_FOG, (GLfloat) d);
2694}
2695
2696static void GLAPIENTRY
2697TAG(FogCoorddv)(const GLdouble *v)
2698{
2699   GET_CURRENT_CONTEXT(ctx);
2700   ATTR1F(VBO_ATTRIB_FOG, (GLfloat) *v);
2701}
2702
2703
2704static void GLAPIENTRY
2705TAG(Indexd)(GLdouble c)
2706{
2707   GET_CURRENT_CONTEXT(ctx);
2708   ATTR1F(VBO_ATTRIB_COLOR_INDEX, (GLfloat) c);
2709}
2710
2711static void GLAPIENTRY
2712TAG(Indexi)(GLint c)
2713{
2714   GET_CURRENT_CONTEXT(ctx);
2715   ATTR1F(VBO_ATTRIB_COLOR_INDEX, (GLfloat) c);
2716}
2717
2718static void GLAPIENTRY
2719TAG(Indexs)(GLshort c)
2720{
2721   GET_CURRENT_CONTEXT(ctx);
2722   ATTR1F(VBO_ATTRIB_COLOR_INDEX, (GLfloat) c);
2723}
2724
2725static void GLAPIENTRY
2726TAG(Indexub)(GLubyte c)
2727{
2728   GET_CURRENT_CONTEXT(ctx);
2729   ATTR1F(VBO_ATTRIB_COLOR_INDEX, (GLfloat) c);
2730}
2731
2732static void GLAPIENTRY
2733TAG(Indexdv)(const GLdouble *c)
2734{
2735   GET_CURRENT_CONTEXT(ctx);
2736   ATTR1F(VBO_ATTRIB_COLOR_INDEX, (GLfloat) *c);
2737}
2738
2739static void GLAPIENTRY
2740TAG(Indexiv)(const GLint *c)
2741{
2742   GET_CURRENT_CONTEXT(ctx);
2743   ATTR1F(VBO_ATTRIB_COLOR_INDEX, (GLfloat) *c);
2744}
2745
2746static void GLAPIENTRY
2747TAG(Indexsv)(const GLshort *c)
2748{
2749   GET_CURRENT_CONTEXT(ctx);
2750   ATTR1F(VBO_ATTRIB_COLOR_INDEX, (GLfloat) *c);
2751}
2752
2753static void GLAPIENTRY
2754TAG(Indexubv)(const GLubyte *c)
2755{
2756   GET_CURRENT_CONTEXT(ctx);
2757   ATTR1F(VBO_ATTRIB_COLOR_INDEX, (GLfloat) *c);
2758}
2759
2760
2761static void GLAPIENTRY
2762TAG(EdgeFlagv)(const GLboolean *flag)
2763{
2764   GET_CURRENT_CONTEXT(ctx);
2765   ATTR1F(VBO_ATTRIB_EDGEFLAG, (GLfloat)*flag);
2766}
2767
2768
2769static void GLAPIENTRY
2770TAG(Normal3b)(GLbyte nx, GLbyte ny, GLbyte nz)
2771{
2772   GET_CURRENT_CONTEXT(ctx);
2773   ATTR3F(VBO_ATTRIB_NORMAL, BYTE_TO_FLOAT(nx), BYTE_TO_FLOAT(ny), BYTE_TO_FLOAT(nz));
2774}
2775
2776static void GLAPIENTRY
2777TAG(Normal3d)(GLdouble nx, GLdouble ny, GLdouble nz)
2778{
2779   GET_CURRENT_CONTEXT(ctx);
2780   ATTR3F(VBO_ATTRIB_NORMAL, (GLfloat) nx, (GLfloat) ny, (GLfloat) nz);
2781}
2782
2783static void GLAPIENTRY
2784TAG(Normal3i)(GLint nx, GLint ny, GLint nz)
2785{
2786   GET_CURRENT_CONTEXT(ctx);
2787   ATTR3F(VBO_ATTRIB_NORMAL, INT_TO_FLOAT(nx), INT_TO_FLOAT(ny), INT_TO_FLOAT(nz));
2788}
2789
2790static void GLAPIENTRY
2791TAG(Normal3s)(GLshort nx, GLshort ny, GLshort nz)
2792{
2793   GET_CURRENT_CONTEXT(ctx);
2794   ATTR3F(VBO_ATTRIB_NORMAL, SHORT_TO_FLOAT(nx), SHORT_TO_FLOAT(ny), SHORT_TO_FLOAT(nz));
2795}
2796
2797static void GLAPIENTRY
2798TAG(Normal3bv)(const GLbyte *v)
2799{
2800   GET_CURRENT_CONTEXT(ctx);
2801   ATTR3F(VBO_ATTRIB_NORMAL, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]), BYTE_TO_FLOAT(v[2]));
2802}
2803
2804static void GLAPIENTRY
2805TAG(Normal3dv)(const GLdouble *v)
2806{
2807   GET_CURRENT_CONTEXT(ctx);
2808   ATTR3F(VBO_ATTRIB_NORMAL, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
2809}
2810
2811static void GLAPIENTRY
2812TAG(Normal3iv)(const GLint *v)
2813{
2814   GET_CURRENT_CONTEXT(ctx);
2815   ATTR3F(VBO_ATTRIB_NORMAL, INT_TO_FLOAT(v[0]), INT_TO_FLOAT(v[1]), INT_TO_FLOAT(v[2]));
2816}
2817
2818static void GLAPIENTRY
2819TAG(Normal3sv)(const GLshort *v)
2820{
2821   GET_CURRENT_CONTEXT(ctx);
2822   ATTR3F(VBO_ATTRIB_NORMAL, SHORT_TO_FLOAT(v[0]), SHORT_TO_FLOAT(v[1]), SHORT_TO_FLOAT(v[2]));
2823}
2824
2825static void GLAPIENTRY
2826TAG(TexCoord1d)(GLdouble s)
2827{
2828   GET_CURRENT_CONTEXT(ctx);
2829   ATTR1F(VBO_ATTRIB_TEX0, (GLfloat) s);
2830}
2831
2832static void GLAPIENTRY
2833TAG(TexCoord1i)(GLint s)
2834{
2835   GET_CURRENT_CONTEXT(ctx);
2836   ATTR1F(VBO_ATTRIB_TEX0, (GLfloat) s);
2837}
2838
2839static void GLAPIENTRY
2840TAG(TexCoord1s)(GLshort s)
2841{
2842   GET_CURRENT_CONTEXT(ctx);
2843   ATTR1F(VBO_ATTRIB_TEX0, (GLfloat) s);
2844}
2845
2846static void GLAPIENTRY
2847TAG(TexCoord2d)(GLdouble s, GLdouble t)
2848{
2849   GET_CURRENT_CONTEXT(ctx);
2850   ATTR2F(VBO_ATTRIB_TEX0, (GLfloat) s,(GLfloat) t);
2851}
2852
2853static void GLAPIENTRY
2854TAG(TexCoord2s)(GLshort s, GLshort t)
2855{
2856   GET_CURRENT_CONTEXT(ctx);
2857   ATTR2F(VBO_ATTRIB_TEX0, (GLfloat) s,(GLfloat) t);
2858}
2859
2860static void GLAPIENTRY
2861TAG(TexCoord2i)(GLint s, GLint t)
2862{
2863   GET_CURRENT_CONTEXT(ctx);
2864   ATTR2F(VBO_ATTRIB_TEX0, (GLfloat) s,(GLfloat) t);
2865}
2866
2867static void GLAPIENTRY
2868TAG(TexCoord3d)(GLdouble s, GLdouble t, GLdouble r)
2869{
2870   GET_CURRENT_CONTEXT(ctx);
2871   ATTR3F(VBO_ATTRIB_TEX0, (GLfloat) s,(GLfloat) t,(GLfloat) r);
2872}
2873
2874static void GLAPIENTRY
2875TAG(TexCoord3i)(GLint s, GLint t, GLint r)
2876{
2877   GET_CURRENT_CONTEXT(ctx);
2878   ATTR3F(VBO_ATTRIB_TEX0, (GLfloat) s,(GLfloat) t,(GLfloat) r);
2879}
2880
2881static void GLAPIENTRY
2882TAG(TexCoord3s)(GLshort s, GLshort t, GLshort r)
2883{
2884   GET_CURRENT_CONTEXT(ctx);
2885   ATTR3F(VBO_ATTRIB_TEX0, (GLfloat) s,(GLfloat) t,(GLfloat) r);
2886}
2887
2888static void GLAPIENTRY
2889TAG(TexCoord4d)(GLdouble s, GLdouble t, GLdouble r, GLdouble q)
2890{
2891   GET_CURRENT_CONTEXT(ctx);
2892   ATTR4F(VBO_ATTRIB_TEX0, (GLfloat) s,(GLfloat) t,(GLfloat) r,(GLfloat) q);
2893}
2894
2895static void GLAPIENTRY
2896TAG(TexCoord4i)(GLint s, GLint t, GLint r, GLint q)
2897{
2898   GET_CURRENT_CONTEXT(ctx);
2899   ATTR4F(VBO_ATTRIB_TEX0, (GLfloat) s,(GLfloat) t,(GLfloat) r,(GLfloat) q);
2900}
2901
2902static void GLAPIENTRY
2903TAG(TexCoord4s)(GLshort s, GLshort t, GLshort r, GLshort q)
2904{
2905   GET_CURRENT_CONTEXT(ctx);
2906   ATTR4F(VBO_ATTRIB_TEX0, (GLfloat) s,(GLfloat) t,(GLfloat) r,(GLfloat) q);
2907}
2908
2909static void GLAPIENTRY
2910TAG(TexCoord1dv)(const GLdouble *v)
2911{
2912   GET_CURRENT_CONTEXT(ctx);
2913   ATTR1F(VBO_ATTRIB_TEX0, (GLfloat) v[0]);
2914}
2915
2916static void GLAPIENTRY
2917TAG(TexCoord1iv)(const GLint *v)
2918{
2919   GET_CURRENT_CONTEXT(ctx);
2920   ATTR1F(VBO_ATTRIB_TEX0, (GLfloat) v[0]);
2921}
2922
2923static void GLAPIENTRY
2924TAG(TexCoord1sv)(const GLshort *v)
2925{
2926   GET_CURRENT_CONTEXT(ctx);
2927   ATTR1F(VBO_ATTRIB_TEX0, (GLfloat) v[0]);
2928}
2929
2930static void GLAPIENTRY
2931TAG(TexCoord2dv)(const GLdouble *v)
2932{
2933   GET_CURRENT_CONTEXT(ctx);
2934   ATTR2F(VBO_ATTRIB_TEX0, (GLfloat) v[0],(GLfloat) v[1]);
2935}
2936
2937static void GLAPIENTRY
2938TAG(TexCoord2iv)(const GLint *v)
2939{
2940   GET_CURRENT_CONTEXT(ctx);
2941   ATTR2F(VBO_ATTRIB_TEX0, (GLfloat) v[0],(GLfloat) v[1]);
2942}
2943
2944static void GLAPIENTRY
2945TAG(TexCoord2sv)(const GLshort *v)
2946{
2947   GET_CURRENT_CONTEXT(ctx);
2948   ATTR2F(VBO_ATTRIB_TEX0, (GLfloat) v[0],(GLfloat) v[1]);
2949}
2950
2951static void GLAPIENTRY
2952TAG(TexCoord3dv)(const GLdouble *v)
2953{
2954   GET_CURRENT_CONTEXT(ctx);
2955   ATTR3F(VBO_ATTRIB_TEX0, (GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2]);
2956}
2957
2958static void GLAPIENTRY
2959TAG(TexCoord3iv)(const GLint *v)
2960{
2961   GET_CURRENT_CONTEXT(ctx);
2962   ATTR3F(VBO_ATTRIB_TEX0, (GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2]);
2963}
2964
2965static void GLAPIENTRY
2966TAG(TexCoord3sv)(const GLshort *v)
2967{
2968   GET_CURRENT_CONTEXT(ctx);
2969   ATTR3F(VBO_ATTRIB_TEX0, (GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2]);
2970}
2971
2972static void GLAPIENTRY
2973TAG(TexCoord4dv)(const GLdouble *v)
2974{
2975   GET_CURRENT_CONTEXT(ctx);
2976   ATTR4F(VBO_ATTRIB_TEX0, (GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2],(GLfloat) v[3]);
2977}
2978
2979static void GLAPIENTRY
2980TAG(TexCoord4iv)(const GLint *v)
2981{
2982   GET_CURRENT_CONTEXT(ctx);
2983   ATTR4F(VBO_ATTRIB_TEX0, (GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2],(GLfloat) v[3]);
2984}
2985
2986static void GLAPIENTRY
2987TAG(TexCoord4sv)(const GLshort *v)
2988{
2989   GET_CURRENT_CONTEXT(ctx);
2990   ATTR4F(VBO_ATTRIB_TEX0, (GLfloat) v[0],(GLfloat) v[1],(GLfloat) v[2],(GLfloat) v[3]);
2991}
2992
2993static void GLAPIENTRY
2994TAG(MultiTexCoord1d)(GLenum target, GLdouble s)
2995{
2996   GET_CURRENT_CONTEXT(ctx);
2997   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
2998   ATTR1F(attr, (GLfloat) s);
2999}
3000
3001static void GLAPIENTRY
3002TAG(MultiTexCoord1dv)(GLenum target, const GLdouble *v)
3003{
3004   GET_CURRENT_CONTEXT(ctx);
3005   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3006   ATTR1F(attr, (GLfloat) v[0]);
3007}
3008
3009static void GLAPIENTRY
3010TAG(MultiTexCoord1i)(GLenum target, GLint s)
3011{
3012   GET_CURRENT_CONTEXT(ctx);
3013   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3014   ATTR1F(attr, (GLfloat) s);
3015}
3016
3017static void GLAPIENTRY
3018TAG(MultiTexCoord1iv)(GLenum target, const GLint *v)
3019{
3020   GET_CURRENT_CONTEXT(ctx);
3021   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3022   ATTR1F(attr, (GLfloat) v[0]);
3023}
3024
3025static void GLAPIENTRY
3026TAG(MultiTexCoord1s)(GLenum target, GLshort s)
3027{
3028   GET_CURRENT_CONTEXT(ctx);
3029   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3030   ATTR1F(attr, (GLfloat) s);
3031}
3032
3033static void GLAPIENTRY
3034TAG(MultiTexCoord1sv)(GLenum target, const GLshort *v)
3035{
3036   GET_CURRENT_CONTEXT(ctx);
3037   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3038   ATTR1F(attr, (GLfloat) v[0]);
3039}
3040
3041static void GLAPIENTRY
3042TAG(MultiTexCoord2d)(GLenum target, GLdouble s, GLdouble t)
3043{
3044   GET_CURRENT_CONTEXT(ctx);
3045   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3046   ATTR2F(attr, (GLfloat) s, (GLfloat) t);
3047}
3048
3049static void GLAPIENTRY
3050TAG(MultiTexCoord2dv)(GLenum target, const GLdouble *v)
3051{
3052   GET_CURRENT_CONTEXT(ctx);
3053   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3054   ATTR2F(attr, (GLfloat) v[0], (GLfloat) v[1]);
3055}
3056
3057static void GLAPIENTRY
3058TAG(MultiTexCoord2i)(GLenum target, GLint s, GLint t)
3059{
3060   GET_CURRENT_CONTEXT(ctx);
3061   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3062   ATTR2F(attr, (GLfloat) s, (GLfloat) t);
3063}
3064
3065static void GLAPIENTRY
3066TAG(MultiTexCoord2iv)(GLenum target, const GLint *v)
3067{
3068   GET_CURRENT_CONTEXT(ctx);
3069   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3070   ATTR2F(attr, (GLfloat) v[0], (GLfloat) v[1]);
3071}
3072
3073static void GLAPIENTRY
3074TAG(MultiTexCoord2s)(GLenum target, GLshort s, GLshort t)
3075{
3076   GET_CURRENT_CONTEXT(ctx);
3077   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3078   ATTR2F(attr, (GLfloat) s, (GLfloat) t);
3079}
3080
3081static void GLAPIENTRY
3082TAG(MultiTexCoord2sv)(GLenum target, const GLshort *v)
3083{
3084   GET_CURRENT_CONTEXT(ctx);
3085   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3086   ATTR2F(attr, (GLfloat) v[0], (GLfloat) v[1]);
3087}
3088
3089static void GLAPIENTRY
3090TAG(MultiTexCoord3d)(GLenum target, GLdouble s, GLdouble t, GLdouble r)
3091{
3092   GET_CURRENT_CONTEXT(ctx);
3093   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3094   ATTR3F(attr, (GLfloat) s, (GLfloat) t, (GLfloat) r);
3095}
3096
3097static void GLAPIENTRY
3098TAG(MultiTexCoord3dv)(GLenum target, const GLdouble *v)
3099{
3100   GET_CURRENT_CONTEXT(ctx);
3101   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3102   ATTR3F(attr, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
3103}
3104
3105static void GLAPIENTRY
3106TAG(MultiTexCoord3i)(GLenum target, GLint s, GLint t, GLint r)
3107{
3108   GET_CURRENT_CONTEXT(ctx);
3109   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3110   ATTR3F(attr, (GLfloat) s, (GLfloat) t, (GLfloat) r);
3111}
3112
3113static void GLAPIENTRY
3114TAG(MultiTexCoord3iv)(GLenum target, const GLint *v)
3115{
3116   GET_CURRENT_CONTEXT(ctx);
3117   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3118   ATTR3F(attr, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
3119}
3120
3121static void GLAPIENTRY
3122TAG(MultiTexCoord3s)(GLenum target, GLshort s, GLshort t, GLshort r)
3123{
3124   GET_CURRENT_CONTEXT(ctx);
3125   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3126   ATTR3F(attr, (GLfloat) s, (GLfloat) t, (GLfloat) r);
3127}
3128
3129static void GLAPIENTRY
3130TAG(MultiTexCoord3sv)(GLenum target, const GLshort *v)
3131{
3132   GET_CURRENT_CONTEXT(ctx);
3133   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3134   ATTR3F(attr, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
3135}
3136
3137static void GLAPIENTRY
3138TAG(MultiTexCoord4d)(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q)
3139{
3140   GET_CURRENT_CONTEXT(ctx);
3141   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3142   ATTR4F(attr, (GLfloat) s, (GLfloat) t, (GLfloat) r, (GLfloat) q);
3143}
3144
3145static void GLAPIENTRY
3146TAG(MultiTexCoord4dv)(GLenum target, const GLdouble *v)
3147{
3148   GET_CURRENT_CONTEXT(ctx);
3149   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3150   ATTR4F(attr, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
3151}
3152
3153static void GLAPIENTRY
3154TAG(MultiTexCoord4i)(GLenum target, GLint s, GLint t, GLint r, GLint q)
3155{
3156   GET_CURRENT_CONTEXT(ctx);
3157   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3158   ATTR4F(attr, (GLfloat) s, (GLfloat) t, (GLfloat) r, (GLfloat) q);
3159}
3160
3161static void GLAPIENTRY
3162TAG(MultiTexCoord4iv)(GLenum target, const GLint *v)
3163{
3164   GET_CURRENT_CONTEXT(ctx);
3165   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3166   ATTR4F(attr, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
3167}
3168
3169static void GLAPIENTRY
3170TAG(MultiTexCoord4s)(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q)
3171{
3172   GET_CURRENT_CONTEXT(ctx);
3173   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3174   ATTR4F(attr, (GLfloat) s, (GLfloat) t, (GLfloat) r, (GLfloat) q);
3175}
3176
3177static void GLAPIENTRY
3178TAG(MultiTexCoord4sv)(GLenum target, const GLshort *v)
3179{
3180   GET_CURRENT_CONTEXT(ctx);
3181   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
3182   ATTR4F(attr, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2], (GLfloat) v[3]);
3183}
3184
3185
3186static void GLAPIENTRY
3187TAG(EvalCoord2dv)(const GLdouble *u)
3188{
3189   TAG(EvalCoord2f)((GLfloat) u[0], (GLfloat) u[1]);
3190}
3191
3192static void GLAPIENTRY
3193TAG(EvalCoord2d)(GLdouble u, GLdouble v)
3194{
3195   TAG(EvalCoord2f)((GLfloat) u, (GLfloat) v);
3196}
3197
3198static void GLAPIENTRY
3199TAG(EvalCoord1dv)(const GLdouble *u)
3200{
3201   TAG(EvalCoord1f)((GLfloat) *u);
3202}
3203
3204static void GLAPIENTRY
3205TAG(EvalCoord1d)(GLdouble u)
3206{
3207   TAG(EvalCoord1f)((GLfloat) u);
3208}
3209
3210
3211static void GLAPIENTRY
3212TAG(Materialf)(GLenum face, GLenum pname, GLfloat param)
3213{
3214   GLfloat fparam[4];
3215   fparam[0] = param;
3216   TAG(Materialfv)(face, pname, fparam);
3217}
3218
3219static void GLAPIENTRY
3220TAG(Materiali)(GLenum face, GLenum pname, GLint param)
3221{
3222   GLfloat p[4];
3223   p[0] = (GLfloat) param;
3224   TAG(Materialfv)(face, pname, p);
3225}
3226
3227static void GLAPIENTRY
3228TAG(Materialiv)(GLenum face, GLenum pname, const GLint *params)
3229{
3230   GLfloat fparam[4];
3231   switch (pname) {
3232   case GL_AMBIENT:
3233   case GL_DIFFUSE:
3234   case GL_SPECULAR:
3235   case GL_EMISSION:
3236   case GL_AMBIENT_AND_DIFFUSE:
3237      fparam[0] = INT_TO_FLOAT(params[0]);
3238      fparam[1] = INT_TO_FLOAT(params[1]);
3239      fparam[2] = INT_TO_FLOAT(params[2]);
3240      fparam[3] = INT_TO_FLOAT(params[3]);
3241      break;
3242   case GL_SHININESS:
3243      fparam[0] = (GLfloat) params[0];
3244      break;
3245   case GL_COLOR_INDEXES:
3246      fparam[0] = (GLfloat) params[0];
3247      fparam[1] = (GLfloat) params[1];
3248      fparam[2] = (GLfloat) params[2];
3249      break;
3250   default:
3251      ;
3252   }
3253   TAG(Materialfv)(face, pname, fparam);
3254}
3255
3256
3257static void GLAPIENTRY
3258TAG(SecondaryColor3b)(GLbyte red, GLbyte green, GLbyte blue)
3259{
3260   GET_CURRENT_CONTEXT(ctx);
3261   ATTR3F(VBO_ATTRIB_COLOR1, BYTE_TO_FLOAT(red),
3262          BYTE_TO_FLOAT(green),
3263          BYTE_TO_FLOAT(blue));
3264}
3265
3266static void GLAPIENTRY
3267TAG(SecondaryColor3d)(GLdouble red, GLdouble green, GLdouble blue)
3268{
3269   GET_CURRENT_CONTEXT(ctx);
3270   ATTR3F(VBO_ATTRIB_COLOR1, (GLfloat) red, (GLfloat) green, (GLfloat) blue);
3271}
3272
3273static void GLAPIENTRY
3274TAG(SecondaryColor3i)(GLint red, GLint green, GLint blue)
3275{
3276   GET_CURRENT_CONTEXT(ctx);
3277   ATTR3F(VBO_ATTRIB_COLOR1, INT_TO_FLOAT(red),
3278          INT_TO_FLOAT(green),
3279          INT_TO_FLOAT(blue));
3280}
3281
3282static void GLAPIENTRY
3283TAG(SecondaryColor3s)(GLshort red, GLshort green, GLshort blue)
3284{
3285   GET_CURRENT_CONTEXT(ctx);
3286   ATTR3F(VBO_ATTRIB_COLOR1, SHORT_TO_FLOAT(red),
3287          SHORT_TO_FLOAT(green),
3288          SHORT_TO_FLOAT(blue));
3289}
3290
3291static void GLAPIENTRY
3292TAG(SecondaryColor3ui)(GLuint red, GLuint green, GLuint blue)
3293{
3294   GET_CURRENT_CONTEXT(ctx);
3295   ATTR3F(VBO_ATTRIB_COLOR1, UINT_TO_FLOAT(red),
3296          UINT_TO_FLOAT(green),
3297          UINT_TO_FLOAT(blue));
3298}
3299
3300static void GLAPIENTRY
3301TAG(SecondaryColor3us)(GLushort red, GLushort green, GLushort blue)
3302{
3303   GET_CURRENT_CONTEXT(ctx);
3304   ATTR3F(VBO_ATTRIB_COLOR1, USHORT_TO_FLOAT(red),
3305          USHORT_TO_FLOAT(green),
3306          USHORT_TO_FLOAT(blue));
3307}
3308
3309static void GLAPIENTRY
3310TAG(SecondaryColor3ub)(GLubyte red, GLubyte green, GLubyte blue)
3311{
3312   GET_CURRENT_CONTEXT(ctx);
3313   ATTR3F(VBO_ATTRIB_COLOR1, UBYTE_TO_FLOAT(red),
3314          UBYTE_TO_FLOAT(green),
3315          UBYTE_TO_FLOAT(blue));
3316}
3317
3318static void GLAPIENTRY
3319TAG(SecondaryColor3bv)(const GLbyte *v)
3320{
3321   GET_CURRENT_CONTEXT(ctx);
3322   ATTR3F(VBO_ATTRIB_COLOR1, BYTE_TO_FLOAT(v[0]),
3323         BYTE_TO_FLOAT(v[1]),
3324         BYTE_TO_FLOAT(v[2]));
3325}
3326
3327static void GLAPIENTRY
3328TAG(SecondaryColor3dv)(const GLdouble *v)
3329{
3330   GET_CURRENT_CONTEXT(ctx);
3331   ATTR3F(VBO_ATTRIB_COLOR1, (GLfloat) v[0], (GLfloat) v[1], (GLfloat) v[2]);
3332}
3333
3334static void GLAPIENTRY
3335TAG(SecondaryColor3iv)(const GLint *v)
3336{
3337   GET_CURRENT_CONTEXT(ctx);
3338   ATTR3F(VBO_ATTRIB_COLOR1, INT_TO_FLOAT(v[0]),
3339         INT_TO_FLOAT(v[1]),
3340         INT_TO_FLOAT(v[2]));
3341}
3342
3343static void GLAPIENTRY
3344TAG(SecondaryColor3sv)(const GLshort *v)
3345{
3346   GET_CURRENT_CONTEXT(ctx);
3347   ATTR3F(VBO_ATTRIB_COLOR1, SHORT_TO_FLOAT(v[0]),
3348         SHORT_TO_FLOAT(v[1]),
3349         SHORT_TO_FLOAT(v[2]));
3350}
3351
3352static void GLAPIENTRY
3353TAG(SecondaryColor3uiv)(const GLuint *v)
3354{
3355   GET_CURRENT_CONTEXT(ctx);
3356   ATTR3F(VBO_ATTRIB_COLOR1, UINT_TO_FLOAT(v[0]),
3357         UINT_TO_FLOAT(v[1]),
3358         UINT_TO_FLOAT(v[2]));
3359}
3360
3361static void GLAPIENTRY
3362TAG(SecondaryColor3usv)(const GLushort *v)
3363{
3364   GET_CURRENT_CONTEXT(ctx);
3365   ATTR3F(VBO_ATTRIB_COLOR1, USHORT_TO_FLOAT(v[0]),
3366         USHORT_TO_FLOAT(v[1]),
3367         USHORT_TO_FLOAT(v[2]));
3368}
3369
3370static void GLAPIENTRY
3371TAG(SecondaryColor3ubv)(const GLubyte *v)
3372{
3373   GET_CURRENT_CONTEXT(ctx);
3374   ATTR3F(VBO_ATTRIB_COLOR1, UBYTE_TO_FLOAT(v[0]),
3375         UBYTE_TO_FLOAT(v[1]),
3376         UBYTE_TO_FLOAT(v[2]));
3377}
3378
3379#endif /* HW_SELECT_MODE */
3380
3381#undef ATTR1FV
3382#undef ATTR2FV
3383#undef ATTR3FV
3384#undef ATTR4FV
3385
3386#undef ATTR1F
3387#undef ATTR2F
3388#undef ATTR3F
3389#undef ATTR4F
3390
3391#undef ATTR_UI
3392
3393#ifdef SUPPRESS_STATIC
3394#undef static
3395#endif
3396
3397#undef MAT
3398