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