texformat.c revision 55d232a81566cf7ab8855c42e2ef1a280276a04c
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 default: 208 ; /* fallthrough */ 209 } 210 211 if (ctx->Extensions.ARB_depth_texture) { 212 switch (internalFormat) { 213 case GL_DEPTH_COMPONENT: 214 case GL_DEPTH_COMPONENT24: 215 case GL_DEPTH_COMPONENT32: 216 RETURN_IF_SUPPORTED(MESA_FORMAT_Z32); 217 RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24); 218 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); 219 break; 220 case GL_DEPTH_COMPONENT16: 221 RETURN_IF_SUPPORTED(MESA_FORMAT_Z16); 222 RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24); 223 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); 224 default: 225 ; /* fallthrough */ 226 } 227 } 228 229 switch (internalFormat) { 230 case GL_COMPRESSED_ALPHA_ARB: 231 RETURN_IF_SUPPORTED(MESA_FORMAT_A8); 232 break; 233 case GL_COMPRESSED_LUMINANCE_ARB: 234 RETURN_IF_SUPPORTED(MESA_FORMAT_L8); 235 break; 236 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: 237 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 238 break; 239 case GL_COMPRESSED_INTENSITY_ARB: 240 RETURN_IF_SUPPORTED(MESA_FORMAT_I8); 241 break; 242 case GL_COMPRESSED_RGB_ARB: 243 if (ctx->Extensions.EXT_texture_compression_s3tc || 244 ctx->Extensions.S3_s3tc) 245 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1); 246 if (ctx->Extensions.TDFX_texture_compression_FXT1) 247 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1); 248 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888); 249 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 250 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 251 break; 252 case GL_COMPRESSED_RGBA_ARB: 253 if (ctx->Extensions.EXT_texture_compression_s3tc || 254 ctx->Extensions.S3_s3tc) 255 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */ 256 if (ctx->Extensions.TDFX_texture_compression_FXT1) 257 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1); 258 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888); 259 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 260 break; 261 default: 262 ; /* fallthrough */ 263 } 264 265 if (ctx->Extensions.MESA_ycbcr_texture) { 266 if (internalFormat == GL_YCBCR_MESA) { 267 if (type == GL_UNSIGNED_SHORT_8_8_MESA) 268 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR); 269 else 270 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV); 271 } 272 } 273 274#if FEATURE_texture_fxt1 275 if (ctx->Extensions.TDFX_texture_compression_FXT1) { 276 switch (internalFormat) { 277 case GL_COMPRESSED_RGB_FXT1_3DFX: 278 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1); 279 break; 280 case GL_COMPRESSED_RGBA_FXT1_3DFX: 281 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1); 282 break; 283 default: 284 ; /* fallthrough */ 285 } 286 } 287#endif 288 289#if FEATURE_texture_s3tc 290 if (ctx->Extensions.EXT_texture_compression_s3tc) { 291 switch (internalFormat) { 292 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 293 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1); 294 break; 295 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 296 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT1); 297 break; 298 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 299 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); 300 break; 301 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 302 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT5); 303 break; 304 default: 305 ; /* fallthrough */ 306 } 307 } 308 309 if (ctx->Extensions.S3_s3tc) { 310 switch (internalFormat) { 311 case GL_RGB_S3TC: 312 case GL_RGB4_S3TC: 313 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1); 314 break; 315 case GL_RGBA_S3TC: 316 case GL_RGBA4_S3TC: 317 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); 318 break; 319 default: 320 ; /* fallthrough */ 321 } 322 } 323#endif 324 325 if (ctx->Extensions.ARB_texture_float) { 326 switch (internalFormat) { 327 case GL_ALPHA16F_ARB: 328 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16); 329 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32); 330 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 331 break; 332 case GL_ALPHA32F_ARB: 333 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32); 334 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 335 break; 336 case GL_LUMINANCE16F_ARB: 337 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16); 338 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32); 339 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 340 break; 341 case GL_LUMINANCE32F_ARB: 342 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32); 343 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 344 break; 345 case GL_LUMINANCE_ALPHA16F_ARB: 346 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16); 347 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32); 348 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 349 break; 350 case GL_LUMINANCE_ALPHA32F_ARB: 351 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32); 352 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 353 break; 354 case GL_INTENSITY16F_ARB: 355 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16); 356 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32); 357 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 358 break; 359 case GL_INTENSITY32F_ARB: 360 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32); 361 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 362 break; 363 case GL_RGB16F_ARB: 364 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16); 365 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32); 366 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 367 break; 368 case GL_RGB32F_ARB: 369 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32); 370 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 371 break; 372 case GL_RGBA16F_ARB: 373 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 374 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 375 break; 376 case GL_RGBA32F_ARB: 377 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 378 break; 379 default: 380 ; /* fallthrough */ 381 } 382 } 383 384 if (ctx->Extensions.EXT_texture_shared_exponent) { 385 switch (internalFormat) { 386 case GL_RGB9_E5: 387 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]); 388 return MESA_FORMAT_RGB9_E5_FLOAT; 389 default: 390 ; /* fallthrough */ 391 } 392 } 393 394 if (ctx->Extensions.EXT_packed_float) { 395 switch (internalFormat) { 396 case GL_R11F_G11F_B10F: 397 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11_G11_B10_FLOAT]); 398 return MESA_FORMAT_R11_G11_B10_FLOAT; 399 default: 400 ; /* fallthrough */ 401 } 402 } 403 404 if (ctx->Extensions.EXT_packed_depth_stencil) { 405 switch (internalFormat) { 406 case GL_DEPTH_STENCIL_EXT: 407 case GL_DEPTH24_STENCIL8_EXT: 408 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8); 409 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); 410 break; 411 default: 412 ; /* fallthrough */ 413 } 414 } 415 416 if (ctx->Extensions.ARB_depth_buffer_float) { 417 switch (internalFormat) { 418 case GL_DEPTH_COMPONENT32F: 419 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT]); 420 return MESA_FORMAT_Z32_FLOAT; 421 case GL_DEPTH32F_STENCIL8: 422 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8]); 423 return MESA_FORMAT_Z32_FLOAT_X24S8; 424 default: 425 ; /* fallthrough */ 426 } 427 } 428 429 if (ctx->Extensions.ATI_envmap_bumpmap) { 430 switch (internalFormat) { 431 case GL_DUDV_ATI: 432 case GL_DU8DV8_ATI: 433 RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8); 434 break; 435 default: 436 ; /* fallthrough */ 437 } 438 } 439 440 if (ctx->Extensions.EXT_texture_snorm) { 441 switch (internalFormat) { 442 case GL_RED_SNORM: 443 case GL_R8_SNORM: 444 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8); 445 break; 446 case GL_RG_SNORM: 447 case GL_RG8_SNORM: 448 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV); 449 break; 450 case GL_RGB_SNORM: 451 case GL_RGB8_SNORM: 452 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888); 453 /* FALLTHROUGH */ 454 case GL_RGBA_SNORM: 455 case GL_RGBA8_SNORM: 456 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 457 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 458 break; 459 case GL_ALPHA_SNORM: 460 case GL_ALPHA8_SNORM: 461 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8); 462 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 463 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 464 break; 465 case GL_LUMINANCE_SNORM: 466 case GL_LUMINANCE8_SNORM: 467 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8); 468 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888); 469 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 470 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 471 break; 472 case GL_LUMINANCE_ALPHA_SNORM: 473 case GL_LUMINANCE8_ALPHA8_SNORM: 474 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88); 475 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 476 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 477 break; 478 case GL_INTENSITY_SNORM: 479 case GL_INTENSITY8_SNORM: 480 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8); 481 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 482 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 483 break; 484 case GL_R16_SNORM: 485 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16); 486 break; 487 case GL_RG16_SNORM: 488 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616); 489 break; 490 case GL_RGB16_SNORM: 491 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16); 492 /* FALLTHROUGH */ 493 case GL_RGBA16_SNORM: 494 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 495 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 496 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 497 break; 498 case GL_ALPHA16_SNORM: 499 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16); 500 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 501 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 502 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 503 break; 504 case GL_LUMINANCE16_SNORM: 505 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16); 506 /* FALLTHROUGH */ 507 case GL_LUMINANCE16_ALPHA16_SNORM: 508 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616); 509 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 510 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 511 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 512 break; 513 case GL_INTENSITY16_SNORM: 514 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16); 515 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 516 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 517 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 518 break; 519 default: 520 ; /* fall-through */ 521 } 522 } 523 524#if FEATURE_EXT_texture_sRGB 525 if (ctx->Extensions.EXT_texture_sRGB) { 526 switch (internalFormat) { 527 case GL_SRGB_EXT: 528 case GL_SRGB8_EXT: 529 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8); 530 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 531 break; 532 case GL_SRGB_ALPHA_EXT: 533 case GL_SRGB8_ALPHA8_EXT: 534 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8); 535 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 536 break; 537 case GL_SLUMINANCE_EXT: 538 case GL_SLUMINANCE8_EXT: 539 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8); 540 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 541 break; 542 case GL_SLUMINANCE_ALPHA_EXT: 543 case GL_SLUMINANCE8_ALPHA8_EXT: 544 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8); 545 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 546 break; 547 case GL_COMPRESSED_SLUMINANCE_EXT: 548 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8); 549 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 550 break; 551 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 552 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8); 553 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 554 break; 555 case GL_COMPRESSED_SRGB_EXT: 556#if FEATURE_texture_s3tc 557 if (ctx->Extensions.EXT_texture_compression_s3tc) 558 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1); 559#endif 560 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8); 561 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 562 break; 563 case GL_COMPRESSED_SRGB_ALPHA_EXT: 564#if FEATURE_texture_s3tc 565 if (ctx->Extensions.EXT_texture_compression_s3tc) 566 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */ 567#endif 568 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8); 569 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 570 break; 571#if FEATURE_texture_s3tc 572 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 573 if (ctx->Extensions.EXT_texture_compression_s3tc) 574 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1); 575 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 576 break; 577 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 578 if (ctx->Extensions.EXT_texture_compression_s3tc) 579 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT1); 580 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 581 break; 582 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 583 if (ctx->Extensions.EXT_texture_compression_s3tc) 584 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); 585 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 586 break; 587 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 588 if (ctx->Extensions.EXT_texture_compression_s3tc) 589 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT5); 590 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 591 break; 592#endif 593 default: 594 ; /* fallthrough */ 595 } 596 } 597#endif /* FEATURE_EXT_texture_sRGB */ 598 599 if (ctx->Extensions.EXT_texture_integer) { 600 switch (internalFormat) { 601 case GL_RGBA32UI_EXT: 602 case GL_RGB32UI_EXT: 603 case GL_ALPHA32UI_EXT: 604 case GL_INTENSITY32UI_EXT: 605 case GL_LUMINANCE32UI_EXT: 606 case GL_LUMINANCE_ALPHA32UI_EXT: 607 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 608 break; 609 case GL_RGBA16UI_EXT: 610 case GL_RGB16UI_EXT: 611 case GL_ALPHA16UI_EXT: 612 case GL_INTENSITY16UI_EXT: 613 case GL_LUMINANCE16UI_EXT: 614 case GL_LUMINANCE_ALPHA16UI_EXT: 615 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 616 break; 617 case GL_RGBA8UI_EXT: 618 case GL_RGB8UI_EXT: 619 case GL_ALPHA8UI_EXT: 620 case GL_INTENSITY8UI_EXT: 621 case GL_LUMINANCE8UI_EXT: 622 case GL_LUMINANCE_ALPHA8UI_EXT: 623 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 624 break; 625 case GL_RGBA32I_EXT: 626 case GL_RGB32I_EXT: 627 case GL_ALPHA32I_EXT: 628 case GL_INTENSITY32I_EXT: 629 case GL_LUMINANCE32I_EXT: 630 case GL_LUMINANCE_ALPHA32I_EXT: 631 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 632 break; 633 case GL_RGBA16I_EXT: 634 case GL_RGB16I_EXT: 635 case GL_ALPHA16I_EXT: 636 case GL_INTENSITY16I_EXT: 637 case GL_LUMINANCE16I_EXT: 638 case GL_LUMINANCE_ALPHA16I_EXT: 639 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 640 break; 641 case GL_RGBA8I_EXT: 642 case GL_RGB8I_EXT: 643 case GL_ALPHA8I_EXT: 644 case GL_INTENSITY8I_EXT: 645 case GL_LUMINANCE8I_EXT: 646 case GL_LUMINANCE_ALPHA8I_EXT: 647 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 648 break; 649 } 650 } 651 652 if (ctx->Extensions.ARB_texture_rg) { 653 switch (internalFormat) { 654 case GL_R8: 655 case GL_RED: 656 RETURN_IF_SUPPORTED(MESA_FORMAT_R8); 657 break; 658 659 case GL_COMPRESSED_RED: 660 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1); 661 RETURN_IF_SUPPORTED(MESA_FORMAT_R8); 662 break; 663 664 case GL_R16: 665 RETURN_IF_SUPPORTED(MESA_FORMAT_R16); 666 break; 667 668 case GL_RG: 669 case GL_RG8: 670 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88); 671 break; 672 673 case GL_COMPRESSED_RG: 674 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2); 675 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88); 676 break; 677 678 case GL_RG16: 679 RETURN_IF_SUPPORTED(MESA_FORMAT_RG1616); 680 break; 681 682 default: 683 ; /* fallthrough */ 684 } 685 } 686 687 if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.ARB_texture_float) { 688 switch (internalFormat) { 689 case GL_R16F: 690 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16); 691 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32); 692 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 693 break; 694 case GL_R32F: 695 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32); 696 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 697 break; 698 case GL_RG16F: 699 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16); 700 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 701 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 702 break; 703 case GL_RG32F: 704 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 705 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 706 break; 707 708 default: 709 ; /* fallthrough */ 710 } 711 } 712 713 if (ctx->Extensions.EXT_texture_format_BGRA8888) { 714 switch (internalFormat) { 715 case GL_BGRA: 716 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 717 break; 718 719 default: 720 ; /* fallthrough */ 721 } 722 } 723 724 if (ctx->Extensions.ARB_texture_compression_rgtc) { 725 switch (internalFormat) { 726 case GL_COMPRESSED_RED_RGTC1: 727 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1); 728 break; 729 case GL_COMPRESSED_SIGNED_RED_RGTC1: 730 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RED_RGTC1); 731 break; 732 case GL_COMPRESSED_RG_RGTC2: 733 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2); 734 break; 735 case GL_COMPRESSED_SIGNED_RG_RGTC2: 736 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_RGTC2); 737 break; 738 default: 739 ; /* fallthrough */ 740 } 741 } 742 743 if (ctx->Extensions.EXT_texture_compression_latc) { 744 switch (internalFormat) { 745 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 746 RETURN_IF_SUPPORTED(MESA_FORMAT_L_LATC1); 747 break; 748 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 749 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L_LATC1); 750 break; 751 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 752 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2); 753 break; 754 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 755 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_LA_LATC2); 756 break; 757 default: 758 ; /* fallthrough */ 759 } 760 } 761 762 if (ctx->Extensions.ATI_texture_compression_3dc) { 763 switch (internalFormat) { 764 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 765 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2); 766 break; 767 default: 768 ; /* fallthrough */ 769 } 770 } 771 772 _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()"); 773 return MESA_FORMAT_NONE; 774} 775 776