1848b8605Smrg/**************************************************************************
2848b8605Smrg
3848b8605SmrgCopyright 2002 VMware, Inc.
4848b8605SmrgCopyright 2011 Dave Airlie (ARB_vertex_type_2_10_10_10_rev support)
5848b8605SmrgAll Rights Reserved.
6848b8605Smrg
7848b8605SmrgPermission is hereby granted, free of charge, to any person obtaining a
8848b8605Smrgcopy of this software and associated documentation files (the "Software"),
9848b8605Smrgto deal in the Software without restriction, including without limitation
10848b8605Smrgon the rights to use, copy, modify, merge, publish, distribute, sub
11848b8605Smrglicense, and/or sell copies of the Software, and to permit persons to whom
12848b8605Smrgthe Software is furnished to do so, subject to the following conditions:
13848b8605Smrg
14848b8605SmrgThe above copyright notice and this permission notice (including the next
15848b8605Smrgparagraph) shall be included in all copies or substantial portions of the
16848b8605SmrgSoftware.
17848b8605Smrg
18848b8605SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19848b8605SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20848b8605SmrgFITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21848b8605SmrgVMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22848b8605SmrgDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23848b8605SmrgOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24848b8605SmrgUSE OR OTHER DEALINGS IN THE SOFTWARE.
25848b8605Smrg
26848b8605Smrg**************************************************************************/
27848b8605Smrg
28b8e80941Smrg#include "util/format_r11g11b10f.h"
29848b8605Smrg#include "main/varray.h"
30848b8605Smrg
31b8e80941Smrg
32b8e80941Smrg/* ATTR */
33b8e80941Smrg#define ATTRI( A, N, V0, V1, V2, V3 ) \
34b8e80941Smrg    ATTR_UNION(A, N, GL_INT, fi_type, INT_AS_UNION(V0), INT_AS_UNION(V1), \
35b8e80941Smrg        INT_AS_UNION(V2), INT_AS_UNION(V3))
36b8e80941Smrg#define ATTRUI( A, N, V0, V1, V2, V3 ) \
37b8e80941Smrg    ATTR_UNION(A, N, GL_UNSIGNED_INT, fi_type, UINT_AS_UNION(V0), UINT_AS_UNION(V1), \
38b8e80941Smrg        UINT_AS_UNION(V2), UINT_AS_UNION(V3))
39b8e80941Smrg#define ATTRF( A, N, V0, V1, V2, V3 ) \
40b8e80941Smrg    ATTR_UNION(A, N, GL_FLOAT, fi_type, FLOAT_AS_UNION(V0), FLOAT_AS_UNION(V1),\
41b8e80941Smrg        FLOAT_AS_UNION(V2), FLOAT_AS_UNION(V3))
42b8e80941Smrg#define ATTRD( A, N, V0, V1, V2, V3 ) \
43b8e80941Smrg    ATTR_UNION(A, N, GL_DOUBLE, double, V0, V1, V2, V3)
44b8e80941Smrg#define ATTRUI64( A, N, V0, V1, V2, V3 ) \
45b8e80941Smrg    ATTR_UNION(A, N, GL_UNSIGNED_INT64_ARB, uint64_t, V0, V1, V2, V3)
46b8e80941Smrg
47b8e80941Smrg
48848b8605Smrg/* float */
49b8e80941Smrg#define ATTR1FV( A, V ) ATTRF( A, 1, (V)[0], 0, 0, 1 )
50b8e80941Smrg#define ATTR2FV( A, V ) ATTRF( A, 2, (V)[0], (V)[1], 0, 1 )
51b8e80941Smrg#define ATTR3FV( A, V ) ATTRF( A, 3, (V)[0], (V)[1], (V)[2], 1 )
52b8e80941Smrg#define ATTR4FV( A, V ) ATTRF( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
53848b8605Smrg
54b8e80941Smrg#define ATTR1F( A, X )          ATTRF( A, 1, X, 0, 0, 1 )
55b8e80941Smrg#define ATTR2F( A, X, Y )       ATTRF( A, 2, X, Y, 0, 1 )
56b8e80941Smrg#define ATTR3F( A, X, Y, Z )    ATTRF( A, 3, X, Y, Z, 1 )
57b8e80941Smrg#define ATTR4F( A, X, Y, Z, W ) ATTRF( A, 4, X, Y, Z, W )
58848b8605Smrg
59848b8605Smrg
60b8e80941Smrg/* int */
61848b8605Smrg#define ATTR2IV( A, V ) ATTRI( A, 2, (V)[0], (V)[1], 0, 1 )
62848b8605Smrg#define ATTR3IV( A, V ) ATTRI( A, 3, (V)[0], (V)[1], (V)[2], 1 )
63848b8605Smrg#define ATTR4IV( A, V ) ATTRI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
64848b8605Smrg
65848b8605Smrg#define ATTR1I( A, X )          ATTRI( A, 1, X, 0, 0, 1 )
66848b8605Smrg#define ATTR2I( A, X, Y )       ATTRI( A, 2, X, Y, 0, 1 )
67848b8605Smrg#define ATTR3I( A, X, Y, Z )    ATTRI( A, 3, X, Y, Z, 1 )
68848b8605Smrg#define ATTR4I( A, X, Y, Z, W ) ATTRI( A, 4, X, Y, Z, W )
69848b8605Smrg
70848b8605Smrg
71848b8605Smrg/* uint */
72848b8605Smrg#define ATTR2UIV( A, V ) ATTRUI( A, 2, (V)[0], (V)[1], 0, 1 )
73848b8605Smrg#define ATTR3UIV( A, V ) ATTRUI( A, 3, (V)[0], (V)[1], (V)[2], 1 )
74848b8605Smrg#define ATTR4UIV( A, V ) ATTRUI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
75848b8605Smrg
76848b8605Smrg#define ATTR1UI( A, X )          ATTRUI( A, 1, X, 0, 0, 1 )
77848b8605Smrg#define ATTR2UI( A, X, Y )       ATTRUI( A, 2, X, Y, 0, 1 )
78848b8605Smrg#define ATTR3UI( A, X, Y, Z )    ATTRUI( A, 3, X, Y, Z, 1 )
79848b8605Smrg#define ATTR4UI( A, X, Y, Z, W ) ATTRUI( A, 4, X, Y, Z, W )
80848b8605Smrg
81b8e80941Smrg#define MAT_ATTR( A, N, V ) ATTRF( A, N, (V)[0], (V)[1], (V)[2], (V)[3] )
82848b8605Smrg
83848b8605Smrgstatic inline float conv_ui10_to_norm_float(unsigned ui10)
84848b8605Smrg{
85848b8605Smrg   return ui10 / 1023.0f;
86848b8605Smrg}
87848b8605Smrg
88848b8605Smrgstatic inline float conv_ui2_to_norm_float(unsigned ui2)
89848b8605Smrg{
90848b8605Smrg   return ui2 / 3.0f;
91848b8605Smrg}
92848b8605Smrg
93b8e80941Smrg#define ATTRUI10_1( A, UI ) ATTRF( A, 1, (UI) & 0x3ff, 0, 0, 1 )
94b8e80941Smrg#define ATTRUI10_2( A, UI ) ATTRF( A, 2, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, 0, 1 )
95b8e80941Smrg#define ATTRUI10_3( A, UI ) ATTRF( A, 3, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, 1 )
96b8e80941Smrg#define ATTRUI10_4( A, UI ) ATTRF( A, 4, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, ((UI) >> 30) & 0x3 )
97848b8605Smrg
98b8e80941Smrg#define ATTRUI10N_1( A, UI ) ATTRF( A, 1, conv_ui10_to_norm_float((UI) & 0x3ff), 0, 0, 1 )
99b8e80941Smrg#define ATTRUI10N_2( A, UI ) ATTRF( A, 2, \
100848b8605Smrg				   conv_ui10_to_norm_float((UI) & 0x3ff), \
101848b8605Smrg				   conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), 0, 1 )
102b8e80941Smrg#define ATTRUI10N_3( A, UI ) ATTRF( A, 3, \
103848b8605Smrg				   conv_ui10_to_norm_float((UI) & 0x3ff), \
104848b8605Smrg				   conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
105848b8605Smrg				   conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), 1 )
106b8e80941Smrg#define ATTRUI10N_4( A, UI ) ATTRF( A, 4, \
107848b8605Smrg				   conv_ui10_to_norm_float((UI) & 0x3ff), \
108848b8605Smrg				   conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
109848b8605Smrg				   conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), \
110848b8605Smrg				   conv_ui2_to_norm_float(((UI) >> 30) & 0x3) )
111848b8605Smrg
112848b8605Smrgstruct attr_bits_10 {signed int x:10;};
113848b8605Smrgstruct attr_bits_2 {signed int x:2;};
114848b8605Smrg
115848b8605Smrgstatic inline float conv_i10_to_i(int i10)
116848b8605Smrg{
117848b8605Smrg   struct attr_bits_10 val;
118848b8605Smrg   val.x = i10;
119848b8605Smrg   return (float)val.x;
120848b8605Smrg}
121848b8605Smrg
122848b8605Smrgstatic inline float conv_i2_to_i(int i2)
123848b8605Smrg{
124848b8605Smrg   struct attr_bits_2 val;
125848b8605Smrg   val.x = i2;
126848b8605Smrg   return (float)val.x;
127848b8605Smrg}
128848b8605Smrg
129848b8605Smrgstatic inline float conv_i10_to_norm_float(const struct gl_context *ctx, int i10)
130848b8605Smrg{
131848b8605Smrg   struct attr_bits_10 val;
132848b8605Smrg   val.x = i10;
133848b8605Smrg
134848b8605Smrg   /* Traditionally, OpenGL has had two equations for converting from
135848b8605Smrg    * normalized fixed-point data to floating-point data.  In the OpenGL 3.2
136848b8605Smrg    * specification, these are equations 2.2 and 2.3, respectively:
137848b8605Smrg    *
138848b8605Smrg    *    f = (2c + 1)/(2^b - 1).                                (2.2)
139848b8605Smrg    *
140848b8605Smrg    * Comments below this equation state: "In general, this representation is
141848b8605Smrg    * used for signed normalized fixed-point parameters in GL commands, such
142848b8605Smrg    * as vertex attribute values."  Which is what we're doing here.
143848b8605Smrg    *
144848b8605Smrg    *    f = max{c/(2^(b-1) - 1), -1.0}                         (2.3)
145848b8605Smrg    *
146848b8605Smrg    * Comments below this equation state: "In general, this representation is
147848b8605Smrg    * used for signed normalized fixed-point texture or floating point values."
148848b8605Smrg    *
149848b8605Smrg    * OpenGL 4.2+ and ES 3.0 remedy this and state that equation 2.3 (above)
150848b8605Smrg    * is used in every case.  They remove equation 2.2 completely.
151848b8605Smrg    */
152848b8605Smrg   if (_mesa_is_gles3(ctx) ||
153b8e80941Smrg       (_mesa_is_desktop_gl(ctx) && ctx->Version >= 42)) {
154848b8605Smrg      /* Equation 2.3 above. */
155848b8605Smrg      float f = ((float) val.x) / 511.0F;
156848b8605Smrg      return MAX2(f, -1.0f);
157848b8605Smrg   } else {
158848b8605Smrg      /* Equation 2.2 above. */
159848b8605Smrg      return (2.0F * (float)val.x + 1.0F) * (1.0F  / 1023.0F);
160848b8605Smrg   }
161848b8605Smrg}
162848b8605Smrg
163848b8605Smrgstatic inline float conv_i2_to_norm_float(const struct gl_context *ctx, int i2)
164848b8605Smrg{
165848b8605Smrg   struct attr_bits_2 val;
166848b8605Smrg   val.x = i2;
167848b8605Smrg
168848b8605Smrg   if (_mesa_is_gles3(ctx) ||
169b8e80941Smrg       (_mesa_is_desktop_gl(ctx) && ctx->Version >= 42)) {
170848b8605Smrg      /* Equation 2.3 above. */
171848b8605Smrg      float f = (float) val.x;
172848b8605Smrg      return MAX2(f, -1.0f);
173848b8605Smrg   } else {
174848b8605Smrg      /* Equation 2.2 above. */
175848b8605Smrg      return (2.0F * (float)val.x + 1.0F) * (1.0F / 3.0F);
176848b8605Smrg   }
177848b8605Smrg}
178848b8605Smrg
179b8e80941Smrg#define ATTRI10_1( A, I10 ) ATTRF( A, 1, conv_i10_to_i((I10) & 0x3ff), 0, 0, 1 )
180b8e80941Smrg#define ATTRI10_2( A, I10 ) ATTRF( A, 2, \
181848b8605Smrg				conv_i10_to_i((I10) & 0x3ff),		\
182848b8605Smrg				conv_i10_to_i(((I10) >> 10) & 0x3ff), 0, 1 )
183b8e80941Smrg#define ATTRI10_3( A, I10 ) ATTRF( A, 3, \
184848b8605Smrg				conv_i10_to_i((I10) & 0x3ff),	    \
185848b8605Smrg				conv_i10_to_i(((I10) >> 10) & 0x3ff), \
186848b8605Smrg				conv_i10_to_i(((I10) >> 20) & 0x3ff), 1 )
187b8e80941Smrg#define ATTRI10_4( A, I10 ) ATTRF( A, 4, \
188848b8605Smrg				conv_i10_to_i((I10) & 0x3ff),		\
189848b8605Smrg				conv_i10_to_i(((I10) >> 10) & 0x3ff), \
190848b8605Smrg				conv_i10_to_i(((I10) >> 20) & 0x3ff), \
191848b8605Smrg				conv_i2_to_i(((I10) >> 30) & 0x3))
192848b8605Smrg
193848b8605Smrg
194b8e80941Smrg#define ATTRI10N_1(ctx, A, I10) ATTRF(A, 1, conv_i10_to_norm_float(ctx, (I10) & 0x3ff), 0, 0, 1 )
195b8e80941Smrg#define ATTRI10N_2(ctx, A, I10) ATTRF(A, 2, \
196848b8605Smrg				conv_i10_to_norm_float(ctx, (I10) & 0x3ff),		\
197848b8605Smrg				conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), 0, 1 )
198b8e80941Smrg#define ATTRI10N_3(ctx, A, I10) ATTRF(A, 3, \
199848b8605Smrg				conv_i10_to_norm_float(ctx, (I10) & 0x3ff),	    \
200848b8605Smrg				conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \
201848b8605Smrg				conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff), 1 )
202b8e80941Smrg#define ATTRI10N_4(ctx, A, I10) ATTRF(A, 4, \
203848b8605Smrg				conv_i10_to_norm_float(ctx, (I10) & 0x3ff),		\
204848b8605Smrg				conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \
205848b8605Smrg				conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff), \
206848b8605Smrg				conv_i2_to_norm_float(ctx, ((I10) >> 30) & 0x3))
207848b8605Smrg
208848b8605Smrg#define ATTR_UI(ctx, val, type, normalized, attr, arg) do {	\
209848b8605Smrg   if ((type) == GL_UNSIGNED_INT_2_10_10_10_REV) {		\
210848b8605Smrg      if (normalized) {						\
211848b8605Smrg	 ATTRUI10N_##val((attr), (arg));			\
212848b8605Smrg      } else {							\
213848b8605Smrg	 ATTRUI10_##val((attr), (arg));				\
214848b8605Smrg      }								\
215848b8605Smrg   } else if ((type) == GL_INT_2_10_10_10_REV) {		\
216848b8605Smrg      if (normalized) {						\
217848b8605Smrg	 ATTRI10N_##val(ctx, (attr), (arg));			\
218848b8605Smrg      } else {							\
219848b8605Smrg	 ATTRI10_##val((attr), (arg));				\
220848b8605Smrg      }								\
221848b8605Smrg   } else if ((type) == GL_UNSIGNED_INT_10F_11F_11F_REV) {	\
222848b8605Smrg      float res[4];						\
223b8e80941Smrg      res[3] = 1;                                               \
224848b8605Smrg      r11g11b10f_to_float3((arg), res);				\
225848b8605Smrg      ATTR##val##FV((attr), res);				\
226848b8605Smrg   } else							\
227848b8605Smrg      ERROR(GL_INVALID_VALUE);					\
228848b8605Smrg   } while(0)
229848b8605Smrg
230848b8605Smrg#define ATTR_UI_INDEX(ctx, val, type, normalized, index, arg) do {	\
231b8e80941Smrg      if ((index) == 0 && _mesa_attr_zero_aliases_vertex(ctx)) {	\
232848b8605Smrg	 ATTR_UI(ctx, val, (type), normalized, 0, (arg));		\
233848b8605Smrg      } else if ((index) < MAX_VERTEX_GENERIC_ATTRIBS) {		\
234848b8605Smrg	 ATTR_UI(ctx, val, (type), normalized, VBO_ATTRIB_GENERIC0 + (index), (arg)); \
235848b8605Smrg      } else								\
236848b8605Smrg	 ERROR(GL_INVALID_VALUE);					\
237848b8605Smrg   } while(0)
238848b8605Smrg
239b8e80941Smrg
240b8e80941Smrg/* Doubles */
241b8e80941Smrg#define ATTR1DV( A, V ) ATTRD( A, 1, (V)[0], 0, 0, 1 )
242b8e80941Smrg#define ATTR2DV( A, V ) ATTRD( A, 2, (V)[0], (V)[1], 0, 1 )
243b8e80941Smrg#define ATTR3DV( A, V ) ATTRD( A, 3, (V)[0], (V)[1], (V)[2], 1 )
244b8e80941Smrg#define ATTR4DV( A, V ) ATTRD( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
245b8e80941Smrg
246b8e80941Smrg#define ATTR1D( A, X )          ATTRD( A, 1, X, 0, 0, 1 )
247b8e80941Smrg#define ATTR2D( A, X, Y )       ATTRD( A, 2, X, Y, 0, 1 )
248b8e80941Smrg#define ATTR3D( A, X, Y, Z )    ATTRD( A, 3, X, Y, Z, 1 )
249b8e80941Smrg#define ATTR4D( A, X, Y, Z, W ) ATTRD( A, 4, X, Y, Z, W )
250b8e80941Smrg
251b8e80941Smrg#define ATTR1UIV64( A, V ) ATTRUI64( A, 1, (V)[0], 0, 0, 0 )
252b8e80941Smrg#define ATTR1UI64( A, X )  ATTRUI64( A, 1, X, 0, 0, 0 )
253b8e80941Smrg
254b8e80941Smrg
255848b8605Smrgstatic void GLAPIENTRY
256848b8605SmrgTAG(Vertex2f)(GLfloat x, GLfloat y)
257848b8605Smrg{
258848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
259848b8605Smrg   ATTR2F(VBO_ATTRIB_POS, x, y);
260848b8605Smrg}
261848b8605Smrg
262848b8605Smrgstatic void GLAPIENTRY
263848b8605SmrgTAG(Vertex2fv)(const GLfloat * v)
264848b8605Smrg{
265848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
266848b8605Smrg   ATTR2FV(VBO_ATTRIB_POS, v);
267848b8605Smrg}
268848b8605Smrg
269848b8605Smrgstatic void GLAPIENTRY
270848b8605SmrgTAG(Vertex3f)(GLfloat x, GLfloat y, GLfloat z)
271848b8605Smrg{
272848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
273848b8605Smrg   ATTR3F(VBO_ATTRIB_POS, x, y, z);
274848b8605Smrg}
275848b8605Smrg
276848b8605Smrgstatic void GLAPIENTRY
277848b8605SmrgTAG(Vertex3fv)(const GLfloat * v)
278848b8605Smrg{
279848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
280848b8605Smrg   ATTR3FV(VBO_ATTRIB_POS, v);
281848b8605Smrg}
282848b8605Smrg
283848b8605Smrgstatic void GLAPIENTRY
284848b8605SmrgTAG(Vertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
285848b8605Smrg{
286848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
287848b8605Smrg   ATTR4F(VBO_ATTRIB_POS, x, y, z, w);
288848b8605Smrg}
289848b8605Smrg
290848b8605Smrgstatic void GLAPIENTRY
291848b8605SmrgTAG(Vertex4fv)(const GLfloat * v)
292848b8605Smrg{
293848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
294848b8605Smrg   ATTR4FV(VBO_ATTRIB_POS, v);
295848b8605Smrg}
296848b8605Smrg
297848b8605Smrg
298848b8605Smrg
299848b8605Smrgstatic void GLAPIENTRY
300848b8605SmrgTAG(TexCoord1f)(GLfloat x)
301848b8605Smrg{
302848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
303848b8605Smrg   ATTR1F(VBO_ATTRIB_TEX0, x);
304848b8605Smrg}
305848b8605Smrg
306848b8605Smrgstatic void GLAPIENTRY
307848b8605SmrgTAG(TexCoord1fv)(const GLfloat * v)
308848b8605Smrg{
309848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
310848b8605Smrg   ATTR1FV(VBO_ATTRIB_TEX0, v);
311848b8605Smrg}
312848b8605Smrg
313848b8605Smrgstatic void GLAPIENTRY
314848b8605SmrgTAG(TexCoord2f)(GLfloat x, GLfloat y)
315848b8605Smrg{
316848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
317848b8605Smrg   ATTR2F(VBO_ATTRIB_TEX0, x, y);
318848b8605Smrg}
319848b8605Smrg
320848b8605Smrgstatic void GLAPIENTRY
321848b8605SmrgTAG(TexCoord2fv)(const GLfloat * v)
322848b8605Smrg{
323848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
324848b8605Smrg   ATTR2FV(VBO_ATTRIB_TEX0, v);
325848b8605Smrg}
326848b8605Smrg
327848b8605Smrgstatic void GLAPIENTRY
328848b8605SmrgTAG(TexCoord3f)(GLfloat x, GLfloat y, GLfloat z)
329848b8605Smrg{
330848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
331848b8605Smrg   ATTR3F(VBO_ATTRIB_TEX0, x, y, z);
332848b8605Smrg}
333848b8605Smrg
334848b8605Smrgstatic void GLAPIENTRY
335848b8605SmrgTAG(TexCoord3fv)(const GLfloat * v)
336848b8605Smrg{
337848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
338848b8605Smrg   ATTR3FV(VBO_ATTRIB_TEX0, v);
339848b8605Smrg}
340848b8605Smrg
341848b8605Smrgstatic void GLAPIENTRY
342848b8605SmrgTAG(TexCoord4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
343848b8605Smrg{
344848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
345848b8605Smrg   ATTR4F(VBO_ATTRIB_TEX0, x, y, z, w);
346848b8605Smrg}
347848b8605Smrg
348848b8605Smrgstatic void GLAPIENTRY
349848b8605SmrgTAG(TexCoord4fv)(const GLfloat * v)
350848b8605Smrg{
351848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
352848b8605Smrg   ATTR4FV(VBO_ATTRIB_TEX0, v);
353848b8605Smrg}
354848b8605Smrg
355848b8605Smrg
356848b8605Smrg
357848b8605Smrgstatic void GLAPIENTRY
358848b8605SmrgTAG(Normal3f)(GLfloat x, GLfloat y, GLfloat z)
359848b8605Smrg{
360848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
361848b8605Smrg   ATTR3F(VBO_ATTRIB_NORMAL, x, y, z);
362848b8605Smrg}
363848b8605Smrg
364848b8605Smrgstatic void GLAPIENTRY
365848b8605SmrgTAG(Normal3fv)(const GLfloat * v)
366848b8605Smrg{
367848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
368848b8605Smrg   ATTR3FV(VBO_ATTRIB_NORMAL, v);
369848b8605Smrg}
370848b8605Smrg
371848b8605Smrg
372848b8605Smrg
373848b8605Smrgstatic void GLAPIENTRY
374848b8605SmrgTAG(FogCoordfEXT)(GLfloat x)
375848b8605Smrg{
376848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
377848b8605Smrg   ATTR1F(VBO_ATTRIB_FOG, x);
378848b8605Smrg}
379848b8605Smrg
380848b8605Smrg
381848b8605Smrg
382848b8605Smrgstatic void GLAPIENTRY
383848b8605SmrgTAG(FogCoordfvEXT)(const GLfloat * v)
384848b8605Smrg{
385848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
386848b8605Smrg   ATTR1FV(VBO_ATTRIB_FOG, v);
387848b8605Smrg}
388848b8605Smrg
389848b8605Smrgstatic void GLAPIENTRY
390848b8605SmrgTAG(Color3f)(GLfloat x, GLfloat y, GLfloat z)
391848b8605Smrg{
392848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
393848b8605Smrg   ATTR3F(VBO_ATTRIB_COLOR0, x, y, z);
394848b8605Smrg}
395848b8605Smrg
396848b8605Smrgstatic void GLAPIENTRY
397848b8605SmrgTAG(Color3fv)(const GLfloat * v)
398848b8605Smrg{
399848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
400848b8605Smrg   ATTR3FV(VBO_ATTRIB_COLOR0, v);
401848b8605Smrg}
402848b8605Smrg
403848b8605Smrgstatic void GLAPIENTRY
404848b8605SmrgTAG(Color4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
405848b8605Smrg{
406848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
407848b8605Smrg   ATTR4F(VBO_ATTRIB_COLOR0, x, y, z, w);
408848b8605Smrg}
409848b8605Smrg
410848b8605Smrgstatic void GLAPIENTRY
411848b8605SmrgTAG(Color4fv)(const GLfloat * v)
412848b8605Smrg{
413848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
414848b8605Smrg   ATTR4FV(VBO_ATTRIB_COLOR0, v);
415848b8605Smrg}
416848b8605Smrg
417848b8605Smrg
418848b8605Smrg
419848b8605Smrgstatic void GLAPIENTRY
420848b8605SmrgTAG(SecondaryColor3fEXT)(GLfloat x, GLfloat y, GLfloat z)
421848b8605Smrg{
422848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
423848b8605Smrg   ATTR3F(VBO_ATTRIB_COLOR1, x, y, z);
424848b8605Smrg}
425848b8605Smrg
426848b8605Smrgstatic void GLAPIENTRY
427848b8605SmrgTAG(SecondaryColor3fvEXT)(const GLfloat * v)
428848b8605Smrg{
429848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
430848b8605Smrg   ATTR3FV(VBO_ATTRIB_COLOR1, v);
431848b8605Smrg}
432848b8605Smrg
433848b8605Smrg
434848b8605Smrg
435848b8605Smrgstatic void GLAPIENTRY
436848b8605SmrgTAG(EdgeFlag)(GLboolean b)
437848b8605Smrg{
438848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
439848b8605Smrg   ATTR1F(VBO_ATTRIB_EDGEFLAG, (GLfloat) b);
440848b8605Smrg}
441848b8605Smrg
442848b8605Smrg
443848b8605Smrg
444848b8605Smrgstatic void GLAPIENTRY
445848b8605SmrgTAG(Indexf)(GLfloat f)
446848b8605Smrg{
447848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
448b8e80941Smrg   ATTR1F(VBO_ATTRIB_COLOR_INDEX, f);
449848b8605Smrg}
450848b8605Smrg
451848b8605Smrgstatic void GLAPIENTRY
452848b8605SmrgTAG(Indexfv)(const GLfloat * f)
453848b8605Smrg{
454848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
455b8e80941Smrg   ATTR1FV(VBO_ATTRIB_COLOR_INDEX, f);
456848b8605Smrg}
457848b8605Smrg
458848b8605Smrg
459848b8605Smrg
460848b8605Smrgstatic void GLAPIENTRY
461848b8605SmrgTAG(MultiTexCoord1f)(GLenum target, GLfloat x)
462848b8605Smrg{
463848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
464848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
465848b8605Smrg   ATTR1F(attr, x);
466848b8605Smrg}
467848b8605Smrg
468848b8605Smrgstatic void GLAPIENTRY
469848b8605SmrgTAG(MultiTexCoord1fv)(GLenum target, const GLfloat * v)
470848b8605Smrg{
471848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
472848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
473848b8605Smrg   ATTR1FV(attr, v);
474848b8605Smrg}
475848b8605Smrg
476848b8605Smrgstatic void GLAPIENTRY
477848b8605SmrgTAG(MultiTexCoord2f)(GLenum target, GLfloat x, GLfloat y)
478848b8605Smrg{
479848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
480848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
481848b8605Smrg   ATTR2F(attr, x, y);
482848b8605Smrg}
483848b8605Smrg
484848b8605Smrgstatic void GLAPIENTRY
485848b8605SmrgTAG(MultiTexCoord2fv)(GLenum target, const GLfloat * v)
486848b8605Smrg{
487848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
488848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
489848b8605Smrg   ATTR2FV(attr, v);
490848b8605Smrg}
491848b8605Smrg
492848b8605Smrgstatic void GLAPIENTRY
493848b8605SmrgTAG(MultiTexCoord3f)(GLenum target, GLfloat x, GLfloat y, GLfloat z)
494848b8605Smrg{
495848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
496848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
497848b8605Smrg   ATTR3F(attr, x, y, z);
498848b8605Smrg}
499848b8605Smrg
500848b8605Smrgstatic void GLAPIENTRY
501848b8605SmrgTAG(MultiTexCoord3fv)(GLenum target, const GLfloat * v)
502848b8605Smrg{
503848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
504848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
505848b8605Smrg   ATTR3FV(attr, v);
506848b8605Smrg}
507848b8605Smrg
508848b8605Smrgstatic void GLAPIENTRY
509848b8605SmrgTAG(MultiTexCoord4f)(GLenum target, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
510848b8605Smrg{
511848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
512848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
513848b8605Smrg   ATTR4F(attr, x, y, z, w);
514848b8605Smrg}
515848b8605Smrg
516848b8605Smrgstatic void GLAPIENTRY
517848b8605SmrgTAG(MultiTexCoord4fv)(GLenum target, const GLfloat * v)
518848b8605Smrg{
519848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
520848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
521848b8605Smrg   ATTR4FV(attr, v);
522848b8605Smrg}
523848b8605Smrg
524848b8605Smrg
525848b8605Smrgstatic void GLAPIENTRY
526848b8605SmrgTAG(VertexAttrib1fARB)(GLuint index, GLfloat x)
527848b8605Smrg{
528848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
529b8e80941Smrg   if (is_vertex_position(ctx, index))
530848b8605Smrg      ATTR1F(0, x);
531848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
532848b8605Smrg      ATTR1F(VBO_ATTRIB_GENERIC0 + index, x);
533848b8605Smrg   else
534848b8605Smrg      ERROR(GL_INVALID_VALUE);
535848b8605Smrg}
536848b8605Smrg
537848b8605Smrgstatic void GLAPIENTRY
538848b8605SmrgTAG(VertexAttrib1fvARB)(GLuint index, const GLfloat * v)
539848b8605Smrg{
540848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
541b8e80941Smrg   if (is_vertex_position(ctx, index))
542848b8605Smrg      ATTR1FV(0, v);
543848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
544848b8605Smrg      ATTR1FV(VBO_ATTRIB_GENERIC0 + index, v);
545848b8605Smrg   else
546848b8605Smrg      ERROR(GL_INVALID_VALUE);
547848b8605Smrg}
548848b8605Smrg
549848b8605Smrgstatic void GLAPIENTRY
550848b8605SmrgTAG(VertexAttrib2fARB)(GLuint index, GLfloat x, GLfloat y)
551848b8605Smrg{
552848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
553b8e80941Smrg   if (is_vertex_position(ctx, index))
554848b8605Smrg      ATTR2F(0, x, y);
555848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
556848b8605Smrg      ATTR2F(VBO_ATTRIB_GENERIC0 + index, x, y);
557848b8605Smrg   else
558848b8605Smrg      ERROR(GL_INVALID_VALUE);
559848b8605Smrg}
560848b8605Smrg
561848b8605Smrgstatic void GLAPIENTRY
562848b8605SmrgTAG(VertexAttrib2fvARB)(GLuint index, const GLfloat * v)
563848b8605Smrg{
564848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
565b8e80941Smrg   if (is_vertex_position(ctx, index))
566848b8605Smrg      ATTR2FV(0, v);
567848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
568848b8605Smrg      ATTR2FV(VBO_ATTRIB_GENERIC0 + index, v);
569848b8605Smrg   else
570848b8605Smrg      ERROR(GL_INVALID_VALUE);
571848b8605Smrg}
572848b8605Smrg
573848b8605Smrgstatic void GLAPIENTRY
574848b8605SmrgTAG(VertexAttrib3fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z)
575848b8605Smrg{
576848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
577b8e80941Smrg   if (is_vertex_position(ctx, index))
578848b8605Smrg      ATTR3F(0, x, y, z);
579848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
580848b8605Smrg      ATTR3F(VBO_ATTRIB_GENERIC0 + index, x, y, z);
581848b8605Smrg   else
582848b8605Smrg      ERROR(GL_INVALID_VALUE);
583848b8605Smrg}
584848b8605Smrg
585848b8605Smrgstatic void GLAPIENTRY
586848b8605SmrgTAG(VertexAttrib3fvARB)(GLuint index, const GLfloat * v)
587848b8605Smrg{
588848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
589b8e80941Smrg   if (is_vertex_position(ctx, index))
590848b8605Smrg      ATTR3FV(0, v);
591848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
592848b8605Smrg      ATTR3FV(VBO_ATTRIB_GENERIC0 + index, v);
593848b8605Smrg   else
594848b8605Smrg      ERROR(GL_INVALID_VALUE);
595848b8605Smrg}
596848b8605Smrg
597848b8605Smrgstatic void GLAPIENTRY
598848b8605SmrgTAG(VertexAttrib4fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
599848b8605Smrg{
600848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
601b8e80941Smrg   if (is_vertex_position(ctx, index))
602848b8605Smrg      ATTR4F(0, x, y, z, w);
603848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
604848b8605Smrg      ATTR4F(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
605848b8605Smrg   else
606848b8605Smrg      ERROR(GL_INVALID_VALUE);
607848b8605Smrg}
608848b8605Smrg
609848b8605Smrgstatic void GLAPIENTRY
610848b8605SmrgTAG(VertexAttrib4fvARB)(GLuint index, const GLfloat * v)
611848b8605Smrg{
612848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
613b8e80941Smrg   if (is_vertex_position(ctx, index))
614848b8605Smrg      ATTR4FV(0, v);
615848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
616848b8605Smrg      ATTR4FV(VBO_ATTRIB_GENERIC0 + index, v);
617848b8605Smrg   else
618848b8605Smrg      ERROR(GL_INVALID_VALUE);
619848b8605Smrg}
620848b8605Smrg
621848b8605Smrg
622848b8605Smrg
623848b8605Smrg/* Integer-valued generic attributes.
624848b8605Smrg * XXX: the integers just get converted to floats at this time
625848b8605Smrg */
626848b8605Smrgstatic void GLAPIENTRY
627848b8605SmrgTAG(VertexAttribI1i)(GLuint index, GLint x)
628848b8605Smrg{
629848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
630b8e80941Smrg   if (is_vertex_position(ctx, index))
631848b8605Smrg      ATTR1I(0, x);
632848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
633848b8605Smrg      ATTR1I(VBO_ATTRIB_GENERIC0 + index, x);
634848b8605Smrg   else
635848b8605Smrg      ERROR(GL_INVALID_VALUE);
636848b8605Smrg}
637848b8605Smrg
638848b8605Smrgstatic void GLAPIENTRY
639848b8605SmrgTAG(VertexAttribI2i)(GLuint index, GLint x, GLint y)
640848b8605Smrg{
641848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
642b8e80941Smrg   if (is_vertex_position(ctx, index))
643848b8605Smrg      ATTR2I(0, x, y);
644848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
645848b8605Smrg      ATTR2I(VBO_ATTRIB_GENERIC0 + index, x, y);
646848b8605Smrg   else
647848b8605Smrg      ERROR(GL_INVALID_VALUE);
648848b8605Smrg}
649848b8605Smrg
650848b8605Smrgstatic void GLAPIENTRY
651848b8605SmrgTAG(VertexAttribI3i)(GLuint index, GLint x, GLint y, GLint z)
652848b8605Smrg{
653848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
654b8e80941Smrg   if (is_vertex_position(ctx, index))
655848b8605Smrg      ATTR3I(0, x, y, z);
656848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
657848b8605Smrg      ATTR3I(VBO_ATTRIB_GENERIC0 + index, x, y, z);
658848b8605Smrg   else
659848b8605Smrg      ERROR(GL_INVALID_VALUE);
660848b8605Smrg}
661848b8605Smrg
662848b8605Smrgstatic void GLAPIENTRY
663848b8605SmrgTAG(VertexAttribI4i)(GLuint index, GLint x, GLint y, GLint z, GLint w)
664848b8605Smrg{
665848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
666b8e80941Smrg   if (is_vertex_position(ctx, index))
667848b8605Smrg      ATTR4I(0, x, y, z, w);
668848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
669848b8605Smrg      ATTR4I(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
670848b8605Smrg   else
671848b8605Smrg      ERROR(GL_INVALID_VALUE);
672848b8605Smrg}
673848b8605Smrg
674848b8605Smrgstatic void GLAPIENTRY
675848b8605SmrgTAG(VertexAttribI2iv)(GLuint index, const GLint *v)
676848b8605Smrg{
677848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
678b8e80941Smrg   if (is_vertex_position(ctx, index))
679848b8605Smrg      ATTR2IV(0, v);
680848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
681848b8605Smrg      ATTR2IV(VBO_ATTRIB_GENERIC0 + index, v);
682848b8605Smrg   else
683848b8605Smrg      ERROR(GL_INVALID_VALUE);
684848b8605Smrg}
685848b8605Smrg
686848b8605Smrgstatic void GLAPIENTRY
687848b8605SmrgTAG(VertexAttribI3iv)(GLuint index, const GLint *v)
688848b8605Smrg{
689848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
690b8e80941Smrg   if (is_vertex_position(ctx, index))
691848b8605Smrg      ATTR3IV(0, v);
692848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
693848b8605Smrg      ATTR3IV(VBO_ATTRIB_GENERIC0 + index, v);
694848b8605Smrg   else
695848b8605Smrg      ERROR(GL_INVALID_VALUE);
696848b8605Smrg}
697848b8605Smrg
698848b8605Smrgstatic void GLAPIENTRY
699848b8605SmrgTAG(VertexAttribI4iv)(GLuint index, const GLint *v)
700848b8605Smrg{
701848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
702b8e80941Smrg   if (is_vertex_position(ctx, index))
703848b8605Smrg      ATTR4IV(0, v);
704848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
705848b8605Smrg      ATTR4IV(VBO_ATTRIB_GENERIC0 + index, v);
706848b8605Smrg   else
707848b8605Smrg      ERROR(GL_INVALID_VALUE);
708848b8605Smrg}
709848b8605Smrg
710848b8605Smrg
711848b8605Smrg
712848b8605Smrg/* Unsigned integer-valued generic attributes.
713848b8605Smrg * XXX: the integers just get converted to floats at this time
714848b8605Smrg */
715848b8605Smrgstatic void GLAPIENTRY
716848b8605SmrgTAG(VertexAttribI1ui)(GLuint index, GLuint x)
717848b8605Smrg{
718848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
719b8e80941Smrg   if (is_vertex_position(ctx, index))
720848b8605Smrg      ATTR1UI(0, x);
721848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
722848b8605Smrg      ATTR1UI(VBO_ATTRIB_GENERIC0 + index, x);
723848b8605Smrg   else
724848b8605Smrg      ERROR(GL_INVALID_VALUE);
725848b8605Smrg}
726848b8605Smrg
727848b8605Smrgstatic void GLAPIENTRY
728848b8605SmrgTAG(VertexAttribI2ui)(GLuint index, GLuint x, GLuint y)
729848b8605Smrg{
730848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
731b8e80941Smrg   if (is_vertex_position(ctx, index))
732848b8605Smrg      ATTR2UI(0, x, y);
733848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
734848b8605Smrg      ATTR2UI(VBO_ATTRIB_GENERIC0 + index, x, y);
735848b8605Smrg   else
736848b8605Smrg      ERROR(GL_INVALID_VALUE);
737848b8605Smrg}
738848b8605Smrg
739848b8605Smrgstatic void GLAPIENTRY
740848b8605SmrgTAG(VertexAttribI3ui)(GLuint index, GLuint x, GLuint y, GLuint z)
741848b8605Smrg{
742848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
743b8e80941Smrg   if (is_vertex_position(ctx, index))
744848b8605Smrg      ATTR3UI(0, x, y, z);
745848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
746848b8605Smrg      ATTR3UI(VBO_ATTRIB_GENERIC0 + index, x, y, z);
747848b8605Smrg   else
748848b8605Smrg      ERROR(GL_INVALID_VALUE);
749848b8605Smrg}
750848b8605Smrg
751848b8605Smrgstatic void GLAPIENTRY
752848b8605SmrgTAG(VertexAttribI4ui)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
753848b8605Smrg{
754848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
755b8e80941Smrg   if (is_vertex_position(ctx, index))
756848b8605Smrg      ATTR4UI(0, x, y, z, w);
757848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
758848b8605Smrg      ATTR4UI(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
759848b8605Smrg   else
760848b8605Smrg      ERROR(GL_INVALID_VALUE);
761848b8605Smrg}
762848b8605Smrg
763848b8605Smrgstatic void GLAPIENTRY
764848b8605SmrgTAG(VertexAttribI2uiv)(GLuint index, const GLuint *v)
765848b8605Smrg{
766848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
767b8e80941Smrg   if (is_vertex_position(ctx, index))
768848b8605Smrg      ATTR2UIV(0, v);
769848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
770848b8605Smrg      ATTR2UIV(VBO_ATTRIB_GENERIC0 + index, v);
771848b8605Smrg   else
772848b8605Smrg      ERROR(GL_INVALID_VALUE);
773848b8605Smrg}
774848b8605Smrg
775848b8605Smrgstatic void GLAPIENTRY
776848b8605SmrgTAG(VertexAttribI3uiv)(GLuint index, const GLuint *v)
777848b8605Smrg{
778848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
779b8e80941Smrg   if (is_vertex_position(ctx, index))
780848b8605Smrg      ATTR3UIV(0, v);
781848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
782848b8605Smrg      ATTR3UIV(VBO_ATTRIB_GENERIC0 + index, v);
783848b8605Smrg   else
784848b8605Smrg      ERROR(GL_INVALID_VALUE);
785848b8605Smrg}
786848b8605Smrg
787848b8605Smrgstatic void GLAPIENTRY
788848b8605SmrgTAG(VertexAttribI4uiv)(GLuint index, const GLuint *v)
789848b8605Smrg{
790848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
791b8e80941Smrg   if (is_vertex_position(ctx, index))
792848b8605Smrg      ATTR4UIV(0, v);
793848b8605Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
794848b8605Smrg      ATTR4UIV(VBO_ATTRIB_GENERIC0 + index, v);
795848b8605Smrg   else
796848b8605Smrg      ERROR(GL_INVALID_VALUE);
797848b8605Smrg}
798848b8605Smrg
799848b8605Smrg
800848b8605Smrg
801b8e80941Smrg/* These entrypoints are no longer used for NV_vertex_program but they are
802b8e80941Smrg * used by the display list and other code specifically because of their
803b8e80941Smrg * property of aliasing with the legacy Vertex, TexCoord, Normal, etc
804b8e80941Smrg * attributes.  (See vbo_save_loopback.c)
805848b8605Smrg */
806848b8605Smrgstatic void GLAPIENTRY
807848b8605SmrgTAG(VertexAttrib1fNV)(GLuint index, GLfloat x)
808848b8605Smrg{
809848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
810848b8605Smrg   if (index < VBO_ATTRIB_MAX)
811848b8605Smrg      ATTR1F(index, x);
812848b8605Smrg}
813848b8605Smrg
814848b8605Smrgstatic void GLAPIENTRY
815848b8605SmrgTAG(VertexAttrib1fvNV)(GLuint index, const GLfloat * v)
816848b8605Smrg{
817848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
818848b8605Smrg   if (index < VBO_ATTRIB_MAX)
819848b8605Smrg      ATTR1FV(index, v);
820848b8605Smrg}
821848b8605Smrg
822848b8605Smrgstatic void GLAPIENTRY
823848b8605SmrgTAG(VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y)
824848b8605Smrg{
825848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
826848b8605Smrg   if (index < VBO_ATTRIB_MAX)
827848b8605Smrg      ATTR2F(index, x, y);
828848b8605Smrg}
829848b8605Smrg
830848b8605Smrgstatic void GLAPIENTRY
831848b8605SmrgTAG(VertexAttrib2fvNV)(GLuint index, const GLfloat * v)
832848b8605Smrg{
833848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
834848b8605Smrg   if (index < VBO_ATTRIB_MAX)
835848b8605Smrg      ATTR2FV(index, v);
836848b8605Smrg}
837848b8605Smrg
838848b8605Smrgstatic void GLAPIENTRY
839848b8605SmrgTAG(VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z)
840848b8605Smrg{
841848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
842848b8605Smrg   if (index < VBO_ATTRIB_MAX)
843848b8605Smrg      ATTR3F(index, x, y, z);
844848b8605Smrg}
845848b8605Smrg
846848b8605Smrgstatic void GLAPIENTRY
847848b8605SmrgTAG(VertexAttrib3fvNV)(GLuint index,
848848b8605Smrg const GLfloat * v)
849848b8605Smrg{
850848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
851848b8605Smrg   if (index < VBO_ATTRIB_MAX)
852848b8605Smrg      ATTR3FV(index, v);
853848b8605Smrg}
854848b8605Smrg
855848b8605Smrgstatic void GLAPIENTRY
856848b8605SmrgTAG(VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
857848b8605Smrg{
858848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
859848b8605Smrg   if (index < VBO_ATTRIB_MAX)
860848b8605Smrg      ATTR4F(index, x, y, z, w);
861848b8605Smrg}
862848b8605Smrg
863848b8605Smrgstatic void GLAPIENTRY
864848b8605SmrgTAG(VertexAttrib4fvNV)(GLuint index, const GLfloat * v)
865848b8605Smrg{
866848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
867848b8605Smrg   if (index < VBO_ATTRIB_MAX)
868848b8605Smrg      ATTR4FV(index, v);
869848b8605Smrg}
870848b8605Smrg
871848b8605Smrg
872848b8605Smrg#define ERROR_IF_NOT_PACKED_TYPE(ctx, type, func) \
873848b8605Smrg   if (type != GL_INT_2_10_10_10_REV && type != GL_UNSIGNED_INT_2_10_10_10_REV) { \
874848b8605Smrg      _mesa_error(ctx, GL_INVALID_ENUM, "%s(type)", func); \
875848b8605Smrg      return; \
876848b8605Smrg   }
877848b8605Smrg
878848b8605Smrg/* Extended version of ERROR_IF_NOT_PACKED_TYPE which also
879848b8605Smrg * accepts GL_UNSIGNED_INT_10F_11F_11F_REV.
880848b8605Smrg *
881848b8605Smrg * Only used for VertexAttribP[123]ui[v]; VertexAttribP4* cannot use this type,
882848b8605Smrg * and neither can legacy vertex attribs.
883848b8605Smrg */
884848b8605Smrg#define ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, func) \
885848b8605Smrg   if (type != GL_INT_2_10_10_10_REV && type != GL_UNSIGNED_INT_2_10_10_10_REV && \
886848b8605Smrg       type != GL_UNSIGNED_INT_10F_11F_11F_REV) { \
887848b8605Smrg      _mesa_error(ctx, GL_INVALID_ENUM, "%s(type)", func); \
888848b8605Smrg      return; \
889848b8605Smrg   }
890848b8605Smrg
891848b8605Smrgstatic void GLAPIENTRY
892848b8605SmrgTAG(VertexP2ui)(GLenum type, GLuint value)
893848b8605Smrg{
894848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
895848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP2ui");
896848b8605Smrg   ATTR_UI(ctx, 2, type, 0, VBO_ATTRIB_POS, value);
897848b8605Smrg}
898848b8605Smrg
899848b8605Smrgstatic void GLAPIENTRY
900848b8605SmrgTAG(VertexP2uiv)(GLenum type, const GLuint *value)
901848b8605Smrg{
902848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
903848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP2uiv");
904848b8605Smrg   ATTR_UI(ctx, 2, type, 0, VBO_ATTRIB_POS, value[0]);
905848b8605Smrg}
906848b8605Smrg
907848b8605Smrgstatic void GLAPIENTRY
908848b8605SmrgTAG(VertexP3ui)(GLenum type, GLuint value)
909848b8605Smrg{
910848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
911848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP3ui");
912848b8605Smrg   ATTR_UI(ctx, 3, type, 0, VBO_ATTRIB_POS, value);
913848b8605Smrg}
914848b8605Smrg
915848b8605Smrgstatic void GLAPIENTRY
916848b8605SmrgTAG(VertexP3uiv)(GLenum type, const GLuint *value)
917848b8605Smrg{
918848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
919848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP3uiv");
920848b8605Smrg   ATTR_UI(ctx, 3, type, 0, VBO_ATTRIB_POS, value[0]);
921848b8605Smrg}
922848b8605Smrg
923848b8605Smrgstatic void GLAPIENTRY
924848b8605SmrgTAG(VertexP4ui)(GLenum type, GLuint value)
925848b8605Smrg{
926848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
927848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP4ui");
928848b8605Smrg   ATTR_UI(ctx, 4, type, 0, VBO_ATTRIB_POS, value);
929848b8605Smrg}
930848b8605Smrg
931848b8605Smrgstatic void GLAPIENTRY
932848b8605SmrgTAG(VertexP4uiv)(GLenum type, const GLuint *value)
933848b8605Smrg{
934848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
935848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP4uiv");
936848b8605Smrg   ATTR_UI(ctx, 4, type, 0, VBO_ATTRIB_POS, value[0]);
937848b8605Smrg}
938848b8605Smrg
939848b8605Smrgstatic void GLAPIENTRY
940848b8605SmrgTAG(TexCoordP1ui)(GLenum type, GLuint coords)
941848b8605Smrg{
942848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
943848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP1ui");
944848b8605Smrg   ATTR_UI(ctx, 1, type, 0, VBO_ATTRIB_TEX0, coords);
945848b8605Smrg}
946848b8605Smrg
947848b8605Smrgstatic void GLAPIENTRY
948848b8605SmrgTAG(TexCoordP1uiv)(GLenum type, const GLuint *coords)
949848b8605Smrg{
950848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
951848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP1uiv");
952848b8605Smrg   ATTR_UI(ctx, 1, type, 0, VBO_ATTRIB_TEX0, coords[0]);
953848b8605Smrg}
954848b8605Smrg
955848b8605Smrgstatic void GLAPIENTRY
956848b8605SmrgTAG(TexCoordP2ui)(GLenum type, GLuint coords)
957848b8605Smrg{
958848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
959848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP2ui");
960848b8605Smrg   ATTR_UI(ctx, 2, type, 0, VBO_ATTRIB_TEX0, coords);
961848b8605Smrg}
962848b8605Smrg
963848b8605Smrgstatic void GLAPIENTRY
964848b8605SmrgTAG(TexCoordP2uiv)(GLenum type, const GLuint *coords)
965848b8605Smrg{
966848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
967848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP2uiv");
968848b8605Smrg   ATTR_UI(ctx, 2, type, 0, VBO_ATTRIB_TEX0, coords[0]);
969848b8605Smrg}
970848b8605Smrg
971848b8605Smrgstatic void GLAPIENTRY
972848b8605SmrgTAG(TexCoordP3ui)(GLenum type, GLuint coords)
973848b8605Smrg{
974848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
975848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP3ui");
976848b8605Smrg   ATTR_UI(ctx, 3, type, 0, VBO_ATTRIB_TEX0, coords);
977848b8605Smrg}
978848b8605Smrg
979848b8605Smrgstatic void GLAPIENTRY
980848b8605SmrgTAG(TexCoordP3uiv)(GLenum type, const GLuint *coords)
981848b8605Smrg{
982848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
983848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP3uiv");
984848b8605Smrg   ATTR_UI(ctx, 3, type, 0, VBO_ATTRIB_TEX0, coords[0]);
985848b8605Smrg}
986848b8605Smrg
987848b8605Smrgstatic void GLAPIENTRY
988848b8605SmrgTAG(TexCoordP4ui)(GLenum type, GLuint coords)
989848b8605Smrg{
990848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
991848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP4ui");
992848b8605Smrg   ATTR_UI(ctx, 4, type, 0, VBO_ATTRIB_TEX0, coords);
993848b8605Smrg}
994848b8605Smrg
995848b8605Smrgstatic void GLAPIENTRY
996848b8605SmrgTAG(TexCoordP4uiv)(GLenum type, const GLuint *coords)
997848b8605Smrg{
998848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
999848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP4uiv");
1000848b8605Smrg   ATTR_UI(ctx, 4, type, 0, VBO_ATTRIB_TEX0, coords[0]);
1001848b8605Smrg}
1002848b8605Smrg
1003848b8605Smrgstatic void GLAPIENTRY
1004848b8605SmrgTAG(MultiTexCoordP1ui)(GLenum target, GLenum type, GLuint coords)
1005848b8605Smrg{
1006848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1007848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1008848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP1ui");
1009848b8605Smrg   ATTR_UI(ctx, 1, type, 0, attr, coords);
1010848b8605Smrg}
1011848b8605Smrg
1012848b8605Smrgstatic void GLAPIENTRY
1013848b8605SmrgTAG(MultiTexCoordP1uiv)(GLenum target, GLenum type, const GLuint *coords)
1014848b8605Smrg{
1015848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1016848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1017848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP1uiv");
1018848b8605Smrg   ATTR_UI(ctx, 1, type, 0, attr, coords[0]);
1019848b8605Smrg}
1020848b8605Smrg
1021848b8605Smrgstatic void GLAPIENTRY
1022848b8605SmrgTAG(MultiTexCoordP2ui)(GLenum target, GLenum type, GLuint coords)
1023848b8605Smrg{
1024848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1025848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1026848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP2ui");
1027848b8605Smrg   ATTR_UI(ctx, 2, type, 0, attr, coords);
1028848b8605Smrg}
1029848b8605Smrg
1030848b8605Smrgstatic void GLAPIENTRY
1031848b8605SmrgTAG(MultiTexCoordP2uiv)(GLenum target, GLenum type, const GLuint *coords)
1032848b8605Smrg{
1033848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1034848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1035848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP2uiv");
1036848b8605Smrg   ATTR_UI(ctx, 2, type, 0, attr, coords[0]);
1037848b8605Smrg}
1038848b8605Smrg
1039848b8605Smrgstatic void GLAPIENTRY
1040848b8605SmrgTAG(MultiTexCoordP3ui)(GLenum target, GLenum type, GLuint coords)
1041848b8605Smrg{
1042848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1043848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1044848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP3ui");
1045848b8605Smrg   ATTR_UI(ctx, 3, type, 0, attr, coords);
1046848b8605Smrg}
1047848b8605Smrg
1048848b8605Smrgstatic void GLAPIENTRY
1049848b8605SmrgTAG(MultiTexCoordP3uiv)(GLenum target, GLenum type, const GLuint *coords)
1050848b8605Smrg{
1051848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1052848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1053848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP3uiv");
1054848b8605Smrg   ATTR_UI(ctx, 3, type, 0, attr, coords[0]);
1055848b8605Smrg}
1056848b8605Smrg
1057848b8605Smrgstatic void GLAPIENTRY
1058848b8605SmrgTAG(MultiTexCoordP4ui)(GLenum target, GLenum type, GLuint coords)
1059848b8605Smrg{
1060848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1061848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1062848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP4ui");
1063848b8605Smrg   ATTR_UI(ctx, 4, type, 0, attr, coords);
1064848b8605Smrg}
1065848b8605Smrg
1066848b8605Smrgstatic void GLAPIENTRY
1067848b8605SmrgTAG(MultiTexCoordP4uiv)(GLenum target, GLenum type, const GLuint *coords)
1068848b8605Smrg{
1069848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1070848b8605Smrg   GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
1071848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP4uiv");
1072848b8605Smrg   ATTR_UI(ctx, 4, type, 0, attr, coords[0]);
1073848b8605Smrg}
1074848b8605Smrg
1075848b8605Smrgstatic void GLAPIENTRY
1076848b8605SmrgTAG(NormalP3ui)(GLenum type, GLuint coords)
1077848b8605Smrg{
1078848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1079848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glNormalP3ui");
1080848b8605Smrg   ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_NORMAL, coords);
1081848b8605Smrg}
1082848b8605Smrg
1083848b8605Smrgstatic void GLAPIENTRY
1084848b8605SmrgTAG(NormalP3uiv)(GLenum type, const GLuint *coords)
1085848b8605Smrg{
1086848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1087848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glNormalP3uiv");
1088848b8605Smrg   ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_NORMAL, coords[0]);
1089848b8605Smrg}
1090848b8605Smrg
1091848b8605Smrgstatic void GLAPIENTRY
1092848b8605SmrgTAG(ColorP3ui)(GLenum type, GLuint color)
1093848b8605Smrg{
1094848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1095848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP3ui");
1096848b8605Smrg   ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_COLOR0, color);
1097848b8605Smrg}
1098848b8605Smrg
1099848b8605Smrgstatic void GLAPIENTRY
1100848b8605SmrgTAG(ColorP3uiv)(GLenum type, const GLuint *color)
1101848b8605Smrg{
1102848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1103848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP3uiv");
1104848b8605Smrg   ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_COLOR0, color[0]);
1105848b8605Smrg}
1106848b8605Smrg
1107848b8605Smrgstatic void GLAPIENTRY
1108848b8605SmrgTAG(ColorP4ui)(GLenum type, GLuint color)
1109848b8605Smrg{
1110848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1111848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP4ui");
1112848b8605Smrg   ATTR_UI(ctx, 4, type, 1, VBO_ATTRIB_COLOR0, color);
1113848b8605Smrg}
1114848b8605Smrg
1115848b8605Smrgstatic void GLAPIENTRY
1116848b8605SmrgTAG(ColorP4uiv)(GLenum type, const GLuint *color)
1117848b8605Smrg{
1118848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1119848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP4uiv");
1120848b8605Smrg   ATTR_UI(ctx, 4, type, 1, VBO_ATTRIB_COLOR0, color[0]);
1121848b8605Smrg}
1122848b8605Smrg
1123848b8605Smrgstatic void GLAPIENTRY
1124848b8605SmrgTAG(SecondaryColorP3ui)(GLenum type, GLuint color)
1125848b8605Smrg{
1126848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1127848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glSecondaryColorP3ui");
1128848b8605Smrg   ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_COLOR1, color);
1129848b8605Smrg}
1130848b8605Smrg
1131848b8605Smrgstatic void GLAPIENTRY
1132848b8605SmrgTAG(SecondaryColorP3uiv)(GLenum type, const GLuint *color)
1133848b8605Smrg{
1134848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1135848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glSecondaryColorP3uiv");
1136848b8605Smrg   ATTR_UI(ctx, 3, type, 1, VBO_ATTRIB_COLOR1, color[0]);
1137848b8605Smrg}
1138848b8605Smrg
1139848b8605Smrgstatic void GLAPIENTRY
1140848b8605SmrgTAG(VertexAttribP1ui)(GLuint index, GLenum type, GLboolean normalized,
1141848b8605Smrg		      GLuint value)
1142848b8605Smrg{
1143848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1144848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP1ui");
1145848b8605Smrg   ATTR_UI_INDEX(ctx, 1, type, normalized, index, value);
1146848b8605Smrg}
1147848b8605Smrg
1148848b8605Smrgstatic void GLAPIENTRY
1149848b8605SmrgTAG(VertexAttribP2ui)(GLuint index, GLenum type, GLboolean normalized,
1150848b8605Smrg		      GLuint value)
1151848b8605Smrg{
1152848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1153848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP2ui");
1154848b8605Smrg   ATTR_UI_INDEX(ctx, 2, type, normalized, index, value);
1155848b8605Smrg}
1156848b8605Smrg
1157848b8605Smrgstatic void GLAPIENTRY
1158848b8605SmrgTAG(VertexAttribP3ui)(GLuint index, GLenum type, GLboolean normalized,
1159848b8605Smrg		      GLuint value)
1160848b8605Smrg{
1161848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1162848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP3ui");
1163848b8605Smrg   ATTR_UI_INDEX(ctx, 3, type, normalized, index, value);
1164848b8605Smrg}
1165848b8605Smrg
1166848b8605Smrgstatic void GLAPIENTRY
1167848b8605SmrgTAG(VertexAttribP4ui)(GLuint index, GLenum type, GLboolean normalized,
1168848b8605Smrg		      GLuint value)
1169848b8605Smrg{
1170848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1171848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexAttribP4ui");
1172848b8605Smrg   ATTR_UI_INDEX(ctx, 4, type, normalized, index, value);
1173848b8605Smrg}
1174848b8605Smrg
1175848b8605Smrgstatic void GLAPIENTRY
1176848b8605SmrgTAG(VertexAttribP1uiv)(GLuint index, GLenum type, GLboolean normalized,
1177848b8605Smrg		       const GLuint *value)
1178848b8605Smrg{
1179848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1180848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP1uiv");
1181848b8605Smrg   ATTR_UI_INDEX(ctx, 1, type, normalized, index, *value);
1182848b8605Smrg}
1183848b8605Smrg
1184848b8605Smrgstatic void GLAPIENTRY
1185848b8605SmrgTAG(VertexAttribP2uiv)(GLuint index, GLenum type, GLboolean normalized,
1186848b8605Smrg		       const GLuint *value)
1187848b8605Smrg{
1188848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1189848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP2uiv");
1190848b8605Smrg   ATTR_UI_INDEX(ctx, 2, type, normalized, index, *value);
1191848b8605Smrg}
1192848b8605Smrg
1193848b8605Smrgstatic void GLAPIENTRY
1194848b8605SmrgTAG(VertexAttribP3uiv)(GLuint index, GLenum type, GLboolean normalized,
1195848b8605Smrg		       const GLuint *value)
1196848b8605Smrg{
1197848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1198848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP3uiv");
1199848b8605Smrg   ATTR_UI_INDEX(ctx, 3, type, normalized, index, *value);
1200848b8605Smrg}
1201848b8605Smrg
1202848b8605Smrgstatic void GLAPIENTRY
1203848b8605SmrgTAG(VertexAttribP4uiv)(GLuint index, GLenum type, GLboolean normalized,
1204848b8605Smrg		      const GLuint *value)
1205848b8605Smrg{
1206848b8605Smrg   GET_CURRENT_CONTEXT(ctx);
1207848b8605Smrg   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexAttribP4uiv");
1208848b8605Smrg   ATTR_UI_INDEX(ctx, 4, type, normalized, index, *value);
1209848b8605Smrg}
1210848b8605Smrg
1211848b8605Smrg
1212b8e80941Smrg
1213b8e80941Smrgstatic void GLAPIENTRY
1214b8e80941SmrgTAG(VertexAttribL1d)(GLuint index, GLdouble x)
1215b8e80941Smrg{
1216b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1217b8e80941Smrg   if (is_vertex_position(ctx, index))
1218b8e80941Smrg      ATTR1D(0, x);
1219b8e80941Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1220b8e80941Smrg      ATTR1D(VBO_ATTRIB_GENERIC0 + index, x);
1221b8e80941Smrg   else
1222b8e80941Smrg      ERROR(GL_INVALID_VALUE);
1223b8e80941Smrg}
1224b8e80941Smrg
1225b8e80941Smrgstatic void GLAPIENTRY
1226b8e80941SmrgTAG(VertexAttribL1dv)(GLuint index, const GLdouble * v)
1227b8e80941Smrg{
1228b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1229b8e80941Smrg   if (is_vertex_position(ctx, index))
1230b8e80941Smrg      ATTR1DV(0, v);
1231b8e80941Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1232b8e80941Smrg      ATTR1DV(VBO_ATTRIB_GENERIC0 + index, v);
1233b8e80941Smrg   else
1234b8e80941Smrg      ERROR(GL_INVALID_VALUE);
1235b8e80941Smrg}
1236b8e80941Smrg
1237b8e80941Smrgstatic void GLAPIENTRY
1238b8e80941SmrgTAG(VertexAttribL2d)(GLuint index, GLdouble x, GLdouble y)
1239b8e80941Smrg{
1240b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1241b8e80941Smrg   if (is_vertex_position(ctx, index))
1242b8e80941Smrg      ATTR2D(0, x, y);
1243b8e80941Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1244b8e80941Smrg      ATTR2D(VBO_ATTRIB_GENERIC0 + index, x, y);
1245b8e80941Smrg   else
1246b8e80941Smrg      ERROR(GL_INVALID_VALUE);
1247b8e80941Smrg}
1248b8e80941Smrg
1249b8e80941Smrgstatic void GLAPIENTRY
1250b8e80941SmrgTAG(VertexAttribL2dv)(GLuint index, const GLdouble * v)
1251b8e80941Smrg{
1252b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1253b8e80941Smrg   if (is_vertex_position(ctx, index))
1254b8e80941Smrg      ATTR2DV(0, v);
1255b8e80941Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1256b8e80941Smrg      ATTR2DV(VBO_ATTRIB_GENERIC0 + index, v);
1257b8e80941Smrg   else
1258b8e80941Smrg      ERROR(GL_INVALID_VALUE);
1259b8e80941Smrg}
1260b8e80941Smrg
1261b8e80941Smrgstatic void GLAPIENTRY
1262b8e80941SmrgTAG(VertexAttribL3d)(GLuint index, GLdouble x, GLdouble y, GLdouble z)
1263b8e80941Smrg{
1264b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1265b8e80941Smrg   if (is_vertex_position(ctx, index))
1266b8e80941Smrg      ATTR3D(0, x, y, z);
1267b8e80941Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1268b8e80941Smrg      ATTR3D(VBO_ATTRIB_GENERIC0 + index, x, y, z);
1269b8e80941Smrg   else
1270b8e80941Smrg      ERROR(GL_INVALID_VALUE);
1271b8e80941Smrg}
1272b8e80941Smrg
1273b8e80941Smrgstatic void GLAPIENTRY
1274b8e80941SmrgTAG(VertexAttribL3dv)(GLuint index, const GLdouble * v)
1275b8e80941Smrg{
1276b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1277b8e80941Smrg   if (is_vertex_position(ctx, index))
1278b8e80941Smrg      ATTR3DV(0, v);
1279b8e80941Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1280b8e80941Smrg      ATTR3DV(VBO_ATTRIB_GENERIC0 + index, v);
1281b8e80941Smrg   else
1282b8e80941Smrg      ERROR(GL_INVALID_VALUE);
1283b8e80941Smrg}
1284b8e80941Smrg
1285b8e80941Smrgstatic void GLAPIENTRY
1286b8e80941SmrgTAG(VertexAttribL4d)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w)
1287b8e80941Smrg{
1288b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1289b8e80941Smrg   if (is_vertex_position(ctx, index))
1290b8e80941Smrg      ATTR4D(0, x, y, z, w);
1291b8e80941Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1292b8e80941Smrg      ATTR4D(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
1293b8e80941Smrg   else
1294b8e80941Smrg      ERROR(GL_INVALID_VALUE);
1295b8e80941Smrg}
1296b8e80941Smrg
1297b8e80941Smrgstatic void GLAPIENTRY
1298b8e80941SmrgTAG(VertexAttribL4dv)(GLuint index, const GLdouble * v)
1299b8e80941Smrg{
1300b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1301b8e80941Smrg   if (is_vertex_position(ctx, index))
1302b8e80941Smrg      ATTR4DV(0, v);
1303b8e80941Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1304b8e80941Smrg      ATTR4DV(VBO_ATTRIB_GENERIC0 + index, v);
1305b8e80941Smrg   else
1306b8e80941Smrg      ERROR(GL_INVALID_VALUE);
1307b8e80941Smrg}
1308b8e80941Smrg
1309b8e80941Smrgstatic void GLAPIENTRY
1310b8e80941SmrgTAG(VertexAttribL1ui64ARB)(GLuint index, GLuint64EXT x)
1311b8e80941Smrg{
1312b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1313b8e80941Smrg   if (is_vertex_position(ctx, index))
1314b8e80941Smrg      ATTR1UI64(0, x);
1315b8e80941Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1316b8e80941Smrg      ATTR1UI64(VBO_ATTRIB_GENERIC0 + index, x);
1317b8e80941Smrg   else
1318b8e80941Smrg      ERROR(GL_INVALID_VALUE);
1319b8e80941Smrg}
1320b8e80941Smrg
1321b8e80941Smrgstatic void GLAPIENTRY
1322b8e80941SmrgTAG(VertexAttribL1ui64vARB)(GLuint index, const GLuint64EXT *v)
1323b8e80941Smrg{
1324b8e80941Smrg   GET_CURRENT_CONTEXT(ctx);
1325b8e80941Smrg   if (is_vertex_position(ctx, index))
1326b8e80941Smrg      ATTR1UIV64(0, v);
1327b8e80941Smrg   else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
1328b8e80941Smrg      ATTR1UIV64(VBO_ATTRIB_GENERIC0 + index, v);
1329b8e80941Smrg   else
1330b8e80941Smrg      ERROR(GL_INVALID_VALUE);
1331b8e80941Smrg}
1332b8e80941Smrg
1333848b8605Smrg#undef ATTR1FV
1334848b8605Smrg#undef ATTR2FV
1335848b8605Smrg#undef ATTR3FV
1336848b8605Smrg#undef ATTR4FV
1337848b8605Smrg
1338848b8605Smrg#undef ATTR1F
1339848b8605Smrg#undef ATTR2F
1340848b8605Smrg#undef ATTR3F
1341848b8605Smrg#undef ATTR4F
1342848b8605Smrg
1343848b8605Smrg#undef ATTR_UI
1344848b8605Smrg
1345848b8605Smrg#undef MAT
1346