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