glformats.c revision 8b762ebd72c1bb1a9827a667ad55ba9516505adf
1/* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5 * Copyright (c) 2008-2009 VMware, Inc. 6 * Copyright (c) 2012 Intel Corporation 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a 9 * copy of this software and associated documentation files (the "Software"), 10 * to deal in the Software without restriction, including without limitation 11 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12 * and/or sell copies of the Software, and to permit persons to whom the 13 * Software is furnished to do so, subject to the following conditions: 14 * 15 * The above copyright notice and this permission notice shall be included 16 * in all copies or substantial portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26 27#include "context.h" 28#include "glformats.h" 29 30 31/** 32 * Test if the given format is an integer (non-normalized) format. 33 */ 34GLboolean 35_mesa_is_enum_format_integer(GLenum format) 36{ 37 switch (format) { 38 /* generic integer formats */ 39 case GL_RED_INTEGER_EXT: 40 case GL_GREEN_INTEGER_EXT: 41 case GL_BLUE_INTEGER_EXT: 42 case GL_ALPHA_INTEGER_EXT: 43 case GL_RGB_INTEGER_EXT: 44 case GL_RGBA_INTEGER_EXT: 45 case GL_BGR_INTEGER_EXT: 46 case GL_BGRA_INTEGER_EXT: 47 case GL_LUMINANCE_INTEGER_EXT: 48 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 49 case GL_RG_INTEGER: 50 /* specific integer formats */ 51 case GL_RGBA32UI_EXT: 52 case GL_RGB32UI_EXT: 53 case GL_RG32UI: 54 case GL_R32UI: 55 case GL_ALPHA32UI_EXT: 56 case GL_INTENSITY32UI_EXT: 57 case GL_LUMINANCE32UI_EXT: 58 case GL_LUMINANCE_ALPHA32UI_EXT: 59 case GL_RGBA16UI_EXT: 60 case GL_RGB16UI_EXT: 61 case GL_RG16UI: 62 case GL_R16UI: 63 case GL_ALPHA16UI_EXT: 64 case GL_INTENSITY16UI_EXT: 65 case GL_LUMINANCE16UI_EXT: 66 case GL_LUMINANCE_ALPHA16UI_EXT: 67 case GL_RGBA8UI_EXT: 68 case GL_RGB8UI_EXT: 69 case GL_RG8UI: 70 case GL_R8UI: 71 case GL_ALPHA8UI_EXT: 72 case GL_INTENSITY8UI_EXT: 73 case GL_LUMINANCE8UI_EXT: 74 case GL_LUMINANCE_ALPHA8UI_EXT: 75 case GL_RGBA32I_EXT: 76 case GL_RGB32I_EXT: 77 case GL_RG32I: 78 case GL_R32I: 79 case GL_ALPHA32I_EXT: 80 case GL_INTENSITY32I_EXT: 81 case GL_LUMINANCE32I_EXT: 82 case GL_LUMINANCE_ALPHA32I_EXT: 83 case GL_RGBA16I_EXT: 84 case GL_RGB16I_EXT: 85 case GL_RG16I: 86 case GL_R16I: 87 case GL_ALPHA16I_EXT: 88 case GL_INTENSITY16I_EXT: 89 case GL_LUMINANCE16I_EXT: 90 case GL_LUMINANCE_ALPHA16I_EXT: 91 case GL_RGBA8I_EXT: 92 case GL_RGB8I_EXT: 93 case GL_RG8I: 94 case GL_R8I: 95 case GL_ALPHA8I_EXT: 96 case GL_INTENSITY8I_EXT: 97 case GL_LUMINANCE8I_EXT: 98 case GL_LUMINANCE_ALPHA8I_EXT: 99 case GL_RGB10_A2UI: 100 return GL_TRUE; 101 default: 102 return GL_FALSE; 103 } 104} 105 106 107/** 108 * Test if the given type is an integer (non-normalized) format. 109 */ 110GLboolean 111_mesa_is_type_integer(GLenum type) 112{ 113 switch (type) { 114 case GL_INT: 115 case GL_UNSIGNED_INT: 116 case GL_SHORT: 117 case GL_UNSIGNED_SHORT: 118 case GL_BYTE: 119 case GL_UNSIGNED_BYTE: 120 return GL_TRUE; 121 default: 122 return GL_FALSE; 123 } 124} 125 126 127/** 128 * Test if the given format or type is an integer (non-normalized) format. 129 */ 130extern GLboolean 131_mesa_is_enum_format_or_type_integer(GLenum format, GLenum type) 132{ 133 return _mesa_is_enum_format_integer(format) || _mesa_is_type_integer(type); 134} 135 136 137GLboolean 138_mesa_is_type_unsigned(GLenum type) 139{ 140 switch (type) { 141 case GL_UNSIGNED_INT: 142 case GL_UNSIGNED_INT_8_8_8_8: 143 case GL_UNSIGNED_INT_8_8_8_8_REV: 144 case GL_UNSIGNED_INT_10_10_10_2: 145 case GL_UNSIGNED_INT_2_10_10_10_REV: 146 147 case GL_UNSIGNED_SHORT: 148 case GL_UNSIGNED_SHORT_4_4_4_4: 149 case GL_UNSIGNED_SHORT_5_5_5_1: 150 case GL_UNSIGNED_SHORT_5_6_5: 151 case GL_UNSIGNED_SHORT_5_6_5_REV: 152 case GL_UNSIGNED_SHORT_4_4_4_4_REV: 153 case GL_UNSIGNED_SHORT_1_5_5_5_REV: 154 case GL_UNSIGNED_SHORT_8_8_MESA: 155 case GL_UNSIGNED_SHORT_8_8_REV_MESA: 156 157 case GL_UNSIGNED_BYTE: 158 case GL_UNSIGNED_BYTE_3_3_2: 159 case GL_UNSIGNED_BYTE_2_3_3_REV: 160 return GL_TRUE; 161 162 default: 163 return GL_FALSE; 164 } 165} 166 167 168/** 169 * Test if the given image format is a color/RGBA format (i.e., not color 170 * index, depth, stencil, etc). 171 * \param format the image format value (may by an internal texture format) 172 * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise. 173 */ 174GLboolean 175_mesa_is_color_format(GLenum format) 176{ 177 switch (format) { 178 case GL_RED: 179 case GL_GREEN: 180 case GL_BLUE: 181 case GL_ALPHA: 182 case GL_ALPHA4: 183 case GL_ALPHA8: 184 case GL_ALPHA12: 185 case GL_ALPHA16: 186 case 1: 187 case GL_LUMINANCE: 188 case GL_LUMINANCE4: 189 case GL_LUMINANCE8: 190 case GL_LUMINANCE12: 191 case GL_LUMINANCE16: 192 case 2: 193 case GL_LUMINANCE_ALPHA: 194 case GL_LUMINANCE4_ALPHA4: 195 case GL_LUMINANCE6_ALPHA2: 196 case GL_LUMINANCE8_ALPHA8: 197 case GL_LUMINANCE12_ALPHA4: 198 case GL_LUMINANCE12_ALPHA12: 199 case GL_LUMINANCE16_ALPHA16: 200 case GL_INTENSITY: 201 case GL_INTENSITY4: 202 case GL_INTENSITY8: 203 case GL_INTENSITY12: 204 case GL_INTENSITY16: 205 case GL_R8: 206 case GL_R16: 207 case GL_RG: 208 case GL_RG8: 209 case GL_RG16: 210 case 3: 211 case GL_RGB: 212 case GL_BGR: 213 case GL_R3_G3_B2: 214 case GL_RGB4: 215 case GL_RGB5: 216 case GL_RGB565: 217 case GL_RGB8: 218 case GL_RGB10: 219 case GL_RGB12: 220 case GL_RGB16: 221 case 4: 222 case GL_ABGR_EXT: 223 case GL_RGBA: 224 case GL_BGRA: 225 case GL_RGBA2: 226 case GL_RGBA4: 227 case GL_RGB5_A1: 228 case GL_RGBA8: 229 case GL_RGB10_A2: 230 case GL_RGBA12: 231 case GL_RGBA16: 232 /* float texture formats */ 233 case GL_ALPHA16F_ARB: 234 case GL_ALPHA32F_ARB: 235 case GL_LUMINANCE16F_ARB: 236 case GL_LUMINANCE32F_ARB: 237 case GL_LUMINANCE_ALPHA16F_ARB: 238 case GL_LUMINANCE_ALPHA32F_ARB: 239 case GL_INTENSITY16F_ARB: 240 case GL_INTENSITY32F_ARB: 241 case GL_R16F: 242 case GL_R32F: 243 case GL_RG16F: 244 case GL_RG32F: 245 case GL_RGB16F_ARB: 246 case GL_RGB32F_ARB: 247 case GL_RGBA16F_ARB: 248 case GL_RGBA32F_ARB: 249 /* compressed formats */ 250 case GL_COMPRESSED_ALPHA: 251 case GL_COMPRESSED_LUMINANCE: 252 case GL_COMPRESSED_LUMINANCE_ALPHA: 253 case GL_COMPRESSED_INTENSITY: 254 case GL_COMPRESSED_RED: 255 case GL_COMPRESSED_RG: 256 case GL_COMPRESSED_RGB: 257 case GL_COMPRESSED_RGBA: 258 case GL_RGB_S3TC: 259 case GL_RGB4_S3TC: 260 case GL_RGBA_S3TC: 261 case GL_RGBA4_S3TC: 262 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 263 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 264 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 265 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 266 case GL_COMPRESSED_RGB_FXT1_3DFX: 267 case GL_COMPRESSED_RGBA_FXT1_3DFX: 268#if FEATURE_EXT_texture_sRGB 269 case GL_SRGB_EXT: 270 case GL_SRGB8_EXT: 271 case GL_SRGB_ALPHA_EXT: 272 case GL_SRGB8_ALPHA8_EXT: 273 case GL_SLUMINANCE_ALPHA_EXT: 274 case GL_SLUMINANCE8_ALPHA8_EXT: 275 case GL_SLUMINANCE_EXT: 276 case GL_SLUMINANCE8_EXT: 277 case GL_COMPRESSED_SRGB_EXT: 278 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 279 case GL_COMPRESSED_SRGB_ALPHA_EXT: 280 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 281 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 282 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 283 case GL_COMPRESSED_SLUMINANCE_EXT: 284 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 285#endif /* FEATURE_EXT_texture_sRGB */ 286 case GL_COMPRESSED_RED_RGTC1: 287 case GL_COMPRESSED_SIGNED_RED_RGTC1: 288 case GL_COMPRESSED_RG_RGTC2: 289 case GL_COMPRESSED_SIGNED_RG_RGTC2: 290 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 291 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 292 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 293 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 294 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 295 case GL_ETC1_RGB8_OES: 296 /* generic integer formats */ 297 case GL_RED_INTEGER_EXT: 298 case GL_GREEN_INTEGER_EXT: 299 case GL_BLUE_INTEGER_EXT: 300 case GL_ALPHA_INTEGER_EXT: 301 case GL_RGB_INTEGER_EXT: 302 case GL_RGBA_INTEGER_EXT: 303 case GL_BGR_INTEGER_EXT: 304 case GL_BGRA_INTEGER_EXT: 305 case GL_RG_INTEGER: 306 case GL_LUMINANCE_INTEGER_EXT: 307 case GL_LUMINANCE_ALPHA_INTEGER_EXT: 308 /* sized integer formats */ 309 case GL_RGBA32UI_EXT: 310 case GL_RGB32UI_EXT: 311 case GL_RG32UI: 312 case GL_R32UI: 313 case GL_ALPHA32UI_EXT: 314 case GL_INTENSITY32UI_EXT: 315 case GL_LUMINANCE32UI_EXT: 316 case GL_LUMINANCE_ALPHA32UI_EXT: 317 case GL_RGBA16UI_EXT: 318 case GL_RGB16UI_EXT: 319 case GL_RG16UI: 320 case GL_R16UI: 321 case GL_ALPHA16UI_EXT: 322 case GL_INTENSITY16UI_EXT: 323 case GL_LUMINANCE16UI_EXT: 324 case GL_LUMINANCE_ALPHA16UI_EXT: 325 case GL_RGBA8UI_EXT: 326 case GL_RGB8UI_EXT: 327 case GL_RG8UI: 328 case GL_R8UI: 329 case GL_ALPHA8UI_EXT: 330 case GL_INTENSITY8UI_EXT: 331 case GL_LUMINANCE8UI_EXT: 332 case GL_LUMINANCE_ALPHA8UI_EXT: 333 case GL_RGBA32I_EXT: 334 case GL_RGB32I_EXT: 335 case GL_RG32I: 336 case GL_R32I: 337 case GL_ALPHA32I_EXT: 338 case GL_INTENSITY32I_EXT: 339 case GL_LUMINANCE32I_EXT: 340 case GL_LUMINANCE_ALPHA32I_EXT: 341 case GL_RGBA16I_EXT: 342 case GL_RGB16I_EXT: 343 case GL_RG16I: 344 case GL_R16I: 345 case GL_ALPHA16I_EXT: 346 case GL_INTENSITY16I_EXT: 347 case GL_LUMINANCE16I_EXT: 348 case GL_LUMINANCE_ALPHA16I_EXT: 349 case GL_RGBA8I_EXT: 350 case GL_RGB8I_EXT: 351 case GL_RG8I: 352 case GL_R8I: 353 case GL_ALPHA8I_EXT: 354 case GL_INTENSITY8I_EXT: 355 case GL_LUMINANCE8I_EXT: 356 case GL_LUMINANCE_ALPHA8I_EXT: 357 /* signed, normalized texture formats */ 358 case GL_RED_SNORM: 359 case GL_R8_SNORM: 360 case GL_R16_SNORM: 361 case GL_RG_SNORM: 362 case GL_RG8_SNORM: 363 case GL_RG16_SNORM: 364 case GL_RGB_SNORM: 365 case GL_RGB8_SNORM: 366 case GL_RGB16_SNORM: 367 case GL_RGBA_SNORM: 368 case GL_RGBA8_SNORM: 369 case GL_RGBA16_SNORM: 370 case GL_ALPHA_SNORM: 371 case GL_ALPHA8_SNORM: 372 case GL_ALPHA16_SNORM: 373 case GL_LUMINANCE_SNORM: 374 case GL_LUMINANCE8_SNORM: 375 case GL_LUMINANCE16_SNORM: 376 case GL_LUMINANCE_ALPHA_SNORM: 377 case GL_LUMINANCE8_ALPHA8_SNORM: 378 case GL_LUMINANCE16_ALPHA16_SNORM: 379 case GL_INTENSITY_SNORM: 380 case GL_INTENSITY8_SNORM: 381 case GL_INTENSITY16_SNORM: 382 case GL_RGB9_E5: 383 case GL_R11F_G11F_B10F: 384 case GL_RGB10_A2UI: 385 return GL_TRUE; 386 case GL_YCBCR_MESA: /* not considered to be RGB */ 387 /* fall-through */ 388 default: 389 return GL_FALSE; 390 } 391} 392 393 394/** 395 * Test if the given image format is a depth component format. 396 */ 397GLboolean 398_mesa_is_depth_format(GLenum format) 399{ 400 switch (format) { 401 case GL_DEPTH_COMPONENT: 402 case GL_DEPTH_COMPONENT16: 403 case GL_DEPTH_COMPONENT24: 404 case GL_DEPTH_COMPONENT32: 405 case GL_DEPTH_COMPONENT32F: 406 return GL_TRUE; 407 default: 408 return GL_FALSE; 409 } 410} 411 412 413/** 414 * Test if the given image format is a stencil format. 415 */ 416GLboolean 417_mesa_is_stencil_format(GLenum format) 418{ 419 switch (format) { 420 case GL_STENCIL_INDEX: 421 return GL_TRUE; 422 default: 423 return GL_FALSE; 424 } 425} 426 427 428/** 429 * Test if the given image format is a YCbCr format. 430 */ 431GLboolean 432_mesa_is_ycbcr_format(GLenum format) 433{ 434 switch (format) { 435 case GL_YCBCR_MESA: 436 return GL_TRUE; 437 default: 438 return GL_FALSE; 439 } 440} 441 442 443/** 444 * Test if the given image format is a depth+stencil format. 445 */ 446GLboolean 447_mesa_is_depthstencil_format(GLenum format) 448{ 449 switch (format) { 450 case GL_DEPTH24_STENCIL8_EXT: 451 case GL_DEPTH_STENCIL_EXT: 452 case GL_DEPTH32F_STENCIL8: 453 return GL_TRUE; 454 default: 455 return GL_FALSE; 456 } 457} 458 459 460/** 461 * Test if the given image format is a depth or stencil format. 462 */ 463GLboolean 464_mesa_is_depth_or_stencil_format(GLenum format) 465{ 466 switch (format) { 467 case GL_DEPTH_COMPONENT: 468 case GL_DEPTH_COMPONENT16: 469 case GL_DEPTH_COMPONENT24: 470 case GL_DEPTH_COMPONENT32: 471 case GL_STENCIL_INDEX: 472 case GL_STENCIL_INDEX1_EXT: 473 case GL_STENCIL_INDEX4_EXT: 474 case GL_STENCIL_INDEX8_EXT: 475 case GL_STENCIL_INDEX16_EXT: 476 case GL_DEPTH_STENCIL_EXT: 477 case GL_DEPTH24_STENCIL8_EXT: 478 case GL_DEPTH_COMPONENT32F: 479 case GL_DEPTH32F_STENCIL8: 480 return GL_TRUE; 481 default: 482 return GL_FALSE; 483 } 484} 485 486 487/** 488 * Test if the given image format is a dudv format. 489 */ 490GLboolean 491_mesa_is_dudv_format(GLenum format) 492{ 493 switch (format) { 494 case GL_DUDV_ATI: 495 case GL_DU8DV8_ATI: 496 return GL_TRUE; 497 default: 498 return GL_FALSE; 499 } 500} 501 502 503/** 504 * Test if an image format is a supported compressed format. 505 * \param format the internal format token provided by the user. 506 * \return GL_TRUE if compressed, GL_FALSE if uncompressed 507 */ 508GLboolean 509_mesa_is_compressed_format(struct gl_context *ctx, GLenum format) 510{ 511 switch (format) { 512 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 513 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 514 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 515 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 516 return ctx->Extensions.EXT_texture_compression_s3tc; 517 case GL_RGB_S3TC: 518 case GL_RGB4_S3TC: 519 case GL_RGBA_S3TC: 520 case GL_RGBA4_S3TC: 521 return ctx->Extensions.S3_s3tc; 522 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 523 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 524 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 525 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 526 return ctx->Extensions.EXT_texture_sRGB 527 && ctx->Extensions.EXT_texture_compression_s3tc; 528 case GL_COMPRESSED_RGB_FXT1_3DFX: 529 case GL_COMPRESSED_RGBA_FXT1_3DFX: 530 return ctx->Extensions.TDFX_texture_compression_FXT1; 531 case GL_COMPRESSED_RED_RGTC1: 532 case GL_COMPRESSED_SIGNED_RED_RGTC1: 533 case GL_COMPRESSED_RG_RGTC2: 534 case GL_COMPRESSED_SIGNED_RG_RGTC2: 535 return ctx->Extensions.ARB_texture_compression_rgtc; 536 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 537 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 538 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 539 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 540 return ctx->Extensions.EXT_texture_compression_latc; 541 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 542 return ctx->Extensions.ATI_texture_compression_3dc; 543 case GL_ETC1_RGB8_OES: 544 return ctx->Extensions.OES_compressed_ETC1_RGB8_texture; 545#if FEATURE_ES 546 case GL_PALETTE4_RGB8_OES: 547 case GL_PALETTE4_RGBA8_OES: 548 case GL_PALETTE4_R5_G6_B5_OES: 549 case GL_PALETTE4_RGBA4_OES: 550 case GL_PALETTE4_RGB5_A1_OES: 551 case GL_PALETTE8_RGB8_OES: 552 case GL_PALETTE8_RGBA8_OES: 553 case GL_PALETTE8_R5_G6_B5_OES: 554 case GL_PALETTE8_RGBA4_OES: 555 case GL_PALETTE8_RGB5_A1_OES: 556 return ctx->API == API_OPENGLES; 557#endif 558 default: 559 return GL_FALSE; 560 } 561} 562 563 564/** 565 * Convert various base formats to the cooresponding integer format. 566 */ 567GLenum 568_mesa_base_format_to_integer_format(GLenum format) 569{ 570 switch(format) { 571 case GL_RED: 572 return GL_RED_INTEGER; 573 case GL_GREEN: 574 return GL_GREEN_INTEGER; 575 case GL_BLUE: 576 return GL_BLUE_INTEGER; 577 case GL_RG: 578 return GL_RG_INTEGER; 579 case GL_RGB: 580 return GL_RGB_INTEGER; 581 case GL_RGBA: 582 return GL_RGBA_INTEGER; 583 case GL_BGR: 584 return GL_BGR_INTEGER; 585 case GL_BGRA: 586 return GL_BGRA_INTEGER; 587 case GL_ALPHA: 588 return GL_ALPHA_INTEGER; 589 case GL_LUMINANCE: 590 return GL_LUMINANCE_INTEGER_EXT; 591 case GL_LUMINANCE_ALPHA: 592 return GL_LUMINANCE_ALPHA_INTEGER_EXT; 593 } 594 595 return format; 596} 597 598