1 /* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5 * Copyright (c) 2008-2009 VMware, Inc. 6 * Copyright (c) 2012 Intel Corporation 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a 9 * copy of this software and associated documentation files (the "Software"), 10 * to deal in the Software without restriction, including without limitation 11 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12 * and/or sell copies of the Software, and to permit persons to whom the 13 * Software is furnished to do so, subject to the following conditions: 14 * 15 * The above copyright notice and this permission notice shall be included 16 * in all copies or substantial portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26 27 #include "context.h" 28 #include "glformats.h" 29 30 31 /** 32 * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise. 33 */ 34 GLboolean 35 _mesa_type_is_packed(GLenum type) 36 { 37 switch (type) { 38 case GL_UNSIGNED_BYTE_3_3_2: 39 case GL_UNSIGNED_BYTE_2_3_3_REV: 40 case MESA_UNSIGNED_BYTE_4_4: 41 case GL_UNSIGNED_SHORT_5_6_5: 42 case GL_UNSIGNED_SHORT_5_6_5_REV: 43 case GL_UNSIGNED_SHORT_4_4_4_4: 44 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 45 case GL_UNSIGNED_SHORT_5_5_5_1: 46 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 47 case GL_UNSIGNED_INT_8_8_8_8: 48 case GL_UNSIGNED_INT_8_8_8_8_REV: 49 case GL_UNSIGNED_INT_10_10_10_2: 50 case GL_UNSIGNED_INT_2_10_10_10_REV: 51 case GL_UNSIGNED_SHORT_8_8_MESA: 52 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 53 case GL_UNSIGNED_INT_24_8_EXT: 54 case GL_UNSIGNED_INT_5_9_9_9_REV: 55 case GL_UNSIGNED_INT_10F_11F_11F_REV: 56 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 57 return GL_TRUE; 58 } 59 60 return GL_FALSE; 61 } 62 63 64 /** 65 * Get the size of a GL data type. 66 * 67 * \param type GL data type. 68 * 69 * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1 70 * if an invalid type enum. 71 */ 72 GLint 73 _mesa_sizeof_type(GLenum type) 74 { 75 switch (type) { 76 case GL_BITMAP: 77 return 0; 78 case GL_UNSIGNED_BYTE: 79 return sizeof(GLubyte); 80 case GL_BYTE: 81 return sizeof(GLbyte); 82 case GL_UNSIGNED_SHORT: 83 return sizeof(GLushort); 84 case GL_SHORT: 85 return sizeof(GLshort); 86 case GL_UNSIGNED_INT: 87 return sizeof(GLuint); 88 case GL_INT: 89 return sizeof(GLint); 90 case GL_FLOAT: 91 return sizeof(GLfloat); 92 case GL_DOUBLE: 93 return sizeof(GLdouble); 94 case GL_HALF_FLOAT_ARB: 95 return sizeof(GLhalfARB); 96 case GL_FIXED: 97 return sizeof(GLfixed); 98 default: 99 return -1; 100 } 101 } 102 103 104 /** 105 * Same as _mesa_sizeof_type() but also accepting the packed pixel 106 * format data types. 107 */ 108 GLint 109 _mesa_sizeof_packed_type(GLenum type) 110 { 111 switch (type) { 112 case GL_BITMAP: 113 return 0; 114 case GL_UNSIGNED_BYTE: 115 return sizeof(GLubyte); 116 case GL_BYTE: 117 return sizeof(GLbyte); 118 case GL_UNSIGNED_SHORT: 119 return sizeof(GLushort); 120 case GL_SHORT: 121 return sizeof(GLshort); 122 case GL_UNSIGNED_INT: 123 return sizeof(GLuint); 124 case GL_INT: 125 return sizeof(GLint); 126 case GL_HALF_FLOAT_ARB: 127 return sizeof(GLhalfARB); 128 case GL_FLOAT: 129 return sizeof(GLfloat); 130 case GL_UNSIGNED_BYTE_3_3_2: 131 case GL_UNSIGNED_BYTE_2_3_3_REV: 132 case MESA_UNSIGNED_BYTE_4_4: 133 return sizeof(GLubyte); 134 case GL_UNSIGNED_SHORT_5_6_5: 135 case GL_UNSIGNED_SHORT_5_6_5_REV: 136 case GL_UNSIGNED_SHORT_4_4_4_4: 137 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 138 case GL_UNSIGNED_SHORT_5_5_5_1: 139 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 140 case GL_UNSIGNED_SHORT_8_8_MESA: 141 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 142 return sizeof(GLushort); 143 case GL_UNSIGNED_INT_8_8_8_8: 144 case GL_UNSIGNED_INT_8_8_8_8_REV: 145 case GL_UNSIGNED_INT_10_10_10_2: 146 case GL_UNSIGNED_INT_2_10_10_10_REV: 147 case GL_UNSIGNED_INT_24_8_EXT: 148 case GL_UNSIGNED_INT_5_9_9_9_REV: 149 case GL_UNSIGNED_INT_10F_11F_11F_REV: 150 return sizeof(GLuint); 151 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 152 return 8; 153 default: 154 return -1; 155 } 156 } 157 158 159 /** 160 * Get the number of components in a pixel format. 161 * 162 * \param format pixel format. 163 * 164 * \return the number of components in the given format, or -1 if a bad format. 165 */ 166 GLint 167 _mesa_components_in_format(GLenum format) 168 { 169 switch (format) { 170 case GL_COLOR_INDEX: 171 case GL_STENCIL_INDEX: 172 case GL_DEPTH_COMPONENT: 173 case GL_RED: 174 case GL_RED_INTEGER_EXT: 175 case GL_GREEN: 176 case GL_GREEN_INTEGER_EXT: 177 case GL_BLUE: 178 case GL_BLUE_INTEGER_EXT: 179 case GL_ALPHA: 180 case GL_ALPHA_INTEGER_EXT: 181 case GL_LUMINANCE: 182 case GL_LUMINANCE_INTEGER_EXT: 183 case GL_INTENSITY: 184 return 1; 185 186 case GL_LUMINANCE_ALPHA: 187 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 188 case GL_RG: 189 case GL_YCBCR_MESA: 190 case GL_DEPTH_STENCIL_EXT: 191 case GL_DUDV_ATI: 192 case GL_DU8DV8_ATI: 193 case GL_RG_INTEGER: 194 return 2; 195 196 case GL_RGB: 197 case GL_BGR: 198 case GL_RGB_INTEGER_EXT: 199 case GL_BGR_INTEGER_EXT: 200 return 3; 201 202 case GL_RGBA: 203 case GL_BGRA: 204 case GL_ABGR_EXT: 205 case GL_RGBA_INTEGER_EXT: 206 case GL_BGRA_INTEGER_EXT: 207 return 4; 208 209 default: 210 return -1; 211 } 212 } 213 214 215 /** 216 * Get the bytes per pixel of pixel format type pair. 217 * 218 * \param format pixel format. 219 * \param type pixel type. 220 * 221 * \return bytes per pixel, or -1 if a bad format or type was given. 222 */ 223 GLint 224 _mesa_bytes_per_pixel(GLenum format, GLenum type) 225 { 226 GLint comps = _mesa_components_in_format(format); 227 if (comps < 0) 228 return -1; 229 230 switch (type) { 231 case GL_BITMAP: 232 return 0; /* special case */ 233 case GL_BYTE: 234 case GL_UNSIGNED_BYTE: 235 return comps * sizeof(GLubyte); 236 case GL_SHORT: 237 case GL_UNSIGNED_SHORT: 238 return comps * sizeof(GLshort); 239 case GL_INT: 240 case GL_UNSIGNED_INT: 241 return comps * sizeof(GLint); 242 case GL_FLOAT: 243 return comps * sizeof(GLfloat); 244 case GL_HALF_FLOAT_ARB: 245 return comps * sizeof(GLhalfARB); 246 case GL_UNSIGNED_BYTE_3_3_2: 247 case GL_UNSIGNED_BYTE_2_3_3_REV: 248 if (format == GL_RGB || format == GL_BGR || 249 format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT) 250 return sizeof(GLubyte); 251 else 252 return -1; /* error */ 253 case GL_UNSIGNED_SHORT_5_6_5: 254 case GL_UNSIGNED_SHORT_5_6_5_REV: 255 if (format == GL_RGB || format == GL_BGR || 256 format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT) 257 return sizeof(GLushort); 258 else 259 return -1; /* error */ 260 case GL_UNSIGNED_SHORT_4_4_4_4: 261 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 262 case GL_UNSIGNED_SHORT_5_5_5_1: 263 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 264 if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT || 265 format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) 266 return sizeof(GLushort); 267 else 268 return -1; 269 case GL_UNSIGNED_INT_8_8_8_8: 270 case GL_UNSIGNED_INT_8_8_8_8_REV: 271 case GL_UNSIGNED_INT_10_10_10_2: 272 case GL_UNSIGNED_INT_2_10_10_10_REV: 273 if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT || 274 format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) 275 return sizeof(GLuint); 276 else 277 return -1; 278 case GL_UNSIGNED_SHORT_8_8_MESA: 279 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 280 if (format == GL_YCBCR_MESA) 281 return sizeof(GLushort); 282 else 283 return -1; 284 case GL_UNSIGNED_INT_24_8_EXT: 285 if (format == GL_DEPTH_STENCIL_EXT) 286 return sizeof(GLuint); 287 else 288 return -1; 289 case GL_UNSIGNED_INT_5_9_9_9_REV: 290 if (format == GL_RGB) 291 return sizeof(GLuint); 292 else 293 return -1; 294 case GL_UNSIGNED_INT_10F_11F_11F_REV: 295 if (format == GL_RGB) 296 return sizeof(GLuint); 297 else 298 return -1; 299 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 300 if (format == GL_DEPTH_STENCIL) 301 return 8; 302 else 303 return -1; 304 default: 305 return -1; 306 } 307 } 308 309 310 /** 311 * Test if the given format is an integer (non-normalized) format. 312 */ 313 GLboolean 314 _mesa_is_enum_format_integer(GLenum format) 315 { 316 switch (format) { 317 /* generic integer formats */ 318 case GL_RED_INTEGER_EXT: 319 case GL_GREEN_INTEGER_EXT: 320 case GL_BLUE_INTEGER_EXT: 321 case GL_ALPHA_INTEGER_EXT: 322 case GL_RGB_INTEGER_EXT: 323 case GL_RGBA_INTEGER_EXT: 324 case GL_BGR_INTEGER_EXT: 325 case GL_BGRA_INTEGER_EXT: 326 case GL_LUMINANCE_INTEGER_EXT: 327 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 328 case GL_RG_INTEGER: 329 /* specific integer formats */ 330 case GL_RGBA32UI_EXT: 331 case GL_RGB32UI_EXT: 332 case GL_RG32UI: 333 case GL_R32UI: 334 case GL_ALPHA32UI_EXT: 335 case GL_INTENSITY32UI_EXT: 336 case GL_LUMINANCE32UI_EXT: 337 case GL_LUMINANCE_ALPHA32UI_EXT: 338 case GL_RGBA16UI_EXT: 339 case GL_RGB16UI_EXT: 340 case GL_RG16UI: 341 case GL_R16UI: 342 case GL_ALPHA16UI_EXT: 343 case GL_INTENSITY16UI_EXT: 344 case GL_LUMINANCE16UI_EXT: 345 case GL_LUMINANCE_ALPHA16UI_EXT: 346 case GL_RGBA8UI_EXT: 347 case GL_RGB8UI_EXT: 348 case GL_RG8UI: 349 case GL_R8UI: 350 case GL_ALPHA8UI_EXT: 351 case GL_INTENSITY8UI_EXT: 352 case GL_LUMINANCE8UI_EXT: 353 case GL_LUMINANCE_ALPHA8UI_EXT: 354 case GL_RGBA32I_EXT: 355 case GL_RGB32I_EXT: 356 case GL_RG32I: 357 case GL_R32I: 358 case GL_ALPHA32I_EXT: 359 case GL_INTENSITY32I_EXT: 360 case GL_LUMINANCE32I_EXT: 361 case GL_LUMINANCE_ALPHA32I_EXT: 362 case GL_RGBA16I_EXT: 363 case GL_RGB16I_EXT: 364 case GL_RG16I: 365 case GL_R16I: 366 case GL_ALPHA16I_EXT: 367 case GL_INTENSITY16I_EXT: 368 case GL_LUMINANCE16I_EXT: 369 case GL_LUMINANCE_ALPHA16I_EXT: 370 case GL_RGBA8I_EXT: 371 case GL_RGB8I_EXT: 372 case GL_RG8I: 373 case GL_R8I: 374 case GL_ALPHA8I_EXT: 375 case GL_INTENSITY8I_EXT: 376 case GL_LUMINANCE8I_EXT: 377 case GL_LUMINANCE_ALPHA8I_EXT: 378 case GL_RGB10_A2UI: 379 return GL_TRUE; 380 default: 381 return GL_FALSE; 382 } 383 } 384 385 386 /** 387 * Test if the given type is an integer (non-normalized) format. 388 */ 389 GLboolean 390 _mesa_is_type_integer(GLenum type) 391 { 392 switch (type) { 393 case GL_INT: 394 case GL_UNSIGNED_INT: 395 case GL_SHORT: 396 case GL_UNSIGNED_SHORT: 397 case GL_BYTE: 398 case GL_UNSIGNED_BYTE: 399 return GL_TRUE; 400 default: 401 return GL_FALSE; 402 } 403 } 404 405 406 /** 407 * Test if the given format or type is an integer (non-normalized) format. 408 */ 409 extern GLboolean 410 _mesa_is_enum_format_or_type_integer(GLenum format, GLenum type) 411 { 412 return _mesa_is_enum_format_integer(format) || _mesa_is_type_integer(type); 413 } 414 415 416 GLboolean 417 _mesa_is_type_unsigned(GLenum type) 418 { 419 switch (type) { 420 case GL_UNSIGNED_INT: 421 case GL_UNSIGNED_INT_8_8_8_8: 422 case GL_UNSIGNED_INT_8_8_8_8_REV: 423 case GL_UNSIGNED_INT_10_10_10_2: 424 case GL_UNSIGNED_INT_2_10_10_10_REV: 425 426 case GL_UNSIGNED_SHORT: 427 case GL_UNSIGNED_SHORT_4_4_4_4: 428 case GL_UNSIGNED_SHORT_5_5_5_1: 429 case GL_UNSIGNED_SHORT_5_6_5: 430 case GL_UNSIGNED_SHORT_5_6_5_REV: 431 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 432 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 433 case GL_UNSIGNED_SHORT_8_8_MESA: 434 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 435 436 case GL_UNSIGNED_BYTE: 437 case GL_UNSIGNED_BYTE_3_3_2: 438 case GL_UNSIGNED_BYTE_2_3_3_REV: 439 return GL_TRUE; 440 441 default: 442 return GL_FALSE; 443 } 444 } 445 446 447 /** 448 * Test if the given image format is a color/RGBA format (i.e., not color 449 * index, depth, stencil, etc). 450 * \param format the image format value (may by an internal texture format) 451 * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise. 452 */ 453 GLboolean 454 _mesa_is_color_format(GLenum format) 455 { 456 switch (format) { 457 case GL_RED: 458 case GL_GREEN: 459 case GL_BLUE: 460 case GL_ALPHA: 461 case GL_ALPHA4: 462 case GL_ALPHA8: 463 case GL_ALPHA12: 464 case GL_ALPHA16: 465 case 1: 466 case GL_LUMINANCE: 467 case GL_LUMINANCE4: 468 case GL_LUMINANCE8: 469 case GL_LUMINANCE12: 470 case GL_LUMINANCE16: 471 case 2: 472 case GL_LUMINANCE_ALPHA: 473 case GL_LUMINANCE4_ALPHA4: 474 case GL_LUMINANCE6_ALPHA2: 475 case GL_LUMINANCE8_ALPHA8: 476 case GL_LUMINANCE12_ALPHA4: 477 case GL_LUMINANCE12_ALPHA12: 478 case GL_LUMINANCE16_ALPHA16: 479 case GL_INTENSITY: 480 case GL_INTENSITY4: 481 case GL_INTENSITY8: 482 case GL_INTENSITY12: 483 case GL_INTENSITY16: 484 case GL_R8: 485 case GL_R16: 486 case GL_RG: 487 case GL_RG8: 488 case GL_RG16: 489 case 3: 490 case GL_RGB: 491 case GL_BGR: 492 case GL_R3_G3_B2: 493 case GL_RGB4: 494 case GL_RGB5: 495 case GL_RGB565: 496 case GL_RGB8: 497 case GL_RGB10: 498 case GL_RGB12: 499 case GL_RGB16: 500 case 4: 501 case GL_ABGR_EXT: 502 case GL_RGBA: 503 case GL_BGRA: 504 case GL_RGBA2: 505 case GL_RGBA4: 506 case GL_RGB5_A1: 507 case GL_RGBA8: 508 case GL_RGB10_A2: 509 case GL_RGBA12: 510 case GL_RGBA16: 511 /* float texture formats */ 512 case GL_ALPHA16F_ARB: 513 case GL_ALPHA32F_ARB: 514 case GL_LUMINANCE16F_ARB: 515 case GL_LUMINANCE32F_ARB: 516 case GL_LUMINANCE_ALPHA16F_ARB: 517 case GL_LUMINANCE_ALPHA32F_ARB: 518 case GL_INTENSITY16F_ARB: 519 case GL_INTENSITY32F_ARB: 520 case GL_R16F: 521 case GL_R32F: 522 case GL_RG16F: 523 case GL_RG32F: 524 case GL_RGB16F_ARB: 525 case GL_RGB32F_ARB: 526 case GL_RGBA16F_ARB: 527 case GL_RGBA32F_ARB: 528 /* compressed formats */ 529 case GL_COMPRESSED_ALPHA: 530 case GL_COMPRESSED_LUMINANCE: 531 case GL_COMPRESSED_LUMINANCE_ALPHA: 532 case GL_COMPRESSED_INTENSITY: 533 case GL_COMPRESSED_RED: 534 case GL_COMPRESSED_RG: 535 case GL_COMPRESSED_RGB: 536 case GL_COMPRESSED_RGBA: 537 case GL_RGB_S3TC: 538 case GL_RGB4_S3TC: 539 case GL_RGBA_S3TC: 540 case GL_RGBA4_S3TC: 541 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 542 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 543 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 544 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 545 case GL_COMPRESSED_RGB_FXT1_3DFX: 546 case GL_COMPRESSED_RGBA_FXT1_3DFX: 547 #if FEATURE_EXT_texture_sRGB 548 case GL_SRGB_EXT: 549 case GL_SRGB8_EXT: 550 case GL_SRGB_ALPHA_EXT: 551 case GL_SRGB8_ALPHA8_EXT: 552 case GL_SLUMINANCE_ALPHA_EXT: 553 case GL_SLUMINANCE8_ALPHA8_EXT: 554 case GL_SLUMINANCE_EXT: 555 case GL_SLUMINANCE8_EXT: 556 case GL_COMPRESSED_SRGB_EXT: 557 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 558 case GL_COMPRESSED_SRGB_ALPHA_EXT: 559 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 560 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 561 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 562 case GL_COMPRESSED_SLUMINANCE_EXT: 563 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 564 #endif /* FEATURE_EXT_texture_sRGB */ 565 case GL_COMPRESSED_RED_RGTC1: 566 case GL_COMPRESSED_SIGNED_RED_RGTC1: 567 case GL_COMPRESSED_RG_RGTC2: 568 case GL_COMPRESSED_SIGNED_RG_RGTC2: 569 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 570 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 571 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 572 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 573 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 574 case GL_ETC1_RGB8_OES: 575 /* generic integer formats */ 576 case GL_RED_INTEGER_EXT: 577 case GL_GREEN_INTEGER_EXT: 578 case GL_BLUE_INTEGER_EXT: 579 case GL_ALPHA_INTEGER_EXT: 580 case GL_RGB_INTEGER_EXT: 581 case GL_RGBA_INTEGER_EXT: 582 case GL_BGR_INTEGER_EXT: 583 case GL_BGRA_INTEGER_EXT: 584 case GL_RG_INTEGER: 585 case GL_LUMINANCE_INTEGER_EXT: 586 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 587 /* sized integer formats */ 588 case GL_RGBA32UI_EXT: 589 case GL_RGB32UI_EXT: 590 case GL_RG32UI: 591 case GL_R32UI: 592 case GL_ALPHA32UI_EXT: 593 case GL_INTENSITY32UI_EXT: 594 case GL_LUMINANCE32UI_EXT: 595 case GL_LUMINANCE_ALPHA32UI_EXT: 596 case GL_RGBA16UI_EXT: 597 case GL_RGB16UI_EXT: 598 case GL_RG16UI: 599 case GL_R16UI: 600 case GL_ALPHA16UI_EXT: 601 case GL_INTENSITY16UI_EXT: 602 case GL_LUMINANCE16UI_EXT: 603 case GL_LUMINANCE_ALPHA16UI_EXT: 604 case GL_RGBA8UI_EXT: 605 case GL_RGB8UI_EXT: 606 case GL_RG8UI: 607 case GL_R8UI: 608 case GL_ALPHA8UI_EXT: 609 case GL_INTENSITY8UI_EXT: 610 case GL_LUMINANCE8UI_EXT: 611 case GL_LUMINANCE_ALPHA8UI_EXT: 612 case GL_RGBA32I_EXT: 613 case GL_RGB32I_EXT: 614 case GL_RG32I: 615 case GL_R32I: 616 case GL_ALPHA32I_EXT: 617 case GL_INTENSITY32I_EXT: 618 case GL_LUMINANCE32I_EXT: 619 case GL_LUMINANCE_ALPHA32I_EXT: 620 case GL_RGBA16I_EXT: 621 case GL_RGB16I_EXT: 622 case GL_RG16I: 623 case GL_R16I: 624 case GL_ALPHA16I_EXT: 625 case GL_INTENSITY16I_EXT: 626 case GL_LUMINANCE16I_EXT: 627 case GL_LUMINANCE_ALPHA16I_EXT: 628 case GL_RGBA8I_EXT: 629 case GL_RGB8I_EXT: 630 case GL_RG8I: 631 case GL_R8I: 632 case GL_ALPHA8I_EXT: 633 case GL_INTENSITY8I_EXT: 634 case GL_LUMINANCE8I_EXT: 635 case GL_LUMINANCE_ALPHA8I_EXT: 636 /* signed, normalized texture formats */ 637 case GL_RED_SNORM: 638 case GL_R8_SNORM: 639 case GL_R16_SNORM: 640 case GL_RG_SNORM: 641 case GL_RG8_SNORM: 642 case GL_RG16_SNORM: 643 case GL_RGB_SNORM: 644 case GL_RGB8_SNORM: 645 case GL_RGB16_SNORM: 646 case GL_RGBA_SNORM: 647 case GL_RGBA8_SNORM: 648 case GL_RGBA16_SNORM: 649 case GL_ALPHA_SNORM: 650 case GL_ALPHA8_SNORM: 651 case GL_ALPHA16_SNORM: 652 case GL_LUMINANCE_SNORM: 653 case GL_LUMINANCE8_SNORM: 654 case GL_LUMINANCE16_SNORM: 655 case GL_LUMINANCE_ALPHA_SNORM: 656 case GL_LUMINANCE8_ALPHA8_SNORM: 657 case GL_LUMINANCE16_ALPHA16_SNORM: 658 case GL_INTENSITY_SNORM: 659 case GL_INTENSITY8_SNORM: 660 case GL_INTENSITY16_SNORM: 661 case GL_RGB9_E5: 662 case GL_R11F_G11F_B10F: 663 case GL_RGB10_A2UI: 664 return GL_TRUE; 665 case GL_YCBCR_MESA: /* not considered to be RGB */ 666 /* fall-through */ 667 default: 668 return GL_FALSE; 669 } 670 } 671 672 673 /** 674 * Test if the given image format is a depth component format. 675 */ 676 GLboolean 677 _mesa_is_depth_format(GLenum format) 678 { 679 switch (format) { 680 case GL_DEPTH_COMPONENT: 681 case GL_DEPTH_COMPONENT16: 682 case GL_DEPTH_COMPONENT24: 683 case GL_DEPTH_COMPONENT32: 684 case GL_DEPTH_COMPONENT32F: 685 return GL_TRUE; 686 default: 687 return GL_FALSE; 688 } 689 } 690 691 692 /** 693 * Test if the given image format is a stencil format. 694 */ 695 GLboolean 696 _mesa_is_stencil_format(GLenum format) 697 { 698 switch (format) { 699 case GL_STENCIL_INDEX: 700 return GL_TRUE; 701 default: 702 return GL_FALSE; 703 } 704 } 705 706 707 /** 708 * Test if the given image format is a YCbCr format. 709 */ 710 GLboolean 711 _mesa_is_ycbcr_format(GLenum format) 712 { 713 switch (format) { 714 case GL_YCBCR_MESA: 715 return GL_TRUE; 716 default: 717 return GL_FALSE; 718 } 719 } 720 721 722 /** 723 * Test if the given image format is a depth+stencil format. 724 */ 725 GLboolean 726 _mesa_is_depthstencil_format(GLenum format) 727 { 728 switch (format) { 729 case GL_DEPTH24_STENCIL8_EXT: 730 case GL_DEPTH_STENCIL_EXT: 731 case GL_DEPTH32F_STENCIL8: 732 return GL_TRUE; 733 default: 734 return GL_FALSE; 735 } 736 } 737 738 739 /** 740 * Test if the given image format is a depth or stencil format. 741 */ 742 GLboolean 743 _mesa_is_depth_or_stencil_format(GLenum format) 744 { 745 switch (format) { 746 case GL_DEPTH_COMPONENT: 747 case GL_DEPTH_COMPONENT16: 748 case GL_DEPTH_COMPONENT24: 749 case GL_DEPTH_COMPONENT32: 750 case GL_STENCIL_INDEX: 751 case GL_STENCIL_INDEX1_EXT: 752 case GL_STENCIL_INDEX4_EXT: 753 case GL_STENCIL_INDEX8_EXT: 754 case GL_STENCIL_INDEX16_EXT: 755 case GL_DEPTH_STENCIL_EXT: 756 case GL_DEPTH24_STENCIL8_EXT: 757 case GL_DEPTH_COMPONENT32F: 758 case GL_DEPTH32F_STENCIL8: 759 return GL_TRUE; 760 default: 761 return GL_FALSE; 762 } 763 } 764 765 766 /** 767 * Test if the given image format is a dudv format. 768 */ 769 GLboolean 770 _mesa_is_dudv_format(GLenum format) 771 { 772 switch (format) { 773 case GL_DUDV_ATI: 774 case GL_DU8DV8_ATI: 775 return GL_TRUE; 776 default: 777 return GL_FALSE; 778 } 779 } 780 781 782 /** 783 * Test if an image format is a supported compressed format. 784 * \param format the internal format token provided by the user. 785 * \return GL_TRUE if compressed, GL_FALSE if uncompressed 786 */ 787 GLboolean 788 _mesa_is_compressed_format(struct gl_context *ctx, GLenum format) 789 { 790 switch (format) { 791 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 792 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 793 return ctx->Extensions.EXT_texture_compression_s3tc; 794 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 795 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 796 return _mesa_is_desktop_gl(ctx) 797 && ctx->Extensions.EXT_texture_compression_s3tc; 798 case GL_RGB_S3TC: 799 case GL_RGB4_S3TC: 800 case GL_RGBA_S3TC: 801 case GL_RGBA4_S3TC: 802 return _mesa_is_desktop_gl(ctx) && ctx->Extensions.S3_s3tc; 803 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 804 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 805 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 806 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 807 return _mesa_is_desktop_gl(ctx) 808 && ctx->Extensions.EXT_texture_sRGB 809 && ctx->Extensions.EXT_texture_compression_s3tc; 810 case GL_COMPRESSED_RGB_FXT1_3DFX: 811 case GL_COMPRESSED_RGBA_FXT1_3DFX: 812 return _mesa_is_desktop_gl(ctx) 813 && ctx->Extensions.TDFX_texture_compression_FXT1; 814 case GL_COMPRESSED_RED_RGTC1: 815 case GL_COMPRESSED_SIGNED_RED_RGTC1: 816 case GL_COMPRESSED_RG_RGTC2: 817 case GL_COMPRESSED_SIGNED_RG_RGTC2: 818 return _mesa_is_desktop_gl(ctx) 819 && ctx->Extensions.ARB_texture_compression_rgtc; 820 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 821 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 822 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 823 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 824 return ctx->API == API_OPENGL 825 && ctx->Extensions.EXT_texture_compression_latc; 826 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 827 return ctx->API == API_OPENGL 828 && ctx->Extensions.ATI_texture_compression_3dc; 829 case GL_ETC1_RGB8_OES: 830 return _mesa_is_gles(ctx) 831 && ctx->Extensions.OES_compressed_ETC1_RGB8_texture; 832 #if FEATURE_ES 833 case GL_PALETTE4_RGB8_OES: 834 case GL_PALETTE4_RGBA8_OES: 835 case GL_PALETTE4_R5_G6_B5_OES: 836 case GL_PALETTE4_RGBA4_OES: 837 case GL_PALETTE4_RGB5_A1_OES: 838 case GL_PALETTE8_RGB8_OES: 839 case GL_PALETTE8_RGBA8_OES: 840 case GL_PALETTE8_R5_G6_B5_OES: 841 case GL_PALETTE8_RGBA4_OES: 842 case GL_PALETTE8_RGB5_A1_OES: 843 return ctx->API == API_OPENGLES; 844 #endif 845 default: 846 return GL_FALSE; 847 } 848 } 849 850 851 /** 852 * Convert various base formats to the cooresponding integer format. 853 */ 854 GLenum 855 _mesa_base_format_to_integer_format(GLenum format) 856 { 857 switch(format) { 858 case GL_RED: 859 return GL_RED_INTEGER; 860 case GL_GREEN: 861 return GL_GREEN_INTEGER; 862 case GL_BLUE: 863 return GL_BLUE_INTEGER; 864 case GL_RG: 865 return GL_RG_INTEGER; 866 case GL_RGB: 867 return GL_RGB_INTEGER; 868 case GL_RGBA: 869 return GL_RGBA_INTEGER; 870 case GL_BGR: 871 return GL_BGR_INTEGER; 872 case GL_BGRA: 873 return GL_BGRA_INTEGER; 874 case GL_ALPHA: 875 return GL_ALPHA_INTEGER; 876 case GL_LUMINANCE: 877 return GL_LUMINANCE_INTEGER_EXT; 878 case GL_LUMINANCE_ALPHA: 879 return GL_LUMINANCE_ALPHA_INTEGER_EXT; 880 } 881 882 return format; 883 } 884 885 886 /** 887 * Does the given base texture/renderbuffer format have the channel 888 * named by 'pname'? 889 */ 890 GLboolean 891 _mesa_base_format_has_channel(GLenum base_format, GLenum pname) 892 { 893 switch (pname) { 894 case GL_TEXTURE_RED_SIZE: 895 case GL_TEXTURE_RED_TYPE: 896 case GL_RENDERBUFFER_RED_SIZE_EXT: 897 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: 898 if (base_format == GL_RED || 899 base_format == GL_RG || 900 base_format == GL_RGB || 901 base_format == GL_RGBA) { 902 return GL_TRUE; 903 } 904 return GL_FALSE; 905 case GL_TEXTURE_GREEN_SIZE: 906 case GL_TEXTURE_GREEN_TYPE: 907 case GL_RENDERBUFFER_GREEN_SIZE_EXT: 908 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 909 if (base_format == GL_RG || 910 base_format == GL_RGB || 911 base_format == GL_RGBA) { 912 return GL_TRUE; 913 } 914 return GL_FALSE; 915 case GL_TEXTURE_BLUE_SIZE: 916 case GL_TEXTURE_BLUE_TYPE: 917 case GL_RENDERBUFFER_BLUE_SIZE_EXT: 918 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 919 if (base_format == GL_RGB || 920 base_format == GL_RGBA) { 921 return GL_TRUE; 922 } 923 return GL_FALSE; 924 case GL_TEXTURE_ALPHA_SIZE: 925 case GL_TEXTURE_ALPHA_TYPE: 926 case GL_RENDERBUFFER_ALPHA_SIZE_EXT: 927 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 928 if (base_format == GL_RGBA || 929 base_format == GL_ALPHA || 930 base_format == GL_LUMINANCE_ALPHA) { 931 return GL_TRUE; 932 } 933 return GL_FALSE; 934 case GL_TEXTURE_LUMINANCE_SIZE: 935 case GL_TEXTURE_LUMINANCE_TYPE: 936 if (base_format == GL_LUMINANCE || 937 base_format == GL_LUMINANCE_ALPHA) { 938 return GL_TRUE; 939 } 940 return GL_FALSE; 941 case GL_TEXTURE_INTENSITY_SIZE: 942 case GL_TEXTURE_INTENSITY_TYPE: 943 if (base_format == GL_INTENSITY) { 944 return GL_TRUE; 945 } 946 return GL_FALSE; 947 case GL_TEXTURE_DEPTH_SIZE: 948 case GL_TEXTURE_DEPTH_TYPE: 949 case GL_RENDERBUFFER_DEPTH_SIZE_EXT: 950 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 951 if (base_format == GL_DEPTH_STENCIL || 952 base_format == GL_DEPTH_COMPONENT) { 953 return GL_TRUE; 954 } 955 return GL_FALSE; 956 case GL_RENDERBUFFER_STENCIL_SIZE_EXT: 957 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 958 if (base_format == GL_DEPTH_STENCIL || 959 base_format == GL_STENCIL_INDEX) { 960 return GL_TRUE; 961 } 962 return GL_FALSE; 963 default: 964 _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n", 965 __FUNCTION__, pname); 966 return GL_FALSE; 967 } 968 969 return GL_FALSE; 970 } 971 972 973 /** 974 * If format is a generic compressed format, return the corresponding 975 * non-compressed format. For other formats, return the format as-is. 976 */ 977 GLenum 978 _mesa_generic_compressed_format_to_uncompressed_format(GLenum format) 979 { 980 switch (format) { 981 case GL_COMPRESSED_RED: 982 return GL_RED; 983 case GL_COMPRESSED_RG: 984 return GL_RG; 985 case GL_COMPRESSED_RGB: 986 return GL_RGB; 987 case GL_COMPRESSED_RGBA: 988 return GL_RGBA; 989 case GL_COMPRESSED_ALPHA: 990 return GL_ALPHA; 991 case GL_COMPRESSED_LUMINANCE: 992 return GL_LUMINANCE; 993 case GL_COMPRESSED_LUMINANCE_ALPHA: 994 return GL_LUMINANCE_ALPHA; 995 case GL_COMPRESSED_INTENSITY: 996 return GL_INTENSITY; 997 /* sRGB formats */ 998 case GL_COMPRESSED_SRGB: 999 return GL_SRGB; 1000 case GL_COMPRESSED_SRGB_ALPHA: 1001 return GL_SRGB_ALPHA; 1002 case GL_COMPRESSED_SLUMINANCE: 1003 return GL_SLUMINANCE; 1004 case GL_COMPRESSED_SLUMINANCE_ALPHA: 1005 return GL_SLUMINANCE_ALPHA; 1006 default: 1007 return format; 1008 } 1009 } 1010 1011 1012 /** 1013 * Do error checking of format/type combinations for glReadPixels, 1014 * glDrawPixels and glTex[Sub]Image. Note that depending on the format 1015 * and type values, we may either generate GL_INVALID_OPERATION or 1016 * GL_INVALID_ENUM. 1017 * 1018 * \param format pixel format. 1019 * \param type pixel type. 1020 * 1021 * \return GL_INVALID_ENUM, GL_INVALID_OPERATION or GL_NO_ERROR 1022 */ 1023 GLenum 1024 _mesa_error_check_format_and_type(const struct gl_context *ctx, 1025 GLenum format, GLenum type) 1026 { 1027 /* special type-based checks (see glReadPixels, glDrawPixels error lists) */ 1028 switch (type) { 1029 case GL_BITMAP: 1030 if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) { 1031 return GL_INVALID_ENUM; 1032 } 1033 break; 1034 1035 case GL_UNSIGNED_BYTE_3_3_2: 1036 case GL_UNSIGNED_BYTE_2_3_3_REV: 1037 case GL_UNSIGNED_SHORT_5_6_5: 1038 case GL_UNSIGNED_SHORT_5_6_5_REV: 1039 if (format == GL_RGB) { 1040 break; /* OK */ 1041 } 1042 if (format == GL_RGB_INTEGER_EXT && 1043 ctx->Extensions.ARB_texture_rgb10_a2ui) { 1044 break; /* OK */ 1045 } 1046 return GL_INVALID_OPERATION; 1047 1048 case GL_UNSIGNED_SHORT_4_4_4_4: 1049 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1050 case GL_UNSIGNED_SHORT_5_5_5_1: 1051 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1052 case GL_UNSIGNED_INT_8_8_8_8: 1053 case GL_UNSIGNED_INT_8_8_8_8_REV: 1054 case GL_UNSIGNED_INT_10_10_10_2: 1055 case GL_UNSIGNED_INT_2_10_10_10_REV: 1056 if (format == GL_RGBA || 1057 format == GL_BGRA || 1058 format == GL_ABGR_EXT) { 1059 break; /* OK */ 1060 } 1061 if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) && 1062 ctx->Extensions.ARB_texture_rgb10_a2ui) { 1063 break; /* OK */ 1064 } 1065 return GL_INVALID_OPERATION; 1066 1067 case GL_UNSIGNED_INT_24_8: 1068 if (!ctx->Extensions.EXT_packed_depth_stencil) { 1069 return GL_INVALID_ENUM; 1070 } 1071 if (format != GL_DEPTH_STENCIL) { 1072 return GL_INVALID_OPERATION; 1073 } 1074 return GL_NO_ERROR; 1075 1076 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 1077 if (!ctx->Extensions.ARB_depth_buffer_float) { 1078 return GL_INVALID_ENUM; 1079 } 1080 if (format != GL_DEPTH_STENCIL) { 1081 return GL_INVALID_OPERATION; 1082 } 1083 return GL_NO_ERROR; 1084 1085 case GL_UNSIGNED_INT_10F_11F_11F_REV: 1086 if (!ctx->Extensions.EXT_packed_float) { 1087 return GL_INVALID_ENUM; 1088 } 1089 if (format != GL_RGB) { 1090 return GL_INVALID_OPERATION; 1091 } 1092 return GL_NO_ERROR; 1093 1094 default: 1095 ; /* fall-through */ 1096 } 1097 1098 /* now, for each format, check the type for compatibility */ 1099 switch (format) { 1100 case GL_COLOR_INDEX: 1101 case GL_STENCIL_INDEX: 1102 switch (type) { 1103 case GL_BITMAP: 1104 case GL_BYTE: 1105 case GL_UNSIGNED_BYTE: 1106 case GL_SHORT: 1107 case GL_UNSIGNED_SHORT: 1108 case GL_INT: 1109 case GL_UNSIGNED_INT: 1110 case GL_FLOAT: 1111 return GL_NO_ERROR; 1112 case GL_HALF_FLOAT: 1113 return ctx->Extensions.ARB_half_float_pixel 1114 ? GL_NO_ERROR : GL_INVALID_ENUM; 1115 default: 1116 return GL_INVALID_ENUM; 1117 } 1118 1119 case GL_RED: 1120 case GL_GREEN: 1121 case GL_BLUE: 1122 case GL_ALPHA: 1123 #if 0 /* not legal! see table 3.6 of the 1.5 spec */ 1124 case GL_INTENSITY: 1125 #endif 1126 case GL_LUMINANCE: 1127 case GL_LUMINANCE_ALPHA: 1128 case GL_DEPTH_COMPONENT: 1129 switch (type) { 1130 case GL_BYTE: 1131 case GL_UNSIGNED_BYTE: 1132 case GL_SHORT: 1133 case GL_UNSIGNED_SHORT: 1134 case GL_INT: 1135 case GL_UNSIGNED_INT: 1136 case GL_FLOAT: 1137 return GL_NO_ERROR; 1138 case GL_HALF_FLOAT: 1139 return ctx->Extensions.ARB_half_float_pixel 1140 ? GL_NO_ERROR : GL_INVALID_ENUM; 1141 default: 1142 return GL_INVALID_ENUM; 1143 } 1144 1145 case GL_RG: 1146 if (!ctx->Extensions.ARB_texture_rg) 1147 return GL_INVALID_ENUM; 1148 switch (type) { 1149 case GL_BYTE: 1150 case GL_UNSIGNED_BYTE: 1151 case GL_SHORT: 1152 case GL_UNSIGNED_SHORT: 1153 case GL_INT: 1154 case GL_UNSIGNED_INT: 1155 case GL_FLOAT: 1156 return GL_NO_ERROR; 1157 case GL_HALF_FLOAT: 1158 return ctx->Extensions.ARB_half_float_pixel 1159 ? GL_NO_ERROR : GL_INVALID_ENUM; 1160 default: 1161 return GL_INVALID_ENUM; 1162 } 1163 1164 case GL_RGB: 1165 switch (type) { 1166 case GL_BYTE: 1167 case GL_UNSIGNED_BYTE: 1168 case GL_SHORT: 1169 case GL_UNSIGNED_SHORT: 1170 case GL_INT: 1171 case GL_UNSIGNED_INT: 1172 case GL_FLOAT: 1173 case GL_UNSIGNED_BYTE_3_3_2: 1174 case GL_UNSIGNED_BYTE_2_3_3_REV: 1175 case GL_UNSIGNED_SHORT_5_6_5: 1176 case GL_UNSIGNED_SHORT_5_6_5_REV: 1177 return GL_NO_ERROR; 1178 case GL_HALF_FLOAT: 1179 return ctx->Extensions.ARB_half_float_pixel 1180 ? GL_NO_ERROR : GL_INVALID_ENUM; 1181 case GL_UNSIGNED_INT_5_9_9_9_REV: 1182 return ctx->Extensions.EXT_texture_shared_exponent 1183 ? GL_NO_ERROR : GL_INVALID_ENUM; 1184 case GL_UNSIGNED_INT_10F_11F_11F_REV: 1185 return ctx->Extensions.EXT_packed_float 1186 ? GL_NO_ERROR : GL_INVALID_ENUM; 1187 default: 1188 return GL_INVALID_ENUM; 1189 } 1190 1191 case GL_BGR: 1192 switch (type) { 1193 /* NOTE: no packed types are supported with BGR. That's 1194 * intentional, according to the GL spec. 1195 */ 1196 case GL_BYTE: 1197 case GL_UNSIGNED_BYTE: 1198 case GL_SHORT: 1199 case GL_UNSIGNED_SHORT: 1200 case GL_INT: 1201 case GL_UNSIGNED_INT: 1202 case GL_FLOAT: 1203 return GL_NO_ERROR; 1204 case GL_HALF_FLOAT: 1205 return ctx->Extensions.ARB_half_float_pixel 1206 ? GL_NO_ERROR : GL_INVALID_ENUM; 1207 default: 1208 return GL_INVALID_ENUM; 1209 } 1210 1211 case GL_RGBA: 1212 case GL_BGRA: 1213 case GL_ABGR_EXT: 1214 switch (type) { 1215 case GL_BYTE: 1216 case GL_UNSIGNED_BYTE: 1217 case GL_SHORT: 1218 case GL_UNSIGNED_SHORT: 1219 case GL_INT: 1220 case GL_UNSIGNED_INT: 1221 case GL_FLOAT: 1222 case GL_UNSIGNED_SHORT_4_4_4_4: 1223 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1224 case GL_UNSIGNED_SHORT_5_5_5_1: 1225 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1226 case GL_UNSIGNED_INT_8_8_8_8: 1227 case GL_UNSIGNED_INT_8_8_8_8_REV: 1228 case GL_UNSIGNED_INT_10_10_10_2: 1229 case GL_UNSIGNED_INT_2_10_10_10_REV: 1230 return GL_NO_ERROR; 1231 case GL_HALF_FLOAT: 1232 return ctx->Extensions.ARB_half_float_pixel 1233 ? GL_NO_ERROR : GL_INVALID_ENUM; 1234 default: 1235 return GL_INVALID_ENUM; 1236 } 1237 1238 case GL_YCBCR_MESA: 1239 if (!ctx->Extensions.MESA_ycbcr_texture) 1240 return GL_INVALID_ENUM; 1241 if (type == GL_UNSIGNED_SHORT_8_8_MESA || 1242 type == GL_UNSIGNED_SHORT_8_8_REV_MESA) 1243 return GL_NO_ERROR; 1244 else 1245 return GL_INVALID_OPERATION; 1246 1247 case GL_DEPTH_STENCIL_EXT: 1248 if (ctx->Extensions.EXT_packed_depth_stencil && 1249 type == GL_UNSIGNED_INT_24_8) 1250 return GL_NO_ERROR; 1251 else if (ctx->Extensions.ARB_depth_buffer_float && 1252 type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) 1253 return GL_NO_ERROR; 1254 else 1255 return GL_INVALID_ENUM; 1256 1257 case GL_DUDV_ATI: 1258 case GL_DU8DV8_ATI: 1259 if (!ctx->Extensions.ATI_envmap_bumpmap) 1260 return GL_INVALID_ENUM; 1261 switch (type) { 1262 case GL_BYTE: 1263 case GL_UNSIGNED_BYTE: 1264 case GL_SHORT: 1265 case GL_UNSIGNED_SHORT: 1266 case GL_INT: 1267 case GL_UNSIGNED_INT: 1268 case GL_FLOAT: 1269 return GL_NO_ERROR; 1270 default: 1271 return GL_INVALID_ENUM; 1272 } 1273 1274 /* integer-valued formats */ 1275 case GL_RED_INTEGER_EXT: 1276 case GL_GREEN_INTEGER_EXT: 1277 case GL_BLUE_INTEGER_EXT: 1278 case GL_ALPHA_INTEGER_EXT: 1279 case GL_RG_INTEGER: 1280 switch (type) { 1281 case GL_BYTE: 1282 case GL_UNSIGNED_BYTE: 1283 case GL_SHORT: 1284 case GL_UNSIGNED_SHORT: 1285 case GL_INT: 1286 case GL_UNSIGNED_INT: 1287 return (ctx->Version >= 30 || 1288 ctx->Extensions.EXT_texture_integer) 1289 ? GL_NO_ERROR : GL_INVALID_ENUM; 1290 default: 1291 return GL_INVALID_ENUM; 1292 } 1293 1294 case GL_RGB_INTEGER_EXT: 1295 switch (type) { 1296 case GL_BYTE: 1297 case GL_UNSIGNED_BYTE: 1298 case GL_SHORT: 1299 case GL_UNSIGNED_SHORT: 1300 case GL_INT: 1301 case GL_UNSIGNED_INT: 1302 return (ctx->Version >= 30 || 1303 ctx->Extensions.EXT_texture_integer) 1304 ? GL_NO_ERROR : GL_INVALID_ENUM; 1305 case GL_UNSIGNED_BYTE_3_3_2: 1306 case GL_UNSIGNED_BYTE_2_3_3_REV: 1307 case GL_UNSIGNED_SHORT_5_6_5: 1308 case GL_UNSIGNED_SHORT_5_6_5_REV: 1309 return ctx->Extensions.ARB_texture_rgb10_a2ui 1310 ? GL_NO_ERROR : GL_INVALID_ENUM; 1311 default: 1312 return GL_INVALID_ENUM; 1313 } 1314 1315 case GL_BGR_INTEGER_EXT: 1316 switch (type) { 1317 case GL_BYTE: 1318 case GL_UNSIGNED_BYTE: 1319 case GL_SHORT: 1320 case GL_UNSIGNED_SHORT: 1321 case GL_INT: 1322 case GL_UNSIGNED_INT: 1323 /* NOTE: no packed formats w/ BGR format */ 1324 return (ctx->Version >= 30 || 1325 ctx->Extensions.EXT_texture_integer) 1326 ? GL_NO_ERROR : GL_INVALID_ENUM; 1327 default: 1328 return GL_INVALID_ENUM; 1329 } 1330 1331 case GL_RGBA_INTEGER_EXT: 1332 case GL_BGRA_INTEGER_EXT: 1333 switch (type) { 1334 case GL_BYTE: 1335 case GL_UNSIGNED_BYTE: 1336 case GL_SHORT: 1337 case GL_UNSIGNED_SHORT: 1338 case GL_INT: 1339 case GL_UNSIGNED_INT: 1340 return (ctx->Version >= 30 || 1341 ctx->Extensions.EXT_texture_integer) 1342 ? GL_NO_ERROR : GL_INVALID_ENUM; 1343 case GL_UNSIGNED_SHORT_4_4_4_4: 1344 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1345 case GL_UNSIGNED_SHORT_5_5_5_1: 1346 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1347 case GL_UNSIGNED_INT_8_8_8_8: 1348 case GL_UNSIGNED_INT_8_8_8_8_REV: 1349 case GL_UNSIGNED_INT_10_10_10_2: 1350 case GL_UNSIGNED_INT_2_10_10_10_REV: 1351 return ctx->Extensions.ARB_texture_rgb10_a2ui 1352 ? GL_NO_ERROR : GL_INVALID_ENUM; 1353 default: 1354 return GL_INVALID_ENUM; 1355 } 1356 1357 case GL_LUMINANCE_INTEGER_EXT: 1358 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1359 switch (type) { 1360 case GL_BYTE: 1361 case GL_UNSIGNED_BYTE: 1362 case GL_SHORT: 1363 case GL_UNSIGNED_SHORT: 1364 case GL_INT: 1365 case GL_UNSIGNED_INT: 1366 return ctx->Extensions.EXT_texture_integer 1367 ? GL_NO_ERROR : GL_INVALID_ENUM; 1368 default: 1369 return GL_INVALID_ENUM; 1370 } 1371 1372 default: 1373 return GL_INVALID_ENUM; 1374 } 1375 return GL_NO_ERROR; 1376 } 1377