texformat.c revision 1271424615b62544662a606bb23f6d7117a8b0e7
1/* 2 * Mesa 3-D graphics library 3 * Version: 7.7 4 * 5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6 * Copyright (c) 2008-2009 VMware, Inc. 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 * BRIAN PAUL 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/** 28 * \file texformat.c 29 * Texture formats. 30 * 31 * \author Gareth Hughes 32 * \author Brian Paul 33 */ 34 35 36#include "context.h" 37#include "mfeatures.h" 38#include "mtypes.h" 39#include "texcompress.h" 40#include "texformat.h" 41 42#define RETURN_IF_SUPPORTED(f) do { \ 43 if (ctx->TextureFormatSupported[f]) \ 44 return f; \ 45} while (0) 46 47/** 48 * Choose an appropriate texture format given the format, type and 49 * internalFormat parameters passed to glTexImage(). 50 * 51 * \param ctx the GL context. 52 * \param internalFormat user's prefered internal texture format. 53 * \param format incoming image pixel format. 54 * \param type incoming image data type. 55 * 56 * \return a pointer to a gl_texture_format object which describes the 57 * choosen texture format, or NULL on failure. 58 * 59 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers 60 * will typically override this function with a specialized version. 61 */ 62gl_format 63_mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, 64 GLenum format, GLenum type ) 65{ 66 (void) format; 67 (void) type; 68 69 switch (internalFormat) { 70 /* shallow RGBA formats */ 71 case 4: 72 case GL_RGBA: 73 if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) { 74 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444); 75 } else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) { 76 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555); 77 } 78 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888); 79 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 80 break; 81 82 case GL_RGBA8: 83 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888); 84 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 85 break; 86 case GL_RGB5_A1: 87 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555); 88 break; 89 case GL_RGBA2: 90 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444_REV); /* just to test another format*/ 91 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444); 92 break; 93 case GL_RGBA4: 94 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444); 95 break; 96 97 /* deep RGBA formats */ 98 case GL_RGB10_A2: 99 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010); 100 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 101 break; 102 case GL_RGBA12: 103 case GL_RGBA16: 104 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16); 105 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16); 106 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888); 107 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 108 break; 109 110 /* shallow RGB formats */ 111 case 3: 112 case GL_RGB: 113 case GL_RGB8: 114 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888); 115 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 116 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 117 break; 118 case GL_R3_G3_B2: 119 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332); 120 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888); 121 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 122 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 123 break; 124 case GL_RGB4: 125 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); /* just to test another format */ 126 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565); 127 break; 128 case GL_RGB5: 129 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565); 130 break; 131 132 /* deep RGB formats */ 133 case GL_RGB10: 134 case GL_RGB12: 135 case GL_RGB16: 136 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16); 137 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 138 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 139 break; 140 141 /* Alpha formats */ 142 case GL_ALPHA: 143 case GL_ALPHA4: 144 case GL_ALPHA8: 145 RETURN_IF_SUPPORTED(MESA_FORMAT_A8); 146 break; 147 148 case GL_ALPHA12: 149 case GL_ALPHA16: 150 RETURN_IF_SUPPORTED(MESA_FORMAT_A16); 151 RETURN_IF_SUPPORTED(MESA_FORMAT_A8); 152 break; 153 154 /* Luminance formats */ 155 case 1: 156 case GL_LUMINANCE: 157 case GL_LUMINANCE4: 158 case GL_LUMINANCE8: 159 RETURN_IF_SUPPORTED(MESA_FORMAT_L8); 160 break; 161 162 case GL_LUMINANCE12: 163 case GL_LUMINANCE16: 164 RETURN_IF_SUPPORTED(MESA_FORMAT_L16); 165 RETURN_IF_SUPPORTED(MESA_FORMAT_L8); 166 break; 167 168 /* Luminance/Alpha formats */ 169 case GL_LUMINANCE4_ALPHA4: 170 RETURN_IF_SUPPORTED(MESA_FORMAT_AL44); 171 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 172 break; 173 174 case 2: 175 case GL_LUMINANCE_ALPHA: 176 case GL_LUMINANCE6_ALPHA2: 177 case GL_LUMINANCE8_ALPHA8: 178 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 179 break; 180 181 case GL_LUMINANCE12_ALPHA4: 182 case GL_LUMINANCE12_ALPHA12: 183 case GL_LUMINANCE16_ALPHA16: 184 RETURN_IF_SUPPORTED(MESA_FORMAT_AL1616); 185 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 186 break; 187 188 case GL_INTENSITY: 189 case GL_INTENSITY4: 190 case GL_INTENSITY8: 191 RETURN_IF_SUPPORTED(MESA_FORMAT_I8); 192 break; 193 194 case GL_INTENSITY12: 195 case GL_INTENSITY16: 196 RETURN_IF_SUPPORTED(MESA_FORMAT_I16); 197 RETURN_IF_SUPPORTED(MESA_FORMAT_I8); 198 break; 199 200 case GL_COLOR_INDEX: 201 case GL_COLOR_INDEX1_EXT: 202 case GL_COLOR_INDEX2_EXT: 203 case GL_COLOR_INDEX4_EXT: 204 case GL_COLOR_INDEX12_EXT: 205 case GL_COLOR_INDEX16_EXT: 206 case GL_COLOR_INDEX8_EXT: 207 RETURN_IF_SUPPORTED(MESA_FORMAT_CI8); 208 break; 209 210 default: 211 ; /* fallthrough */ 212 } 213 214 if (ctx->Extensions.ARB_depth_texture) { 215 switch (internalFormat) { 216 case GL_DEPTH_COMPONENT: 217 case GL_DEPTH_COMPONENT24: 218 case GL_DEPTH_COMPONENT32: 219 RETURN_IF_SUPPORTED(MESA_FORMAT_Z32); 220 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); 221 break; 222 case GL_DEPTH_COMPONENT16: 223 RETURN_IF_SUPPORTED(MESA_FORMAT_Z16); 224 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); 225 default: 226 ; /* fallthrough */ 227 } 228 } 229 230 switch (internalFormat) { 231 case GL_COMPRESSED_ALPHA_ARB: 232 RETURN_IF_SUPPORTED(MESA_FORMAT_A8); 233 break; 234 case GL_COMPRESSED_LUMINANCE_ARB: 235 RETURN_IF_SUPPORTED(MESA_FORMAT_L8); 236 break; 237 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: 238 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 239 break; 240 case GL_COMPRESSED_INTENSITY_ARB: 241 RETURN_IF_SUPPORTED(MESA_FORMAT_I8); 242 break; 243 case GL_COMPRESSED_RGB_ARB: 244 if (ctx->Extensions.EXT_texture_compression_s3tc || 245 ctx->Extensions.S3_s3tc) 246 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1); 247 if (ctx->Extensions.TDFX_texture_compression_FXT1) 248 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1); 249 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888); 250 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 251 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 252 break; 253 case GL_COMPRESSED_RGBA_ARB: 254 if (ctx->Extensions.EXT_texture_compression_s3tc || 255 ctx->Extensions.S3_s3tc) 256 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */ 257 if (ctx->Extensions.TDFX_texture_compression_FXT1) 258 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1); 259 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888); 260 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 261 break; 262 default: 263 ; /* fallthrough */ 264 } 265 266 if (ctx->Extensions.MESA_ycbcr_texture) { 267 if (internalFormat == GL_YCBCR_MESA) { 268 if (type == GL_UNSIGNED_SHORT_8_8_MESA) 269 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR); 270 else 271 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV); 272 } 273 } 274 275#if FEATURE_texture_fxt1 276 if (ctx->Extensions.TDFX_texture_compression_FXT1) { 277 switch (internalFormat) { 278 case GL_COMPRESSED_RGB_FXT1_3DFX: 279 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1); 280 break; 281 case GL_COMPRESSED_RGBA_FXT1_3DFX: 282 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1); 283 break; 284 default: 285 ; /* fallthrough */ 286 } 287 } 288#endif 289 290#if FEATURE_texture_s3tc 291 if (ctx->Extensions.EXT_texture_compression_s3tc) { 292 switch (internalFormat) { 293 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 294 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1); 295 break; 296 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 297 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT1); 298 break; 299 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 300 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); 301 break; 302 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 303 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT5); 304 break; 305 default: 306 ; /* fallthrough */ 307 } 308 } 309 310 if (ctx->Extensions.S3_s3tc) { 311 switch (internalFormat) { 312 case GL_RGB_S3TC: 313 case GL_RGB4_S3TC: 314 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1); 315 break; 316 case GL_RGBA_S3TC: 317 case GL_RGBA4_S3TC: 318 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); 319 break; 320 default: 321 ; /* fallthrough */ 322 } 323 } 324#endif 325 326 if (ctx->Extensions.ARB_texture_float) { 327 switch (internalFormat) { 328 case GL_ALPHA16F_ARB: 329 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16); 330 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32); 331 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 332 break; 333 case GL_ALPHA32F_ARB: 334 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32); 335 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 336 break; 337 case GL_LUMINANCE16F_ARB: 338 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16); 339 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32); 340 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 341 break; 342 case GL_LUMINANCE32F_ARB: 343 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32); 344 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 345 break; 346 case GL_LUMINANCE_ALPHA16F_ARB: 347 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16); 348 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32); 349 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 350 break; 351 case GL_LUMINANCE_ALPHA32F_ARB: 352 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32); 353 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 354 break; 355 case GL_INTENSITY16F_ARB: 356 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16); 357 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32); 358 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 359 break; 360 case GL_INTENSITY32F_ARB: 361 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32); 362 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 363 break; 364 case GL_RGB16F_ARB: 365 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16); 366 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32); 367 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 368 break; 369 case GL_RGB32F_ARB: 370 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32); 371 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 372 break; 373 case GL_RGBA16F_ARB: 374 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 375 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 376 break; 377 case GL_RGBA32F_ARB: 378 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 379 break; 380 default: 381 ; /* fallthrough */ 382 } 383 } 384 385 if (ctx->Extensions.EXT_texture_shared_exponent) { 386 switch (internalFormat) { 387 case GL_RGB9_E5: 388 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]); 389 return MESA_FORMAT_RGB9_E5_FLOAT; 390 default: 391 ; /* fallthrough */ 392 } 393 } 394 395 if (ctx->Extensions.EXT_packed_depth_stencil) { 396 switch (internalFormat) { 397 case GL_DEPTH_STENCIL_EXT: 398 case GL_DEPTH24_STENCIL8_EXT: 399 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8); 400 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); 401 break; 402 default: 403 ; /* fallthrough */ 404 } 405 } 406 407 if (ctx->Extensions.ATI_envmap_bumpmap) { 408 switch (internalFormat) { 409 case GL_DUDV_ATI: 410 case GL_DU8DV8_ATI: 411 RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8); 412 break; 413 default: 414 ; /* fallthrough */ 415 } 416 } 417 418 if (ctx->Extensions.EXT_texture_snorm) { 419 switch (internalFormat) { 420 case GL_RED_SNORM: 421 case GL_R8_SNORM: 422 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8); 423 break; 424 case GL_RG_SNORM: 425 case GL_RG8_SNORM: 426 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV); 427 break; 428 case GL_RGB_SNORM: 429 case GL_RGB8_SNORM: 430 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888); 431 /* FALLTHROUGH */ 432 case GL_RGBA_SNORM: 433 case GL_RGBA8_SNORM: 434 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 435 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 436 break; 437 case GL_ALPHA_SNORM: 438 case GL_ALPHA8_SNORM: 439 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8); 440 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 441 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 442 break; 443 case GL_LUMINANCE_SNORM: 444 case GL_LUMINANCE8_SNORM: 445 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8); 446 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888); 447 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 448 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 449 break; 450 case GL_LUMINANCE_ALPHA_SNORM: 451 case GL_LUMINANCE8_ALPHA8_SNORM: 452 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88); 453 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 454 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 455 break; 456 case GL_INTENSITY_SNORM: 457 case GL_INTENSITY8_SNORM: 458 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8); 459 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 460 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 461 break; 462 case GL_R16_SNORM: 463 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16); 464 break; 465 case GL_RG16_SNORM: 466 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616); 467 break; 468 case GL_RGB16_SNORM: 469 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16); 470 /* FALLTHROUGH */ 471 case GL_RGBA16_SNORM: 472 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 473 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 474 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 475 break; 476 case GL_ALPHA16_SNORM: 477 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16); 478 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 479 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 480 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 481 break; 482 case GL_LUMINANCE16_SNORM: 483 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16); 484 /* FALLTHROUGH */ 485 case GL_LUMINANCE16_ALPHA16_SNORM: 486 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616); 487 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 488 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 489 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 490 break; 491 case GL_INTENSITY16_SNORM: 492 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16); 493 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 494 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 495 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 496 break; 497 default: 498 ; /* fall-through */ 499 } 500 } 501 502#if FEATURE_EXT_texture_sRGB 503 if (ctx->Extensions.EXT_texture_sRGB) { 504 switch (internalFormat) { 505 case GL_SRGB_EXT: 506 case GL_SRGB8_EXT: 507 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8); 508 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 509 break; 510 case GL_SRGB_ALPHA_EXT: 511 case GL_SRGB8_ALPHA8_EXT: 512 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8); 513 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 514 break; 515 case GL_SLUMINANCE_EXT: 516 case GL_SLUMINANCE8_EXT: 517 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8); 518 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 519 break; 520 case GL_SLUMINANCE_ALPHA_EXT: 521 case GL_SLUMINANCE8_ALPHA8_EXT: 522 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8); 523 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 524 break; 525 case GL_COMPRESSED_SLUMINANCE_EXT: 526 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8); 527 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 528 break; 529 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 530 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8); 531 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 532 break; 533 case GL_COMPRESSED_SRGB_EXT: 534#if FEATURE_texture_s3tc 535 if (ctx->Extensions.EXT_texture_compression_s3tc) 536 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1); 537#endif 538 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8); 539 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 540 break; 541 case GL_COMPRESSED_SRGB_ALPHA_EXT: 542#if FEATURE_texture_s3tc 543 if (ctx->Extensions.EXT_texture_compression_s3tc) 544 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */ 545#endif 546 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8); 547 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 548 break; 549#if FEATURE_texture_s3tc 550 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 551 if (ctx->Extensions.EXT_texture_compression_s3tc) 552 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1); 553 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 554 break; 555 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 556 if (ctx->Extensions.EXT_texture_compression_s3tc) 557 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT1); 558 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 559 break; 560 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 561 if (ctx->Extensions.EXT_texture_compression_s3tc) 562 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); 563 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 564 break; 565 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 566 if (ctx->Extensions.EXT_texture_compression_s3tc) 567 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT5); 568 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 569 break; 570#endif 571 default: 572 ; /* fallthrough */ 573 } 574 } 575#endif /* FEATURE_EXT_texture_sRGB */ 576 577 if (ctx->Extensions.EXT_texture_integer) { 578 switch (internalFormat) { 579 case GL_RGBA32UI_EXT: 580 case GL_RGB32UI_EXT: 581 case GL_ALPHA32UI_EXT: 582 case GL_INTENSITY32UI_EXT: 583 case GL_LUMINANCE32UI_EXT: 584 case GL_LUMINANCE_ALPHA32UI_EXT: 585 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 586 break; 587 case GL_RGBA16UI_EXT: 588 case GL_RGB16UI_EXT: 589 case GL_ALPHA16UI_EXT: 590 case GL_INTENSITY16UI_EXT: 591 case GL_LUMINANCE16UI_EXT: 592 case GL_LUMINANCE_ALPHA16UI_EXT: 593 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 594 break; 595 case GL_RGBA8UI_EXT: 596 case GL_RGB8UI_EXT: 597 case GL_ALPHA8UI_EXT: 598 case GL_INTENSITY8UI_EXT: 599 case GL_LUMINANCE8UI_EXT: 600 case GL_LUMINANCE_ALPHA8UI_EXT: 601 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 602 break; 603 case GL_RGBA32I_EXT: 604 case GL_RGB32I_EXT: 605 case GL_ALPHA32I_EXT: 606 case GL_INTENSITY32I_EXT: 607 case GL_LUMINANCE32I_EXT: 608 case GL_LUMINANCE_ALPHA32I_EXT: 609 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 610 break; 611 case GL_RGBA16I_EXT: 612 case GL_RGB16I_EXT: 613 case GL_ALPHA16I_EXT: 614 case GL_INTENSITY16I_EXT: 615 case GL_LUMINANCE16I_EXT: 616 case GL_LUMINANCE_ALPHA16I_EXT: 617 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 618 break; 619 case GL_RGBA8I_EXT: 620 case GL_RGB8I_EXT: 621 case GL_ALPHA8I_EXT: 622 case GL_INTENSITY8I_EXT: 623 case GL_LUMINANCE8I_EXT: 624 case GL_LUMINANCE_ALPHA8I_EXT: 625 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 626 break; 627 } 628 } 629 630 if (ctx->Extensions.ARB_texture_rg) { 631 switch (internalFormat) { 632 case GL_R8: 633 case GL_RED: 634 RETURN_IF_SUPPORTED(MESA_FORMAT_R8); 635 break; 636 637 case GL_COMPRESSED_RED: 638 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1); 639 RETURN_IF_SUPPORTED(MESA_FORMAT_R8); 640 break; 641 642 case GL_R16: 643 RETURN_IF_SUPPORTED(MESA_FORMAT_R16); 644 break; 645 646 case GL_RG: 647 case GL_RG8: 648 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88); 649 break; 650 651 case GL_COMPRESSED_RG: 652 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2); 653 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88); 654 break; 655 656 case GL_RG16: 657 RETURN_IF_SUPPORTED(MESA_FORMAT_RG1616); 658 break; 659 660 default: 661 ; /* fallthrough */ 662 } 663 } 664 665 if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.ARB_texture_float) { 666 switch (internalFormat) { 667 case GL_R16F: 668 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16); 669 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32); 670 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 671 break; 672 case GL_R32F: 673 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32); 674 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 675 break; 676 case GL_RG16F: 677 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16); 678 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 679 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 680 break; 681 case GL_RG32F: 682 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 683 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 684 break; 685 686 default: 687 ; /* fallthrough */ 688 } 689 } 690 691 if (ctx->Extensions.EXT_texture_format_BGRA8888) { 692 switch (internalFormat) { 693 case GL_BGRA: 694 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 695 break; 696 697 default: 698 ; /* fallthrough */ 699 } 700 } 701 702 if (ctx->Extensions.ARB_texture_compression_rgtc) { 703 switch (internalFormat) { 704 case GL_COMPRESSED_RED_RGTC1: 705 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1); 706 break; 707 case GL_COMPRESSED_SIGNED_RED_RGTC1: 708 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RED_RGTC1); 709 break; 710 case GL_COMPRESSED_RG_RGTC2: 711 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2); 712 break; 713 case GL_COMPRESSED_SIGNED_RG_RGTC2: 714 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_RGTC2); 715 break; 716 default: 717 ; /* fallthrough */ 718 } 719 } 720 721 if (ctx->Extensions.EXT_texture_compression_latc) { 722 switch (internalFormat) { 723 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 724 RETURN_IF_SUPPORTED(MESA_FORMAT_L_LATC1); 725 break; 726 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 727 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L_LATC1); 728 break; 729 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 730 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2); 731 break; 732 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 733 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_LA_LATC2); 734 break; 735 default: 736 ; /* fallthrough */ 737 } 738 } 739 740 if (ctx->Extensions.ATI_texture_compression_3dc) { 741 switch (internalFormat) { 742 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 743 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2); 744 break; 745 default: 746 ; /* fallthrough */ 747 } 748 } 749 750 _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()"); 751 return MESA_FORMAT_NONE; 752} 753 754