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#include "formats.h" 31#include "texcompress.h" 32#include "enums.h" 33 34enum { 35 ZERO = 4, 36 ONE = 5 37}; 38 39enum { 40 IDX_LUMINANCE = 0, 41 IDX_ALPHA, 42 IDX_INTENSITY, 43 IDX_LUMINANCE_ALPHA, 44 IDX_RGB, 45 IDX_RGBA, 46 IDX_RED, 47 IDX_GREEN, 48 IDX_BLUE, 49 IDX_BGR, 50 IDX_BGRA, 51 IDX_ABGR, 52 IDX_RG, 53 MAX_IDX 54}; 55 56#define MAP1(x) MAP4(x, ZERO, ZERO, ZERO) 57#define MAP2(x,y) MAP4(x, y, ZERO, ZERO) 58#define MAP3(x,y,z) MAP4(x, y, z, ZERO) 59#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE } 60 61static const struct { 62 GLubyte format_idx; 63 GLubyte to_rgba[6]; 64 GLubyte from_rgba[6]; 65} mappings[MAX_IDX] = 66{ 67 { 68 IDX_LUMINANCE, 69 MAP4(0,0,0,ONE), 70 MAP1(0) 71 }, 72 73 { 74 IDX_ALPHA, 75 MAP4(ZERO, ZERO, ZERO, 0), 76 MAP1(3) 77 }, 78 79 { 80 IDX_INTENSITY, 81 MAP4(0, 0, 0, 0), 82 MAP1(0), 83 }, 84 85 { 86 IDX_LUMINANCE_ALPHA, 87 MAP4(0,0,0,1), 88 MAP2(0,3) 89 }, 90 91 { 92 IDX_RGB, 93 MAP4(0,1,2,ONE), 94 MAP3(0,1,2) 95 }, 96 97 { 98 IDX_RGBA, 99 MAP4(0,1,2,3), 100 MAP4(0,1,2,3), 101 }, 102 103 { 104 IDX_RED, 105 MAP4(0, ZERO, ZERO, ONE), 106 MAP1(0), 107 }, 108 109 { 110 IDX_GREEN, 111 MAP4(ZERO, 0, ZERO, ONE), 112 MAP1(1), 113 }, 114 115 { 116 IDX_BLUE, 117 MAP4(ZERO, ZERO, 0, ONE), 118 MAP1(2), 119 }, 120 121 { 122 IDX_BGR, 123 MAP4(2,1,0,ONE), 124 MAP3(2,1,0) 125 }, 126 127 { 128 IDX_BGRA, 129 MAP4(2,1,0,3), 130 MAP4(2,1,0,3) 131 }, 132 133 { 134 IDX_ABGR, 135 MAP4(3,2,1,0), 136 MAP4(3,2,1,0) 137 }, 138 139 { 140 IDX_RG, 141 MAP4(0, 1, ZERO, ONE), 142 MAP2(0, 1) 143 }, 144}; 145 146/** 147 * Convert a GL image format enum to an IDX_* value (see above). 148 */ 149static int 150get_map_idx(GLenum value) 151{ 152 switch (value) { 153 case GL_LUMINANCE: 154 case GL_LUMINANCE_INTEGER_EXT: 155 return IDX_LUMINANCE; 156 case GL_ALPHA: 157 case GL_ALPHA_INTEGER: 158 return IDX_ALPHA; 159 case GL_INTENSITY: 160 return IDX_INTENSITY; 161 case GL_LUMINANCE_ALPHA: 162 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 163 return IDX_LUMINANCE_ALPHA; 164 case GL_RGB: 165 case GL_RGB_INTEGER: 166 return IDX_RGB; 167 case GL_RGBA: 168 case GL_RGBA_INTEGER: 169 return IDX_RGBA; 170 case GL_RED: 171 case GL_RED_INTEGER: 172 return IDX_RED; 173 case GL_GREEN: 174 return IDX_GREEN; 175 case GL_BLUE: 176 return IDX_BLUE; 177 case GL_BGR: 178 case GL_BGR_INTEGER: 179 return IDX_BGR; 180 case GL_BGRA: 181 case GL_BGRA_INTEGER: 182 return IDX_BGRA; 183 case GL_ABGR_EXT: 184 return IDX_ABGR; 185 case GL_RG: 186 case GL_RG_INTEGER: 187 return IDX_RG; 188 default: 189 _mesa_problem(NULL, "Unexpected inFormat %s", 190 _mesa_enum_to_string(value)); 191 return 0; 192 } 193} 194 195/** 196 * When promoting texture formats (see below) we need to compute the 197 * mapping of dest components back to source components. 198 * This function does that. 199 * \param inFormat the incoming format of the texture 200 * \param outFormat the final texture format 201 * \return map[6] a full 6-component map 202 */ 203void 204_mesa_compute_component_mapping(GLenum inFormat, GLenum outFormat, GLubyte *map) 205{ 206 const int inFmt = get_map_idx(inFormat); 207 const int outFmt = get_map_idx(outFormat); 208 const GLubyte *in2rgba = mappings[inFmt].to_rgba; 209 const GLubyte *rgba2out = mappings[outFmt].from_rgba; 210 int i; 211 212 for (i = 0; i < 4; i++) 213 map[i] = in2rgba[rgba2out[i]]; 214 215 map[ZERO] = ZERO; 216 map[ONE] = ONE; 217 218#if 0 219 printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n", 220 inFormat, _mesa_enum_to_string(inFormat), 221 outFormat, _mesa_enum_to_string(outFormat), 222 map[0], 223 map[1], 224 map[2], 225 map[3], 226 map[4], 227 map[5]); 228#endif 229} 230 231/** 232 * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise. 233 */ 234GLboolean 235_mesa_type_is_packed(GLenum type) 236{ 237 switch (type) { 238 case GL_UNSIGNED_BYTE_3_3_2: 239 case GL_UNSIGNED_BYTE_2_3_3_REV: 240 case MESA_UNSIGNED_BYTE_4_4: 241 case GL_UNSIGNED_SHORT_5_6_5: 242 case GL_UNSIGNED_SHORT_5_6_5_REV: 243 case GL_UNSIGNED_SHORT_4_4_4_4: 244 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 245 case GL_UNSIGNED_SHORT_5_5_5_1: 246 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 247 case GL_UNSIGNED_INT_8_8_8_8: 248 case GL_UNSIGNED_INT_8_8_8_8_REV: 249 case GL_UNSIGNED_INT_10_10_10_2: 250 case GL_UNSIGNED_INT_2_10_10_10_REV: 251 case GL_UNSIGNED_SHORT_8_8_MESA: 252 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 253 case GL_UNSIGNED_INT_24_8_EXT: 254 case GL_UNSIGNED_INT_5_9_9_9_REV: 255 case GL_UNSIGNED_INT_10F_11F_11F_REV: 256 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 257 return GL_TRUE; 258 } 259 260 return GL_FALSE; 261} 262 263 264/** 265 * Get the size of a GL data type. 266 * 267 * \param type GL data type. 268 * 269 * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1 270 * if an invalid type enum. 271 */ 272GLint 273_mesa_sizeof_type(GLenum type) 274{ 275 switch (type) { 276 case GL_BITMAP: 277 return 0; 278 case GL_UNSIGNED_BYTE: 279 return sizeof(GLubyte); 280 case GL_BYTE: 281 return sizeof(GLbyte); 282 case GL_UNSIGNED_SHORT: 283 return sizeof(GLushort); 284 case GL_SHORT: 285 return sizeof(GLshort); 286 case GL_UNSIGNED_INT: 287 return sizeof(GLuint); 288 case GL_INT: 289 return sizeof(GLint); 290 case GL_FLOAT: 291 return sizeof(GLfloat); 292 case GL_DOUBLE: 293 return sizeof(GLdouble); 294 case GL_HALF_FLOAT_ARB: 295 case GL_HALF_FLOAT_OES: 296 return sizeof(GLhalfARB); 297 case GL_FIXED: 298 return sizeof(GLfixed); 299 default: 300 return -1; 301 } 302} 303 304 305/** 306 * Same as _mesa_sizeof_type() but also accepting the packed pixel 307 * format data types. 308 */ 309GLint 310_mesa_sizeof_packed_type(GLenum type) 311{ 312 switch (type) { 313 case GL_BITMAP: 314 return 0; 315 case GL_UNSIGNED_BYTE: 316 return sizeof(GLubyte); 317 case GL_BYTE: 318 return sizeof(GLbyte); 319 case GL_UNSIGNED_SHORT: 320 return sizeof(GLushort); 321 case GL_SHORT: 322 return sizeof(GLshort); 323 case GL_UNSIGNED_INT: 324 return sizeof(GLuint); 325 case GL_INT: 326 return sizeof(GLint); 327 case GL_HALF_FLOAT_ARB: 328 case GL_HALF_FLOAT_OES: 329 return sizeof(GLhalfARB); 330 case GL_FLOAT: 331 return sizeof(GLfloat); 332 case GL_UNSIGNED_BYTE_3_3_2: 333 case GL_UNSIGNED_BYTE_2_3_3_REV: 334 case MESA_UNSIGNED_BYTE_4_4: 335 return sizeof(GLubyte); 336 case GL_UNSIGNED_SHORT_5_6_5: 337 case GL_UNSIGNED_SHORT_5_6_5_REV: 338 case GL_UNSIGNED_SHORT_4_4_4_4: 339 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 340 case GL_UNSIGNED_SHORT_5_5_5_1: 341 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 342 case GL_UNSIGNED_SHORT_8_8_MESA: 343 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 344 return sizeof(GLushort); 345 case GL_UNSIGNED_INT_8_8_8_8: 346 case GL_UNSIGNED_INT_8_8_8_8_REV: 347 case GL_UNSIGNED_INT_10_10_10_2: 348 case GL_UNSIGNED_INT_2_10_10_10_REV: 349 case GL_UNSIGNED_INT_24_8_EXT: 350 case GL_UNSIGNED_INT_5_9_9_9_REV: 351 case GL_UNSIGNED_INT_10F_11F_11F_REV: 352 return sizeof(GLuint); 353 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 354 return 8; 355 default: 356 return -1; 357 } 358} 359 360 361/** 362 * Get the number of components in a pixel format. 363 * 364 * \param format pixel format. 365 * 366 * \return the number of components in the given format, or -1 if a bad format. 367 */ 368GLint 369_mesa_components_in_format(GLenum format) 370{ 371 switch (format) { 372 case GL_COLOR_INDEX: 373 case GL_STENCIL_INDEX: 374 case GL_DEPTH_COMPONENT: 375 case GL_RED: 376 case GL_RED_INTEGER_EXT: 377 case GL_GREEN: 378 case GL_GREEN_INTEGER_EXT: 379 case GL_BLUE: 380 case GL_BLUE_INTEGER_EXT: 381 case GL_ALPHA: 382 case GL_ALPHA_INTEGER_EXT: 383 case GL_LUMINANCE: 384 case GL_LUMINANCE_INTEGER_EXT: 385 case GL_INTENSITY: 386 return 1; 387 388 case GL_LUMINANCE_ALPHA: 389 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 390 case GL_RG: 391 case GL_YCBCR_MESA: 392 case GL_DEPTH_STENCIL_EXT: 393 case GL_RG_INTEGER: 394 return 2; 395 396 case GL_RGB: 397 case GL_BGR: 398 case GL_RGB_INTEGER_EXT: 399 case GL_BGR_INTEGER_EXT: 400 return 3; 401 402 case GL_RGBA: 403 case GL_BGRA: 404 case GL_ABGR_EXT: 405 case GL_RGBA_INTEGER_EXT: 406 case GL_BGRA_INTEGER_EXT: 407 return 4; 408 409 default: 410 return -1; 411 } 412} 413 414 415/** 416 * Get the bytes per pixel of pixel format type pair. 417 * 418 * \param format pixel format. 419 * \param type pixel type. 420 * 421 * \return bytes per pixel, or -1 if a bad format or type was given. 422 */ 423GLint 424_mesa_bytes_per_pixel(GLenum format, GLenum type) 425{ 426 GLint comps = _mesa_components_in_format(format); 427 if (comps < 0) 428 return -1; 429 430 switch (type) { 431 case GL_BITMAP: 432 return 0; /* special case */ 433 case GL_BYTE: 434 case GL_UNSIGNED_BYTE: 435 return comps * sizeof(GLubyte); 436 case GL_SHORT: 437 case GL_UNSIGNED_SHORT: 438 return comps * sizeof(GLshort); 439 case GL_INT: 440 case GL_UNSIGNED_INT: 441 return comps * sizeof(GLint); 442 case GL_FLOAT: 443 return comps * sizeof(GLfloat); 444 case GL_HALF_FLOAT_ARB: 445 case GL_HALF_FLOAT_OES: 446 return comps * sizeof(GLhalfARB); 447 case GL_UNSIGNED_BYTE_3_3_2: 448 case GL_UNSIGNED_BYTE_2_3_3_REV: 449 if (format == GL_RGB || format == GL_BGR || 450 format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT) 451 return sizeof(GLubyte); 452 else 453 return -1; /* error */ 454 case GL_UNSIGNED_SHORT_5_6_5: 455 case GL_UNSIGNED_SHORT_5_6_5_REV: 456 if (format == GL_RGB || format == GL_BGR || 457 format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT) 458 return sizeof(GLushort); 459 else 460 return -1; /* error */ 461 case GL_UNSIGNED_SHORT_4_4_4_4: 462 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 463 if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT || 464 format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) 465 return sizeof(GLushort); 466 else 467 return -1; 468 case GL_UNSIGNED_SHORT_5_5_5_1: 469 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 470 if (format == GL_RGBA || format == GL_BGRA || 471 format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) 472 return sizeof(GLushort); 473 else 474 return -1; 475 case GL_UNSIGNED_INT_8_8_8_8: 476 case GL_UNSIGNED_INT_8_8_8_8_REV: 477 if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT || 478 format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT || 479 format == GL_RGB) 480 return sizeof(GLuint); 481 else 482 return -1; 483 case GL_UNSIGNED_INT_10_10_10_2: 484 case GL_UNSIGNED_INT_2_10_10_10_REV: 485 if (format == GL_RGBA || format == GL_BGRA || 486 format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT || 487 format == GL_RGB) 488 return sizeof(GLuint); 489 else 490 return -1; 491 case GL_UNSIGNED_SHORT_8_8_MESA: 492 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 493 if (format == GL_YCBCR_MESA) 494 return sizeof(GLushort); 495 else 496 return -1; 497 case GL_UNSIGNED_INT_24_8_EXT: 498 if (format == GL_DEPTH_COMPONENT || 499 format == GL_DEPTH_STENCIL_EXT) 500 return sizeof(GLuint); 501 else 502 return -1; 503 case GL_UNSIGNED_INT_5_9_9_9_REV: 504 if (format == GL_RGB) 505 return sizeof(GLuint); 506 else 507 return -1; 508 case GL_UNSIGNED_INT_10F_11F_11F_REV: 509 if (format == GL_RGB) 510 return sizeof(GLuint); 511 else 512 return -1; 513 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 514 if (format == GL_DEPTH_STENCIL) 515 return 8; 516 else 517 return -1; 518 default: 519 return -1; 520 } 521} 522 523 524/** 525 * Get the number of bytes for a vertex attrib with the given number of 526 * components and type. 527 * 528 * \param comps number of components. 529 * \param type data type. 530 * 531 * \return bytes per attribute, or -1 if a bad comps/type combination was given. 532 */ 533GLint 534_mesa_bytes_per_vertex_attrib(GLint comps, GLenum type) 535{ 536 switch (type) { 537 case GL_BYTE: 538 case GL_UNSIGNED_BYTE: 539 return comps * sizeof(GLubyte); 540 case GL_SHORT: 541 case GL_UNSIGNED_SHORT: 542 return comps * sizeof(GLshort); 543 case GL_INT: 544 case GL_UNSIGNED_INT: 545 return comps * sizeof(GLint); 546 case GL_FLOAT: 547 return comps * sizeof(GLfloat); 548 case GL_HALF_FLOAT_ARB: 549 case GL_HALF_FLOAT_OES: 550 return comps * sizeof(GLhalfARB); 551 case GL_DOUBLE: 552 return comps * sizeof(GLdouble); 553 case GL_FIXED: 554 return comps * sizeof(GLfixed); 555 case GL_INT_2_10_10_10_REV: 556 case GL_UNSIGNED_INT_2_10_10_10_REV: 557 if (comps == 4) 558 return sizeof(GLuint); 559 else 560 return -1; 561 case GL_UNSIGNED_INT_10F_11F_11F_REV: 562 if (comps == 3) 563 return sizeof(GLuint); 564 else 565 return -1; 566 case GL_UNSIGNED_INT64_ARB: 567 return comps * 8; 568 default: 569 return -1; 570 } 571} 572 573/** 574 * Test if the given format is unsized. 575 */ 576GLboolean 577_mesa_is_enum_format_unsized(GLenum format) 578{ 579 switch (format) { 580 case GL_RGBA: 581 case GL_BGRA: 582 case GL_ABGR_EXT: 583 case GL_RGB: 584 case GL_BGR: 585 case GL_RG: 586 case GL_RED: 587 case GL_GREEN: 588 case GL_BLUE: 589 case GL_ALPHA: 590 case GL_INTENSITY: 591 case GL_LUMINANCE: 592 case GL_LUMINANCE_ALPHA: 593 594 case GL_SRGB: 595 case GL_SRGB_ALPHA: 596 case GL_SLUMINANCE: 597 case GL_SLUMINANCE_ALPHA: 598 599 case GL_RGBA_SNORM: 600 case GL_RGB_SNORM: 601 case GL_RG_SNORM: 602 case GL_RED_SNORM: 603 case GL_ALPHA_SNORM: 604 case GL_INTENSITY_SNORM: 605 case GL_LUMINANCE_SNORM: 606 case GL_LUMINANCE_ALPHA_SNORM: 607 608 case GL_RED_INTEGER: 609 case GL_GREEN_INTEGER: 610 case GL_BLUE_INTEGER: 611 case GL_ALPHA_INTEGER: 612 case GL_RGB_INTEGER: 613 case GL_RGBA_INTEGER: 614 case GL_BGR_INTEGER: 615 case GL_BGRA_INTEGER: 616 case GL_RG_INTEGER: 617 case GL_LUMINANCE_INTEGER_EXT: 618 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 619 620 case GL_DEPTH_COMPONENT: 621 case GL_DEPTH_STENCIL: 622 case GL_STENCIL_INDEX: 623 return GL_TRUE; 624 default: 625 return GL_FALSE; 626 } 627} 628 629/** 630 * Test if the given format is a UNORM (unsigned-normalized) format. 631 */ 632GLboolean 633_mesa_is_enum_format_unorm(GLenum format) 634{ 635 switch(format) { 636 case GL_RED: 637 case GL_GREEN: 638 case GL_BLUE: 639 case GL_ALPHA: 640 case GL_ALPHA4: 641 case GL_ALPHA8: 642 case GL_ALPHA12: 643 case GL_ALPHA16: 644 case 1: 645 case GL_LUMINANCE: 646 case GL_SLUMINANCE: 647 case GL_LUMINANCE4: 648 case GL_LUMINANCE8: 649 case GL_LUMINANCE12: 650 case GL_LUMINANCE16: 651 case 2: 652 case GL_LUMINANCE_ALPHA: 653 case GL_SLUMINANCE_ALPHA: 654 case GL_LUMINANCE4_ALPHA4: 655 case GL_LUMINANCE6_ALPHA2: 656 case GL_LUMINANCE8_ALPHA8: 657 case GL_LUMINANCE12_ALPHA4: 658 case GL_LUMINANCE12_ALPHA12: 659 case GL_LUMINANCE16_ALPHA16: 660 case GL_INTENSITY: 661 case GL_INTENSITY4: 662 case GL_INTENSITY8: 663 case GL_INTENSITY12: 664 case GL_INTENSITY16: 665 case GL_R8: 666 case GL_R16: 667 case GL_RG: 668 case GL_RG8: 669 case GL_RG16: 670 case 3: 671 case GL_RGB: 672 case GL_BGR: 673 case GL_SRGB: 674 case GL_R3_G3_B2: 675 case GL_RGB4: 676 case GL_RGB5: 677 case GL_RGB565: 678 case GL_RGB8: 679 case GL_RGB10: 680 case GL_RGB12: 681 case GL_RGB16: 682 case 4: 683 case GL_ABGR_EXT: 684 case GL_RGBA: 685 case GL_BGRA: 686 case GL_SRGB_ALPHA: 687 case GL_RGBA2: 688 case GL_RGBA4: 689 case GL_RGB5_A1: 690 case GL_RGBA8: 691 case GL_RGB10_A2: 692 case GL_RGBA12: 693 case GL_RGBA16: 694 return GL_TRUE; 695 default: 696 return GL_FALSE; 697 } 698} 699 700/** 701 * Test if the given format is a SNORM (signed-normalized) format. 702 */ 703GLboolean 704_mesa_is_enum_format_snorm(GLenum format) 705{ 706 switch (format) { 707 /* signed, normalized texture formats */ 708 case GL_RED_SNORM: 709 case GL_R8_SNORM: 710 case GL_R16_SNORM: 711 case GL_RG_SNORM: 712 case GL_RG8_SNORM: 713 case GL_RG16_SNORM: 714 case GL_RGB_SNORM: 715 case GL_RGB8_SNORM: 716 case GL_RGB16_SNORM: 717 case GL_RGBA_SNORM: 718 case GL_RGBA8_SNORM: 719 case GL_RGBA16_SNORM: 720 case GL_ALPHA_SNORM: 721 case GL_ALPHA8_SNORM: 722 case GL_ALPHA16_SNORM: 723 case GL_LUMINANCE_SNORM: 724 case GL_LUMINANCE8_SNORM: 725 case GL_LUMINANCE16_SNORM: 726 case GL_LUMINANCE_ALPHA_SNORM: 727 case GL_LUMINANCE8_ALPHA8_SNORM: 728 case GL_LUMINANCE16_ALPHA16_SNORM: 729 case GL_INTENSITY_SNORM: 730 case GL_INTENSITY8_SNORM: 731 case GL_INTENSITY16_SNORM: 732 return GL_TRUE; 733 default: 734 return GL_FALSE; 735 } 736} 737 738/** 739 * Test if the given format is an integer (non-normalized) format. 740 */ 741GLboolean 742_mesa_is_enum_format_unsigned_int(GLenum format) 743{ 744 switch (format) { 745 /* specific integer formats */ 746 case GL_RGBA32UI_EXT: 747 case GL_RGB32UI_EXT: 748 case GL_RG32UI: 749 case GL_R32UI: 750 case GL_ALPHA32UI_EXT: 751 case GL_INTENSITY32UI_EXT: 752 case GL_LUMINANCE32UI_EXT: 753 case GL_LUMINANCE_ALPHA32UI_EXT: 754 case GL_RGBA16UI_EXT: 755 case GL_RGB16UI_EXT: 756 case GL_RG16UI: 757 case GL_R16UI: 758 case GL_ALPHA16UI_EXT: 759 case GL_INTENSITY16UI_EXT: 760 case GL_LUMINANCE16UI_EXT: 761 case GL_LUMINANCE_ALPHA16UI_EXT: 762 case GL_RGBA8UI_EXT: 763 case GL_RGB8UI_EXT: 764 case GL_RG8UI: 765 case GL_R8UI: 766 case GL_ALPHA8UI_EXT: 767 case GL_INTENSITY8UI_EXT: 768 case GL_LUMINANCE8UI_EXT: 769 case GL_LUMINANCE_ALPHA8UI_EXT: 770 case GL_RGB10_A2UI: 771 return GL_TRUE; 772 default: 773 return GL_FALSE; 774 } 775} 776 777 778/** 779 * Test if the given format is an integer (non-normalized) format. 780 */ 781GLboolean 782_mesa_is_enum_format_signed_int(GLenum format) 783{ 784 switch (format) { 785 /* generic integer formats */ 786 case GL_RED_INTEGER_EXT: 787 case GL_GREEN_INTEGER_EXT: 788 case GL_BLUE_INTEGER_EXT: 789 case GL_ALPHA_INTEGER_EXT: 790 case GL_RGB_INTEGER_EXT: 791 case GL_RGBA_INTEGER_EXT: 792 case GL_BGR_INTEGER_EXT: 793 case GL_BGRA_INTEGER_EXT: 794 case GL_LUMINANCE_INTEGER_EXT: 795 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 796 case GL_RG_INTEGER: 797 /* specific integer formats */ 798 case GL_RGBA32I_EXT: 799 case GL_RGB32I_EXT: 800 case GL_RG32I: 801 case GL_R32I: 802 case GL_ALPHA32I_EXT: 803 case GL_INTENSITY32I_EXT: 804 case GL_LUMINANCE32I_EXT: 805 case GL_LUMINANCE_ALPHA32I_EXT: 806 case GL_RGBA16I_EXT: 807 case GL_RGB16I_EXT: 808 case GL_RG16I: 809 case GL_R16I: 810 case GL_ALPHA16I_EXT: 811 case GL_INTENSITY16I_EXT: 812 case GL_LUMINANCE16I_EXT: 813 case GL_LUMINANCE_ALPHA16I_EXT: 814 case GL_RGBA8I_EXT: 815 case GL_RGB8I_EXT: 816 case GL_RG8I: 817 case GL_R8I: 818 case GL_ALPHA8I_EXT: 819 case GL_INTENSITY8I_EXT: 820 case GL_LUMINANCE8I_EXT: 821 case GL_LUMINANCE_ALPHA8I_EXT: 822 return GL_TRUE; 823 default: 824 return GL_FALSE; 825 } 826} 827 828/** 829 * Test if the given format is an ASTC 2D format. 830 */ 831static bool 832is_astc_2d_format(GLenum internalFormat) 833{ 834 switch (internalFormat) { 835 case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: 836 case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: 837 case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: 838 case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: 839 case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: 840 case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: 841 case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: 842 case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: 843 case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: 844 case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: 845 case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: 846 case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: 847 case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: 848 case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: 849 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 850 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 851 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 852 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 853 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 854 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 855 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 856 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 857 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 858 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 859 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 860 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 861 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 862 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 863 return true; 864 default: 865 return false; 866 } 867} 868 869/** 870 * Test if the given format is an ASTC 3D format. 871 */ 872static bool 873is_astc_3d_format(GLenum internalFormat) 874{ 875 switch (internalFormat) { 876 case GL_COMPRESSED_RGBA_ASTC_3x3x3_OES: 877 case GL_COMPRESSED_RGBA_ASTC_4x3x3_OES: 878 case GL_COMPRESSED_RGBA_ASTC_4x4x3_OES: 879 case GL_COMPRESSED_RGBA_ASTC_4x4x4_OES: 880 case GL_COMPRESSED_RGBA_ASTC_5x4x4_OES: 881 case GL_COMPRESSED_RGBA_ASTC_5x5x4_OES: 882 case GL_COMPRESSED_RGBA_ASTC_5x5x5_OES: 883 case GL_COMPRESSED_RGBA_ASTC_6x5x5_OES: 884 case GL_COMPRESSED_RGBA_ASTC_6x6x5_OES: 885 case GL_COMPRESSED_RGBA_ASTC_6x6x6_OES: 886 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES: 887 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES: 888 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES: 889 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES: 890 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES: 891 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES: 892 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES: 893 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES: 894 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES: 895 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES: 896 return true; 897 default: 898 return false; 899 } 900} 901 902/** 903 * Test if the given format is an ASTC format. 904 */ 905GLboolean 906_mesa_is_astc_format(GLenum internalFormat) 907{ 908 return is_astc_2d_format(internalFormat) || 909 is_astc_3d_format(internalFormat); 910} 911 912/** 913 * Test if the given format is an ETC2 format. 914 */ 915GLboolean 916_mesa_is_etc2_format(GLenum internalFormat) 917{ 918 switch (internalFormat) { 919 case GL_COMPRESSED_RGB8_ETC2: 920 case GL_COMPRESSED_SRGB8_ETC2: 921 case GL_COMPRESSED_RGBA8_ETC2_EAC: 922 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 923 case GL_COMPRESSED_R11_EAC: 924 case GL_COMPRESSED_RG11_EAC: 925 case GL_COMPRESSED_SIGNED_R11_EAC: 926 case GL_COMPRESSED_SIGNED_RG11_EAC: 927 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 928 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 929 return true; 930 default: 931 return false; 932 } 933} 934 935/** 936 * Test if the given format is an integer (non-normalized) format. 937 */ 938GLboolean 939_mesa_is_enum_format_integer(GLenum format) 940{ 941 return _mesa_is_enum_format_unsigned_int(format) || 942 _mesa_is_enum_format_signed_int(format); 943} 944 945 946GLboolean 947_mesa_is_type_unsigned(GLenum type) 948{ 949 switch (type) { 950 case GL_UNSIGNED_INT: 951 case GL_UNSIGNED_INT_8_8_8_8: 952 case GL_UNSIGNED_INT_8_8_8_8_REV: 953 case GL_UNSIGNED_INT_10_10_10_2: 954 case GL_UNSIGNED_INT_2_10_10_10_REV: 955 956 case GL_UNSIGNED_SHORT: 957 case GL_UNSIGNED_SHORT_4_4_4_4: 958 case GL_UNSIGNED_SHORT_5_5_5_1: 959 case GL_UNSIGNED_SHORT_5_6_5: 960 case GL_UNSIGNED_SHORT_5_6_5_REV: 961 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 962 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 963 case GL_UNSIGNED_SHORT_8_8_MESA: 964 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 965 966 case GL_UNSIGNED_BYTE: 967 case GL_UNSIGNED_BYTE_3_3_2: 968 case GL_UNSIGNED_BYTE_2_3_3_REV: 969 return GL_TRUE; 970 971 default: 972 return GL_FALSE; 973 } 974} 975 976 977/** 978 * Test if the given image format is a color/RGBA format (i.e., not color 979 * index, depth, stencil, etc). 980 * \param format the image format value (may by an internal texture format) 981 * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise. 982 */ 983GLboolean 984_mesa_is_color_format(GLenum format) 985{ 986 switch (format) { 987 case GL_RED: 988 case GL_GREEN: 989 case GL_BLUE: 990 case GL_ALPHA: 991 case GL_ALPHA4: 992 case GL_ALPHA8: 993 case GL_ALPHA12: 994 case GL_ALPHA16: 995 case 1: 996 case GL_LUMINANCE: 997 case GL_LUMINANCE4: 998 case GL_LUMINANCE8: 999 case GL_LUMINANCE12: 1000 case GL_LUMINANCE16: 1001 case 2: 1002 case GL_LUMINANCE_ALPHA: 1003 case GL_LUMINANCE4_ALPHA4: 1004 case GL_LUMINANCE6_ALPHA2: 1005 case GL_LUMINANCE8_ALPHA8: 1006 case GL_LUMINANCE12_ALPHA4: 1007 case GL_LUMINANCE12_ALPHA12: 1008 case GL_LUMINANCE16_ALPHA16: 1009 case GL_INTENSITY: 1010 case GL_INTENSITY4: 1011 case GL_INTENSITY8: 1012 case GL_INTENSITY12: 1013 case GL_INTENSITY16: 1014 case GL_R8: 1015 case GL_R16: 1016 case GL_RG: 1017 case GL_RG8: 1018 case GL_RG16: 1019 case 3: 1020 case GL_RGB: 1021 case GL_BGR: 1022 case GL_R3_G3_B2: 1023 case GL_RGB4: 1024 case GL_RGB5: 1025 case GL_RGB565: 1026 case GL_RGB8: 1027 case GL_RGB10: 1028 case GL_RGB12: 1029 case GL_RGB16: 1030 case 4: 1031 case GL_ABGR_EXT: 1032 case GL_RGBA: 1033 case GL_BGRA: 1034 case GL_RGBA2: 1035 case GL_RGBA4: 1036 case GL_RGB5_A1: 1037 case GL_RGBA8: 1038 case GL_RGB10_A2: 1039 case GL_RGBA12: 1040 case GL_RGBA16: 1041 /* float texture formats */ 1042 case GL_ALPHA16F_ARB: 1043 case GL_ALPHA32F_ARB: 1044 case GL_LUMINANCE16F_ARB: 1045 case GL_LUMINANCE32F_ARB: 1046 case GL_LUMINANCE_ALPHA16F_ARB: 1047 case GL_LUMINANCE_ALPHA32F_ARB: 1048 case GL_INTENSITY16F_ARB: 1049 case GL_INTENSITY32F_ARB: 1050 case GL_R16F: 1051 case GL_R32F: 1052 case GL_RG16F: 1053 case GL_RG32F: 1054 case GL_RGB16F_ARB: 1055 case GL_RGB32F_ARB: 1056 case GL_RGBA16F_ARB: 1057 case GL_RGBA32F_ARB: 1058 /* compressed formats */ 1059 case GL_COMPRESSED_ALPHA: 1060 case GL_COMPRESSED_LUMINANCE: 1061 case GL_COMPRESSED_LUMINANCE_ALPHA: 1062 case GL_COMPRESSED_INTENSITY: 1063 case GL_COMPRESSED_RED: 1064 case GL_COMPRESSED_RG: 1065 case GL_COMPRESSED_RGB: 1066 case GL_COMPRESSED_RGBA: 1067 case GL_RGB_S3TC: 1068 case GL_RGB4_S3TC: 1069 case GL_RGBA_S3TC: 1070 case GL_RGBA4_S3TC: 1071 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 1072 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 1073 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 1074 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 1075 case GL_COMPRESSED_RGB_FXT1_3DFX: 1076 case GL_COMPRESSED_RGBA_FXT1_3DFX: 1077 case GL_SR8_EXT: 1078 case GL_SRG8_EXT: 1079 case GL_SRGB_EXT: 1080 case GL_SRGB8_EXT: 1081 case GL_SRGB_ALPHA_EXT: 1082 case GL_SRGB8_ALPHA8_EXT: 1083 case GL_SLUMINANCE_ALPHA_EXT: 1084 case GL_SLUMINANCE8_ALPHA8_EXT: 1085 case GL_SLUMINANCE_EXT: 1086 case GL_SLUMINANCE8_EXT: 1087 case GL_COMPRESSED_SRGB_EXT: 1088 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 1089 case GL_COMPRESSED_SRGB_ALPHA_EXT: 1090 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 1091 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 1092 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 1093 case GL_COMPRESSED_SLUMINANCE_EXT: 1094 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 1095 case GL_COMPRESSED_RED_RGTC1: 1096 case GL_COMPRESSED_SIGNED_RED_RGTC1: 1097 case GL_COMPRESSED_RG_RGTC2: 1098 case GL_COMPRESSED_SIGNED_RG_RGTC2: 1099 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 1100 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 1101 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 1102 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 1103 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 1104 case GL_ETC1_RGB8_OES: 1105 case GL_COMPRESSED_RGB8_ETC2: 1106 case GL_COMPRESSED_SRGB8_ETC2: 1107 case GL_COMPRESSED_RGBA8_ETC2_EAC: 1108 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 1109 case GL_COMPRESSED_R11_EAC: 1110 case GL_COMPRESSED_RG11_EAC: 1111 case GL_COMPRESSED_SIGNED_R11_EAC: 1112 case GL_COMPRESSED_SIGNED_RG11_EAC: 1113 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 1114 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 1115 case GL_COMPRESSED_RGBA_BPTC_UNORM: 1116 case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: 1117 case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: 1118 case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: 1119 case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: 1120 case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: 1121 case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: 1122 case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: 1123 case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: 1124 case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: 1125 case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: 1126 case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: 1127 case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: 1128 case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: 1129 case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: 1130 case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: 1131 case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: 1132 case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: 1133 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 1134 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 1135 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 1136 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 1137 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 1138 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 1139 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 1140 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 1141 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 1142 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 1143 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 1144 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 1145 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 1146 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 1147 case GL_ATC_RGB_AMD: 1148 case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: 1149 case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: 1150 /* generic integer formats */ 1151 case GL_RED_INTEGER_EXT: 1152 case GL_GREEN_INTEGER_EXT: 1153 case GL_BLUE_INTEGER_EXT: 1154 case GL_ALPHA_INTEGER_EXT: 1155 case GL_RGB_INTEGER_EXT: 1156 case GL_RGBA_INTEGER_EXT: 1157 case GL_BGR_INTEGER_EXT: 1158 case GL_BGRA_INTEGER_EXT: 1159 case GL_RG_INTEGER: 1160 case GL_LUMINANCE_INTEGER_EXT: 1161 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1162 /* sized integer formats */ 1163 case GL_RGBA32UI_EXT: 1164 case GL_RGB32UI_EXT: 1165 case GL_RG32UI: 1166 case GL_R32UI: 1167 case GL_ALPHA32UI_EXT: 1168 case GL_INTENSITY32UI_EXT: 1169 case GL_LUMINANCE32UI_EXT: 1170 case GL_LUMINANCE_ALPHA32UI_EXT: 1171 case GL_RGBA16UI_EXT: 1172 case GL_RGB16UI_EXT: 1173 case GL_RG16UI: 1174 case GL_R16UI: 1175 case GL_ALPHA16UI_EXT: 1176 case GL_INTENSITY16UI_EXT: 1177 case GL_LUMINANCE16UI_EXT: 1178 case GL_LUMINANCE_ALPHA16UI_EXT: 1179 case GL_RGBA8UI_EXT: 1180 case GL_RGB8UI_EXT: 1181 case GL_RG8UI: 1182 case GL_R8UI: 1183 case GL_ALPHA8UI_EXT: 1184 case GL_INTENSITY8UI_EXT: 1185 case GL_LUMINANCE8UI_EXT: 1186 case GL_LUMINANCE_ALPHA8UI_EXT: 1187 case GL_RGBA32I_EXT: 1188 case GL_RGB32I_EXT: 1189 case GL_RG32I: 1190 case GL_R32I: 1191 case GL_ALPHA32I_EXT: 1192 case GL_INTENSITY32I_EXT: 1193 case GL_LUMINANCE32I_EXT: 1194 case GL_LUMINANCE_ALPHA32I_EXT: 1195 case GL_RGBA16I_EXT: 1196 case GL_RGB16I_EXT: 1197 case GL_RG16I: 1198 case GL_R16I: 1199 case GL_ALPHA16I_EXT: 1200 case GL_INTENSITY16I_EXT: 1201 case GL_LUMINANCE16I_EXT: 1202 case GL_LUMINANCE_ALPHA16I_EXT: 1203 case GL_RGBA8I_EXT: 1204 case GL_RGB8I_EXT: 1205 case GL_RG8I: 1206 case GL_R8I: 1207 case GL_ALPHA8I_EXT: 1208 case GL_INTENSITY8I_EXT: 1209 case GL_LUMINANCE8I_EXT: 1210 case GL_LUMINANCE_ALPHA8I_EXT: 1211 /* signed, normalized texture formats */ 1212 case GL_RED_SNORM: 1213 case GL_R8_SNORM: 1214 case GL_R16_SNORM: 1215 case GL_RG_SNORM: 1216 case GL_RG8_SNORM: 1217 case GL_RG16_SNORM: 1218 case GL_RGB_SNORM: 1219 case GL_RGB8_SNORM: 1220 case GL_RGB16_SNORM: 1221 case GL_RGBA_SNORM: 1222 case GL_RGBA8_SNORM: 1223 case GL_RGBA16_SNORM: 1224 case GL_ALPHA_SNORM: 1225 case GL_ALPHA8_SNORM: 1226 case GL_ALPHA16_SNORM: 1227 case GL_LUMINANCE_SNORM: 1228 case GL_LUMINANCE8_SNORM: 1229 case GL_LUMINANCE16_SNORM: 1230 case GL_LUMINANCE_ALPHA_SNORM: 1231 case GL_LUMINANCE8_ALPHA8_SNORM: 1232 case GL_LUMINANCE16_ALPHA16_SNORM: 1233 case GL_INTENSITY_SNORM: 1234 case GL_INTENSITY8_SNORM: 1235 case GL_INTENSITY16_SNORM: 1236 case GL_RGB9_E5: 1237 case GL_R11F_G11F_B10F: 1238 case GL_RGB10_A2UI: 1239 return GL_TRUE; 1240 case GL_YCBCR_MESA: /* not considered to be RGB */ 1241 FALLTHROUGH; 1242 default: 1243 return GL_FALSE; 1244 } 1245} 1246 1247 1248/** 1249 * Test if the given image format is a depth component format. 1250 */ 1251GLboolean 1252_mesa_is_depth_format(GLenum format) 1253{ 1254 switch (format) { 1255 case GL_DEPTH_COMPONENT: 1256 case GL_DEPTH_COMPONENT16: 1257 case GL_DEPTH_COMPONENT24: 1258 case GL_DEPTH_COMPONENT32: 1259 case GL_DEPTH_COMPONENT32F: 1260 return GL_TRUE; 1261 default: 1262 return GL_FALSE; 1263 } 1264} 1265 1266 1267/** 1268 * Test if the given image format is a stencil format. 1269 */ 1270GLboolean 1271_mesa_is_stencil_format(GLenum format) 1272{ 1273 switch (format) { 1274 case GL_STENCIL_INDEX: 1275 return GL_TRUE; 1276 default: 1277 return GL_FALSE; 1278 } 1279} 1280 1281 1282/** 1283 * Test if the given image format is a YCbCr format. 1284 */ 1285GLboolean 1286_mesa_is_ycbcr_format(GLenum format) 1287{ 1288 switch (format) { 1289 case GL_YCBCR_MESA: 1290 return GL_TRUE; 1291 default: 1292 return GL_FALSE; 1293 } 1294} 1295 1296 1297/** 1298 * Test if the given image format is a depth+stencil format. 1299 */ 1300GLboolean 1301_mesa_is_depthstencil_format(GLenum format) 1302{ 1303 switch (format) { 1304 case GL_DEPTH24_STENCIL8_EXT: 1305 case GL_DEPTH_STENCIL_EXT: 1306 case GL_DEPTH32F_STENCIL8: 1307 return GL_TRUE; 1308 default: 1309 return GL_FALSE; 1310 } 1311} 1312 1313 1314/** 1315 * Test if the given image format is a depth or stencil format. 1316 */ 1317GLboolean 1318_mesa_is_depth_or_stencil_format(GLenum format) 1319{ 1320 switch (format) { 1321 case GL_DEPTH_COMPONENT: 1322 case GL_DEPTH_COMPONENT16: 1323 case GL_DEPTH_COMPONENT24: 1324 case GL_DEPTH_COMPONENT32: 1325 case GL_STENCIL_INDEX: 1326 case GL_STENCIL_INDEX1_EXT: 1327 case GL_STENCIL_INDEX4_EXT: 1328 case GL_STENCIL_INDEX8_EXT: 1329 case GL_STENCIL_INDEX16_EXT: 1330 case GL_DEPTH_STENCIL_EXT: 1331 case GL_DEPTH24_STENCIL8_EXT: 1332 case GL_DEPTH_COMPONENT32F: 1333 case GL_DEPTH32F_STENCIL8: 1334 return GL_TRUE; 1335 default: 1336 return GL_FALSE; 1337 } 1338} 1339 1340/** 1341 * Test if the given image format has a floating-point depth component. 1342 */ 1343GLboolean 1344_mesa_has_depth_float_channel(GLenum internalFormat) 1345{ 1346 return internalFormat == GL_DEPTH32F_STENCIL8 || 1347 internalFormat == GL_DEPTH_COMPONENT32F; 1348} 1349 1350/** 1351 * Test if an image format is a supported compressed format. 1352 * \param format the internal format token provided by the user. 1353 * \return GL_TRUE if compressed, GL_FALSE if uncompressed 1354 */ 1355GLboolean 1356_mesa_is_compressed_format(const struct gl_context *ctx, GLenum format) 1357{ 1358 mesa_format m_format = _mesa_glenum_to_compressed_format(format); 1359 1360 /* Some formats in this switch have an equivalent mesa_format_layout 1361 * to the compressed formats in the layout switch below and thus 1362 * must be handled first. 1363 */ 1364 switch (format) { 1365 case GL_RGB_S3TC: 1366 case GL_RGB4_S3TC: 1367 case GL_RGBA_S3TC: 1368 case GL_RGBA4_S3TC: 1369 return _mesa_has_S3_s3tc(ctx); 1370 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 1371 return _mesa_has_ATI_texture_compression_3dc(ctx); 1372 case GL_PALETTE4_RGB8_OES: 1373 case GL_PALETTE4_RGBA8_OES: 1374 case GL_PALETTE4_R5_G6_B5_OES: 1375 case GL_PALETTE4_RGBA4_OES: 1376 case GL_PALETTE4_RGB5_A1_OES: 1377 case GL_PALETTE8_RGB8_OES: 1378 case GL_PALETTE8_RGBA8_OES: 1379 case GL_PALETTE8_R5_G6_B5_OES: 1380 case GL_PALETTE8_RGBA4_OES: 1381 case GL_PALETTE8_RGB5_A1_OES: 1382 return ctx->API == API_OPENGLES; 1383 } 1384 1385 switch (_mesa_get_format_layout(m_format)) { 1386 case MESA_FORMAT_LAYOUT_S3TC: 1387 if (!_mesa_is_format_srgb(m_format)) { 1388 return _mesa_has_EXT_texture_compression_s3tc(ctx); 1389 } else { 1390 return (_mesa_has_EXT_texture_sRGB(ctx) || 1391 _mesa_has_EXT_texture_compression_s3tc_srgb(ctx)) && 1392 _mesa_has_EXT_texture_compression_s3tc(ctx); 1393 } 1394 case MESA_FORMAT_LAYOUT_FXT1: 1395 return _mesa_has_3DFX_texture_compression_FXT1(ctx); 1396 case MESA_FORMAT_LAYOUT_RGTC: 1397 return _mesa_has_ARB_texture_compression_rgtc(ctx) || 1398 _mesa_has_EXT_texture_compression_rgtc(ctx); 1399 case MESA_FORMAT_LAYOUT_LATC: 1400 return _mesa_has_EXT_texture_compression_latc(ctx); 1401 case MESA_FORMAT_LAYOUT_ETC1: 1402 return _mesa_has_OES_compressed_ETC1_RGB8_texture(ctx); 1403 case MESA_FORMAT_LAYOUT_ETC2: 1404 return _mesa_is_gles3(ctx) || _mesa_has_ARB_ES3_compatibility(ctx); 1405 case MESA_FORMAT_LAYOUT_BPTC: 1406 return _mesa_has_ARB_texture_compression_bptc(ctx) || 1407 _mesa_has_EXT_texture_compression_bptc(ctx); 1408 case MESA_FORMAT_LAYOUT_ASTC: 1409 return _mesa_has_KHR_texture_compression_astc_ldr(ctx); 1410 case MESA_FORMAT_LAYOUT_ATC: 1411 return _mesa_has_AMD_compressed_ATC_texture(ctx); 1412 default: 1413 return GL_FALSE; 1414 } 1415} 1416 1417/** 1418 * Test if the given format represents an sRGB format. 1419 * \param format the GL format (can be an internal format) 1420 * \return GL_TRUE if format is sRGB, GL_FALSE otherwise 1421 */ 1422GLboolean 1423_mesa_is_srgb_format(GLenum format) 1424{ 1425 switch (format) { 1426 case GL_SR8_EXT: 1427 case GL_SRG8_EXT: 1428 case GL_SRGB: 1429 case GL_SRGB8: 1430 case GL_SRGB_ALPHA: 1431 case GL_SRGB8_ALPHA8: 1432 case GL_COMPRESSED_SRGB: 1433 case GL_COMPRESSED_SRGB_ALPHA: 1434 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 1435 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 1436 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 1437 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 1438 case GL_COMPRESSED_SRGB8_ETC2: 1439 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 1440 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 1441 case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: 1442 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 1443 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 1444 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 1445 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 1446 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 1447 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 1448 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 1449 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 1450 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 1451 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 1452 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 1453 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 1454 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 1455 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 1456 return GL_TRUE; 1457 default: 1458 break; 1459 } 1460 1461 return GL_FALSE; 1462} 1463 1464/** 1465 * Convert various unpack formats to the corresponding base format. 1466 */ 1467GLenum 1468_mesa_unpack_format_to_base_format(GLenum format) 1469{ 1470 switch(format) { 1471 case GL_RED_INTEGER: 1472 return GL_RED; 1473 case GL_GREEN_INTEGER: 1474 return GL_GREEN; 1475 case GL_BLUE_INTEGER: 1476 return GL_BLUE; 1477 case GL_ALPHA_INTEGER: 1478 return GL_ALPHA; 1479 case GL_RG_INTEGER: 1480 return GL_RG; 1481 case GL_RGB_INTEGER: 1482 return GL_RGB; 1483 case GL_RGBA_INTEGER: 1484 return GL_RGBA; 1485 case GL_BGR_INTEGER: 1486 return GL_BGR; 1487 case GL_BGRA_INTEGER: 1488 return GL_BGRA; 1489 case GL_LUMINANCE_INTEGER_EXT: 1490 return GL_LUMINANCE; 1491 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1492 return GL_LUMINANCE_ALPHA; 1493 case GL_RED: 1494 case GL_GREEN: 1495 case GL_BLUE: 1496 case GL_RG: 1497 case GL_RGB: 1498 case GL_RGBA: 1499 case GL_BGR: 1500 case GL_BGRA: 1501 case GL_ALPHA: 1502 case GL_LUMINANCE: 1503 case GL_LUMINANCE_ALPHA: 1504 default: 1505 return format; 1506 } 1507} 1508 1509/** 1510 * Convert various base formats to the corresponding integer format. 1511 */ 1512GLenum 1513_mesa_base_format_to_integer_format(GLenum format) 1514{ 1515 switch(format) { 1516 case GL_RED: 1517 return GL_RED_INTEGER; 1518 case GL_GREEN: 1519 return GL_GREEN_INTEGER; 1520 case GL_BLUE: 1521 return GL_BLUE_INTEGER; 1522 case GL_RG: 1523 return GL_RG_INTEGER; 1524 case GL_RGB: 1525 return GL_RGB_INTEGER; 1526 case GL_RGBA: 1527 return GL_RGBA_INTEGER; 1528 case GL_BGR: 1529 return GL_BGR_INTEGER; 1530 case GL_BGRA: 1531 return GL_BGRA_INTEGER; 1532 case GL_ALPHA: 1533 return GL_ALPHA_INTEGER; 1534 case GL_LUMINANCE: 1535 return GL_LUMINANCE_INTEGER_EXT; 1536 case GL_LUMINANCE_ALPHA: 1537 return GL_LUMINANCE_ALPHA_INTEGER_EXT; 1538 } 1539 1540 return format; 1541} 1542 1543 1544/** 1545 * Does the given base texture/renderbuffer format have the channel 1546 * named by 'pname'? 1547 */ 1548GLboolean 1549_mesa_base_format_has_channel(GLenum base_format, GLenum pname) 1550{ 1551 switch (pname) { 1552 case GL_TEXTURE_RED_SIZE: 1553 case GL_TEXTURE_RED_TYPE: 1554 case GL_RENDERBUFFER_RED_SIZE_EXT: 1555 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: 1556 case GL_INTERNALFORMAT_RED_SIZE: 1557 case GL_INTERNALFORMAT_RED_TYPE: 1558 if (base_format == GL_RED || 1559 base_format == GL_RG || 1560 base_format == GL_RGB || 1561 base_format == GL_RGBA) { 1562 return GL_TRUE; 1563 } 1564 return GL_FALSE; 1565 case GL_TEXTURE_GREEN_SIZE: 1566 case GL_TEXTURE_GREEN_TYPE: 1567 case GL_RENDERBUFFER_GREEN_SIZE_EXT: 1568 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 1569 case GL_INTERNALFORMAT_GREEN_SIZE: 1570 case GL_INTERNALFORMAT_GREEN_TYPE: 1571 if (base_format == GL_RG || 1572 base_format == GL_RGB || 1573 base_format == GL_RGBA) { 1574 return GL_TRUE; 1575 } 1576 return GL_FALSE; 1577 case GL_TEXTURE_BLUE_SIZE: 1578 case GL_TEXTURE_BLUE_TYPE: 1579 case GL_RENDERBUFFER_BLUE_SIZE_EXT: 1580 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 1581 case GL_INTERNALFORMAT_BLUE_SIZE: 1582 case GL_INTERNALFORMAT_BLUE_TYPE: 1583 if (base_format == GL_RGB || 1584 base_format == GL_RGBA) { 1585 return GL_TRUE; 1586 } 1587 return GL_FALSE; 1588 case GL_TEXTURE_ALPHA_SIZE: 1589 case GL_TEXTURE_ALPHA_TYPE: 1590 case GL_RENDERBUFFER_ALPHA_SIZE_EXT: 1591 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 1592 case GL_INTERNALFORMAT_ALPHA_SIZE: 1593 case GL_INTERNALFORMAT_ALPHA_TYPE: 1594 if (base_format == GL_RGBA || 1595 base_format == GL_ALPHA || 1596 base_format == GL_LUMINANCE_ALPHA) { 1597 return GL_TRUE; 1598 } 1599 return GL_FALSE; 1600 case GL_TEXTURE_LUMINANCE_SIZE: 1601 case GL_TEXTURE_LUMINANCE_TYPE: 1602 if (base_format == GL_LUMINANCE || 1603 base_format == GL_LUMINANCE_ALPHA) { 1604 return GL_TRUE; 1605 } 1606 return GL_FALSE; 1607 case GL_TEXTURE_INTENSITY_SIZE: 1608 case GL_TEXTURE_INTENSITY_TYPE: 1609 if (base_format == GL_INTENSITY) { 1610 return GL_TRUE; 1611 } 1612 return GL_FALSE; 1613 case GL_TEXTURE_DEPTH_SIZE: 1614 case GL_TEXTURE_DEPTH_TYPE: 1615 case GL_RENDERBUFFER_DEPTH_SIZE_EXT: 1616 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 1617 case GL_INTERNALFORMAT_DEPTH_SIZE: 1618 case GL_INTERNALFORMAT_DEPTH_TYPE: 1619 if (base_format == GL_DEPTH_STENCIL || 1620 base_format == GL_DEPTH_COMPONENT) { 1621 return GL_TRUE; 1622 } 1623 return GL_FALSE; 1624 case GL_RENDERBUFFER_STENCIL_SIZE_EXT: 1625 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 1626 case GL_INTERNALFORMAT_STENCIL_SIZE: 1627 case GL_INTERNALFORMAT_STENCIL_TYPE: 1628 if (base_format == GL_DEPTH_STENCIL || 1629 base_format == GL_STENCIL_INDEX) { 1630 return GL_TRUE; 1631 } 1632 return GL_FALSE; 1633 default: 1634 _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n", 1635 __func__, pname); 1636 return GL_FALSE; 1637 } 1638 1639 return GL_FALSE; 1640} 1641 1642 1643/** 1644 * If format is a generic compressed format, return the corresponding 1645 * non-compressed format. For other formats, return the format as-is. 1646 */ 1647GLenum 1648_mesa_generic_compressed_format_to_uncompressed_format(GLenum format) 1649{ 1650 switch (format) { 1651 case GL_COMPRESSED_RED: 1652 return GL_RED; 1653 case GL_COMPRESSED_RG: 1654 return GL_RG; 1655 case GL_COMPRESSED_RGB: 1656 return GL_RGB; 1657 case GL_COMPRESSED_RGBA: 1658 return GL_RGBA; 1659 case GL_COMPRESSED_ALPHA: 1660 return GL_ALPHA; 1661 case GL_COMPRESSED_LUMINANCE: 1662 return GL_LUMINANCE; 1663 case GL_COMPRESSED_LUMINANCE_ALPHA: 1664 return GL_LUMINANCE_ALPHA; 1665 case GL_COMPRESSED_INTENSITY: 1666 return GL_INTENSITY; 1667 /* sRGB formats */ 1668 case GL_COMPRESSED_SRGB: 1669 return GL_SRGB; 1670 case GL_COMPRESSED_SRGB_ALPHA: 1671 return GL_SRGB_ALPHA; 1672 case GL_COMPRESSED_SLUMINANCE: 1673 return GL_SLUMINANCE; 1674 case GL_COMPRESSED_SLUMINANCE_ALPHA: 1675 return GL_SLUMINANCE_ALPHA; 1676 default: 1677 return format; 1678 } 1679} 1680 1681 1682/** 1683 * Return the equivalent non-generic internal format. 1684 * This is useful for comparing whether two internal formats are equivalent. 1685 */ 1686GLenum 1687_mesa_get_nongeneric_internalformat(GLenum format) 1688{ 1689 switch (format) { 1690 /* GL 1.1 formats. */ 1691 case 4: 1692 case GL_RGBA: 1693 return GL_RGBA8; 1694 case 3: 1695 case GL_RGB: 1696 return GL_RGB8; 1697 case 2: 1698 case GL_LUMINANCE_ALPHA: 1699 return GL_LUMINANCE8_ALPHA8; 1700 case 1: 1701 case GL_LUMINANCE: 1702 return GL_LUMINANCE8; 1703 case GL_ALPHA: 1704 return GL_ALPHA8; 1705 case GL_INTENSITY: 1706 return GL_INTENSITY8; 1707 1708 /* GL_ARB_texture_rg */ 1709 case GL_RED: 1710 return GL_R8; 1711 case GL_RG: 1712 return GL_RG8; 1713 1714 /* GL_EXT_texture_sRGB */ 1715 case GL_SRGB: 1716 return GL_SRGB8; 1717 case GL_SRGB_ALPHA: 1718 return GL_SRGB8_ALPHA8; 1719 case GL_SLUMINANCE: 1720 return GL_SLUMINANCE8; 1721 case GL_SLUMINANCE_ALPHA: 1722 return GL_SLUMINANCE8_ALPHA8; 1723 1724 /* GL_EXT_texture_snorm */ 1725 case GL_RGBA_SNORM: 1726 return GL_RGBA8_SNORM; 1727 case GL_RGB_SNORM: 1728 return GL_RGB8_SNORM; 1729 case GL_RG_SNORM: 1730 return GL_RG8_SNORM; 1731 case GL_RED_SNORM: 1732 return GL_R8_SNORM; 1733 case GL_LUMINANCE_ALPHA_SNORM: 1734 return GL_LUMINANCE8_ALPHA8_SNORM; 1735 case GL_LUMINANCE_SNORM: 1736 return GL_LUMINANCE8_SNORM; 1737 case GL_ALPHA_SNORM: 1738 return GL_ALPHA8_SNORM; 1739 case GL_INTENSITY_SNORM: 1740 return GL_INTENSITY8_SNORM; 1741 1742 default: 1743 return format; 1744 } 1745} 1746 1747 1748/** 1749 * Convert an sRGB internal format to linear. 1750 */ 1751GLenum 1752_mesa_get_linear_internalformat(GLenum format) 1753{ 1754 switch (format) { 1755 case GL_SRGB: 1756 return GL_RGB; 1757 case GL_SRGB_ALPHA: 1758 return GL_RGBA; 1759 case GL_SRGB8: 1760 return GL_RGB8; 1761 case GL_SRGB8_ALPHA8: 1762 return GL_RGBA8; 1763 case GL_SLUMINANCE8: 1764 return GL_LUMINANCE8; 1765 case GL_SLUMINANCE: 1766 return GL_LUMINANCE; 1767 case GL_SLUMINANCE_ALPHA: 1768 return GL_LUMINANCE_ALPHA; 1769 case GL_SLUMINANCE8_ALPHA8: 1770 return GL_LUMINANCE8_ALPHA8; 1771 default: 1772 return format; 1773 } 1774} 1775 1776 1777/** 1778 * Do error checking of format/type combinations for glReadPixels, 1779 * glDrawPixels and glTex[Sub]Image. Note that depending on the format 1780 * and type values, we may either generate GL_INVALID_OPERATION or 1781 * GL_INVALID_ENUM. 1782 * 1783 * \param format pixel format. 1784 * \param type pixel type. 1785 * 1786 * \return GL_INVALID_ENUM, GL_INVALID_OPERATION or GL_NO_ERROR 1787 */ 1788GLenum 1789_mesa_error_check_format_and_type(const struct gl_context *ctx, 1790 GLenum format, GLenum type) 1791{ 1792 /* From OpenGL 3.3 spec, page 220: 1793 * "If the format is DEPTH_STENCIL, then values are taken from 1794 * both the depth buffer and the stencil buffer. If there is no 1795 * depth buffer or if there is no stencil buffer, then the error 1796 * INVALID_OPERATION occurs. If the type parameter is not 1797 * UNSIGNED_INT_24_8 or FLOAT_32_UNSIGNED_INT_24_8_REV, then the 1798 * error INVALID_ENUM occurs." 1799 * 1800 * OpenGL ES still generates GL_INVALID_OPERATION because glReadPixels 1801 * cannot be used to read depth or stencil in that API. 1802 */ 1803 if (_mesa_is_desktop_gl(ctx) && format == GL_DEPTH_STENCIL 1804 && type != GL_UNSIGNED_INT_24_8 1805 && type != GL_FLOAT_32_UNSIGNED_INT_24_8_REV) 1806 return GL_INVALID_ENUM; 1807 1808 /* special type-based checks (see glReadPixels, glDrawPixels error lists) */ 1809 switch (type) { 1810 case GL_BITMAP: 1811 if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) { 1812 return GL_INVALID_ENUM; 1813 } 1814 break; 1815 1816 case GL_UNSIGNED_BYTE_3_3_2: 1817 case GL_UNSIGNED_BYTE_2_3_3_REV: 1818 case GL_UNSIGNED_SHORT_5_6_5: 1819 case GL_UNSIGNED_SHORT_5_6_5_REV: 1820 if (format == GL_RGB) { 1821 break; /* OK */ 1822 } 1823 if (format == GL_RGB_INTEGER_EXT && 1824 _mesa_has_texture_rgb10_a2ui(ctx)) { 1825 break; /* OK */ 1826 } 1827 return GL_INVALID_OPERATION; 1828 1829 case GL_UNSIGNED_SHORT_4_4_4_4: 1830 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1831 case GL_UNSIGNED_INT_8_8_8_8: 1832 case GL_UNSIGNED_INT_8_8_8_8_REV: 1833 if (format == GL_RGBA || 1834 format == GL_BGRA || 1835 format == GL_ABGR_EXT) { 1836 break; /* OK */ 1837 } 1838 if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) && 1839 _mesa_has_texture_rgb10_a2ui(ctx)) { 1840 break; /* OK */ 1841 } 1842 return GL_INVALID_OPERATION; 1843 1844 case GL_UNSIGNED_SHORT_5_5_5_1: 1845 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1846 case GL_UNSIGNED_INT_10_10_10_2: 1847 case GL_UNSIGNED_INT_2_10_10_10_REV: 1848 if (format == GL_RGBA || 1849 format == GL_BGRA) { 1850 break; /* OK */ 1851 } 1852 if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) && 1853 _mesa_has_texture_rgb10_a2ui(ctx)) { 1854 break; /* OK */ 1855 } 1856 if (type == GL_UNSIGNED_INT_2_10_10_10_REV && format == GL_RGB && 1857 ctx->API == API_OPENGLES2) { 1858 break; /* OK by GL_EXT_texture_type_2_10_10_10_REV */ 1859 } 1860 return GL_INVALID_OPERATION; 1861 1862 case GL_UNSIGNED_INT_24_8: 1863 /* Depth buffer OK to read in OpenGL ES (NV_read_depth). */ 1864 if (ctx->API == API_OPENGLES2 && format == GL_DEPTH_COMPONENT) 1865 return GL_NO_ERROR; 1866 1867 if (format != GL_DEPTH_STENCIL) { 1868 return GL_INVALID_OPERATION; 1869 } 1870 return GL_NO_ERROR; 1871 1872 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 1873 if (!_mesa_has_float_depth_buffer(ctx)) { 1874 return GL_INVALID_ENUM; 1875 } 1876 if (format != GL_DEPTH_STENCIL) { 1877 return GL_INVALID_OPERATION; 1878 } 1879 return GL_NO_ERROR; 1880 1881 case GL_UNSIGNED_INT_10F_11F_11F_REV: 1882 if (!_mesa_has_packed_float(ctx)) { 1883 return GL_INVALID_ENUM; 1884 } 1885 if (format != GL_RGB) { 1886 return GL_INVALID_OPERATION; 1887 } 1888 return GL_NO_ERROR; 1889 1890 case GL_HALF_FLOAT_OES: 1891 switch (format) { 1892 case GL_RGBA: 1893 case GL_RGB: 1894 case GL_LUMINANCE_ALPHA: 1895 case GL_LUMINANCE: 1896 case GL_ALPHA: 1897 return GL_NO_ERROR; 1898 case GL_RG: 1899 case GL_RED: 1900 if (_mesa_has_rg_textures(ctx)) 1901 return GL_NO_ERROR; 1902 FALLTHROUGH; 1903 default: 1904 return GL_INVALID_OPERATION; 1905 } 1906 1907 default: 1908 ; /* fall-through */ 1909 } 1910 1911 /* now, for each format, check the type for compatibility */ 1912 switch (format) { 1913 case GL_COLOR_INDEX: 1914 case GL_STENCIL_INDEX: 1915 switch (type) { 1916 case GL_BITMAP: 1917 case GL_BYTE: 1918 case GL_UNSIGNED_BYTE: 1919 case GL_SHORT: 1920 case GL_UNSIGNED_SHORT: 1921 case GL_INT: 1922 case GL_UNSIGNED_INT: 1923 case GL_FLOAT: 1924 case GL_HALF_FLOAT: 1925 return GL_NO_ERROR; 1926 default: 1927 return GL_INVALID_ENUM; 1928 } 1929 1930 case GL_RED: 1931 case GL_GREEN: 1932 case GL_BLUE: 1933 case GL_ALPHA: 1934#if 0 /* not legal! see table 3.6 of the 1.5 spec */ 1935 case GL_INTENSITY: 1936#endif 1937 case GL_LUMINANCE: 1938 case GL_LUMINANCE_ALPHA: 1939 case GL_DEPTH_COMPONENT: 1940 switch (type) { 1941 case GL_BYTE: 1942 case GL_UNSIGNED_BYTE: 1943 case GL_SHORT: 1944 case GL_UNSIGNED_SHORT: 1945 case GL_INT: 1946 case GL_UNSIGNED_INT: 1947 case GL_FLOAT: 1948 case GL_HALF_FLOAT: 1949 return GL_NO_ERROR; 1950 default: 1951 return GL_INVALID_ENUM; 1952 } 1953 1954 case GL_RG: 1955 if (!_mesa_has_rg_textures(ctx)) 1956 return GL_INVALID_ENUM; 1957 switch (type) { 1958 case GL_BYTE: 1959 case GL_UNSIGNED_BYTE: 1960 case GL_SHORT: 1961 case GL_UNSIGNED_SHORT: 1962 case GL_INT: 1963 case GL_UNSIGNED_INT: 1964 case GL_FLOAT: 1965 case GL_HALF_FLOAT: 1966 return GL_NO_ERROR; 1967 default: 1968 return GL_INVALID_ENUM; 1969 } 1970 1971 case GL_RGB: 1972 switch (type) { 1973 case GL_BYTE: 1974 case GL_UNSIGNED_BYTE: 1975 case GL_SHORT: 1976 case GL_UNSIGNED_SHORT: 1977 case GL_INT: 1978 case GL_UNSIGNED_INT: 1979 case GL_FLOAT: 1980 case GL_UNSIGNED_BYTE_3_3_2: 1981 case GL_UNSIGNED_BYTE_2_3_3_REV: 1982 case GL_UNSIGNED_SHORT_5_6_5: 1983 case GL_UNSIGNED_SHORT_5_6_5_REV: 1984 case GL_HALF_FLOAT: 1985 return GL_NO_ERROR; 1986 case GL_UNSIGNED_INT_2_10_10_10_REV: 1987 /* OK by GL_EXT_texture_type_2_10_10_10_REV */ 1988 return (ctx->API == API_OPENGLES2) 1989 ? GL_NO_ERROR : GL_INVALID_ENUM; 1990 case GL_UNSIGNED_INT_5_9_9_9_REV: 1991 return _mesa_has_texture_shared_exponent(ctx) 1992 ? GL_NO_ERROR : GL_INVALID_ENUM; 1993 case GL_UNSIGNED_INT_10F_11F_11F_REV: 1994 return _mesa_has_packed_float(ctx) 1995 ? GL_NO_ERROR : GL_INVALID_ENUM; 1996 default: 1997 return GL_INVALID_ENUM; 1998 } 1999 2000 case GL_BGR: 2001 switch (type) { 2002 /* NOTE: no packed types are supported with BGR. That's 2003 * intentional, according to the GL spec. 2004 */ 2005 case GL_BYTE: 2006 case GL_UNSIGNED_BYTE: 2007 case GL_SHORT: 2008 case GL_UNSIGNED_SHORT: 2009 case GL_INT: 2010 case GL_UNSIGNED_INT: 2011 case GL_FLOAT: 2012 case GL_HALF_FLOAT: 2013 return GL_NO_ERROR; 2014 default: 2015 return GL_INVALID_ENUM; 2016 } 2017 2018 case GL_RGBA: 2019 case GL_BGRA: 2020 switch (type) { 2021 case GL_BYTE: 2022 case GL_UNSIGNED_BYTE: 2023 case GL_SHORT: 2024 case GL_UNSIGNED_SHORT: 2025 case GL_INT: 2026 case GL_UNSIGNED_INT: 2027 case GL_FLOAT: 2028 case GL_UNSIGNED_SHORT_4_4_4_4: 2029 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2030 case GL_UNSIGNED_SHORT_5_5_5_1: 2031 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2032 case GL_UNSIGNED_INT_8_8_8_8: 2033 case GL_UNSIGNED_INT_8_8_8_8_REV: 2034 case GL_UNSIGNED_INT_10_10_10_2: 2035 case GL_UNSIGNED_INT_2_10_10_10_REV: 2036 case GL_HALF_FLOAT: 2037 return GL_NO_ERROR; 2038 default: 2039 return GL_INVALID_ENUM; 2040 } 2041 2042 case GL_ABGR_EXT: 2043 switch (type) { 2044 case GL_BYTE: 2045 case GL_UNSIGNED_BYTE: 2046 case GL_SHORT: 2047 case GL_UNSIGNED_SHORT: 2048 case GL_INT: 2049 case GL_UNSIGNED_INT: 2050 case GL_FLOAT: 2051 case GL_UNSIGNED_SHORT_4_4_4_4: 2052 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2053 case GL_UNSIGNED_INT_8_8_8_8: 2054 case GL_UNSIGNED_INT_8_8_8_8_REV: 2055 case GL_HALF_FLOAT: 2056 return GL_NO_ERROR; 2057 default: 2058 return GL_INVALID_ENUM; 2059 } 2060 2061 case GL_YCBCR_MESA: 2062 if (!_mesa_has_MESA_ycbcr_texture(ctx)) 2063 return GL_INVALID_ENUM; 2064 if (type == GL_UNSIGNED_SHORT_8_8_MESA || 2065 type == GL_UNSIGNED_SHORT_8_8_REV_MESA) 2066 return GL_NO_ERROR; 2067 else 2068 return GL_INVALID_OPERATION; 2069 2070 case GL_DEPTH_STENCIL: 2071 if (type == GL_UNSIGNED_INT_24_8) 2072 return GL_NO_ERROR; 2073 else if (_mesa_has_float_depth_buffer(ctx) && 2074 type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) 2075 return GL_NO_ERROR; 2076 else 2077 return GL_INVALID_ENUM; 2078 2079 /* integer-valued formats */ 2080 case GL_RED_INTEGER_EXT: 2081 case GL_GREEN_INTEGER_EXT: 2082 case GL_BLUE_INTEGER_EXT: 2083 case GL_ALPHA_INTEGER_EXT: 2084 case GL_RG_INTEGER: 2085 switch (type) { 2086 case GL_BYTE: 2087 case GL_UNSIGNED_BYTE: 2088 case GL_SHORT: 2089 case GL_UNSIGNED_SHORT: 2090 case GL_INT: 2091 case GL_UNSIGNED_INT: 2092 return _mesa_has_integer_textures(ctx) 2093 ? GL_NO_ERROR : GL_INVALID_ENUM; 2094 default: 2095 return GL_INVALID_ENUM; 2096 } 2097 2098 case GL_RGB_INTEGER_EXT: 2099 switch (type) { 2100 case GL_BYTE: 2101 case GL_UNSIGNED_BYTE: 2102 case GL_SHORT: 2103 case GL_UNSIGNED_SHORT: 2104 case GL_INT: 2105 case GL_UNSIGNED_INT: 2106 return _mesa_has_integer_textures(ctx) 2107 ? GL_NO_ERROR : GL_INVALID_ENUM; 2108 case GL_UNSIGNED_BYTE_3_3_2: 2109 case GL_UNSIGNED_BYTE_2_3_3_REV: 2110 case GL_UNSIGNED_SHORT_5_6_5: 2111 case GL_UNSIGNED_SHORT_5_6_5_REV: 2112 return _mesa_has_texture_rgb10_a2ui(ctx) 2113 ? GL_NO_ERROR : GL_INVALID_ENUM; 2114 default: 2115 return GL_INVALID_ENUM; 2116 } 2117 2118 case GL_BGR_INTEGER_EXT: 2119 switch (type) { 2120 case GL_BYTE: 2121 case GL_UNSIGNED_BYTE: 2122 case GL_SHORT: 2123 case GL_UNSIGNED_SHORT: 2124 case GL_INT: 2125 case GL_UNSIGNED_INT: 2126 /* NOTE: no packed formats w/ BGR format */ 2127 return _mesa_has_integer_textures(ctx) 2128 ? GL_NO_ERROR : GL_INVALID_ENUM; 2129 default: 2130 return GL_INVALID_ENUM; 2131 } 2132 2133 case GL_RGBA_INTEGER_EXT: 2134 case GL_BGRA_INTEGER_EXT: 2135 switch (type) { 2136 case GL_BYTE: 2137 case GL_UNSIGNED_BYTE: 2138 case GL_SHORT: 2139 case GL_UNSIGNED_SHORT: 2140 case GL_INT: 2141 case GL_UNSIGNED_INT: 2142 return _mesa_has_integer_textures(ctx) 2143 ? GL_NO_ERROR : GL_INVALID_ENUM; 2144 case GL_UNSIGNED_SHORT_4_4_4_4: 2145 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2146 case GL_UNSIGNED_SHORT_5_5_5_1: 2147 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2148 case GL_UNSIGNED_INT_8_8_8_8: 2149 case GL_UNSIGNED_INT_8_8_8_8_REV: 2150 case GL_UNSIGNED_INT_10_10_10_2: 2151 case GL_UNSIGNED_INT_2_10_10_10_REV: 2152 return _mesa_has_texture_rgb10_a2ui(ctx) 2153 ? GL_NO_ERROR : GL_INVALID_ENUM; 2154 default: 2155 return GL_INVALID_ENUM; 2156 } 2157 2158 case GL_LUMINANCE_INTEGER_EXT: 2159 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2160 switch (type) { 2161 case GL_BYTE: 2162 case GL_UNSIGNED_BYTE: 2163 case GL_SHORT: 2164 case GL_UNSIGNED_SHORT: 2165 case GL_INT: 2166 case GL_UNSIGNED_INT: 2167 return _mesa_has_integer_textures(ctx) 2168 ? GL_NO_ERROR : GL_INVALID_ENUM; 2169 default: 2170 return GL_INVALID_ENUM; 2171 } 2172 2173 default: 2174 return GL_INVALID_ENUM; 2175 } 2176 return GL_NO_ERROR; 2177} 2178 2179 2180/** 2181 * Do error checking of format/type combinations for OpenGL ES glReadPixels 2182 * and glTex[Sub]Image. 2183 * \return error code, or GL_NO_ERROR. 2184 */ 2185GLenum 2186_mesa_es_error_check_format_and_type(const struct gl_context *ctx, 2187 GLenum format, GLenum type, 2188 unsigned dimensions) 2189{ 2190 GLboolean type_valid = GL_TRUE; 2191 2192 switch (format) { 2193 case GL_RED: 2194 case GL_RG: 2195 if (!_mesa_has_rg_textures(ctx)) 2196 return GL_INVALID_VALUE; 2197 FALLTHROUGH; 2198 case GL_ALPHA: 2199 case GL_LUMINANCE: 2200 case GL_LUMINANCE_ALPHA: 2201 type_valid = (type == GL_UNSIGNED_BYTE 2202 || type == GL_FLOAT 2203 || type == GL_HALF_FLOAT_OES); 2204 break; 2205 2206 case GL_RGB: 2207 type_valid = (type == GL_UNSIGNED_BYTE 2208 || type == GL_UNSIGNED_SHORT_5_6_5 2209 || type == GL_FLOAT 2210 || type == GL_HALF_FLOAT_OES); 2211 break; 2212 2213 case GL_RGBA: 2214 type_valid = (type == GL_UNSIGNED_BYTE 2215 || type == GL_UNSIGNED_SHORT_4_4_4_4 2216 || type == GL_UNSIGNED_SHORT_5_5_5_1 2217 || type == GL_FLOAT 2218 || type == GL_HALF_FLOAT_OES 2219 || (_mesa_has_texture_type_2_10_10_10_REV(ctx) && 2220 type == GL_UNSIGNED_INT_2_10_10_10_REV)); 2221 break; 2222 2223 case GL_DEPTH_COMPONENT: 2224 /* This format is filtered against invalid dimensionalities elsewhere. 2225 */ 2226 type_valid = (type == GL_UNSIGNED_SHORT 2227 || type == GL_UNSIGNED_INT); 2228 break; 2229 2230 case GL_DEPTH_STENCIL: 2231 /* This format is filtered against invalid dimensionalities elsewhere. 2232 */ 2233 type_valid = (type == GL_UNSIGNED_INT_24_8); 2234 break; 2235 2236 case GL_BGRA_EXT: 2237 type_valid = (type == GL_UNSIGNED_BYTE); 2238 2239 /* This feels like a bug in the EXT_texture_format_BGRA8888 spec, but 2240 * the format does not appear to be allowed for 3D textures in OpenGL 2241 * ES. 2242 */ 2243 if (dimensions != 2) 2244 return GL_INVALID_VALUE; 2245 2246 break; 2247 2248 default: 2249 return GL_INVALID_VALUE; 2250 } 2251 2252 return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION; 2253} 2254 2255/** 2256 * Return the simple base format for a given internal texture format. 2257 * For example, given GL_LUMINANCE12_ALPHA4, return GL_LUMINANCE_ALPHA. 2258 * 2259 * \param ctx GL context. 2260 * \param internalFormat the internal texture format token or 1, 2, 3, or 4. 2261 * 2262 * \return the corresponding \u base internal format (GL_ALPHA, GL_LUMINANCE, 2263 * GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA), or -1 if invalid enum. 2264 * 2265 * This is the format which is used during texture application (i.e. the 2266 * texture format and env mode determine the arithmetic used. 2267 */ 2268GLint 2269_mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) 2270{ 2271 switch (internalFormat) { 2272 case GL_ALPHA: 2273 case GL_ALPHA4: 2274 case GL_ALPHA8: 2275 case GL_ALPHA12: 2276 case GL_ALPHA16: 2277 return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2278 case 1: 2279 case GL_LUMINANCE: 2280 case GL_LUMINANCE4: 2281 case GL_LUMINANCE8: 2282 case GL_LUMINANCE12: 2283 case GL_LUMINANCE16: 2284 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2285 case 2: 2286 case GL_LUMINANCE_ALPHA: 2287 case GL_LUMINANCE4_ALPHA4: 2288 case GL_LUMINANCE6_ALPHA2: 2289 case GL_LUMINANCE8_ALPHA8: 2290 case GL_LUMINANCE12_ALPHA4: 2291 case GL_LUMINANCE12_ALPHA12: 2292 case GL_LUMINANCE16_ALPHA16: 2293 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2294 case GL_INTENSITY: 2295 case GL_INTENSITY4: 2296 case GL_INTENSITY8: 2297 case GL_INTENSITY12: 2298 case GL_INTENSITY16: 2299 return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2300 case 3: 2301 return (ctx->API != API_OPENGL_CORE) ? GL_RGB : -1; 2302 case GL_RGB: 2303 case GL_R3_G3_B2: 2304 case GL_RGB4: 2305 case GL_RGB5: 2306 case GL_RGB8: 2307 case GL_RGB10: 2308 case GL_RGB12: 2309 case GL_RGB16: 2310 return GL_RGB; 2311 case 4: 2312 return (ctx->API != API_OPENGL_CORE) ? GL_RGBA : -1; 2313 case GL_RGBA: 2314 case GL_RGBA2: 2315 case GL_RGBA4: 2316 case GL_RGB5_A1: 2317 case GL_RGBA8: 2318 case GL_RGB10_A2: 2319 case GL_RGBA12: 2320 case GL_RGBA16: 2321 return GL_RGBA; 2322 default: 2323 ; /* fallthrough */ 2324 } 2325 2326 /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0). 2327 */ 2328 if (_mesa_is_gles(ctx)) { 2329 switch (internalFormat) { 2330 case GL_BGRA: 2331 return GL_RGBA; 2332 default: 2333 ; /* fallthrough */ 2334 } 2335 } 2336 2337 if (_mesa_has_ARB_ES2_compatibility(ctx) || 2338 _mesa_has_OES_framebuffer_object(ctx) || 2339 ctx->API == API_OPENGLES2) { 2340 switch (internalFormat) { 2341 case GL_RGB565: 2342 return GL_RGB; 2343 default: 2344 ; /* fallthrough */ 2345 } 2346 } 2347 2348 if (ctx->API != API_OPENGLES) { 2349 switch (internalFormat) { 2350 case GL_DEPTH_COMPONENT: 2351 case GL_DEPTH_COMPONENT16: 2352 case GL_DEPTH_COMPONENT24: 2353 case GL_DEPTH_COMPONENT32: 2354 return GL_DEPTH_COMPONENT; 2355 case GL_DEPTH_STENCIL: 2356 case GL_DEPTH24_STENCIL8: 2357 return GL_DEPTH_STENCIL; 2358 default: 2359 ; /* fallthrough */ 2360 } 2361 } 2362 2363 if (_mesa_has_ARB_texture_stencil8(ctx) || 2364 _mesa_has_OES_texture_stencil8(ctx)) { 2365 switch (internalFormat) { 2366 case GL_STENCIL_INDEX: 2367 case GL_STENCIL_INDEX1: 2368 case GL_STENCIL_INDEX4: 2369 case GL_STENCIL_INDEX8: 2370 case GL_STENCIL_INDEX16: 2371 return GL_STENCIL_INDEX; 2372 default: 2373 ; /* fallthrough */ 2374 } 2375 } 2376 2377 switch (internalFormat) { 2378 case GL_COMPRESSED_ALPHA: 2379 return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2380 case GL_COMPRESSED_LUMINANCE: 2381 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2382 case GL_COMPRESSED_LUMINANCE_ALPHA: 2383 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2384 case GL_COMPRESSED_INTENSITY: 2385 return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2386 case GL_COMPRESSED_RGB: 2387 return GL_RGB; 2388 case GL_COMPRESSED_RGBA: 2389 return GL_RGBA; 2390 default: 2391 ; /* fallthrough */ 2392 } 2393 2394 if (_mesa_is_compressed_format(ctx, internalFormat)) { 2395 GLenum base_compressed = 2396 _mesa_gl_compressed_format_base_format(internalFormat); 2397 if (base_compressed) 2398 return base_compressed; 2399 } 2400 2401 if ((_mesa_has_KHR_texture_compression_astc_ldr(ctx) && 2402 is_astc_2d_format(internalFormat)) || 2403 (_mesa_has_OES_texture_compression_astc(ctx) && 2404 is_astc_3d_format(internalFormat))) 2405 return GL_RGBA; 2406 2407 if (_mesa_has_MESA_ycbcr_texture(ctx)) { 2408 if (internalFormat == GL_YCBCR_MESA) 2409 return GL_YCBCR_MESA; 2410 } 2411 2412 if (_mesa_has_half_float_textures(ctx)) { 2413 switch (internalFormat) { 2414 case GL_ALPHA16F_ARB: 2415 return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2416 case GL_RGBA16F_ARB: 2417 return GL_RGBA; 2418 case GL_RGB16F_ARB: 2419 return GL_RGB; 2420 case GL_INTENSITY16F_ARB: 2421 return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2422 case GL_LUMINANCE16F_ARB: 2423 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2424 case GL_LUMINANCE_ALPHA16F_ARB: 2425 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2426 } 2427 } 2428 2429 if (_mesa_has_float_textures(ctx)) { 2430 switch (internalFormat) { 2431 case GL_ALPHA32F_ARB: 2432 return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2433 case GL_RGBA32F_ARB: 2434 return GL_RGBA; 2435 case GL_RGB32F_ARB: 2436 return GL_RGB; 2437 case GL_INTENSITY32F_ARB: 2438 return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2439 case GL_LUMINANCE32F_ARB: 2440 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2441 case GL_LUMINANCE_ALPHA32F_ARB: 2442 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2443 } 2444 } 2445 2446 if (_mesa_has_EXT_texture_snorm(ctx) || _mesa_is_gles3(ctx)) { 2447 switch (internalFormat) { 2448 case GL_RED_SNORM: 2449 case GL_R8_SNORM: 2450 case GL_R16_SNORM: 2451 return GL_RED; 2452 case GL_RG_SNORM: 2453 case GL_RG8_SNORM: 2454 case GL_RG16_SNORM: 2455 return GL_RG; 2456 case GL_RGB_SNORM: 2457 case GL_RGB8_SNORM: 2458 case GL_RGB16_SNORM: 2459 return GL_RGB; 2460 case GL_RGBA_SNORM: 2461 case GL_RGBA8_SNORM: 2462 case GL_RGBA16_SNORM: 2463 return GL_RGBA; 2464 case GL_ALPHA_SNORM: 2465 case GL_ALPHA8_SNORM: 2466 case GL_ALPHA16_SNORM: 2467 return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2468 case GL_LUMINANCE_SNORM: 2469 case GL_LUMINANCE8_SNORM: 2470 case GL_LUMINANCE16_SNORM: 2471 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2472 case GL_LUMINANCE_ALPHA_SNORM: 2473 case GL_LUMINANCE8_ALPHA8_SNORM: 2474 case GL_LUMINANCE16_ALPHA16_SNORM: 2475 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2476 case GL_INTENSITY_SNORM: 2477 case GL_INTENSITY8_SNORM: 2478 case GL_INTENSITY16_SNORM: 2479 return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2480 default: 2481 ; /* fallthrough */ 2482 } 2483 } 2484 2485 if (_mesa_has_EXT_texture_sRGB(ctx) || _mesa_is_gles3(ctx)) { 2486 switch (internalFormat) { 2487 case GL_SRGB_EXT: 2488 case GL_SRGB8_EXT: 2489 case GL_COMPRESSED_SRGB_EXT: 2490 return GL_RGB; 2491 case GL_SRGB_ALPHA_EXT: 2492 case GL_SRGB8_ALPHA8_EXT: 2493 case GL_COMPRESSED_SRGB_ALPHA_EXT: 2494 return GL_RGBA; 2495 case GL_SLUMINANCE_ALPHA_EXT: 2496 case GL_SLUMINANCE8_ALPHA8_EXT: 2497 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 2498 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2499 case GL_SLUMINANCE_EXT: 2500 case GL_SLUMINANCE8_EXT: 2501 case GL_COMPRESSED_SLUMINANCE_EXT: 2502 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2503 default: 2504 ; /* fallthrough */ 2505 } 2506 } 2507 2508 if (_mesa_has_EXT_texture_sRGB_R8(ctx)) { 2509 switch (internalFormat) { 2510 case GL_SR8_EXT: 2511 return GL_RED; 2512 default: 2513 ; /* fallthrough */ 2514 } 2515 } 2516 2517 if (_mesa_has_EXT_texture_sRGB_RG8(ctx)) { 2518 switch (internalFormat) { 2519 case GL_SRG8_EXT: 2520 return GL_RG; 2521 default: 2522 ; /* fallthrough */ 2523 } 2524 } 2525 2526 if (_mesa_has_integer_textures(ctx)) { 2527 switch (internalFormat) { 2528 case GL_RGBA8UI_EXT: 2529 case GL_RGBA16UI_EXT: 2530 case GL_RGBA32UI_EXT: 2531 case GL_RGBA8I_EXT: 2532 case GL_RGBA16I_EXT: 2533 case GL_RGBA32I_EXT: 2534 return GL_RGBA; 2535 case GL_RGB8UI_EXT: 2536 case GL_RGB16UI_EXT: 2537 case GL_RGB32UI_EXT: 2538 case GL_RGB8I_EXT: 2539 case GL_RGB16I_EXT: 2540 case GL_RGB32I_EXT: 2541 return GL_RGB; 2542 } 2543 } 2544 2545 if (_mesa_has_texture_rgb10_a2ui(ctx)) { 2546 switch (internalFormat) { 2547 case GL_RGB10_A2UI: 2548 return GL_RGBA; 2549 } 2550 } 2551 2552 if (_mesa_has_integer_textures(ctx)) { 2553 switch (internalFormat) { 2554 case GL_ALPHA8UI_EXT: 2555 case GL_ALPHA16UI_EXT: 2556 case GL_ALPHA32UI_EXT: 2557 case GL_ALPHA8I_EXT: 2558 case GL_ALPHA16I_EXT: 2559 case GL_ALPHA32I_EXT: 2560 return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2561 case GL_INTENSITY8UI_EXT: 2562 case GL_INTENSITY16UI_EXT: 2563 case GL_INTENSITY32UI_EXT: 2564 case GL_INTENSITY8I_EXT: 2565 case GL_INTENSITY16I_EXT: 2566 case GL_INTENSITY32I_EXT: 2567 return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2568 case GL_LUMINANCE8UI_EXT: 2569 case GL_LUMINANCE16UI_EXT: 2570 case GL_LUMINANCE32UI_EXT: 2571 case GL_LUMINANCE8I_EXT: 2572 case GL_LUMINANCE16I_EXT: 2573 case GL_LUMINANCE32I_EXT: 2574 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2575 case GL_LUMINANCE_ALPHA8UI_EXT: 2576 case GL_LUMINANCE_ALPHA16UI_EXT: 2577 case GL_LUMINANCE_ALPHA32UI_EXT: 2578 case GL_LUMINANCE_ALPHA8I_EXT: 2579 case GL_LUMINANCE_ALPHA16I_EXT: 2580 case GL_LUMINANCE_ALPHA32I_EXT: 2581 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2582 default: 2583 ; /* fallthrough */ 2584 } 2585 } 2586 2587 if (_mesa_has_rg_textures(ctx)) { 2588 switch (internalFormat) { 2589 case GL_R16F: 2590 if (!_mesa_has_half_float_textures(ctx)) 2591 break; 2592 return GL_RED; 2593 case GL_R32F: 2594 if (!_mesa_has_float_textures(ctx)) 2595 break; 2596 return GL_RED; 2597 case GL_R8I: 2598 case GL_R8UI: 2599 case GL_R16I: 2600 case GL_R16UI: 2601 case GL_R32I: 2602 case GL_R32UI: 2603 if (!_mesa_has_integer_textures(ctx)) 2604 break; 2605 FALLTHROUGH; 2606 case GL_R8: 2607 case GL_R16: 2608 case GL_RED: 2609 case GL_COMPRESSED_RED: 2610 return GL_RED; 2611 2612 case GL_RG16F: 2613 if (!_mesa_has_half_float_textures(ctx)) 2614 break; 2615 return GL_RG; 2616 case GL_RG32F: 2617 if (!_mesa_has_float_textures(ctx)) 2618 break; 2619 return GL_RG; 2620 case GL_RG8I: 2621 case GL_RG8UI: 2622 case GL_RG16I: 2623 case GL_RG16UI: 2624 case GL_RG32I: 2625 case GL_RG32UI: 2626 if (!_mesa_has_integer_textures(ctx)) 2627 break; 2628 FALLTHROUGH; 2629 case GL_RG: 2630 case GL_RG8: 2631 case GL_RG16: 2632 case GL_COMPRESSED_RG: 2633 return GL_RG; 2634 default: 2635 ; /* fallthrough */ 2636 } 2637 } 2638 2639 if (_mesa_has_texture_shared_exponent(ctx)) { 2640 switch (internalFormat) { 2641 case GL_RGB9_E5_EXT: 2642 return GL_RGB; 2643 default: 2644 ; /* fallthrough */ 2645 } 2646 } 2647 2648 if (_mesa_has_packed_float(ctx)) { 2649 switch (internalFormat) { 2650 case GL_R11F_G11F_B10F_EXT: 2651 return GL_RGB; 2652 default: 2653 ; /* fallthrough */ 2654 } 2655 } 2656 2657 if (_mesa_has_float_depth_buffer(ctx)) { 2658 switch (internalFormat) { 2659 case GL_DEPTH_COMPONENT32F: 2660 return GL_DEPTH_COMPONENT; 2661 case GL_DEPTH32F_STENCIL8: 2662 return GL_DEPTH_STENCIL; 2663 default: 2664 ; /* fallthrough */ 2665 } 2666 } 2667 2668 return -1; /* error */ 2669} 2670 2671/** 2672 * Returns the effective internal format from a texture format and type. 2673 * This is used by texture image operations internally for validation, when 2674 * the specified internal format is a base (unsized) format. 2675 * 2676 * This method will only return a valid effective internal format if the 2677 * combination of format, type and internal format in base form, is acceptable. 2678 * 2679 * If a single sized internal format is defined in the spec (OpenGL-ES 3.0.4) or 2680 * in extensions, to unambiguously correspond to the given base format, then 2681 * that internal format is returned as the effective. Otherwise, if the 2682 * combination is accepted but a single effective format is not defined, the 2683 * passed base format will be returned instead. 2684 * 2685 * \param format the texture format 2686 * \param type the texture type 2687 */ 2688static GLenum 2689gles_effective_internal_format_for_format_and_type(GLenum format, 2690 GLenum type) 2691{ 2692 switch (type) { 2693 case GL_UNSIGNED_BYTE: 2694 switch (format) { 2695 case GL_RGBA: 2696 return GL_RGBA8; 2697 case GL_RGB: 2698 return GL_RGB8; 2699 case GL_RG: 2700 return GL_RG8; 2701 case GL_RED: 2702 return GL_R8; 2703 /* Although LUMINANCE_ALPHA, LUMINANCE and ALPHA appear in table 3.12, 2704 * (section 3.8 Texturing, page 128 of the OpenGL-ES 3.0.4) as effective 2705 * internal formats, they do not correspond to GL constants, so the base 2706 * format is returned instead. 2707 */ 2708 case GL_BGRA_EXT: 2709 case GL_LUMINANCE_ALPHA: 2710 case GL_LUMINANCE: 2711 case GL_ALPHA: 2712 return format; 2713 } 2714 break; 2715 2716 case GL_UNSIGNED_SHORT_4_4_4_4: 2717 if (format == GL_RGBA) 2718 return GL_RGBA4; 2719 break; 2720 2721 case GL_UNSIGNED_SHORT_5_5_5_1: 2722 if (format == GL_RGBA) 2723 return GL_RGB5_A1; 2724 break; 2725 2726 case GL_UNSIGNED_SHORT_5_6_5: 2727 if (format == GL_RGB) 2728 return GL_RGB565; 2729 break; 2730 2731 /* OES_packed_depth_stencil */ 2732 case GL_UNSIGNED_INT_24_8: 2733 if (format == GL_DEPTH_STENCIL) 2734 return GL_DEPTH24_STENCIL8; 2735 break; 2736 2737 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 2738 if (format == GL_DEPTH_STENCIL) 2739 return GL_DEPTH32F_STENCIL8; 2740 break; 2741 2742 case GL_UNSIGNED_SHORT: 2743 if (format == GL_DEPTH_COMPONENT) 2744 return GL_DEPTH_COMPONENT16; 2745 break; 2746 2747 case GL_UNSIGNED_INT: 2748 /* It can be DEPTH_COMPONENT16 or DEPTH_COMPONENT24, so just return 2749 * the format. 2750 */ 2751 if (format == GL_DEPTH_COMPONENT) 2752 return format; 2753 break; 2754 2755 /* OES_texture_float and OES_texture_half_float */ 2756 case GL_FLOAT: 2757 if (format == GL_DEPTH_COMPONENT) 2758 return GL_DEPTH_COMPONENT32F; 2759 FALLTHROUGH; 2760 case GL_HALF_FLOAT_OES: 2761 switch (format) { 2762 case GL_RGBA: 2763 case GL_RGB: 2764 case GL_LUMINANCE_ALPHA: 2765 case GL_LUMINANCE: 2766 case GL_ALPHA: 2767 case GL_RED: 2768 case GL_RG: 2769 return format; 2770 } 2771 break; 2772 case GL_HALF_FLOAT: 2773 switch (format) { 2774 case GL_RG: 2775 case GL_RED: 2776 return format; 2777 } 2778 break; 2779 2780 /* GL_EXT_texture_type_2_10_10_10_REV */ 2781 case GL_UNSIGNED_INT_2_10_10_10_REV: 2782 switch (format) { 2783 case GL_RGBA: 2784 case GL_RGB: 2785 return format; 2786 } 2787 break; 2788 2789 default: 2790 /* fall through and return NONE */ 2791 break; 2792 } 2793 2794 return GL_NONE; 2795} 2796 2797/** 2798 * Error checking if internalformat for glTex[Sub]Image is valid 2799 * within OpenGL ES 3.2 (or introduced by an ES extension). 2800 * 2801 * Note, further checks in _mesa_gles_error_check_format_and_type 2802 * are required for complete checking between format and type. 2803 */ 2804static GLenum 2805_mesa_gles_check_internalformat(const struct gl_context *ctx, 2806 GLenum internalFormat) 2807{ 2808 switch (internalFormat) { 2809 /* OpenGL ES 2.0 */ 2810 case GL_ALPHA: 2811 case GL_LUMINANCE: 2812 case GL_LUMINANCE_ALPHA: 2813 case GL_RGB: 2814 case GL_RGBA: 2815 2816 /* GL_OES_depth_texture */ 2817 case GL_DEPTH_COMPONENT: 2818 2819 /* GL_EXT_texture_format_BGRA8888 */ 2820 case GL_BGRA: 2821 2822 /* GL_OES_required_internalformat */ 2823 case GL_RGB565: 2824 case GL_RGB8: 2825 case GL_RGBA4: 2826 case GL_RGB5_A1: 2827 case GL_RGBA8: 2828 case GL_DEPTH_COMPONENT16: 2829 case GL_DEPTH_COMPONENT24: 2830 case GL_DEPTH_COMPONENT32: 2831 case GL_DEPTH24_STENCIL8: 2832 case GL_RGB10_EXT: 2833 case GL_RGB10_A2_EXT: 2834 case GL_ALPHA8: 2835 case GL_LUMINANCE8: 2836 case GL_LUMINANCE8_ALPHA8: 2837 case GL_LUMINANCE4_ALPHA4: 2838 return GL_NO_ERROR; 2839 2840 case GL_R8: 2841 case GL_RG8: 2842 case GL_RED: 2843 case GL_RG: 2844 if (!_mesa_has_rg_textures(ctx)) 2845 return GL_INVALID_VALUE; 2846 return GL_NO_ERROR; 2847 2848 /* GL_OES_texture_stencil8 */ 2849 case GL_STENCIL_INDEX8: 2850 if (!_mesa_has_OES_texture_stencil8(ctx)) 2851 return GL_INVALID_VALUE; 2852 return GL_NO_ERROR; 2853 2854 case GL_COMPRESSED_RGBA_BPTC_UNORM: 2855 case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: 2856 case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: 2857 case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: 2858 if (!_mesa_has_EXT_texture_compression_bptc(ctx)) 2859 return GL_INVALID_VALUE; 2860 return GL_NO_ERROR; 2861 2862 case GL_COMPRESSED_RED_RGTC1: 2863 case GL_COMPRESSED_SIGNED_RED_RGTC1: 2864 case GL_COMPRESSED_RED_GREEN_RGTC2_EXT: 2865 case GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT: 2866 if (!_mesa_has_EXT_texture_compression_rgtc(ctx)) 2867 return GL_INVALID_VALUE; 2868 return GL_NO_ERROR; 2869 2870 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 2871 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 2872 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 2873 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 2874 if (!_mesa_has_EXT_texture_compression_s3tc(ctx)) 2875 return GL_INVALID_VALUE; 2876 return GL_NO_ERROR; 2877 2878 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 2879 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 2880 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 2881 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 2882 if (!_mesa_has_EXT_texture_compression_s3tc_srgb(ctx)) 2883 return GL_INVALID_VALUE; 2884 return GL_NO_ERROR; 2885 2886 case GL_R16: 2887 case GL_RG16: 2888 case GL_RGB16: 2889 case GL_RGBA16: 2890 if (!_mesa_has_EXT_texture_norm16(ctx)) 2891 return GL_INVALID_VALUE; 2892 return GL_NO_ERROR; 2893 2894 case GL_R16_SNORM: 2895 case GL_RG16_SNORM: 2896 case GL_RGB16_SNORM: 2897 case GL_RGBA16_SNORM: 2898 if (!_mesa_has_EXT_texture_norm16(ctx) && 2899 !_mesa_has_EXT_texture_snorm(ctx)) 2900 return GL_INVALID_VALUE; 2901 return GL_NO_ERROR; 2902 2903 case GL_SR8_EXT: 2904 if (!_mesa_has_EXT_texture_sRGB_R8(ctx)) 2905 return GL_INVALID_VALUE; 2906 return GL_NO_ERROR; 2907 2908 case GL_SRG8_EXT: 2909 if (!_mesa_has_EXT_texture_sRGB_RG8(ctx)) 2910 return GL_INVALID_VALUE; 2911 return GL_NO_ERROR; 2912 2913 /* OpenGL ES 3.0 */ 2914 case GL_SRGB8_ALPHA8: 2915 case GL_RGBA8_SNORM: 2916 case GL_RGBA16F: 2917 case GL_RGBA32F: 2918 case GL_RGBA8UI: 2919 case GL_RGBA8I: 2920 case GL_RGBA16UI: 2921 case GL_RGBA16I: 2922 case GL_RGBA32UI: 2923 case GL_RGBA32I: 2924 case GL_RGB10_A2UI: 2925 case GL_SRGB8: 2926 case GL_RGB8_SNORM: 2927 case GL_R11F_G11F_B10F: 2928 case GL_RGB9_E5: 2929 case GL_RGB16F: 2930 case GL_RGB32F: 2931 case GL_RGB8UI: 2932 case GL_RGB8I: 2933 case GL_RGB16UI: 2934 case GL_RGB16I: 2935 case GL_RGB32UI: 2936 case GL_RGB32I: 2937 case GL_RG8_SNORM: 2938 case GL_RG16F: 2939 case GL_RG32F: 2940 case GL_RG8UI: 2941 case GL_RG8I: 2942 case GL_RG16UI: 2943 case GL_RG16I: 2944 case GL_RG32UI: 2945 case GL_RG32I: 2946 case GL_R8_SNORM: 2947 case GL_R16F: 2948 case GL_R32F: 2949 case GL_R8UI: 2950 case GL_R8I: 2951 case GL_R16UI: 2952 case GL_R16I: 2953 case GL_R32UI: 2954 case GL_R32I: 2955 case GL_DEPTH_COMPONENT32F: 2956 case GL_DEPTH32F_STENCIL8: 2957 if (!_mesa_is_gles3(ctx)) 2958 return GL_INVALID_VALUE; 2959 return GL_NO_ERROR; 2960 default: 2961 return GL_INVALID_VALUE; 2962 } 2963} 2964 2965/** 2966 * Do error checking of format/type combinations for OpenGL ES 3 2967 * glTex[Sub]Image, or ES1/ES2 with GL_OES_required_internalformat. 2968 * \return error code, or GL_NO_ERROR. 2969 */ 2970GLenum 2971_mesa_gles_error_check_format_and_type(const struct gl_context *ctx, 2972 GLenum format, GLenum type, 2973 GLenum internalFormat) 2974{ 2975 /* If internalFormat is an unsized format, then the effective internal 2976 * format derived from format and type should be used instead. Page 127, 2977 * section "3.8 Texturing" of the GLES 3.0.4 spec states: 2978 * 2979 * "if internalformat is a base internal format, the effective 2980 * internal format is a sized internal format that is derived 2981 * from the format and type for internal use by the GL. 2982 * Table 3.12 specifies the mapping of format and type to effective 2983 * internal formats. The effective internal format is used by the GL 2984 * for purposes such as texture completeness or type checks for 2985 * CopyTex* commands. In these cases, the GL is required to operate 2986 * as if the effective internal format was used as the internalformat 2987 * when specifying the texture data." 2988 */ 2989 if (_mesa_is_enum_format_unsized(internalFormat)) { 2990 GLenum effectiveInternalFormat = 2991 gles_effective_internal_format_for_format_and_type(format, type); 2992 2993 if (effectiveInternalFormat == GL_NONE) 2994 return GL_INVALID_OPERATION; 2995 2996 GLenum baseInternalFormat; 2997 if (internalFormat == GL_BGRA_EXT) { 2998 /* Unfortunately, _mesa_base_tex_format returns a base format of 2999 * GL_RGBA for GL_BGRA_EXT. This makes perfect sense if you're 3000 * asking the question, "what channels does this format have?" 3001 * However, if we're trying to determine if two internal formats 3002 * match in the ES3 sense, we actually want GL_BGRA. 3003 */ 3004 baseInternalFormat = GL_BGRA_EXT; 3005 } else { 3006 baseInternalFormat = 3007 _mesa_base_tex_format(ctx, effectiveInternalFormat); 3008 } 3009 3010 if (internalFormat != baseInternalFormat) 3011 return GL_INVALID_OPERATION; 3012 3013 internalFormat = effectiveInternalFormat; 3014 } 3015 3016 /* The GLES variant of EXT_texture_compression_s3tc is very vague and 3017 * doesn't list valid types. Just do exactly what the spec says. 3018 */ 3019 if (internalFormat == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || 3020 internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT || 3021 internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT || 3022 internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) 3023 return format == GL_RGB || format == GL_RGBA ? GL_NO_ERROR : 3024 GL_INVALID_OPERATION; 3025 3026 /* Before checking for the combination, verify that 3027 * given internalformat is legal for OpenGL ES. 3028 */ 3029 GLenum internal_format_error = 3030 _mesa_gles_check_internalformat(ctx, internalFormat); 3031 3032 if (internal_format_error != GL_NO_ERROR) 3033 return internal_format_error; 3034 3035 switch (format) { 3036 case GL_BGRA_EXT: 3037 if (type != GL_UNSIGNED_BYTE || 3038 (internalFormat != GL_BGRA && 3039 internalFormat != GL_RGBA8 && 3040 internalFormat != GL_SRGB8_ALPHA8)) 3041 return GL_INVALID_OPERATION; 3042 break; 3043 3044 case GL_BGR_EXT: 3045 if (type != GL_UNSIGNED_BYTE || 3046 (internalFormat != GL_RGB8 && 3047 internalFormat != GL_SRGB8)) 3048 return GL_INVALID_OPERATION; 3049 break; 3050 3051 case GL_RGBA: 3052 switch (type) { 3053 case GL_UNSIGNED_BYTE: 3054 switch (internalFormat) { 3055 case GL_RGBA: 3056 case GL_RGBA8: 3057 case GL_RGB5_A1: 3058 case GL_RGBA4: 3059 break; 3060 case GL_SRGB8_ALPHA8_EXT: 3061 if (ctx->Version <= 20) 3062 return GL_INVALID_OPERATION; 3063 break; 3064 case GL_COMPRESSED_RGBA_BPTC_UNORM: 3065 case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: 3066 break; 3067 default: 3068 return GL_INVALID_OPERATION; 3069 } 3070 break; 3071 3072 case GL_BYTE: 3073 if (ctx->Version <= 20 || internalFormat != GL_RGBA8_SNORM) 3074 return GL_INVALID_OPERATION; 3075 break; 3076 3077 case GL_UNSIGNED_SHORT: 3078 if (internalFormat != GL_RGBA16) 3079 return GL_INVALID_OPERATION; 3080 break; 3081 3082 case GL_SHORT: 3083 if (internalFormat != GL_RGBA16_SNORM) 3084 return GL_INVALID_OPERATION; 3085 break; 3086 3087 case GL_UNSIGNED_SHORT_4_4_4_4: 3088 switch (internalFormat) { 3089 case GL_RGBA: 3090 case GL_RGBA4: 3091 break; 3092 default: 3093 return GL_INVALID_OPERATION; 3094 } 3095 break; 3096 3097 case GL_UNSIGNED_SHORT_5_5_5_1: 3098 switch (internalFormat) { 3099 case GL_RGBA: 3100 case GL_RGB5_A1: 3101 break; 3102 default: 3103 return GL_INVALID_OPERATION; 3104 } 3105 break; 3106 3107 case GL_UNSIGNED_INT_2_10_10_10_REV: 3108 switch (internalFormat) { 3109 case GL_RGBA: 3110 case GL_RGB10_A2: 3111 case GL_RGB5_A1: 3112 if (!_mesa_has_texture_type_2_10_10_10_REV(ctx)) 3113 return GL_INVALID_OPERATION; 3114 break; 3115 default: 3116 return GL_INVALID_OPERATION; 3117 } 3118 break; 3119 3120 case GL_HALF_FLOAT: 3121 if (ctx->Version <= 20 || internalFormat != GL_RGBA16F) 3122 return GL_INVALID_OPERATION; 3123 break; 3124 3125 case GL_FLOAT: 3126 switch (internalFormat) { 3127 case GL_RGBA16F: 3128 case GL_RGBA32F: 3129 if (ctx->Version <= 20) 3130 return GL_INVALID_OPERATION; 3131 break; 3132 case GL_RGBA: 3133 if (!_mesa_has_OES_texture_float(ctx) || internalFormat != format) 3134 return GL_INVALID_OPERATION; 3135 break; 3136 default: 3137 return GL_INVALID_OPERATION; 3138 } 3139 break; 3140 3141 case GL_HALF_FLOAT_OES: 3142 if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format) 3143 return GL_INVALID_OPERATION; 3144 break; 3145 default: 3146 return GL_INVALID_OPERATION; 3147 } 3148 break; 3149 3150 case GL_RGBA_INTEGER: 3151 if (ctx->Version <= 20) 3152 return GL_INVALID_OPERATION; 3153 switch (type) { 3154 case GL_UNSIGNED_BYTE: 3155 if (internalFormat != GL_RGBA8UI) 3156 return GL_INVALID_OPERATION; 3157 break; 3158 3159 case GL_BYTE: 3160 if (internalFormat != GL_RGBA8I) 3161 return GL_INVALID_OPERATION; 3162 break; 3163 3164 case GL_UNSIGNED_SHORT: 3165 if (internalFormat != GL_RGBA16UI) 3166 return GL_INVALID_OPERATION; 3167 break; 3168 3169 case GL_SHORT: 3170 if (internalFormat != GL_RGBA16I) 3171 return GL_INVALID_OPERATION; 3172 break; 3173 3174 case GL_UNSIGNED_INT: 3175 if (internalFormat != GL_RGBA32UI) 3176 return GL_INVALID_OPERATION; 3177 break; 3178 3179 case GL_INT: 3180 if (internalFormat != GL_RGBA32I) 3181 return GL_INVALID_OPERATION; 3182 break; 3183 3184 case GL_UNSIGNED_INT_2_10_10_10_REV: 3185 if (internalFormat != GL_RGB10_A2UI) 3186 return GL_INVALID_OPERATION; 3187 break; 3188 3189 default: 3190 return GL_INVALID_OPERATION; 3191 } 3192 break; 3193 3194 case GL_RGB: 3195 switch (type) { 3196 case GL_UNSIGNED_BYTE: 3197 switch (internalFormat) { 3198 case GL_RGB: 3199 case GL_RGB8: 3200 case GL_RGB565: 3201 break; 3202 case GL_SRGB8: 3203 if (ctx->Version <= 20) 3204 return GL_INVALID_OPERATION; 3205 break; 3206 default: 3207 return GL_INVALID_OPERATION; 3208 } 3209 break; 3210 3211 case GL_BYTE: 3212 if (ctx->Version <= 20 || internalFormat != GL_RGB8_SNORM) 3213 return GL_INVALID_OPERATION; 3214 break; 3215 3216 case GL_UNSIGNED_SHORT: 3217 if (internalFormat != GL_RGB16) 3218 return GL_INVALID_OPERATION; 3219 break; 3220 3221 case GL_SHORT: 3222 if (internalFormat != GL_RGB16_SNORM) 3223 return GL_INVALID_OPERATION; 3224 break; 3225 3226 case GL_UNSIGNED_SHORT_5_6_5: 3227 switch (internalFormat) { 3228 case GL_RGB: 3229 case GL_RGB565: 3230 break; 3231 default: 3232 return GL_INVALID_OPERATION; 3233 } 3234 break; 3235 3236 case GL_UNSIGNED_INT_10F_11F_11F_REV: 3237 if (ctx->Version <= 20 || internalFormat != GL_R11F_G11F_B10F) 3238 return GL_INVALID_OPERATION; 3239 break; 3240 3241 case GL_UNSIGNED_INT_5_9_9_9_REV: 3242 if (ctx->Version <= 20 || internalFormat != GL_RGB9_E5) 3243 return GL_INVALID_OPERATION; 3244 break; 3245 3246 case GL_HALF_FLOAT: 3247 if (ctx->Version <= 20) 3248 return GL_INVALID_OPERATION; 3249 switch (internalFormat) { 3250 case GL_RGB16F: 3251 case GL_R11F_G11F_B10F: 3252 case GL_RGB9_E5: 3253 break; 3254 default: 3255 return GL_INVALID_OPERATION; 3256 } 3257 break; 3258 3259 case GL_FLOAT: 3260 switch (internalFormat) { 3261 case GL_RGB16F: 3262 case GL_RGB32F: 3263 case GL_R11F_G11F_B10F: 3264 case GL_RGB9_E5: 3265 if (ctx->Version <= 20) 3266 return GL_INVALID_OPERATION; 3267 break; 3268 case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: 3269 case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: 3270 break; 3271 case GL_RGB: 3272 if (!_mesa_has_OES_texture_float(ctx) || internalFormat != format) 3273 return GL_INVALID_OPERATION; 3274 break; 3275 default: 3276 return GL_INVALID_OPERATION; 3277 } 3278 break; 3279 3280 case GL_HALF_FLOAT_OES: 3281 if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format) 3282 return GL_INVALID_OPERATION; 3283 break; 3284 3285 case GL_UNSIGNED_INT_2_10_10_10_REV: 3286 switch (internalFormat) { 3287 case GL_RGB: 3288 case GL_RGB10: 3289 case GL_RGB8: 3290 case GL_RGB565: 3291 /* GL_EXT_texture_type_2_10_10_10_REV allows GL_RGB even though 3292 * GLES3 doesn't, and GL_OES_required_internalformat extends that 3293 * to allow the sized RGB internalformats as well. 3294 */ 3295 if (!_mesa_has_texture_type_2_10_10_10_REV(ctx)) 3296 return GL_INVALID_OPERATION; 3297 break; 3298 default: 3299 return GL_INVALID_OPERATION; 3300 } 3301 break; 3302 3303 default: 3304 return GL_INVALID_OPERATION; 3305 } 3306 break; 3307 3308 case GL_RGB_INTEGER: 3309 if (ctx->Version <= 20) 3310 return GL_INVALID_OPERATION; 3311 switch (type) { 3312 case GL_UNSIGNED_BYTE: 3313 if (internalFormat != GL_RGB8UI) 3314 return GL_INVALID_OPERATION; 3315 break; 3316 3317 case GL_BYTE: 3318 if (internalFormat != GL_RGB8I) 3319 return GL_INVALID_OPERATION; 3320 break; 3321 3322 case GL_UNSIGNED_SHORT: 3323 if (internalFormat != GL_RGB16UI) 3324 return GL_INVALID_OPERATION; 3325 break; 3326 3327 case GL_SHORT: 3328 if (internalFormat != GL_RGB16I) 3329 return GL_INVALID_OPERATION; 3330 break; 3331 3332 case GL_UNSIGNED_INT: 3333 if (internalFormat != GL_RGB32UI) 3334 return GL_INVALID_OPERATION; 3335 break; 3336 3337 case GL_INT: 3338 if (internalFormat != GL_RGB32I) 3339 return GL_INVALID_OPERATION; 3340 break; 3341 3342 default: 3343 return GL_INVALID_OPERATION; 3344 } 3345 break; 3346 3347 case GL_RG: 3348 if (!_mesa_has_rg_textures(ctx)) 3349 return GL_INVALID_OPERATION; 3350 switch (type) { 3351 case GL_UNSIGNED_BYTE: 3352 if (internalFormat != GL_RG8 && 3353 internalFormat != GL_COMPRESSED_RED_GREEN_RGTC2_EXT && 3354 internalFormat != GL_SRG8_EXT) 3355 return GL_INVALID_OPERATION; 3356 break; 3357 3358 case GL_BYTE: 3359 if (internalFormat != GL_RG8_SNORM && 3360 internalFormat != GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT) 3361 return GL_INVALID_OPERATION; 3362 break; 3363 3364 case GL_UNSIGNED_SHORT: 3365 if (internalFormat != GL_RG16) 3366 return GL_INVALID_OPERATION; 3367 break; 3368 3369 case GL_SHORT: 3370 if (internalFormat != GL_RG16_SNORM) 3371 return GL_INVALID_OPERATION; 3372 break; 3373 3374 case GL_HALF_FLOAT: 3375 case GL_HALF_FLOAT_OES: 3376 switch (internalFormat) { 3377 case GL_RG16F: 3378 if (ctx->Version <= 20) 3379 return GL_INVALID_OPERATION; 3380 break; 3381 case GL_RG: 3382 if (!_mesa_has_OES_texture_half_float(ctx)) 3383 return GL_INVALID_OPERATION; 3384 break; 3385 default: 3386 return GL_INVALID_OPERATION; 3387 } 3388 break; 3389 3390 case GL_FLOAT: 3391 switch (internalFormat) { 3392 case GL_RG16F: 3393 case GL_RG32F: 3394 break; 3395 case GL_RG: 3396 if (!_mesa_has_OES_texture_float(ctx)) 3397 return GL_INVALID_OPERATION; 3398 break; 3399 default: 3400 return GL_INVALID_OPERATION; 3401 } 3402 break; 3403 3404 default: 3405 return GL_INVALID_OPERATION; 3406 } 3407 break; 3408 3409 case GL_RG_INTEGER: 3410 if (ctx->Version <= 20) 3411 return GL_INVALID_OPERATION; 3412 switch (type) { 3413 case GL_UNSIGNED_BYTE: 3414 if (internalFormat != GL_RG8UI) 3415 return GL_INVALID_OPERATION; 3416 break; 3417 3418 case GL_BYTE: 3419 if (internalFormat != GL_RG8I) 3420 return GL_INVALID_OPERATION; 3421 break; 3422 3423 case GL_UNSIGNED_SHORT: 3424 if (internalFormat != GL_RG16UI) 3425 return GL_INVALID_OPERATION; 3426 break; 3427 3428 case GL_SHORT: 3429 if (internalFormat != GL_RG16I) 3430 return GL_INVALID_OPERATION; 3431 break; 3432 3433 case GL_UNSIGNED_INT: 3434 if (internalFormat != GL_RG32UI) 3435 return GL_INVALID_OPERATION; 3436 break; 3437 3438 case GL_INT: 3439 if (internalFormat != GL_RG32I) 3440 return GL_INVALID_OPERATION; 3441 break; 3442 3443 default: 3444 return GL_INVALID_OPERATION; 3445 } 3446 break; 3447 3448 case GL_RED: 3449 if (!_mesa_has_rg_textures(ctx)) 3450 return GL_INVALID_OPERATION; 3451 switch (type) { 3452 case GL_UNSIGNED_BYTE: 3453 if (internalFormat != GL_R8 && 3454 internalFormat != GL_SR8_EXT && 3455 internalFormat != GL_COMPRESSED_RED_RGTC1_EXT) { 3456 return GL_INVALID_OPERATION; 3457 } 3458 break; 3459 3460 case GL_BYTE: 3461 if (internalFormat != GL_R8_SNORM && 3462 internalFormat != GL_COMPRESSED_SIGNED_RED_RGTC1_EXT) 3463 return GL_INVALID_OPERATION; 3464 break; 3465 3466 case GL_UNSIGNED_SHORT: 3467 if (internalFormat != GL_R16) 3468 return GL_INVALID_OPERATION; 3469 break; 3470 3471 case GL_SHORT: 3472 if (internalFormat != GL_R16_SNORM) 3473 return GL_INVALID_OPERATION; 3474 break; 3475 3476 case GL_HALF_FLOAT: 3477 case GL_HALF_FLOAT_OES: 3478 switch (internalFormat) { 3479 case GL_R16F: 3480 if (ctx->Version <= 20) 3481 return GL_INVALID_OPERATION; 3482 break; 3483 case GL_RG: 3484 case GL_RED: 3485 if (!_mesa_has_OES_texture_half_float(ctx)) 3486 return GL_INVALID_OPERATION; 3487 break; 3488 default: 3489 return GL_INVALID_OPERATION; 3490 } 3491 break; 3492 3493 case GL_FLOAT: 3494 switch (internalFormat) { 3495 case GL_R16F: 3496 case GL_R32F: 3497 break; 3498 case GL_RED: 3499 if (!_mesa_has_OES_texture_float(ctx)) 3500 return GL_INVALID_OPERATION; 3501 break; 3502 default: 3503 return GL_INVALID_OPERATION; 3504 } 3505 break; 3506 3507 default: 3508 return GL_INVALID_OPERATION; 3509 } 3510 break; 3511 3512 case GL_RED_INTEGER: 3513 if (ctx->Version <= 20) 3514 return GL_INVALID_OPERATION; 3515 switch (type) { 3516 case GL_UNSIGNED_BYTE: 3517 if (internalFormat != GL_R8UI) 3518 return GL_INVALID_OPERATION; 3519 break; 3520 3521 case GL_BYTE: 3522 if (internalFormat != GL_R8I) 3523 return GL_INVALID_OPERATION; 3524 break; 3525 3526 case GL_UNSIGNED_SHORT: 3527 if (internalFormat != GL_R16UI) 3528 return GL_INVALID_OPERATION; 3529 break; 3530 3531 case GL_SHORT: 3532 if (internalFormat != GL_R16I) 3533 return GL_INVALID_OPERATION; 3534 break; 3535 3536 case GL_UNSIGNED_INT: 3537 if (internalFormat != GL_R32UI) 3538 return GL_INVALID_OPERATION; 3539 break; 3540 3541 case GL_INT: 3542 if (internalFormat != GL_R32I) 3543 return GL_INVALID_OPERATION; 3544 break; 3545 3546 default: 3547 return GL_INVALID_OPERATION; 3548 } 3549 break; 3550 3551 case GL_DEPTH_COMPONENT: 3552 switch (type) { 3553 case GL_UNSIGNED_SHORT: 3554 if (internalFormat != GL_DEPTH_COMPONENT && 3555 internalFormat != GL_DEPTH_COMPONENT16) 3556 return GL_INVALID_OPERATION; 3557 break; 3558 3559 case GL_UNSIGNED_INT: 3560 switch (internalFormat) { 3561 case GL_DEPTH_COMPONENT: 3562 case GL_DEPTH_COMPONENT16: 3563 case GL_DEPTH_COMPONENT24: 3564 break; 3565 default: 3566 return GL_INVALID_OPERATION; 3567 } 3568 break; 3569 3570 case GL_FLOAT: 3571 if (ctx->Version <= 20 || internalFormat != GL_DEPTH_COMPONENT32F) 3572 return GL_INVALID_OPERATION; 3573 break; 3574 3575 default: 3576 return GL_INVALID_OPERATION; 3577 } 3578 break; 3579 3580 case GL_DEPTH_STENCIL: 3581 switch (type) { 3582 case GL_UNSIGNED_INT_24_8: 3583 if (internalFormat != GL_DEPTH_STENCIL && 3584 internalFormat != GL_DEPTH24_STENCIL8) 3585 return GL_INVALID_OPERATION; 3586 break; 3587 3588 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 3589 if (ctx->Version <= 20 || internalFormat != GL_DEPTH32F_STENCIL8) 3590 return GL_INVALID_OPERATION; 3591 break; 3592 3593 default: 3594 return GL_INVALID_OPERATION; 3595 } 3596 break; 3597 3598 case GL_STENCIL_INDEX: 3599 if (type != GL_UNSIGNED_BYTE || 3600 internalFormat != GL_STENCIL_INDEX8) { 3601 return GL_INVALID_OPERATION; 3602 } 3603 break; 3604 3605 case GL_ALPHA: 3606 case GL_LUMINANCE: 3607 case GL_LUMINANCE_ALPHA: 3608 switch (type) { 3609 case GL_FLOAT: 3610 if (!_mesa_has_OES_texture_float(ctx) || internalFormat != format) 3611 return GL_INVALID_OPERATION; 3612 break; 3613 case GL_HALF_FLOAT_OES: 3614 if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format) 3615 return GL_INVALID_OPERATION; 3616 break; 3617 case GL_UNSIGNED_BYTE: 3618 if (!(format == internalFormat || 3619 (format == GL_ALPHA && internalFormat == GL_ALPHA8) || 3620 (format == GL_LUMINANCE && internalFormat == GL_LUMINANCE8) || 3621 (format == GL_LUMINANCE_ALPHA && 3622 ((internalFormat == GL_LUMINANCE8_ALPHA8) || 3623 (internalFormat == GL_LUMINANCE4_ALPHA4))))) { 3624 return GL_INVALID_OPERATION; 3625 } 3626 break; 3627 default: 3628 return GL_INVALID_OPERATION; 3629 } 3630 break; 3631 } 3632 3633 return GL_NO_ERROR; 3634} 3635 3636static void 3637set_swizzle(uint8_t *swizzle, int x, int y, int z, int w) 3638{ 3639 swizzle[MESA_FORMAT_SWIZZLE_X] = x; 3640 swizzle[MESA_FORMAT_SWIZZLE_Y] = y; 3641 swizzle[MESA_FORMAT_SWIZZLE_Z] = z; 3642 swizzle[MESA_FORMAT_SWIZZLE_W] = w; 3643} 3644 3645static bool 3646get_swizzle_from_gl_format(GLenum format, uint8_t *swizzle) 3647{ 3648 switch (format) { 3649 case GL_RGBA: 3650 case GL_RGBA_INTEGER_EXT: 3651 set_swizzle(swizzle, 0, 1, 2, 3); 3652 return true; 3653 case GL_BGRA: 3654 case GL_BGRA_INTEGER_EXT: 3655 set_swizzle(swizzle, 2, 1, 0, 3); 3656 return true; 3657 case GL_ABGR_EXT: 3658 set_swizzle(swizzle, 3, 2, 1, 0); 3659 return true; 3660 case GL_RGB: 3661 case GL_RGB_INTEGER_EXT: 3662 set_swizzle(swizzle, 0, 1, 2, 5); 3663 return true; 3664 case GL_BGR: 3665 case GL_BGR_INTEGER_EXT: 3666 set_swizzle(swizzle, 2, 1, 0, 5); 3667 return true; 3668 case GL_LUMINANCE_ALPHA: 3669 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 3670 set_swizzle(swizzle, 0, 0, 0, 1); 3671 return true; 3672 case GL_RG: 3673 case GL_RG_INTEGER: 3674 set_swizzle(swizzle, 0, 1, 4, 5); 3675 return true; 3676 case GL_RED: 3677 case GL_RED_INTEGER_EXT: 3678 set_swizzle(swizzle, 0, 4, 4, 5); 3679 return true; 3680 case GL_GREEN: 3681 case GL_GREEN_INTEGER_EXT: 3682 set_swizzle(swizzle, 4, 0, 4, 5); 3683 return true; 3684 case GL_BLUE: 3685 case GL_BLUE_INTEGER_EXT: 3686 set_swizzle(swizzle, 4, 4, 0, 5); 3687 return true; 3688 case GL_ALPHA: 3689 case GL_ALPHA_INTEGER_EXT: 3690 set_swizzle(swizzle, 4, 4, 4, 0); 3691 return true; 3692 case GL_LUMINANCE: 3693 case GL_LUMINANCE_INTEGER_EXT: 3694 set_swizzle(swizzle, 0, 0, 0, 5); 3695 return true; 3696 case GL_INTENSITY: 3697 set_swizzle(swizzle, 0, 0, 0, 0); 3698 return true; 3699 case GL_DEPTH_COMPONENT: 3700 set_swizzle(swizzle, 0, 6, 6, 6); 3701 return true; 3702 case GL_STENCIL_INDEX: 3703 set_swizzle(swizzle, 6, 0, 6, 6); 3704 return true; 3705 default: 3706 return false; 3707 } 3708} 3709 3710bool 3711_mesa_swap_bytes_in_type_enum(GLenum *type) 3712{ 3713 switch (*type) { 3714 case GL_UNSIGNED_INT_8_8_8_8: 3715 *type = GL_UNSIGNED_INT_8_8_8_8_REV; 3716 return true; 3717 case GL_UNSIGNED_INT_8_8_8_8_REV: 3718 *type = GL_UNSIGNED_INT_8_8_8_8; 3719 return true; 3720 case GL_UNSIGNED_SHORT_8_8_MESA: 3721 *type = GL_UNSIGNED_SHORT_8_8_REV_MESA; 3722 return true; 3723 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 3724 *type = GL_UNSIGNED_SHORT_8_8_MESA; 3725 return true; 3726 case GL_BYTE: 3727 case GL_UNSIGNED_BYTE: 3728 /* format/types that are arrays of 8-bit values are unaffected by 3729 * swapBytes. 3730 */ 3731 return true; 3732 default: 3733 /* swapping bytes on 4444, 1555, or >8 bit per channel types etc. will 3734 * never match a Mesa format. 3735 */ 3736 return false; 3737 } 3738} 3739 3740/** 3741* Take an OpenGL format (GL_RGB, GL_RGBA, etc), OpenGL data type (GL_INT, 3742* GL_FOAT, etc) and return a matching mesa_array_format or a mesa_format 3743* otherwise (for non-array formats). 3744* 3745* This function will typically be used to compute a mesa format from a GL type 3746* so we can then call _mesa_format_convert. This function does 3747* not consider byte swapping, so it returns types assuming that no byte 3748* swapping is involved. If byte swapping is involved then clients are supposed 3749* to handle that on their side before calling _mesa_format_convert. 3750* 3751* This function returns an uint32_t that can pack a mesa_format or a 3752* mesa_array_format. Clients must check the mesa array format bit 3753* (MESA_ARRAY_FORMAT_BIT) on the return value to know if the returned 3754* format is a mesa_array_format or a mesa_format. 3755*/ 3756uint32_t 3757_mesa_format_from_format_and_type(GLenum format, GLenum type) 3758{ 3759 bool is_array_format = true; 3760 uint8_t swizzle[4]; 3761 bool normalized = false, is_float = false, is_signed = false; 3762 int num_channels = 0, type_size = 0; 3763 3764 if (format == GL_COLOR_INDEX) 3765 return MESA_FORMAT_NONE; 3766 3767 /* Extract array format type information from the OpenGL data type */ 3768 switch (type) { 3769 case GL_UNSIGNED_BYTE: 3770 type_size = 1; 3771 break; 3772 case GL_BYTE: 3773 type_size = 1; 3774 is_signed = true; 3775 break; 3776 case GL_UNSIGNED_SHORT: 3777 type_size = 2; 3778 break; 3779 case GL_SHORT: 3780 type_size = 2; 3781 is_signed = true; 3782 break; 3783 case GL_UNSIGNED_INT: 3784 type_size = 4; 3785 break; 3786 case GL_INT: 3787 type_size = 4; 3788 is_signed = true; 3789 break; 3790 case GL_HALF_FLOAT: 3791 case GL_HALF_FLOAT_OES: 3792 type_size = 2; 3793 is_signed = true; 3794 is_float = true; 3795 break; 3796 case GL_FLOAT: 3797 type_size = 4; 3798 is_signed = true; 3799 is_float = true; 3800 break; 3801 default: 3802 is_array_format = false; 3803 break; 3804 } 3805 3806 /* Extract array format swizzle information from the OpenGL format */ 3807 if (is_array_format) 3808 is_array_format = get_swizzle_from_gl_format(format, swizzle); 3809 3810 /* If this is an array format type after checking data type and format, 3811 * create the array format 3812 */ 3813 if (is_array_format) { 3814 enum mesa_array_format_base_format bf; 3815 switch (format) { 3816 case GL_DEPTH_COMPONENT: 3817 bf = MESA_ARRAY_FORMAT_BASE_FORMAT_DEPTH; 3818 break; 3819 case GL_STENCIL_INDEX: 3820 bf = MESA_ARRAY_FORMAT_BASE_FORMAT_STENCIL; 3821 break; 3822 default: 3823 bf = MESA_ARRAY_FORMAT_BASE_FORMAT_RGBA_VARIANTS; 3824 break; 3825 } 3826 3827 normalized = !(_mesa_is_enum_format_integer(format) || 3828 format == GL_STENCIL_INDEX); 3829 num_channels = _mesa_components_in_format(format); 3830 3831 return MESA_ARRAY_FORMAT(bf, type_size, is_signed, is_float, 3832 normalized, num_channels, 3833 swizzle[0], swizzle[1], swizzle[2], swizzle[3]); 3834 } 3835 3836 /* Otherwise this is not an array format, so return the mesa_format 3837 * matching the OpenGL format and data type 3838 */ 3839 switch (type) { 3840 case GL_UNSIGNED_SHORT_5_6_5: 3841 if (format == GL_RGB) 3842 return MESA_FORMAT_B5G6R5_UNORM; 3843 else if (format == GL_BGR) 3844 return MESA_FORMAT_R5G6B5_UNORM; 3845 else if (format == GL_RGB_INTEGER) 3846 return MESA_FORMAT_B5G6R5_UINT; 3847 break; 3848 case GL_UNSIGNED_SHORT_5_6_5_REV: 3849 if (format == GL_RGB) 3850 return MESA_FORMAT_R5G6B5_UNORM; 3851 else if (format == GL_BGR) 3852 return MESA_FORMAT_B5G6R5_UNORM; 3853 else if (format == GL_RGB_INTEGER) 3854 return MESA_FORMAT_R5G6B5_UINT; 3855 break; 3856 case GL_UNSIGNED_SHORT_4_4_4_4: 3857 if (format == GL_RGBA) 3858 return MESA_FORMAT_A4B4G4R4_UNORM; 3859 else if (format == GL_BGRA) 3860 return MESA_FORMAT_A4R4G4B4_UNORM; 3861 else if (format == GL_ABGR_EXT) 3862 return MESA_FORMAT_R4G4B4A4_UNORM; 3863 else if (format == GL_RGBA_INTEGER) 3864 return MESA_FORMAT_A4B4G4R4_UINT; 3865 else if (format == GL_BGRA_INTEGER) 3866 return MESA_FORMAT_A4R4G4B4_UINT; 3867 break; 3868 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 3869 if (format == GL_RGBA) 3870 return MESA_FORMAT_R4G4B4A4_UNORM; 3871 else if (format == GL_BGRA) 3872 return MESA_FORMAT_B4G4R4A4_UNORM; 3873 else if (format == GL_ABGR_EXT) 3874 return MESA_FORMAT_A4B4G4R4_UNORM; 3875 else if (format == GL_RGBA_INTEGER) 3876 return MESA_FORMAT_R4G4B4A4_UINT; 3877 else if (format == GL_BGRA_INTEGER) 3878 return MESA_FORMAT_B4G4R4A4_UINT; 3879 break; 3880 case GL_UNSIGNED_SHORT_5_5_5_1: 3881 if (format == GL_RGBA) 3882 return MESA_FORMAT_A1B5G5R5_UNORM; 3883 else if (format == GL_BGRA) 3884 return MESA_FORMAT_A1R5G5B5_UNORM; 3885 else if (format == GL_RGBA_INTEGER) 3886 return MESA_FORMAT_A1B5G5R5_UINT; 3887 else if (format == GL_BGRA_INTEGER) 3888 return MESA_FORMAT_A1R5G5B5_UINT; 3889 break; 3890 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 3891 if (format == GL_RGBA) 3892 return MESA_FORMAT_R5G5B5A1_UNORM; 3893 else if (format == GL_BGRA) 3894 return MESA_FORMAT_B5G5R5A1_UNORM; 3895 else if (format == GL_RGBA_INTEGER) 3896 return MESA_FORMAT_R5G5B5A1_UINT; 3897 else if (format == GL_BGRA_INTEGER) 3898 return MESA_FORMAT_B5G5R5A1_UINT; 3899 break; 3900 case GL_UNSIGNED_BYTE_3_3_2: 3901 if (format == GL_RGB) 3902 return MESA_FORMAT_B2G3R3_UNORM; 3903 else if (format == GL_RGB_INTEGER) 3904 return MESA_FORMAT_B2G3R3_UINT; 3905 break; 3906 case GL_UNSIGNED_BYTE_2_3_3_REV: 3907 if (format == GL_RGB) 3908 return MESA_FORMAT_R3G3B2_UNORM; 3909 else if (format == GL_RGB_INTEGER) 3910 return MESA_FORMAT_R3G3B2_UINT; 3911 break; 3912 case GL_UNSIGNED_INT_5_9_9_9_REV: 3913 if (format == GL_RGB) 3914 return MESA_FORMAT_R9G9B9E5_FLOAT; 3915 break; 3916 case GL_UNSIGNED_INT_10_10_10_2: 3917 if (format == GL_RGBA) 3918 return MESA_FORMAT_A2B10G10R10_UNORM; 3919 else if (format == GL_RGBA_INTEGER) 3920 return MESA_FORMAT_A2B10G10R10_UINT; 3921 else if (format == GL_BGRA) 3922 return MESA_FORMAT_A2R10G10B10_UNORM; 3923 else if (format == GL_BGRA_INTEGER) 3924 return MESA_FORMAT_A2R10G10B10_UINT; 3925 break; 3926 case GL_UNSIGNED_INT_2_10_10_10_REV: 3927 if (format == GL_RGB) 3928 return MESA_FORMAT_R10G10B10X2_UNORM; 3929 if (format == GL_RGBA) 3930 return MESA_FORMAT_R10G10B10A2_UNORM; 3931 else if (format == GL_RGBA_INTEGER) 3932 return MESA_FORMAT_R10G10B10A2_UINT; 3933 else if (format == GL_BGRA) 3934 return MESA_FORMAT_B10G10R10A2_UNORM; 3935 else if (format == GL_BGRA_INTEGER) 3936 return MESA_FORMAT_B10G10R10A2_UINT; 3937 break; 3938 case GL_UNSIGNED_INT_8_8_8_8: 3939 if (format == GL_RGBA) 3940 return MESA_FORMAT_A8B8G8R8_UNORM; 3941 else if (format == GL_BGRA) 3942 return MESA_FORMAT_A8R8G8B8_UNORM; 3943 else if (format == GL_ABGR_EXT) 3944 return MESA_FORMAT_R8G8B8A8_UNORM; 3945 else if (format == GL_RGBA_INTEGER) 3946 return MESA_FORMAT_A8B8G8R8_UINT; 3947 else if (format == GL_BGRA_INTEGER) 3948 return MESA_FORMAT_A8R8G8B8_UINT; 3949 break; 3950 case GL_UNSIGNED_INT_8_8_8_8_REV: 3951 if (format == GL_RGBA) 3952 return MESA_FORMAT_R8G8B8A8_UNORM; 3953 else if (format == GL_BGRA) 3954 return MESA_FORMAT_B8G8R8A8_UNORM; 3955 else if (format == GL_ABGR_EXT) 3956 return MESA_FORMAT_A8B8G8R8_UNORM; 3957 else if (format == GL_RGBA_INTEGER) 3958 return MESA_FORMAT_R8G8B8A8_UINT; 3959 else if (format == GL_BGRA_INTEGER) 3960 return MESA_FORMAT_B8G8R8A8_UINT; 3961 break; 3962 case GL_UNSIGNED_SHORT_8_8_MESA: 3963 if (format == GL_YCBCR_MESA) 3964 return MESA_FORMAT_YCBCR; 3965 break; 3966 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 3967 if (format == GL_YCBCR_MESA) 3968 return MESA_FORMAT_YCBCR_REV; 3969 break; 3970 case GL_UNSIGNED_INT_10F_11F_11F_REV: 3971 if (format == GL_RGB) 3972 return MESA_FORMAT_R11G11B10_FLOAT; 3973 break; 3974 case GL_FLOAT: 3975 if (format == GL_DEPTH_COMPONENT) 3976 return MESA_FORMAT_Z_FLOAT32; 3977 break; 3978 case GL_UNSIGNED_INT: 3979 if (format == GL_DEPTH_COMPONENT) 3980 return MESA_FORMAT_Z_UNORM32; 3981 break; 3982 case GL_UNSIGNED_SHORT: 3983 if (format == GL_DEPTH_COMPONENT) 3984 return MESA_FORMAT_Z_UNORM16; 3985 break; 3986 case GL_UNSIGNED_INT_24_8: 3987 if (format == GL_DEPTH_STENCIL) 3988 return MESA_FORMAT_S8_UINT_Z24_UNORM; 3989 else if (format == GL_DEPTH_COMPONENT) 3990 return MESA_FORMAT_X8_UINT_Z24_UNORM; 3991 break; 3992 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 3993 if (format == GL_DEPTH_STENCIL) 3994 return MESA_FORMAT_Z32_FLOAT_S8X24_UINT; 3995 break; 3996 default: 3997 break; 3998 } 3999 4000 fprintf(stderr, "Unsupported format/type: %s/%s\n", 4001 _mesa_enum_to_string(format), 4002 _mesa_enum_to_string(type)); 4003 4004 /* If we got here it means that we could not find a Mesa format that 4005 * matches the GL format/type provided. We may need to add a new Mesa 4006 * format in that case. 4007 */ 4008 unreachable("Unsupported format"); 4009} 4010 4011uint32_t 4012_mesa_tex_format_from_format_and_type(const struct gl_context *ctx, 4013 GLenum gl_format, GLenum type) 4014{ 4015 mesa_format format = _mesa_format_from_format_and_type(gl_format, type); 4016 4017 if (_mesa_format_is_mesa_array_format(format)) 4018 format = _mesa_format_from_array_format(format); 4019 4020 if (format == MESA_FORMAT_NONE || !ctx->TextureFormatSupported[format]) 4021 return MESA_FORMAT_NONE; 4022 4023 return format; 4024} 4025 4026/** 4027 * Returns true if \p internal_format is a sized internal format that 4028 * is marked "Color Renderable" in Table 8.10 of the ES 3.2 specification. 4029 */ 4030bool 4031_mesa_is_es3_color_renderable(const struct gl_context *ctx, 4032 GLenum internal_format) 4033{ 4034 switch (internal_format) { 4035 case GL_R8: 4036 case GL_RG8: 4037 case GL_RGB8: 4038 case GL_RGB565: 4039 case GL_RGBA4: 4040 case GL_RGB5_A1: 4041 case GL_RGBA8: 4042 case GL_RGB10_A2: 4043 case GL_RGB10_A2UI: 4044 case GL_SRGB8_ALPHA8: 4045 case GL_R16F: 4046 case GL_RG16F: 4047 case GL_RGBA16F: 4048 case GL_R32F: 4049 case GL_RG32F: 4050 case GL_RGBA32F: 4051 case GL_R11F_G11F_B10F: 4052 case GL_R8I: 4053 case GL_R8UI: 4054 case GL_R16I: 4055 case GL_R16UI: 4056 case GL_R32I: 4057 case GL_R32UI: 4058 case GL_RG8I: 4059 case GL_RG8UI: 4060 case GL_RG16I: 4061 case GL_RG16UI: 4062 case GL_RG32I: 4063 case GL_RG32UI: 4064 case GL_RGBA8I: 4065 case GL_RGBA8UI: 4066 case GL_RGBA16I: 4067 case GL_RGBA16UI: 4068 case GL_RGBA32I: 4069 case GL_RGBA32UI: 4070 return true; 4071 case GL_R16: 4072 case GL_RG16: 4073 case GL_RGBA16: 4074 return _mesa_has_EXT_texture_norm16(ctx); 4075 case GL_R8_SNORM: 4076 case GL_RG8_SNORM: 4077 case GL_RGBA8_SNORM: 4078 return _mesa_has_EXT_render_snorm(ctx); 4079 case GL_R16_SNORM: 4080 case GL_RG16_SNORM: 4081 case GL_RGBA16_SNORM: 4082 return _mesa_has_EXT_texture_norm16(ctx) && 4083 _mesa_has_EXT_render_snorm(ctx); 4084 default: 4085 return false; 4086 } 4087} 4088 4089/** 4090 * Returns true if \p internal_format is a sized internal format that 4091 * is marked "Texture Filterable" in Table 8.10 of the ES 3.2 specification. 4092 */ 4093bool 4094_mesa_is_es3_texture_filterable(const struct gl_context *ctx, 4095 GLenum internal_format) 4096{ 4097 switch (internal_format) { 4098 case GL_R8: 4099 case GL_R8_SNORM: 4100 case GL_RG8: 4101 case GL_RG8_SNORM: 4102 case GL_RGB8: 4103 case GL_RGB8_SNORM: 4104 case GL_RGB565: 4105 case GL_RGBA4: 4106 case GL_RGB5_A1: 4107 case GL_RGBA8: 4108 case GL_RGBA8_SNORM: 4109 case GL_RGB10_A2: 4110 case GL_SRGB8: 4111 case GL_SRGB8_ALPHA8: 4112 case GL_R16F: 4113 case GL_RG16F: 4114 case GL_RGB16F: 4115 case GL_RGBA16F: 4116 case GL_R11F_G11F_B10F: 4117 case GL_RGB9_E5: 4118 return true; 4119 case GL_R16: 4120 case GL_R16_SNORM: 4121 case GL_RG16: 4122 case GL_RG16_SNORM: 4123 case GL_RGB16: 4124 case GL_RGB16_SNORM: 4125 case GL_RGBA16: 4126 case GL_RGBA16_SNORM: 4127 return _mesa_has_EXT_texture_norm16(ctx); 4128 case GL_R32F: 4129 case GL_RG32F: 4130 case GL_RGB32F: 4131 case GL_RGBA32F: 4132 /* The OES_texture_float_linear spec says: 4133 * 4134 * "When implemented against OpenGL ES 3.0 or later versions, sized 4135 * 32-bit floating-point formats become texture-filterable. This 4136 * should be noted by, for example, checking the ``TF'' column of 4137 * table 8.13 in the ES 3.1 Specification (``Correspondence of sized 4138 * internal formats to base internal formats ... and use cases ...'') 4139 * for the R32F, RG32F, RGB32F, and RGBA32F formats." 4140 */ 4141 return _mesa_has_OES_texture_float_linear(ctx); 4142 default: 4143 return false; 4144 } 4145} 4146