1 /* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5 * Copyright (C) 2009 VMware, Inc. 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 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included 15 * in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 * OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26 27 #include <stdio.h> 28 #include <inttypes.h> /* for PRId64 macro */ 29 30 #include "glheader.h" 31 #include "imports.h" 32 #include "bufferobj.h" 33 #include "context.h" 34 #include "enable.h" 35 #include "enums.h" 36 #include "hash.h" 37 #include "image.h" 38 #include "macros.h" 39 #include "mtypes.h" 40 #include "varray.h" 41 #include "arrayobj.h" 42 #include "main/dispatch.h" 43 44 45 /** Used to do error checking for GL_EXT_vertex_array_bgra */ 46 #define BGRA_OR_4 5 47 48 49 /** Used to indicate which GL datatypes are accepted by each of the 50 * glVertex/Color/Attrib/EtcPointer() functions. 51 */ 52 #define BOOL_BIT (1 << 0) 53 #define BYTE_BIT (1 << 1) 54 #define UNSIGNED_BYTE_BIT (1 << 2) 55 #define SHORT_BIT (1 << 3) 56 #define UNSIGNED_SHORT_BIT (1 << 4) 57 #define INT_BIT (1 << 5) 58 #define UNSIGNED_INT_BIT (1 << 6) 59 #define HALF_BIT (1 << 7) 60 #define FLOAT_BIT (1 << 8) 61 #define DOUBLE_BIT (1 << 9) 62 #define FIXED_ES_BIT (1 << 10) 63 #define FIXED_GL_BIT (1 << 11) 64 #define UNSIGNED_INT_2_10_10_10_REV_BIT (1 << 12) 65 #define INT_2_10_10_10_REV_BIT (1 << 13) 66 #define UNSIGNED_INT_10F_11F_11F_REV_BIT (1 << 14) 67 #define ALL_TYPE_BITS ((1 << 15) - 1) 68 69 #define ATTRIB_FORMAT_TYPES_MASK (BYTE_BIT | UNSIGNED_BYTE_BIT | \ 70 SHORT_BIT | UNSIGNED_SHORT_BIT | \ 71 INT_BIT | UNSIGNED_INT_BIT | \ 72 HALF_BIT | FLOAT_BIT | DOUBLE_BIT | \ 73 FIXED_GL_BIT | \ 74 UNSIGNED_INT_2_10_10_10_REV_BIT | \ 75 INT_2_10_10_10_REV_BIT | \ 76 UNSIGNED_INT_10F_11F_11F_REV_BIT) 77 78 #define ATTRIB_IFORMAT_TYPES_MASK (BYTE_BIT | UNSIGNED_BYTE_BIT | \ 79 SHORT_BIT | UNSIGNED_SHORT_BIT | \ 80 INT_BIT | UNSIGNED_INT_BIT) 81 82 #define ATTRIB_LFORMAT_TYPES_MASK DOUBLE_BIT 83 84 85 /** Convert GL datatype enum into a <type>_BIT value seen above */ 86 static GLbitfield 87 type_to_bit(const struct gl_context *ctx, GLenum type) 88 { 89 switch (type) { 90 case GL_BOOL: 91 return BOOL_BIT; 92 case GL_BYTE: 93 return BYTE_BIT; 94 case GL_UNSIGNED_BYTE: 95 return UNSIGNED_BYTE_BIT; 96 case GL_SHORT: 97 return SHORT_BIT; 98 case GL_UNSIGNED_SHORT: 99 return UNSIGNED_SHORT_BIT; 100 case GL_INT: 101 return INT_BIT; 102 case GL_UNSIGNED_INT: 103 return UNSIGNED_INT_BIT; 104 case GL_HALF_FLOAT: 105 case GL_HALF_FLOAT_OES: 106 if (ctx->Extensions.ARB_half_float_vertex) 107 return HALF_BIT; 108 else 109 return 0x0; 110 case GL_FLOAT: 111 return FLOAT_BIT; 112 case GL_DOUBLE: 113 return DOUBLE_BIT; 114 case GL_FIXED: 115 return _mesa_is_desktop_gl(ctx) ? FIXED_GL_BIT : FIXED_ES_BIT; 116 case GL_UNSIGNED_INT_2_10_10_10_REV: 117 return UNSIGNED_INT_2_10_10_10_REV_BIT; 118 case GL_INT_2_10_10_10_REV: 119 return INT_2_10_10_10_REV_BIT; 120 case GL_UNSIGNED_INT_10F_11F_11F_REV: 121 return UNSIGNED_INT_10F_11F_11F_REV_BIT; 122 default: 123 return 0; 124 } 125 } 126 127 128 /** 129 * Sets the BufferBindingIndex field for the vertex attribute given by 130 * attribIndex. 131 */ 132 static void 133 vertex_attrib_binding(struct gl_context *ctx, 134 struct gl_vertex_array_object *vao, 135 GLuint attribIndex, 136 GLuint bindingIndex) 137 { 138 struct gl_array_attributes *array = &vao->VertexAttrib[attribIndex]; 139 140 if (!_mesa_is_bufferobj(vao->BufferBinding[bindingIndex].BufferObj)) 141 vao->VertexAttribBufferMask &= ~VERT_BIT(attribIndex); 142 else 143 vao->VertexAttribBufferMask |= VERT_BIT(attribIndex); 144 145 if (array->BufferBindingIndex != bindingIndex) { 146 const GLbitfield64 array_bit = VERT_BIT(attribIndex); 147 148 FLUSH_VERTICES(ctx, _NEW_ARRAY); 149 150 vao->BufferBinding[array->BufferBindingIndex]._BoundArrays &= ~array_bit; 151 vao->BufferBinding[bindingIndex]._BoundArrays |= array_bit; 152 153 array->BufferBindingIndex = bindingIndex; 154 155 vao->NewArrays |= array_bit; 156 } 157 } 158 159 160 /** 161 * Binds a buffer object to the vertex buffer binding point given by index, 162 * and sets the Offset and Stride fields. 163 */ 164 void 165 _mesa_bind_vertex_buffer(struct gl_context *ctx, 166 struct gl_vertex_array_object *vao, 167 GLuint index, 168 struct gl_buffer_object *vbo, 169 GLintptr offset, GLsizei stride) 170 { 171 struct gl_vertex_buffer_binding *binding = &vao->BufferBinding[index]; 172 173 if (binding->BufferObj != vbo || 174 binding->Offset != offset || 175 binding->Stride != stride) { 176 177 FLUSH_VERTICES(ctx, _NEW_ARRAY); 178 179 _mesa_reference_buffer_object(ctx, &binding->BufferObj, vbo); 180 181 binding->Offset = offset; 182 binding->Stride = stride; 183 184 if (!_mesa_is_bufferobj(vbo)) 185 vao->VertexAttribBufferMask &= ~binding->_BoundArrays; 186 else 187 vao->VertexAttribBufferMask |= binding->_BoundArrays; 188 189 vao->NewArrays |= binding->_BoundArrays; 190 } 191 } 192 193 194 /** 195 * Sets the InstanceDivisor field in the vertex buffer binding point 196 * given by bindingIndex. 197 */ 198 static void 199 vertex_binding_divisor(struct gl_context *ctx, 200 struct gl_vertex_array_object *vao, 201 GLuint bindingIndex, 202 GLuint divisor) 203 { 204 struct gl_vertex_buffer_binding *binding = 205 &vao->BufferBinding[bindingIndex]; 206 207 if (binding->InstanceDivisor != divisor) { 208 FLUSH_VERTICES(ctx, _NEW_ARRAY); 209 binding->InstanceDivisor = divisor; 210 vao->NewArrays |= binding->_BoundArrays; 211 } 212 } 213 214 215 /** 216 * Examine the API profile and extensions to determine which types are legal 217 * for vertex arrays. This is called once from update_array_format(). 218 */ 219 static GLbitfield 220 get_legal_types_mask(const struct gl_context *ctx) 221 { 222 GLbitfield legalTypesMask = ALL_TYPE_BITS; 223 224 if (_mesa_is_gles(ctx)) { 225 legalTypesMask &= ~(FIXED_GL_BIT | 226 DOUBLE_BIT | 227 UNSIGNED_INT_10F_11F_11F_REV_BIT); 228 229 /* GL_INT and GL_UNSIGNED_INT data is not allowed in OpenGL ES until 230 * 3.0. The 2_10_10_10 types are added in OpenGL ES 3.0 or 231 * GL_OES_vertex_type_10_10_10_2. GL_HALF_FLOAT data is not allowed 232 * until 3.0 or with the GL_OES_vertex_half float extension, which isn't 233 * quite as trivial as we'd like because it uses a different enum value 234 * for GL_HALF_FLOAT_OES. 235 */ 236 if (ctx->Version < 30) { 237 legalTypesMask &= ~(UNSIGNED_INT_BIT | 238 INT_BIT | 239 UNSIGNED_INT_2_10_10_10_REV_BIT | 240 INT_2_10_10_10_REV_BIT); 241 242 if (!_mesa_has_OES_vertex_half_float(ctx)) 243 legalTypesMask &= ~HALF_BIT; 244 } 245 } 246 else { 247 legalTypesMask &= ~FIXED_ES_BIT; 248 249 if (!ctx->Extensions.ARB_ES2_compatibility) 250 legalTypesMask &= ~FIXED_GL_BIT; 251 252 if (!ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) 253 legalTypesMask &= ~(UNSIGNED_INT_2_10_10_10_REV_BIT | 254 INT_2_10_10_10_REV_BIT); 255 256 if (!ctx->Extensions.ARB_vertex_type_10f_11f_11f_rev) 257 legalTypesMask &= ~UNSIGNED_INT_10F_11F_11F_REV_BIT; 258 } 259 260 return legalTypesMask; 261 } 262 263 264 /** 265 * \param attrib The index of the attribute array 266 * \param size Components per element (1, 2, 3 or 4) 267 * \param type Datatype of each component (GL_FLOAT, GL_INT, etc) 268 * \param format Either GL_RGBA or GL_BGRA. 269 * \param normalized Whether integer types are converted to floats in [-1, 1] 270 * \param integer Integer-valued values (will not be normalized to [-1, 1]) 271 * \param doubles Double values not reduced to floats 272 * \param relativeOffset Offset of the first element relative to the binding 273 * offset. 274 * \param flush_verties Should \c FLUSH_VERTICES be invoked before updating 275 * state? 276 */ 277 void 278 _mesa_update_array_format(struct gl_context *ctx, 279 struct gl_vertex_array_object *vao, 280 GLuint attrib, GLint size, GLenum type, 281 GLenum format, GLboolean normalized, 282 GLboolean integer, GLboolean doubles, 283 GLuint relativeOffset, bool flush_vertices) 284 { 285 struct gl_array_attributes *const array = &vao->VertexAttrib[attrib]; 286 GLint elementSize; 287 288 assert(size <= 4); 289 290 if (flush_vertices) { 291 FLUSH_VERTICES(ctx, 0); 292 } 293 294 elementSize = _mesa_bytes_per_vertex_attrib(size, type); 295 assert(elementSize != -1); 296 297 array->Size = size; 298 array->Type = type; 299 array->Format = format; 300 array->Normalized = normalized; 301 array->Integer = integer; 302 array->Doubles = doubles; 303 array->RelativeOffset = relativeOffset; 304 array->_ElementSize = elementSize; 305 306 vao->NewArrays |= VERT_BIT(attrib); 307 ctx->NewState |= _NEW_ARRAY; 308 } 309 310 /** 311 * Does error checking and updates the format in an attrib array. 312 * 313 * Called by update_array() and VertexAttrib*Format(). 314 * 315 * \param func Name of calling function used for error reporting 316 * \param attrib The index of the attribute array 317 * \param legalTypes Bitmask of *_BIT above indicating legal datatypes 318 * \param sizeMin Min allowable size value 319 * \param sizeMax Max allowable size value (may also be BGRA_OR_4) 320 * \param size Components per element (1, 2, 3 or 4) 321 * \param type Datatype of each component (GL_FLOAT, GL_INT, etc) 322 * \param normalized Whether integer types are converted to floats in [-1, 1] 323 * \param integer Integer-valued values (will not be normalized to [-1, 1]) 324 * \param doubles Double values not reduced to floats 325 * \param relativeOffset Offset of the first element relative to the binding offset. 326 */ 327 static bool 328 update_array_format(struct gl_context *ctx, 329 const char *func, 330 struct gl_vertex_array_object *vao, 331 GLuint attrib, GLbitfield legalTypesMask, 332 GLint sizeMin, GLint sizeMax, 333 GLint size, GLenum type, 334 GLboolean normalized, GLboolean integer, GLboolean doubles, 335 GLuint relativeOffset) 336 { 337 GLbitfield typeBit; 338 GLenum format = GL_RGBA; 339 340 /* at most, one of these bools can be true */ 341 assert((int) normalized + (int) integer + (int) doubles <= 1); 342 343 if (ctx->Array.LegalTypesMask == 0 || ctx->Array.LegalTypesMaskAPI != ctx->API) { 344 /* Compute the LegalTypesMask only once, unless the context API has 345 * changed, in which case we want to compute it again. We can't do this 346 * in _mesa_init_varrays() below because extensions are not yet enabled 347 * at that point. 348 */ 349 ctx->Array.LegalTypesMask = get_legal_types_mask(ctx); 350 ctx->Array.LegalTypesMaskAPI = ctx->API; 351 } 352 353 legalTypesMask &= ctx->Array.LegalTypesMask; 354 355 if (_mesa_is_gles(ctx) && sizeMax == BGRA_OR_4) { 356 /* BGRA ordering is not supported in ES contexts. 357 */ 358 sizeMax = 4; 359 } 360 361 typeBit = type_to_bit(ctx, type); 362 if (typeBit == 0x0 || (typeBit & legalTypesMask) == 0x0) { 363 _mesa_error(ctx, GL_INVALID_ENUM, "%s(type = %s)", 364 func, _mesa_enum_to_string(type)); 365 return false; 366 } 367 368 /* Do size parameter checking. 369 * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and 370 * must be handled specially. 371 */ 372 if (ctx->Extensions.EXT_vertex_array_bgra && 373 sizeMax == BGRA_OR_4 && 374 size == GL_BGRA) { 375 /* Page 298 of the PDF of the OpenGL 4.3 (Core Profile) spec says: 376 * 377 * "An INVALID_OPERATION error is generated under any of the following 378 * conditions: 379 * ... 380 * size is BGRA and type is not UNSIGNED_BYTE, INT_2_10_10_10_REV 381 * or UNSIGNED_INT_2_10_10_10_REV; 382 * ... 383 * size is BGRA and normalized is FALSE;" 384 */ 385 bool bgra_error = false; 386 387 if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) { 388 if (type != GL_UNSIGNED_INT_2_10_10_10_REV && 389 type != GL_INT_2_10_10_10_REV && 390 type != GL_UNSIGNED_BYTE) 391 bgra_error = true; 392 } else if (type != GL_UNSIGNED_BYTE) 393 bgra_error = true; 394 395 if (bgra_error) { 396 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=GL_BGRA and type=%s)", 397 func, _mesa_enum_to_string(type)); 398 return false; 399 } 400 401 if (!normalized) { 402 _mesa_error(ctx, GL_INVALID_OPERATION, 403 "%s(size=GL_BGRA and normalized=GL_FALSE)", func); 404 return false; 405 } 406 407 format = GL_BGRA; 408 size = 4; 409 } 410 else if (size < sizeMin || size > sizeMax || size > 4) { 411 _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size); 412 return false; 413 } 414 415 if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev && 416 (type == GL_UNSIGNED_INT_2_10_10_10_REV || 417 type == GL_INT_2_10_10_10_REV) && size != 4) { 418 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size); 419 return false; 420 } 421 422 /* The ARB_vertex_attrib_binding_spec says: 423 * 424 * An INVALID_VALUE error is generated if <relativeoffset> is larger than 425 * the value of MAX_VERTEX_ATTRIB_RELATIVE_OFFSET. 426 */ 427 if (relativeOffset > ctx->Const.MaxVertexAttribRelativeOffset) { 428 _mesa_error(ctx, GL_INVALID_VALUE, 429 "%s(relativeOffset=%d > " 430 "GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET)", 431 func, relativeOffset); 432 return false; 433 } 434 435 if (ctx->Extensions.ARB_vertex_type_10f_11f_11f_rev && 436 type == GL_UNSIGNED_INT_10F_11F_11F_REV && size != 3) { 437 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size); 438 return false; 439 } 440 441 _mesa_update_array_format(ctx, vao, attrib, size, type, format, 442 normalized, integer, doubles, relativeOffset, 443 false); 444 445 return true; 446 } 447 448 449 /** 450 * Do error checking and update state for glVertex/Color/TexCoord/...Pointer 451 * functions. 452 * 453 * \param func name of calling function used for error reporting 454 * \param attrib the attribute array index to update 455 * \param legalTypes bitmask of *_BIT above indicating legal datatypes 456 * \param sizeMin min allowable size value 457 * \param sizeMax max allowable size value (may also be BGRA_OR_4) 458 * \param size components per element (1, 2, 3 or 4) 459 * \param type datatype of each component (GL_FLOAT, GL_INT, etc) 460 * \param stride stride between elements, in elements 461 * \param normalized are integer types converted to floats in [-1, 1]? 462 * \param integer integer-valued values (will not be normalized to [-1,1]) 463 * \param doubles Double values not reduced to floats 464 * \param ptr the address (or offset inside VBO) of the array data 465 */ 466 static void 467 update_array(struct gl_context *ctx, 468 const char *func, 469 GLuint attrib, GLbitfield legalTypesMask, 470 GLint sizeMin, GLint sizeMax, 471 GLint size, GLenum type, GLsizei stride, 472 GLboolean normalized, GLboolean integer, GLboolean doubles, 473 const GLvoid *ptr) 474 { 475 struct gl_vertex_array_object *vao = ctx->Array.VAO; 476 struct gl_array_attributes *array; 477 GLsizei effectiveStride; 478 479 /* Page 407 (page 423 of the PDF) of the OpenGL 3.0 spec says: 480 * 481 * "Client vertex arrays - all vertex array attribute pointers must 482 * refer to buffer objects (section 2.9.2). The default vertex array 483 * object (the name zero) is also deprecated. Calling 484 * VertexAttribPointer when no buffer object or no vertex array object 485 * is bound will generate an INVALID_OPERATION error..." 486 * 487 * The check for VBOs is handled below. 488 */ 489 if (ctx->API == API_OPENGL_CORE && (vao == ctx->Array.DefaultVAO)) { 490 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(no array object bound)", 491 func); 492 return; 493 } 494 495 if (stride < 0) { 496 _mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride ); 497 return; 498 } 499 500 if (ctx->API == API_OPENGL_CORE && ctx->Version >= 44 && 501 stride > ctx->Const.MaxVertexAttribStride) { 502 _mesa_error(ctx, GL_INVALID_VALUE, "%s(stride=%d > " 503 "GL_MAX_VERTEX_ATTRIB_STRIDE)", func, stride); 504 return; 505 } 506 507 /* Page 29 (page 44 of the PDF) of the OpenGL 3.3 spec says: 508 * 509 * "An INVALID_OPERATION error is generated under any of the following 510 * conditions: 511 * 512 * ... 513 * 514 * * any of the *Pointer commands specifying the location and 515 * organization of vertex array data are called while zero is bound 516 * to the ARRAY_BUFFER buffer object binding point (see section 517 * 2.9.6), and the pointer argument is not NULL." 518 */ 519 if (ptr != NULL && vao->ARBsemantics && 520 !_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) { 521 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func); 522 return; 523 } 524 525 if (!update_array_format(ctx, func, vao, attrib, 526 legalTypesMask, sizeMin, sizeMax, 527 size, type, normalized, integer, doubles, 0)) { 528 return; 529 } 530 531 /* Reset the vertex attrib binding */ 532 vertex_attrib_binding(ctx, vao, attrib, attrib); 533 534 /* The Stride and Ptr fields are not set by update_array_format() */ 535 array = &vao->VertexAttrib[attrib]; 536 array->Stride = stride; 537 array->Ptr = ptr; 538 539 /* Update the vertex buffer binding */ 540 effectiveStride = stride != 0 ? stride : array->_ElementSize; 541 _mesa_bind_vertex_buffer(ctx, vao, attrib, 542 ctx->Array.ArrayBufferObj, (GLintptr) ptr, 543 effectiveStride); 544 } 545 546 547 void GLAPIENTRY 548 _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 549 { 550 GET_CURRENT_CONTEXT(ctx); 551 GLbitfield legalTypes = (ctx->API == API_OPENGLES) 552 ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) 553 : (SHORT_BIT | INT_BIT | FLOAT_BIT | 554 DOUBLE_BIT | HALF_BIT | 555 UNSIGNED_INT_2_10_10_10_REV_BIT | 556 INT_2_10_10_10_REV_BIT); 557 558 FLUSH_VERTICES(ctx, 0); 559 560 update_array(ctx, "glVertexPointer", VERT_ATTRIB_POS, 561 legalTypes, 2, 4, 562 size, type, stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr); 563 } 564 565 566 void GLAPIENTRY 567 _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) 568 { 569 GET_CURRENT_CONTEXT(ctx); 570 const GLbitfield legalTypes = (ctx->API == API_OPENGLES) 571 ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) 572 : (BYTE_BIT | SHORT_BIT | INT_BIT | 573 HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 574 UNSIGNED_INT_2_10_10_10_REV_BIT | 575 INT_2_10_10_10_REV_BIT); 576 577 FLUSH_VERTICES(ctx, 0); 578 579 update_array(ctx, "glNormalPointer", VERT_ATTRIB_NORMAL, 580 legalTypes, 3, 3, 581 3, type, stride, GL_TRUE, GL_FALSE, GL_FALSE, ptr); 582 } 583 584 585 void GLAPIENTRY 586 _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 587 { 588 GET_CURRENT_CONTEXT(ctx); 589 const GLbitfield legalTypes = (ctx->API == API_OPENGLES) 590 ? (UNSIGNED_BYTE_BIT | HALF_BIT | FLOAT_BIT | FIXED_ES_BIT) 591 : (BYTE_BIT | UNSIGNED_BYTE_BIT | 592 SHORT_BIT | UNSIGNED_SHORT_BIT | 593 INT_BIT | UNSIGNED_INT_BIT | 594 HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 595 UNSIGNED_INT_2_10_10_10_REV_BIT | 596 INT_2_10_10_10_REV_BIT); 597 const GLint sizeMin = (ctx->API == API_OPENGLES) ? 4 : 3; 598 599 FLUSH_VERTICES(ctx, 0); 600 601 update_array(ctx, "glColorPointer", VERT_ATTRIB_COLOR0, 602 legalTypes, sizeMin, BGRA_OR_4, 603 size, type, stride, GL_TRUE, GL_FALSE, GL_FALSE, ptr); 604 } 605 606 607 void GLAPIENTRY 608 _mesa_FogCoordPointer(GLenum type, GLsizei stride, const GLvoid *ptr) 609 { 610 const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT); 611 GET_CURRENT_CONTEXT(ctx); 612 613 FLUSH_VERTICES(ctx, 0); 614 615 update_array(ctx, "glFogCoordPointer", VERT_ATTRIB_FOG, 616 legalTypes, 1, 1, 617 1, type, stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr); 618 } 619 620 621 void GLAPIENTRY 622 _mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) 623 { 624 const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT | 625 FLOAT_BIT | DOUBLE_BIT); 626 GET_CURRENT_CONTEXT(ctx); 627 628 FLUSH_VERTICES(ctx, 0); 629 630 update_array(ctx, "glIndexPointer", VERT_ATTRIB_COLOR_INDEX, 631 legalTypes, 1, 1, 632 1, type, stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr); 633 } 634 635 636 void GLAPIENTRY 637 _mesa_SecondaryColorPointer(GLint size, GLenum type, 638 GLsizei stride, const GLvoid *ptr) 639 { 640 const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 641 SHORT_BIT | UNSIGNED_SHORT_BIT | 642 INT_BIT | UNSIGNED_INT_BIT | 643 HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 644 UNSIGNED_INT_2_10_10_10_REV_BIT | 645 INT_2_10_10_10_REV_BIT); 646 GET_CURRENT_CONTEXT(ctx); 647 648 FLUSH_VERTICES(ctx, 0); 649 650 update_array(ctx, "glSecondaryColorPointer", VERT_ATTRIB_COLOR1, 651 legalTypes, 3, BGRA_OR_4, 652 size, type, stride, GL_TRUE, GL_FALSE, GL_FALSE, ptr); 653 } 654 655 656 void GLAPIENTRY 657 _mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, 658 const GLvoid *ptr) 659 { 660 GET_CURRENT_CONTEXT(ctx); 661 GLbitfield legalTypes = (ctx->API == API_OPENGLES) 662 ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) 663 : (SHORT_BIT | INT_BIT | 664 HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 665 UNSIGNED_INT_2_10_10_10_REV_BIT | 666 INT_2_10_10_10_REV_BIT); 667 const GLint sizeMin = (ctx->API == API_OPENGLES) ? 2 : 1; 668 const GLuint unit = ctx->Array.ActiveTexture; 669 670 FLUSH_VERTICES(ctx, 0); 671 672 update_array(ctx, "glTexCoordPointer", VERT_ATTRIB_TEX(unit), 673 legalTypes, sizeMin, 4, 674 size, type, stride, GL_FALSE, GL_FALSE, GL_FALSE, 675 ptr); 676 } 677 678 679 void GLAPIENTRY 680 _mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr) 681 { 682 const GLbitfield legalTypes = UNSIGNED_BYTE_BIT; 683 /* this is the same type that glEdgeFlag uses */ 684 const GLboolean integer = GL_FALSE; 685 GET_CURRENT_CONTEXT(ctx); 686 687 FLUSH_VERTICES(ctx, 0); 688 689 update_array(ctx, "glEdgeFlagPointer", VERT_ATTRIB_EDGEFLAG, 690 legalTypes, 1, 1, 691 1, GL_UNSIGNED_BYTE, stride, GL_FALSE, integer, GL_FALSE, ptr); 692 } 693 694 695 void GLAPIENTRY 696 _mesa_PointSizePointerOES(GLenum type, GLsizei stride, const GLvoid *ptr) 697 { 698 const GLbitfield legalTypes = (FLOAT_BIT | FIXED_ES_BIT); 699 GET_CURRENT_CONTEXT(ctx); 700 701 FLUSH_VERTICES(ctx, 0); 702 703 if (ctx->API != API_OPENGLES) { 704 _mesa_error(ctx, GL_INVALID_OPERATION, 705 "glPointSizePointer(ES 1.x only)"); 706 return; 707 } 708 709 update_array(ctx, "glPointSizePointer", VERT_ATTRIB_POINT_SIZE, 710 legalTypes, 1, 1, 711 1, type, stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr); 712 } 713 714 715 /** 716 * Set a generic vertex attribute array. 717 * Note that these arrays DO NOT alias the conventional GL vertex arrays 718 * (position, normal, color, fog, texcoord, etc). 719 */ 720 void GLAPIENTRY 721 _mesa_VertexAttribPointer(GLuint index, GLint size, GLenum type, 722 GLboolean normalized, 723 GLsizei stride, const GLvoid *ptr) 724 { 725 const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 726 SHORT_BIT | UNSIGNED_SHORT_BIT | 727 INT_BIT | UNSIGNED_INT_BIT | 728 HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 729 FIXED_ES_BIT | FIXED_GL_BIT | 730 UNSIGNED_INT_2_10_10_10_REV_BIT | 731 INT_2_10_10_10_REV_BIT | 732 UNSIGNED_INT_10F_11F_11F_REV_BIT); 733 GET_CURRENT_CONTEXT(ctx); 734 735 if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { 736 _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)"); 737 return; 738 } 739 740 update_array(ctx, "glVertexAttribPointer", VERT_ATTRIB_GENERIC(index), 741 legalTypes, 1, BGRA_OR_4, 742 size, type, stride, normalized, GL_FALSE, GL_FALSE, ptr); 743 } 744 745 746 /** 747 * GL_EXT_gpu_shader4 / GL 3.0. 748 * Set an integer-valued vertex attribute array. 749 * Note that these arrays DO NOT alias the conventional GL vertex arrays 750 * (position, normal, color, fog, texcoord, etc). 751 */ 752 void GLAPIENTRY 753 _mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type, 754 GLsizei stride, const GLvoid *ptr) 755 { 756 const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 757 SHORT_BIT | UNSIGNED_SHORT_BIT | 758 INT_BIT | UNSIGNED_INT_BIT); 759 const GLboolean normalized = GL_FALSE; 760 const GLboolean integer = GL_TRUE; 761 GET_CURRENT_CONTEXT(ctx); 762 763 if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { 764 _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)"); 765 return; 766 } 767 768 update_array(ctx, "glVertexAttribIPointer", VERT_ATTRIB_GENERIC(index), 769 legalTypes, 1, 4, 770 size, type, stride, normalized, integer, GL_FALSE, ptr); 771 } 772 773 void GLAPIENTRY 774 _mesa_VertexAttribLPointer(GLuint index, GLint size, GLenum type, 775 GLsizei stride, const GLvoid *ptr) 776 { 777 GET_CURRENT_CONTEXT(ctx); 778 const GLbitfield legalTypes = (DOUBLE_BIT); 779 if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { 780 _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribLPointer(index)"); 781 return; 782 } 783 784 update_array(ctx, "glVertexAttribLPointer", VERT_ATTRIB_GENERIC(index), 785 legalTypes, 1, 4, 786 size, type, stride, GL_FALSE, GL_FALSE, GL_TRUE, ptr); 787 } 788 789 790 void 791 _mesa_enable_vertex_array_attrib(struct gl_context *ctx, 792 struct gl_vertex_array_object *vao, 793 unsigned attrib) 794 { 795 assert(attrib < ARRAY_SIZE(vao->VertexAttrib)); 796 797 if (!vao->VertexAttrib[attrib].Enabled) { 798 /* was disabled, now being enabled */ 799 FLUSH_VERTICES(ctx, _NEW_ARRAY); 800 vao->VertexAttrib[attrib].Enabled = GL_TRUE; 801 vao->_Enabled |= VERT_BIT(attrib); 802 vao->NewArrays |= VERT_BIT(attrib); 803 } 804 } 805 806 static void 807 enable_vertex_array_attrib(struct gl_context *ctx, 808 struct gl_vertex_array_object *vao, 809 GLuint index, 810 const char *func) 811 { 812 if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { 813 _mesa_error(ctx, GL_INVALID_VALUE, "%s(index)", func); 814 return; 815 } 816 817 _mesa_enable_vertex_array_attrib(ctx, vao, VERT_ATTRIB_GENERIC(index)); 818 } 819 820 821 void GLAPIENTRY 822 _mesa_EnableVertexAttribArray(GLuint index) 823 { 824 GET_CURRENT_CONTEXT(ctx); 825 enable_vertex_array_attrib(ctx, ctx->Array.VAO, index, 826 "glEnableVertexAttribArray"); 827 } 828 829 830 void GLAPIENTRY 831 _mesa_EnableVertexArrayAttrib(GLuint vaobj, GLuint index) 832 { 833 GET_CURRENT_CONTEXT(ctx); 834 struct gl_vertex_array_object *vao; 835 836 /* The ARB_direct_state_access specification says: 837 * 838 * "An INVALID_OPERATION error is generated by EnableVertexArrayAttrib 839 * and DisableVertexArrayAttrib if <vaobj> is not 840 * [compatibility profile: zero or] the name of an existing vertex 841 * array object." 842 */ 843 vao = _mesa_lookup_vao_err(ctx, vaobj, "glEnableVertexArrayAttrib"); 844 if (!vao) 845 return; 846 847 enable_vertex_array_attrib(ctx, vao, index, "glEnableVertexArrayAttrib"); 848 } 849 850 851 static void 852 disable_vertex_array_attrib(struct gl_context *ctx, 853 struct gl_vertex_array_object *vao, 854 GLuint index, 855 const char *func) 856 { 857 if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { 858 _mesa_error(ctx, GL_INVALID_VALUE, "%s(index)", func); 859 return; 860 } 861 862 assert(VERT_ATTRIB_GENERIC(index) < ARRAY_SIZE(vao->VertexAttrib)); 863 864 if (vao->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) { 865 /* was enabled, now being disabled */ 866 FLUSH_VERTICES(ctx, _NEW_ARRAY); 867 vao->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_FALSE; 868 vao->_Enabled &= ~VERT_BIT_GENERIC(index); 869 vao->NewArrays |= VERT_BIT_GENERIC(index); 870 } 871 } 872 873 874 void GLAPIENTRY 875 _mesa_DisableVertexAttribArray(GLuint index) 876 { 877 GET_CURRENT_CONTEXT(ctx); 878 disable_vertex_array_attrib(ctx, ctx->Array.VAO, index, 879 "glDisableVertexAttribArray"); 880 } 881 882 883 void GLAPIENTRY 884 _mesa_DisableVertexArrayAttrib(GLuint vaobj, GLuint index) 885 { 886 GET_CURRENT_CONTEXT(ctx); 887 struct gl_vertex_array_object *vao; 888 889 /* The ARB_direct_state_access specification says: 890 * 891 * "An INVALID_OPERATION error is generated by EnableVertexArrayAttrib 892 * and DisableVertexArrayAttrib if <vaobj> is not 893 * [compatibility profile: zero or] the name of an existing vertex 894 * array object." 895 */ 896 vao = _mesa_lookup_vao_err(ctx, vaobj, "glDisableVertexArrayAttrib"); 897 if (!vao) 898 return; 899 900 disable_vertex_array_attrib(ctx, vao, index, "glDisableVertexArrayAttrib"); 901 } 902 903 904 /** 905 * Return info for a vertex attribute array (no alias with legacy 906 * vertex attributes (pos, normal, color, etc)). This function does 907 * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query. 908 */ 909 static GLuint 910 get_vertex_array_attrib(struct gl_context *ctx, 911 const struct gl_vertex_array_object *vao, 912 GLuint index, GLenum pname, 913 const char *caller) 914 { 915 const struct gl_array_attributes *array; 916 917 if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { 918 _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index); 919 return 0; 920 } 921 922 assert(VERT_ATTRIB_GENERIC(index) < ARRAY_SIZE(vao->VertexAttrib)); 923 924 array = &vao->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; 925 926 switch (pname) { 927 case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB: 928 return array->Enabled; 929 case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB: 930 return (array->Format == GL_BGRA) ? GL_BGRA : array->Size; 931 case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB: 932 return array->Stride; 933 case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB: 934 return array->Type; 935 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB: 936 return array->Normalized; 937 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB: 938 return vao->BufferBinding[array->BufferBindingIndex].BufferObj->Name; 939 case GL_VERTEX_ATTRIB_ARRAY_INTEGER: 940 if ((_mesa_is_desktop_gl(ctx) 941 && (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4)) 942 || _mesa_is_gles3(ctx)) { 943 return array->Integer; 944 } 945 goto error; 946 case GL_VERTEX_ATTRIB_ARRAY_LONG: 947 if (_mesa_is_desktop_gl(ctx)) { 948 return array->Doubles; 949 } 950 goto error; 951 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB: 952 if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_instanced_arrays) 953 || _mesa_is_gles3(ctx)) { 954 return vao->BufferBinding[array->BufferBindingIndex].InstanceDivisor; 955 } 956 goto error; 957 case GL_VERTEX_ATTRIB_BINDING: 958 if (_mesa_is_desktop_gl(ctx) || _mesa_is_gles31(ctx)) { 959 return array->BufferBindingIndex - VERT_ATTRIB_GENERIC0; 960 } 961 goto error; 962 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET: 963 if (_mesa_is_desktop_gl(ctx) || _mesa_is_gles31(ctx)) { 964 return array->RelativeOffset; 965 } 966 goto error; 967 default: 968 ; /* fall-through */ 969 } 970 971 error: 972 _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname); 973 return 0; 974 } 975 976 977 static const GLfloat * 978 get_current_attrib(struct gl_context *ctx, GLuint index, const char *function) 979 { 980 if (index == 0) { 981 if (_mesa_attr_zero_aliases_vertex(ctx)) { 982 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(index==0)", function); 983 return NULL; 984 } 985 } 986 else if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { 987 _mesa_error(ctx, GL_INVALID_VALUE, 988 "%s(index>=GL_MAX_VERTEX_ATTRIBS)", function); 989 return NULL; 990 } 991 992 assert(VERT_ATTRIB_GENERIC(index) < 993 ARRAY_SIZE(ctx->Array.VAO->VertexAttrib)); 994 995 FLUSH_CURRENT(ctx, 0); 996 return ctx->Current.Attrib[VERT_ATTRIB_GENERIC(index)]; 997 } 998 999 void GLAPIENTRY 1000 _mesa_GetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params) 1001 { 1002 GET_CURRENT_CONTEXT(ctx); 1003 1004 if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 1005 const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribfv"); 1006 if (v != NULL) { 1007 COPY_4V(params, v); 1008 } 1009 } 1010 else { 1011 params[0] = (GLfloat) get_vertex_array_attrib(ctx, ctx->Array.VAO, 1012 index, pname, 1013 "glGetVertexAttribfv"); 1014 } 1015 } 1016 1017 1018 void GLAPIENTRY 1019 _mesa_GetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params) 1020 { 1021 GET_CURRENT_CONTEXT(ctx); 1022 1023 if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 1024 const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribdv"); 1025 if (v != NULL) { 1026 params[0] = (GLdouble) v[0]; 1027 params[1] = (GLdouble) v[1]; 1028 params[2] = (GLdouble) v[2]; 1029 params[3] = (GLdouble) v[3]; 1030 } 1031 } 1032 else { 1033 params[0] = (GLdouble) get_vertex_array_attrib(ctx, ctx->Array.VAO, 1034 index, pname, 1035 "glGetVertexAttribdv"); 1036 } 1037 } 1038 1039 void GLAPIENTRY 1040 _mesa_GetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params) 1041 { 1042 GET_CURRENT_CONTEXT(ctx); 1043 1044 if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 1045 const GLdouble *v = 1046 (const GLdouble *)get_current_attrib(ctx, index, 1047 "glGetVertexAttribLdv"); 1048 if (v != NULL) { 1049 params[0] = v[0]; 1050 params[1] = v[1]; 1051 params[2] = v[2]; 1052 params[3] = v[3]; 1053 } 1054 } 1055 else { 1056 params[0] = (GLdouble) get_vertex_array_attrib(ctx, ctx->Array.VAO, 1057 index, pname, 1058 "glGetVertexAttribLdv"); 1059 } 1060 } 1061 1062 void GLAPIENTRY 1063 _mesa_GetVertexAttribiv(GLuint index, GLenum pname, GLint *params) 1064 { 1065 GET_CURRENT_CONTEXT(ctx); 1066 1067 if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 1068 const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribiv"); 1069 if (v != NULL) { 1070 /* XXX should floats in[0,1] be scaled to full int range? */ 1071 params[0] = (GLint) v[0]; 1072 params[1] = (GLint) v[1]; 1073 params[2] = (GLint) v[2]; 1074 params[3] = (GLint) v[3]; 1075 } 1076 } 1077 else { 1078 params[0] = (GLint) get_vertex_array_attrib(ctx, ctx->Array.VAO, 1079 index, pname, 1080 "glGetVertexAttribiv"); 1081 } 1082 } 1083 1084 1085 /** GL 3.0 */ 1086 void GLAPIENTRY 1087 _mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params) 1088 { 1089 GET_CURRENT_CONTEXT(ctx); 1090 1091 if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 1092 const GLint *v = (const GLint *) 1093 get_current_attrib(ctx, index, "glGetVertexAttribIiv"); 1094 if (v != NULL) { 1095 COPY_4V(params, v); 1096 } 1097 } 1098 else { 1099 params[0] = (GLint) get_vertex_array_attrib(ctx, ctx->Array.VAO, 1100 index, pname, 1101 "glGetVertexAttribIiv"); 1102 } 1103 } 1104 1105 1106 /** GL 3.0 */ 1107 void GLAPIENTRY 1108 _mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params) 1109 { 1110 GET_CURRENT_CONTEXT(ctx); 1111 1112 if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 1113 const GLuint *v = (const GLuint *) 1114 get_current_attrib(ctx, index, "glGetVertexAttribIuiv"); 1115 if (v != NULL) { 1116 COPY_4V(params, v); 1117 } 1118 } 1119 else { 1120 params[0] = get_vertex_array_attrib(ctx, ctx->Array.VAO, 1121 index, pname, 1122 "glGetVertexAttribIuiv"); 1123 } 1124 } 1125 1126 1127 void GLAPIENTRY 1128 _mesa_GetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid **pointer) 1129 { 1130 GET_CURRENT_CONTEXT(ctx); 1131 1132 if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { 1133 _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)"); 1134 return; 1135 } 1136 1137 if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) { 1138 _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)"); 1139 return; 1140 } 1141 1142 assert(VERT_ATTRIB_GENERIC(index) < 1143 ARRAY_SIZE(ctx->Array.VAO->VertexAttrib)); 1144 1145 *pointer = (GLvoid *) 1146 ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr; 1147 } 1148 1149 1150 /** ARB_direct_state_access */ 1151 void GLAPIENTRY 1152 _mesa_GetVertexArrayIndexediv(GLuint vaobj, GLuint index, 1153 GLenum pname, GLint *params) 1154 { 1155 GET_CURRENT_CONTEXT(ctx); 1156 struct gl_vertex_array_object *vao; 1157 1158 /* The ARB_direct_state_access specification says: 1159 * 1160 * "An INVALID_OPERATION error is generated if <vaobj> is not 1161 * [compatibility profile: zero or] the name of an existing 1162 * vertex array object." 1163 */ 1164 vao = _mesa_lookup_vao_err(ctx, vaobj, "glGetVertexArrayIndexediv"); 1165 if (!vao) 1166 return; 1167 1168 /* The ARB_direct_state_access specification says: 1169 * 1170 * "For GetVertexArrayIndexediv, <pname> must be one of 1171 * VERTEX_ATTRIB_ARRAY_ENABLED, VERTEX_ATTRIB_ARRAY_SIZE, 1172 * VERTEX_ATTRIB_ARRAY_STRIDE, VERTEX_ATTRIB_ARRAY_TYPE, 1173 * VERTEX_ATTRIB_ARRAY_NORMALIZED, VERTEX_ATTRIB_ARRAY_INTEGER, 1174 * VERTEX_ATTRIB_ARRAY_LONG, VERTEX_ATTRIB_ARRAY_DIVISOR, or 1175 * VERTEX_ATTRIB_RELATIVE_OFFSET." 1176 * 1177 * and: 1178 * 1179 * "Add GetVertexArrayIndexediv in 'Get Command' for 1180 * VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 1181 * VERTEX_ATTRIB_BINDING, 1182 * VERTEX_ATTRIB_RELATIVE_OFFSET, 1183 * VERTEX_BINDING_OFFSET, and 1184 * VERTEX_BINDING_STRIDE states" 1185 * 1186 * The only parameter name common to both lists is 1187 * VERTEX_ATTRIB_RELATIVE_OFFSET. Also note that VERTEX_BINDING_BUFFER 1188 * and VERTEX_BINDING_DIVISOR are missing from both lists. It seems 1189 * pretty clear however that the intent is that it should be possible 1190 * to query all vertex attrib and binding states that can be set with 1191 * a DSA function. 1192 */ 1193 switch (pname) { 1194 case GL_VERTEX_BINDING_OFFSET: 1195 params[0] = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].Offset; 1196 break; 1197 case GL_VERTEX_BINDING_STRIDE: 1198 params[0] = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].Stride; 1199 break; 1200 case GL_VERTEX_BINDING_DIVISOR: 1201 params[0] = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].InstanceDivisor; 1202 break; 1203 case GL_VERTEX_BINDING_BUFFER: 1204 params[0] = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].BufferObj->Name; 1205 break; 1206 default: 1207 params[0] = get_vertex_array_attrib(ctx, vao, index, pname, 1208 "glGetVertexArrayIndexediv"); 1209 break; 1210 } 1211 } 1212 1213 1214 void GLAPIENTRY 1215 _mesa_GetVertexArrayIndexed64iv(GLuint vaobj, GLuint index, 1216 GLenum pname, GLint64 *params) 1217 { 1218 GET_CURRENT_CONTEXT(ctx); 1219 struct gl_vertex_array_object *vao; 1220 1221 /* The ARB_direct_state_access specification says: 1222 * 1223 * "An INVALID_OPERATION error is generated if <vaobj> is not 1224 * [compatibility profile: zero or] the name of an existing 1225 * vertex array object." 1226 */ 1227 vao = _mesa_lookup_vao_err(ctx, vaobj, "glGetVertexArrayIndexed64iv"); 1228 if (!vao) 1229 return; 1230 1231 /* The ARB_direct_state_access specification says: 1232 * 1233 * "For GetVertexArrayIndexed64iv, <pname> must be 1234 * VERTEX_BINDING_OFFSET." 1235 * 1236 * and: 1237 * 1238 * "An INVALID_ENUM error is generated if <pname> is not one of 1239 * the valid values listed above for the corresponding command." 1240 */ 1241 if (pname != GL_VERTEX_BINDING_OFFSET) { 1242 _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexArrayIndexed64iv(" 1243 "pname != GL_VERTEX_BINDING_OFFSET)"); 1244 return; 1245 } 1246 1247 /* The ARB_direct_state_access specification says: 1248 * 1249 * "An INVALID_VALUE error is generated if <index> is greater than 1250 * or equal to the value of MAX_VERTEX_ATTRIBS." 1251 * 1252 * Since the index refers to a buffer binding in this case, the intended 1253 * limit must be MAX_VERTEX_ATTRIB_BINDINGS. Both limits are currently 1254 * required to be the same, so in practice this doesn't matter. 1255 */ 1256 if (index >= ctx->Const.MaxVertexAttribBindings) { 1257 _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexArrayIndexed64iv(index" 1258 "%d >= the value of GL_MAX_VERTEX_ATTRIB_BINDINGS (%d))", 1259 index, ctx->Const.MaxVertexAttribBindings); 1260 return; 1261 } 1262 1263 params[0] = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].Offset; 1264 } 1265 1266 1267 void GLAPIENTRY 1268 _mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, 1269 GLsizei count, const GLvoid *ptr) 1270 { 1271 (void) count; 1272 _mesa_VertexPointer(size, type, stride, ptr); 1273 } 1274 1275 1276 void GLAPIENTRY 1277 _mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, 1278 const GLvoid *ptr) 1279 { 1280 (void) count; 1281 _mesa_NormalPointer(type, stride, ptr); 1282 } 1283 1284 1285 void GLAPIENTRY 1286 _mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, 1287 const GLvoid *ptr) 1288 { 1289 (void) count; 1290 _mesa_ColorPointer(size, type, stride, ptr); 1291 } 1292 1293 1294 void GLAPIENTRY 1295 _mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, 1296 const GLvoid *ptr) 1297 { 1298 (void) count; 1299 _mesa_IndexPointer(type, stride, ptr); 1300 } 1301 1302 1303 void GLAPIENTRY 1304 _mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, 1305 GLsizei count, const GLvoid *ptr) 1306 { 1307 (void) count; 1308 _mesa_TexCoordPointer(size, type, stride, ptr); 1309 } 1310 1311 1312 void GLAPIENTRY 1313 _mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr) 1314 { 1315 (void) count; 1316 _mesa_EdgeFlagPointer(stride, ptr); 1317 } 1318 1319 1320 void GLAPIENTRY 1321 _mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) 1322 { 1323 GET_CURRENT_CONTEXT(ctx); 1324 GLboolean tflag, cflag, nflag; /* enable/disable flags */ 1325 GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */ 1326 GLenum ctype = 0; /* color type */ 1327 GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */ 1328 const GLint toffset = 0; /* always zero */ 1329 GLint defstride; /* default stride */ 1330 GLint c, f; 1331 1332 FLUSH_VERTICES(ctx, 0); 1333 1334 f = sizeof(GLfloat); 1335 c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f); 1336 1337 if (stride < 0) { 1338 _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" ); 1339 return; 1340 } 1341 1342 switch (format) { 1343 case GL_V2F: 1344 tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 1345 tcomps = 0; ccomps = 0; vcomps = 2; 1346 voffset = 0; 1347 defstride = 2*f; 1348 break; 1349 case GL_V3F: 1350 tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 1351 tcomps = 0; ccomps = 0; vcomps = 3; 1352 voffset = 0; 1353 defstride = 3*f; 1354 break; 1355 case GL_C4UB_V2F: 1356 tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 1357 tcomps = 0; ccomps = 4; vcomps = 2; 1358 ctype = GL_UNSIGNED_BYTE; 1359 coffset = 0; 1360 voffset = c; 1361 defstride = c + 2*f; 1362 break; 1363 case GL_C4UB_V3F: 1364 tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 1365 tcomps = 0; ccomps = 4; vcomps = 3; 1366 ctype = GL_UNSIGNED_BYTE; 1367 coffset = 0; 1368 voffset = c; 1369 defstride = c + 3*f; 1370 break; 1371 case GL_C3F_V3F: 1372 tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 1373 tcomps = 0; ccomps = 3; vcomps = 3; 1374 ctype = GL_FLOAT; 1375 coffset = 0; 1376 voffset = 3*f; 1377 defstride = 6*f; 1378 break; 1379 case GL_N3F_V3F: 1380 tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_TRUE; 1381 tcomps = 0; ccomps = 0; vcomps = 3; 1382 noffset = 0; 1383 voffset = 3*f; 1384 defstride = 6*f; 1385 break; 1386 case GL_C4F_N3F_V3F: 1387 tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_TRUE; 1388 tcomps = 0; ccomps = 4; vcomps = 3; 1389 ctype = GL_FLOAT; 1390 coffset = 0; 1391 noffset = 4*f; 1392 voffset = 7*f; 1393 defstride = 10*f; 1394 break; 1395 case GL_T2F_V3F: 1396 tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 1397 tcomps = 2; ccomps = 0; vcomps = 3; 1398 voffset = 2*f; 1399 defstride = 5*f; 1400 break; 1401 case GL_T4F_V4F: 1402 tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 1403 tcomps = 4; ccomps = 0; vcomps = 4; 1404 voffset = 4*f; 1405 defstride = 8*f; 1406 break; 1407 case GL_T2F_C4UB_V3F: 1408 tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 1409 tcomps = 2; ccomps = 4; vcomps = 3; 1410 ctype = GL_UNSIGNED_BYTE; 1411 coffset = 2*f; 1412 voffset = c+2*f; 1413 defstride = c+5*f; 1414 break; 1415 case GL_T2F_C3F_V3F: 1416 tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 1417 tcomps = 2; ccomps = 3; vcomps = 3; 1418 ctype = GL_FLOAT; 1419 coffset = 2*f; 1420 voffset = 5*f; 1421 defstride = 8*f; 1422 break; 1423 case GL_T2F_N3F_V3F: 1424 tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_TRUE; 1425 tcomps = 2; ccomps = 0; vcomps = 3; 1426 noffset = 2*f; 1427 voffset = 5*f; 1428 defstride = 8*f; 1429 break; 1430 case GL_T2F_C4F_N3F_V3F: 1431 tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 1432 tcomps = 2; ccomps = 4; vcomps = 3; 1433 ctype = GL_FLOAT; 1434 coffset = 2*f; 1435 noffset = 6*f; 1436 voffset = 9*f; 1437 defstride = 12*f; 1438 break; 1439 case GL_T4F_C4F_N3F_V4F: 1440 tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 1441 tcomps = 4; ccomps = 4; vcomps = 4; 1442 ctype = GL_FLOAT; 1443 coffset = 4*f; 1444 noffset = 8*f; 1445 voffset = 11*f; 1446 defstride = 15*f; 1447 break; 1448 default: 1449 _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" ); 1450 return; 1451 } 1452 1453 if (stride==0) { 1454 stride = defstride; 1455 } 1456 1457 _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY ); 1458 _mesa_DisableClientState( GL_INDEX_ARRAY ); 1459 /* XXX also disable secondary color and generic arrays? */ 1460 1461 /* Texcoords */ 1462 if (tflag) { 1463 _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY ); 1464 _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride, 1465 (GLubyte *) pointer + toffset ); 1466 } 1467 else { 1468 _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY ); 1469 } 1470 1471 /* Color */ 1472 if (cflag) { 1473 _mesa_EnableClientState( GL_COLOR_ARRAY ); 1474 _mesa_ColorPointer( ccomps, ctype, stride, 1475 (GLubyte *) pointer + coffset ); 1476 } 1477 else { 1478 _mesa_DisableClientState( GL_COLOR_ARRAY ); 1479 } 1480 1481 1482 /* Normals */ 1483 if (nflag) { 1484 _mesa_EnableClientState( GL_NORMAL_ARRAY ); 1485 _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset ); 1486 } 1487 else { 1488 _mesa_DisableClientState( GL_NORMAL_ARRAY ); 1489 } 1490 1491 /* Vertices */ 1492 _mesa_EnableClientState( GL_VERTEX_ARRAY ); 1493 _mesa_VertexPointer( vcomps, GL_FLOAT, stride, 1494 (GLubyte *) pointer + voffset ); 1495 } 1496 1497 1498 void GLAPIENTRY 1499 _mesa_LockArraysEXT(GLint first, GLsizei count) 1500 { 1501 GET_CURRENT_CONTEXT(ctx); 1502 1503 FLUSH_VERTICES(ctx, 0); 1504 1505 if (MESA_VERBOSE & VERBOSE_API) 1506 _mesa_debug(ctx, "glLockArrays %d %d\n", first, count); 1507 1508 if (first < 0) { 1509 _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" ); 1510 return; 1511 } 1512 if (count <= 0) { 1513 _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" ); 1514 return; 1515 } 1516 if (ctx->Array.LockCount != 0) { 1517 _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" ); 1518 return; 1519 } 1520 1521 ctx->Array.LockFirst = first; 1522 ctx->Array.LockCount = count; 1523 1524 ctx->NewState |= _NEW_ARRAY; 1525 } 1526 1527 1528 void GLAPIENTRY 1529 _mesa_UnlockArraysEXT( void ) 1530 { 1531 GET_CURRENT_CONTEXT(ctx); 1532 1533 FLUSH_VERTICES(ctx, 0); 1534 1535 if (MESA_VERBOSE & VERBOSE_API) 1536 _mesa_debug(ctx, "glUnlockArrays\n"); 1537 1538 if (ctx->Array.LockCount == 0) { 1539 _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" ); 1540 return; 1541 } 1542 1543 ctx->Array.LockFirst = 0; 1544 ctx->Array.LockCount = 0; 1545 ctx->NewState |= _NEW_ARRAY; 1546 } 1547 1548 1549 /* GL_EXT_multi_draw_arrays */ 1550 void GLAPIENTRY 1551 _mesa_MultiDrawArrays( GLenum mode, const GLint *first, 1552 const GLsizei *count, GLsizei primcount ) 1553 { 1554 GET_CURRENT_CONTEXT(ctx); 1555 GLint i; 1556 1557 FLUSH_VERTICES(ctx, 0); 1558 1559 for (i = 0; i < primcount; i++) { 1560 if (count[i] > 0) { 1561 CALL_DrawArrays(ctx->CurrentDispatch, (mode, first[i], count[i])); 1562 } 1563 } 1564 } 1565 1566 1567 /* GL_IBM_multimode_draw_arrays */ 1568 void GLAPIENTRY 1569 _mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, 1570 const GLsizei * count, 1571 GLsizei primcount, GLint modestride ) 1572 { 1573 GET_CURRENT_CONTEXT(ctx); 1574 GLint i; 1575 1576 FLUSH_VERTICES(ctx, 0); 1577 1578 for ( i = 0 ; i < primcount ; i++ ) { 1579 if ( count[i] > 0 ) { 1580 GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 1581 CALL_DrawArrays(ctx->CurrentDispatch, ( m, first[i], count[i] )); 1582 } 1583 } 1584 } 1585 1586 1587 /* GL_IBM_multimode_draw_arrays */ 1588 void GLAPIENTRY 1589 _mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, 1590 GLenum type, const GLvoid * const * indices, 1591 GLsizei primcount, GLint modestride ) 1592 { 1593 GET_CURRENT_CONTEXT(ctx); 1594 GLint i; 1595 1596 FLUSH_VERTICES(ctx, 0); 1597 1598 /* XXX not sure about ARB_vertex_buffer_object handling here */ 1599 1600 for ( i = 0 ; i < primcount ; i++ ) { 1601 if ( count[i] > 0 ) { 1602 GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 1603 CALL_DrawElements(ctx->CurrentDispatch, ( m, count[i], type, 1604 indices[i] )); 1605 } 1606 } 1607 } 1608 1609 1610 /** 1611 * GL_NV_primitive_restart and GL 3.1 1612 */ 1613 void GLAPIENTRY 1614 _mesa_PrimitiveRestartIndex(GLuint index) 1615 { 1616 GET_CURRENT_CONTEXT(ctx); 1617 1618 if (!ctx->Extensions.NV_primitive_restart && ctx->Version < 31) { 1619 _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()"); 1620 return; 1621 } 1622 1623 if (ctx->Array.RestartIndex != index) { 1624 FLUSH_VERTICES(ctx, _NEW_TRANSFORM); 1625 ctx->Array.RestartIndex = index; 1626 } 1627 } 1628 1629 1630 /** 1631 * See GL_ARB_instanced_arrays. 1632 * Note that the instance divisor only applies to generic arrays, not 1633 * the legacy vertex arrays. 1634 */ 1635 void GLAPIENTRY 1636 _mesa_VertexAttribDivisor(GLuint index, GLuint divisor) 1637 { 1638 GET_CURRENT_CONTEXT(ctx); 1639 1640 const GLuint genericIndex = VERT_ATTRIB_GENERIC(index); 1641 struct gl_vertex_array_object * const vao = ctx->Array.VAO; 1642 1643 if (!ctx->Extensions.ARB_instanced_arrays) { 1644 _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexAttribDivisor()"); 1645 return; 1646 } 1647 1648 if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { 1649 _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribDivisor(index = %u)", 1650 index); 1651 return; 1652 } 1653 1654 assert(genericIndex < ARRAY_SIZE(vao->VertexAttrib)); 1655 1656 /* The ARB_vertex_attrib_binding spec says: 1657 * 1658 * "The command 1659 * 1660 * void VertexAttribDivisor(uint index, uint divisor); 1661 * 1662 * is equivalent to (assuming no errors are generated): 1663 * 1664 * VertexAttribBinding(index, index); 1665 * VertexBindingDivisor(index, divisor);" 1666 */ 1667 vertex_attrib_binding(ctx, vao, genericIndex, genericIndex); 1668 vertex_binding_divisor(ctx, vao, genericIndex, divisor); 1669 } 1670 1671 1672 unsigned 1673 _mesa_primitive_restart_index(const struct gl_context *ctx, GLenum ib_type) 1674 { 1675 /* From the OpenGL 4.3 core specification, page 302: 1676 * "If both PRIMITIVE_RESTART and PRIMITIVE_RESTART_FIXED_INDEX are 1677 * enabled, the index value determined by PRIMITIVE_RESTART_FIXED_INDEX 1678 * is used." 1679 */ 1680 if (ctx->Array.PrimitiveRestartFixedIndex) { 1681 switch (ib_type) { 1682 case GL_UNSIGNED_BYTE: 1683 return 0xff; 1684 case GL_UNSIGNED_SHORT: 1685 return 0xffff; 1686 case GL_UNSIGNED_INT: 1687 return 0xffffffff; 1688 default: 1689 assert(!"_mesa_primitive_restart_index: Invalid index buffer type."); 1690 } 1691 } 1692 1693 return ctx->Array.RestartIndex; 1694 } 1695 1696 1697 /** 1698 * GL_ARB_vertex_attrib_binding 1699 */ 1700 static void 1701 vertex_array_vertex_buffer(struct gl_context *ctx, 1702 struct gl_vertex_array_object *vao, 1703 GLuint bindingIndex, GLuint buffer, GLintptr offset, 1704 GLsizei stride, const char *func) 1705 { 1706 struct gl_buffer_object *vbo; 1707 1708 ASSERT_OUTSIDE_BEGIN_END(ctx); 1709 1710 /* The ARB_vertex_attrib_binding spec says: 1711 * 1712 * "An INVALID_VALUE error is generated if <bindingindex> is greater than 1713 * the value of MAX_VERTEX_ATTRIB_BINDINGS." 1714 */ 1715 if (bindingIndex >= ctx->Const.MaxVertexAttribBindings) { 1716 _mesa_error(ctx, GL_INVALID_VALUE, 1717 "%s(bindingindex=%u > " 1718 "GL_MAX_VERTEX_ATTRIB_BINDINGS)", 1719 func, bindingIndex); 1720 return; 1721 } 1722 1723 /* The ARB_vertex_attrib_binding spec says: 1724 * 1725 * "The error INVALID_VALUE is generated if <stride> or <offset> 1726 * are negative." 1727 */ 1728 if (offset < 0) { 1729 _mesa_error(ctx, GL_INVALID_VALUE, 1730 "%s(offset=%" PRId64 " < 0)", 1731 func, (int64_t) offset); 1732 return; 1733 } 1734 1735 if (stride < 0) { 1736 _mesa_error(ctx, GL_INVALID_VALUE, 1737 "%s(stride=%d < 0)", func, stride); 1738 return; 1739 } 1740 1741 if (((ctx->API == API_OPENGL_CORE && ctx->Version >= 44) || _mesa_is_gles31(ctx)) && 1742 stride > ctx->Const.MaxVertexAttribStride) { 1743 _mesa_error(ctx, GL_INVALID_VALUE, "%s(stride=%d > " 1744 "GL_MAX_VERTEX_ATTRIB_STRIDE)", func, stride); 1745 return; 1746 } 1747 1748 if (buffer == 1749 vao->BufferBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj->Name) { 1750 vbo = vao->BufferBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj; 1751 } else if (buffer != 0) { 1752 vbo = _mesa_lookup_bufferobj(ctx, buffer); 1753 1754 if (!vbo && _mesa_is_gles31(ctx)) { 1755 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-gen name)", func); 1756 return; 1757 } 1758 /* From the GL_ARB_vertex_attrib_array spec: 1759 * 1760 * "[Core profile only:] 1761 * An INVALID_OPERATION error is generated if buffer is not zero or a 1762 * name returned from a previous call to GenBuffers, or if such a name 1763 * has since been deleted with DeleteBuffers. 1764 * 1765 * Otherwise, we fall back to the same compat profile behavior as other 1766 * object references (automatically gen it). 1767 */ 1768 if (!_mesa_handle_bind_buffer_gen(ctx, buffer, &vbo, func)) 1769 return; 1770 } else { 1771 /* The ARB_vertex_attrib_binding spec says: 1772 * 1773 * "If <buffer> is zero, any buffer object attached to this 1774 * bindpoint is detached." 1775 */ 1776 vbo = ctx->Shared->NullBufferObj; 1777 } 1778 1779 _mesa_bind_vertex_buffer(ctx, vao, VERT_ATTRIB_GENERIC(bindingIndex), 1780 vbo, offset, stride); 1781 } 1782 1783 1784 void GLAPIENTRY 1785 _mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset, 1786 GLsizei stride) 1787 { 1788 GET_CURRENT_CONTEXT(ctx); 1789 1790 /* The ARB_vertex_attrib_binding spec says: 1791 * 1792 * "An INVALID_OPERATION error is generated if no vertex array object 1793 * is bound." 1794 */ 1795 if ((ctx->API == API_OPENGL_CORE || _mesa_is_gles31(ctx)) && 1796 ctx->Array.VAO == ctx->Array.DefaultVAO) { 1797 _mesa_error(ctx, GL_INVALID_OPERATION, 1798 "glBindVertexBuffer(No array object bound)"); 1799 return; 1800 } 1801 1802 vertex_array_vertex_buffer(ctx, ctx->Array.VAO, bindingIndex, 1803 buffer, offset, stride, "glBindVertexBuffer"); 1804 } 1805 1806 1807 void GLAPIENTRY 1808 _mesa_VertexArrayVertexBuffer(GLuint vaobj, GLuint bindingIndex, GLuint buffer, 1809 GLintptr offset, GLsizei stride) 1810 { 1811 GET_CURRENT_CONTEXT(ctx); 1812 struct gl_vertex_array_object *vao; 1813 1814 /* The ARB_direct_state_access specification says: 1815 * 1816 * "An INVALID_OPERATION error is generated by VertexArrayVertexBuffer 1817 * if <vaobj> is not [compatibility profile: zero or] the name of an 1818 * existing vertex array object." 1819 */ 1820 vao = _mesa_lookup_vao_err(ctx, vaobj, "glVertexArrayVertexBuffer"); 1821 if (!vao) 1822 return; 1823 1824 vertex_array_vertex_buffer(ctx, vao, bindingIndex, 1825 buffer, offset, stride, 1826 "glVertexArrayVertexBuffer"); 1827 } 1828 1829 1830 static void 1831 vertex_array_vertex_buffers(struct gl_context *ctx, 1832 struct gl_vertex_array_object *vao, 1833 GLuint first, GLsizei count, const GLuint *buffers, 1834 const GLintptr *offsets, const GLsizei *strides, 1835 const char *func) 1836 { 1837 GLuint i; 1838 1839 ASSERT_OUTSIDE_BEGIN_END(ctx); 1840 1841 /* The ARB_multi_bind spec says: 1842 * 1843 * "An INVALID_OPERATION error is generated if <first> + <count> 1844 * is greater than the value of MAX_VERTEX_ATTRIB_BINDINGS." 1845 */ 1846 if (first + count > ctx->Const.MaxVertexAttribBindings) { 1847 _mesa_error(ctx, GL_INVALID_OPERATION, 1848 "%s(first=%u + count=%d > the value of " 1849 "GL_MAX_VERTEX_ATTRIB_BINDINGS=%u)", 1850 func, first, count, ctx->Const.MaxVertexAttribBindings); 1851 return; 1852 } 1853 1854 if (!buffers) { 1855 /** 1856 * The ARB_multi_bind spec says: 1857 * 1858 * "If <buffers> is NULL, each affected vertex buffer binding point 1859 * from <first> through <first>+<count>-1 will be reset to have no 1860 * bound buffer object. In this case, the offsets and strides 1861 * associated with the binding points are set to default values, 1862 * ignoring <offsets> and <strides>." 1863 */ 1864 struct gl_buffer_object *vbo = ctx->Shared->NullBufferObj; 1865 1866 for (i = 0; i < count; i++) 1867 _mesa_bind_vertex_buffer(ctx, vao, VERT_ATTRIB_GENERIC(first + i), 1868 vbo, 0, 16); 1869 1870 return; 1871 } 1872 1873 /* Note that the error semantics for multi-bind commands differ from 1874 * those of other GL commands. 1875 * 1876 * The Issues section in the ARB_multi_bind spec says: 1877 * 1878 * "(11) Typically, OpenGL specifies that if an error is generated by 1879 * a command, that command has no effect. This is somewhat 1880 * unfortunate for multi-bind commands, because it would require 1881 * a first pass to scan the entire list of bound objects for 1882 * errors and then a second pass to actually perform the 1883 * bindings. Should we have different error semantics? 1884 * 1885 * RESOLVED: Yes. In this specification, when the parameters for 1886 * one of the <count> binding points are invalid, that binding 1887 * point is not updated and an error will be generated. However, 1888 * other binding points in the same command will be updated if 1889 * their parameters are valid and no other error occurs." 1890 */ 1891 1892 _mesa_begin_bufferobj_lookups(ctx); 1893 1894 for (i = 0; i < count; i++) { 1895 struct gl_buffer_object *vbo; 1896 1897 /* The ARB_multi_bind spec says: 1898 * 1899 * "An INVALID_VALUE error is generated if any value in 1900 * <offsets> or <strides> is negative (per binding)." 1901 */ 1902 if (offsets[i] < 0) { 1903 _mesa_error(ctx, GL_INVALID_VALUE, 1904 "%s(offsets[%u]=%" PRId64 " < 0)", 1905 func, i, (int64_t) offsets[i]); 1906 continue; 1907 } 1908 1909 if (strides[i] < 0) { 1910 _mesa_error(ctx, GL_INVALID_VALUE, 1911 "%s(strides[%u]=%d < 0)", 1912 func, i, strides[i]); 1913 continue; 1914 } 1915 1916 if (ctx->API == API_OPENGL_CORE && ctx->Version >= 44 && 1917 strides[i] > ctx->Const.MaxVertexAttribStride) { 1918 _mesa_error(ctx, GL_INVALID_VALUE, 1919 "%s(strides[%u]=%d > " 1920 "GL_MAX_VERTEX_ATTRIB_STRIDE)", func, i, strides[i]); 1921 continue; 1922 } 1923 1924 if (buffers[i]) { 1925 struct gl_vertex_buffer_binding *binding = 1926 &vao->BufferBinding[VERT_ATTRIB_GENERIC(first + i)]; 1927 1928 if (buffers[i] == binding->BufferObj->Name) 1929 vbo = binding->BufferObj; 1930 else 1931 vbo = _mesa_multi_bind_lookup_bufferobj(ctx, buffers, i, func); 1932 1933 if (!vbo) 1934 continue; 1935 } else { 1936 vbo = ctx->Shared->NullBufferObj; 1937 } 1938 1939 _mesa_bind_vertex_buffer(ctx, vao, VERT_ATTRIB_GENERIC(first + i), 1940 vbo, offsets[i], strides[i]); 1941 } 1942 1943 _mesa_end_bufferobj_lookups(ctx); 1944 } 1945 1946 1947 void GLAPIENTRY 1948 _mesa_BindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers, 1949 const GLintptr *offsets, const GLsizei *strides) 1950 { 1951 GET_CURRENT_CONTEXT(ctx); 1952 1953 /* The ARB_vertex_attrib_binding spec says: 1954 * 1955 * "An INVALID_OPERATION error is generated if no 1956 * vertex array object is bound." 1957 */ 1958 if (ctx->API == API_OPENGL_CORE && 1959 ctx->Array.VAO == ctx->Array.DefaultVAO) { 1960 _mesa_error(ctx, GL_INVALID_OPERATION, 1961 "glBindVertexBuffers(No array object bound)"); 1962 return; 1963 } 1964 1965 vertex_array_vertex_buffers(ctx, ctx->Array.VAO, first, count, 1966 buffers, offsets, strides, 1967 "glBindVertexBuffers"); 1968 } 1969 1970 1971 void GLAPIENTRY 1972 _mesa_VertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count, 1973 const GLuint *buffers, 1974 const GLintptr *offsets, const GLsizei *strides) 1975 { 1976 GET_CURRENT_CONTEXT(ctx); 1977 struct gl_vertex_array_object *vao; 1978 1979 /* The ARB_direct_state_access specification says: 1980 * 1981 * "An INVALID_OPERATION error is generated by VertexArrayVertexBuffer 1982 * if <vaobj> is not [compatibility profile: zero or] the name of an 1983 * existing vertex array object." 1984 */ 1985 vao = _mesa_lookup_vao_err(ctx, vaobj, "glVertexArrayVertexBuffers"); 1986 if (!vao) 1987 return; 1988 1989 vertex_array_vertex_buffers(ctx, vao, first, count, 1990 buffers, offsets, strides, 1991 "glVertexArrayVertexBuffers"); 1992 } 1993 1994 1995 static void 1996 vertex_attrib_format(GLuint attribIndex, GLint size, GLenum type, 1997 GLboolean normalized, GLboolean integer, 1998 GLboolean doubles, GLbitfield legalTypes, 1999 GLsizei maxSize, GLuint relativeOffset, 2000 const char *func) 2001 { 2002 GET_CURRENT_CONTEXT(ctx); 2003 ASSERT_OUTSIDE_BEGIN_END(ctx); 2004 2005 /* The ARB_vertex_attrib_binding spec says: 2006 * 2007 * "An INVALID_OPERATION error is generated under any of the following 2008 * conditions: 2009 * - if no vertex array object is currently bound (see section 2.10); 2010 * - ..." 2011 * 2012 * This error condition only applies to VertexAttribFormat and 2013 * VertexAttribIFormat in the extension spec, but we assume that this 2014 * is an oversight. In the OpenGL 4.3 (Core Profile) spec, it applies 2015 * to all three functions. 2016 */ 2017 if ((ctx->API == API_OPENGL_CORE || _mesa_is_gles31(ctx)) && 2018 ctx->Array.VAO == ctx->Array.DefaultVAO) { 2019 _mesa_error(ctx, GL_INVALID_OPERATION, 2020 "%s(No array object bound)", func); 2021 return; 2022 } 2023 2024 /* The ARB_vertex_attrib_binding spec says: 2025 * 2026 * "The error INVALID_VALUE is generated if index is greater than or equal 2027 * to the value of MAX_VERTEX_ATTRIBS." 2028 */ 2029 if (attribIndex >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { 2030 _mesa_error(ctx, GL_INVALID_VALUE, 2031 "%s(attribindex=%u > " 2032 "GL_MAX_VERTEX_ATTRIBS)", 2033 func, attribIndex); 2034 return; 2035 } 2036 2037 FLUSH_VERTICES(ctx, 0); 2038 2039 update_array_format(ctx, func, ctx->Array.VAO, 2040 VERT_ATTRIB_GENERIC(attribIndex), 2041 legalTypes, 1, maxSize, size, type, 2042 normalized, integer, doubles, relativeOffset); 2043 } 2044 2045 2046 void GLAPIENTRY 2047 _mesa_VertexAttribFormat(GLuint attribIndex, GLint size, GLenum type, 2048 GLboolean normalized, GLuint relativeOffset) 2049 { 2050 vertex_attrib_format(attribIndex, size, type, normalized, 2051 GL_FALSE, GL_FALSE, ATTRIB_FORMAT_TYPES_MASK, 2052 BGRA_OR_4, relativeOffset, 2053 "glVertexAttribFormat"); 2054 } 2055 2056 2057 void GLAPIENTRY 2058 _mesa_VertexAttribIFormat(GLuint attribIndex, GLint size, GLenum type, 2059 GLuint relativeOffset) 2060 { 2061 vertex_attrib_format(attribIndex, size, type, GL_FALSE, 2062 GL_TRUE, GL_FALSE, ATTRIB_IFORMAT_TYPES_MASK, 4, 2063 relativeOffset, "glVertexAttribIFormat"); 2064 } 2065 2066 2067 void GLAPIENTRY 2068 _mesa_VertexAttribLFormat(GLuint attribIndex, GLint size, GLenum type, 2069 GLuint relativeOffset) 2070 { 2071 vertex_attrib_format(attribIndex, size, type, GL_FALSE, GL_FALSE, 2072 GL_TRUE, ATTRIB_LFORMAT_TYPES_MASK, 4, 2073 relativeOffset, "glVertexAttribLFormat"); 2074 } 2075 2076 2077 static void 2078 vertex_array_attrib_format(GLuint vaobj, GLuint attribIndex, GLint size, 2079 GLenum type, GLboolean normalized, 2080 GLboolean integer, GLboolean doubles, 2081 GLbitfield legalTypes, GLsizei maxSize, 2082 GLuint relativeOffset, const char *func) 2083 { 2084 GET_CURRENT_CONTEXT(ctx); 2085 struct gl_vertex_array_object *vao; 2086 2087 ASSERT_OUTSIDE_BEGIN_END(ctx); 2088 2089 /* The ARB_direct_state_access spec says: 2090 * 2091 * "An INVALID_OPERATION error is generated by VertexArrayAttrib*Format 2092 * if <vaobj> is not [compatibility profile: zero or] the name of an 2093 * existing vertex array object." 2094 */ 2095 vao = _mesa_lookup_vao_err(ctx, vaobj, func); 2096 if (!vao) 2097 return; 2098 2099 /* The ARB_vertex_attrib_binding spec says: 2100 * 2101 * "The error INVALID_VALUE is generated if index is greater than or equal 2102 * to the value of MAX_VERTEX_ATTRIBS." 2103 */ 2104 if (attribIndex >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { 2105 _mesa_error(ctx, GL_INVALID_VALUE, 2106 "%s(attribindex=%u > GL_MAX_VERTEX_ATTRIBS)", 2107 func, attribIndex); 2108 return; 2109 } 2110 2111 FLUSH_VERTICES(ctx, 0); 2112 2113 update_array_format(ctx, func, vao, 2114 VERT_ATTRIB_GENERIC(attribIndex), 2115 legalTypes, 1, maxSize, size, type, normalized, 2116 integer, doubles, relativeOffset); 2117 } 2118 2119 2120 void GLAPIENTRY 2121 _mesa_VertexArrayAttribFormat(GLuint vaobj, GLuint attribIndex, GLint size, 2122 GLenum type, GLboolean normalized, 2123 GLuint relativeOffset) 2124 { 2125 vertex_array_attrib_format(vaobj, attribIndex, size, type, normalized, 2126 GL_FALSE, GL_FALSE, ATTRIB_FORMAT_TYPES_MASK, 2127 BGRA_OR_4, relativeOffset, 2128 "glVertexArrayAttribFormat"); 2129 } 2130 2131 2132 void GLAPIENTRY 2133 _mesa_VertexArrayAttribIFormat(GLuint vaobj, GLuint attribIndex, 2134 GLint size, GLenum type, 2135 GLuint relativeOffset) 2136 { 2137 vertex_array_attrib_format(vaobj, attribIndex, size, type, GL_FALSE, 2138 GL_TRUE, GL_FALSE, ATTRIB_IFORMAT_TYPES_MASK, 2139 4, relativeOffset, 2140 "glVertexArrayAttribIFormat"); 2141 } 2142 2143 2144 void GLAPIENTRY 2145 _mesa_VertexArrayAttribLFormat(GLuint vaobj, GLuint attribIndex, 2146 GLint size, GLenum type, 2147 GLuint relativeOffset) 2148 { 2149 vertex_array_attrib_format(vaobj, attribIndex, size, type, GL_FALSE, 2150 GL_FALSE, GL_TRUE, ATTRIB_LFORMAT_TYPES_MASK, 2151 4, relativeOffset, 2152 "glVertexArrayAttribLFormat"); 2153 } 2154 2155 2156 static void 2157 vertex_array_attrib_binding(struct gl_context *ctx, 2158 struct gl_vertex_array_object *vao, 2159 GLuint attribIndex, GLuint bindingIndex, 2160 const char *func) 2161 { 2162 ASSERT_OUTSIDE_BEGIN_END(ctx); 2163 2164 /* The ARB_vertex_attrib_binding spec says: 2165 * 2166 * "<attribindex> must be less than the value of MAX_VERTEX_ATTRIBS and 2167 * <bindingindex> must be less than the value of 2168 * MAX_VERTEX_ATTRIB_BINDINGS, otherwise the error INVALID_VALUE 2169 * is generated." 2170 */ 2171 if (attribIndex >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) { 2172 _mesa_error(ctx, GL_INVALID_VALUE, 2173 "%s(attribindex=%u >= " 2174 "GL_MAX_VERTEX_ATTRIBS)", 2175 func, attribIndex); 2176 return; 2177 } 2178 2179 if (bindingIndex >= ctx->Const.MaxVertexAttribBindings) { 2180 _mesa_error(ctx, GL_INVALID_VALUE, 2181 "%s(bindingindex=%u >= " 2182 "GL_MAX_VERTEX_ATTRIB_BINDINGS)", 2183 func, bindingIndex); 2184 return; 2185 } 2186 2187 assert(VERT_ATTRIB_GENERIC(attribIndex) < ARRAY_SIZE(vao->VertexAttrib)); 2188 2189 vertex_attrib_binding(ctx, vao, 2190 VERT_ATTRIB_GENERIC(attribIndex), 2191 VERT_ATTRIB_GENERIC(bindingIndex)); 2192 } 2193 2194 2195 void GLAPIENTRY 2196 _mesa_VertexAttribBinding(GLuint attribIndex, GLuint bindingIndex) 2197 { 2198 GET_CURRENT_CONTEXT(ctx); 2199 2200 /* The ARB_vertex_attrib_binding spec says: 2201 * 2202 * "An INVALID_OPERATION error is generated if no vertex array object 2203 * is bound." 2204 */ 2205 if ((ctx->API == API_OPENGL_CORE || _mesa_is_gles31(ctx)) && 2206 ctx->Array.VAO == ctx->Array.DefaultVAO) { 2207 _mesa_error(ctx, GL_INVALID_OPERATION, 2208 "glVertexAttribBinding(No array object bound)"); 2209 return; 2210 } 2211 2212 vertex_array_attrib_binding(ctx, ctx->Array.VAO, 2213 attribIndex, bindingIndex, 2214 "glVertexAttribBinding"); 2215 } 2216 2217 2218 void GLAPIENTRY 2219 _mesa_VertexArrayAttribBinding(GLuint vaobj, GLuint attribIndex, GLuint bindingIndex) 2220 { 2221 GET_CURRENT_CONTEXT(ctx); 2222 struct gl_vertex_array_object *vao; 2223 2224 /* The ARB_direct_state_access specification says: 2225 * 2226 * "An INVALID_OPERATION error is generated by VertexArrayAttribBinding 2227 * if <vaobj> is not [compatibility profile: zero or] the name of an 2228 * existing vertex array object." 2229 */ 2230 vao = _mesa_lookup_vao_err(ctx, vaobj, "glVertexArrayAttribBinding"); 2231 if (!vao) 2232 return; 2233 2234 vertex_array_attrib_binding(ctx, vao, attribIndex, bindingIndex, 2235 "glVertexArrayAttribBinding"); 2236 } 2237 2238 2239 static void 2240 vertex_array_binding_divisor(struct gl_context *ctx, 2241 struct gl_vertex_array_object *vao, 2242 GLuint bindingIndex, GLuint divisor, 2243 const char *func) 2244 { 2245 ASSERT_OUTSIDE_BEGIN_END(ctx); 2246 2247 if (!ctx->Extensions.ARB_instanced_arrays) { 2248 _mesa_error(ctx, GL_INVALID_OPERATION, "%s()", func); 2249 return; 2250 } 2251 2252 /* The ARB_vertex_attrib_binding spec says: 2253 * 2254 * "An INVALID_VALUE error is generated if <bindingindex> is greater 2255 * than or equal to the value of MAX_VERTEX_ATTRIB_BINDINGS." 2256 */ 2257 if (bindingIndex >= ctx->Const.MaxVertexAttribBindings) { 2258 _mesa_error(ctx, GL_INVALID_VALUE, 2259 "%s(bindingindex=%u > " 2260 "GL_MAX_VERTEX_ATTRIB_BINDINGS)", 2261 func, bindingIndex); 2262 return; 2263 } 2264 2265 vertex_binding_divisor(ctx, vao, VERT_ATTRIB_GENERIC(bindingIndex), divisor); 2266 } 2267 2268 2269 void GLAPIENTRY 2270 _mesa_VertexBindingDivisor(GLuint bindingIndex, GLuint divisor) 2271 { 2272 GET_CURRENT_CONTEXT(ctx); 2273 2274 /* The ARB_vertex_attrib_binding spec says: 2275 * 2276 * "An INVALID_OPERATION error is generated if no vertex array object 2277 * is bound." 2278 */ 2279 if ((ctx->API == API_OPENGL_CORE || _mesa_is_gles31(ctx)) && 2280 ctx->Array.VAO == ctx->Array.DefaultVAO) { 2281 _mesa_error(ctx, GL_INVALID_OPERATION, 2282 "glVertexBindingDivisor(No array object bound)"); 2283 return; 2284 } 2285 2286 vertex_array_binding_divisor(ctx, ctx->Array.VAO, 2287 bindingIndex, divisor, 2288 "glVertexBindingDivisor"); 2289 } 2290 2291 2292 void GLAPIENTRY 2293 _mesa_VertexArrayBindingDivisor(GLuint vaobj, GLuint bindingIndex, 2294 GLuint divisor) 2295 { 2296 struct gl_vertex_array_object *vao; 2297 GET_CURRENT_CONTEXT(ctx); 2298 2299 /* The ARB_direct_state_access specification says: 2300 * 2301 * "An INVALID_OPERATION error is generated by VertexArrayBindingDivisor 2302 * if <vaobj> is not [compatibility profile: zero or] the name of an 2303 * existing vertex array object." 2304 */ 2305 vao = _mesa_lookup_vao_err(ctx, vaobj, "glVertexArrayBindingDivisor"); 2306 if (!vao) 2307 return; 2308 2309 vertex_array_binding_divisor(ctx, vao, bindingIndex, divisor, 2310 "glVertexArrayBindingDivisor"); 2311 } 2312 2313 2314 /** 2315 * Copy one client vertex array to another. 2316 */ 2317 void 2318 _mesa_copy_client_array(struct gl_context *ctx, 2319 struct gl_vertex_array *dst, 2320 struct gl_vertex_array *src) 2321 { 2322 dst->Size = src->Size; 2323 dst->Type = src->Type; 2324 dst->Format = src->Format; 2325 dst->StrideB = src->StrideB; 2326 dst->Ptr = src->Ptr; 2327 dst->Normalized = src->Normalized; 2328 dst->Integer = src->Integer; 2329 dst->Doubles = src->Doubles; 2330 dst->InstanceDivisor = src->InstanceDivisor; 2331 dst->_ElementSize = src->_ElementSize; 2332 _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj); 2333 } 2334 2335 void 2336 _mesa_copy_vertex_attrib_array(struct gl_context *ctx, 2337 struct gl_array_attributes *dst, 2338 const struct gl_array_attributes *src) 2339 { 2340 dst->Size = src->Size; 2341 dst->Type = src->Type; 2342 dst->Format = src->Format; 2343 dst->BufferBindingIndex = src->BufferBindingIndex; 2344 dst->RelativeOffset = src->RelativeOffset; 2345 dst->Format = src->Format; 2346 dst->Integer = src->Integer; 2347 dst->Doubles = src->Doubles; 2348 dst->Normalized = src->Normalized; 2349 dst->Ptr = src->Ptr; 2350 dst->Enabled = src->Enabled; 2351 dst->_ElementSize = src->_ElementSize; 2352 } 2353 2354 void 2355 _mesa_copy_vertex_buffer_binding(struct gl_context *ctx, 2356 struct gl_vertex_buffer_binding *dst, 2357 const struct gl_vertex_buffer_binding *src) 2358 { 2359 dst->Offset = src->Offset; 2360 dst->Stride = src->Stride; 2361 dst->InstanceDivisor = src->InstanceDivisor; 2362 dst->_BoundArrays = src->_BoundArrays; 2363 2364 _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj); 2365 } 2366 2367 /** 2368 * Print current vertex object/array info. For debug. 2369 */ 2370 void 2371 _mesa_print_arrays(struct gl_context *ctx) 2372 { 2373 const struct gl_vertex_array_object *vao = ctx->Array.VAO; 2374 2375 fprintf(stderr, "Array Object %u\n", vao->Name); 2376 2377 unsigned i; 2378 for (i = 0; i < VERT_ATTRIB_MAX; ++i) { 2379 const struct gl_array_attributes *array = &vao->VertexAttrib[i]; 2380 if (!array->Enabled) 2381 continue; 2382 2383 const struct gl_vertex_buffer_binding *binding = 2384 &vao->BufferBinding[array->BufferBindingIndex]; 2385 const struct gl_buffer_object *bo = binding->BufferObj; 2386 2387 fprintf(stderr, " %s: Ptr=%p, Type=%s, Size=%d, ElemSize=%u, " 2388 "Stride=%d, Buffer=%u(Size %lu)\n", 2389 gl_vert_attrib_name((gl_vert_attrib)i), 2390 array->Ptr, _mesa_enum_to_string(array->Type), array->Size, 2391 array->_ElementSize, binding->Stride, bo->Name, 2392 (unsigned long) bo->Size); 2393 } 2394 } 2395 2396 2397 /** 2398 * Initialize vertex array state for given context. 2399 */ 2400 void 2401 _mesa_init_varray(struct gl_context *ctx) 2402 { 2403 ctx->Array.DefaultVAO = _mesa_new_vao(ctx, 0); 2404 _mesa_reference_vao(ctx, &ctx->Array.VAO, ctx->Array.DefaultVAO); 2405 ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */ 2406 2407 ctx->Array.Objects = _mesa_NewHashTable(); 2408 } 2409 2410 2411 /** 2412 * Callback for deleting an array object. Called by _mesa_HashDeleteAll(). 2413 */ 2414 static void 2415 delete_arrayobj_cb(GLuint id, void *data, void *userData) 2416 { 2417 struct gl_vertex_array_object *vao = (struct gl_vertex_array_object *) data; 2418 struct gl_context *ctx = (struct gl_context *) userData; 2419 _mesa_delete_vao(ctx, vao); 2420 } 2421 2422 2423 /** 2424 * Free vertex array state for given context. 2425 */ 2426 void 2427 _mesa_free_varray_data(struct gl_context *ctx) 2428 { 2429 _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx); 2430 _mesa_DeleteHashTable(ctx->Array.Objects); 2431 } 2432