texformat.c revision f449be660e70aac2aefd2ce84581e137de25520b
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 "enums.h" 38#include "mfeatures.h" 39#include "mtypes.h" 40#include "texcompress.h" 41#include "texformat.h" 42 43#define RETURN_IF_SUPPORTED(f) do { \ 44 if (ctx->TextureFormatSupported[f]) \ 45 return f; \ 46} while (0) 47 48/** 49 * Choose an appropriate texture format given the format, type and 50 * internalFormat parameters passed to glTexImage(). 51 * 52 * \param ctx the GL context. 53 * \param internalFormat user's prefered internal texture format. 54 * \param format incoming image pixel format. 55 * \param type incoming image data type. 56 * 57 * \return a pointer to a gl_texture_format object which describes the 58 * choosen texture format, or NULL on failure. 59 * 60 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers 61 * will typically override this function with a specialized version. 62 */ 63gl_format 64_mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat, 65 GLenum format, GLenum type ) 66{ 67 (void) format; 68 (void) type; 69 70 switch (internalFormat) { 71 /* shallow RGBA formats */ 72 case 4: 73 case GL_RGBA: 74 if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) { 75 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444); 76 } else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) { 77 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555); 78 } 79 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888); 80 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 81 break; 82 83 case GL_RGBA8: 84 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888); 85 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 86 break; 87 case GL_RGB5_A1: 88 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555); 89 break; 90 case GL_RGBA2: 91 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444_REV); /* just to test another format*/ 92 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444); 93 break; 94 case GL_RGBA4: 95 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444); 96 break; 97 98 /* deep RGBA formats */ 99 case GL_RGB10_A2: 100 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010); 101 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 102 break; 103 case GL_RGBA12: 104 case GL_RGBA16: 105 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16); 106 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16); 107 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888); 108 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 109 break; 110 111 /* shallow RGB formats */ 112 case 3: 113 case GL_RGB: 114 case GL_RGB8: 115 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888); 116 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 117 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 118 break; 119 case GL_R3_G3_B2: 120 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332); 121 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888); 122 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 123 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 124 break; 125 case GL_RGB4: 126 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); /* just to test another format */ 127 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565); 128 break; 129 case GL_RGB5: 130 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565); 131 break; 132 133 /* deep RGB formats */ 134 case GL_RGB10: 135 case GL_RGB12: 136 case GL_RGB16: 137 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16); 138 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 139 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 140 break; 141 142 /* Alpha formats */ 143 case GL_ALPHA: 144 case GL_ALPHA4: 145 case GL_ALPHA8: 146 RETURN_IF_SUPPORTED(MESA_FORMAT_A8); 147 break; 148 149 case GL_ALPHA12: 150 case GL_ALPHA16: 151 RETURN_IF_SUPPORTED(MESA_FORMAT_A16); 152 RETURN_IF_SUPPORTED(MESA_FORMAT_A8); 153 break; 154 155 /* Luminance formats */ 156 case 1: 157 case GL_LUMINANCE: 158 case GL_LUMINANCE4: 159 case GL_LUMINANCE8: 160 RETURN_IF_SUPPORTED(MESA_FORMAT_L8); 161 break; 162 163 case GL_LUMINANCE12: 164 case GL_LUMINANCE16: 165 RETURN_IF_SUPPORTED(MESA_FORMAT_L16); 166 RETURN_IF_SUPPORTED(MESA_FORMAT_L8); 167 break; 168 169 /* Luminance/Alpha formats */ 170 case GL_LUMINANCE4_ALPHA4: 171 RETURN_IF_SUPPORTED(MESA_FORMAT_AL44); 172 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 173 break; 174 175 case 2: 176 case GL_LUMINANCE_ALPHA: 177 case GL_LUMINANCE6_ALPHA2: 178 case GL_LUMINANCE8_ALPHA8: 179 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 180 break; 181 182 case GL_LUMINANCE12_ALPHA4: 183 case GL_LUMINANCE12_ALPHA12: 184 case GL_LUMINANCE16_ALPHA16: 185 RETURN_IF_SUPPORTED(MESA_FORMAT_AL1616); 186 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 187 break; 188 189 case GL_INTENSITY: 190 case GL_INTENSITY4: 191 case GL_INTENSITY8: 192 RETURN_IF_SUPPORTED(MESA_FORMAT_I8); 193 break; 194 195 case GL_INTENSITY12: 196 case GL_INTENSITY16: 197 RETURN_IF_SUPPORTED(MESA_FORMAT_I16); 198 RETURN_IF_SUPPORTED(MESA_FORMAT_I8); 199 break; 200 201 default: 202 ; /* fallthrough */ 203 } 204 205 if (ctx->Extensions.ARB_depth_texture) { 206 switch (internalFormat) { 207 case GL_DEPTH_COMPONENT: 208 case GL_DEPTH_COMPONENT24: 209 case GL_DEPTH_COMPONENT32: 210 RETURN_IF_SUPPORTED(MESA_FORMAT_Z32); 211 RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24); 212 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); 213 break; 214 case GL_DEPTH_COMPONENT16: 215 RETURN_IF_SUPPORTED(MESA_FORMAT_Z16); 216 RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24); 217 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); 218 default: 219 ; /* fallthrough */ 220 } 221 } 222 223 switch (internalFormat) { 224 case GL_COMPRESSED_ALPHA_ARB: 225 RETURN_IF_SUPPORTED(MESA_FORMAT_A8); 226 break; 227 case GL_COMPRESSED_LUMINANCE_ARB: 228 RETURN_IF_SUPPORTED(MESA_FORMAT_L8); 229 break; 230 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: 231 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 232 break; 233 case GL_COMPRESSED_INTENSITY_ARB: 234 RETURN_IF_SUPPORTED(MESA_FORMAT_I8); 235 break; 236 case GL_COMPRESSED_RGB_ARB: 237 if (ctx->Extensions.EXT_texture_compression_s3tc || 238 ctx->Extensions.S3_s3tc) 239 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1); 240 if (ctx->Extensions.TDFX_texture_compression_FXT1) 241 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1); 242 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888); 243 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 244 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 245 break; 246 case GL_COMPRESSED_RGBA_ARB: 247 if (ctx->Extensions.EXT_texture_compression_s3tc || 248 ctx->Extensions.S3_s3tc) 249 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */ 250 if (ctx->Extensions.TDFX_texture_compression_FXT1) 251 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1); 252 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888); 253 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 254 break; 255 default: 256 ; /* fallthrough */ 257 } 258 259 if (ctx->Extensions.MESA_ycbcr_texture) { 260 if (internalFormat == GL_YCBCR_MESA) { 261 if (type == GL_UNSIGNED_SHORT_8_8_MESA) 262 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR); 263 else 264 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV); 265 } 266 } 267 268#if FEATURE_texture_fxt1 269 if (ctx->Extensions.TDFX_texture_compression_FXT1) { 270 switch (internalFormat) { 271 case GL_COMPRESSED_RGB_FXT1_3DFX: 272 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1); 273 break; 274 case GL_COMPRESSED_RGBA_FXT1_3DFX: 275 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1); 276 break; 277 default: 278 ; /* fallthrough */ 279 } 280 } 281#endif 282 283#if FEATURE_texture_s3tc 284 if (ctx->Extensions.EXT_texture_compression_s3tc) { 285 switch (internalFormat) { 286 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 287 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1); 288 break; 289 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 290 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT1); 291 break; 292 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 293 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); 294 break; 295 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 296 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT5); 297 break; 298 default: 299 ; /* fallthrough */ 300 } 301 } 302 303 if (ctx->Extensions.S3_s3tc) { 304 switch (internalFormat) { 305 case GL_RGB_S3TC: 306 case GL_RGB4_S3TC: 307 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1); 308 break; 309 case GL_RGBA_S3TC: 310 case GL_RGBA4_S3TC: 311 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); 312 break; 313 default: 314 ; /* fallthrough */ 315 } 316 } 317#endif 318 319 if (ctx->Extensions.ARB_texture_float) { 320 switch (internalFormat) { 321 case GL_ALPHA16F_ARB: 322 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16); 323 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32); 324 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 325 break; 326 case GL_ALPHA32F_ARB: 327 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32); 328 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 329 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16); 330 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 331 break; 332 case GL_LUMINANCE16F_ARB: 333 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16); 334 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32); 335 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 336 break; 337 case GL_LUMINANCE32F_ARB: 338 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32); 339 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 340 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16); 341 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 342 break; 343 case GL_LUMINANCE_ALPHA16F_ARB: 344 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16); 345 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32); 346 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 347 break; 348 case GL_LUMINANCE_ALPHA32F_ARB: 349 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32); 350 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 351 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16); 352 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 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 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16); 363 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 364 break; 365 case GL_RGB16F_ARB: 366 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16); 367 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 368 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32); 369 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 370 break; 371 case GL_RGB32F_ARB: 372 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32); 373 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 374 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16); 375 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 376 break; 377 case GL_RGBA16F_ARB: 378 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 379 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 380 break; 381 case GL_RGBA32F_ARB: 382 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 383 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 384 break; 385 default: 386 ; /* fallthrough */ 387 } 388 } 389 390 if (ctx->Extensions.EXT_texture_shared_exponent) { 391 switch (internalFormat) { 392 case GL_RGB9_E5: 393 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]); 394 return MESA_FORMAT_RGB9_E5_FLOAT; 395 default: 396 ; /* fallthrough */ 397 } 398 } 399 400 if (ctx->Extensions.EXT_packed_float) { 401 switch (internalFormat) { 402 case GL_R11F_G11F_B10F: 403 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11_G11_B10_FLOAT]); 404 return MESA_FORMAT_R11_G11_B10_FLOAT; 405 default: 406 ; /* fallthrough */ 407 } 408 } 409 410 if (ctx->Extensions.EXT_packed_depth_stencil) { 411 switch (internalFormat) { 412 case GL_DEPTH_STENCIL_EXT: 413 case GL_DEPTH24_STENCIL8_EXT: 414 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8); 415 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); 416 break; 417 default: 418 ; /* fallthrough */ 419 } 420 } 421 422 if (ctx->Extensions.ARB_depth_buffer_float) { 423 switch (internalFormat) { 424 case GL_DEPTH_COMPONENT32F: 425 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT]); 426 return MESA_FORMAT_Z32_FLOAT; 427 case GL_DEPTH32F_STENCIL8: 428 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8]); 429 return MESA_FORMAT_Z32_FLOAT_X24S8; 430 default: 431 ; /* fallthrough */ 432 } 433 } 434 435 if (ctx->Extensions.ATI_envmap_bumpmap) { 436 switch (internalFormat) { 437 case GL_DUDV_ATI: 438 case GL_DU8DV8_ATI: 439 RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8); 440 break; 441 default: 442 ; /* fallthrough */ 443 } 444 } 445 446 if (ctx->Extensions.EXT_texture_snorm) { 447 switch (internalFormat) { 448 case GL_RED_SNORM: 449 case GL_R8_SNORM: 450 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8); 451 break; 452 case GL_RG_SNORM: 453 case GL_RG8_SNORM: 454 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV); 455 break; 456 case GL_RGB_SNORM: 457 case GL_RGB8_SNORM: 458 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888); 459 /* FALLTHROUGH */ 460 case GL_RGBA_SNORM: 461 case GL_RGBA8_SNORM: 462 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 463 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 464 break; 465 case GL_ALPHA_SNORM: 466 case GL_ALPHA8_SNORM: 467 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8); 468 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 469 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 470 break; 471 case GL_LUMINANCE_SNORM: 472 case GL_LUMINANCE8_SNORM: 473 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8); 474 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888); 475 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 476 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 477 break; 478 case GL_LUMINANCE_ALPHA_SNORM: 479 case GL_LUMINANCE8_ALPHA8_SNORM: 480 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88); 481 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 482 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 483 break; 484 case GL_INTENSITY_SNORM: 485 case GL_INTENSITY8_SNORM: 486 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8); 487 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 488 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 489 break; 490 case GL_R16_SNORM: 491 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16); 492 break; 493 case GL_RG16_SNORM: 494 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616); 495 break; 496 case GL_RGB16_SNORM: 497 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16); 498 /* FALLTHROUGH */ 499 case GL_RGBA16_SNORM: 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_ALPHA16_SNORM: 505 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16); 506 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 507 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 508 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 509 break; 510 case GL_LUMINANCE16_SNORM: 511 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16); 512 /* FALLTHROUGH */ 513 case GL_LUMINANCE16_ALPHA16_SNORM: 514 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616); 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 case GL_INTENSITY16_SNORM: 520 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16); 521 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 522 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 523 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 524 break; 525 default: 526 ; /* fall-through */ 527 } 528 } 529 530#if FEATURE_EXT_texture_sRGB 531 if (ctx->Extensions.EXT_texture_sRGB) { 532 switch (internalFormat) { 533 case GL_SRGB_EXT: 534 case GL_SRGB8_EXT: 535 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8); 536 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 537 break; 538 case GL_SRGB_ALPHA_EXT: 539 case GL_SRGB8_ALPHA8_EXT: 540 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8); 541 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 542 break; 543 case GL_SLUMINANCE_EXT: 544 case GL_SLUMINANCE8_EXT: 545 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8); 546 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 547 break; 548 case GL_SLUMINANCE_ALPHA_EXT: 549 case GL_SLUMINANCE8_ALPHA8_EXT: 550 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8); 551 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 552 break; 553 case GL_COMPRESSED_SLUMINANCE_EXT: 554 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8); 555 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 556 break; 557 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 558 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8); 559 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 560 break; 561 case GL_COMPRESSED_SRGB_EXT: 562#if FEATURE_texture_s3tc 563 if (ctx->Extensions.EXT_texture_compression_s3tc) 564 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1); 565#endif 566 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8); 567 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 568 break; 569 case GL_COMPRESSED_SRGB_ALPHA_EXT: 570#if FEATURE_texture_s3tc 571 if (ctx->Extensions.EXT_texture_compression_s3tc) 572 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */ 573#endif 574 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8); 575 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 576 break; 577#if FEATURE_texture_s3tc 578 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 579 if (ctx->Extensions.EXT_texture_compression_s3tc) 580 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1); 581 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 582 break; 583 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 584 if (ctx->Extensions.EXT_texture_compression_s3tc) 585 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT1); 586 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 587 break; 588 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 589 if (ctx->Extensions.EXT_texture_compression_s3tc) 590 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); 591 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 592 break; 593 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 594 if (ctx->Extensions.EXT_texture_compression_s3tc) 595 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT5); 596 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 597 break; 598#endif 599 default: 600 ; /* fallthrough */ 601 } 602 } 603#endif /* FEATURE_EXT_texture_sRGB */ 604 605 if (ctx->Extensions.EXT_texture_integer) { 606 switch (internalFormat) { 607 case GL_ALPHA8UI_EXT: 608 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT8); 609 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 610 break; 611 case GL_ALPHA16UI_EXT: 612 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT16); 613 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 614 break; 615 case GL_ALPHA32UI_EXT: 616 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT32); 617 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 618 break; 619 case GL_ALPHA8I_EXT: 620 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT8); 621 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 622 break; 623 case GL_ALPHA16I_EXT: 624 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT16); 625 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 626 break; 627 case GL_ALPHA32I_EXT: 628 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT32); 629 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 630 break; 631 case GL_LUMINANCE8UI_EXT: 632 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT8); 633 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 634 break; 635 case GL_LUMINANCE16UI_EXT: 636 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT16); 637 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 638 break; 639 case GL_LUMINANCE32UI_EXT: 640 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT32); 641 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 642 break; 643 case GL_LUMINANCE8I_EXT: 644 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT8); 645 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 646 break; 647 case GL_LUMINANCE16I_EXT: 648 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT16); 649 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 650 break; 651 case GL_LUMINANCE32I_EXT: 652 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT32); 653 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 654 break; 655 case GL_LUMINANCE_ALPHA8UI_EXT: 656 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT8); 657 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 658 break; 659 case GL_LUMINANCE_ALPHA16UI_EXT: 660 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT16); 661 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 662 break; 663 case GL_LUMINANCE_ALPHA32UI_EXT: 664 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT32); 665 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 666 break; 667 case GL_LUMINANCE_ALPHA8I_EXT: 668 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT8); 669 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 670 break; 671 case GL_LUMINANCE_ALPHA16I_EXT: 672 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT16); 673 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 674 break; 675 case GL_LUMINANCE_ALPHA32I_EXT: 676 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT32); 677 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 678 break; 679 case GL_INTENSITY8UI_EXT: 680 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT8); 681 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 682 break; 683 case GL_INTENSITY16UI_EXT: 684 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT16); 685 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 686 break; 687 case GL_INTENSITY32UI_EXT: 688 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT32); 689 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 690 break; 691 case GL_INTENSITY8I_EXT: 692 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT8); 693 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 694 break; 695 case GL_INTENSITY16I_EXT: 696 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT16); 697 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 698 break; 699 case GL_INTENSITY32I_EXT: 700 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT32); 701 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 702 break; 703 case GL_RGB8UI_EXT: 704 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8); 705 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 706 break; 707 case GL_RGB16UI_EXT: 708 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16); 709 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 710 break; 711 case GL_RGB32UI_EXT: 712 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32); 713 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 714 break; 715 case GL_RGB8I_EXT: 716 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT8); 717 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 718 break; 719 case GL_RGB16I_EXT: 720 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT16); 721 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 722 break; 723 case GL_RGB32I_EXT: 724 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT32); 725 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 726 break; 727 case GL_RGBA8UI_EXT: 728 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 729 break; 730 case GL_RGBA16UI_EXT: 731 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 732 break; 733 case GL_RGBA32UI_EXT: 734 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 735 break; 736 case GL_RGBA8I_EXT: 737 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 738 break; 739 case GL_RGBA16I_EXT: 740 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 741 break; 742 case GL_RGBA32I_EXT: 743 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 744 break; 745 } 746 } 747 748 if (ctx->Extensions.ARB_texture_rg) { 749 switch (internalFormat) { 750 case GL_R8: 751 case GL_RED: 752 RETURN_IF_SUPPORTED(MESA_FORMAT_R8); 753 break; 754 755 case GL_COMPRESSED_RED: 756 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1); 757 RETURN_IF_SUPPORTED(MESA_FORMAT_R8); 758 break; 759 760 case GL_R16: 761 RETURN_IF_SUPPORTED(MESA_FORMAT_R16); 762 break; 763 764 case GL_RG: 765 case GL_RG8: 766 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88); 767 break; 768 769 case GL_COMPRESSED_RG: 770 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2); 771 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88); 772 break; 773 774 case GL_RG16: 775 RETURN_IF_SUPPORTED(MESA_FORMAT_RG1616); 776 break; 777 778 default: 779 ; /* fallthrough */ 780 } 781 } 782 783 if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.ARB_texture_float) { 784 switch (internalFormat) { 785 case GL_R16F: 786 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16); 787 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32); 788 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 789 break; 790 case GL_R32F: 791 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32); 792 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 793 break; 794 case GL_RG16F: 795 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16); 796 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 797 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 798 break; 799 case GL_RG32F: 800 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 801 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 802 break; 803 804 default: 805 ; /* fallthrough */ 806 } 807 } 808 809 if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.EXT_texture_integer) { 810 switch (internalFormat) { 811 case GL_R8UI: 812 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8); 813 break; 814 case GL_RG8UI: 815 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8); 816 break; 817 case GL_R16UI: 818 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16); 819 break; 820 case GL_RG16UI: 821 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16); 822 break; 823 case GL_R32UI: 824 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32); 825 break; 826 case GL_RG32UI: 827 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32); 828 break; 829 case GL_R8I: 830 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT8); 831 break; 832 case GL_RG8I: 833 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT8); 834 break; 835 case GL_R16I: 836 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT16); 837 break; 838 case GL_RG16I: 839 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT16); 840 break; 841 case GL_R32I: 842 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT32); 843 break; 844 case GL_RG32I: 845 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT32); 846 break; 847 default: 848 break; 849 } 850 } 851 852 if (ctx->Extensions.ARB_texture_rgb10_a2ui) { 853 switch (internalFormat) { 854 case GL_RGB10_A2UI: 855 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010_UINT); 856 break; 857 default: 858 break; 859 } 860 } 861 /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0). 862 */ 863 if (ctx->API != API_OPENGL) { 864 switch (internalFormat) { 865 case GL_BGRA: 866 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 867 break; 868 869 default: 870 ; /* fallthrough */ 871 } 872 } 873 874 if (ctx->Extensions.ARB_texture_compression_rgtc) { 875 switch (internalFormat) { 876 case GL_COMPRESSED_RED_RGTC1: 877 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1); 878 break; 879 case GL_COMPRESSED_SIGNED_RED_RGTC1: 880 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RED_RGTC1); 881 break; 882 case GL_COMPRESSED_RG_RGTC2: 883 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2); 884 break; 885 case GL_COMPRESSED_SIGNED_RG_RGTC2: 886 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_RGTC2); 887 break; 888 default: 889 ; /* fallthrough */ 890 } 891 } 892 893 if (ctx->Extensions.EXT_texture_compression_latc) { 894 switch (internalFormat) { 895 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 896 RETURN_IF_SUPPORTED(MESA_FORMAT_L_LATC1); 897 break; 898 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 899 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L_LATC1); 900 break; 901 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 902 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2); 903 break; 904 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 905 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_LA_LATC2); 906 break; 907 default: 908 ; /* fallthrough */ 909 } 910 } 911 912 if (ctx->Extensions.ATI_texture_compression_3dc) { 913 switch (internalFormat) { 914 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 915 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2); 916 break; 917 default: 918 ; /* fallthrough */ 919 } 920 } 921 922 _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()", 923 _mesa_lookup_enum_by_nr(internalFormat)); 924 return MESA_FORMAT_NONE; 925} 926 927