glformats.c revision b8e80941
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_SRGB_EXT: 1078 case GL_SRGB8_EXT: 1079 case GL_SRGB_ALPHA_EXT: 1080 case GL_SRGB8_ALPHA8_EXT: 1081 case GL_SLUMINANCE_ALPHA_EXT: 1082 case GL_SLUMINANCE8_ALPHA8_EXT: 1083 case GL_SLUMINANCE_EXT: 1084 case GL_SLUMINANCE8_EXT: 1085 case GL_COMPRESSED_SRGB_EXT: 1086 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 1087 case GL_COMPRESSED_SRGB_ALPHA_EXT: 1088 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 1089 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 1090 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 1091 case GL_COMPRESSED_SLUMINANCE_EXT: 1092 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 1093 case GL_COMPRESSED_RED_RGTC1: 1094 case GL_COMPRESSED_SIGNED_RED_RGTC1: 1095 case GL_COMPRESSED_RG_RGTC2: 1096 case GL_COMPRESSED_SIGNED_RG_RGTC2: 1097 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 1098 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 1099 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 1100 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 1101 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 1102 case GL_ETC1_RGB8_OES: 1103 case GL_COMPRESSED_RGB8_ETC2: 1104 case GL_COMPRESSED_SRGB8_ETC2: 1105 case GL_COMPRESSED_RGBA8_ETC2_EAC: 1106 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 1107 case GL_COMPRESSED_R11_EAC: 1108 case GL_COMPRESSED_RG11_EAC: 1109 case GL_COMPRESSED_SIGNED_R11_EAC: 1110 case GL_COMPRESSED_SIGNED_RG11_EAC: 1111 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 1112 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 1113 case GL_COMPRESSED_RGBA_BPTC_UNORM: 1114 case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: 1115 case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: 1116 case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: 1117 case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: 1118 case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: 1119 case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: 1120 case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: 1121 case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: 1122 case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: 1123 case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: 1124 case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: 1125 case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: 1126 case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: 1127 case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: 1128 case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: 1129 case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: 1130 case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: 1131 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 1132 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 1133 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 1134 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 1135 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 1136 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 1137 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 1138 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 1139 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 1140 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 1141 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 1142 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 1143 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 1144 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 1145 case GL_ATC_RGB_AMD: 1146 case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: 1147 case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: 1148 /* generic integer formats */ 1149 case GL_RED_INTEGER_EXT: 1150 case GL_GREEN_INTEGER_EXT: 1151 case GL_BLUE_INTEGER_EXT: 1152 case GL_ALPHA_INTEGER_EXT: 1153 case GL_RGB_INTEGER_EXT: 1154 case GL_RGBA_INTEGER_EXT: 1155 case GL_BGR_INTEGER_EXT: 1156 case GL_BGRA_INTEGER_EXT: 1157 case GL_RG_INTEGER: 1158 case GL_LUMINANCE_INTEGER_EXT: 1159 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1160 /* sized integer formats */ 1161 case GL_RGBA32UI_EXT: 1162 case GL_RGB32UI_EXT: 1163 case GL_RG32UI: 1164 case GL_R32UI: 1165 case GL_ALPHA32UI_EXT: 1166 case GL_INTENSITY32UI_EXT: 1167 case GL_LUMINANCE32UI_EXT: 1168 case GL_LUMINANCE_ALPHA32UI_EXT: 1169 case GL_RGBA16UI_EXT: 1170 case GL_RGB16UI_EXT: 1171 case GL_RG16UI: 1172 case GL_R16UI: 1173 case GL_ALPHA16UI_EXT: 1174 case GL_INTENSITY16UI_EXT: 1175 case GL_LUMINANCE16UI_EXT: 1176 case GL_LUMINANCE_ALPHA16UI_EXT: 1177 case GL_RGBA8UI_EXT: 1178 case GL_RGB8UI_EXT: 1179 case GL_RG8UI: 1180 case GL_R8UI: 1181 case GL_ALPHA8UI_EXT: 1182 case GL_INTENSITY8UI_EXT: 1183 case GL_LUMINANCE8UI_EXT: 1184 case GL_LUMINANCE_ALPHA8UI_EXT: 1185 case GL_RGBA32I_EXT: 1186 case GL_RGB32I_EXT: 1187 case GL_RG32I: 1188 case GL_R32I: 1189 case GL_ALPHA32I_EXT: 1190 case GL_INTENSITY32I_EXT: 1191 case GL_LUMINANCE32I_EXT: 1192 case GL_LUMINANCE_ALPHA32I_EXT: 1193 case GL_RGBA16I_EXT: 1194 case GL_RGB16I_EXT: 1195 case GL_RG16I: 1196 case GL_R16I: 1197 case GL_ALPHA16I_EXT: 1198 case GL_INTENSITY16I_EXT: 1199 case GL_LUMINANCE16I_EXT: 1200 case GL_LUMINANCE_ALPHA16I_EXT: 1201 case GL_RGBA8I_EXT: 1202 case GL_RGB8I_EXT: 1203 case GL_RG8I: 1204 case GL_R8I: 1205 case GL_ALPHA8I_EXT: 1206 case GL_INTENSITY8I_EXT: 1207 case GL_LUMINANCE8I_EXT: 1208 case GL_LUMINANCE_ALPHA8I_EXT: 1209 /* signed, normalized texture formats */ 1210 case GL_RED_SNORM: 1211 case GL_R8_SNORM: 1212 case GL_R16_SNORM: 1213 case GL_RG_SNORM: 1214 case GL_RG8_SNORM: 1215 case GL_RG16_SNORM: 1216 case GL_RGB_SNORM: 1217 case GL_RGB8_SNORM: 1218 case GL_RGB16_SNORM: 1219 case GL_RGBA_SNORM: 1220 case GL_RGBA8_SNORM: 1221 case GL_RGBA16_SNORM: 1222 case GL_ALPHA_SNORM: 1223 case GL_ALPHA8_SNORM: 1224 case GL_ALPHA16_SNORM: 1225 case GL_LUMINANCE_SNORM: 1226 case GL_LUMINANCE8_SNORM: 1227 case GL_LUMINANCE16_SNORM: 1228 case GL_LUMINANCE_ALPHA_SNORM: 1229 case GL_LUMINANCE8_ALPHA8_SNORM: 1230 case GL_LUMINANCE16_ALPHA16_SNORM: 1231 case GL_INTENSITY_SNORM: 1232 case GL_INTENSITY8_SNORM: 1233 case GL_INTENSITY16_SNORM: 1234 case GL_RGB9_E5: 1235 case GL_R11F_G11F_B10F: 1236 case GL_RGB10_A2UI: 1237 return GL_TRUE; 1238 case GL_YCBCR_MESA: /* not considered to be RGB */ 1239 /* fall-through */ 1240 default: 1241 return GL_FALSE; 1242 } 1243} 1244 1245 1246/** 1247 * Test if the given image format is a depth component format. 1248 */ 1249GLboolean 1250_mesa_is_depth_format(GLenum format) 1251{ 1252 switch (format) { 1253 case GL_DEPTH_COMPONENT: 1254 case GL_DEPTH_COMPONENT16: 1255 case GL_DEPTH_COMPONENT24: 1256 case GL_DEPTH_COMPONENT32: 1257 case GL_DEPTH_COMPONENT32F: 1258 return GL_TRUE; 1259 default: 1260 return GL_FALSE; 1261 } 1262} 1263 1264 1265/** 1266 * Test if the given image format is a stencil format. 1267 */ 1268GLboolean 1269_mesa_is_stencil_format(GLenum format) 1270{ 1271 switch (format) { 1272 case GL_STENCIL_INDEX: 1273 return GL_TRUE; 1274 default: 1275 return GL_FALSE; 1276 } 1277} 1278 1279 1280/** 1281 * Test if the given image format is a YCbCr format. 1282 */ 1283GLboolean 1284_mesa_is_ycbcr_format(GLenum format) 1285{ 1286 switch (format) { 1287 case GL_YCBCR_MESA: 1288 return GL_TRUE; 1289 default: 1290 return GL_FALSE; 1291 } 1292} 1293 1294 1295/** 1296 * Test if the given image format is a depth+stencil format. 1297 */ 1298GLboolean 1299_mesa_is_depthstencil_format(GLenum format) 1300{ 1301 switch (format) { 1302 case GL_DEPTH24_STENCIL8_EXT: 1303 case GL_DEPTH_STENCIL_EXT: 1304 case GL_DEPTH32F_STENCIL8: 1305 return GL_TRUE; 1306 default: 1307 return GL_FALSE; 1308 } 1309} 1310 1311 1312/** 1313 * Test if the given image format is a depth or stencil format. 1314 */ 1315GLboolean 1316_mesa_is_depth_or_stencil_format(GLenum format) 1317{ 1318 switch (format) { 1319 case GL_DEPTH_COMPONENT: 1320 case GL_DEPTH_COMPONENT16: 1321 case GL_DEPTH_COMPONENT24: 1322 case GL_DEPTH_COMPONENT32: 1323 case GL_STENCIL_INDEX: 1324 case GL_STENCIL_INDEX1_EXT: 1325 case GL_STENCIL_INDEX4_EXT: 1326 case GL_STENCIL_INDEX8_EXT: 1327 case GL_STENCIL_INDEX16_EXT: 1328 case GL_DEPTH_STENCIL_EXT: 1329 case GL_DEPTH24_STENCIL8_EXT: 1330 case GL_DEPTH_COMPONENT32F: 1331 case GL_DEPTH32F_STENCIL8: 1332 return GL_TRUE; 1333 default: 1334 return GL_FALSE; 1335 } 1336} 1337 1338 1339/** 1340 * Test if an image format is a supported compressed format. 1341 * \param format the internal format token provided by the user. 1342 * \return GL_TRUE if compressed, GL_FALSE if uncompressed 1343 */ 1344GLboolean 1345_mesa_is_compressed_format(const struct gl_context *ctx, GLenum format) 1346{ 1347 mesa_format m_format = _mesa_glenum_to_compressed_format(format); 1348 1349 /* Some formats in this switch have an equivalent mesa_format_layout 1350 * to the compressed formats in the layout switch below and thus 1351 * must be handled first. 1352 */ 1353 switch (format) { 1354 case GL_RGB_S3TC: 1355 case GL_RGB4_S3TC: 1356 case GL_RGBA_S3TC: 1357 case GL_RGBA4_S3TC: 1358 return _mesa_has_S3_s3tc(ctx); 1359 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 1360 return _mesa_has_ATI_texture_compression_3dc(ctx); 1361 case GL_PALETTE4_RGB8_OES: 1362 case GL_PALETTE4_RGBA8_OES: 1363 case GL_PALETTE4_R5_G6_B5_OES: 1364 case GL_PALETTE4_RGBA4_OES: 1365 case GL_PALETTE4_RGB5_A1_OES: 1366 case GL_PALETTE8_RGB8_OES: 1367 case GL_PALETTE8_RGBA8_OES: 1368 case GL_PALETTE8_R5_G6_B5_OES: 1369 case GL_PALETTE8_RGBA4_OES: 1370 case GL_PALETTE8_RGB5_A1_OES: 1371 return ctx->API == API_OPENGLES; 1372 } 1373 1374 switch (_mesa_get_format_layout(m_format)) { 1375 case MESA_FORMAT_LAYOUT_S3TC: 1376 if (_mesa_get_format_color_encoding(m_format) == GL_LINEAR) { 1377 return _mesa_has_EXT_texture_compression_s3tc(ctx); 1378 } else { 1379 return (_mesa_has_EXT_texture_sRGB(ctx) || 1380 _mesa_has_EXT_texture_compression_s3tc_srgb(ctx)) && 1381 _mesa_has_EXT_texture_compression_s3tc(ctx); 1382 } 1383 case MESA_FORMAT_LAYOUT_FXT1: 1384 return _mesa_has_3DFX_texture_compression_FXT1(ctx); 1385 case MESA_FORMAT_LAYOUT_RGTC: 1386 return _mesa_has_ARB_texture_compression_rgtc(ctx) || 1387 _mesa_has_EXT_texture_compression_rgtc(ctx); 1388 case MESA_FORMAT_LAYOUT_LATC: 1389 return _mesa_has_EXT_texture_compression_latc(ctx); 1390 case MESA_FORMAT_LAYOUT_ETC1: 1391 return _mesa_has_OES_compressed_ETC1_RGB8_texture(ctx); 1392 case MESA_FORMAT_LAYOUT_ETC2: 1393 return _mesa_is_gles3(ctx) || _mesa_has_ARB_ES3_compatibility(ctx); 1394 case MESA_FORMAT_LAYOUT_BPTC: 1395 return _mesa_has_ARB_texture_compression_bptc(ctx) || 1396 _mesa_has_EXT_texture_compression_bptc(ctx); 1397 case MESA_FORMAT_LAYOUT_ASTC: 1398 return _mesa_has_KHR_texture_compression_astc_ldr(ctx); 1399 case MESA_FORMAT_LAYOUT_ATC: 1400 return _mesa_has_AMD_compressed_ATC_texture(ctx); 1401 default: 1402 return GL_FALSE; 1403 } 1404} 1405 1406/** 1407 * Test if the given format represents an sRGB format. 1408 * \param format the GL format (can be an internal format) 1409 * \return GL_TRUE if format is sRGB, GL_FALSE otherwise 1410 */ 1411GLboolean 1412_mesa_is_srgb_format(GLenum format) 1413{ 1414 switch (format) { 1415 case GL_SRGB: 1416 case GL_SRGB8: 1417 case GL_SRGB_ALPHA: 1418 case GL_SRGB8_ALPHA8: 1419 case GL_COMPRESSED_SRGB: 1420 case GL_COMPRESSED_SRGB_ALPHA: 1421 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 1422 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 1423 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 1424 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 1425 case GL_COMPRESSED_SRGB8_ETC2: 1426 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 1427 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 1428 case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: 1429 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: 1430 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: 1431 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: 1432 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: 1433 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: 1434 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: 1435 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: 1436 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: 1437 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: 1438 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: 1439 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: 1440 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: 1441 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: 1442 case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: 1443 return GL_TRUE; 1444 default: 1445 break; 1446 } 1447 1448 return GL_FALSE; 1449} 1450 1451/** 1452 * Convert various unpack formats to the corresponding base format. 1453 */ 1454GLenum 1455_mesa_unpack_format_to_base_format(GLenum format) 1456{ 1457 switch(format) { 1458 case GL_RED_INTEGER: 1459 return GL_RED; 1460 case GL_GREEN_INTEGER: 1461 return GL_GREEN; 1462 case GL_BLUE_INTEGER: 1463 return GL_BLUE; 1464 case GL_ALPHA_INTEGER: 1465 return GL_ALPHA; 1466 case GL_RG_INTEGER: 1467 return GL_RG; 1468 case GL_RGB_INTEGER: 1469 return GL_RGB; 1470 case GL_RGBA_INTEGER: 1471 return GL_RGBA; 1472 case GL_BGR_INTEGER: 1473 return GL_BGR; 1474 case GL_BGRA_INTEGER: 1475 return GL_BGRA; 1476 case GL_LUMINANCE_INTEGER_EXT: 1477 return GL_LUMINANCE; 1478 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 1479 return GL_LUMINANCE_ALPHA; 1480 case GL_RED: 1481 case GL_GREEN: 1482 case GL_BLUE: 1483 case GL_RG: 1484 case GL_RGB: 1485 case GL_RGBA: 1486 case GL_BGR: 1487 case GL_BGRA: 1488 case GL_ALPHA: 1489 case GL_LUMINANCE: 1490 case GL_LUMINANCE_ALPHA: 1491 default: 1492 return format; 1493 } 1494} 1495 1496/** 1497 * Convert various base formats to the corresponding integer format. 1498 */ 1499GLenum 1500_mesa_base_format_to_integer_format(GLenum format) 1501{ 1502 switch(format) { 1503 case GL_RED: 1504 return GL_RED_INTEGER; 1505 case GL_GREEN: 1506 return GL_GREEN_INTEGER; 1507 case GL_BLUE: 1508 return GL_BLUE_INTEGER; 1509 case GL_RG: 1510 return GL_RG_INTEGER; 1511 case GL_RGB: 1512 return GL_RGB_INTEGER; 1513 case GL_RGBA: 1514 return GL_RGBA_INTEGER; 1515 case GL_BGR: 1516 return GL_BGR_INTEGER; 1517 case GL_BGRA: 1518 return GL_BGRA_INTEGER; 1519 case GL_ALPHA: 1520 return GL_ALPHA_INTEGER; 1521 case GL_LUMINANCE: 1522 return GL_LUMINANCE_INTEGER_EXT; 1523 case GL_LUMINANCE_ALPHA: 1524 return GL_LUMINANCE_ALPHA_INTEGER_EXT; 1525 } 1526 1527 return format; 1528} 1529 1530 1531/** 1532 * Does the given base texture/renderbuffer format have the channel 1533 * named by 'pname'? 1534 */ 1535GLboolean 1536_mesa_base_format_has_channel(GLenum base_format, GLenum pname) 1537{ 1538 switch (pname) { 1539 case GL_TEXTURE_RED_SIZE: 1540 case GL_TEXTURE_RED_TYPE: 1541 case GL_RENDERBUFFER_RED_SIZE_EXT: 1542 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE: 1543 case GL_INTERNALFORMAT_RED_SIZE: 1544 case GL_INTERNALFORMAT_RED_TYPE: 1545 if (base_format == GL_RED || 1546 base_format == GL_RG || 1547 base_format == GL_RGB || 1548 base_format == GL_RGBA) { 1549 return GL_TRUE; 1550 } 1551 return GL_FALSE; 1552 case GL_TEXTURE_GREEN_SIZE: 1553 case GL_TEXTURE_GREEN_TYPE: 1554 case GL_RENDERBUFFER_GREEN_SIZE_EXT: 1555 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: 1556 case GL_INTERNALFORMAT_GREEN_SIZE: 1557 case GL_INTERNALFORMAT_GREEN_TYPE: 1558 if (base_format == GL_RG || 1559 base_format == GL_RGB || 1560 base_format == GL_RGBA) { 1561 return GL_TRUE; 1562 } 1563 return GL_FALSE; 1564 case GL_TEXTURE_BLUE_SIZE: 1565 case GL_TEXTURE_BLUE_TYPE: 1566 case GL_RENDERBUFFER_BLUE_SIZE_EXT: 1567 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: 1568 case GL_INTERNALFORMAT_BLUE_SIZE: 1569 case GL_INTERNALFORMAT_BLUE_TYPE: 1570 if (base_format == GL_RGB || 1571 base_format == GL_RGBA) { 1572 return GL_TRUE; 1573 } 1574 return GL_FALSE; 1575 case GL_TEXTURE_ALPHA_SIZE: 1576 case GL_TEXTURE_ALPHA_TYPE: 1577 case GL_RENDERBUFFER_ALPHA_SIZE_EXT: 1578 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: 1579 case GL_INTERNALFORMAT_ALPHA_SIZE: 1580 case GL_INTERNALFORMAT_ALPHA_TYPE: 1581 if (base_format == GL_RGBA || 1582 base_format == GL_ALPHA || 1583 base_format == GL_LUMINANCE_ALPHA) { 1584 return GL_TRUE; 1585 } 1586 return GL_FALSE; 1587 case GL_TEXTURE_LUMINANCE_SIZE: 1588 case GL_TEXTURE_LUMINANCE_TYPE: 1589 if (base_format == GL_LUMINANCE || 1590 base_format == GL_LUMINANCE_ALPHA) { 1591 return GL_TRUE; 1592 } 1593 return GL_FALSE; 1594 case GL_TEXTURE_INTENSITY_SIZE: 1595 case GL_TEXTURE_INTENSITY_TYPE: 1596 if (base_format == GL_INTENSITY) { 1597 return GL_TRUE; 1598 } 1599 return GL_FALSE; 1600 case GL_TEXTURE_DEPTH_SIZE: 1601 case GL_TEXTURE_DEPTH_TYPE: 1602 case GL_RENDERBUFFER_DEPTH_SIZE_EXT: 1603 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: 1604 case GL_INTERNALFORMAT_DEPTH_SIZE: 1605 case GL_INTERNALFORMAT_DEPTH_TYPE: 1606 if (base_format == GL_DEPTH_STENCIL || 1607 base_format == GL_DEPTH_COMPONENT) { 1608 return GL_TRUE; 1609 } 1610 return GL_FALSE; 1611 case GL_RENDERBUFFER_STENCIL_SIZE_EXT: 1612 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: 1613 case GL_INTERNALFORMAT_STENCIL_SIZE: 1614 case GL_INTERNALFORMAT_STENCIL_TYPE: 1615 if (base_format == GL_DEPTH_STENCIL || 1616 base_format == GL_STENCIL_INDEX) { 1617 return GL_TRUE; 1618 } 1619 return GL_FALSE; 1620 default: 1621 _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n", 1622 __func__, pname); 1623 return GL_FALSE; 1624 } 1625 1626 return GL_FALSE; 1627} 1628 1629 1630/** 1631 * If format is a generic compressed format, return the corresponding 1632 * non-compressed format. For other formats, return the format as-is. 1633 */ 1634GLenum 1635_mesa_generic_compressed_format_to_uncompressed_format(GLenum format) 1636{ 1637 switch (format) { 1638 case GL_COMPRESSED_RED: 1639 return GL_RED; 1640 case GL_COMPRESSED_RG: 1641 return GL_RG; 1642 case GL_COMPRESSED_RGB: 1643 return GL_RGB; 1644 case GL_COMPRESSED_RGBA: 1645 return GL_RGBA; 1646 case GL_COMPRESSED_ALPHA: 1647 return GL_ALPHA; 1648 case GL_COMPRESSED_LUMINANCE: 1649 return GL_LUMINANCE; 1650 case GL_COMPRESSED_LUMINANCE_ALPHA: 1651 return GL_LUMINANCE_ALPHA; 1652 case GL_COMPRESSED_INTENSITY: 1653 return GL_INTENSITY; 1654 /* sRGB formats */ 1655 case GL_COMPRESSED_SRGB: 1656 return GL_SRGB; 1657 case GL_COMPRESSED_SRGB_ALPHA: 1658 return GL_SRGB_ALPHA; 1659 case GL_COMPRESSED_SLUMINANCE: 1660 return GL_SLUMINANCE; 1661 case GL_COMPRESSED_SLUMINANCE_ALPHA: 1662 return GL_SLUMINANCE_ALPHA; 1663 default: 1664 return format; 1665 } 1666} 1667 1668 1669/** 1670 * Return the equivalent non-generic internal format. 1671 * This is useful for comparing whether two internal formats are equivalent. 1672 */ 1673GLenum 1674_mesa_get_nongeneric_internalformat(GLenum format) 1675{ 1676 switch (format) { 1677 /* GL 1.1 formats. */ 1678 case 4: 1679 case GL_RGBA: 1680 return GL_RGBA8; 1681 case 3: 1682 case GL_RGB: 1683 return GL_RGB8; 1684 case 2: 1685 case GL_LUMINANCE_ALPHA: 1686 return GL_LUMINANCE8_ALPHA8; 1687 case 1: 1688 case GL_LUMINANCE: 1689 return GL_LUMINANCE8; 1690 case GL_ALPHA: 1691 return GL_ALPHA8; 1692 case GL_INTENSITY: 1693 return GL_INTENSITY8; 1694 1695 /* GL_ARB_texture_rg */ 1696 case GL_RED: 1697 return GL_R8; 1698 case GL_RG: 1699 return GL_RG8; 1700 1701 /* GL_EXT_texture_sRGB */ 1702 case GL_SRGB: 1703 return GL_SRGB8; 1704 case GL_SRGB_ALPHA: 1705 return GL_SRGB8_ALPHA8; 1706 case GL_SLUMINANCE: 1707 return GL_SLUMINANCE8; 1708 case GL_SLUMINANCE_ALPHA: 1709 return GL_SLUMINANCE8_ALPHA8; 1710 1711 /* GL_EXT_texture_snorm */ 1712 case GL_RGBA_SNORM: 1713 return GL_RGBA8_SNORM; 1714 case GL_RGB_SNORM: 1715 return GL_RGB8_SNORM; 1716 case GL_RG_SNORM: 1717 return GL_RG8_SNORM; 1718 case GL_RED_SNORM: 1719 return GL_R8_SNORM; 1720 case GL_LUMINANCE_ALPHA_SNORM: 1721 return GL_LUMINANCE8_ALPHA8_SNORM; 1722 case GL_LUMINANCE_SNORM: 1723 return GL_LUMINANCE8_SNORM; 1724 case GL_ALPHA_SNORM: 1725 return GL_ALPHA8_SNORM; 1726 case GL_INTENSITY_SNORM: 1727 return GL_INTENSITY8_SNORM; 1728 1729 default: 1730 return format; 1731 } 1732} 1733 1734 1735/** 1736 * Convert an sRGB internal format to linear. 1737 */ 1738GLenum 1739_mesa_get_linear_internalformat(GLenum format) 1740{ 1741 switch (format) { 1742 case GL_SRGB: 1743 return GL_RGB; 1744 case GL_SRGB_ALPHA: 1745 return GL_RGBA; 1746 case GL_SRGB8: 1747 return GL_RGB8; 1748 case GL_SRGB8_ALPHA8: 1749 return GL_RGBA8; 1750 case GL_SLUMINANCE8: 1751 return GL_LUMINANCE8; 1752 case GL_SLUMINANCE: 1753 return GL_LUMINANCE; 1754 case GL_SLUMINANCE_ALPHA: 1755 return GL_LUMINANCE_ALPHA; 1756 case GL_SLUMINANCE8_ALPHA8: 1757 return GL_LUMINANCE8_ALPHA8; 1758 default: 1759 return format; 1760 } 1761} 1762 1763 1764/** 1765 * Do error checking of format/type combinations for glReadPixels, 1766 * glDrawPixels and glTex[Sub]Image. Note that depending on the format 1767 * and type values, we may either generate GL_INVALID_OPERATION or 1768 * GL_INVALID_ENUM. 1769 * 1770 * \param format pixel format. 1771 * \param type pixel type. 1772 * 1773 * \return GL_INVALID_ENUM, GL_INVALID_OPERATION or GL_NO_ERROR 1774 */ 1775GLenum 1776_mesa_error_check_format_and_type(const struct gl_context *ctx, 1777 GLenum format, GLenum type) 1778{ 1779 /* From OpenGL 3.3 spec, page 220: 1780 * "If the format is DEPTH_STENCIL, then values are taken from 1781 * both the depth buffer and the stencil buffer. If there is no 1782 * depth buffer or if there is no stencil buffer, then the error 1783 * INVALID_OPERATION occurs. If the type parameter is not 1784 * UNSIGNED_INT_24_8 or FLOAT_32_UNSIGNED_INT_24_8_REV, then the 1785 * error INVALID_ENUM occurs." 1786 * 1787 * OpenGL ES still generates GL_INVALID_OPERATION because glReadPixels 1788 * cannot be used to read depth or stencil in that API. 1789 */ 1790 if (_mesa_is_desktop_gl(ctx) && format == GL_DEPTH_STENCIL 1791 && type != GL_UNSIGNED_INT_24_8 1792 && type != GL_FLOAT_32_UNSIGNED_INT_24_8_REV) 1793 return GL_INVALID_ENUM; 1794 1795 /* special type-based checks (see glReadPixels, glDrawPixels error lists) */ 1796 switch (type) { 1797 case GL_BITMAP: 1798 if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) { 1799 return GL_INVALID_ENUM; 1800 } 1801 break; 1802 1803 case GL_UNSIGNED_BYTE_3_3_2: 1804 case GL_UNSIGNED_BYTE_2_3_3_REV: 1805 case GL_UNSIGNED_SHORT_5_6_5: 1806 case GL_UNSIGNED_SHORT_5_6_5_REV: 1807 if (format == GL_RGB) { 1808 break; /* OK */ 1809 } 1810 if (format == GL_RGB_INTEGER_EXT && 1811 _mesa_has_texture_rgb10_a2ui(ctx)) { 1812 break; /* OK */ 1813 } 1814 return GL_INVALID_OPERATION; 1815 1816 case GL_UNSIGNED_SHORT_4_4_4_4: 1817 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 1818 case GL_UNSIGNED_INT_8_8_8_8: 1819 case GL_UNSIGNED_INT_8_8_8_8_REV: 1820 if (format == GL_RGBA || 1821 format == GL_BGRA || 1822 format == GL_ABGR_EXT) { 1823 break; /* OK */ 1824 } 1825 if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) && 1826 _mesa_has_texture_rgb10_a2ui(ctx)) { 1827 break; /* OK */ 1828 } 1829 return GL_INVALID_OPERATION; 1830 1831 case GL_UNSIGNED_SHORT_5_5_5_1: 1832 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 1833 case GL_UNSIGNED_INT_10_10_10_2: 1834 case GL_UNSIGNED_INT_2_10_10_10_REV: 1835 if (format == GL_RGBA || 1836 format == GL_BGRA) { 1837 break; /* OK */ 1838 } 1839 if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) && 1840 _mesa_has_texture_rgb10_a2ui(ctx)) { 1841 break; /* OK */ 1842 } 1843 if (type == GL_UNSIGNED_INT_2_10_10_10_REV && format == GL_RGB && 1844 ctx->API == API_OPENGLES2) { 1845 break; /* OK by GL_EXT_texture_type_2_10_10_10_REV */ 1846 } 1847 return GL_INVALID_OPERATION; 1848 1849 case GL_UNSIGNED_INT_24_8: 1850 /* Depth buffer OK to read in OpenGL ES (NV_read_depth). */ 1851 if (ctx->API == API_OPENGLES2 && format == GL_DEPTH_COMPONENT) 1852 return GL_NO_ERROR; 1853 1854 if (format != GL_DEPTH_STENCIL) { 1855 return GL_INVALID_OPERATION; 1856 } 1857 return GL_NO_ERROR; 1858 1859 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 1860 if (!_mesa_has_float_depth_buffer(ctx)) { 1861 return GL_INVALID_ENUM; 1862 } 1863 if (format != GL_DEPTH_STENCIL) { 1864 return GL_INVALID_OPERATION; 1865 } 1866 return GL_NO_ERROR; 1867 1868 case GL_UNSIGNED_INT_10F_11F_11F_REV: 1869 if (!_mesa_has_packed_float(ctx)) { 1870 return GL_INVALID_ENUM; 1871 } 1872 if (format != GL_RGB) { 1873 return GL_INVALID_OPERATION; 1874 } 1875 return GL_NO_ERROR; 1876 1877 case GL_HALF_FLOAT_OES: 1878 switch (format) { 1879 case GL_RGBA: 1880 case GL_RGB: 1881 case GL_LUMINANCE_ALPHA: 1882 case GL_LUMINANCE: 1883 case GL_ALPHA: 1884 return GL_NO_ERROR; 1885 case GL_RG: 1886 case GL_RED: 1887 if (_mesa_has_rg_textures(ctx)) 1888 return GL_NO_ERROR; 1889 default: 1890 return GL_INVALID_OPERATION; 1891 } 1892 1893 default: 1894 ; /* fall-through */ 1895 } 1896 1897 /* now, for each format, check the type for compatibility */ 1898 switch (format) { 1899 case GL_COLOR_INDEX: 1900 case GL_STENCIL_INDEX: 1901 switch (type) { 1902 case GL_BITMAP: 1903 case GL_BYTE: 1904 case GL_UNSIGNED_BYTE: 1905 case GL_SHORT: 1906 case GL_UNSIGNED_SHORT: 1907 case GL_INT: 1908 case GL_UNSIGNED_INT: 1909 case GL_FLOAT: 1910 case GL_HALF_FLOAT: 1911 return GL_NO_ERROR; 1912 default: 1913 return GL_INVALID_ENUM; 1914 } 1915 1916 case GL_RED: 1917 case GL_GREEN: 1918 case GL_BLUE: 1919 case GL_ALPHA: 1920#if 0 /* not legal! see table 3.6 of the 1.5 spec */ 1921 case GL_INTENSITY: 1922#endif 1923 case GL_LUMINANCE: 1924 case GL_LUMINANCE_ALPHA: 1925 case GL_DEPTH_COMPONENT: 1926 switch (type) { 1927 case GL_BYTE: 1928 case GL_UNSIGNED_BYTE: 1929 case GL_SHORT: 1930 case GL_UNSIGNED_SHORT: 1931 case GL_INT: 1932 case GL_UNSIGNED_INT: 1933 case GL_FLOAT: 1934 case GL_HALF_FLOAT: 1935 return GL_NO_ERROR; 1936 default: 1937 return GL_INVALID_ENUM; 1938 } 1939 1940 case GL_RG: 1941 if (!_mesa_has_rg_textures(ctx)) 1942 return GL_INVALID_ENUM; 1943 switch (type) { 1944 case GL_BYTE: 1945 case GL_UNSIGNED_BYTE: 1946 case GL_SHORT: 1947 case GL_UNSIGNED_SHORT: 1948 case GL_INT: 1949 case GL_UNSIGNED_INT: 1950 case GL_FLOAT: 1951 case GL_HALF_FLOAT: 1952 return GL_NO_ERROR; 1953 default: 1954 return GL_INVALID_ENUM; 1955 } 1956 1957 case GL_RGB: 1958 switch (type) { 1959 case GL_BYTE: 1960 case GL_UNSIGNED_BYTE: 1961 case GL_SHORT: 1962 case GL_UNSIGNED_SHORT: 1963 case GL_INT: 1964 case GL_UNSIGNED_INT: 1965 case GL_FLOAT: 1966 case GL_UNSIGNED_BYTE_3_3_2: 1967 case GL_UNSIGNED_BYTE_2_3_3_REV: 1968 case GL_UNSIGNED_SHORT_5_6_5: 1969 case GL_UNSIGNED_SHORT_5_6_5_REV: 1970 case GL_HALF_FLOAT: 1971 return GL_NO_ERROR; 1972 case GL_UNSIGNED_INT_2_10_10_10_REV: 1973 /* OK by GL_EXT_texture_type_2_10_10_10_REV */ 1974 return (ctx->API == API_OPENGLES2) 1975 ? GL_NO_ERROR : GL_INVALID_ENUM; 1976 case GL_UNSIGNED_INT_5_9_9_9_REV: 1977 return _mesa_has_texture_shared_exponent(ctx) 1978 ? GL_NO_ERROR : GL_INVALID_ENUM; 1979 case GL_UNSIGNED_INT_10F_11F_11F_REV: 1980 return _mesa_has_packed_float(ctx) 1981 ? GL_NO_ERROR : GL_INVALID_ENUM; 1982 default: 1983 return GL_INVALID_ENUM; 1984 } 1985 1986 case GL_BGR: 1987 switch (type) { 1988 /* NOTE: no packed types are supported with BGR. That's 1989 * intentional, according to the GL spec. 1990 */ 1991 case GL_BYTE: 1992 case GL_UNSIGNED_BYTE: 1993 case GL_SHORT: 1994 case GL_UNSIGNED_SHORT: 1995 case GL_INT: 1996 case GL_UNSIGNED_INT: 1997 case GL_FLOAT: 1998 case GL_HALF_FLOAT: 1999 return GL_NO_ERROR; 2000 default: 2001 return GL_INVALID_ENUM; 2002 } 2003 2004 case GL_RGBA: 2005 case GL_BGRA: 2006 switch (type) { 2007 case GL_BYTE: 2008 case GL_UNSIGNED_BYTE: 2009 case GL_SHORT: 2010 case GL_UNSIGNED_SHORT: 2011 case GL_INT: 2012 case GL_UNSIGNED_INT: 2013 case GL_FLOAT: 2014 case GL_UNSIGNED_SHORT_4_4_4_4: 2015 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2016 case GL_UNSIGNED_SHORT_5_5_5_1: 2017 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2018 case GL_UNSIGNED_INT_8_8_8_8: 2019 case GL_UNSIGNED_INT_8_8_8_8_REV: 2020 case GL_UNSIGNED_INT_10_10_10_2: 2021 case GL_UNSIGNED_INT_2_10_10_10_REV: 2022 case GL_HALF_FLOAT: 2023 return GL_NO_ERROR; 2024 default: 2025 return GL_INVALID_ENUM; 2026 } 2027 2028 case GL_ABGR_EXT: 2029 switch (type) { 2030 case GL_BYTE: 2031 case GL_UNSIGNED_BYTE: 2032 case GL_SHORT: 2033 case GL_UNSIGNED_SHORT: 2034 case GL_INT: 2035 case GL_UNSIGNED_INT: 2036 case GL_FLOAT: 2037 case GL_UNSIGNED_SHORT_4_4_4_4: 2038 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2039 case GL_UNSIGNED_INT_8_8_8_8: 2040 case GL_UNSIGNED_INT_8_8_8_8_REV: 2041 case GL_HALF_FLOAT: 2042 return GL_NO_ERROR; 2043 default: 2044 return GL_INVALID_ENUM; 2045 } 2046 2047 case GL_YCBCR_MESA: 2048 if (!_mesa_has_MESA_ycbcr_texture(ctx)) 2049 return GL_INVALID_ENUM; 2050 if (type == GL_UNSIGNED_SHORT_8_8_MESA || 2051 type == GL_UNSIGNED_SHORT_8_8_REV_MESA) 2052 return GL_NO_ERROR; 2053 else 2054 return GL_INVALID_OPERATION; 2055 2056 case GL_DEPTH_STENCIL: 2057 if (type == GL_UNSIGNED_INT_24_8) 2058 return GL_NO_ERROR; 2059 else if (_mesa_has_float_depth_buffer(ctx) && 2060 type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) 2061 return GL_NO_ERROR; 2062 else 2063 return GL_INVALID_ENUM; 2064 2065 /* integer-valued formats */ 2066 case GL_RED_INTEGER_EXT: 2067 case GL_GREEN_INTEGER_EXT: 2068 case GL_BLUE_INTEGER_EXT: 2069 case GL_ALPHA_INTEGER_EXT: 2070 case GL_RG_INTEGER: 2071 switch (type) { 2072 case GL_BYTE: 2073 case GL_UNSIGNED_BYTE: 2074 case GL_SHORT: 2075 case GL_UNSIGNED_SHORT: 2076 case GL_INT: 2077 case GL_UNSIGNED_INT: 2078 return _mesa_has_integer_textures(ctx) 2079 ? GL_NO_ERROR : GL_INVALID_ENUM; 2080 default: 2081 return GL_INVALID_ENUM; 2082 } 2083 2084 case GL_RGB_INTEGER_EXT: 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 case GL_UNSIGNED_BYTE_3_3_2: 2095 case GL_UNSIGNED_BYTE_2_3_3_REV: 2096 case GL_UNSIGNED_SHORT_5_6_5: 2097 case GL_UNSIGNED_SHORT_5_6_5_REV: 2098 return _mesa_has_texture_rgb10_a2ui(ctx) 2099 ? GL_NO_ERROR : GL_INVALID_ENUM; 2100 default: 2101 return GL_INVALID_ENUM; 2102 } 2103 2104 case GL_BGR_INTEGER_EXT: 2105 switch (type) { 2106 case GL_BYTE: 2107 case GL_UNSIGNED_BYTE: 2108 case GL_SHORT: 2109 case GL_UNSIGNED_SHORT: 2110 case GL_INT: 2111 case GL_UNSIGNED_INT: 2112 /* NOTE: no packed formats w/ BGR format */ 2113 return _mesa_has_integer_textures(ctx) 2114 ? GL_NO_ERROR : GL_INVALID_ENUM; 2115 default: 2116 return GL_INVALID_ENUM; 2117 } 2118 2119 case GL_RGBA_INTEGER_EXT: 2120 case GL_BGRA_INTEGER_EXT: 2121 switch (type) { 2122 case GL_BYTE: 2123 case GL_UNSIGNED_BYTE: 2124 case GL_SHORT: 2125 case GL_UNSIGNED_SHORT: 2126 case GL_INT: 2127 case GL_UNSIGNED_INT: 2128 return _mesa_has_integer_textures(ctx) 2129 ? GL_NO_ERROR : GL_INVALID_ENUM; 2130 case GL_UNSIGNED_SHORT_4_4_4_4: 2131 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 2132 case GL_UNSIGNED_SHORT_5_5_5_1: 2133 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 2134 case GL_UNSIGNED_INT_8_8_8_8: 2135 case GL_UNSIGNED_INT_8_8_8_8_REV: 2136 case GL_UNSIGNED_INT_10_10_10_2: 2137 case GL_UNSIGNED_INT_2_10_10_10_REV: 2138 return _mesa_has_texture_rgb10_a2ui(ctx) 2139 ? GL_NO_ERROR : GL_INVALID_ENUM; 2140 default: 2141 return GL_INVALID_ENUM; 2142 } 2143 2144 case GL_LUMINANCE_INTEGER_EXT: 2145 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 2146 switch (type) { 2147 case GL_BYTE: 2148 case GL_UNSIGNED_BYTE: 2149 case GL_SHORT: 2150 case GL_UNSIGNED_SHORT: 2151 case GL_INT: 2152 case GL_UNSIGNED_INT: 2153 return _mesa_has_integer_textures(ctx) 2154 ? GL_NO_ERROR : GL_INVALID_ENUM; 2155 default: 2156 return GL_INVALID_ENUM; 2157 } 2158 2159 default: 2160 return GL_INVALID_ENUM; 2161 } 2162 return GL_NO_ERROR; 2163} 2164 2165 2166/** 2167 * Do error checking of format/type combinations for OpenGL ES glReadPixels 2168 * and glTex[Sub]Image. 2169 * \return error code, or GL_NO_ERROR. 2170 */ 2171GLenum 2172_mesa_es_error_check_format_and_type(const struct gl_context *ctx, 2173 GLenum format, GLenum type, 2174 unsigned dimensions) 2175{ 2176 GLboolean type_valid = GL_TRUE; 2177 2178 switch (format) { 2179 case GL_RED: 2180 case GL_RG: 2181 if (!_mesa_has_rg_textures(ctx)) 2182 return GL_INVALID_VALUE; 2183 /* fallthrough */ 2184 case GL_ALPHA: 2185 case GL_LUMINANCE: 2186 case GL_LUMINANCE_ALPHA: 2187 type_valid = (type == GL_UNSIGNED_BYTE 2188 || type == GL_FLOAT 2189 || type == GL_HALF_FLOAT_OES); 2190 break; 2191 2192 case GL_RGB: 2193 type_valid = (type == GL_UNSIGNED_BYTE 2194 || type == GL_UNSIGNED_SHORT_5_6_5 2195 || type == GL_FLOAT 2196 || type == GL_HALF_FLOAT_OES); 2197 break; 2198 2199 case GL_RGBA: 2200 type_valid = (type == GL_UNSIGNED_BYTE 2201 || type == GL_UNSIGNED_SHORT_4_4_4_4 2202 || type == GL_UNSIGNED_SHORT_5_5_5_1 2203 || type == GL_FLOAT 2204 || type == GL_HALF_FLOAT_OES 2205 || (_mesa_has_texture_type_2_10_10_10_REV(ctx) && 2206 type == GL_UNSIGNED_INT_2_10_10_10_REV)); 2207 break; 2208 2209 case GL_DEPTH_COMPONENT: 2210 /* This format is filtered against invalid dimensionalities elsewhere. 2211 */ 2212 type_valid = (type == GL_UNSIGNED_SHORT 2213 || type == GL_UNSIGNED_INT); 2214 break; 2215 2216 case GL_DEPTH_STENCIL: 2217 /* This format is filtered against invalid dimensionalities elsewhere. 2218 */ 2219 type_valid = (type == GL_UNSIGNED_INT_24_8); 2220 break; 2221 2222 case GL_BGRA_EXT: 2223 type_valid = (type == GL_UNSIGNED_BYTE); 2224 2225 /* This feels like a bug in the EXT_texture_format_BGRA8888 spec, but 2226 * the format does not appear to be allowed for 3D textures in OpenGL 2227 * ES. 2228 */ 2229 if (dimensions != 2) 2230 return GL_INVALID_VALUE; 2231 2232 break; 2233 2234 default: 2235 return GL_INVALID_VALUE; 2236 } 2237 2238 return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION; 2239} 2240 2241/** 2242 * Return the simple base format for a given internal texture format. 2243 * For example, given GL_LUMINANCE12_ALPHA4, return GL_LUMINANCE_ALPHA. 2244 * 2245 * \param ctx GL context. 2246 * \param internalFormat the internal texture format token or 1, 2, 3, or 4. 2247 * 2248 * \return the corresponding \u base internal format (GL_ALPHA, GL_LUMINANCE, 2249 * GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA), or -1 if invalid enum. 2250 * 2251 * This is the format which is used during texture application (i.e. the 2252 * texture format and env mode determine the arithmetic used. 2253 */ 2254GLint 2255_mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) 2256{ 2257 switch (internalFormat) { 2258 case GL_ALPHA: 2259 case GL_ALPHA4: 2260 case GL_ALPHA8: 2261 case GL_ALPHA12: 2262 case GL_ALPHA16: 2263 return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 2264 case 1: 2265 case GL_LUMINANCE: 2266 case GL_LUMINANCE4: 2267 case GL_LUMINANCE8: 2268 case GL_LUMINANCE12: 2269 case GL_LUMINANCE16: 2270 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 2271 case 2: 2272 case GL_LUMINANCE_ALPHA: 2273 case GL_LUMINANCE4_ALPHA4: 2274 case GL_LUMINANCE6_ALPHA2: 2275 case GL_LUMINANCE8_ALPHA8: 2276 case GL_LUMINANCE12_ALPHA4: 2277 case GL_LUMINANCE12_ALPHA12: 2278 case GL_LUMINANCE16_ALPHA16: 2279 return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 2280 case GL_INTENSITY: 2281 case GL_INTENSITY4: 2282 case GL_INTENSITY8: 2283 case GL_INTENSITY12: 2284 case GL_INTENSITY16: 2285 return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 2286 case 3: 2287 return (ctx->API != API_OPENGL_CORE) ? GL_RGB : -1; 2288 case GL_RGB: 2289 case GL_R3_G3_B2: 2290 case GL_RGB4: 2291 case GL_RGB5: 2292 case GL_RGB8: 2293 case GL_RGB10: 2294 case GL_RGB12: 2295 case GL_RGB16: 2296 return GL_RGB; 2297 case 4: 2298 return (ctx->API != API_OPENGL_CORE) ? GL_RGBA : -1; 2299 case GL_RGBA: 2300 case GL_RGBA2: 2301 case GL_RGBA4: 2302 case GL_RGB5_A1: 2303 case GL_RGBA8: 2304 case GL_RGB10_A2: 2305 case GL_RGBA12: 2306 case GL_RGBA16: 2307 return GL_RGBA; 2308 default: 2309 ; /* fallthrough */ 2310 } 2311 2312 /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0). 2313 */ 2314 if (_mesa_is_gles(ctx)) { 2315 switch (internalFormat) { 2316 case GL_BGRA: 2317 return GL_RGBA; 2318 default: 2319 ; /* fallthrough */ 2320 } 2321 } 2322 2323 if (_mesa_has_ARB_ES2_compatibility(ctx) || 2324 _mesa_has_OES_framebuffer_object(ctx) || 2325 ctx->API == API_OPENGLES2) { 2326 switch (internalFormat) { 2327 case GL_RGB565: 2328 return GL_RGB; 2329 default: 2330 ; /* fallthrough */ 2331 } 2332 } 2333 2334 if (_mesa_has_ARB_depth_texture(ctx) || _mesa_has_OES_depth_texture(ctx) || 2335 ctx->API == API_OPENGL_CORE) { 2336 switch (internalFormat) { 2337 case GL_DEPTH_COMPONENT: 2338 case GL_DEPTH_COMPONENT16: 2339 case GL_DEPTH_COMPONENT24: 2340 case GL_DEPTH_COMPONENT32: 2341 return GL_DEPTH_COMPONENT; 2342 case GL_DEPTH_STENCIL: 2343 case GL_DEPTH24_STENCIL8: 2344 return GL_DEPTH_STENCIL; 2345 default: 2346 ; /* fallthrough */ 2347 } 2348 } 2349 2350 if (_mesa_has_ARB_texture_stencil8(ctx) || 2351 _mesa_has_OES_texture_stencil8(ctx)) { 2352 switch (internalFormat) { 2353 case GL_STENCIL_INDEX: 2354 case GL_STENCIL_INDEX1: 2355 case GL_STENCIL_INDEX4: 2356 case GL_STENCIL_INDEX8: 2357 case GL_STENCIL_INDEX16: 2358 return GL_STENCIL_INDEX; 2359 default: 2360 ; /* fallthrough */ 2361 } 2362 } 2363 2364 switch (internalFormat) { 2365 case GL_COMPRESSED_ALPHA: 2366 return GL_ALPHA; 2367 case GL_COMPRESSED_LUMINANCE: 2368 return GL_LUMINANCE; 2369 case GL_COMPRESSED_LUMINANCE_ALPHA: 2370 return GL_LUMINANCE_ALPHA; 2371 case GL_COMPRESSED_INTENSITY: 2372 return GL_INTENSITY; 2373 case GL_COMPRESSED_RGB: 2374 return GL_RGB; 2375 case GL_COMPRESSED_RGBA: 2376 return GL_RGBA; 2377 default: 2378 ; /* fallthrough */ 2379 } 2380 2381 if (_mesa_is_compressed_format(ctx, internalFormat)) { 2382 GLenum base_compressed = 2383 _mesa_gl_compressed_format_base_format(internalFormat); 2384 if (base_compressed) 2385 return base_compressed; 2386 } 2387 2388 if ((_mesa_has_KHR_texture_compression_astc_ldr(ctx) && 2389 is_astc_2d_format(internalFormat)) || 2390 (_mesa_has_OES_texture_compression_astc(ctx) && 2391 is_astc_3d_format(internalFormat))) 2392 return GL_RGBA; 2393 2394 if (!_mesa_has_MESA_ycbcr_texture(ctx)) { 2395 if (internalFormat == GL_YCBCR_MESA) 2396 return GL_YCBCR_MESA; 2397 } 2398 2399 if (_mesa_has_half_float_textures(ctx)) { 2400 switch (internalFormat) { 2401 case GL_ALPHA16F_ARB: 2402 return GL_ALPHA; 2403 case GL_RGBA16F_ARB: 2404 return GL_RGBA; 2405 case GL_RGB16F_ARB: 2406 return GL_RGB; 2407 case GL_INTENSITY16F_ARB: 2408 return GL_INTENSITY; 2409 case GL_LUMINANCE16F_ARB: 2410 return GL_LUMINANCE; 2411 case GL_LUMINANCE_ALPHA16F_ARB: 2412 return GL_LUMINANCE_ALPHA; 2413 } 2414 } 2415 2416 if (_mesa_has_float_textures(ctx)) { 2417 switch (internalFormat) { 2418 case GL_ALPHA32F_ARB: 2419 return GL_ALPHA; 2420 case GL_RGBA32F_ARB: 2421 return GL_RGBA; 2422 case GL_RGB32F_ARB: 2423 return GL_RGB; 2424 case GL_INTENSITY32F_ARB: 2425 return GL_INTENSITY; 2426 case GL_LUMINANCE32F_ARB: 2427 return GL_LUMINANCE; 2428 case GL_LUMINANCE_ALPHA32F_ARB: 2429 return GL_LUMINANCE_ALPHA; 2430 } 2431 } 2432 2433 if (_mesa_has_EXT_texture_snorm(ctx) || _mesa_is_gles3(ctx)) { 2434 switch (internalFormat) { 2435 case GL_RED_SNORM: 2436 case GL_R8_SNORM: 2437 case GL_R16_SNORM: 2438 return GL_RED; 2439 case GL_RG_SNORM: 2440 case GL_RG8_SNORM: 2441 case GL_RG16_SNORM: 2442 return GL_RG; 2443 case GL_RGB_SNORM: 2444 case GL_RGB8_SNORM: 2445 case GL_RGB16_SNORM: 2446 return GL_RGB; 2447 case GL_RGBA_SNORM: 2448 case GL_RGBA8_SNORM: 2449 case GL_RGBA16_SNORM: 2450 return GL_RGBA; 2451 case GL_ALPHA_SNORM: 2452 case GL_ALPHA8_SNORM: 2453 case GL_ALPHA16_SNORM: 2454 return GL_ALPHA; 2455 case GL_LUMINANCE_SNORM: 2456 case GL_LUMINANCE8_SNORM: 2457 case GL_LUMINANCE16_SNORM: 2458 return GL_LUMINANCE; 2459 case GL_LUMINANCE_ALPHA_SNORM: 2460 case GL_LUMINANCE8_ALPHA8_SNORM: 2461 case GL_LUMINANCE16_ALPHA16_SNORM: 2462 return GL_LUMINANCE_ALPHA; 2463 case GL_INTENSITY_SNORM: 2464 case GL_INTENSITY8_SNORM: 2465 case GL_INTENSITY16_SNORM: 2466 return GL_INTENSITY; 2467 default: 2468 ; /* fallthrough */ 2469 } 2470 } 2471 2472 if (_mesa_has_EXT_texture_sRGB(ctx) || _mesa_is_gles3(ctx)) { 2473 switch (internalFormat) { 2474 case GL_SRGB_EXT: 2475 case GL_SRGB8_EXT: 2476 case GL_COMPRESSED_SRGB_EXT: 2477 return GL_RGB; 2478 case GL_SRGB_ALPHA_EXT: 2479 case GL_SRGB8_ALPHA8_EXT: 2480 case GL_COMPRESSED_SRGB_ALPHA_EXT: 2481 return GL_RGBA; 2482 case GL_SLUMINANCE_ALPHA_EXT: 2483 case GL_SLUMINANCE8_ALPHA8_EXT: 2484 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 2485 return GL_LUMINANCE_ALPHA; 2486 case GL_SLUMINANCE_EXT: 2487 case GL_SLUMINANCE8_EXT: 2488 case GL_COMPRESSED_SLUMINANCE_EXT: 2489 return GL_LUMINANCE; 2490 default: 2491 ; /* fallthrough */ 2492 } 2493 } 2494 2495 if (_mesa_has_EXT_texture_sRGB_R8(ctx)) { 2496 switch (internalFormat) { 2497 case GL_SR8_EXT: 2498 return GL_RED; 2499 default: 2500 ; /* fallthrough */ 2501 } 2502 } 2503 2504 if (_mesa_has_integer_textures(ctx)) { 2505 switch (internalFormat) { 2506 case GL_RGBA8UI_EXT: 2507 case GL_RGBA16UI_EXT: 2508 case GL_RGBA32UI_EXT: 2509 case GL_RGBA8I_EXT: 2510 case GL_RGBA16I_EXT: 2511 case GL_RGBA32I_EXT: 2512 return GL_RGBA; 2513 case GL_RGB8UI_EXT: 2514 case GL_RGB16UI_EXT: 2515 case GL_RGB32UI_EXT: 2516 case GL_RGB8I_EXT: 2517 case GL_RGB16I_EXT: 2518 case GL_RGB32I_EXT: 2519 return GL_RGB; 2520 } 2521 } 2522 2523 if (_mesa_has_texture_rgb10_a2ui(ctx)) { 2524 switch (internalFormat) { 2525 case GL_RGB10_A2UI: 2526 return GL_RGBA; 2527 } 2528 } 2529 2530 if (_mesa_has_integer_textures(ctx)) { 2531 switch (internalFormat) { 2532 case GL_ALPHA8UI_EXT: 2533 case GL_ALPHA16UI_EXT: 2534 case GL_ALPHA32UI_EXT: 2535 case GL_ALPHA8I_EXT: 2536 case GL_ALPHA16I_EXT: 2537 case GL_ALPHA32I_EXT: 2538 return GL_ALPHA; 2539 case GL_INTENSITY8UI_EXT: 2540 case GL_INTENSITY16UI_EXT: 2541 case GL_INTENSITY32UI_EXT: 2542 case GL_INTENSITY8I_EXT: 2543 case GL_INTENSITY16I_EXT: 2544 case GL_INTENSITY32I_EXT: 2545 return GL_INTENSITY; 2546 case GL_LUMINANCE8UI_EXT: 2547 case GL_LUMINANCE16UI_EXT: 2548 case GL_LUMINANCE32UI_EXT: 2549 case GL_LUMINANCE8I_EXT: 2550 case GL_LUMINANCE16I_EXT: 2551 case GL_LUMINANCE32I_EXT: 2552 return GL_LUMINANCE; 2553 case GL_LUMINANCE_ALPHA8UI_EXT: 2554 case GL_LUMINANCE_ALPHA16UI_EXT: 2555 case GL_LUMINANCE_ALPHA32UI_EXT: 2556 case GL_LUMINANCE_ALPHA8I_EXT: 2557 case GL_LUMINANCE_ALPHA16I_EXT: 2558 case GL_LUMINANCE_ALPHA32I_EXT: 2559 return GL_LUMINANCE_ALPHA; 2560 default: 2561 ; /* fallthrough */ 2562 } 2563 } 2564 2565 if (_mesa_has_rg_textures(ctx)) { 2566 switch (internalFormat) { 2567 case GL_R16F: 2568 if (!_mesa_has_half_float_textures(ctx)) 2569 break; 2570 return GL_RED; 2571 case GL_R32F: 2572 if (!_mesa_has_float_textures(ctx)) 2573 break; 2574 return GL_RED; 2575 case GL_R8I: 2576 case GL_R8UI: 2577 case GL_R16I: 2578 case GL_R16UI: 2579 case GL_R32I: 2580 case GL_R32UI: 2581 if (!_mesa_has_integer_textures(ctx)) 2582 break; 2583 /* FALLTHROUGH */ 2584 case GL_R8: 2585 case GL_R16: 2586 case GL_RED: 2587 case GL_COMPRESSED_RED: 2588 return GL_RED; 2589 2590 case GL_RG16F: 2591 if (!_mesa_has_half_float_textures(ctx)) 2592 break; 2593 return GL_RG; 2594 case GL_RG32F: 2595 if (!_mesa_has_float_textures(ctx)) 2596 break; 2597 return GL_RG; 2598 case GL_RG8I: 2599 case GL_RG8UI: 2600 case GL_RG16I: 2601 case GL_RG16UI: 2602 case GL_RG32I: 2603 case GL_RG32UI: 2604 if (!_mesa_has_integer_textures(ctx)) 2605 break; 2606 /* FALLTHROUGH */ 2607 case GL_RG: 2608 case GL_RG8: 2609 case GL_RG16: 2610 case GL_COMPRESSED_RG: 2611 return GL_RG; 2612 default: 2613 ; /* fallthrough */ 2614 } 2615 } 2616 2617 if (_mesa_has_texture_shared_exponent(ctx)) { 2618 switch (internalFormat) { 2619 case GL_RGB9_E5_EXT: 2620 return GL_RGB; 2621 default: 2622 ; /* fallthrough */ 2623 } 2624 } 2625 2626 if (_mesa_has_packed_float(ctx)) { 2627 switch (internalFormat) { 2628 case GL_R11F_G11F_B10F_EXT: 2629 return GL_RGB; 2630 default: 2631 ; /* fallthrough */ 2632 } 2633 } 2634 2635 if (_mesa_has_float_depth_buffer(ctx)) { 2636 switch (internalFormat) { 2637 case GL_DEPTH_COMPONENT32F: 2638 return GL_DEPTH_COMPONENT; 2639 case GL_DEPTH32F_STENCIL8: 2640 return GL_DEPTH_STENCIL; 2641 default: 2642 ; /* fallthrough */ 2643 } 2644 } 2645 2646 return -1; /* error */ 2647} 2648 2649/** 2650 * Returns the effective internal format from a texture format and type. 2651 * This is used by texture image operations internally for validation, when 2652 * the specified internal format is a base (unsized) format. 2653 * 2654 * This method will only return a valid effective internal format if the 2655 * combination of format, type and internal format in base form, is acceptable. 2656 * 2657 * If a single sized internal format is defined in the spec (OpenGL-ES 3.0.4) or 2658 * in extensions, to unambiguously correspond to the given base format, then 2659 * that internal format is returned as the effective. Otherwise, if the 2660 * combination is accepted but a single effective format is not defined, the 2661 * passed base format will be returned instead. 2662 * 2663 * \param format the texture format 2664 * \param type the texture type 2665 */ 2666static GLenum 2667gles_effective_internal_format_for_format_and_type(GLenum format, 2668 GLenum type) 2669{ 2670 switch (type) { 2671 case GL_UNSIGNED_BYTE: 2672 switch (format) { 2673 case GL_RGBA: 2674 return GL_RGBA8; 2675 case GL_RGB: 2676 return GL_RGB8; 2677 case GL_RG: 2678 return GL_RG8; 2679 case GL_RED: 2680 return GL_R8; 2681 /* Although LUMINANCE_ALPHA, LUMINANCE and ALPHA appear in table 3.12, 2682 * (section 3.8 Texturing, page 128 of the OpenGL-ES 3.0.4) as effective 2683 * internal formats, they do not correspond to GL constants, so the base 2684 * format is returned instead. 2685 */ 2686 case GL_BGRA_EXT: 2687 case GL_LUMINANCE_ALPHA: 2688 case GL_LUMINANCE: 2689 case GL_ALPHA: 2690 return format; 2691 } 2692 break; 2693 2694 case GL_UNSIGNED_SHORT_4_4_4_4: 2695 if (format == GL_RGBA) 2696 return GL_RGBA4; 2697 break; 2698 2699 case GL_UNSIGNED_SHORT_5_5_5_1: 2700 if (format == GL_RGBA) 2701 return GL_RGB5_A1; 2702 break; 2703 2704 case GL_UNSIGNED_SHORT_5_6_5: 2705 if (format == GL_RGB) 2706 return GL_RGB565; 2707 break; 2708 2709 /* OES_packed_depth_stencil */ 2710 case GL_UNSIGNED_INT_24_8: 2711 if (format == GL_DEPTH_STENCIL) 2712 return GL_DEPTH24_STENCIL8; 2713 break; 2714 2715 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 2716 if (format == GL_DEPTH_STENCIL) 2717 return GL_DEPTH32F_STENCIL8; 2718 break; 2719 2720 case GL_UNSIGNED_SHORT: 2721 if (format == GL_DEPTH_COMPONENT) 2722 return GL_DEPTH_COMPONENT16; 2723 break; 2724 2725 case GL_UNSIGNED_INT: 2726 /* It can be DEPTH_COMPONENT16 or DEPTH_COMPONENT24, so just return 2727 * the format. 2728 */ 2729 if (format == GL_DEPTH_COMPONENT) 2730 return format; 2731 break; 2732 2733 /* OES_texture_float and OES_texture_half_float */ 2734 case GL_FLOAT: 2735 if (format == GL_DEPTH_COMPONENT) 2736 return GL_DEPTH_COMPONENT32F; 2737 /* fall through */ 2738 case GL_HALF_FLOAT_OES: 2739 switch (format) { 2740 case GL_RGBA: 2741 case GL_RGB: 2742 case GL_LUMINANCE_ALPHA: 2743 case GL_LUMINANCE: 2744 case GL_ALPHA: 2745 case GL_RED: 2746 case GL_RG: 2747 return format; 2748 } 2749 break; 2750 case GL_HALF_FLOAT: 2751 switch (format) { 2752 case GL_RG: 2753 case GL_RED: 2754 return format; 2755 } 2756 break; 2757 2758 /* GL_EXT_texture_type_2_10_10_10_REV */ 2759 case GL_UNSIGNED_INT_2_10_10_10_REV: 2760 switch (format) { 2761 case GL_RGBA: 2762 case GL_RGB: 2763 return format; 2764 } 2765 break; 2766 2767 default: 2768 /* fall through and return NONE */ 2769 break; 2770 } 2771 2772 return GL_NONE; 2773} 2774 2775/** 2776 * Do error checking of format/type combinations for OpenGL ES 3 2777 * glTex[Sub]Image, or ES1/ES2 with GL_OES_required_internalformat. 2778 * \return error code, or GL_NO_ERROR. 2779 */ 2780GLenum 2781_mesa_gles_error_check_format_and_type(const struct gl_context *ctx, 2782 GLenum format, GLenum type, 2783 GLenum internalFormat) 2784{ 2785 /* If internalFormat is an unsized format, then the effective internal 2786 * format derived from format and type should be used instead. Page 127, 2787 * section "3.8 Texturing" of the GLES 3.0.4 spec states: 2788 * 2789 * "if internalformat is a base internal format, the effective 2790 * internal format is a sized internal format that is derived 2791 * from the format and type for internal use by the GL. 2792 * Table 3.12 specifies the mapping of format and type to effective 2793 * internal formats. The effective internal format is used by the GL 2794 * for purposes such as texture completeness or type checks for 2795 * CopyTex* commands. In these cases, the GL is required to operate 2796 * as if the effective internal format was used as the internalformat 2797 * when specifying the texture data." 2798 */ 2799 if (_mesa_is_enum_format_unsized(internalFormat)) { 2800 GLenum effectiveInternalFormat = 2801 gles_effective_internal_format_for_format_and_type(format, type); 2802 2803 if (effectiveInternalFormat == GL_NONE) 2804 return GL_INVALID_OPERATION; 2805 2806 GLenum baseInternalFormat; 2807 if (internalFormat == GL_BGRA_EXT) { 2808 /* Unfortunately, _mesa_base_tex_format returns a base format of 2809 * GL_RGBA for GL_BGRA_EXT. This makes perfect sense if you're 2810 * asking the question, "what channels does this format have?" 2811 * However, if we're trying to determine if two internal formats 2812 * match in the ES3 sense, we actually want GL_BGRA. 2813 */ 2814 baseInternalFormat = GL_BGRA_EXT; 2815 } else { 2816 baseInternalFormat = 2817 _mesa_base_tex_format(ctx, effectiveInternalFormat); 2818 } 2819 2820 if (internalFormat != baseInternalFormat) 2821 return GL_INVALID_OPERATION; 2822 2823 internalFormat = effectiveInternalFormat; 2824 } 2825 2826 /* The GLES variant of EXT_texture_compression_s3tc is very vague and 2827 * doesn't list valid types. Just do exactly what the spec says. 2828 */ 2829 if (_mesa_has_EXT_texture_compression_s3tc(ctx) && 2830 (internalFormat == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || 2831 internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT || 2832 internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT || 2833 internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)) 2834 return format == GL_RGB || format == GL_RGBA ? GL_NO_ERROR : 2835 GL_INVALID_OPERATION; 2836 2837 switch (format) { 2838 case GL_BGRA_EXT: 2839 if (type != GL_UNSIGNED_BYTE || internalFormat != GL_BGRA) 2840 return GL_INVALID_OPERATION; 2841 break; 2842 2843 case GL_RGBA: 2844 switch (type) { 2845 case GL_UNSIGNED_BYTE: 2846 switch (internalFormat) { 2847 case GL_RGBA: 2848 case GL_RGBA8: 2849 case GL_RGB5_A1: 2850 case GL_RGBA4: 2851 break; 2852 case GL_SRGB8_ALPHA8_EXT: 2853 if (ctx->Version <= 20) 2854 return GL_INVALID_OPERATION; 2855 break; 2856 case GL_COMPRESSED_RGBA_BPTC_UNORM: 2857 case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: 2858 if (!_mesa_has_EXT_texture_compression_bptc(ctx)) 2859 return GL_INVALID_OPERATION; 2860 break; 2861 default: 2862 return GL_INVALID_OPERATION; 2863 } 2864 break; 2865 2866 case GL_BYTE: 2867 if (ctx->Version <= 20 || internalFormat != GL_RGBA8_SNORM) 2868 return GL_INVALID_OPERATION; 2869 break; 2870 2871 case GL_UNSIGNED_SHORT: 2872 if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_RGBA16) 2873 return GL_INVALID_OPERATION; 2874 break; 2875 2876 case GL_SHORT: 2877 if (!_mesa_has_EXT_texture_norm16(ctx) || 2878 internalFormat != GL_RGBA16_SNORM) 2879 return GL_INVALID_OPERATION; 2880 break; 2881 2882 case GL_UNSIGNED_SHORT_4_4_4_4: 2883 switch (internalFormat) { 2884 case GL_RGBA: 2885 case GL_RGBA4: 2886 break; 2887 default: 2888 return GL_INVALID_OPERATION; 2889 } 2890 break; 2891 2892 case GL_UNSIGNED_SHORT_5_5_5_1: 2893 switch (internalFormat) { 2894 case GL_RGBA: 2895 case GL_RGB5_A1: 2896 break; 2897 default: 2898 return GL_INVALID_OPERATION; 2899 } 2900 break; 2901 2902 case GL_UNSIGNED_INT_2_10_10_10_REV: 2903 switch (internalFormat) { 2904 case GL_RGBA: 2905 case GL_RGB10_A2: 2906 case GL_RGB5_A1: 2907 if (!_mesa_has_texture_type_2_10_10_10_REV(ctx)) 2908 return GL_INVALID_OPERATION; 2909 break; 2910 default: 2911 return GL_INVALID_OPERATION; 2912 } 2913 break; 2914 2915 case GL_HALF_FLOAT: 2916 if (ctx->Version <= 20 || internalFormat != GL_RGBA16F) 2917 return GL_INVALID_OPERATION; 2918 break; 2919 2920 case GL_FLOAT: 2921 switch (internalFormat) { 2922 case GL_RGBA16F: 2923 case GL_RGBA32F: 2924 if (ctx->Version <= 20) 2925 return GL_INVALID_OPERATION; 2926 break; 2927 case GL_RGBA: 2928 if (_mesa_has_OES_texture_float(ctx) && internalFormat == format) 2929 break; 2930 default: 2931 return GL_INVALID_OPERATION; 2932 } 2933 break; 2934 2935 case GL_HALF_FLOAT_OES: 2936 if (_mesa_has_OES_texture_half_float(ctx) && internalFormat == format) 2937 break; 2938 default: 2939 return GL_INVALID_OPERATION; 2940 } 2941 break; 2942 2943 case GL_RGBA_INTEGER: 2944 if (ctx->Version <= 20) 2945 return GL_INVALID_OPERATION; 2946 switch (type) { 2947 case GL_UNSIGNED_BYTE: 2948 if (internalFormat != GL_RGBA8UI) 2949 return GL_INVALID_OPERATION; 2950 break; 2951 2952 case GL_BYTE: 2953 if (internalFormat != GL_RGBA8I) 2954 return GL_INVALID_OPERATION; 2955 break; 2956 2957 case GL_UNSIGNED_SHORT: 2958 if (internalFormat != GL_RGBA16UI) 2959 return GL_INVALID_OPERATION; 2960 break; 2961 2962 case GL_SHORT: 2963 if (internalFormat != GL_RGBA16I) 2964 return GL_INVALID_OPERATION; 2965 break; 2966 2967 case GL_UNSIGNED_INT: 2968 if (internalFormat != GL_RGBA32UI) 2969 return GL_INVALID_OPERATION; 2970 break; 2971 2972 case GL_INT: 2973 if (internalFormat != GL_RGBA32I) 2974 return GL_INVALID_OPERATION; 2975 break; 2976 2977 case GL_UNSIGNED_INT_2_10_10_10_REV: 2978 if (internalFormat != GL_RGB10_A2UI) 2979 return GL_INVALID_OPERATION; 2980 break; 2981 2982 default: 2983 return GL_INVALID_OPERATION; 2984 } 2985 break; 2986 2987 case GL_RGB: 2988 switch (type) { 2989 case GL_UNSIGNED_BYTE: 2990 switch (internalFormat) { 2991 case GL_RGB: 2992 case GL_RGB8: 2993 case GL_RGB565: 2994 break; 2995 case GL_SRGB8: 2996 if (ctx->Version <= 20) 2997 return GL_INVALID_OPERATION; 2998 break; 2999 default: 3000 return GL_INVALID_OPERATION; 3001 } 3002 break; 3003 3004 case GL_BYTE: 3005 if (ctx->Version <= 20 || internalFormat != GL_RGB8_SNORM) 3006 return GL_INVALID_OPERATION; 3007 break; 3008 3009 case GL_UNSIGNED_SHORT: 3010 if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_RGB16) 3011 return GL_INVALID_OPERATION; 3012 break; 3013 3014 case GL_SHORT: 3015 if (!_mesa_has_EXT_texture_norm16(ctx) || 3016 internalFormat != GL_RGB16_SNORM) 3017 return GL_INVALID_OPERATION; 3018 break; 3019 3020 case GL_UNSIGNED_SHORT_5_6_5: 3021 switch (internalFormat) { 3022 case GL_RGB: 3023 case GL_RGB565: 3024 break; 3025 default: 3026 return GL_INVALID_OPERATION; 3027 } 3028 break; 3029 3030 case GL_UNSIGNED_INT_10F_11F_11F_REV: 3031 if (ctx->Version <= 20 || internalFormat != GL_R11F_G11F_B10F) 3032 return GL_INVALID_OPERATION; 3033 break; 3034 3035 case GL_UNSIGNED_INT_5_9_9_9_REV: 3036 if (ctx->Version <= 20 || internalFormat != GL_RGB9_E5) 3037 return GL_INVALID_OPERATION; 3038 break; 3039 3040 case GL_HALF_FLOAT: 3041 if (ctx->Version <= 20) 3042 return GL_INVALID_OPERATION; 3043 switch (internalFormat) { 3044 case GL_RGB16F: 3045 case GL_R11F_G11F_B10F: 3046 case GL_RGB9_E5: 3047 break; 3048 default: 3049 return GL_INVALID_OPERATION; 3050 } 3051 break; 3052 3053 case GL_FLOAT: 3054 switch (internalFormat) { 3055 case GL_RGB16F: 3056 case GL_RGB32F: 3057 case GL_R11F_G11F_B10F: 3058 case GL_RGB9_E5: 3059 if (ctx->Version <= 20) 3060 return GL_INVALID_OPERATION; 3061 break; 3062 case GL_RGB: 3063 if (_mesa_has_OES_texture_float(ctx) && internalFormat == format) 3064 break; 3065 case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: 3066 case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: 3067 if (!_mesa_has_EXT_texture_compression_bptc(ctx)) 3068 return GL_INVALID_OPERATION; 3069 break; 3070 default: 3071 return GL_INVALID_OPERATION; 3072 } 3073 break; 3074 3075 case GL_HALF_FLOAT_OES: 3076 if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format) 3077 return GL_INVALID_OPERATION; 3078 break; 3079 3080 case GL_UNSIGNED_INT_2_10_10_10_REV: 3081 switch (internalFormat) { 3082 case GL_RGB: 3083 case GL_RGB10: 3084 case GL_RGB8: 3085 case GL_RGB565: 3086 /* GL_EXT_texture_type_2_10_10_10_REV allows GL_RGB even though 3087 * GLES3 doesn't, and GL_OES_required_internalformat extends that 3088 * to allow the sized RGB internalformats as well. 3089 */ 3090 if (!_mesa_has_texture_type_2_10_10_10_REV(ctx)) 3091 return GL_INVALID_OPERATION; 3092 break; 3093 default: 3094 return GL_INVALID_OPERATION; 3095 } 3096 break; 3097 3098 default: 3099 return GL_INVALID_OPERATION; 3100 } 3101 break; 3102 3103 case GL_RGB_INTEGER: 3104 if (ctx->Version <= 20) 3105 return GL_INVALID_OPERATION; 3106 switch (type) { 3107 case GL_UNSIGNED_BYTE: 3108 if (internalFormat != GL_RGB8UI) 3109 return GL_INVALID_OPERATION; 3110 break; 3111 3112 case GL_BYTE: 3113 if (internalFormat != GL_RGB8I) 3114 return GL_INVALID_OPERATION; 3115 break; 3116 3117 case GL_UNSIGNED_SHORT: 3118 if (internalFormat != GL_RGB16UI) 3119 return GL_INVALID_OPERATION; 3120 break; 3121 3122 case GL_SHORT: 3123 if (internalFormat != GL_RGB16I) 3124 return GL_INVALID_OPERATION; 3125 break; 3126 3127 case GL_UNSIGNED_INT: 3128 if (internalFormat != GL_RGB32UI) 3129 return GL_INVALID_OPERATION; 3130 break; 3131 3132 case GL_INT: 3133 if (internalFormat != GL_RGB32I) 3134 return GL_INVALID_OPERATION; 3135 break; 3136 3137 default: 3138 return GL_INVALID_OPERATION; 3139 } 3140 break; 3141 3142 case GL_RG: 3143 if (!_mesa_has_rg_textures(ctx)) 3144 return GL_INVALID_OPERATION; 3145 switch (type) { 3146 case GL_UNSIGNED_BYTE: 3147 if (internalFormat != GL_RG8 && 3148 (!_mesa_has_EXT_texture_compression_rgtc(ctx) || 3149 internalFormat != GL_COMPRESSED_RED_GREEN_RGTC2_EXT)) 3150 return GL_INVALID_OPERATION; 3151 break; 3152 3153 case GL_BYTE: 3154 if (internalFormat != GL_RG8_SNORM && 3155 (!_mesa_has_EXT_texture_compression_rgtc(ctx) || 3156 internalFormat != GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT)) 3157 return GL_INVALID_OPERATION; 3158 break; 3159 3160 case GL_UNSIGNED_SHORT: 3161 if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_RG16) 3162 return GL_INVALID_OPERATION; 3163 break; 3164 3165 case GL_SHORT: 3166 if (!_mesa_has_EXT_texture_norm16(ctx) || 3167 internalFormat != GL_RG16_SNORM) 3168 return GL_INVALID_OPERATION; 3169 break; 3170 3171 case GL_HALF_FLOAT: 3172 case GL_HALF_FLOAT_OES: 3173 switch (internalFormat) { 3174 case GL_RG16F: 3175 if (ctx->Version <= 20) 3176 return GL_INVALID_OPERATION; 3177 break; 3178 case GL_RG: 3179 if (_mesa_has_rg_textures(ctx) && 3180 _mesa_has_OES_texture_half_float(ctx)) 3181 break; 3182 /* fallthrough */ 3183 default: 3184 return GL_INVALID_OPERATION; 3185 } 3186 break; 3187 3188 case GL_FLOAT: 3189 switch (internalFormat) { 3190 case GL_RG16F: 3191 case GL_RG32F: 3192 break; 3193 case GL_RG: 3194 if (_mesa_has_rg_textures(ctx) && 3195 _mesa_has_OES_texture_float(ctx)) 3196 break; 3197 /* fallthrough */ 3198 default: 3199 return GL_INVALID_OPERATION; 3200 } 3201 break; 3202 3203 default: 3204 return GL_INVALID_OPERATION; 3205 } 3206 break; 3207 3208 case GL_RG_INTEGER: 3209 if (ctx->Version <= 20) 3210 return GL_INVALID_OPERATION; 3211 switch (type) { 3212 case GL_UNSIGNED_BYTE: 3213 if (internalFormat != GL_RG8UI) 3214 return GL_INVALID_OPERATION; 3215 break; 3216 3217 case GL_BYTE: 3218 if (internalFormat != GL_RG8I) 3219 return GL_INVALID_OPERATION; 3220 break; 3221 3222 case GL_UNSIGNED_SHORT: 3223 if (internalFormat != GL_RG16UI) 3224 return GL_INVALID_OPERATION; 3225 break; 3226 3227 case GL_SHORT: 3228 if (internalFormat != GL_RG16I) 3229 return GL_INVALID_OPERATION; 3230 break; 3231 3232 case GL_UNSIGNED_INT: 3233 if (internalFormat != GL_RG32UI) 3234 return GL_INVALID_OPERATION; 3235 break; 3236 3237 case GL_INT: 3238 if (internalFormat != GL_RG32I) 3239 return GL_INVALID_OPERATION; 3240 break; 3241 3242 default: 3243 return GL_INVALID_OPERATION; 3244 } 3245 break; 3246 3247 case GL_RED: 3248 if (!_mesa_has_rg_textures(ctx)) 3249 return GL_INVALID_OPERATION; 3250 switch (type) { 3251 case GL_UNSIGNED_BYTE: 3252 if (internalFormat == GL_R8 || 3253 ((internalFormat == GL_SR8_EXT) && 3254 _mesa_has_EXT_texture_sRGB_R8(ctx)) || 3255 (internalFormat == GL_COMPRESSED_RED_RGTC1_EXT && 3256 _mesa_has_EXT_texture_compression_rgtc(ctx))) 3257 break; 3258 return GL_INVALID_OPERATION; 3259 3260 case GL_BYTE: 3261 if (internalFormat != GL_R8_SNORM && 3262 (!_mesa_has_EXT_texture_compression_rgtc(ctx) || 3263 internalFormat != GL_COMPRESSED_SIGNED_RED_RGTC1_EXT)) 3264 return GL_INVALID_OPERATION; 3265 break; 3266 3267 case GL_UNSIGNED_SHORT: 3268 if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_R16) 3269 return GL_INVALID_OPERATION; 3270 break; 3271 3272 case GL_SHORT: 3273 if (!_mesa_has_EXT_texture_norm16(ctx) || 3274 internalFormat != GL_R16_SNORM) 3275 return GL_INVALID_OPERATION; 3276 break; 3277 3278 case GL_HALF_FLOAT: 3279 case GL_HALF_FLOAT_OES: 3280 switch (internalFormat) { 3281 case GL_R16F: 3282 if (ctx->Version <= 20) 3283 return GL_INVALID_OPERATION; 3284 break; 3285 case GL_RG: 3286 case GL_RED: 3287 if (_mesa_has_rg_textures(ctx) && 3288 _mesa_has_OES_texture_half_float(ctx)) 3289 break; 3290 /* fallthrough */ 3291 default: 3292 return GL_INVALID_OPERATION; 3293 } 3294 break; 3295 3296 case GL_FLOAT: 3297 switch (internalFormat) { 3298 case GL_R16F: 3299 case GL_R32F: 3300 break; 3301 case GL_RED: 3302 if (_mesa_has_rg_textures(ctx) && 3303 _mesa_has_OES_texture_float(ctx)) 3304 break; 3305 /* fallthrough */ 3306 default: 3307 return GL_INVALID_OPERATION; 3308 } 3309 break; 3310 3311 default: 3312 return GL_INVALID_OPERATION; 3313 } 3314 break; 3315 3316 case GL_RED_INTEGER: 3317 if (ctx->Version <= 20) 3318 return GL_INVALID_OPERATION; 3319 switch (type) { 3320 case GL_UNSIGNED_BYTE: 3321 if (internalFormat != GL_R8UI) 3322 return GL_INVALID_OPERATION; 3323 break; 3324 3325 case GL_BYTE: 3326 if (internalFormat != GL_R8I) 3327 return GL_INVALID_OPERATION; 3328 break; 3329 3330 case GL_UNSIGNED_SHORT: 3331 if (internalFormat != GL_R16UI) 3332 return GL_INVALID_OPERATION; 3333 break; 3334 3335 case GL_SHORT: 3336 if (internalFormat != GL_R16I) 3337 return GL_INVALID_OPERATION; 3338 break; 3339 3340 case GL_UNSIGNED_INT: 3341 if (internalFormat != GL_R32UI) 3342 return GL_INVALID_OPERATION; 3343 break; 3344 3345 case GL_INT: 3346 if (internalFormat != GL_R32I) 3347 return GL_INVALID_OPERATION; 3348 break; 3349 3350 default: 3351 return GL_INVALID_OPERATION; 3352 } 3353 break; 3354 3355 case GL_DEPTH_COMPONENT: 3356 switch (type) { 3357 case GL_UNSIGNED_SHORT: 3358 if (internalFormat != GL_DEPTH_COMPONENT 3359 && internalFormat != GL_DEPTH_COMPONENT16) 3360 return GL_INVALID_OPERATION; 3361 break; 3362 3363 case GL_UNSIGNED_INT: 3364 switch (internalFormat) { 3365 case GL_DEPTH_COMPONENT: 3366 case GL_DEPTH_COMPONENT16: 3367 case GL_DEPTH_COMPONENT24: 3368 break; 3369 default: 3370 return GL_INVALID_OPERATION; 3371 } 3372 break; 3373 3374 case GL_FLOAT: 3375 if (ctx->Version <= 20 || internalFormat != GL_DEPTH_COMPONENT32F) 3376 return GL_INVALID_OPERATION; 3377 break; 3378 3379 default: 3380 return GL_INVALID_OPERATION; 3381 } 3382 break; 3383 3384 case GL_DEPTH_STENCIL: 3385 switch (type) { 3386 case GL_UNSIGNED_INT_24_8: 3387 if (internalFormat != GL_DEPTH_STENCIL 3388 && internalFormat != GL_DEPTH24_STENCIL8) 3389 return GL_INVALID_OPERATION; 3390 break; 3391 3392 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 3393 if (ctx->Version <= 20 || internalFormat != GL_DEPTH32F_STENCIL8) 3394 return GL_INVALID_OPERATION; 3395 break; 3396 3397 default: 3398 return GL_INVALID_OPERATION; 3399 } 3400 break; 3401 3402 case GL_STENCIL_INDEX: 3403 if (!_mesa_has_OES_texture_stencil8(ctx) || 3404 type != GL_UNSIGNED_BYTE || 3405 internalFormat != GL_STENCIL_INDEX8) { 3406 return GL_INVALID_OPERATION; 3407 } 3408 break; 3409 3410 case GL_ALPHA: 3411 case GL_LUMINANCE: 3412 case GL_LUMINANCE_ALPHA: 3413 switch (type) { 3414 case GL_FLOAT: 3415 if (!_mesa_has_OES_texture_float(ctx) || internalFormat != format) 3416 return GL_INVALID_OPERATION; 3417 break; 3418 case GL_HALF_FLOAT_OES: 3419 if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format) 3420 return GL_INVALID_OPERATION; 3421 break; 3422 case GL_UNSIGNED_BYTE: 3423 if (!(format == internalFormat || 3424 (format == GL_ALPHA && internalFormat == GL_ALPHA8) || 3425 (format == GL_LUMINANCE && internalFormat == GL_LUMINANCE8) || 3426 (format == GL_LUMINANCE_ALPHA && 3427 ((internalFormat == GL_LUMINANCE8_ALPHA8) || 3428 (internalFormat == GL_LUMINANCE4_ALPHA4))))) { 3429 return GL_INVALID_OPERATION; 3430 } 3431 break; 3432 default: 3433 return GL_INVALID_OPERATION; 3434 } 3435 break; 3436 } 3437 3438 return GL_NO_ERROR; 3439} 3440 3441static void 3442set_swizzle(uint8_t *swizzle, int x, int y, int z, int w) 3443{ 3444 swizzle[MESA_FORMAT_SWIZZLE_X] = x; 3445 swizzle[MESA_FORMAT_SWIZZLE_Y] = y; 3446 swizzle[MESA_FORMAT_SWIZZLE_Z] = z; 3447 swizzle[MESA_FORMAT_SWIZZLE_W] = w; 3448} 3449 3450static bool 3451get_swizzle_from_gl_format(GLenum format, uint8_t *swizzle) 3452{ 3453 switch (format) { 3454 case GL_RGBA: 3455 case GL_RGBA_INTEGER_EXT: 3456 set_swizzle(swizzle, 0, 1, 2, 3); 3457 return true; 3458 case GL_BGRA: 3459 case GL_BGRA_INTEGER_EXT: 3460 set_swizzle(swizzle, 2, 1, 0, 3); 3461 return true; 3462 case GL_ABGR_EXT: 3463 set_swizzle(swizzle, 3, 2, 1, 0); 3464 return true; 3465 case GL_RGB: 3466 case GL_RGB_INTEGER_EXT: 3467 set_swizzle(swizzle, 0, 1, 2, 5); 3468 return true; 3469 case GL_BGR: 3470 case GL_BGR_INTEGER_EXT: 3471 set_swizzle(swizzle, 2, 1, 0, 5); 3472 return true; 3473 case GL_LUMINANCE_ALPHA: 3474 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 3475 set_swizzle(swizzle, 0, 0, 0, 1); 3476 return true; 3477 case GL_RG: 3478 case GL_RG_INTEGER: 3479 set_swizzle(swizzle, 0, 1, 4, 5); 3480 return true; 3481 case GL_RED: 3482 case GL_RED_INTEGER_EXT: 3483 set_swizzle(swizzle, 0, 4, 4, 5); 3484 return true; 3485 case GL_GREEN: 3486 case GL_GREEN_INTEGER_EXT: 3487 set_swizzle(swizzle, 4, 0, 4, 5); 3488 return true; 3489 case GL_BLUE: 3490 case GL_BLUE_INTEGER_EXT: 3491 set_swizzle(swizzle, 4, 4, 0, 5); 3492 return true; 3493 case GL_ALPHA: 3494 case GL_ALPHA_INTEGER_EXT: 3495 set_swizzle(swizzle, 4, 4, 4, 0); 3496 return true; 3497 case GL_LUMINANCE: 3498 case GL_LUMINANCE_INTEGER_EXT: 3499 set_swizzle(swizzle, 0, 0, 0, 5); 3500 return true; 3501 case GL_INTENSITY: 3502 set_swizzle(swizzle, 0, 0, 0, 0); 3503 return true; 3504 default: 3505 return false; 3506 } 3507} 3508 3509/** 3510* Take an OpenGL format (GL_RGB, GL_RGBA, etc), OpenGL data type (GL_INT, 3511* GL_FOAT, etc) and return a matching mesa_array_format or a mesa_format 3512* otherwise (for non-array formats). 3513* 3514* This function will typically be used to compute a mesa format from a GL type 3515* so we can then call _mesa_format_convert. This function does 3516* not consider byte swapping, so it returns types assuming that no byte 3517* swapping is involved. If byte swapping is involved then clients are supposed 3518* to handle that on their side before calling _mesa_format_convert. 3519* 3520* This function returns an uint32_t that can pack a mesa_format or a 3521* mesa_array_format. Clients must check the mesa array format bit 3522* (MESA_ARRAY_FORMAT_BIT) on the return value to know if the returned 3523* format is a mesa_array_format or a mesa_format. 3524*/ 3525uint32_t 3526_mesa_format_from_format_and_type(GLenum format, GLenum type) 3527{ 3528 bool is_array_format = true; 3529 uint8_t swizzle[4]; 3530 bool normalized = false, is_float = false, is_signed = false; 3531 int num_channels = 0, type_size = 0; 3532 3533 /* Extract array format type information from the OpenGL data type */ 3534 switch (type) { 3535 case GL_UNSIGNED_BYTE: 3536 type_size = 1; 3537 break; 3538 case GL_BYTE: 3539 type_size = 1; 3540 is_signed = true; 3541 break; 3542 case GL_UNSIGNED_SHORT: 3543 type_size = 2; 3544 break; 3545 case GL_SHORT: 3546 type_size = 2; 3547 is_signed = true; 3548 break; 3549 case GL_UNSIGNED_INT: 3550 type_size = 4; 3551 break; 3552 case GL_INT: 3553 type_size = 4; 3554 is_signed = true; 3555 break; 3556 case GL_HALF_FLOAT: 3557 case GL_HALF_FLOAT_OES: 3558 type_size = 2; 3559 is_signed = true; 3560 is_float = true; 3561 break; 3562 case GL_FLOAT: 3563 type_size = 4; 3564 is_signed = true; 3565 is_float = true; 3566 break; 3567 default: 3568 is_array_format = false; 3569 break; 3570 } 3571 3572 /* Extract array format swizzle information from the OpenGL format */ 3573 if (is_array_format) 3574 is_array_format = get_swizzle_from_gl_format(format, swizzle); 3575 3576 /* If this is an array format type after checking data type and format, 3577 * create the array format 3578 */ 3579 if (is_array_format) { 3580 normalized = !_mesa_is_enum_format_integer(format); 3581 num_channels = _mesa_components_in_format(format); 3582 3583 return MESA_ARRAY_FORMAT(type_size, is_signed, is_float, 3584 normalized, num_channels, 3585 swizzle[0], swizzle[1], swizzle[2], swizzle[3]); 3586 } 3587 3588 /* Otherwise this is not an array format, so return the mesa_format 3589 * matching the OpenGL format and data type 3590 */ 3591 switch (type) { 3592 case GL_UNSIGNED_SHORT_5_6_5: 3593 if (format == GL_RGB) 3594 return MESA_FORMAT_B5G6R5_UNORM; 3595 else if (format == GL_BGR) 3596 return MESA_FORMAT_R5G6B5_UNORM; 3597 else if (format == GL_RGB_INTEGER) 3598 return MESA_FORMAT_B5G6R5_UINT; 3599 break; 3600 case GL_UNSIGNED_SHORT_5_6_5_REV: 3601 if (format == GL_RGB) 3602 return MESA_FORMAT_R5G6B5_UNORM; 3603 else if (format == GL_BGR) 3604 return MESA_FORMAT_B5G6R5_UNORM; 3605 else if (format == GL_RGB_INTEGER) 3606 return MESA_FORMAT_R5G6B5_UINT; 3607 break; 3608 case GL_UNSIGNED_SHORT_4_4_4_4: 3609 if (format == GL_RGBA) 3610 return MESA_FORMAT_A4B4G4R4_UNORM; 3611 else if (format == GL_BGRA) 3612 return MESA_FORMAT_A4R4G4B4_UNORM; 3613 else if (format == GL_ABGR_EXT) 3614 return MESA_FORMAT_R4G4B4A4_UNORM; 3615 else if (format == GL_RGBA_INTEGER) 3616 return MESA_FORMAT_A4B4G4R4_UINT; 3617 else if (format == GL_BGRA_INTEGER) 3618 return MESA_FORMAT_A4R4G4B4_UINT; 3619 break; 3620 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 3621 if (format == GL_RGBA) 3622 return MESA_FORMAT_R4G4B4A4_UNORM; 3623 else if (format == GL_BGRA) 3624 return MESA_FORMAT_B4G4R4A4_UNORM; 3625 else if (format == GL_ABGR_EXT) 3626 return MESA_FORMAT_A4B4G4R4_UNORM; 3627 else if (format == GL_RGBA_INTEGER) 3628 return MESA_FORMAT_R4G4B4A4_UINT; 3629 else if (format == GL_BGRA_INTEGER) 3630 return MESA_FORMAT_B4G4R4A4_UINT; 3631 break; 3632 case GL_UNSIGNED_SHORT_5_5_5_1: 3633 if (format == GL_RGBA) 3634 return MESA_FORMAT_A1B5G5R5_UNORM; 3635 else if (format == GL_BGRA) 3636 return MESA_FORMAT_A1R5G5B5_UNORM; 3637 else if (format == GL_RGBA_INTEGER) 3638 return MESA_FORMAT_A1B5G5R5_UINT; 3639 else if (format == GL_BGRA_INTEGER) 3640 return MESA_FORMAT_A1R5G5B5_UINT; 3641 break; 3642 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 3643 if (format == GL_RGBA) 3644 return MESA_FORMAT_R5G5B5A1_UNORM; 3645 else if (format == GL_BGRA) 3646 return MESA_FORMAT_B5G5R5A1_UNORM; 3647 else if (format == GL_RGBA_INTEGER) 3648 return MESA_FORMAT_R5G5B5A1_UINT; 3649 else if (format == GL_BGRA_INTEGER) 3650 return MESA_FORMAT_B5G5R5A1_UINT; 3651 break; 3652 case GL_UNSIGNED_BYTE_3_3_2: 3653 if (format == GL_RGB) 3654 return MESA_FORMAT_B2G3R3_UNORM; 3655 else if (format == GL_RGB_INTEGER) 3656 return MESA_FORMAT_B2G3R3_UINT; 3657 break; 3658 case GL_UNSIGNED_BYTE_2_3_3_REV: 3659 if (format == GL_RGB) 3660 return MESA_FORMAT_R3G3B2_UNORM; 3661 else if (format == GL_RGB_INTEGER) 3662 return MESA_FORMAT_R3G3B2_UINT; 3663 break; 3664 case GL_UNSIGNED_INT_5_9_9_9_REV: 3665 if (format == GL_RGB) 3666 return MESA_FORMAT_R9G9B9E5_FLOAT; 3667 break; 3668 case GL_UNSIGNED_INT_10_10_10_2: 3669 if (format == GL_RGBA) 3670 return MESA_FORMAT_A2B10G10R10_UNORM; 3671 else if (format == GL_RGBA_INTEGER) 3672 return MESA_FORMAT_A2B10G10R10_UINT; 3673 else if (format == GL_BGRA) 3674 return MESA_FORMAT_A2R10G10B10_UNORM; 3675 else if (format == GL_BGRA_INTEGER) 3676 return MESA_FORMAT_A2R10G10B10_UINT; 3677 break; 3678 case GL_UNSIGNED_INT_2_10_10_10_REV: 3679 if (format == GL_RGB) 3680 return MESA_FORMAT_R10G10B10X2_UNORM; 3681 if (format == GL_RGBA) 3682 return MESA_FORMAT_R10G10B10A2_UNORM; 3683 else if (format == GL_RGBA_INTEGER) 3684 return MESA_FORMAT_R10G10B10A2_UINT; 3685 else if (format == GL_BGRA) 3686 return MESA_FORMAT_B10G10R10A2_UNORM; 3687 else if (format == GL_BGRA_INTEGER) 3688 return MESA_FORMAT_B10G10R10A2_UINT; 3689 break; 3690 case GL_UNSIGNED_INT_8_8_8_8: 3691 if (format == GL_RGBA) 3692 return MESA_FORMAT_A8B8G8R8_UNORM; 3693 else if (format == GL_BGRA) 3694 return MESA_FORMAT_A8R8G8B8_UNORM; 3695 else if (format == GL_ABGR_EXT) 3696 return MESA_FORMAT_R8G8B8A8_UNORM; 3697 else if (format == GL_RGBA_INTEGER) 3698 return MESA_FORMAT_A8B8G8R8_UINT; 3699 else if (format == GL_BGRA_INTEGER) 3700 return MESA_FORMAT_A8R8G8B8_UINT; 3701 break; 3702 case GL_UNSIGNED_INT_8_8_8_8_REV: 3703 if (format == GL_RGBA) 3704 return MESA_FORMAT_R8G8B8A8_UNORM; 3705 else if (format == GL_BGRA) 3706 return MESA_FORMAT_B8G8R8A8_UNORM; 3707 else if (format == GL_ABGR_EXT) 3708 return MESA_FORMAT_A8B8G8R8_UNORM; 3709 else if (format == GL_RGBA_INTEGER) 3710 return MESA_FORMAT_R8G8B8A8_UINT; 3711 else if (format == GL_BGRA_INTEGER) 3712 return MESA_FORMAT_B8G8R8A8_UINT; 3713 break; 3714 case GL_UNSIGNED_SHORT_8_8_MESA: 3715 if (format == GL_YCBCR_MESA) 3716 return MESA_FORMAT_YCBCR; 3717 break; 3718 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 3719 if (format == GL_YCBCR_MESA) 3720 return MESA_FORMAT_YCBCR_REV; 3721 break; 3722 case GL_UNSIGNED_INT_10F_11F_11F_REV: 3723 if (format == GL_RGB) 3724 return MESA_FORMAT_R11G11B10_FLOAT; 3725 break; 3726 case GL_FLOAT: 3727 if (format == GL_DEPTH_COMPONENT) 3728 return MESA_FORMAT_Z_FLOAT32; 3729 break; 3730 case GL_UNSIGNED_INT: 3731 if (format == GL_DEPTH_COMPONENT) 3732 return MESA_FORMAT_Z_UNORM32; 3733 break; 3734 case GL_UNSIGNED_SHORT: 3735 if (format == GL_DEPTH_COMPONENT) 3736 return MESA_FORMAT_Z_UNORM16; 3737 break; 3738 case GL_UNSIGNED_INT_24_8: 3739 if (format == GL_DEPTH_STENCIL) 3740 return MESA_FORMAT_Z24_UNORM_S8_UINT; 3741 break; 3742 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: 3743 if (format == GL_DEPTH_STENCIL) 3744 return MESA_FORMAT_Z32_FLOAT_S8X24_UINT; 3745 break; 3746 default: 3747 break; 3748 } 3749 3750 /* If we got here it means that we could not find a Mesa format that 3751 * matches the GL format/type provided. We may need to add a new Mesa 3752 * format in that case. 3753 */ 3754 unreachable("Unsupported format"); 3755} 3756 3757uint32_t 3758_mesa_tex_format_from_format_and_type(const struct gl_context *ctx, 3759 GLenum gl_format, GLenum type) 3760{ 3761 mesa_format format = _mesa_format_from_format_and_type(gl_format, type); 3762 3763 if (_mesa_format_is_mesa_array_format(format)) 3764 format = _mesa_format_from_array_format(format); 3765 3766 if (format == MESA_FORMAT_NONE || !ctx->TextureFormatSupported[format]) 3767 return MESA_FORMAT_NONE; 3768 3769 return format; 3770} 3771 3772/** 3773 * Returns true if \p internal_format is a sized internal format that 3774 * is marked "Color Renderable" in Table 8.10 of the ES 3.2 specification. 3775 */ 3776bool 3777_mesa_is_es3_color_renderable(const struct gl_context *ctx, 3778 GLenum internal_format) 3779{ 3780 switch (internal_format) { 3781 case GL_R8: 3782 case GL_RG8: 3783 case GL_RGB8: 3784 case GL_RGB565: 3785 case GL_RGBA4: 3786 case GL_RGB5_A1: 3787 case GL_RGBA8: 3788 case GL_RGB10_A2: 3789 case GL_RGB10_A2UI: 3790 case GL_SRGB8_ALPHA8: 3791 case GL_R16F: 3792 case GL_RG16F: 3793 case GL_RGBA16F: 3794 case GL_R32F: 3795 case GL_RG32F: 3796 case GL_RGBA32F: 3797 case GL_R11F_G11F_B10F: 3798 case GL_R8I: 3799 case GL_R8UI: 3800 case GL_R16I: 3801 case GL_R16UI: 3802 case GL_R32I: 3803 case GL_R32UI: 3804 case GL_RG8I: 3805 case GL_RG8UI: 3806 case GL_RG16I: 3807 case GL_RG16UI: 3808 case GL_RG32I: 3809 case GL_RG32UI: 3810 case GL_RGBA8I: 3811 case GL_RGBA8UI: 3812 case GL_RGBA16I: 3813 case GL_RGBA16UI: 3814 case GL_RGBA32I: 3815 case GL_RGBA32UI: 3816 return true; 3817 case GL_R16: 3818 case GL_RG16: 3819 case GL_RGBA16: 3820 return _mesa_has_EXT_texture_norm16(ctx); 3821 case GL_R8_SNORM: 3822 case GL_RG8_SNORM: 3823 case GL_RGBA8_SNORM: 3824 return _mesa_has_EXT_render_snorm(ctx); 3825 case GL_R16_SNORM: 3826 case GL_RG16_SNORM: 3827 case GL_RGBA16_SNORM: 3828 return _mesa_has_EXT_texture_norm16(ctx) && 3829 _mesa_has_EXT_render_snorm(ctx); 3830 default: 3831 return false; 3832 } 3833} 3834 3835/** 3836 * Returns true if \p internal_format is a sized internal format that 3837 * is marked "Texture Filterable" in Table 8.10 of the ES 3.2 specification. 3838 */ 3839bool 3840_mesa_is_es3_texture_filterable(const struct gl_context *ctx, 3841 GLenum internal_format) 3842{ 3843 switch (internal_format) { 3844 case GL_R8: 3845 case GL_R8_SNORM: 3846 case GL_RG8: 3847 case GL_RG8_SNORM: 3848 case GL_RGB8: 3849 case GL_RGB8_SNORM: 3850 case GL_RGB565: 3851 case GL_RGBA4: 3852 case GL_RGB5_A1: 3853 case GL_RGBA8: 3854 case GL_RGBA8_SNORM: 3855 case GL_RGB10_A2: 3856 case GL_SRGB8: 3857 case GL_SRGB8_ALPHA8: 3858 case GL_R16F: 3859 case GL_RG16F: 3860 case GL_RGB16F: 3861 case GL_RGBA16F: 3862 case GL_R11F_G11F_B10F: 3863 case GL_RGB9_E5: 3864 return true; 3865 case GL_R16: 3866 case GL_R16_SNORM: 3867 case GL_RG16: 3868 case GL_RG16_SNORM: 3869 case GL_RGB16: 3870 case GL_RGB16_SNORM: 3871 case GL_RGBA16: 3872 case GL_RGBA16_SNORM: 3873 return _mesa_has_EXT_texture_norm16(ctx); 3874 case GL_R32F: 3875 case GL_RG32F: 3876 case GL_RGB32F: 3877 case GL_RGBA32F: 3878 /* The OES_texture_float_linear spec says: 3879 * 3880 * "When implemented against OpenGL ES 3.0 or later versions, sized 3881 * 32-bit floating-point formats become texture-filterable. This 3882 * should be noted by, for example, checking the ``TF'' column of 3883 * table 8.13 in the ES 3.1 Specification (``Correspondence of sized 3884 * internal formats to base internal formats ... and use cases ...'') 3885 * for the R32F, RG32F, RGB32F, and RGBA32F formats." 3886 */ 3887 return _mesa_has_OES_texture_float_linear(ctx); 3888 default: 3889 return false; 3890 } 3891} 3892