glformats.c revision fa14f8afa05eda26f45e4162878e387e4713e488
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 OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 * OTHER DEALINGS IN THE SOFTWARE. 25 */ 26 27 28#include "context.h" 29#include "glformats.h" 30 31 32/** 33 * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise. 34 */ 35GLboolean 36_mesa_type_is_packed(GLenum type) 37{ 38 switch (type) { 39 case GL_UNSIGNED_BYTE_3_3_2: 40 case GL_UNSIGNED_BYTE_2_3_3_REV: 41 case MESA_UNSIGNED_BYTE_4_4: 42 case GL_UNSIGNED_SHORT_5_6_5: 43 case GL_UNSIGNED_SHORT_5_6_5_REV: 44 case GL_UNSIGNED_SHORT_4_4_4_4: 45 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 46 case GL_UNSIGNED_SHORT_5_5_5_1: 47 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 48 case GL_UNSIGNED_INT_8_8_8_8: 49 case GL_UNSIGNED_INT_8_8_8_8_REV: 50 case GL_UNSIGNED_INT_10_10_10_2: 51 case GL_UNSIGNED_INT_2_10_10_10_REV: 52 case GL_UNSIGNED_SHORT_8_8_MESA: 53 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 54 case GL_UNSIGNED_INT_24_8_EXT: 55 case GL_UNSIGNED_INT_5_9_9_9_REV: 56 case GL_UNSIGNED_INT_10F_11F_11F_REV: 57 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 58 return GL_TRUE; 59 } 60 61 return GL_FALSE; 62} 63 64 65/** 66 * Get the size of a GL data type. 67 * 68 * \param type GL data type. 69 * 70 * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1 71 * if an invalid type enum. 72 */ 73GLint 74_mesa_sizeof_type(GLenum type) 75{ 76 switch (type) { 77 case GL_BITMAP: 78 return 0; 79 case GL_UNSIGNED_BYTE: 80 return sizeof(GLubyte); 81 case GL_BYTE: 82 return sizeof(GLbyte); 83 case GL_UNSIGNED_SHORT: 84 return sizeof(GLushort); 85 case GL_SHORT: 86 return sizeof(GLshort); 87 case GL_UNSIGNED_INT: 88 return sizeof(GLuint); 89 case GL_INT: 90 return sizeof(GLint); 91 case GL_FLOAT: 92 return sizeof(GLfloat); 93 case GL_DOUBLE: 94 return sizeof(GLdouble); 95 case GL_HALF_FLOAT_ARB: 96 return sizeof(GLhalfARB); 97 case GL_FIXED: 98 return sizeof(GLfixed); 99 default: 100 return -1; 101 } 102} 103 104 105/** 106 * Same as _mesa_sizeof_type() but also accepting the packed pixel 107 * format data types. 108 */ 109GLint 110_mesa_sizeof_packed_type(GLenum type) 111{ 112 switch (type) { 113 case GL_BITMAP: 114 return 0; 115 case GL_UNSIGNED_BYTE: 116 return sizeof(GLubyte); 117 case GL_BYTE: 118 return sizeof(GLbyte); 119 case GL_UNSIGNED_SHORT: 120 return sizeof(GLushort); 121 case GL_SHORT: 122 return sizeof(GLshort); 123 case GL_UNSIGNED_INT: 124 return sizeof(GLuint); 125 case GL_INT: 126 return sizeof(GLint); 127 case GL_HALF_FLOAT_ARB: 128 return sizeof(GLhalfARB); 129 case GL_FLOAT: 130 return sizeof(GLfloat); 131 case GL_UNSIGNED_BYTE_3_3_2: 132 case GL_UNSIGNED_BYTE_2_3_3_REV: 133 case MESA_UNSIGNED_BYTE_4_4: 134 return sizeof(GLubyte); 135 case GL_UNSIGNED_SHORT_5_6_5: 136 case GL_UNSIGNED_SHORT_5_6_5_REV: 137 case GL_UNSIGNED_SHORT_4_4_4_4: 138 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 139 case GL_UNSIGNED_SHORT_5_5_5_1: 140 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 141 case GL_UNSIGNED_SHORT_8_8_MESA: 142 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 143 return sizeof(GLushort); 144 case GL_UNSIGNED_INT_8_8_8_8: 145 case GL_UNSIGNED_INT_8_8_8_8_REV: 146 case GL_UNSIGNED_INT_10_10_10_2: 147 case GL_UNSIGNED_INT_2_10_10_10_REV: 148 case GL_UNSIGNED_INT_24_8_EXT: 149 case GL_UNSIGNED_INT_5_9_9_9_REV: 150 case GL_UNSIGNED_INT_10F_11F_11F_REV: 151 return sizeof(GLuint); 152 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 153 return 8; 154 default: 155 return -1; 156 } 157} 158 159 160/** 161 * Get the number of components in a pixel format. 162 * 163 * \param format pixel format. 164 * 165 * \return the number of components in the given format, or -1 if a bad format. 166 */ 167GLint 168_mesa_components_in_format(GLenum format) 169{ 170 switch (format) { 171 case GL_COLOR_INDEX: 172 case GL_STENCIL_INDEX: 173 case GL_DEPTH_COMPONENT: 174 case GL_RED: 175 case GL_RED_INTEGER_EXT: 176 case GL_GREEN: 177 case GL_GREEN_INTEGER_EXT: 178 case GL_BLUE: 179 case GL_BLUE_INTEGER_EXT: 180 case GL_ALPHA: 181 case GL_ALPHA_INTEGER_EXT: 182 case GL_LUMINANCE: 183 case GL_LUMINANCE_INTEGER_EXT: 184 case GL_INTENSITY: 185 return 1; 186 187 case GL_LUMINANCE_ALPHA: 188 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 189 case GL_RG: 190 case GL_YCBCR_MESA: 191 case GL_DEPTH_STENCIL_EXT: 192 case GL_DUDV_ATI: 193 case GL_DU8DV8_ATI: 194 case GL_RG_INTEGER: 195 return 2; 196 197 case GL_RGB: 198 case GL_BGR: 199 case GL_RGB_INTEGER_EXT: 200 case GL_BGR_INTEGER_EXT: 201 return 3; 202 203 case GL_RGBA: 204 case GL_BGRA: 205 case GL_ABGR_EXT: 206 case GL_RGBA_INTEGER_EXT: 207 case GL_BGRA_INTEGER_EXT: 208 return 4; 209 210 default: 211 return -1; 212 } 213} 214 215 216/** 217 * Get the bytes per pixel of pixel format type pair. 218 * 219 * \param format pixel format. 220 * \param type pixel type. 221 * 222 * \return bytes per pixel, or -1 if a bad format or type was given. 223 */ 224GLint 225_mesa_bytes_per_pixel(GLenum format, GLenum type) 226{ 227 GLint comps = _mesa_components_in_format(format); 228 if (comps < 0) 229 return -1; 230 231 switch (type) { 232 case GL_BITMAP: 233 return 0; /* special case */ 234 case GL_BYTE: 235 case GL_UNSIGNED_BYTE: 236 return comps * sizeof(GLubyte); 237 case GL_SHORT: 238 case GL_UNSIGNED_SHORT: 239 return comps * sizeof(GLshort); 240 case GL_INT: 241 case GL_UNSIGNED_INT: 242 return comps * sizeof(GLint); 243 case GL_FLOAT: 244 return comps * sizeof(GLfloat); 245 case GL_HALF_FLOAT_ARB: 246 return comps * sizeof(GLhalfARB); 247 case GL_UNSIGNED_BYTE_3_3_2: 248 case GL_UNSIGNED_BYTE_2_3_3_REV: 249 if (format == GL_RGB || format == GL_BGR || 250 format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT) 251 return sizeof(GLubyte); 252 else 253 return -1; /* error */ 254 case GL_UNSIGNED_SHORT_5_6_5: 255 case GL_UNSIGNED_SHORT_5_6_5_REV: 256 if (format == GL_RGB || format == GL_BGR || 257 format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT) 258 return sizeof(GLushort); 259 else 260 return -1; /* error */ 261 case GL_UNSIGNED_SHORT_4_4_4_4: 262 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 263 case GL_UNSIGNED_SHORT_5_5_5_1: 264 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 265 if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT || 266 format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) 267 return sizeof(GLushort); 268 else 269 return -1; 270 case GL_UNSIGNED_INT_8_8_8_8: 271 case GL_UNSIGNED_INT_8_8_8_8_REV: 272 case GL_UNSIGNED_INT_10_10_10_2: 273 case GL_UNSIGNED_INT_2_10_10_10_REV: 274 if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT || 275 format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT || 276 format == GL_RGB) 277 return sizeof(GLuint); 278 else 279 return -1; 280 case GL_UNSIGNED_SHORT_8_8_MESA: 281 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 282 if (format == GL_YCBCR_MESA) 283 return sizeof(GLushort); 284 else 285 return -1; 286 case GL_UNSIGNED_INT_24_8_EXT: 287 if (format == GL_DEPTH_STENCIL_EXT) 288 return sizeof(GLuint); 289 else 290 return -1; 291 case GL_UNSIGNED_INT_5_9_9_9_REV: 292 if (format == GL_RGB) 293 return sizeof(GLuint); 294 else 295 return -1; 296 case GL_UNSIGNED_INT_10F_11F_11F_REV: 297 if (format == GL_RGB) 298 return sizeof(GLuint); 299 else 300 return -1; 301 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 302 if (format == GL_DEPTH_STENCIL) 303 return 8; 304 else 305 return -1; 306 default: 307 return -1; 308 } 309} 310 311 312/** 313 * Get the number of bytes for a vertex attrib with the given number of 314 * components and type. 315 * 316 * \param comps number of components. 317 * \param type data type. 318 * 319 * \return bytes per attribute, or -1 if a bad comps/type combination was given. 320 */ 321GLint 322_mesa_bytes_per_vertex_attrib(GLint comps, GLenum type) 323{ 324 switch (type) { 325 case GL_BYTE: 326 case GL_UNSIGNED_BYTE: 327 return comps * sizeof(GLubyte); 328 case GL_SHORT: 329 case GL_UNSIGNED_SHORT: 330 return comps * sizeof(GLshort); 331 case GL_INT: 332 case GL_UNSIGNED_INT: 333 return comps * sizeof(GLint); 334 case GL_FLOAT: 335 return comps * sizeof(GLfloat); 336 case GL_HALF_FLOAT_ARB: 337 return comps * sizeof(GLhalfARB); 338 case GL_DOUBLE: 339 return comps * sizeof(GLdouble); 340 case GL_FIXED: 341 return comps * sizeof(GLfixed); 342 case GL_INT_2_10_10_10_REV: 343 case GL_UNSIGNED_INT_2_10_10_10_REV: 344 if (comps == 4) 345 return sizeof(GLuint); 346 else 347 return -1; 348 case GL_UNSIGNED_INT_10F_11F_11F_REV: 349 if (comps == 3) 350 return sizeof(GLuint); 351 else 352 return -1; 353 default: 354 return -1; 355 } 356} 357 358 359/** 360 * Test if the given format is an integer (non-normalized) format. 361 */ 362GLboolean 363_mesa_is_enum_format_unsigned_int(GLenum format) 364{ 365 switch (format) { 366 /* specific integer formats */ 367 case GL_RGBA32UI_EXT: 368 case GL_RGB32UI_EXT: 369 case GL_RG32UI: 370 case GL_R32UI: 371 case GL_ALPHA32UI_EXT: 372 case GL_INTENSITY32UI_EXT: 373 case GL_LUMINANCE32UI_EXT: 374 case GL_LUMINANCE_ALPHA32UI_EXT: 375 case GL_RGBA16UI_EXT: 376 case GL_RGB16UI_EXT: 377 case GL_RG16UI: 378 case GL_R16UI: 379 case GL_ALPHA16UI_EXT: 380 case GL_INTENSITY16UI_EXT: 381 case GL_LUMINANCE16UI_EXT: 382 case GL_LUMINANCE_ALPHA16UI_EXT: 383 case GL_RGBA8UI_EXT: 384 case GL_RGB8UI_EXT: 385 case GL_RG8UI: 386 case GL_R8UI: 387 case GL_ALPHA8UI_EXT: 388 case GL_INTENSITY8UI_EXT: 389 case GL_LUMINANCE8UI_EXT: 390 case GL_LUMINANCE_ALPHA8UI_EXT: 391 case GL_RGB10_A2UI: 392 return GL_TRUE; 393 default: 394 return GL_FALSE; 395 } 396} 397 398 399/** 400 * Test if the given format is an integer (non-normalized) format. 401 */ 402GLboolean 403_mesa_is_enum_format_signed_int(GLenum format) 404{ 405 switch (format) { 406 /* generic integer formats */ 407 case GL_RED_INTEGER_EXT: 408 case GL_GREEN_INTEGER_EXT: 409 case GL_BLUE_INTEGER_EXT: 410 case GL_ALPHA_INTEGER_EXT: 411 case GL_RGB_INTEGER_EXT: 412 case GL_RGBA_INTEGER_EXT: 413 case GL_BGR_INTEGER_EXT: 414 case GL_BGRA_INTEGER_EXT: 415 case GL_LUMINANCE_INTEGER_EXT: 416 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 417 case GL_RG_INTEGER: 418 /* specific integer formats */ 419 case GL_RGBA32I_EXT: 420 case GL_RGB32I_EXT: 421 case GL_RG32I: 422 case GL_R32I: 423 case GL_ALPHA32I_EXT: 424 case GL_INTENSITY32I_EXT: 425 case GL_LUMINANCE32I_EXT: 426 case GL_LUMINANCE_ALPHA32I_EXT: 427 case GL_RGBA16I_EXT: 428 case GL_RGB16I_EXT: 429 case GL_RG16I: 430 case GL_R16I: 431 case GL_ALPHA16I_EXT: 432 case GL_INTENSITY16I_EXT: 433 case GL_LUMINANCE16I_EXT: 434 case GL_LUMINANCE_ALPHA16I_EXT: 435 case GL_RGBA8I_EXT: 436 case GL_RGB8I_EXT: 437 case GL_RG8I: 438 case GL_R8I: 439 case GL_ALPHA8I_EXT: 440 case GL_INTENSITY8I_EXT: 441 case GL_LUMINANCE8I_EXT: 442 case GL_LUMINANCE_ALPHA8I_EXT: 443 return GL_TRUE; 444 default: 445 return GL_FALSE; 446 } 447} 448 449 450/** 451 * Test if the given format is an integer (non-normalized) format. 452 */ 453GLboolean 454_mesa_is_enum_format_integer(GLenum format) 455{ 456 return _mesa_is_enum_format_unsigned_int(format) || 457 _mesa_is_enum_format_signed_int(format); 458} 459 460 461/** 462 * Test if the given type is an integer (non-normalized) format. 463 */ 464GLboolean 465_mesa_is_type_integer(GLenum type) 466{ 467 switch (type) { 468 case GL_INT: 469 case GL_UNSIGNED_INT: 470 case GL_SHORT: 471 case GL_UNSIGNED_SHORT: 472 case GL_BYTE: 473 case GL_UNSIGNED_BYTE: 474 return GL_TRUE; 475 default: 476 return GL_FALSE; 477 } 478} 479 480 481/** 482 * Test if the given format or type is an integer (non-normalized) format. 483 */ 484extern GLboolean 485_mesa_is_enum_format_or_type_integer(GLenum format, GLenum type) 486{ 487 return _mesa_is_enum_format_integer(format) || _mesa_is_type_integer(type); 488} 489 490 491GLboolean 492_mesa_is_type_unsigned(GLenum type) 493{ 494 switch (type) { 495 case GL_UNSIGNED_INT: 496 case GL_UNSIGNED_INT_8_8_8_8: 497 case GL_UNSIGNED_INT_8_8_8_8_REV: 498 case GL_UNSIGNED_INT_10_10_10_2: 499 case GL_UNSIGNED_INT_2_10_10_10_REV: 500 501 case GL_UNSIGNED_SHORT: 502 case GL_UNSIGNED_SHORT_4_4_4_4: 503 case GL_UNSIGNED_SHORT_5_5_5_1: 504 case GL_UNSIGNED_SHORT_5_6_5: 505 case GL_UNSIGNED_SHORT_5_6_5_REV: 506 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 507 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 508 case GL_UNSIGNED_SHORT_8_8_MESA: 509 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 510 511 case GL_UNSIGNED_BYTE: 512 case GL_UNSIGNED_BYTE_3_3_2: 513 case GL_UNSIGNED_BYTE_2_3_3_REV: 514 return GL_TRUE; 515 516 default: 517 return GL_FALSE; 518 } 519} 520 521 522/** 523 * Test if the given image format is a color/RGBA format (i.e., not color 524 * index, depth, stencil, etc). 525 * \param format the image format value (may by an internal texture format) 526 * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise. 527 */ 528GLboolean 529_mesa_is_color_format(GLenum format) 530{ 531 switch (format) { 532 case GL_RED: 533 case GL_GREEN: 534 case GL_BLUE: 535 case GL_ALPHA: 536 case GL_ALPHA4: 537 case GL_ALPHA8: 538 case GL_ALPHA12: 539 case GL_ALPHA16: 540 case 1: 541 case GL_LUMINANCE: 542 case GL_LUMINANCE4: 543 case GL_LUMINANCE8: 544 case GL_LUMINANCE12: 545 case GL_LUMINANCE16: 546 case 2: 547 case GL_LUMINANCE_ALPHA: 548 case GL_LUMINANCE4_ALPHA4: 549 case GL_LUMINANCE6_ALPHA2: 550 case GL_LUMINANCE8_ALPHA8: 551 case GL_LUMINANCE12_ALPHA4: 552 case GL_LUMINANCE12_ALPHA12: 553 case GL_LUMINANCE16_ALPHA16: 554 case GL_INTENSITY: 555 case GL_INTENSITY4: 556 case GL_INTENSITY8: 557 case GL_INTENSITY12: 558 case GL_INTENSITY16: 559 case GL_R8: 560 case GL_R16: 561 case GL_RG: 562 case GL_RG8: 563 case GL_RG16: 564 case 3: 565 case GL_RGB: 566 case GL_BGR: 567 case GL_R3_G3_B2: 568 case GL_RGB4: 569 case GL_RGB5: 570 case GL_RGB565: 571 case GL_RGB8: 572 case GL_RGB10: 573 case GL_RGB12: 574 case GL_RGB16: 575 case 4: 576 case GL_ABGR_EXT: 577 case GL_RGBA: 578 case GL_BGRA: 579 case GL_RGBA2: 580 case GL_RGBA4: 581 case GL_RGB5_A1: 582 case GL_RGBA8: 583 case GL_RGB10_A2: 584 case GL_RGBA12: 585 case GL_RGBA16: 586 /* float texture formats */ 587 case GL_ALPHA16F_ARB: 588 case GL_ALPHA32F_ARB: 589 case GL_LUMINANCE16F_ARB: 590 case GL_LUMINANCE32F_ARB: 591 case GL_LUMINANCE_ALPHA16F_ARB: 592 case GL_LUMINANCE_ALPHA32F_ARB: 593 case GL_INTENSITY16F_ARB: 594 case GL_INTENSITY32F_ARB: 595 case GL_R16F: 596 case GL_R32F: 597 case GL_RG16F: 598 case GL_RG32F: 599 case GL_RGB16F_ARB: 600 case GL_RGB32F_ARB: 601 case GL_RGBA16F_ARB: 602 case GL_RGBA32F_ARB: 603 /* compressed formats */ 604 case GL_COMPRESSED_ALPHA: 605 case GL_COMPRESSED_LUMINANCE: 606 case GL_COMPRESSED_LUMINANCE_ALPHA: 607 case GL_COMPRESSED_INTENSITY: 608 case GL_COMPRESSED_RED: 609 case GL_COMPRESSED_RG: 610 case GL_COMPRESSED_RGB: 611 case GL_COMPRESSED_RGBA: 612 case GL_RGB_S3TC: 613 case GL_RGB4_S3TC: 614 case GL_RGBA_S3TC: 615 case GL_RGBA4_S3TC: 616 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 617 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 618 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 619 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 620 case GL_COMPRESSED_RGB_FXT1_3DFX: 621 case GL_COMPRESSED_RGBA_FXT1_3DFX: 622 case GL_SRGB_EXT: 623 case GL_SRGB8_EXT: 624 case GL_SRGB_ALPHA_EXT: 625 case GL_SRGB8_ALPHA8_EXT: 626 case GL_SLUMINANCE_ALPHA_EXT: 627 case GL_SLUMINANCE8_ALPHA8_EXT: 628 case GL_SLUMINANCE_EXT: 629 case GL_SLUMINANCE8_EXT: 630 case GL_COMPRESSED_SRGB_EXT: 631 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 632 case GL_COMPRESSED_SRGB_ALPHA_EXT: 633 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 634 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 635 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 636 case GL_COMPRESSED_SLUMINANCE_EXT: 637 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 638 case GL_COMPRESSED_RED_RGTC1: 639 case GL_COMPRESSED_SIGNED_RED_RGTC1: 640 case GL_COMPRESSED_RG_RGTC2: 641 case GL_COMPRESSED_SIGNED_RG_RGTC2: 642 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 643 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 644 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 645 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 646 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 647 case GL_ETC1_RGB8_OES: 648 case GL_COMPRESSED_RGB8_ETC2: 649 case GL_COMPRESSED_SRGB8_ETC2: 650 case GL_COMPRESSED_RGBA8_ETC2_EAC: 651 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 652 case GL_COMPRESSED_R11_EAC: 653 case GL_COMPRESSED_RG11_EAC: 654 case GL_COMPRESSED_SIGNED_R11_EAC: 655 case GL_COMPRESSED_SIGNED_RG11_EAC: 656 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 657 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 658 /* generic integer formats */ 659 case GL_RED_INTEGER_EXT: 660 case GL_GREEN_INTEGER_EXT: 661 case GL_BLUE_INTEGER_EXT: 662 case GL_ALPHA_INTEGER_EXT: 663 case GL_RGB_INTEGER_EXT: 664 case GL_RGBA_INTEGER_EXT: 665 case GL_BGR_INTEGER_EXT: 666 case GL_BGRA_INTEGER_EXT: 667 case GL_RG_INTEGER: 668 case GL_LUMINANCE_INTEGER_EXT: 669 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 670 /* sized integer formats */ 671 case GL_RGBA32UI_EXT: 672 case GL_RGB32UI_EXT: 673 case GL_RG32UI: 674 case GL_R32UI: 675 case GL_ALPHA32UI_EXT: 676 case GL_INTENSITY32UI_EXT: 677 case GL_LUMINANCE32UI_EXT: 678 case GL_LUMINANCE_ALPHA32UI_EXT: 679 case GL_RGBA16UI_EXT: 680 case GL_RGB16UI_EXT: 681 case GL_RG16UI: 682 case GL_R16UI: 683 case GL_ALPHA16UI_EXT: 684 case GL_INTENSITY16UI_EXT: 685 case GL_LUMINANCE16UI_EXT: 686 case GL_LUMINANCE_ALPHA16UI_EXT: 687 case GL_RGBA8UI_EXT: 688 case GL_RGB8UI_EXT: 689 case GL_RG8UI: 690 case GL_R8UI: 691 case GL_ALPHA8UI_EXT: 692 case GL_INTENSITY8UI_EXT: 693 case GL_LUMINANCE8UI_EXT: 694 case GL_LUMINANCE_ALPHA8UI_EXT: 695 case GL_RGBA32I_EXT: 696 case GL_RGB32I_EXT: 697 case GL_RG32I: 698 case GL_R32I: 699 case GL_ALPHA32I_EXT: 700 case GL_INTENSITY32I_EXT: 701 case GL_LUMINANCE32I_EXT: 702 case GL_LUMINANCE_ALPHA32I_EXT: 703 case GL_RGBA16I_EXT: 704 case GL_RGB16I_EXT: 705 case GL_RG16I: 706 case GL_R16I: 707 case GL_ALPHA16I_EXT: 708 case GL_INTENSITY16I_EXT: 709 case GL_LUMINANCE16I_EXT: 710 case GL_LUMINANCE_ALPHA16I_EXT: 711 case GL_RGBA8I_EXT: 712 case GL_RGB8I_EXT: 713 case GL_RG8I: 714 case GL_R8I: 715 case GL_ALPHA8I_EXT: 716 case GL_INTENSITY8I_EXT: 717 case GL_LUMINANCE8I_EXT: 718 case GL_LUMINANCE_ALPHA8I_EXT: 719 /* signed, normalized texture formats */ 720 case GL_RED_SNORM: 721 case GL_R8_SNORM: 722 case GL_R16_SNORM: 723 case GL_RG_SNORM: 724 case GL_RG8_SNORM: 725 case GL_RG16_SNORM: 726 case GL_RGB_SNORM: 727 case GL_RGB8_SNORM: 728 case GL_RGB16_SNORM: 729 case GL_RGBA_SNORM: 730 case GL_RGBA8_SNORM: 731 case GL_RGBA16_SNORM: 732 case GL_ALPHA_SNORM: 733 case GL_ALPHA8_SNORM: 734 case GL_ALPHA16_SNORM: 735 case GL_LUMINANCE_SNORM: 736 case GL_LUMINANCE8_SNORM: 737 case GL_LUMINANCE16_SNORM: 738 case GL_LUMINANCE_ALPHA_SNORM: 739 case GL_LUMINANCE8_ALPHA8_SNORM: 740 case GL_LUMINANCE16_ALPHA16_SNORM: 741 case GL_INTENSITY_SNORM: 742 case GL_INTENSITY8_SNORM: 743 case GL_INTENSITY16_SNORM: 744 case GL_RGB9_E5: 745 case GL_R11F_G11F_B10F: 746 case GL_RGB10_A2UI: 747 return GL_TRUE; 748 case GL_YCBCR_MESA: /* not considered to be RGB */ 749 /* fall-through */ 750 default: 751 return GL_FALSE; 752 } 753} 754 755 756/** 757 * Test if the given image format is a depth component format. 758 */ 759GLboolean 760_mesa_is_depth_format(GLenum format) 761{ 762 switch (format) { 763 case GL_DEPTH_COMPONENT: 764 case GL_DEPTH_COMPONENT16: 765 case GL_DEPTH_COMPONENT24: 766 case GL_DEPTH_COMPONENT32: 767 case GL_DEPTH_COMPONENT32F: 768 return GL_TRUE; 769 default: 770 return GL_FALSE; 771 } 772} 773 774 775/** 776 * Test if the given image format is a stencil format. 777 */ 778GLboolean 779_mesa_is_stencil_format(GLenum format) 780{ 781 switch (format) { 782 case GL_STENCIL_INDEX: 783 return GL_TRUE; 784 default: 785 return GL_FALSE; 786 } 787} 788 789 790/** 791 * Test if the given image format is a YCbCr format. 792 */ 793GLboolean 794_mesa_is_ycbcr_format(GLenum format) 795{ 796 switch (format) { 797 case GL_YCBCR_MESA: 798 return GL_TRUE; 799 default: 800 return GL_FALSE; 801 } 802} 803 804 805/** 806 * Test if the given image format is a depth+stencil format. 807 */ 808GLboolean 809_mesa_is_depthstencil_format(GLenum format) 810{ 811 switch (format) { 812 case GL_DEPTH24_STENCIL8_EXT: 813 case GL_DEPTH_STENCIL_EXT: 814 case GL_DEPTH32F_STENCIL8: 815 return GL_TRUE; 816 default: 817 return GL_FALSE; 818 } 819} 820 821 822/** 823 * Test if the given image format is a depth or stencil format. 824 */ 825GLboolean 826_mesa_is_depth_or_stencil_format(GLenum format) 827{ 828 switch (format) { 829 case GL_DEPTH_COMPONENT: 830 case GL_DEPTH_COMPONENT16: 831 case GL_DEPTH_COMPONENT24: 832 case GL_DEPTH_COMPONENT32: 833 case GL_STENCIL_INDEX: 834 case GL_STENCIL_INDEX1_EXT: 835 case GL_STENCIL_INDEX4_EXT: 836 case GL_STENCIL_INDEX8_EXT: 837 case GL_STENCIL_INDEX16_EXT: 838 case GL_DEPTH_STENCIL_EXT: 839 case GL_DEPTH24_STENCIL8_EXT: 840 case GL_DEPTH_COMPONENT32F: 841 case GL_DEPTH32F_STENCIL8: 842 return GL_TRUE; 843 default: 844 return GL_FALSE; 845 } 846} 847 848 849/** 850 * Test if the given image format is a dudv format. 851 */ 852GLboolean 853_mesa_is_dudv_format(GLenum format) 854{ 855 switch (format) { 856 case GL_DUDV_ATI: 857 case GL_DU8DV8_ATI: 858 return GL_TRUE; 859 default: 860 return GL_FALSE; 861 } 862} 863 864 865/** 866 * Test if an image format is a supported compressed format. 867 * \param format the internal format token provided by the user. 868 * \return GL_TRUE if compressed, GL_FALSE if uncompressed 869 */ 870GLboolean 871_mesa_is_compressed_format(struct gl_context *ctx, GLenum format) 872{ 873 switch (format) { 874 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 875 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 876 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 877 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 878 /* Assume that the ANGLE flag will always be set if the EXT flag is set. 879 */ 880 return ctx->Extensions.ANGLE_texture_compression_dxt; 881 case GL_RGB_S3TC: 882 case GL_RGB4_S3TC: 883 case GL_RGBA_S3TC: 884 case GL_RGBA4_S3TC: 885 return _mesa_is_desktop_gl(ctx) && 886 ctx->Extensions.ANGLE_texture_compression_dxt; 887 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 888 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 889 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 890 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 891 return _mesa_is_desktop_gl(ctx) 892 && ctx->Extensions.EXT_texture_sRGB 893 && ctx->Extensions.EXT_texture_compression_s3tc; 894 case GL_COMPRESSED_RGB_FXT1_3DFX: 895 case GL_COMPRESSED_RGBA_FXT1_3DFX: 896 return _mesa_is_desktop_gl(ctx) 897 && ctx->Extensions.TDFX_texture_compression_FXT1; 898 case GL_COMPRESSED_RED_RGTC1: 899 case GL_COMPRESSED_SIGNED_RED_RGTC1: 900 case GL_COMPRESSED_RG_RGTC2: 901 case GL_COMPRESSED_SIGNED_RG_RGTC2: 902 return _mesa_is_desktop_gl(ctx) 903 && ctx->Extensions.ARB_texture_compression_rgtc; 904 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 905 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 906 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 907 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 908 return ctx->API == API_OPENGL_COMPAT 909 && ctx->Extensions.EXT_texture_compression_latc; 910 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 911 return ctx->API == API_OPENGL_COMPAT 912 && ctx->Extensions.ATI_texture_compression_3dc; 913 case GL_ETC1_RGB8_OES: 914 return _mesa_is_gles(ctx) 915 && ctx->Extensions.OES_compressed_ETC1_RGB8_texture; 916 case GL_COMPRESSED_RGB8_ETC2: 917 case GL_COMPRESSED_SRGB8_ETC2: 918 case GL_COMPRESSED_RGBA8_ETC2_EAC: 919 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 920 case GL_COMPRESSED_R11_EAC: 921 case GL_COMPRESSED_RG11_EAC: 922 case GL_COMPRESSED_SIGNED_R11_EAC: 923 case GL_COMPRESSED_SIGNED_RG11_EAC: 924 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 925 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 926 return _mesa_is_gles3(ctx) || ctx->Extensions.ARB_ES3_compatibility; 927 case GL_PALETTE4_RGB8_OES: 928 case GL_PALETTE4_RGBA8_OES: 929 case GL_PALETTE4_R5_G6_B5_OES: 930 case GL_PALETTE4_RGBA4_OES: 931 case GL_PALETTE4_RGB5_A1_OES: 932 case GL_PALETTE8_RGB8_OES: 933 case GL_PALETTE8_RGBA8_OES: 934 case GL_PALETTE8_R5_G6_B5_OES: 935 case GL_PALETTE8_RGBA4_OES: 936 case GL_PALETTE8_RGB5_A1_OES: 937 return ctx->API == API_OPENGLES; 938 default: 939 return GL_FALSE; 940 } 941} 942 943 944/** 945 * Convert various base formats to the cooresponding integer format. 946 */ 947GLenum 948_mesa_base_format_to_integer_format(GLenum format) 949{ 950 switch(format) { 951 case GL_RED: 952 return GL_RED_INTEGER; 953 case GL_GREEN: 954 return GL_GREEN_INTEGER; 955 case GL_BLUE: 956 return GL_BLUE_INTEGER; 957 case GL_RG: 958 return GL_RG_INTEGER; 959 case GL_RGB: 960 return GL_RGB_INTEGER; 961 case GL_RGBA: 962 return GL_RGBA_INTEGER; 963 case GL_BGR: 964 return GL_BGR_INTEGER; 965 case GL_BGRA: 966 return GL_BGRA_INTEGER; 967 case GL_ALPHA: 968 return GL_ALPHA_INTEGER; 969 case GL_LUMINANCE: 970 return GL_LUMINANCE_INTEGER_EXT; 971 case GL_LUMINANCE_ALPHA: 972 return GL_LUMINANCE_ALPHA_INTEGER_EXT; 973 } 974 975 return format; 976} 977 978 979/** 980 * Does the given base texture/renderbuffer format have the channel 981 * named by 'pname'? 982 */ 983GLboolean 984_mesa_base_format_has_channel(GLenum base_format, GLenum pname) 985{ 986 switch (pname) { 987 case GL_TEXTURE_RED_SIZE: 988 case GL_TEXTURE_RED_TYPE: 989 case GL_RENDERBUFFER_RED_SIZE_EXT: 990 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: 991 if (base_format == GL_RED || 992 base_format == GL_RG || 993 base_format == GL_RGB || 994 base_format == GL_RGBA) { 995 return GL_TRUE; 996 } 997 return GL_FALSE; 998 case GL_TEXTURE_GREEN_SIZE: 999 case GL_TEXTURE_GREEN_TYPE: 1000 case GL_RENDERBUFFER_GREEN_SIZE_EXT: 1001 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 1002 if (base_format == GL_RG || 1003 base_format == GL_RGB || 1004 base_format == GL_RGBA) { 1005 return GL_TRUE; 1006 } 1007 return GL_FALSE; 1008 case GL_TEXTURE_BLUE_SIZE: 1009 case GL_TEXTURE_BLUE_TYPE: 1010 case GL_RENDERBUFFER_BLUE_SIZE_EXT: 1011 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 1012 if (base_format == GL_RGB || 1013 base_format == GL_RGBA) { 1014 return GL_TRUE; 1015 } 1016 return GL_FALSE; 1017 case GL_TEXTURE_ALPHA_SIZE: 1018 case GL_TEXTURE_ALPHA_TYPE: 1019 case GL_RENDERBUFFER_ALPHA_SIZE_EXT: 1020 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 1021 if (base_format == GL_RGBA || 1022 base_format == GL_ALPHA || 1023 base_format == GL_LUMINANCE_ALPHA) { 1024 return GL_TRUE; 1025 } 1026 return GL_FALSE; 1027 case GL_TEXTURE_LUMINANCE_SIZE: 1028 case GL_TEXTURE_LUMINANCE_TYPE: 1029 if (base_format == GL_LUMINANCE || 1030 base_format == GL_LUMINANCE_ALPHA) { 1031 return GL_TRUE; 1032 } 1033 return GL_FALSE; 1034 case GL_TEXTURE_INTENSITY_SIZE: 1035 case GL_TEXTURE_INTENSITY_TYPE: 1036 if (base_format == GL_INTENSITY) { 1037 return GL_TRUE; 1038 } 1039 return GL_FALSE; 1040 case GL_TEXTURE_DEPTH_SIZE: 1041 case GL_TEXTURE_DEPTH_TYPE: 1042 case GL_RENDERBUFFER_DEPTH_SIZE_EXT: 1043 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 1044 if (base_format == GL_DEPTH_STENCIL || 1045 base_format == GL_DEPTH_COMPONENT) { 1046 return GL_TRUE; 1047 } 1048 return GL_FALSE; 1049 case GL_RENDERBUFFER_STENCIL_SIZE_EXT: 1050 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 1051 if (base_format == GL_DEPTH_STENCIL || 1052 base_format == GL_STENCIL_INDEX) { 1053 return GL_TRUE; 1054 } 1055 return GL_FALSE; 1056 default: 1057 _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n", 1058 __FUNCTION__, pname); 1059 return GL_FALSE; 1060 } 1061 1062 return GL_FALSE; 1063} 1064 1065 1066/** 1067 * Returns the number of channels/components for a base format. 1068 */ 1069GLint 1070_mesa_base_format_component_count(GLenum base_format) 1071{ 1072 switch (base_format) { 1073 case GL_RED: 1074 case GL_ALPHA: 1075 case GL_INTENSITY: 1076 case GL_DEPTH_COMPONENT: 1077 return 1; 1078 case GL_RG: 1079 case GL_LUMINANCE_ALPHA: 1080 case GL_DEPTH_STENCIL: 1081 return 2; 1082 case GL_RGB: 1083 return 3; 1084 case GL_RGBA: 1085 return 4; 1086 default: 1087 return -1; 1088 } 1089} 1090 1091 1092/** 1093 * If format is a generic compressed format, return the corresponding 1094 * non-compressed format. For other formats, return the format as-is. 1095 */ 1096GLenum 1097_mesa_generic_compressed_format_to_uncompressed_format(GLenum format) 1098{ 1099 switch (format) { 1100 case GL_COMPRESSED_RED: 1101 return GL_RED; 1102 case GL_COMPRESSED_RG: 1103 return GL_RG; 1104 case GL_COMPRESSED_RGB: 1105 return GL_RGB; 1106 case GL_COMPRESSED_RGBA: 1107 return GL_RGBA; 1108 case GL_COMPRESSED_ALPHA: 1109 return GL_ALPHA; 1110 case GL_COMPRESSED_LUMINANCE: 1111 return GL_LUMINANCE; 1112 case GL_COMPRESSED_LUMINANCE_ALPHA: 1113 return GL_LUMINANCE_ALPHA; 1114 case GL_COMPRESSED_INTENSITY: 1115 return GL_INTENSITY; 1116 /* sRGB formats */ 1117 case GL_COMPRESSED_SRGB: 1118 return GL_SRGB; 1119 case GL_COMPRESSED_SRGB_ALPHA: 1120 return GL_SRGB_ALPHA; 1121 case GL_COMPRESSED_SLUMINANCE: 1122 return GL_SLUMINANCE; 1123 case GL_COMPRESSED_SLUMINANCE_ALPHA: 1124 return GL_SLUMINANCE_ALPHA; 1125 default: 1126 return format; 1127 } 1128} 1129 1130 1131/** 1132 * Return the equivalent non-generic internal format. 1133 * This is useful for comparing whether two internal formats are equivalent. 1134 */ 1135GLenum 1136_mesa_get_nongeneric_internalformat(GLenum format) 1137{ 1138 switch (format) { 1139 /* GL 1.1 formats. */ 1140 case 4: 1141 case GL_RGBA: 1142 return GL_RGBA8; 1143 1144 case 3: 1145 case GL_RGB: 1146 return GL_RGB8; 1147 1148 case 2: 1149 case GL_LUMINANCE_ALPHA: 1150 return GL_LUMINANCE8_ALPHA8; 1151 1152 case 1: 1153 case GL_LUMINANCE: 1154 return GL_LUMINANCE8; 1155 1156 case GL_ALPHA: 1157 return GL_ALPHA8; 1158 1159 case GL_INTENSITY: 1160 return GL_INTENSITY8; 1161 1162 /* GL_ARB_texture_rg */ 1163 case GL_RED: 1164 return GL_R8; 1165 1166 case GL_RG: 1167 return GL_RG8; 1168 1169 /* GL_EXT_texture_sRGB */ 1170 case GL_SRGB: 1171 return GL_SRGB8; 1172 1173 case GL_SRGB_ALPHA: 1174 return GL_SRGB8_ALPHA8; 1175 1176 case GL_SLUMINANCE: 1177 return GL_SLUMINANCE8; 1178 1179 case GL_SLUMINANCE_ALPHA: 1180 return GL_SLUMINANCE8_ALPHA8; 1181 1182 /* GL_EXT_texture_snorm */ 1183 case GL_RGBA_SNORM: 1184 return GL_RGBA8_SNORM; 1185 1186 case GL_RGB_SNORM: 1187 return GL_RGB8_SNORM; 1188 1189 case GL_RG_SNORM: 1190 return GL_RG8_SNORM; 1191 1192 case GL_RED_SNORM: 1193 return GL_R8_SNORM; 1194 1195 case GL_LUMINANCE_ALPHA_SNORM: 1196 return GL_LUMINANCE8_ALPHA8_SNORM; 1197 1198 case GL_LUMINANCE_SNORM: 1199 return GL_LUMINANCE8_SNORM; 1200 1201 case GL_ALPHA_SNORM: 1202 return GL_ALPHA8_SNORM; 1203 1204 case GL_INTENSITY_SNORM: 1205 return GL_INTENSITY8_SNORM; 1206 1207 default: 1208 return format; 1209 } 1210} 1211 1212 1213/** 1214 * Convert an sRGB internal format to linear. 1215 */ 1216GLenum 1217_mesa_get_linear_internalformat(GLenum format) 1218{ 1219 switch (format) { 1220 case GL_SRGB: 1221 return GL_RGB; 1222 1223 case GL_SRGB_ALPHA: 1224 return GL_RGBA; 1225 1226 case GL_SRGB8: 1227 return GL_RGB8; 1228 1229 case GL_SRGB8_ALPHA8: 1230 return GL_RGBA8; 1231 1232 case GL_SLUMINANCE: 1233 return GL_LUMINANCE8; 1234 1235 case GL_SLUMINANCE_ALPHA: 1236 return GL_LUMINANCE8_ALPHA8; 1237 1238 default: 1239 return format; 1240 } 1241} 1242 1243 1244/** 1245 * Do error checking of format/type combinations for glReadPixels, 1246 * glDrawPixels and glTex[Sub]Image. Note that depending on the format 1247 * and type values, we may either generate GL_INVALID_OPERATION or 1248 * GL_INVALID_ENUM. 1249 * 1250 * \param format pixel format. 1251 * \param type pixel type. 1252 * 1253 * \return GL_INVALID_ENUM, GL_INVALID_OPERATION or GL_NO_ERROR 1254 */ 1255GLenum 1256_mesa_error_check_format_and_type(const struct gl_context *ctx, 1257 GLenum format, GLenum type) 1258{ 1259 /* special type-based checks (see glReadPixels, glDrawPixels error lists) */ 1260 switch (type) { 1261 case GL_BITMAP: 1262 if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) { 1263 return GL_INVALID_ENUM; 1264 } 1265 break; 1266 1267 case GL_UNSIGNED_BYTE_3_3_2: 1268 case GL_UNSIGNED_BYTE_2_3_3_REV: 1269 case GL_UNSIGNED_SHORT_5_6_5: 1270 case GL_UNSIGNED_SHORT_5_6_5_REV: 1271 if (format == GL_RGB) { 1272 break; /* OK */ 1273 } 1274 if (format == GL_RGB_INTEGER_EXT && 1275 ctx->Extensions.ARB_texture_rgb10_a2ui) { 1276 break; /* OK */ 1277 } 1278 return GL_INVALID_OPERATION; 1279 1280 case GL_UNSIGNED_SHORT_4_4_4_4: 1281 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1282 case GL_UNSIGNED_SHORT_5_5_5_1: 1283 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1284 case GL_UNSIGNED_INT_8_8_8_8: 1285 case GL_UNSIGNED_INT_8_8_8_8_REV: 1286 case GL_UNSIGNED_INT_10_10_10_2: 1287 case GL_UNSIGNED_INT_2_10_10_10_REV: 1288 if (format == GL_RGBA || 1289 format == GL_BGRA || 1290 format == GL_ABGR_EXT) { 1291 break; /* OK */ 1292 } 1293 if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) && 1294 ctx->Extensions.ARB_texture_rgb10_a2ui) { 1295 break; /* OK */ 1296 } 1297 if (type == GL_UNSIGNED_INT_2_10_10_10_REV && format == GL_RGB && 1298 ctx->API == API_OPENGLES2) { 1299 break; /* OK by GL_EXT_texture_type_2_10_10_10_REV */ 1300 } 1301 return GL_INVALID_OPERATION; 1302 1303 case GL_UNSIGNED_INT_24_8: 1304 if (!ctx->Extensions.EXT_packed_depth_stencil) { 1305 return GL_INVALID_ENUM; 1306 } 1307 if (format != GL_DEPTH_STENCIL) { 1308 return GL_INVALID_OPERATION; 1309 } 1310 return GL_NO_ERROR; 1311 1312 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 1313 if (!ctx->Extensions.ARB_depth_buffer_float) { 1314 return GL_INVALID_ENUM; 1315 } 1316 if (format != GL_DEPTH_STENCIL) { 1317 return GL_INVALID_OPERATION; 1318 } 1319 return GL_NO_ERROR; 1320 1321 case GL_UNSIGNED_INT_10F_11F_11F_REV: 1322 if (!ctx->Extensions.EXT_packed_float) { 1323 return GL_INVALID_ENUM; 1324 } 1325 if (format != GL_RGB) { 1326 return GL_INVALID_OPERATION; 1327 } 1328 return GL_NO_ERROR; 1329 1330 default: 1331 ; /* fall-through */ 1332 } 1333 1334 /* now, for each format, check the type for compatibility */ 1335 switch (format) { 1336 case GL_COLOR_INDEX: 1337 case GL_STENCIL_INDEX: 1338 switch (type) { 1339 case GL_BITMAP: 1340 case GL_BYTE: 1341 case GL_UNSIGNED_BYTE: 1342 case GL_SHORT: 1343 case GL_UNSIGNED_SHORT: 1344 case GL_INT: 1345 case GL_UNSIGNED_INT: 1346 case GL_FLOAT: 1347 return GL_NO_ERROR; 1348 case GL_HALF_FLOAT: 1349 return ctx->Extensions.ARB_half_float_pixel 1350 ? GL_NO_ERROR : GL_INVALID_ENUM; 1351 default: 1352 return GL_INVALID_ENUM; 1353 } 1354 1355 case GL_RED: 1356 case GL_GREEN: 1357 case GL_BLUE: 1358 case GL_ALPHA: 1359#if 0 /* not legal! see table 3.6 of the 1.5 spec */ 1360 case GL_INTENSITY: 1361#endif 1362 case GL_LUMINANCE: 1363 case GL_LUMINANCE_ALPHA: 1364 case GL_DEPTH_COMPONENT: 1365 switch (type) { 1366 case GL_BYTE: 1367 case GL_UNSIGNED_BYTE: 1368 case GL_SHORT: 1369 case GL_UNSIGNED_SHORT: 1370 case GL_INT: 1371 case GL_UNSIGNED_INT: 1372 case GL_FLOAT: 1373 return GL_NO_ERROR; 1374 case GL_HALF_FLOAT: 1375 return ctx->Extensions.ARB_half_float_pixel 1376 ? GL_NO_ERROR : GL_INVALID_ENUM; 1377 default: 1378 return GL_INVALID_ENUM; 1379 } 1380 1381 case GL_RG: 1382 if (!ctx->Extensions.ARB_texture_rg) 1383 return GL_INVALID_ENUM; 1384 switch (type) { 1385 case GL_BYTE: 1386 case GL_UNSIGNED_BYTE: 1387 case GL_SHORT: 1388 case GL_UNSIGNED_SHORT: 1389 case GL_INT: 1390 case GL_UNSIGNED_INT: 1391 case GL_FLOAT: 1392 return GL_NO_ERROR; 1393 case GL_HALF_FLOAT: 1394 return ctx->Extensions.ARB_half_float_pixel 1395 ? GL_NO_ERROR : GL_INVALID_ENUM; 1396 default: 1397 return GL_INVALID_ENUM; 1398 } 1399 1400 case GL_RGB: 1401 switch (type) { 1402 case GL_BYTE: 1403 case GL_UNSIGNED_BYTE: 1404 case GL_SHORT: 1405 case GL_UNSIGNED_SHORT: 1406 case GL_INT: 1407 case GL_UNSIGNED_INT: 1408 case GL_FLOAT: 1409 case GL_UNSIGNED_BYTE_3_3_2: 1410 case GL_UNSIGNED_BYTE_2_3_3_REV: 1411 case GL_UNSIGNED_SHORT_5_6_5: 1412 case GL_UNSIGNED_SHORT_5_6_5_REV: 1413 return GL_NO_ERROR; 1414 case GL_UNSIGNED_INT_2_10_10_10_REV: 1415 /* OK by GL_EXT_texture_type_2_10_10_10_REV */ 1416 return (ctx->API == API_OPENGLES2) 1417 ? GL_NO_ERROR : GL_INVALID_ENUM; 1418 case GL_HALF_FLOAT: 1419 return ctx->Extensions.ARB_half_float_pixel 1420 ? GL_NO_ERROR : GL_INVALID_ENUM; 1421 case GL_UNSIGNED_INT_5_9_9_9_REV: 1422 return ctx->Extensions.EXT_texture_shared_exponent 1423 ? GL_NO_ERROR : GL_INVALID_ENUM; 1424 case GL_UNSIGNED_INT_10F_11F_11F_REV: 1425 return ctx->Extensions.EXT_packed_float 1426 ? GL_NO_ERROR : GL_INVALID_ENUM; 1427 default: 1428 return GL_INVALID_ENUM; 1429 } 1430 1431 case GL_BGR: 1432 switch (type) { 1433 /* NOTE: no packed types are supported with BGR. That's 1434 * intentional, according to the GL spec. 1435 */ 1436 case GL_BYTE: 1437 case GL_UNSIGNED_BYTE: 1438 case GL_SHORT: 1439 case GL_UNSIGNED_SHORT: 1440 case GL_INT: 1441 case GL_UNSIGNED_INT: 1442 case GL_FLOAT: 1443 return GL_NO_ERROR; 1444 case GL_HALF_FLOAT: 1445 return ctx->Extensions.ARB_half_float_pixel 1446 ? GL_NO_ERROR : GL_INVALID_ENUM; 1447 default: 1448 return GL_INVALID_ENUM; 1449 } 1450 1451 case GL_RGBA: 1452 case GL_BGRA: 1453 case GL_ABGR_EXT: 1454 switch (type) { 1455 case GL_BYTE: 1456 case GL_UNSIGNED_BYTE: 1457 case GL_SHORT: 1458 case GL_UNSIGNED_SHORT: 1459 case GL_INT: 1460 case GL_UNSIGNED_INT: 1461 case GL_FLOAT: 1462 case GL_UNSIGNED_SHORT_4_4_4_4: 1463 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1464 case GL_UNSIGNED_SHORT_5_5_5_1: 1465 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1466 case GL_UNSIGNED_INT_8_8_8_8: 1467 case GL_UNSIGNED_INT_8_8_8_8_REV: 1468 case GL_UNSIGNED_INT_10_10_10_2: 1469 case GL_UNSIGNED_INT_2_10_10_10_REV: 1470 return GL_NO_ERROR; 1471 case GL_HALF_FLOAT: 1472 return ctx->Extensions.ARB_half_float_pixel 1473 ? GL_NO_ERROR : GL_INVALID_ENUM; 1474 default: 1475 return GL_INVALID_ENUM; 1476 } 1477 1478 case GL_YCBCR_MESA: 1479 if (!ctx->Extensions.MESA_ycbcr_texture) 1480 return GL_INVALID_ENUM; 1481 if (type == GL_UNSIGNED_SHORT_8_8_MESA || 1482 type == GL_UNSIGNED_SHORT_8_8_REV_MESA) 1483 return GL_NO_ERROR; 1484 else 1485 return GL_INVALID_OPERATION; 1486 1487 case GL_DEPTH_STENCIL_EXT: 1488 if (ctx->Extensions.EXT_packed_depth_stencil && 1489 type == GL_UNSIGNED_INT_24_8) 1490 return GL_NO_ERROR; 1491 else if (ctx->Extensions.ARB_depth_buffer_float && 1492 type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) 1493 return GL_NO_ERROR; 1494 else 1495 return GL_INVALID_ENUM; 1496 1497 case GL_DUDV_ATI: 1498 case GL_DU8DV8_ATI: 1499 if (!ctx->Extensions.ATI_envmap_bumpmap) 1500 return GL_INVALID_ENUM; 1501 switch (type) { 1502 case GL_BYTE: 1503 case GL_UNSIGNED_BYTE: 1504 case GL_SHORT: 1505 case GL_UNSIGNED_SHORT: 1506 case GL_INT: 1507 case GL_UNSIGNED_INT: 1508 case GL_FLOAT: 1509 return GL_NO_ERROR; 1510 default: 1511 return GL_INVALID_ENUM; 1512 } 1513 1514 /* integer-valued formats */ 1515 case GL_RED_INTEGER_EXT: 1516 case GL_GREEN_INTEGER_EXT: 1517 case GL_BLUE_INTEGER_EXT: 1518 case GL_ALPHA_INTEGER_EXT: 1519 case GL_RG_INTEGER: 1520 switch (type) { 1521 case GL_BYTE: 1522 case GL_UNSIGNED_BYTE: 1523 case GL_SHORT: 1524 case GL_UNSIGNED_SHORT: 1525 case GL_INT: 1526 case GL_UNSIGNED_INT: 1527 return (ctx->Version >= 30 || 1528 ctx->Extensions.EXT_texture_integer) 1529 ? GL_NO_ERROR : GL_INVALID_ENUM; 1530 default: 1531 return GL_INVALID_ENUM; 1532 } 1533 1534 case GL_RGB_INTEGER_EXT: 1535 switch (type) { 1536 case GL_BYTE: 1537 case GL_UNSIGNED_BYTE: 1538 case GL_SHORT: 1539 case GL_UNSIGNED_SHORT: 1540 case GL_INT: 1541 case GL_UNSIGNED_INT: 1542 return (ctx->Version >= 30 || 1543 ctx->Extensions.EXT_texture_integer) 1544 ? GL_NO_ERROR : GL_INVALID_ENUM; 1545 case GL_UNSIGNED_BYTE_3_3_2: 1546 case GL_UNSIGNED_BYTE_2_3_3_REV: 1547 case GL_UNSIGNED_SHORT_5_6_5: 1548 case GL_UNSIGNED_SHORT_5_6_5_REV: 1549 return ctx->Extensions.ARB_texture_rgb10_a2ui 1550 ? GL_NO_ERROR : GL_INVALID_ENUM; 1551 default: 1552 return GL_INVALID_ENUM; 1553 } 1554 1555 case GL_BGR_INTEGER_EXT: 1556 switch (type) { 1557 case GL_BYTE: 1558 case GL_UNSIGNED_BYTE: 1559 case GL_SHORT: 1560 case GL_UNSIGNED_SHORT: 1561 case GL_INT: 1562 case GL_UNSIGNED_INT: 1563 /* NOTE: no packed formats w/ BGR format */ 1564 return (ctx->Version >= 30 || 1565 ctx->Extensions.EXT_texture_integer) 1566 ? GL_NO_ERROR : GL_INVALID_ENUM; 1567 default: 1568 return GL_INVALID_ENUM; 1569 } 1570 1571 case GL_RGBA_INTEGER_EXT: 1572 case GL_BGRA_INTEGER_EXT: 1573 switch (type) { 1574 case GL_BYTE: 1575 case GL_UNSIGNED_BYTE: 1576 case GL_SHORT: 1577 case GL_UNSIGNED_SHORT: 1578 case GL_INT: 1579 case GL_UNSIGNED_INT: 1580 return (ctx->Version >= 30 || 1581 ctx->Extensions.EXT_texture_integer) 1582 ? GL_NO_ERROR : GL_INVALID_ENUM; 1583 case GL_UNSIGNED_SHORT_4_4_4_4: 1584 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1585 case GL_UNSIGNED_SHORT_5_5_5_1: 1586 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1587 case GL_UNSIGNED_INT_8_8_8_8: 1588 case GL_UNSIGNED_INT_8_8_8_8_REV: 1589 case GL_UNSIGNED_INT_10_10_10_2: 1590 case GL_UNSIGNED_INT_2_10_10_10_REV: 1591 return ctx->Extensions.ARB_texture_rgb10_a2ui 1592 ? GL_NO_ERROR : GL_INVALID_ENUM; 1593 default: 1594 return GL_INVALID_ENUM; 1595 } 1596 1597 case GL_LUMINANCE_INTEGER_EXT: 1598 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1599 switch (type) { 1600 case GL_BYTE: 1601 case GL_UNSIGNED_BYTE: 1602 case GL_SHORT: 1603 case GL_UNSIGNED_SHORT: 1604 case GL_INT: 1605 case GL_UNSIGNED_INT: 1606 return ctx->Extensions.EXT_texture_integer 1607 ? GL_NO_ERROR : GL_INVALID_ENUM; 1608 default: 1609 return GL_INVALID_ENUM; 1610 } 1611 1612 default: 1613 return GL_INVALID_ENUM; 1614 } 1615 return GL_NO_ERROR; 1616} 1617 1618 1619/** 1620 * Do error checking of format/type combinations for OpenGL ES glReadPixels 1621 * and glTex[Sub]Image. 1622 * \return error code, or GL_NO_ERROR. 1623 */ 1624GLenum 1625_mesa_es_error_check_format_and_type(GLenum format, GLenum type, 1626 unsigned dimensions) 1627{ 1628 GLboolean type_valid = GL_TRUE; 1629 1630 switch (format) { 1631 case GL_ALPHA: 1632 case GL_LUMINANCE: 1633 case GL_LUMINANCE_ALPHA: 1634 type_valid = (type == GL_UNSIGNED_BYTE 1635 || type == GL_FLOAT 1636 || type == GL_HALF_FLOAT_OES); 1637 break; 1638 1639 case GL_RGB: 1640 type_valid = (type == GL_UNSIGNED_BYTE 1641 || type == GL_UNSIGNED_SHORT_5_6_5 1642 || type == GL_FLOAT 1643 || type == GL_HALF_FLOAT_OES); 1644 break; 1645 1646 case GL_RGBA: 1647 type_valid = (type == GL_UNSIGNED_BYTE 1648 || type == GL_UNSIGNED_SHORT_4_4_4_4 1649 || type == GL_UNSIGNED_SHORT_5_5_5_1 1650 || type == GL_FLOAT 1651 || type == GL_HALF_FLOAT_OES 1652 || type == GL_UNSIGNED_INT_2_10_10_10_REV); 1653 break; 1654 1655 case GL_DEPTH_COMPONENT: 1656 /* This format is filtered against invalid dimensionalities elsewhere. 1657 */ 1658 type_valid = (type == GL_UNSIGNED_SHORT 1659 || type == GL_UNSIGNED_INT); 1660 break; 1661 1662 case GL_DEPTH_STENCIL: 1663 /* This format is filtered against invalid dimensionalities elsewhere. 1664 */ 1665 type_valid = (type == GL_UNSIGNED_INT_24_8); 1666 break; 1667 1668 case GL_BGRA_EXT: 1669 type_valid = (type == GL_UNSIGNED_BYTE); 1670 1671 /* This feels like a bug in the EXT_texture_format_BGRA8888 spec, but 1672 * the format does not appear to be allowed for 3D textures in OpenGL 1673 * ES. 1674 */ 1675 if (dimensions != 2) 1676 return GL_INVALID_VALUE; 1677 1678 break; 1679 1680 default: 1681 return GL_INVALID_VALUE; 1682 } 1683 1684 return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION; 1685} 1686 1687 1688/** 1689 * Do error checking of format/type combinations for OpenGL ES 3 1690 * glTex[Sub]Image. 1691 * \return error code, or GL_NO_ERROR. 1692 */ 1693GLenum 1694_mesa_es3_error_check_format_and_type(GLenum format, GLenum type, 1695 GLenum internalFormat) 1696{ 1697 GLboolean type_valid = GL_TRUE; 1698 1699 switch (format) { 1700 case GL_RGBA: 1701 switch (type) { 1702 case GL_UNSIGNED_BYTE: 1703 switch (internalFormat) { 1704 case GL_RGBA: 1705 case GL_RGBA8: 1706 case GL_RGB5_A1: 1707 case GL_RGBA4: 1708 case GL_SRGB8_ALPHA8_EXT: 1709 break; 1710 default: 1711 return GL_INVALID_OPERATION; 1712 } 1713 break; 1714 1715 case GL_BYTE: 1716 if (internalFormat != GL_RGBA8_SNORM) 1717 return GL_INVALID_OPERATION; 1718 break; 1719 1720 case GL_UNSIGNED_SHORT_4_4_4_4: 1721 switch (internalFormat) { 1722 case GL_RGBA: 1723 case GL_RGBA4: 1724 break; 1725 default: 1726 return GL_INVALID_OPERATION; 1727 } 1728 break; 1729 1730 case GL_UNSIGNED_SHORT_5_5_5_1: 1731 switch (internalFormat) { 1732 case GL_RGBA: 1733 case GL_RGB5_A1: 1734 break; 1735 default: 1736 return GL_INVALID_OPERATION; 1737 } 1738 break; 1739 1740 case GL_UNSIGNED_INT_2_10_10_10_REV: 1741 switch (internalFormat) { 1742 case GL_RGBA: /* GL_EXT_texture_type_2_10_10_10_REV */ 1743 case GL_RGB10_A2: 1744 case GL_RGB5_A1: 1745 break; 1746 default: 1747 return GL_INVALID_OPERATION; 1748 } 1749 break; 1750 1751 case GL_HALF_FLOAT: 1752 if (internalFormat != GL_RGBA16F) 1753 return GL_INVALID_OPERATION; 1754 break; 1755 1756 case GL_FLOAT: 1757 switch (internalFormat) { 1758 case GL_RGBA16F: 1759 case GL_RGBA32F: 1760 break; 1761 default: 1762 return GL_INVALID_OPERATION; 1763 } 1764 break; 1765 1766 default: 1767 return GL_INVALID_OPERATION; 1768 } 1769 break; 1770 1771 case GL_RGBA_INTEGER: 1772 switch (type) { 1773 case GL_UNSIGNED_BYTE: 1774 if (internalFormat != GL_RGBA8UI) 1775 return GL_INVALID_OPERATION; 1776 break; 1777 1778 case GL_BYTE: 1779 if (internalFormat != GL_RGBA8I) 1780 return GL_INVALID_OPERATION; 1781 break; 1782 1783 case GL_UNSIGNED_SHORT: 1784 if (internalFormat != GL_RGBA16UI) 1785 return GL_INVALID_OPERATION; 1786 break; 1787 1788 case GL_SHORT: 1789 if (internalFormat != GL_RGBA16I) 1790 return GL_INVALID_OPERATION; 1791 break; 1792 1793 case GL_UNSIGNED_INT: 1794 if (internalFormat != GL_RGBA32UI) 1795 return GL_INVALID_OPERATION; 1796 break; 1797 1798 case GL_INT: 1799 if (internalFormat != GL_RGBA32I) 1800 return GL_INVALID_OPERATION; 1801 break; 1802 1803 case GL_UNSIGNED_INT_2_10_10_10_REV: 1804 if (internalFormat != GL_RGB10_A2UI) 1805 return GL_INVALID_OPERATION; 1806 break; 1807 1808 default: 1809 return GL_INVALID_OPERATION; 1810 } 1811 break; 1812 1813 case GL_RGB: 1814 switch (type) { 1815 case GL_UNSIGNED_BYTE: 1816 switch (internalFormat) { 1817 case GL_RGB: 1818 case GL_RGB8: 1819 case GL_RGB565: 1820 case GL_SRGB8: 1821 break; 1822 default: 1823 return GL_INVALID_OPERATION; 1824 } 1825 break; 1826 1827 case GL_BYTE: 1828 if (internalFormat != GL_RGB8_SNORM) 1829 return GL_INVALID_OPERATION; 1830 break; 1831 1832 case GL_UNSIGNED_SHORT_5_6_5: 1833 switch (internalFormat) { 1834 case GL_RGB: 1835 case GL_RGB565: 1836 break; 1837 default: 1838 return GL_INVALID_OPERATION; 1839 } 1840 break; 1841 1842 case GL_UNSIGNED_INT_10F_11F_11F_REV: 1843 if (internalFormat != GL_R11F_G11F_B10F) 1844 return GL_INVALID_OPERATION; 1845 break; 1846 1847 case GL_UNSIGNED_INT_5_9_9_9_REV: 1848 if (internalFormat != GL_RGB9_E5) 1849 return GL_INVALID_OPERATION; 1850 break; 1851 1852 case GL_HALF_FLOAT: 1853 switch (internalFormat) { 1854 case GL_RGB16F: 1855 case GL_R11F_G11F_B10F: 1856 case GL_RGB9_E5: 1857 break; 1858 default: 1859 return GL_INVALID_OPERATION; 1860 } 1861 break; 1862 1863 case GL_FLOAT: 1864 switch (internalFormat) { 1865 case GL_RGB16F: 1866 case GL_RGB32F: 1867 case GL_R11F_G11F_B10F: 1868 case GL_RGB9_E5: 1869 break; 1870 default: 1871 return GL_INVALID_OPERATION; 1872 } 1873 break; 1874 1875 case GL_UNSIGNED_INT_2_10_10_10_REV: 1876 switch (internalFormat) { 1877 case GL_RGB: /* GL_EXT_texture_type_2_10_10_10_REV */ 1878 break; 1879 default: 1880 return GL_INVALID_OPERATION; 1881 } 1882 break; 1883 1884 default: 1885 return GL_INVALID_OPERATION; 1886 } 1887 break; 1888 1889 case GL_RGB_INTEGER: 1890 switch (type) { 1891 case GL_UNSIGNED_BYTE: 1892 if (internalFormat != GL_RGB8UI) 1893 return GL_INVALID_OPERATION; 1894 break; 1895 1896 case GL_BYTE: 1897 if (internalFormat != GL_RGB8I) 1898 return GL_INVALID_OPERATION; 1899 break; 1900 1901 case GL_UNSIGNED_SHORT: 1902 if (internalFormat != GL_RGB16UI) 1903 return GL_INVALID_OPERATION; 1904 break; 1905 1906 case GL_SHORT: 1907 if (internalFormat != GL_RGB16I) 1908 return GL_INVALID_OPERATION; 1909 break; 1910 1911 case GL_UNSIGNED_INT: 1912 if (internalFormat != GL_RGB32UI) 1913 return GL_INVALID_OPERATION; 1914 break; 1915 1916 case GL_INT: 1917 if (internalFormat != GL_RGB32I) 1918 return GL_INVALID_OPERATION; 1919 break; 1920 1921 default: 1922 return GL_INVALID_OPERATION; 1923 } 1924 break; 1925 1926 case GL_RG: 1927 switch (type) { 1928 case GL_UNSIGNED_BYTE: 1929 if (internalFormat != GL_RG8) 1930 return GL_INVALID_OPERATION; 1931 break; 1932 1933 case GL_BYTE: 1934 if (internalFormat != GL_RG8_SNORM) 1935 return GL_INVALID_OPERATION; 1936 break; 1937 1938 case GL_HALF_FLOAT: 1939 if (internalFormat != GL_RG16F) 1940 return GL_INVALID_OPERATION; 1941 break; 1942 1943 case GL_FLOAT: 1944 switch (internalFormat) { 1945 case GL_RG16F: 1946 case GL_RG32F: 1947 break; 1948 default: 1949 return GL_INVALID_OPERATION; 1950 } 1951 break; 1952 1953 default: 1954 return GL_INVALID_OPERATION; 1955 } 1956 break; 1957 1958 case GL_RG_INTEGER: 1959 switch (type) { 1960 case GL_UNSIGNED_BYTE: 1961 if (internalFormat != GL_RG8UI) 1962 return GL_INVALID_OPERATION; 1963 break; 1964 1965 case GL_BYTE: 1966 if (internalFormat != GL_RG8I) 1967 return GL_INVALID_OPERATION; 1968 break; 1969 1970 case GL_UNSIGNED_SHORT: 1971 if (internalFormat != GL_RG16UI) 1972 return GL_INVALID_OPERATION; 1973 break; 1974 1975 case GL_SHORT: 1976 if (internalFormat != GL_RG16I) 1977 return GL_INVALID_OPERATION; 1978 break; 1979 1980 case GL_UNSIGNED_INT: 1981 if (internalFormat != GL_RG32UI) 1982 return GL_INVALID_OPERATION; 1983 break; 1984 1985 case GL_INT: 1986 if (internalFormat != GL_RG32I) 1987 return GL_INVALID_OPERATION; 1988 break; 1989 1990 default: 1991 return GL_INVALID_OPERATION; 1992 } 1993 break; 1994 1995 case GL_RED: 1996 switch (type) { 1997 case GL_UNSIGNED_BYTE: 1998 if (internalFormat != GL_R8) 1999 return GL_INVALID_OPERATION; 2000 break; 2001 2002 case GL_BYTE: 2003 if (internalFormat != GL_R8_SNORM) 2004 return GL_INVALID_OPERATION; 2005 break; 2006 2007 case GL_HALF_FLOAT: 2008 if (internalFormat != GL_R16F) 2009 return GL_INVALID_OPERATION; 2010 break; 2011 2012 case GL_FLOAT: 2013 switch (internalFormat) { 2014 case GL_R16F: 2015 case GL_R32F: 2016 break; 2017 default: 2018 return GL_INVALID_OPERATION; 2019 } 2020 break; 2021 2022 default: 2023 return GL_INVALID_OPERATION; 2024 } 2025 break; 2026 2027 case GL_RED_INTEGER: 2028 switch (type) { 2029 case GL_UNSIGNED_BYTE: 2030 if (internalFormat != GL_R8UI) 2031 return GL_INVALID_OPERATION; 2032 break; 2033 2034 case GL_BYTE: 2035 if (internalFormat != GL_R8I) 2036 return GL_INVALID_OPERATION; 2037 break; 2038 2039 case GL_UNSIGNED_SHORT: 2040 if (internalFormat != GL_R16UI) 2041 return GL_INVALID_OPERATION; 2042 break; 2043 2044 case GL_SHORT: 2045 if (internalFormat != GL_R16I) 2046 return GL_INVALID_OPERATION; 2047 break; 2048 2049 case GL_UNSIGNED_INT: 2050 if (internalFormat != GL_R32UI) 2051 return GL_INVALID_OPERATION; 2052 break; 2053 2054 case GL_INT: 2055 if (internalFormat != GL_R32I) 2056 return GL_INVALID_OPERATION; 2057 break; 2058 2059 default: 2060 return GL_INVALID_OPERATION; 2061 } 2062 break; 2063 2064 case GL_DEPTH_COMPONENT: 2065 switch (type) { 2066 case GL_UNSIGNED_SHORT: 2067 if (internalFormat != GL_DEPTH_COMPONENT 2068 && internalFormat != GL_DEPTH_COMPONENT16) 2069 return GL_INVALID_OPERATION; 2070 break; 2071 2072 case GL_UNSIGNED_INT: 2073 switch (internalFormat) { 2074 case GL_DEPTH_COMPONENT: 2075 case GL_DEPTH_COMPONENT16: 2076 case GL_DEPTH_COMPONENT24: 2077 break; 2078 default: 2079 return GL_INVALID_OPERATION; 2080 } 2081 break; 2082 2083 case GL_FLOAT: 2084 if (internalFormat != GL_DEPTH_COMPONENT32F) 2085 return GL_INVALID_OPERATION; 2086 break; 2087 2088 default: 2089 return GL_INVALID_OPERATION; 2090 } 2091 break; 2092 2093 case GL_DEPTH_STENCIL: 2094 switch (type) { 2095 case GL_UNSIGNED_INT_24_8: 2096 if (internalFormat != GL_DEPTH_STENCIL 2097 && internalFormat != GL_DEPTH24_STENCIL8) 2098 return GL_INVALID_OPERATION; 2099 break; 2100 2101 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 2102 if (internalFormat != GL_DEPTH32F_STENCIL8) 2103 return GL_INVALID_OPERATION; 2104 break; 2105 2106 default: 2107 return GL_INVALID_OPERATION; 2108 } 2109 break; 2110 2111 case GL_ALPHA: 2112 case GL_LUMINANCE: 2113 case GL_LUMINANCE_ALPHA: 2114 if (type != GL_UNSIGNED_BYTE || format != internalFormat) 2115 return GL_INVALID_OPERATION; 2116 break; 2117 } 2118 2119 return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION; 2120} 2121