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