1 /* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included 14 * in all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 /** 26 * This file implements the glArrayElement() function. 27 * It involves looking at the format/type of all the enabled vertex arrays 28 * and emitting a list of pointers to functions which set the per-vertex 29 * state for the element/index. 30 */ 31 32 33 /* Author: 34 * Keith Whitwell <keithw (at) vmware.com> 35 */ 36 37 #include "glheader.h" 38 #include "arrayobj.h" 39 #include "api_arrayelt.h" 40 #include "bufferobj.h" 41 #include "context.h" 42 #include "imports.h" 43 #include "macros.h" 44 #include "mtypes.h" 45 #include "main/dispatch.h" 46 #include "varray.h" 47 48 typedef void (GLAPIENTRY *array_func)( const void * ); 49 50 typedef struct { 51 const struct gl_array_attributes *array; 52 const struct gl_vertex_buffer_binding *binding; 53 int offset; 54 } AEarray; 55 56 typedef void (GLAPIENTRY *attrib_func)( GLuint indx, const void *data ); 57 58 typedef struct { 59 const struct gl_array_attributes *array; 60 const struct gl_vertex_buffer_binding *binding; 61 attrib_func func; 62 GLuint index; 63 } AEattrib; 64 65 typedef struct { 66 AEarray arrays[32]; 67 AEattrib attribs[VERT_ATTRIB_MAX + 1]; 68 GLbitfield NewState; 69 70 /* List of VBOs we need to map before executing ArrayElements */ 71 struct gl_buffer_object *vbo[VERT_ATTRIB_MAX]; 72 GLuint nr_vbos; 73 GLboolean mapped_vbos; /**< Any currently mapped VBOs? */ 74 } AEcontext; 75 76 77 /** Cast wrapper */ 78 static inline AEcontext * 79 AE_CONTEXT(struct gl_context *ctx) 80 { 81 return (AEcontext *) ctx->aelt_context; 82 } 83 84 85 /* 86 * Convert GL_BYTE, GL_UNSIGNED_BYTE, .. GL_DOUBLE into an integer 87 * in the range [0, 7]. Luckily these type tokens are sequentially 88 * numbered in gl.h, except for GL_DOUBLE. 89 */ 90 static inline int 91 TYPE_IDX(GLenum t) 92 { 93 return t == GL_DOUBLE ? 7 : t & 7; 94 } 95 96 97 #define NUM_TYPES 8 98 99 100 static const int ColorFuncs[2][NUM_TYPES] = { 101 { 102 _gloffset_Color3bv, 103 _gloffset_Color3ubv, 104 _gloffset_Color3sv, 105 _gloffset_Color3usv, 106 _gloffset_Color3iv, 107 _gloffset_Color3uiv, 108 _gloffset_Color3fv, 109 _gloffset_Color3dv, 110 }, 111 { 112 _gloffset_Color4bv, 113 _gloffset_Color4ubv, 114 _gloffset_Color4sv, 115 _gloffset_Color4usv, 116 _gloffset_Color4iv, 117 _gloffset_Color4uiv, 118 _gloffset_Color4fv, 119 _gloffset_Color4dv, 120 }, 121 }; 122 123 static const int VertexFuncs[3][NUM_TYPES] = { 124 { 125 -1, 126 -1, 127 _gloffset_Vertex2sv, 128 -1, 129 _gloffset_Vertex2iv, 130 -1, 131 _gloffset_Vertex2fv, 132 _gloffset_Vertex2dv, 133 }, 134 { 135 -1, 136 -1, 137 _gloffset_Vertex3sv, 138 -1, 139 _gloffset_Vertex3iv, 140 -1, 141 _gloffset_Vertex3fv, 142 _gloffset_Vertex3dv, 143 }, 144 { 145 -1, 146 -1, 147 _gloffset_Vertex4sv, 148 -1, 149 _gloffset_Vertex4iv, 150 -1, 151 _gloffset_Vertex4fv, 152 _gloffset_Vertex4dv, 153 }, 154 }; 155 156 static const int IndexFuncs[NUM_TYPES] = { 157 -1, 158 _gloffset_Indexubv, 159 _gloffset_Indexsv, 160 -1, 161 _gloffset_Indexiv, 162 -1, 163 _gloffset_Indexfv, 164 _gloffset_Indexdv, 165 }; 166 167 static const int NormalFuncs[NUM_TYPES] = { 168 _gloffset_Normal3bv, 169 -1, 170 _gloffset_Normal3sv, 171 -1, 172 _gloffset_Normal3iv, 173 -1, 174 _gloffset_Normal3fv, 175 _gloffset_Normal3dv, 176 }; 177 178 /* Note: _gloffset_* for these may not be a compile-time constant. */ 179 static int SecondaryColorFuncs[NUM_TYPES]; 180 static int FogCoordFuncs[NUM_TYPES]; 181 182 183 /** 184 ** GL_NV_vertex_program 185 **/ 186 187 /* GL_BYTE attributes */ 188 189 static void GLAPIENTRY 190 VertexAttrib1NbvNV(GLuint index, const GLbyte *v) 191 { 192 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]))); 193 } 194 195 static void GLAPIENTRY 196 VertexAttrib1bvNV(GLuint index, const GLbyte *v) 197 { 198 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0])); 199 } 200 201 static void GLAPIENTRY 202 VertexAttrib2NbvNV(GLuint index, const GLbyte *v) 203 { 204 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]))); 205 } 206 207 static void GLAPIENTRY 208 VertexAttrib2bvNV(GLuint index, const GLbyte *v) 209 { 210 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1])); 211 } 212 213 static void GLAPIENTRY 214 VertexAttrib3NbvNV(GLuint index, const GLbyte *v) 215 { 216 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]), 217 BYTE_TO_FLOAT(v[1]), 218 BYTE_TO_FLOAT(v[2]))); 219 } 220 221 static void GLAPIENTRY 222 VertexAttrib3bvNV(GLuint index, const GLbyte *v) 223 { 224 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2])); 225 } 226 227 static void GLAPIENTRY 228 VertexAttrib4NbvNV(GLuint index, const GLbyte *v) 229 { 230 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]), 231 BYTE_TO_FLOAT(v[1]), 232 BYTE_TO_FLOAT(v[2]), 233 BYTE_TO_FLOAT(v[3]))); 234 } 235 236 static void GLAPIENTRY 237 VertexAttrib4bvNV(GLuint index, const GLbyte *v) 238 { 239 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2], (GLfloat)v[3])); 240 } 241 242 /* GL_UNSIGNED_BYTE attributes */ 243 244 static void GLAPIENTRY 245 VertexAttrib1NubvNV(GLuint index, const GLubyte *v) 246 { 247 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]))); 248 } 249 250 static void GLAPIENTRY 251 VertexAttrib1ubvNV(GLuint index, const GLubyte *v) 252 { 253 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0])); 254 } 255 256 static void GLAPIENTRY 257 VertexAttrib2NubvNV(GLuint index, const GLubyte *v) 258 { 259 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]), 260 UBYTE_TO_FLOAT(v[1]))); 261 } 262 263 static void GLAPIENTRY 264 VertexAttrib2ubvNV(GLuint index, const GLubyte *v) 265 { 266 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1])); 267 } 268 269 static void GLAPIENTRY 270 VertexAttrib3NubvNV(GLuint index, const GLubyte *v) 271 { 272 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]), 273 UBYTE_TO_FLOAT(v[1]), 274 UBYTE_TO_FLOAT(v[2]))); 275 } 276 static void GLAPIENTRY 277 VertexAttrib3ubvNV(GLuint index, const GLubyte *v) 278 { 279 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], 280 (GLfloat)v[1], (GLfloat)v[2])); 281 } 282 283 static void GLAPIENTRY 284 VertexAttrib4NubvNV(GLuint index, const GLubyte *v) 285 { 286 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]), 287 UBYTE_TO_FLOAT(v[1]), 288 UBYTE_TO_FLOAT(v[2]), 289 UBYTE_TO_FLOAT(v[3]))); 290 } 291 292 static void GLAPIENTRY 293 VertexAttrib4ubvNV(GLuint index, const GLubyte *v) 294 { 295 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], 296 (GLfloat)v[1], (GLfloat)v[2], 297 (GLfloat)v[3])); 298 } 299 300 /* GL_SHORT attributes */ 301 302 static void GLAPIENTRY 303 VertexAttrib1NsvNV(GLuint index, const GLshort *v) 304 { 305 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]))); 306 } 307 308 static void GLAPIENTRY 309 VertexAttrib1svNV(GLuint index, const GLshort *v) 310 { 311 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0])); 312 } 313 314 static void GLAPIENTRY 315 VertexAttrib2NsvNV(GLuint index, const GLshort *v) 316 { 317 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]), 318 SHORT_TO_FLOAT(v[1]))); 319 } 320 321 static void GLAPIENTRY 322 VertexAttrib2svNV(GLuint index, const GLshort *v) 323 { 324 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1])); 325 } 326 327 static void GLAPIENTRY 328 VertexAttrib3NsvNV(GLuint index, const GLshort *v) 329 { 330 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]), 331 SHORT_TO_FLOAT(v[1]), 332 SHORT_TO_FLOAT(v[2]))); 333 } 334 335 static void GLAPIENTRY 336 VertexAttrib3svNV(GLuint index, const GLshort *v) 337 { 338 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], 339 (GLfloat)v[2])); 340 } 341 342 static void GLAPIENTRY 343 VertexAttrib4NsvNV(GLuint index, const GLshort *v) 344 { 345 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]), 346 SHORT_TO_FLOAT(v[1]), 347 SHORT_TO_FLOAT(v[2]), 348 SHORT_TO_FLOAT(v[3]))); 349 } 350 351 static void GLAPIENTRY 352 VertexAttrib4svNV(GLuint index, const GLshort *v) 353 { 354 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], 355 (GLfloat)v[2], (GLfloat)v[3])); 356 } 357 358 /* GL_UNSIGNED_SHORT attributes */ 359 360 static void GLAPIENTRY 361 VertexAttrib1NusvNV(GLuint index, const GLushort *v) 362 { 363 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]))); 364 } 365 366 static void GLAPIENTRY 367 VertexAttrib1usvNV(GLuint index, const GLushort *v) 368 { 369 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0])); 370 } 371 372 static void GLAPIENTRY 373 VertexAttrib2NusvNV(GLuint index, const GLushort *v) 374 { 375 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]), 376 USHORT_TO_FLOAT(v[1]))); 377 } 378 379 static void GLAPIENTRY 380 VertexAttrib2usvNV(GLuint index, const GLushort *v) 381 { 382 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], 383 (GLfloat)v[1])); 384 } 385 386 static void GLAPIENTRY 387 VertexAttrib3NusvNV(GLuint index, const GLushort *v) 388 { 389 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]), 390 USHORT_TO_FLOAT(v[1]), 391 USHORT_TO_FLOAT(v[2]))); 392 } 393 394 static void GLAPIENTRY 395 VertexAttrib3usvNV(GLuint index, const GLushort *v) 396 { 397 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], 398 (GLfloat)v[2])); 399 } 400 401 static void GLAPIENTRY 402 VertexAttrib4NusvNV(GLuint index, const GLushort *v) 403 { 404 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]), 405 USHORT_TO_FLOAT(v[1]), 406 USHORT_TO_FLOAT(v[2]), 407 USHORT_TO_FLOAT(v[3]))); 408 } 409 410 static void GLAPIENTRY 411 VertexAttrib4usvNV(GLuint index, const GLushort *v) 412 { 413 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], 414 (GLfloat)v[2], (GLfloat)v[3])); 415 } 416 417 /* GL_INT attributes */ 418 419 static void GLAPIENTRY 420 VertexAttrib1NivNV(GLuint index, const GLint *v) 421 { 422 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]))); 423 } 424 425 static void GLAPIENTRY 426 VertexAttrib1ivNV(GLuint index, const GLint *v) 427 { 428 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0])); 429 } 430 431 static void GLAPIENTRY 432 VertexAttrib2NivNV(GLuint index, const GLint *v) 433 { 434 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]), 435 INT_TO_FLOAT(v[1]))); 436 } 437 438 static void GLAPIENTRY 439 VertexAttrib2ivNV(GLuint index, const GLint *v) 440 { 441 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1])); 442 } 443 444 static void GLAPIENTRY 445 VertexAttrib3NivNV(GLuint index, const GLint *v) 446 { 447 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]), 448 INT_TO_FLOAT(v[1]), 449 INT_TO_FLOAT(v[2]))); 450 } 451 452 static void GLAPIENTRY 453 VertexAttrib3ivNV(GLuint index, const GLint *v) 454 { 455 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], 456 (GLfloat)v[2])); 457 } 458 459 static void GLAPIENTRY 460 VertexAttrib4NivNV(GLuint index, const GLint *v) 461 { 462 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]), 463 INT_TO_FLOAT(v[1]), 464 INT_TO_FLOAT(v[2]), 465 INT_TO_FLOAT(v[3]))); 466 } 467 468 static void GLAPIENTRY 469 VertexAttrib4ivNV(GLuint index, const GLint *v) 470 { 471 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], 472 (GLfloat)v[2], (GLfloat)v[3])); 473 } 474 475 /* GL_UNSIGNED_INT attributes */ 476 477 static void GLAPIENTRY 478 VertexAttrib1NuivNV(GLuint index, const GLuint *v) 479 { 480 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]))); 481 } 482 483 static void GLAPIENTRY 484 VertexAttrib1uivNV(GLuint index, const GLuint *v) 485 { 486 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0])); 487 } 488 489 static void GLAPIENTRY 490 VertexAttrib2NuivNV(GLuint index, const GLuint *v) 491 { 492 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]), 493 UINT_TO_FLOAT(v[1]))); 494 } 495 496 static void GLAPIENTRY 497 VertexAttrib2uivNV(GLuint index, const GLuint *v) 498 { 499 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], 500 (GLfloat)v[1])); 501 } 502 503 static void GLAPIENTRY 504 VertexAttrib3NuivNV(GLuint index, const GLuint *v) 505 { 506 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]), 507 UINT_TO_FLOAT(v[1]), 508 UINT_TO_FLOAT(v[2]))); 509 } 510 511 static void GLAPIENTRY 512 VertexAttrib3uivNV(GLuint index, const GLuint *v) 513 { 514 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], 515 (GLfloat)v[2])); 516 } 517 518 static void GLAPIENTRY 519 VertexAttrib4NuivNV(GLuint index, const GLuint *v) 520 { 521 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]), 522 UINT_TO_FLOAT(v[1]), 523 UINT_TO_FLOAT(v[2]), 524 UINT_TO_FLOAT(v[3]))); 525 } 526 527 static void GLAPIENTRY 528 VertexAttrib4uivNV(GLuint index, const GLuint *v) 529 { 530 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], 531 (GLfloat)v[2], (GLfloat)v[3])); 532 } 533 534 /* GL_FLOAT attributes */ 535 536 static void GLAPIENTRY 537 VertexAttrib1fvNV(GLuint index, const GLfloat *v) 538 { 539 CALL_VertexAttrib1fvNV(GET_DISPATCH(), (index, v)); 540 } 541 542 static void GLAPIENTRY 543 VertexAttrib2fvNV(GLuint index, const GLfloat *v) 544 { 545 CALL_VertexAttrib2fvNV(GET_DISPATCH(), (index, v)); 546 } 547 548 static void GLAPIENTRY 549 VertexAttrib3fvNV(GLuint index, const GLfloat *v) 550 { 551 CALL_VertexAttrib3fvNV(GET_DISPATCH(), (index, v)); 552 } 553 554 static void GLAPIENTRY 555 VertexAttrib4fvNV(GLuint index, const GLfloat *v) 556 { 557 CALL_VertexAttrib4fvNV(GET_DISPATCH(), (index, v)); 558 } 559 560 /* GL_DOUBLE attributes */ 561 562 static void GLAPIENTRY 563 VertexAttrib1dvNV(GLuint index, const GLdouble *v) 564 { 565 CALL_VertexAttrib1dvNV(GET_DISPATCH(), (index, v)); 566 } 567 568 static void GLAPIENTRY 569 VertexAttrib2dvNV(GLuint index, const GLdouble *v) 570 { 571 CALL_VertexAttrib2dvNV(GET_DISPATCH(), (index, v)); 572 } 573 574 static void GLAPIENTRY 575 VertexAttrib3dvNV(GLuint index, const GLdouble *v) 576 { 577 CALL_VertexAttrib3dvNV(GET_DISPATCH(), (index, v)); 578 } 579 580 static void GLAPIENTRY 581 VertexAttrib4dvNV(GLuint index, const GLdouble *v) 582 { 583 CALL_VertexAttrib4dvNV(GET_DISPATCH(), (index, v)); 584 } 585 586 587 /* 588 * Array [size][type] of VertexAttrib functions 589 */ 590 static attrib_func AttribFuncsNV[2][4][NUM_TYPES] = { 591 { 592 /* non-normalized */ 593 { 594 /* size 1 */ 595 (attrib_func) VertexAttrib1bvNV, 596 (attrib_func) VertexAttrib1ubvNV, 597 (attrib_func) VertexAttrib1svNV, 598 (attrib_func) VertexAttrib1usvNV, 599 (attrib_func) VertexAttrib1ivNV, 600 (attrib_func) VertexAttrib1uivNV, 601 (attrib_func) VertexAttrib1fvNV, 602 (attrib_func) VertexAttrib1dvNV 603 }, 604 { 605 /* size 2 */ 606 (attrib_func) VertexAttrib2bvNV, 607 (attrib_func) VertexAttrib2ubvNV, 608 (attrib_func) VertexAttrib2svNV, 609 (attrib_func) VertexAttrib2usvNV, 610 (attrib_func) VertexAttrib2ivNV, 611 (attrib_func) VertexAttrib2uivNV, 612 (attrib_func) VertexAttrib2fvNV, 613 (attrib_func) VertexAttrib2dvNV 614 }, 615 { 616 /* size 3 */ 617 (attrib_func) VertexAttrib3bvNV, 618 (attrib_func) VertexAttrib3ubvNV, 619 (attrib_func) VertexAttrib3svNV, 620 (attrib_func) VertexAttrib3usvNV, 621 (attrib_func) VertexAttrib3ivNV, 622 (attrib_func) VertexAttrib3uivNV, 623 (attrib_func) VertexAttrib3fvNV, 624 (attrib_func) VertexAttrib3dvNV 625 }, 626 { 627 /* size 4 */ 628 (attrib_func) VertexAttrib4bvNV, 629 (attrib_func) VertexAttrib4ubvNV, 630 (attrib_func) VertexAttrib4svNV, 631 (attrib_func) VertexAttrib4usvNV, 632 (attrib_func) VertexAttrib4ivNV, 633 (attrib_func) VertexAttrib4uivNV, 634 (attrib_func) VertexAttrib4fvNV, 635 (attrib_func) VertexAttrib4dvNV 636 } 637 }, 638 { 639 /* normalized (except for float/double) */ 640 { 641 /* size 1 */ 642 (attrib_func) VertexAttrib1NbvNV, 643 (attrib_func) VertexAttrib1NubvNV, 644 (attrib_func) VertexAttrib1NsvNV, 645 (attrib_func) VertexAttrib1NusvNV, 646 (attrib_func) VertexAttrib1NivNV, 647 (attrib_func) VertexAttrib1NuivNV, 648 (attrib_func) VertexAttrib1fvNV, 649 (attrib_func) VertexAttrib1dvNV 650 }, 651 { 652 /* size 2 */ 653 (attrib_func) VertexAttrib2NbvNV, 654 (attrib_func) VertexAttrib2NubvNV, 655 (attrib_func) VertexAttrib2NsvNV, 656 (attrib_func) VertexAttrib2NusvNV, 657 (attrib_func) VertexAttrib2NivNV, 658 (attrib_func) VertexAttrib2NuivNV, 659 (attrib_func) VertexAttrib2fvNV, 660 (attrib_func) VertexAttrib2dvNV 661 }, 662 { 663 /* size 3 */ 664 (attrib_func) VertexAttrib3NbvNV, 665 (attrib_func) VertexAttrib3NubvNV, 666 (attrib_func) VertexAttrib3NsvNV, 667 (attrib_func) VertexAttrib3NusvNV, 668 (attrib_func) VertexAttrib3NivNV, 669 (attrib_func) VertexAttrib3NuivNV, 670 (attrib_func) VertexAttrib3fvNV, 671 (attrib_func) VertexAttrib3dvNV 672 }, 673 { 674 /* size 4 */ 675 (attrib_func) VertexAttrib4NbvNV, 676 (attrib_func) VertexAttrib4NubvNV, 677 (attrib_func) VertexAttrib4NsvNV, 678 (attrib_func) VertexAttrib4NusvNV, 679 (attrib_func) VertexAttrib4NivNV, 680 (attrib_func) VertexAttrib4NuivNV, 681 (attrib_func) VertexAttrib4fvNV, 682 (attrib_func) VertexAttrib4dvNV 683 } 684 } 685 }; 686 687 688 /** 689 ** GL_ARB_vertex_program 690 **/ 691 692 /* GL_BYTE attributes */ 693 694 static void GLAPIENTRY 695 VertexAttrib1NbvARB(GLuint index, const GLbyte *v) 696 { 697 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]))); 698 } 699 700 static void GLAPIENTRY 701 VertexAttrib1bvARB(GLuint index, const GLbyte *v) 702 { 703 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0])); 704 } 705 706 static void GLAPIENTRY 707 VertexAttrib2NbvARB(GLuint index, const GLbyte *v) 708 { 709 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]))); 710 } 711 712 static void GLAPIENTRY 713 VertexAttrib2bvARB(GLuint index, const GLbyte *v) 714 { 715 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1])); 716 } 717 718 static void GLAPIENTRY 719 VertexAttrib3NbvARB(GLuint index, const GLbyte *v) 720 { 721 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]), 722 BYTE_TO_FLOAT(v[1]), 723 BYTE_TO_FLOAT(v[2]))); 724 } 725 726 static void GLAPIENTRY 727 VertexAttrib3bvARB(GLuint index, const GLbyte *v) 728 { 729 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2])); 730 } 731 732 static void GLAPIENTRY 733 VertexAttrib4NbvARB(GLuint index, const GLbyte *v) 734 { 735 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]), 736 BYTE_TO_FLOAT(v[1]), 737 BYTE_TO_FLOAT(v[2]), 738 BYTE_TO_FLOAT(v[3]))); 739 } 740 741 static void GLAPIENTRY 742 VertexAttrib4bvARB(GLuint index, const GLbyte *v) 743 { 744 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2], (GLfloat)v[3])); 745 } 746 747 /* GL_UNSIGNED_BYTE attributes */ 748 749 static void GLAPIENTRY 750 VertexAttrib1NubvARB(GLuint index, const GLubyte *v) 751 { 752 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]))); 753 } 754 755 static void GLAPIENTRY 756 VertexAttrib1ubvARB(GLuint index, const GLubyte *v) 757 { 758 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0])); 759 } 760 761 static void GLAPIENTRY 762 VertexAttrib2NubvARB(GLuint index, const GLubyte *v) 763 { 764 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, 765 UBYTE_TO_FLOAT(v[0]), 766 UBYTE_TO_FLOAT(v[1]))); 767 } 768 769 static void GLAPIENTRY 770 VertexAttrib2ubvARB(GLuint index, const GLubyte *v) 771 { 772 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, 773 (GLfloat)v[0], (GLfloat)v[1])); 774 } 775 776 static void GLAPIENTRY 777 VertexAttrib3NubvARB(GLuint index, const GLubyte *v) 778 { 779 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, 780 UBYTE_TO_FLOAT(v[0]), 781 UBYTE_TO_FLOAT(v[1]), 782 UBYTE_TO_FLOAT(v[2]))); 783 } 784 static void GLAPIENTRY 785 VertexAttrib3ubvARB(GLuint index, const GLubyte *v) 786 { 787 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, 788 (GLfloat)v[0], 789 (GLfloat)v[1], 790 (GLfloat)v[2])); 791 } 792 793 static void GLAPIENTRY 794 VertexAttrib4NubvARB(GLuint index, const GLubyte *v) 795 { 796 CALL_VertexAttrib4fARB(GET_DISPATCH(), 797 (index, 798 UBYTE_TO_FLOAT(v[0]), 799 UBYTE_TO_FLOAT(v[1]), 800 UBYTE_TO_FLOAT(v[2]), 801 UBYTE_TO_FLOAT(v[3]))); 802 } 803 804 static void GLAPIENTRY 805 VertexAttrib4ubvARB(GLuint index, const GLubyte *v) 806 { 807 CALL_VertexAttrib4fARB(GET_DISPATCH(), 808 (index, 809 (GLfloat)v[0], (GLfloat)v[1], 810 (GLfloat)v[2], (GLfloat)v[3])); 811 } 812 813 /* GL_SHORT attributes */ 814 815 static void GLAPIENTRY 816 VertexAttrib1NsvARB(GLuint index, const GLshort *v) 817 { 818 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]))); 819 } 820 821 static void GLAPIENTRY 822 VertexAttrib1svARB(GLuint index, const GLshort *v) 823 { 824 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0])); 825 } 826 827 static void GLAPIENTRY 828 VertexAttrib2NsvARB(GLuint index, const GLshort *v) 829 { 830 CALL_VertexAttrib2fARB(GET_DISPATCH(), 831 (index, SHORT_TO_FLOAT(v[0]), 832 SHORT_TO_FLOAT(v[1]))); 833 } 834 835 static void GLAPIENTRY 836 VertexAttrib2svARB(GLuint index, const GLshort *v) 837 { 838 CALL_VertexAttrib2fARB(GET_DISPATCH(), 839 (index, (GLfloat)v[0], (GLfloat)v[1])); 840 } 841 842 static void GLAPIENTRY 843 VertexAttrib3NsvARB(GLuint index, const GLshort *v) 844 { 845 CALL_VertexAttrib3fARB(GET_DISPATCH(), 846 (index, 847 SHORT_TO_FLOAT(v[0]), 848 SHORT_TO_FLOAT(v[1]), 849 SHORT_TO_FLOAT(v[2]))); 850 } 851 852 static void GLAPIENTRY 853 VertexAttrib3svARB(GLuint index, const GLshort *v) 854 { 855 CALL_VertexAttrib3fARB(GET_DISPATCH(), 856 (index, 857 (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2])); 858 } 859 860 static void GLAPIENTRY 861 VertexAttrib4NsvARB(GLuint index, const GLshort *v) 862 { 863 CALL_VertexAttrib4fARB(GET_DISPATCH(), 864 (index, 865 SHORT_TO_FLOAT(v[0]), 866 SHORT_TO_FLOAT(v[1]), 867 SHORT_TO_FLOAT(v[2]), 868 SHORT_TO_FLOAT(v[3]))); 869 } 870 871 static void GLAPIENTRY 872 VertexAttrib4svARB(GLuint index, const GLshort *v) 873 { 874 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], 875 (GLfloat)v[2], (GLfloat)v[3])); 876 } 877 878 /* GL_UNSIGNED_SHORT attributes */ 879 880 static void GLAPIENTRY 881 VertexAttrib1NusvARB(GLuint index, const GLushort *v) 882 { 883 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]))); 884 } 885 886 static void GLAPIENTRY 887 VertexAttrib1usvARB(GLuint index, const GLushort *v) 888 { 889 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0])); 890 } 891 892 static void GLAPIENTRY 893 VertexAttrib2NusvARB(GLuint index, const GLushort *v) 894 { 895 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]), 896 USHORT_TO_FLOAT(v[1]))); 897 } 898 899 static void GLAPIENTRY 900 VertexAttrib2usvARB(GLuint index, const GLushort *v) 901 { 902 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0], 903 (GLfloat)v[1])); 904 } 905 906 static void GLAPIENTRY 907 VertexAttrib3NusvARB(GLuint index, const GLushort *v) 908 { 909 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]), 910 USHORT_TO_FLOAT(v[1]), 911 USHORT_TO_FLOAT(v[2]))); 912 } 913 914 static void GLAPIENTRY 915 VertexAttrib3usvARB(GLuint index, const GLushort *v) 916 { 917 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0], 918 (GLfloat)v[1], (GLfloat)v[2])); 919 } 920 921 static void GLAPIENTRY 922 VertexAttrib4NusvARB(GLuint index, const GLushort *v) 923 { 924 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]), 925 USHORT_TO_FLOAT(v[1]), 926 USHORT_TO_FLOAT(v[2]), 927 USHORT_TO_FLOAT(v[3]))); 928 } 929 930 static void GLAPIENTRY 931 VertexAttrib4usvARB(GLuint index, const GLushort *v) 932 { 933 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2], (GLfloat)v[3])); 934 } 935 936 /* GL_INT attributes */ 937 938 static void GLAPIENTRY 939 VertexAttrib1NivARB(GLuint index, const GLint *v) 940 { 941 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]))); 942 } 943 944 static void GLAPIENTRY 945 VertexAttrib1ivARB(GLuint index, const GLint *v) 946 { 947 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0])); 948 } 949 950 static void GLAPIENTRY 951 VertexAttrib2NivARB(GLuint index, const GLint *v) 952 { 953 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]), 954 INT_TO_FLOAT(v[1]))); 955 } 956 957 static void GLAPIENTRY 958 VertexAttrib2ivARB(GLuint index, const GLint *v) 959 { 960 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0], 961 (GLfloat)v[1])); 962 } 963 964 static void GLAPIENTRY 965 VertexAttrib3NivARB(GLuint index, const GLint *v) 966 { 967 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]), 968 INT_TO_FLOAT(v[1]), 969 INT_TO_FLOAT(v[2]))); 970 } 971 972 static void GLAPIENTRY 973 VertexAttrib3ivARB(GLuint index, const GLint *v) 974 { 975 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0], 976 (GLfloat)v[1], (GLfloat)v[2])); 977 } 978 979 static void GLAPIENTRY 980 VertexAttrib4NivARB(GLuint index, const GLint *v) 981 { 982 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]), 983 INT_TO_FLOAT(v[1]), 984 INT_TO_FLOAT(v[2]), 985 INT_TO_FLOAT(v[3]))); 986 } 987 988 static void GLAPIENTRY 989 VertexAttrib4ivARB(GLuint index, const GLint *v) 990 { 991 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], 992 (GLfloat)v[2], (GLfloat)v[3])); 993 } 994 995 /* GL_UNSIGNED_INT attributes */ 996 997 static void GLAPIENTRY 998 VertexAttrib1NuivARB(GLuint index, const GLuint *v) 999 { 1000 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]))); 1001 } 1002 1003 static void GLAPIENTRY 1004 VertexAttrib1uivARB(GLuint index, const GLuint *v) 1005 { 1006 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0])); 1007 } 1008 1009 static void GLAPIENTRY 1010 VertexAttrib2NuivARB(GLuint index, const GLuint *v) 1011 { 1012 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]), 1013 UINT_TO_FLOAT(v[1]))); 1014 } 1015 1016 static void GLAPIENTRY 1017 VertexAttrib2uivARB(GLuint index, const GLuint *v) 1018 { 1019 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0], 1020 (GLfloat)v[1])); 1021 } 1022 1023 static void GLAPIENTRY 1024 VertexAttrib3NuivARB(GLuint index, const GLuint *v) 1025 { 1026 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]), 1027 UINT_TO_FLOAT(v[1]), 1028 UINT_TO_FLOAT(v[2]))); 1029 } 1030 1031 static void GLAPIENTRY 1032 VertexAttrib3uivARB(GLuint index, const GLuint *v) 1033 { 1034 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0], 1035 (GLfloat)v[1], (GLfloat)v[2])); 1036 } 1037 1038 static void GLAPIENTRY 1039 VertexAttrib4NuivARB(GLuint index, const GLuint *v) 1040 { 1041 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]), 1042 UINT_TO_FLOAT(v[1]), 1043 UINT_TO_FLOAT(v[2]), 1044 UINT_TO_FLOAT(v[3]))); 1045 } 1046 1047 static void GLAPIENTRY 1048 VertexAttrib4uivARB(GLuint index, const GLuint *v) 1049 { 1050 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], 1051 (GLfloat)v[2], (GLfloat)v[3])); 1052 } 1053 1054 /* GL_FLOAT attributes */ 1055 1056 static void GLAPIENTRY 1057 VertexAttrib1fvARB(GLuint index, const GLfloat *v) 1058 { 1059 CALL_VertexAttrib1fvARB(GET_DISPATCH(), (index, v)); 1060 } 1061 1062 static void GLAPIENTRY 1063 VertexAttrib2fvARB(GLuint index, const GLfloat *v) 1064 { 1065 CALL_VertexAttrib2fvARB(GET_DISPATCH(), (index, v)); 1066 } 1067 1068 static void GLAPIENTRY 1069 VertexAttrib3fvARB(GLuint index, const GLfloat *v) 1070 { 1071 CALL_VertexAttrib3fvARB(GET_DISPATCH(), (index, v)); 1072 } 1073 1074 static void GLAPIENTRY 1075 VertexAttrib4fvARB(GLuint index, const GLfloat *v) 1076 { 1077 CALL_VertexAttrib4fvARB(GET_DISPATCH(), (index, v)); 1078 } 1079 1080 /* GL_DOUBLE attributes */ 1081 1082 static void GLAPIENTRY 1083 VertexAttrib1dvARB(GLuint index, const GLdouble *v) 1084 { 1085 CALL_VertexAttrib1dv(GET_DISPATCH(), (index, v)); 1086 } 1087 1088 static void GLAPIENTRY 1089 VertexAttrib2dvARB(GLuint index, const GLdouble *v) 1090 { 1091 CALL_VertexAttrib2dv(GET_DISPATCH(), (index, v)); 1092 } 1093 1094 static void GLAPIENTRY 1095 VertexAttrib3dvARB(GLuint index, const GLdouble *v) 1096 { 1097 CALL_VertexAttrib3dv(GET_DISPATCH(), (index, v)); 1098 } 1099 1100 static void GLAPIENTRY 1101 VertexAttrib4dvARB(GLuint index, const GLdouble *v) 1102 { 1103 CALL_VertexAttrib4dv(GET_DISPATCH(), (index, v)); 1104 } 1105 1106 1107 /** 1108 * Integer-valued attributes 1109 */ 1110 static void GLAPIENTRY 1111 VertexAttribI1bv(GLuint index, const GLbyte *v) 1112 { 1113 CALL_VertexAttribI1iEXT(GET_DISPATCH(), (index, v[0])); 1114 } 1115 1116 static void GLAPIENTRY 1117 VertexAttribI2bv(GLuint index, const GLbyte *v) 1118 { 1119 CALL_VertexAttribI2iEXT(GET_DISPATCH(), (index, v[0], v[1])); 1120 } 1121 1122 static void GLAPIENTRY 1123 VertexAttribI3bv(GLuint index, const GLbyte *v) 1124 { 1125 CALL_VertexAttribI3iEXT(GET_DISPATCH(), (index, v[0], v[1], v[2])); 1126 } 1127 1128 static void GLAPIENTRY 1129 VertexAttribI4bv(GLuint index, const GLbyte *v) 1130 { 1131 CALL_VertexAttribI4bv(GET_DISPATCH(), (index, v)); 1132 } 1133 1134 1135 static void GLAPIENTRY 1136 VertexAttribI1ubv(GLuint index, const GLubyte *v) 1137 { 1138 CALL_VertexAttribI1uiEXT(GET_DISPATCH(), (index, v[0])); 1139 } 1140 1141 static void GLAPIENTRY 1142 VertexAttribI2ubv(GLuint index, const GLubyte *v) 1143 { 1144 CALL_VertexAttribI2uiEXT(GET_DISPATCH(), (index, v[0], v[1])); 1145 } 1146 1147 static void GLAPIENTRY 1148 VertexAttribI3ubv(GLuint index, const GLubyte *v) 1149 { 1150 CALL_VertexAttribI3uiEXT(GET_DISPATCH(), (index, v[0], v[1], v[2])); 1151 } 1152 1153 static void GLAPIENTRY 1154 VertexAttribI4ubv(GLuint index, const GLubyte *v) 1155 { 1156 CALL_VertexAttribI4ubv(GET_DISPATCH(), (index, v)); 1157 } 1158 1159 1160 1161 static void GLAPIENTRY 1162 VertexAttribI1sv(GLuint index, const GLshort *v) 1163 { 1164 CALL_VertexAttribI1iEXT(GET_DISPATCH(), (index, v[0])); 1165 } 1166 1167 static void GLAPIENTRY 1168 VertexAttribI2sv(GLuint index, const GLshort *v) 1169 { 1170 CALL_VertexAttribI2iEXT(GET_DISPATCH(), (index, v[0], v[1])); 1171 } 1172 1173 static void GLAPIENTRY 1174 VertexAttribI3sv(GLuint index, const GLshort *v) 1175 { 1176 CALL_VertexAttribI3iEXT(GET_DISPATCH(), (index, v[0], v[1], v[2])); 1177 } 1178 1179 static void GLAPIENTRY 1180 VertexAttribI4sv(GLuint index, const GLshort *v) 1181 { 1182 CALL_VertexAttribI4sv(GET_DISPATCH(), (index, v)); 1183 } 1184 1185 1186 static void GLAPIENTRY 1187 VertexAttribI1usv(GLuint index, const GLushort *v) 1188 { 1189 CALL_VertexAttribI1uiEXT(GET_DISPATCH(), (index, v[0])); 1190 } 1191 1192 static void GLAPIENTRY 1193 VertexAttribI2usv(GLuint index, const GLushort *v) 1194 { 1195 CALL_VertexAttribI2uiEXT(GET_DISPATCH(), (index, v[0], v[1])); 1196 } 1197 1198 static void GLAPIENTRY 1199 VertexAttribI3usv(GLuint index, const GLushort *v) 1200 { 1201 CALL_VertexAttribI3uiEXT(GET_DISPATCH(), (index, v[0], v[1], v[2])); 1202 } 1203 1204 static void GLAPIENTRY 1205 VertexAttribI4usv(GLuint index, const GLushort *v) 1206 { 1207 CALL_VertexAttribI4usv(GET_DISPATCH(), (index, v)); 1208 } 1209 1210 1211 1212 static void GLAPIENTRY 1213 VertexAttribI1iv(GLuint index, const GLint *v) 1214 { 1215 CALL_VertexAttribI1iEXT(GET_DISPATCH(), (index, v[0])); 1216 } 1217 1218 static void GLAPIENTRY 1219 VertexAttribI2iv(GLuint index, const GLint *v) 1220 { 1221 CALL_VertexAttribI2iEXT(GET_DISPATCH(), (index, v[0], v[1])); 1222 } 1223 1224 static void GLAPIENTRY 1225 VertexAttribI3iv(GLuint index, const GLint *v) 1226 { 1227 CALL_VertexAttribI3iEXT(GET_DISPATCH(), (index, v[0], v[1], v[2])); 1228 } 1229 1230 static void GLAPIENTRY 1231 VertexAttribI4iv(GLuint index, const GLint *v) 1232 { 1233 CALL_VertexAttribI4ivEXT(GET_DISPATCH(), (index, v)); 1234 } 1235 1236 1237 static void GLAPIENTRY 1238 VertexAttribI1uiv(GLuint index, const GLuint *v) 1239 { 1240 CALL_VertexAttribI1uiEXT(GET_DISPATCH(), (index, v[0])); 1241 } 1242 1243 static void GLAPIENTRY 1244 VertexAttribI2uiv(GLuint index, const GLuint *v) 1245 { 1246 CALL_VertexAttribI2uiEXT(GET_DISPATCH(), (index, v[0], v[1])); 1247 } 1248 1249 static void GLAPIENTRY 1250 VertexAttribI3uiv(GLuint index, const GLuint *v) 1251 { 1252 CALL_VertexAttribI3uiEXT(GET_DISPATCH(), (index, v[0], v[1], v[2])); 1253 } 1254 1255 static void GLAPIENTRY 1256 VertexAttribI4uiv(GLuint index, const GLuint *v) 1257 { 1258 CALL_VertexAttribI4uivEXT(GET_DISPATCH(), (index, v)); 1259 } 1260 1261 /* GL_DOUBLE unconverted attributes */ 1262 1263 static void GLAPIENTRY 1264 VertexAttribL1dv(GLuint index, const GLdouble *v) 1265 { 1266 CALL_VertexAttribL1dv(GET_DISPATCH(), (index, v)); 1267 } 1268 1269 static void GLAPIENTRY 1270 VertexAttribL2dv(GLuint index, const GLdouble *v) 1271 { 1272 CALL_VertexAttribL2dv(GET_DISPATCH(), (index, v)); 1273 } 1274 1275 static void GLAPIENTRY 1276 VertexAttribL3dv(GLuint index, const GLdouble *v) 1277 { 1278 CALL_VertexAttribL3dv(GET_DISPATCH(), (index, v)); 1279 } 1280 1281 static void GLAPIENTRY 1282 VertexAttribL4dv(GLuint index, const GLdouble *v) 1283 { 1284 CALL_VertexAttribL4dv(GET_DISPATCH(), (index, v)); 1285 } 1286 1287 /* 1288 * Array [unnormalized/normalized/integer][size][type] of VertexAttrib 1289 * functions 1290 */ 1291 static const attrib_func AttribFuncsARB[4][4][NUM_TYPES] = { 1292 { 1293 /* non-normalized */ 1294 { 1295 /* size 1 */ 1296 (attrib_func) VertexAttrib1bvARB, 1297 (attrib_func) VertexAttrib1ubvARB, 1298 (attrib_func) VertexAttrib1svARB, 1299 (attrib_func) VertexAttrib1usvARB, 1300 (attrib_func) VertexAttrib1ivARB, 1301 (attrib_func) VertexAttrib1uivARB, 1302 (attrib_func) VertexAttrib1fvARB, 1303 (attrib_func) VertexAttrib1dvARB 1304 }, 1305 { 1306 /* size 2 */ 1307 (attrib_func) VertexAttrib2bvARB, 1308 (attrib_func) VertexAttrib2ubvARB, 1309 (attrib_func) VertexAttrib2svARB, 1310 (attrib_func) VertexAttrib2usvARB, 1311 (attrib_func) VertexAttrib2ivARB, 1312 (attrib_func) VertexAttrib2uivARB, 1313 (attrib_func) VertexAttrib2fvARB, 1314 (attrib_func) VertexAttrib2dvARB 1315 }, 1316 { 1317 /* size 3 */ 1318 (attrib_func) VertexAttrib3bvARB, 1319 (attrib_func) VertexAttrib3ubvARB, 1320 (attrib_func) VertexAttrib3svARB, 1321 (attrib_func) VertexAttrib3usvARB, 1322 (attrib_func) VertexAttrib3ivARB, 1323 (attrib_func) VertexAttrib3uivARB, 1324 (attrib_func) VertexAttrib3fvARB, 1325 (attrib_func) VertexAttrib3dvARB 1326 }, 1327 { 1328 /* size 4 */ 1329 (attrib_func) VertexAttrib4bvARB, 1330 (attrib_func) VertexAttrib4ubvARB, 1331 (attrib_func) VertexAttrib4svARB, 1332 (attrib_func) VertexAttrib4usvARB, 1333 (attrib_func) VertexAttrib4ivARB, 1334 (attrib_func) VertexAttrib4uivARB, 1335 (attrib_func) VertexAttrib4fvARB, 1336 (attrib_func) VertexAttrib4dvARB 1337 } 1338 }, 1339 { 1340 /* normalized (except for float/double) */ 1341 { 1342 /* size 1 */ 1343 (attrib_func) VertexAttrib1NbvARB, 1344 (attrib_func) VertexAttrib1NubvARB, 1345 (attrib_func) VertexAttrib1NsvARB, 1346 (attrib_func) VertexAttrib1NusvARB, 1347 (attrib_func) VertexAttrib1NivARB, 1348 (attrib_func) VertexAttrib1NuivARB, 1349 (attrib_func) VertexAttrib1fvARB, 1350 (attrib_func) VertexAttrib1dvARB 1351 }, 1352 { 1353 /* size 2 */ 1354 (attrib_func) VertexAttrib2NbvARB, 1355 (attrib_func) VertexAttrib2NubvARB, 1356 (attrib_func) VertexAttrib2NsvARB, 1357 (attrib_func) VertexAttrib2NusvARB, 1358 (attrib_func) VertexAttrib2NivARB, 1359 (attrib_func) VertexAttrib2NuivARB, 1360 (attrib_func) VertexAttrib2fvARB, 1361 (attrib_func) VertexAttrib2dvARB 1362 }, 1363 { 1364 /* size 3 */ 1365 (attrib_func) VertexAttrib3NbvARB, 1366 (attrib_func) VertexAttrib3NubvARB, 1367 (attrib_func) VertexAttrib3NsvARB, 1368 (attrib_func) VertexAttrib3NusvARB, 1369 (attrib_func) VertexAttrib3NivARB, 1370 (attrib_func) VertexAttrib3NuivARB, 1371 (attrib_func) VertexAttrib3fvARB, 1372 (attrib_func) VertexAttrib3dvARB 1373 }, 1374 { 1375 /* size 4 */ 1376 (attrib_func) VertexAttrib4NbvARB, 1377 (attrib_func) VertexAttrib4NubvARB, 1378 (attrib_func) VertexAttrib4NsvARB, 1379 (attrib_func) VertexAttrib4NusvARB, 1380 (attrib_func) VertexAttrib4NivARB, 1381 (attrib_func) VertexAttrib4NuivARB, 1382 (attrib_func) VertexAttrib4fvARB, 1383 (attrib_func) VertexAttrib4dvARB 1384 } 1385 }, 1386 1387 { 1388 /* integer-valued */ 1389 { 1390 /* size 1 */ 1391 (attrib_func) VertexAttribI1bv, 1392 (attrib_func) VertexAttribI1ubv, 1393 (attrib_func) VertexAttribI1sv, 1394 (attrib_func) VertexAttribI1usv, 1395 (attrib_func) VertexAttribI1iv, 1396 (attrib_func) VertexAttribI1uiv, 1397 NULL, /* GL_FLOAT */ 1398 NULL /* GL_DOUBLE */ 1399 }, 1400 { 1401 /* size 2 */ 1402 (attrib_func) VertexAttribI2bv, 1403 (attrib_func) VertexAttribI2ubv, 1404 (attrib_func) VertexAttribI2sv, 1405 (attrib_func) VertexAttribI2usv, 1406 (attrib_func) VertexAttribI2iv, 1407 (attrib_func) VertexAttribI2uiv, 1408 NULL, /* GL_FLOAT */ 1409 NULL /* GL_DOUBLE */ 1410 }, 1411 { 1412 /* size 3 */ 1413 (attrib_func) VertexAttribI3bv, 1414 (attrib_func) VertexAttribI3ubv, 1415 (attrib_func) VertexAttribI3sv, 1416 (attrib_func) VertexAttribI3usv, 1417 (attrib_func) VertexAttribI3iv, 1418 (attrib_func) VertexAttribI3uiv, 1419 NULL, /* GL_FLOAT */ 1420 NULL /* GL_DOUBLE */ 1421 }, 1422 { 1423 /* size 4 */ 1424 (attrib_func) VertexAttribI4bv, 1425 (attrib_func) VertexAttribI4ubv, 1426 (attrib_func) VertexAttribI4sv, 1427 (attrib_func) VertexAttribI4usv, 1428 (attrib_func) VertexAttribI4iv, 1429 (attrib_func) VertexAttribI4uiv, 1430 NULL, /* GL_FLOAT */ 1431 NULL /* GL_DOUBLE */ 1432 } 1433 }, 1434 { 1435 /* double-valued */ 1436 { 1437 /* size 1 */ 1438 NULL, 1439 NULL, 1440 NULL, 1441 NULL, 1442 NULL, 1443 NULL, 1444 NULL, 1445 (attrib_func) VertexAttribL1dv, 1446 }, 1447 { 1448 /* size 2 */ 1449 NULL, 1450 NULL, 1451 NULL, 1452 NULL, 1453 NULL, 1454 NULL, 1455 NULL, 1456 (attrib_func) VertexAttribL2dv, 1457 }, 1458 { 1459 /* size 3 */ 1460 NULL, 1461 NULL, 1462 NULL, 1463 NULL, 1464 NULL, 1465 NULL, 1466 NULL, 1467 (attrib_func) VertexAttribL3dv, 1468 }, 1469 { 1470 /* size 4 */ 1471 NULL, 1472 NULL, 1473 NULL, 1474 NULL, 1475 NULL, 1476 NULL, 1477 NULL, 1478 (attrib_func) VertexAttribL4dv, 1479 } 1480 } 1481 1482 }; 1483 1484 1485 GLboolean 1486 _ae_create_context(struct gl_context *ctx) 1487 { 1488 if (ctx->aelt_context) 1489 return GL_TRUE; 1490 1491 /* These _gloffset_* values may not be compile-time constants */ 1492 SecondaryColorFuncs[0] = _gloffset_SecondaryColor3bv; 1493 SecondaryColorFuncs[1] = _gloffset_SecondaryColor3ubv; 1494 SecondaryColorFuncs[2] = _gloffset_SecondaryColor3sv; 1495 SecondaryColorFuncs[3] = _gloffset_SecondaryColor3usv; 1496 SecondaryColorFuncs[4] = _gloffset_SecondaryColor3iv; 1497 SecondaryColorFuncs[5] = _gloffset_SecondaryColor3uiv; 1498 SecondaryColorFuncs[6] = _gloffset_SecondaryColor3fvEXT; 1499 SecondaryColorFuncs[7] = _gloffset_SecondaryColor3dv; 1500 1501 FogCoordFuncs[0] = -1; 1502 FogCoordFuncs[1] = -1; 1503 FogCoordFuncs[2] = -1; 1504 FogCoordFuncs[3] = -1; 1505 FogCoordFuncs[4] = -1; 1506 FogCoordFuncs[5] = -1; 1507 FogCoordFuncs[6] = _gloffset_FogCoordfvEXT; 1508 FogCoordFuncs[7] = _gloffset_FogCoorddv; 1509 1510 ctx->aelt_context = calloc(1, sizeof(AEcontext)); 1511 if (!ctx->aelt_context) 1512 return GL_FALSE; 1513 1514 AE_CONTEXT(ctx)->NewState = ~0; 1515 return GL_TRUE; 1516 } 1517 1518 1519 void 1520 _ae_destroy_context(struct gl_context *ctx) 1521 { 1522 if (AE_CONTEXT(ctx)) { 1523 free(ctx->aelt_context); 1524 ctx->aelt_context = NULL; 1525 } 1526 } 1527 1528 1529 /** 1530 * Check if the given vertex buffer object exists and is not mapped. 1531 * If so, add it to the list of buffers we must map before executing 1532 * an glArrayElement call. 1533 */ 1534 static void 1535 check_vbo(AEcontext *actx, struct gl_buffer_object *vbo) 1536 { 1537 if (_mesa_is_bufferobj(vbo) && 1538 !_mesa_bufferobj_mapped(vbo, MAP_INTERNAL)) { 1539 GLuint i; 1540 for (i = 0; i < actx->nr_vbos; i++) 1541 if (actx->vbo[i] == vbo) 1542 return; /* already in the list, we're done */ 1543 assert(actx->nr_vbos < VERT_ATTRIB_MAX); 1544 actx->vbo[actx->nr_vbos++] = vbo; 1545 } 1546 } 1547 1548 1549 /** 1550 * Make a list of per-vertex functions to call for each glArrayElement call. 1551 * These functions access the array data (i.e. glVertex, glColor, glNormal, 1552 * etc). 1553 * Note: this may be called during display list construction. 1554 */ 1555 static void 1556 _ae_update_state(struct gl_context *ctx) 1557 { 1558 AEcontext *actx = AE_CONTEXT(ctx); 1559 AEarray *aa = actx->arrays; /* non-indexed arrays (ex: glNormal) */ 1560 AEattrib *at = actx->attribs; /* indexed arrays (ex: glMultiTexCoord) */ 1561 GLuint i; 1562 struct gl_vertex_array_object *vao = ctx->Array.VAO; 1563 1564 actx->nr_vbos = 0; 1565 1566 /* conventional vertex arrays */ 1567 if (vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled) { 1568 aa->array = &vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX]; 1569 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; 1570 aa->offset = IndexFuncs[TYPE_IDX(aa->array->Type)]; 1571 check_vbo(actx, aa->binding->BufferObj); 1572 aa++; 1573 } 1574 1575 if (vao->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Enabled) { 1576 aa->array = &vao->VertexAttrib[VERT_ATTRIB_EDGEFLAG]; 1577 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; 1578 aa->offset = _gloffset_EdgeFlagv; 1579 check_vbo(actx, aa->binding->BufferObj); 1580 aa++; 1581 } 1582 1583 if (vao->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) { 1584 aa->array = &vao->VertexAttrib[VERT_ATTRIB_NORMAL]; 1585 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; 1586 aa->offset = NormalFuncs[TYPE_IDX(aa->array->Type)]; 1587 check_vbo(actx, aa->binding->BufferObj); 1588 aa++; 1589 } 1590 1591 if (vao->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) { 1592 aa->array = &vao->VertexAttrib[VERT_ATTRIB_COLOR0]; 1593 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; 1594 aa->offset = ColorFuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)]; 1595 check_vbo(actx, aa->binding->BufferObj); 1596 aa++; 1597 } 1598 1599 if (vao->VertexAttrib[VERT_ATTRIB_COLOR1].Enabled) { 1600 aa->array = &vao->VertexAttrib[VERT_ATTRIB_COLOR1]; 1601 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; 1602 aa->offset = SecondaryColorFuncs[TYPE_IDX(aa->array->Type)]; 1603 check_vbo(actx, aa->binding->BufferObj); 1604 aa++; 1605 } 1606 1607 if (vao->VertexAttrib[VERT_ATTRIB_FOG].Enabled) { 1608 aa->array = &vao->VertexAttrib[VERT_ATTRIB_FOG]; 1609 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; 1610 aa->offset = FogCoordFuncs[TYPE_IDX(aa->array->Type)]; 1611 check_vbo(actx, aa->binding->BufferObj); 1612 aa++; 1613 } 1614 1615 for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) { 1616 struct gl_array_attributes *attribArray = 1617 &vao->VertexAttrib[VERT_ATTRIB_TEX(i)]; 1618 if (attribArray->Enabled) { 1619 /* NOTE: we use generic glVertexAttribNV functions here. 1620 * If we ever remove GL_NV_vertex_program this will have to change. 1621 */ 1622 at->array = attribArray; 1623 at->binding = &vao->BufferBinding[attribArray->BufferBindingIndex]; 1624 assert(!at->array->Normalized); 1625 at->func = AttribFuncsNV[at->array->Normalized] 1626 [at->array->Size-1] 1627 [TYPE_IDX(at->array->Type)]; 1628 at->index = VERT_ATTRIB_TEX0 + i; 1629 check_vbo(actx, at->binding->BufferObj); 1630 at++; 1631 } 1632 } 1633 1634 /* generic vertex attribute arrays */ 1635 for (i = 1; i < VERT_ATTRIB_GENERIC_MAX; i++) { /* skip zero! */ 1636 struct gl_array_attributes *attribArray = 1637 &vao->VertexAttrib[VERT_ATTRIB_GENERIC(i)]; 1638 if (attribArray->Enabled) { 1639 GLint intOrNorm; 1640 at->array = attribArray; 1641 at->binding = &vao->BufferBinding[attribArray->BufferBindingIndex]; 1642 /* Note: we can't grab the _glapi_Dispatch->VertexAttrib1fvNV 1643 * function pointer here (for float arrays) since the pointer may 1644 * change from one execution of _ae_ArrayElement() to 1645 * the next. Doing so caused UT to break. 1646 */ 1647 if (at->array->Doubles) 1648 intOrNorm = 3; 1649 else if (at->array->Integer) 1650 intOrNorm = 2; 1651 else if (at->array->Normalized) 1652 intOrNorm = 1; 1653 else 1654 intOrNorm = 0; 1655 1656 at->func = AttribFuncsARB[intOrNorm] 1657 [at->array->Size-1] 1658 [TYPE_IDX(at->array->Type)]; 1659 1660 at->index = i; 1661 check_vbo(actx, at->binding->BufferObj); 1662 at++; 1663 } 1664 } 1665 1666 /* finally, vertex position */ 1667 if (vao->VertexAttrib[VERT_ATTRIB_GENERIC0].Enabled) { 1668 /* Use glVertex(v) instead of glVertexAttrib(0, v) to be sure it's 1669 * issued as the last (provoking) attribute). 1670 */ 1671 aa->array = &vao->VertexAttrib[VERT_ATTRIB_GENERIC0]; 1672 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; 1673 assert(aa->array->Size >= 2); /* XXX fix someday? */ 1674 aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)]; 1675 check_vbo(actx, aa->binding->BufferObj); 1676 aa++; 1677 } 1678 else if (vao->VertexAttrib[VERT_ATTRIB_POS].Enabled) { 1679 aa->array = &vao->VertexAttrib[VERT_ATTRIB_POS]; 1680 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex]; 1681 aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)]; 1682 check_vbo(actx, aa->binding->BufferObj); 1683 aa++; 1684 } 1685 1686 check_vbo(actx, vao->IndexBufferObj); 1687 1688 assert(at - actx->attribs <= VERT_ATTRIB_MAX); 1689 assert(aa - actx->arrays < 32); 1690 at->func = NULL; /* terminate the list */ 1691 aa->offset = -1; /* terminate the list */ 1692 1693 actx->NewState = 0; 1694 } 1695 1696 1697 /** 1698 * Before replaying glArrayElements calls we need to map (for reading) any 1699 * VBOs referenced by the enabled vertex arrays. 1700 */ 1701 void 1702 _ae_map_vbos(struct gl_context *ctx) 1703 { 1704 AEcontext *actx = AE_CONTEXT(ctx); 1705 GLuint i; 1706 1707 if (actx->mapped_vbos) 1708 return; 1709 1710 if (actx->NewState) 1711 _ae_update_state(ctx); 1712 1713 for (i = 0; i < actx->nr_vbos; i++) 1714 ctx->Driver.MapBufferRange(ctx, 0, 1715 actx->vbo[i]->Size, 1716 GL_MAP_READ_BIT, 1717 actx->vbo[i], 1718 MAP_INTERNAL); 1719 1720 if (actx->nr_vbos) 1721 actx->mapped_vbos = GL_TRUE; 1722 } 1723 1724 1725 /** 1726 * Unmap VBOs 1727 */ 1728 void 1729 _ae_unmap_vbos(struct gl_context *ctx) 1730 { 1731 AEcontext *actx = AE_CONTEXT(ctx); 1732 GLuint i; 1733 1734 if (!actx->mapped_vbos) 1735 return; 1736 1737 assert (!actx->NewState); 1738 1739 for (i = 0; i < actx->nr_vbos; i++) 1740 ctx->Driver.UnmapBuffer(ctx, actx->vbo[i], MAP_INTERNAL); 1741 1742 actx->mapped_vbos = GL_FALSE; 1743 } 1744 1745 1746 /** 1747 * Called via glArrayElement() and glDrawArrays(). 1748 * Issue the glNormal, glVertex, glColor, glVertexAttrib, etc functions 1749 * for all enabled vertex arrays (for elt-th element). 1750 * Note: this may be called during display list construction. 1751 */ 1752 void GLAPIENTRY 1753 _ae_ArrayElement(GLint elt) 1754 { 1755 GET_CURRENT_CONTEXT(ctx); 1756 const AEcontext *actx = AE_CONTEXT(ctx); 1757 const AEarray *aa; 1758 const AEattrib *at; 1759 const struct _glapi_table * const disp = GET_DISPATCH(); 1760 GLboolean do_map; 1761 1762 /* If PrimitiveRestart is enabled and the index is the RestartIndex 1763 * then we call PrimitiveRestartNV and return. 1764 */ 1765 if (ctx->Array.PrimitiveRestart && (elt == ctx->Array.RestartIndex)) { 1766 CALL_PrimitiveRestartNV((struct _glapi_table *)disp, ()); 1767 return; 1768 } 1769 1770 if (actx->NewState) { 1771 assert(!actx->mapped_vbos); 1772 _ae_update_state(ctx); 1773 } 1774 1775 /* Determine if we need to map/unmap VBOs */ 1776 do_map = actx->nr_vbos && !actx->mapped_vbos; 1777 1778 if (do_map) 1779 _ae_map_vbos(ctx); 1780 1781 /* emit generic attribute elements */ 1782 for (at = actx->attribs; at->func; at++) { 1783 const GLubyte *src 1784 = ADD_POINTERS(at->binding->BufferObj->Mappings[MAP_INTERNAL].Pointer, 1785 _mesa_vertex_attrib_address(at->array, at->binding)) 1786 + elt * at->binding->Stride; 1787 at->func(at->index, src); 1788 } 1789 1790 /* emit conventional arrays elements */ 1791 for (aa = actx->arrays; aa->offset != -1 ; aa++) { 1792 const GLubyte *src 1793 = ADD_POINTERS(aa->binding->BufferObj->Mappings[MAP_INTERNAL].Pointer, 1794 _mesa_vertex_attrib_address(aa->array, aa->binding)) 1795 + elt * aa->binding->Stride; 1796 CALL_by_offset(disp, (array_func), aa->offset, ((const void *) src)); 1797 } 1798 1799 if (do_map) 1800 _ae_unmap_vbos(ctx); 1801 } 1802 1803 1804 void 1805 _ae_invalidate_state(struct gl_context *ctx, GLbitfield new_state) 1806 { 1807 AEcontext *actx = AE_CONTEXT(ctx); 1808 1809 /* Only interested in this subset of mesa state. Need to prune 1810 * this down as both tnl/ and the drivers can raise statechanges 1811 * for arcane reasons in the middle of seemingly atomic operations 1812 * like DrawElements, over which we'd like to keep a known set of 1813 * arrays and vbo's mapped. 1814 * 1815 * Luckily, neither the drivers nor tnl muck with the state that 1816 * concerns us here: 1817 */ 1818 new_state &= _NEW_ARRAY | _NEW_PROGRAM; 1819 if (new_state) { 1820 assert(!actx->mapped_vbos); 1821 actx->NewState |= new_state; 1822 } 1823 } 1824 1825 1826 void 1827 _mesa_install_arrayelt_vtxfmt(struct _glapi_table *disp, 1828 const GLvertexformat *vfmt) 1829 { 1830 SET_ArrayElement(disp, vfmt->ArrayElement); 1831 } 1832