Home | History | Annotate | Download | only in vbo
      1 /**************************************************************************
      2 
      3 Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas.
      4 Copyright 2011 Dave Airlie (ARB_vertex_type_2_10_10_10_rev support)
      5 All Rights Reserved.
      6 
      7 Permission is hereby granted, free of charge, to any person obtaining a
      8 copy of this software and associated documentation files (the "Software"),
      9 to deal in the Software without restriction, including without limitation
     10 on the rights to use, copy, modify, merge, publish, distribute, sub
     11 license, and/or sell copies of the Software, and to permit persons to whom
     12 the Software is furnished to do so, subject to the following conditions:
     13 
     14 The above copyright notice and this permission notice (including the next
     15 paragraph) shall be included in all copies or substantial portions of the
     16 Software.
     17 
     18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     20 FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     21 TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
     22 DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     23 OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     24 USE OR OTHER DEALINGS IN THE SOFTWARE.
     25 
     26 **************************************************************************/
     27 
     28 /* float */
     29 #define ATTR1FV( A, V ) ATTR( A, 1, GL_FLOAT, (V)[0], 0, 0, 1 )
     30 #define ATTR2FV( A, V ) ATTR( A, 2, GL_FLOAT, (V)[0], (V)[1], 0, 1 )
     31 #define ATTR3FV( A, V ) ATTR( A, 3, GL_FLOAT, (V)[0], (V)[1], (V)[2], 1 )
     32 #define ATTR4FV( A, V ) ATTR( A, 4, GL_FLOAT, (V)[0], (V)[1], (V)[2], (V)[3] )
     33 
     34 #define ATTR1F( A, X )          ATTR( A, 1, GL_FLOAT, X, 0, 0, 1 )
     35 #define ATTR2F( A, X, Y )       ATTR( A, 2, GL_FLOAT, X, Y, 0, 1 )
     36 #define ATTR3F( A, X, Y, Z )    ATTR( A, 3, GL_FLOAT, X, Y, Z, 1 )
     37 #define ATTR4F( A, X, Y, Z, W ) ATTR( A, 4, GL_FLOAT, X, Y, Z, W )
     38 
     39 /* int */
     40 #define ATTRI( A, N, X, Y, Z, W) ATTR( A, N, GL_INT, \
     41                                        INT_AS_FLT(X), INT_AS_FLT(Y), \
     42                                        INT_AS_FLT(Z), INT_AS_FLT(W) )
     43 
     44 #define ATTR2IV( A, V ) ATTRI( A, 2, (V)[0], (V)[1], 0, 1 )
     45 #define ATTR3IV( A, V ) ATTRI( A, 3, (V)[0], (V)[1], (V)[2], 1 )
     46 #define ATTR4IV( A, V ) ATTRI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
     47 
     48 #define ATTR1I( A, X )          ATTRI( A, 1, X, 0, 0, 1 )
     49 #define ATTR2I( A, X, Y )       ATTRI( A, 2, X, Y, 0, 1 )
     50 #define ATTR3I( A, X, Y, Z )    ATTRI( A, 3, X, Y, Z, 1 )
     51 #define ATTR4I( A, X, Y, Z, W ) ATTRI( A, 4, X, Y, Z, W )
     52 
     53 
     54 /* uint */
     55 #define ATTRUI( A, N, X, Y, Z, W) ATTR( A, N, GL_UNSIGNED_INT, \
     56                                         UINT_AS_FLT(X), UINT_AS_FLT(Y), \
     57                                         UINT_AS_FLT(Z), UINT_AS_FLT(W) )
     58 
     59 #define ATTR2UIV( A, V ) ATTRUI( A, 2, (V)[0], (V)[1], 0, 1 )
     60 #define ATTR3UIV( A, V ) ATTRUI( A, 3, (V)[0], (V)[1], (V)[2], 1 )
     61 #define ATTR4UIV( A, V ) ATTRUI( A, 4, (V)[0], (V)[1], (V)[2], (V)[3] )
     62 
     63 #define ATTR1UI( A, X )          ATTRUI( A, 1, X, 0, 0, 1 )
     64 #define ATTR2UI( A, X, Y )       ATTRUI( A, 2, X, Y, 0, 1 )
     65 #define ATTR3UI( A, X, Y, Z )    ATTRUI( A, 3, X, Y, Z, 1 )
     66 #define ATTR4UI( A, X, Y, Z, W ) ATTRUI( A, 4, X, Y, Z, W )
     67 
     68 #define MAT_ATTR( A, N, V ) ATTR( A, N, GL_FLOAT, (V)[0], (V)[1], (V)[2], (V)[3] )
     69 
     70 static inline float conv_ui10_to_norm_float(unsigned ui10)
     71 {
     72    return (float)(ui10) / 1023.0;
     73 }
     74 
     75 static inline float conv_ui2_to_norm_float(unsigned ui2)
     76 {
     77    return (float)(ui2) / 3.0;
     78 }
     79 
     80 #define ATTRUI10_1( A, UI ) ATTR( A, 1, GL_FLOAT, (UI) & 0x3ff, 0, 0, 1 )
     81 #define ATTRUI10_2( A, UI ) ATTR( A, 2, GL_FLOAT, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, 0, 1 )
     82 #define ATTRUI10_3( A, UI ) ATTR( A, 3, GL_FLOAT, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, 1 )
     83 #define ATTRUI10_4( A, UI ) ATTR( A, 4, GL_FLOAT, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, ((UI) >> 30) & 0x3 )
     84 
     85 #define ATTRUI10N_1( A, UI ) ATTR( A, 1, GL_FLOAT, conv_ui10_to_norm_float((UI) & 0x3ff), 0, 0, 1 )
     86 #define ATTRUI10N_2( A, UI ) ATTR( A, 2, GL_FLOAT, \
     87 				   conv_ui10_to_norm_float((UI) & 0x3ff), \
     88 				   conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), 0, 1 )
     89 #define ATTRUI10N_3( A, UI ) ATTR( A, 3, GL_FLOAT, \
     90 				   conv_ui10_to_norm_float((UI) & 0x3ff), \
     91 				   conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
     92 				   conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), 1 )
     93 #define ATTRUI10N_4( A, UI ) ATTR( A, 4, GL_FLOAT, \
     94 				   conv_ui10_to_norm_float((UI) & 0x3ff), \
     95 				   conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
     96 				   conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), \
     97 				   conv_ui2_to_norm_float(((UI) >> 30) & 0x3) )
     98 
     99 struct attr_bits_10 {signed int x:10;};
    100 struct attr_bits_2 {signed int x:2;};
    101 
    102 static inline float conv_i10_to_i(int i10)
    103 {
    104    struct attr_bits_10 val;
    105    val.x = i10;
    106    return (float)val.x;
    107 }
    108 
    109 static inline float conv_i2_to_i(int i2)
    110 {
    111    struct attr_bits_2 val;
    112    val.x = i2;
    113    return (float)val.x;
    114 }
    115 
    116 static inline float conv_i10_to_norm_float(int i10)
    117 {
    118    struct attr_bits_10 val;
    119    val.x = i10;
    120    return (2.0F * (float)val.x + 1.0F) * (1.0F  / 511.0F);
    121 }
    122 
    123 static inline float conv_i2_to_norm_float(int i2)
    124 {
    125    struct attr_bits_2 val;
    126    val.x = i2;
    127    return (float)val.x;
    128 }
    129 
    130 #define ATTRI10_1( A, I10 ) ATTR( A, 1, GL_FLOAT, conv_i10_to_i((I10) & 0x3ff), 0, 0, 1 )
    131 #define ATTRI10_2( A, I10 ) ATTR( A, 2, GL_FLOAT, \
    132 				conv_i10_to_i((I10) & 0x3ff),		\
    133 				conv_i10_to_i(((I10) >> 10) & 0x3ff), 0, 1 )
    134 #define ATTRI10_3( A, I10 ) ATTR( A, 3, GL_FLOAT, \
    135 				conv_i10_to_i((I10) & 0x3ff),	    \
    136 				conv_i10_to_i(((I10) >> 10) & 0x3ff), \
    137 				conv_i10_to_i(((I10) >> 20) & 0x3ff), 1 )
    138 #define ATTRI10_4( A, I10 ) ATTR( A, 4, GL_FLOAT, \
    139 				conv_i10_to_i((I10) & 0x3ff),		\
    140 				conv_i10_to_i(((I10) >> 10) & 0x3ff), \
    141 				conv_i10_to_i(((I10) >> 20) & 0x3ff), \
    142 				conv_i2_to_i(((I10) >> 30) & 0x3))
    143 
    144 
    145 #define ATTRI10N_1( A, I10 ) ATTR( A, 1, GL_FLOAT, conv_i10_to_norm_float((I10) & 0x3ff), 0, 0, 1 )
    146 #define ATTRI10N_2( A, I10 ) ATTR( A, 2, GL_FLOAT, \
    147 				conv_i10_to_norm_float((I10) & 0x3ff),		\
    148 				conv_i10_to_norm_float(((I10) >> 10) & 0x3ff), 0, 1 )
    149 #define ATTRI10N_3( A, I10 ) ATTR( A, 3, GL_FLOAT, \
    150 				conv_i10_to_norm_float((I10) & 0x3ff),	    \
    151 				conv_i10_to_norm_float(((I10) >> 10) & 0x3ff), \
    152 				conv_i10_to_norm_float(((I10) >> 20) & 0x3ff), 1 )
    153 #define ATTRI10N_4( A, I10 ) ATTR( A, 4, GL_FLOAT, \
    154 				conv_i10_to_norm_float((I10) & 0x3ff),		\
    155 				conv_i10_to_norm_float(((I10) >> 10) & 0x3ff), \
    156 				conv_i10_to_norm_float(((I10) >> 20) & 0x3ff), \
    157 				conv_i2_to_norm_float(((I10) >> 30) & 0x3))
    158 
    159 #define ATTR_UI(val, type, normalized, attr, arg) do {		\
    160    if ((type) == GL_UNSIGNED_INT_2_10_10_10_REV) {		\
    161       if (normalized) {						\
    162 	 ATTRUI10N_##val((attr), (arg));			\
    163       } else {							\
    164 	 ATTRUI10_##val((attr), (arg));				\
    165       }								\
    166    }   else if ((type) == GL_INT_2_10_10_10_REV) {		\
    167       if (normalized) {						\
    168 	 ATTRI10N_##val((attr), (arg));				\
    169       } else {							\
    170 	 ATTRI10_##val((attr), (arg));				\
    171       }								\
    172    } else							\
    173       ERROR(GL_INVALID_VALUE);					\
    174    } while(0)
    175 
    176 #define ATTR_UI_INDEX(val, type, normalized, index, arg) do {	\
    177       if ((index) == 0) {					\
    178 	 ATTR_UI(val, (type), normalized, 0, (arg));			\
    179       } else if ((index) < MAX_VERTEX_GENERIC_ATTRIBS) {		\
    180 	 ATTR_UI(val, (type), normalized, VBO_ATTRIB_GENERIC0 + (index), (arg)); \
    181       } else								\
    182 	 ERROR(GL_INVALID_VALUE);					\
    183    } while(0)
    184 
    185 static void GLAPIENTRY
    186 TAG(Vertex2f)(GLfloat x, GLfloat y)
    187 {
    188    GET_CURRENT_CONTEXT(ctx);
    189    ATTR2F(VBO_ATTRIB_POS, x, y);
    190 }
    191 
    192 static void GLAPIENTRY
    193 TAG(Vertex2fv)(const GLfloat * v)
    194 {
    195    GET_CURRENT_CONTEXT(ctx);
    196    ATTR2FV(VBO_ATTRIB_POS, v);
    197 }
    198 
    199 static void GLAPIENTRY
    200 TAG(Vertex3f)(GLfloat x, GLfloat y, GLfloat z)
    201 {
    202    GET_CURRENT_CONTEXT(ctx);
    203    ATTR3F(VBO_ATTRIB_POS, x, y, z);
    204 }
    205 
    206 static void GLAPIENTRY
    207 TAG(Vertex3fv)(const GLfloat * v)
    208 {
    209    GET_CURRENT_CONTEXT(ctx);
    210    ATTR3FV(VBO_ATTRIB_POS, v);
    211 }
    212 
    213 static void GLAPIENTRY
    214 TAG(Vertex4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
    215 {
    216    GET_CURRENT_CONTEXT(ctx);
    217    ATTR4F(VBO_ATTRIB_POS, x, y, z, w);
    218 }
    219 
    220 static void GLAPIENTRY
    221 TAG(Vertex4fv)(const GLfloat * v)
    222 {
    223    GET_CURRENT_CONTEXT(ctx);
    224    ATTR4FV(VBO_ATTRIB_POS, v);
    225 }
    226 
    227 
    228 
    229 static void GLAPIENTRY
    230 TAG(TexCoord1f)(GLfloat x)
    231 {
    232    GET_CURRENT_CONTEXT(ctx);
    233    ATTR1F(VBO_ATTRIB_TEX0, x);
    234 }
    235 
    236 static void GLAPIENTRY
    237 TAG(TexCoord1fv)(const GLfloat * v)
    238 {
    239    GET_CURRENT_CONTEXT(ctx);
    240    ATTR1FV(VBO_ATTRIB_TEX0, v);
    241 }
    242 
    243 static void GLAPIENTRY
    244 TAG(TexCoord2f)(GLfloat x, GLfloat y)
    245 {
    246    GET_CURRENT_CONTEXT(ctx);
    247    ATTR2F(VBO_ATTRIB_TEX0, x, y);
    248 }
    249 
    250 static void GLAPIENTRY
    251 TAG(TexCoord2fv)(const GLfloat * v)
    252 {
    253    GET_CURRENT_CONTEXT(ctx);
    254    ATTR2FV(VBO_ATTRIB_TEX0, v);
    255 }
    256 
    257 static void GLAPIENTRY
    258 TAG(TexCoord3f)(GLfloat x, GLfloat y, GLfloat z)
    259 {
    260    GET_CURRENT_CONTEXT(ctx);
    261    ATTR3F(VBO_ATTRIB_TEX0, x, y, z);
    262 }
    263 
    264 static void GLAPIENTRY
    265 TAG(TexCoord3fv)(const GLfloat * v)
    266 {
    267    GET_CURRENT_CONTEXT(ctx);
    268    ATTR3FV(VBO_ATTRIB_TEX0, v);
    269 }
    270 
    271 static void GLAPIENTRY
    272 TAG(TexCoord4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
    273 {
    274    GET_CURRENT_CONTEXT(ctx);
    275    ATTR4F(VBO_ATTRIB_TEX0, x, y, z, w);
    276 }
    277 
    278 static void GLAPIENTRY
    279 TAG(TexCoord4fv)(const GLfloat * v)
    280 {
    281    GET_CURRENT_CONTEXT(ctx);
    282    ATTR4FV(VBO_ATTRIB_TEX0, v);
    283 }
    284 
    285 
    286 
    287 static void GLAPIENTRY
    288 TAG(Normal3f)(GLfloat x, GLfloat y, GLfloat z)
    289 {
    290    GET_CURRENT_CONTEXT(ctx);
    291    ATTR3F(VBO_ATTRIB_NORMAL, x, y, z);
    292 }
    293 
    294 static void GLAPIENTRY
    295 TAG(Normal3fv)(const GLfloat * v)
    296 {
    297    GET_CURRENT_CONTEXT(ctx);
    298    ATTR3FV(VBO_ATTRIB_NORMAL, v);
    299 }
    300 
    301 
    302 
    303 static void GLAPIENTRY
    304 TAG(FogCoordfEXT)(GLfloat x)
    305 {
    306    GET_CURRENT_CONTEXT(ctx);
    307    ATTR1F(VBO_ATTRIB_FOG, x);
    308 }
    309 
    310 
    311 
    312 static void GLAPIENTRY
    313 TAG(FogCoordfvEXT)(const GLfloat * v)
    314 {
    315    GET_CURRENT_CONTEXT(ctx);
    316    ATTR1FV(VBO_ATTRIB_FOG, v);
    317 }
    318 
    319 static void GLAPIENTRY
    320 TAG(Color3f)(GLfloat x, GLfloat y, GLfloat z)
    321 {
    322    GET_CURRENT_CONTEXT(ctx);
    323    ATTR3F(VBO_ATTRIB_COLOR0, x, y, z);
    324 }
    325 
    326 static void GLAPIENTRY
    327 TAG(Color3fv)(const GLfloat * v)
    328 {
    329    GET_CURRENT_CONTEXT(ctx);
    330    ATTR3FV(VBO_ATTRIB_COLOR0, v);
    331 }
    332 
    333 static void GLAPIENTRY
    334 TAG(Color4f)(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
    335 {
    336    GET_CURRENT_CONTEXT(ctx);
    337    ATTR4F(VBO_ATTRIB_COLOR0, x, y, z, w);
    338 }
    339 
    340 static void GLAPIENTRY
    341 TAG(Color4fv)(const GLfloat * v)
    342 {
    343    GET_CURRENT_CONTEXT(ctx);
    344    ATTR4FV(VBO_ATTRIB_COLOR0, v);
    345 }
    346 
    347 
    348 
    349 static void GLAPIENTRY
    350 TAG(SecondaryColor3fEXT)(GLfloat x, GLfloat y, GLfloat z)
    351 {
    352    GET_CURRENT_CONTEXT(ctx);
    353    ATTR3F(VBO_ATTRIB_COLOR1, x, y, z);
    354 }
    355 
    356 static void GLAPIENTRY
    357 TAG(SecondaryColor3fvEXT)(const GLfloat * v)
    358 {
    359    GET_CURRENT_CONTEXT(ctx);
    360    ATTR3FV(VBO_ATTRIB_COLOR1, v);
    361 }
    362 
    363 
    364 
    365 static void GLAPIENTRY
    366 TAG(EdgeFlag)(GLboolean b)
    367 {
    368    GET_CURRENT_CONTEXT(ctx);
    369    ATTR1F(VBO_ATTRIB_EDGEFLAG, (GLfloat) b);
    370 }
    371 
    372 
    373 
    374 static void GLAPIENTRY
    375 TAG(Indexf)(GLfloat f)
    376 {
    377    GET_CURRENT_CONTEXT(ctx);
    378    ATTR1F(VBO_ATTRIB_INDEX, f);
    379 }
    380 
    381 static void GLAPIENTRY
    382 TAG(Indexfv)(const GLfloat * f)
    383 {
    384    GET_CURRENT_CONTEXT(ctx);
    385    ATTR1FV(VBO_ATTRIB_INDEX, f);
    386 }
    387 
    388 
    389 
    390 static void GLAPIENTRY
    391 TAG(MultiTexCoord1f)(GLenum target, GLfloat x)
    392 {
    393    GET_CURRENT_CONTEXT(ctx);
    394    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    395    ATTR1F(attr, x);
    396 }
    397 
    398 static void GLAPIENTRY
    399 TAG(MultiTexCoord1fv)(GLenum target, const GLfloat * v)
    400 {
    401    GET_CURRENT_CONTEXT(ctx);
    402    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    403    ATTR1FV(attr, v);
    404 }
    405 
    406 static void GLAPIENTRY
    407 TAG(MultiTexCoord2f)(GLenum target, GLfloat x, GLfloat y)
    408 {
    409    GET_CURRENT_CONTEXT(ctx);
    410    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    411    ATTR2F(attr, x, y);
    412 }
    413 
    414 static void GLAPIENTRY
    415 TAG(MultiTexCoord2fv)(GLenum target, const GLfloat * v)
    416 {
    417    GET_CURRENT_CONTEXT(ctx);
    418    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    419    ATTR2FV(attr, v);
    420 }
    421 
    422 static void GLAPIENTRY
    423 TAG(MultiTexCoord3f)(GLenum target, GLfloat x, GLfloat y, GLfloat z)
    424 {
    425    GET_CURRENT_CONTEXT(ctx);
    426    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    427    ATTR3F(attr, x, y, z);
    428 }
    429 
    430 static void GLAPIENTRY
    431 TAG(MultiTexCoord3fv)(GLenum target, const GLfloat * v)
    432 {
    433    GET_CURRENT_CONTEXT(ctx);
    434    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    435    ATTR3FV(attr, v);
    436 }
    437 
    438 static void GLAPIENTRY
    439 TAG(MultiTexCoord4f)(GLenum target, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
    440 {
    441    GET_CURRENT_CONTEXT(ctx);
    442    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    443    ATTR4F(attr, x, y, z, w);
    444 }
    445 
    446 static void GLAPIENTRY
    447 TAG(MultiTexCoord4fv)(GLenum target, const GLfloat * v)
    448 {
    449    GET_CURRENT_CONTEXT(ctx);
    450    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    451    ATTR4FV(attr, v);
    452 }
    453 
    454 
    455 
    456 static void GLAPIENTRY
    457 TAG(VertexAttrib1fARB)(GLuint index, GLfloat x)
    458 {
    459    GET_CURRENT_CONTEXT(ctx);
    460    if (index == 0)
    461       ATTR1F(0, x);
    462    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    463       ATTR1F(VBO_ATTRIB_GENERIC0 + index, x);
    464    else
    465       ERROR(GL_INVALID_VALUE);
    466 }
    467 
    468 static void GLAPIENTRY
    469 TAG(VertexAttrib1fvARB)(GLuint index, const GLfloat * v)
    470 {
    471    GET_CURRENT_CONTEXT(ctx);
    472    if (index == 0)
    473       ATTR1FV(0, v);
    474    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    475       ATTR1FV(VBO_ATTRIB_GENERIC0 + index, v);
    476    else
    477       ERROR(GL_INVALID_VALUE);
    478 }
    479 
    480 static void GLAPIENTRY
    481 TAG(VertexAttrib2fARB)(GLuint index, GLfloat x, GLfloat y)
    482 {
    483    GET_CURRENT_CONTEXT(ctx);
    484    if (index == 0)
    485       ATTR2F(0, x, y);
    486    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    487       ATTR2F(VBO_ATTRIB_GENERIC0 + index, x, y);
    488    else
    489       ERROR(GL_INVALID_VALUE);
    490 }
    491 
    492 static void GLAPIENTRY
    493 TAG(VertexAttrib2fvARB)(GLuint index, const GLfloat * v)
    494 {
    495    GET_CURRENT_CONTEXT(ctx);
    496    if (index == 0)
    497       ATTR2FV(0, v);
    498    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    499       ATTR2FV(VBO_ATTRIB_GENERIC0 + index, v);
    500    else
    501       ERROR(GL_INVALID_VALUE);
    502 }
    503 
    504 static void GLAPIENTRY
    505 TAG(VertexAttrib3fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z)
    506 {
    507    GET_CURRENT_CONTEXT(ctx);
    508    if (index == 0)
    509       ATTR3F(0, x, y, z);
    510    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    511       ATTR3F(VBO_ATTRIB_GENERIC0 + index, x, y, z);
    512    else
    513       ERROR(GL_INVALID_VALUE);
    514 }
    515 
    516 static void GLAPIENTRY
    517 TAG(VertexAttrib3fvARB)(GLuint index, const GLfloat * v)
    518 {
    519    GET_CURRENT_CONTEXT(ctx);
    520    if (index == 0)
    521       ATTR3FV(0, v);
    522    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    523       ATTR3FV(VBO_ATTRIB_GENERIC0 + index, v);
    524    else
    525       ERROR(GL_INVALID_VALUE);
    526 }
    527 
    528 static void GLAPIENTRY
    529 TAG(VertexAttrib4fARB)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
    530 {
    531    GET_CURRENT_CONTEXT(ctx);
    532    if (index == 0)
    533       ATTR4F(0, x, y, z, w);
    534    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    535       ATTR4F(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
    536    else
    537       ERROR(GL_INVALID_VALUE);
    538 }
    539 
    540 static void GLAPIENTRY
    541 TAG(VertexAttrib4fvARB)(GLuint index, const GLfloat * v)
    542 {
    543    GET_CURRENT_CONTEXT(ctx);
    544    if (index == 0)
    545       ATTR4FV(0, v);
    546    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    547       ATTR4FV(VBO_ATTRIB_GENERIC0 + index, v);
    548    else
    549       ERROR(GL_INVALID_VALUE);
    550 }
    551 
    552 
    553 
    554 /* Integer-valued generic attributes.
    555  * XXX: the integers just get converted to floats at this time
    556  */
    557 static void GLAPIENTRY
    558 TAG(VertexAttribI1i)(GLuint index, GLint x)
    559 {
    560    GET_CURRENT_CONTEXT(ctx);
    561    if (index == 0)
    562       ATTR1I(0, x);
    563    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    564       ATTR1I(VBO_ATTRIB_GENERIC0 + index, x);
    565    else
    566       ERROR(GL_INVALID_VALUE);
    567 }
    568 
    569 static void GLAPIENTRY
    570 TAG(VertexAttribI2i)(GLuint index, GLint x, GLint y)
    571 {
    572    GET_CURRENT_CONTEXT(ctx);
    573    if (index == 0)
    574       ATTR2I(0, x, y);
    575    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    576       ATTR2I(VBO_ATTRIB_GENERIC0 + index, x, y);
    577    else
    578       ERROR(GL_INVALID_VALUE);
    579 }
    580 
    581 static void GLAPIENTRY
    582 TAG(VertexAttribI3i)(GLuint index, GLint x, GLint y, GLint z)
    583 {
    584    GET_CURRENT_CONTEXT(ctx);
    585    if (index == 0)
    586       ATTR3I(0, x, y, z);
    587    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    588       ATTR3I(VBO_ATTRIB_GENERIC0 + index, x, y, z);
    589    else
    590       ERROR(GL_INVALID_VALUE);
    591 }
    592 
    593 static void GLAPIENTRY
    594 TAG(VertexAttribI4i)(GLuint index, GLint x, GLint y, GLint z, GLint w)
    595 {
    596    GET_CURRENT_CONTEXT(ctx);
    597    if (index == 0)
    598       ATTR4I(0, x, y, z, w);
    599    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    600       ATTR4I(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
    601    else
    602       ERROR(GL_INVALID_VALUE);
    603 }
    604 
    605 static void GLAPIENTRY
    606 TAG(VertexAttribI2iv)(GLuint index, const GLint *v)
    607 {
    608    GET_CURRENT_CONTEXT(ctx);
    609    if (index == 0)
    610       ATTR2IV(0, v);
    611    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    612       ATTR2IV(VBO_ATTRIB_GENERIC0 + index, v);
    613    else
    614       ERROR(GL_INVALID_VALUE);
    615 }
    616 
    617 static void GLAPIENTRY
    618 TAG(VertexAttribI3iv)(GLuint index, const GLint *v)
    619 {
    620    GET_CURRENT_CONTEXT(ctx);
    621    if (index == 0)
    622       ATTR3IV(0, v);
    623    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    624       ATTR3IV(VBO_ATTRIB_GENERIC0 + index, v);
    625    else
    626       ERROR(GL_INVALID_VALUE);
    627 }
    628 
    629 static void GLAPIENTRY
    630 TAG(VertexAttribI4iv)(GLuint index, const GLint *v)
    631 {
    632    GET_CURRENT_CONTEXT(ctx);
    633    if (index == 0)
    634       ATTR4IV(0, v);
    635    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    636       ATTR4IV(VBO_ATTRIB_GENERIC0 + index, v);
    637    else
    638       ERROR(GL_INVALID_VALUE);
    639 }
    640 
    641 
    642 
    643 /* Unsigned integer-valued generic attributes.
    644  * XXX: the integers just get converted to floats at this time
    645  */
    646 static void GLAPIENTRY
    647 TAG(VertexAttribI1ui)(GLuint index, GLuint x)
    648 {
    649    GET_CURRENT_CONTEXT(ctx);
    650    if (index == 0)
    651       ATTR1UI(0, x);
    652    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    653       ATTR1UI(VBO_ATTRIB_GENERIC0 + index, x);
    654    else
    655       ERROR(GL_INVALID_VALUE);
    656 }
    657 
    658 static void GLAPIENTRY
    659 TAG(VertexAttribI2ui)(GLuint index, GLuint x, GLuint y)
    660 {
    661    GET_CURRENT_CONTEXT(ctx);
    662    if (index == 0)
    663       ATTR2UI(0, x, y);
    664    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    665       ATTR2UI(VBO_ATTRIB_GENERIC0 + index, x, y);
    666    else
    667       ERROR(GL_INVALID_VALUE);
    668 }
    669 
    670 static void GLAPIENTRY
    671 TAG(VertexAttribI3ui)(GLuint index, GLuint x, GLuint y, GLuint z)
    672 {
    673    GET_CURRENT_CONTEXT(ctx);
    674    if (index == 0)
    675       ATTR3UI(0, x, y, z);
    676    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    677       ATTR3UI(VBO_ATTRIB_GENERIC0 + index, x, y, z);
    678    else
    679       ERROR(GL_INVALID_VALUE);
    680 }
    681 
    682 static void GLAPIENTRY
    683 TAG(VertexAttribI4ui)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
    684 {
    685    GET_CURRENT_CONTEXT(ctx);
    686    if (index == 0)
    687       ATTR4UI(0, x, y, z, w);
    688    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    689       ATTR4UI(VBO_ATTRIB_GENERIC0 + index, x, y, z, w);
    690    else
    691       ERROR(GL_INVALID_VALUE);
    692 }
    693 
    694 static void GLAPIENTRY
    695 TAG(VertexAttribI2uiv)(GLuint index, const GLuint *v)
    696 {
    697    GET_CURRENT_CONTEXT(ctx);
    698    if (index == 0)
    699       ATTR2UIV(0, v);
    700    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    701       ATTR2UIV(VBO_ATTRIB_GENERIC0 + index, v);
    702    else
    703       ERROR(GL_INVALID_VALUE);
    704 }
    705 
    706 static void GLAPIENTRY
    707 TAG(VertexAttribI3uiv)(GLuint index, const GLuint *v)
    708 {
    709    GET_CURRENT_CONTEXT(ctx);
    710    if (index == 0)
    711       ATTR3UIV(0, v);
    712    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    713       ATTR3UIV(VBO_ATTRIB_GENERIC0 + index, v);
    714    else
    715       ERROR(GL_INVALID_VALUE);
    716 }
    717 
    718 static void GLAPIENTRY
    719 TAG(VertexAttribI4uiv)(GLuint index, const GLuint *v)
    720 {
    721    GET_CURRENT_CONTEXT(ctx);
    722    if (index == 0)
    723       ATTR4UIV(0, v);
    724    else if (index < MAX_VERTEX_GENERIC_ATTRIBS)
    725       ATTR4UIV(VBO_ATTRIB_GENERIC0 + index, v);
    726    else
    727       ERROR(GL_INVALID_VALUE);
    728 }
    729 
    730 
    731 
    732 /* In addition to supporting NV_vertex_program, these entrypoints are
    733  * used by the display list and other code specifically because of
    734  * their property of aliasing with other attributes.  (See
    735  * vbo_save_loopback.c)
    736  */
    737 static void GLAPIENTRY
    738 TAG(VertexAttrib1fNV)(GLuint index, GLfloat x)
    739 {
    740    GET_CURRENT_CONTEXT(ctx);
    741    if (index < VBO_ATTRIB_MAX)
    742       ATTR1F(index, x);
    743 }
    744 
    745 static void GLAPIENTRY
    746 TAG(VertexAttrib1fvNV)(GLuint index, const GLfloat * v)
    747 {
    748    GET_CURRENT_CONTEXT(ctx);
    749    if (index < VBO_ATTRIB_MAX)
    750       ATTR1FV(index, v);
    751 }
    752 
    753 static void GLAPIENTRY
    754 TAG(VertexAttrib2fNV)(GLuint index, GLfloat x, GLfloat y)
    755 {
    756    GET_CURRENT_CONTEXT(ctx);
    757    if (index < VBO_ATTRIB_MAX)
    758       ATTR2F(index, x, y);
    759 }
    760 
    761 static void GLAPIENTRY
    762 TAG(VertexAttrib2fvNV)(GLuint index, const GLfloat * v)
    763 {
    764    GET_CURRENT_CONTEXT(ctx);
    765    if (index < VBO_ATTRIB_MAX)
    766       ATTR2FV(index, v);
    767 }
    768 
    769 static void GLAPIENTRY
    770 TAG(VertexAttrib3fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z)
    771 {
    772    GET_CURRENT_CONTEXT(ctx);
    773    if (index < VBO_ATTRIB_MAX)
    774       ATTR3F(index, x, y, z);
    775 }
    776 
    777 static void GLAPIENTRY
    778 TAG(VertexAttrib3fvNV)(GLuint index,
    779  const GLfloat * v)
    780 {
    781    GET_CURRENT_CONTEXT(ctx);
    782    if (index < VBO_ATTRIB_MAX)
    783       ATTR3FV(index, v);
    784 }
    785 
    786 static void GLAPIENTRY
    787 TAG(VertexAttrib4fNV)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
    788 {
    789    GET_CURRENT_CONTEXT(ctx);
    790    if (index < VBO_ATTRIB_MAX)
    791       ATTR4F(index, x, y, z, w);
    792 }
    793 
    794 static void GLAPIENTRY
    795 TAG(VertexAttrib4fvNV)(GLuint index, const GLfloat * v)
    796 {
    797    GET_CURRENT_CONTEXT(ctx);
    798    if (index < VBO_ATTRIB_MAX)
    799       ATTR4FV(index, v);
    800 }
    801 
    802 
    803 static void GLAPIENTRY
    804 TAG(VertexP2ui)(GLenum type, GLuint value)
    805 {
    806    GET_CURRENT_CONTEXT(ctx);
    807    ATTR_UI(2, type, 0, VBO_ATTRIB_POS, value);
    808 }
    809 
    810 static void GLAPIENTRY
    811 TAG(VertexP2uiv)(GLenum type, const GLuint *value)
    812 {
    813    GET_CURRENT_CONTEXT(ctx);
    814    ATTR_UI(2, type, 0, VBO_ATTRIB_POS, value[0]);
    815 }
    816 
    817 static void GLAPIENTRY
    818 TAG(VertexP3ui)(GLenum type, GLuint value)
    819 {
    820    GET_CURRENT_CONTEXT(ctx);
    821    ATTR_UI(3, type, 0, VBO_ATTRIB_POS, value);
    822 }
    823 
    824 static void GLAPIENTRY
    825 TAG(VertexP3uiv)(GLenum type, const GLuint *value)
    826 {
    827    GET_CURRENT_CONTEXT(ctx);
    828    ATTR_UI(3, type, 0, VBO_ATTRIB_POS, value[0]);
    829 }
    830 
    831 static void GLAPIENTRY
    832 TAG(VertexP4ui)(GLenum type, GLuint value)
    833 {
    834    GET_CURRENT_CONTEXT(ctx);
    835    ATTR_UI(4, type, 0, VBO_ATTRIB_POS, value);
    836 }
    837 
    838 static void GLAPIENTRY
    839 TAG(VertexP4uiv)(GLenum type, const GLuint *value)
    840 {
    841    GET_CURRENT_CONTEXT(ctx);
    842    ATTR_UI(4, type, 0, VBO_ATTRIB_POS, value[0]);
    843 }
    844 
    845 static void GLAPIENTRY
    846 TAG(TexCoordP1ui)(GLenum type, GLuint coords)
    847 {
    848    GET_CURRENT_CONTEXT(ctx);
    849    ATTR_UI(1, type, 0, VBO_ATTRIB_TEX0, coords);
    850 }
    851 
    852 static void GLAPIENTRY
    853 TAG(TexCoordP1uiv)(GLenum type, const GLuint *coords)
    854 {
    855    GET_CURRENT_CONTEXT(ctx);
    856    ATTR_UI(1, type, 0, VBO_ATTRIB_TEX0, coords[0]);
    857 }
    858 
    859 static void GLAPIENTRY
    860 TAG(TexCoordP2ui)(GLenum type, GLuint coords)
    861 {
    862    GET_CURRENT_CONTEXT(ctx);
    863    ATTR_UI(2, type, 0, VBO_ATTRIB_TEX0, coords);
    864 }
    865 
    866 static void GLAPIENTRY
    867 TAG(TexCoordP2uiv)(GLenum type, const GLuint *coords)
    868 {
    869    GET_CURRENT_CONTEXT(ctx);
    870    ATTR_UI(2, type, 0, VBO_ATTRIB_TEX0, coords[0]);
    871 }
    872 
    873 static void GLAPIENTRY
    874 TAG(TexCoordP3ui)(GLenum type, GLuint coords)
    875 {
    876    GET_CURRENT_CONTEXT(ctx);
    877    ATTR_UI(3, type, 0, VBO_ATTRIB_TEX0, coords);
    878 }
    879 
    880 static void GLAPIENTRY
    881 TAG(TexCoordP3uiv)(GLenum type, const GLuint *coords)
    882 {
    883    GET_CURRENT_CONTEXT(ctx);
    884    ATTR_UI(3, type, 0, VBO_ATTRIB_TEX0, coords[0]);
    885 }
    886 
    887 static void GLAPIENTRY
    888 TAG(TexCoordP4ui)(GLenum type, GLuint coords)
    889 {
    890    GET_CURRENT_CONTEXT(ctx);
    891    ATTR_UI(4, type, 0, VBO_ATTRIB_TEX0, coords);
    892 }
    893 
    894 static void GLAPIENTRY
    895 TAG(TexCoordP4uiv)(GLenum type, const GLuint *coords)
    896 {
    897    GET_CURRENT_CONTEXT(ctx);
    898    ATTR_UI(4, type, 0, VBO_ATTRIB_TEX0, coords[0]);
    899 }
    900 
    901 static void GLAPIENTRY
    902 TAG(MultiTexCoordP1ui)(GLenum target, GLenum type, GLuint coords)
    903 {
    904    GET_CURRENT_CONTEXT(ctx);
    905    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    906    ATTR_UI(1, type, 0, attr, coords);
    907 }
    908 
    909 static void GLAPIENTRY
    910 TAG(MultiTexCoordP1uiv)(GLenum target, GLenum type, const GLuint *coords)
    911 {
    912    GET_CURRENT_CONTEXT(ctx);
    913    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    914    ATTR_UI(1, type, 0, attr, coords[0]);
    915 }
    916 
    917 static void GLAPIENTRY
    918 TAG(MultiTexCoordP2ui)(GLenum target, GLenum type, GLuint coords)
    919 {
    920    GET_CURRENT_CONTEXT(ctx);
    921    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    922    ATTR_UI(2, type, 0, attr, coords);
    923 }
    924 
    925 static void GLAPIENTRY
    926 TAG(MultiTexCoordP2uiv)(GLenum target, GLenum type, const GLuint *coords)
    927 {
    928    GET_CURRENT_CONTEXT(ctx);
    929    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    930    ATTR_UI(2, type, 0, attr, coords[0]);
    931 }
    932 
    933 static void GLAPIENTRY
    934 TAG(MultiTexCoordP3ui)(GLenum target, GLenum type, GLuint coords)
    935 {
    936    GET_CURRENT_CONTEXT(ctx);
    937    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    938    ATTR_UI(3, type, 0, attr, coords);
    939 }
    940 
    941 static void GLAPIENTRY
    942 TAG(MultiTexCoordP3uiv)(GLenum target, GLenum type, const GLuint *coords)
    943 {
    944    GET_CURRENT_CONTEXT(ctx);
    945    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    946    ATTR_UI(3, type, 0, attr, coords[0]);
    947 }
    948 
    949 static void GLAPIENTRY
    950 TAG(MultiTexCoordP4ui)(GLenum target, GLenum type, GLuint coords)
    951 {
    952    GET_CURRENT_CONTEXT(ctx);
    953    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    954    ATTR_UI(4, type, 0, attr, coords);
    955 }
    956 
    957 static void GLAPIENTRY
    958 TAG(MultiTexCoordP4uiv)(GLenum target, GLenum type, const GLuint *coords)
    959 {
    960    GET_CURRENT_CONTEXT(ctx);
    961    GLuint attr = (target & 0x7) + VBO_ATTRIB_TEX0;
    962    ATTR_UI(4, type, 0, attr, coords[0]);
    963 }
    964 
    965 static void GLAPIENTRY
    966 TAG(NormalP3ui)(GLenum type, GLuint coords)
    967 {
    968    GET_CURRENT_CONTEXT(ctx);
    969    ATTR_UI(3, type, 1, VBO_ATTRIB_NORMAL, coords);
    970 }
    971 
    972 static void GLAPIENTRY
    973 TAG(NormalP3uiv)(GLenum type, const GLuint *coords)
    974 {
    975    GET_CURRENT_CONTEXT(ctx);
    976    ATTR_UI(3, type, 1, VBO_ATTRIB_NORMAL, coords[0]);
    977 }
    978 
    979 static void GLAPIENTRY
    980 TAG(ColorP3ui)(GLenum type, GLuint color)
    981 {
    982    GET_CURRENT_CONTEXT(ctx);
    983    ATTR_UI(3, type, 1, VBO_ATTRIB_COLOR0, color);
    984 }
    985 
    986 static void GLAPIENTRY
    987 TAG(ColorP3uiv)(GLenum type, const GLuint *color)
    988 {
    989    GET_CURRENT_CONTEXT(ctx);
    990    ATTR_UI(3, type, 1, VBO_ATTRIB_COLOR0, color[0]);
    991 }
    992 
    993 static void GLAPIENTRY
    994 TAG(ColorP4ui)(GLenum type, GLuint color)
    995 {
    996    GET_CURRENT_CONTEXT(ctx);
    997    ATTR_UI(4, type, 1, VBO_ATTRIB_COLOR0, color);
    998 }
    999 
   1000 static void GLAPIENTRY
   1001 TAG(ColorP4uiv)(GLenum type, const GLuint *color)
   1002 {
   1003    GET_CURRENT_CONTEXT(ctx);
   1004    ATTR_UI(4, type, 1, VBO_ATTRIB_COLOR0, color[0]);
   1005 }
   1006 
   1007 static void GLAPIENTRY
   1008 TAG(SecondaryColorP3ui)(GLenum type, GLuint color)
   1009 {
   1010    GET_CURRENT_CONTEXT(ctx);
   1011    ATTR_UI(3, type, 1, VBO_ATTRIB_COLOR1, color);
   1012 }
   1013 
   1014 static void GLAPIENTRY
   1015 TAG(SecondaryColorP3uiv)(GLenum type, const GLuint *color)
   1016 {
   1017    GET_CURRENT_CONTEXT(ctx);
   1018    ATTR_UI(3, type, 1, VBO_ATTRIB_COLOR1, color[0]);
   1019 }
   1020 
   1021 static void GLAPIENTRY
   1022 TAG(VertexAttribP1ui)(GLuint index, GLenum type, GLboolean normalized,
   1023 		      GLuint value)
   1024 {
   1025    GET_CURRENT_CONTEXT(ctx);
   1026    ATTR_UI_INDEX(1, type, normalized, index, value);
   1027 }
   1028 
   1029 static void GLAPIENTRY
   1030 TAG(VertexAttribP2ui)(GLuint index, GLenum type, GLboolean normalized,
   1031 		      GLuint value)
   1032 {
   1033    GET_CURRENT_CONTEXT(ctx);
   1034    ATTR_UI_INDEX(2, type, normalized, index, value);
   1035 }
   1036 
   1037 static void GLAPIENTRY
   1038 TAG(VertexAttribP3ui)(GLuint index, GLenum type, GLboolean normalized,
   1039 		      GLuint value)
   1040 {
   1041    GET_CURRENT_CONTEXT(ctx);
   1042    ATTR_UI_INDEX(3, type, normalized, index, value);
   1043 }
   1044 
   1045 static void GLAPIENTRY
   1046 TAG(VertexAttribP4ui)(GLuint index, GLenum type, GLboolean normalized,
   1047 		      GLuint value)
   1048 {
   1049    GET_CURRENT_CONTEXT(ctx);
   1050    ATTR_UI_INDEX(4, type, normalized, index, value);
   1051 }
   1052 
   1053 static void GLAPIENTRY
   1054 TAG(VertexAttribP1uiv)(GLuint index, GLenum type, GLboolean normalized,
   1055 		       const GLuint *value)
   1056 {
   1057    GET_CURRENT_CONTEXT(ctx);
   1058    ATTR_UI_INDEX(1, type, normalized, index, *value);
   1059 }
   1060 
   1061 static void GLAPIENTRY
   1062 TAG(VertexAttribP2uiv)(GLuint index, GLenum type, GLboolean normalized,
   1063 		       const GLuint *value)
   1064 {
   1065    GET_CURRENT_CONTEXT(ctx);
   1066    ATTR_UI_INDEX(2, type, normalized, index, *value);
   1067 }
   1068 
   1069 static void GLAPIENTRY
   1070 TAG(VertexAttribP3uiv)(GLuint index, GLenum type, GLboolean normalized,
   1071 		       const GLuint *value)
   1072 {
   1073    GET_CURRENT_CONTEXT(ctx);
   1074    ATTR_UI_INDEX(3, type, normalized, index, *value);
   1075 }
   1076 
   1077 static void GLAPIENTRY
   1078 TAG(VertexAttribP4uiv)(GLuint index, GLenum type, GLboolean normalized,
   1079 		      const GLuint *value)
   1080 {
   1081    GET_CURRENT_CONTEXT(ctx);
   1082    ATTR_UI_INDEX(4, type, normalized, index, *value);
   1083 }
   1084 
   1085 
   1086 #undef ATTR1FV
   1087 #undef ATTR2FV
   1088 #undef ATTR3FV
   1089 #undef ATTR4FV
   1090 
   1091 #undef ATTR1F
   1092 #undef ATTR2F
   1093 #undef ATTR3F
   1094 #undef ATTR4F
   1095 
   1096 #undef ATTR_UI
   1097 
   1098 #undef MAT
   1099