texformat.c revision b188467fdf71d8f4c5fab4aafae1253f64d9aab4
1/* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5 * Copyright (c) 2008-2009 VMware, Inc. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included 15 * in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 * 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 "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 target a texture target (GL_TEXTURE_x) 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 the closest gl_format for the given format/type arguments 58 * 59 * This is called via dd_function_table::ChooseTextureFormat. Hardware 60 * drivers may override this function with a specialized version. 61 */ 62gl_format 63_mesa_choose_tex_format(struct gl_context *ctx, GLenum target, 64 GLint internalFormat, GLenum format, GLenum type) 65{ 66 (void) format; 67 68 switch (internalFormat) { 69 /* shallow RGBA formats */ 70 case 4: 71 case GL_RGBA: 72 if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) { 73 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444); 74 } else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) { 75 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555); 76 } else if (type == GL_UNSIGNED_INT_2_10_10_10_REV) { 77 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010); 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 if (type == GL_UNSIGNED_INT_2_10_10_10_REV) { 115 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010); 116 } 117 /* fallthrough */ 118 case GL_RGB8: 119 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888); 120 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 121 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 122 break; 123 case GL_R3_G3_B2: 124 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332); 125 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565); 126 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); 127 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888); 128 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 129 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 130 break; 131 case GL_RGB4: 132 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); /* just to test another format */ 133 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565); 134 break; 135 case GL_RGB5: 136 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565); 137 break; 138 139 /* deep RGB formats */ 140 case GL_RGB10: 141 case GL_RGB12: 142 case GL_RGB16: 143 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_UNORM); 144 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16); 145 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 146 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 147 break; 148 149 /* Alpha formats */ 150 case GL_ALPHA: 151 case GL_ALPHA4: 152 case GL_ALPHA8: 153 RETURN_IF_SUPPORTED(MESA_FORMAT_A8); 154 break; 155 156 case GL_ALPHA12: 157 case GL_ALPHA16: 158 RETURN_IF_SUPPORTED(MESA_FORMAT_A16); 159 RETURN_IF_SUPPORTED(MESA_FORMAT_A8); 160 break; 161 162 /* Luminance formats */ 163 case 1: 164 case GL_LUMINANCE: 165 case GL_LUMINANCE4: 166 case GL_LUMINANCE8: 167 RETURN_IF_SUPPORTED(MESA_FORMAT_L8); 168 break; 169 170 case GL_LUMINANCE12: 171 case GL_LUMINANCE16: 172 RETURN_IF_SUPPORTED(MESA_FORMAT_L16); 173 RETURN_IF_SUPPORTED(MESA_FORMAT_L8); 174 break; 175 176 /* Luminance/Alpha formats */ 177 case GL_LUMINANCE4_ALPHA4: 178 RETURN_IF_SUPPORTED(MESA_FORMAT_AL44); 179 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 180 break; 181 182 case 2: 183 case GL_LUMINANCE_ALPHA: 184 case GL_LUMINANCE6_ALPHA2: 185 case GL_LUMINANCE8_ALPHA8: 186 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 187 break; 188 189 case GL_LUMINANCE12_ALPHA4: 190 case GL_LUMINANCE12_ALPHA12: 191 case GL_LUMINANCE16_ALPHA16: 192 RETURN_IF_SUPPORTED(MESA_FORMAT_AL1616); 193 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 194 break; 195 196 case GL_INTENSITY: 197 case GL_INTENSITY4: 198 case GL_INTENSITY8: 199 RETURN_IF_SUPPORTED(MESA_FORMAT_I8); 200 break; 201 202 case GL_INTENSITY12: 203 case GL_INTENSITY16: 204 RETURN_IF_SUPPORTED(MESA_FORMAT_I16); 205 RETURN_IF_SUPPORTED(MESA_FORMAT_I8); 206 break; 207 208 case GL_DEPTH_COMPONENT: 209 case GL_DEPTH_COMPONENT24: 210 case GL_DEPTH_COMPONENT32: 211 RETURN_IF_SUPPORTED(MESA_FORMAT_Z32); 212 RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24); 213 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); 214 break; 215 case GL_DEPTH_COMPONENT16: 216 RETURN_IF_SUPPORTED(MESA_FORMAT_Z16); 217 RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24); 218 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); 219 break; 220 221 case GL_COMPRESSED_ALPHA_ARB: 222 RETURN_IF_SUPPORTED(MESA_FORMAT_A8); 223 break; 224 case GL_COMPRESSED_LUMINANCE_ARB: 225 RETURN_IF_SUPPORTED(MESA_FORMAT_L8); 226 break; 227 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: 228 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88); 229 break; 230 case GL_COMPRESSED_INTENSITY_ARB: 231 RETURN_IF_SUPPORTED(MESA_FORMAT_I8); 232 break; 233 case GL_COMPRESSED_RGB_ARB: 234 /* We don't use texture compression for 1D and 1D array textures. 235 * For 1D textures, compressions doesn't buy us much. 236 * For 1D ARRAY textures, there's complicated issues with updating 237 * sub-regions on non-block boundaries with glCopyTexSubImage, among 238 * other issues. FWIW, the GL_EXT_texture_array extension prohibits 239 * 1D ARRAY textures in S3TC format. 240 */ 241 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) { 242 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1); 243 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1); 244 } 245 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888); 246 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888); 247 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 248 break; 249 case GL_COMPRESSED_RGBA_ARB: 250 /* We don't use texture compression for 1D and 1D array textures. */ 251 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) { 252 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */ 253 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1); 254 } 255 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888); 256 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 257 break; 258 259 case GL_RGB565: 260 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565); 261 break; 262 263 case GL_YCBCR_MESA: 264 if (type == GL_UNSIGNED_SHORT_8_8_MESA) 265 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR); 266 else 267 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV); 268 break; 269 270 /* For non-generic compressed format we assert two things: 271 * 272 * 1. The format has already been validated against the set of available 273 * extensions. 274 * 275 * 2. The driver only enables the extension if it supports all of the 276 * formats that are part of that extension. 277 */ 278 case GL_COMPRESSED_RGB_FXT1_3DFX: 279 return MESA_FORMAT_RGB_FXT1; 280 case GL_COMPRESSED_RGBA_FXT1_3DFX: 281 return MESA_FORMAT_RGBA_FXT1; 282 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 283 case GL_RGB_S3TC: 284 case GL_RGB4_S3TC: 285 return MESA_FORMAT_RGB_DXT1; 286 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 287 return MESA_FORMAT_RGBA_DXT1; 288 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 289 case GL_RGBA_S3TC: 290 case GL_RGBA4_S3TC: 291 return MESA_FORMAT_RGBA_DXT3; 292 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 293 return MESA_FORMAT_RGBA_DXT5; 294 case GL_COMPRESSED_RED_RGTC1: 295 return MESA_FORMAT_RED_RGTC1; 296 case GL_COMPRESSED_SIGNED_RED_RGTC1: 297 return MESA_FORMAT_SIGNED_RED_RGTC1; 298 case GL_COMPRESSED_RG_RGTC2: 299 return MESA_FORMAT_RG_RGTC2; 300 case GL_COMPRESSED_SIGNED_RG_RGTC2: 301 return MESA_FORMAT_SIGNED_RG_RGTC2; 302 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 303 return MESA_FORMAT_L_LATC1; 304 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 305 return MESA_FORMAT_SIGNED_L_LATC1; 306 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 307 return MESA_FORMAT_LA_LATC2; 308 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 309 return MESA_FORMAT_SIGNED_LA_LATC2; 310 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 311 return MESA_FORMAT_LA_LATC2; 312 case GL_ETC1_RGB8_OES: 313 return MESA_FORMAT_ETC1_RGB8; 314 case GL_COMPRESSED_RGB8_ETC2: 315 return MESA_FORMAT_ETC2_RGB8; 316 case GL_COMPRESSED_SRGB8_ETC2: 317 return MESA_FORMAT_ETC2_SRGB8; 318 case GL_COMPRESSED_RGBA8_ETC2_EAC: 319 return MESA_FORMAT_ETC2_RGBA8_EAC; 320 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 321 return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC; 322 case GL_COMPRESSED_R11_EAC: 323 return MESA_FORMAT_ETC2_R11_EAC; 324 case GL_COMPRESSED_RG11_EAC: 325 return MESA_FORMAT_ETC2_RG11_EAC; 326 case GL_COMPRESSED_SIGNED_R11_EAC: 327 return MESA_FORMAT_ETC2_SIGNED_R11_EAC; 328 case GL_COMPRESSED_SIGNED_RG11_EAC: 329 return MESA_FORMAT_ETC2_SIGNED_RG11_EAC; 330 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 331 return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1; 332 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 333 return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1; 334 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 335 return MESA_FORMAT_SRGB_DXT1; 336 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 337 return MESA_FORMAT_SRGBA_DXT1; 338 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 339 return MESA_FORMAT_SRGBA_DXT3; 340 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 341 return MESA_FORMAT_SRGBA_DXT5; 342 343 case GL_ALPHA16F_ARB: 344 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16); 345 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32); 346 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 347 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 348 break; 349 case GL_ALPHA32F_ARB: 350 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32); 351 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 352 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16); 353 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 354 break; 355 case GL_LUMINANCE16F_ARB: 356 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16); 357 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32); 358 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 359 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 360 break; 361 case GL_LUMINANCE32F_ARB: 362 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32); 363 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 364 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16); 365 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 366 break; 367 case GL_LUMINANCE_ALPHA16F_ARB: 368 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16); 369 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32); 370 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 371 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 372 break; 373 case GL_LUMINANCE_ALPHA32F_ARB: 374 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32); 375 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 376 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16); 377 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 378 break; 379 case GL_INTENSITY16F_ARB: 380 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16); 381 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32); 382 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 383 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 384 break; 385 case GL_INTENSITY32F_ARB: 386 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32); 387 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 388 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16); 389 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 390 break; 391 case GL_RGB16F_ARB: 392 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16); 393 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_FLOAT); 394 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 395 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32); 396 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 397 break; 398 case GL_RGB32F_ARB: 399 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32); 400 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR32323232_FLOAT); 401 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 402 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16); 403 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 404 break; 405 case GL_RGBA16F_ARB: 406 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 407 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 408 break; 409 case GL_RGBA32F_ARB: 410 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 411 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 412 break; 413 414 case GL_RGB9_E5: 415 /* GL_EXT_texture_shared_exponent -- just one format to support */ 416 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]); 417 return MESA_FORMAT_RGB9_E5_FLOAT; 418 419 case GL_R11F_G11F_B10F: 420 /* GL_EXT_texture_packed_float -- just one format to support */ 421 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11_G11_B10_FLOAT]); 422 return MESA_FORMAT_R11_G11_B10_FLOAT; 423 424 case GL_DEPTH_STENCIL_EXT: 425 case GL_DEPTH24_STENCIL8_EXT: 426 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8); 427 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24); 428 break; 429 430 case GL_DEPTH_COMPONENT32F: 431 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT]); 432 return MESA_FORMAT_Z32_FLOAT; 433 case GL_DEPTH32F_STENCIL8: 434 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8]); 435 return MESA_FORMAT_Z32_FLOAT_X24S8; 436 437 case GL_DUDV_ATI: 438 case GL_DU8DV8_ATI: 439 RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8); 440 break; 441 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 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_SNORM); 493 /* FALLTHROUGH */ 494 case GL_RGBA16_SNORM: 495 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 496 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 497 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 498 break; 499 case GL_ALPHA16_SNORM: 500 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16); 501 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 502 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 503 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 504 break; 505 case GL_LUMINANCE16_SNORM: 506 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16); 507 /* FALLTHROUGH */ 508 case GL_LUMINANCE16_ALPHA16_SNORM: 509 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616); 510 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 511 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 512 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 513 break; 514 case GL_INTENSITY16_SNORM: 515 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16); 516 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16); 517 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888); 518 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV); 519 break; 520 521 case GL_SRGB_EXT: 522 case GL_SRGB8_EXT: 523 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8); 524 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 525 break; 526 case GL_SRGB_ALPHA_EXT: 527 case GL_SRGB8_ALPHA8_EXT: 528 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8); 529 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 530 break; 531 case GL_SLUMINANCE_EXT: 532 case GL_SLUMINANCE8_EXT: 533 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8); 534 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 535 break; 536 case GL_SLUMINANCE_ALPHA_EXT: 537 case GL_SLUMINANCE8_ALPHA8_EXT: 538 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8); 539 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 540 break; 541 case GL_COMPRESSED_SLUMINANCE_EXT: 542 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8); 543 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 544 break; 545 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 546 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8); 547 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 548 break; 549 case GL_COMPRESSED_SRGB_EXT: 550 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1); 551 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8); 552 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 553 break; 554 case GL_COMPRESSED_SRGB_ALPHA_EXT: 555 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */ 556 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8); 557 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8); 558 break; 559 560 case GL_ALPHA8UI_EXT: 561 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT8); 562 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 563 break; 564 case GL_ALPHA16UI_EXT: 565 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT16); 566 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 567 break; 568 case GL_ALPHA32UI_EXT: 569 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT32); 570 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 571 break; 572 case GL_ALPHA8I_EXT: 573 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT8); 574 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 575 break; 576 case GL_ALPHA16I_EXT: 577 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT16); 578 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 579 break; 580 case GL_ALPHA32I_EXT: 581 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT32); 582 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 583 break; 584 case GL_LUMINANCE8UI_EXT: 585 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT8); 586 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 587 break; 588 case GL_LUMINANCE16UI_EXT: 589 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT16); 590 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 591 break; 592 case GL_LUMINANCE32UI_EXT: 593 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT32); 594 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 595 break; 596 case GL_LUMINANCE8I_EXT: 597 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT8); 598 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 599 break; 600 case GL_LUMINANCE16I_EXT: 601 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT16); 602 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 603 break; 604 case GL_LUMINANCE32I_EXT: 605 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT32); 606 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 607 break; 608 case GL_LUMINANCE_ALPHA8UI_EXT: 609 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT8); 610 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 611 break; 612 case GL_LUMINANCE_ALPHA16UI_EXT: 613 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT16); 614 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 615 break; 616 case GL_LUMINANCE_ALPHA32UI_EXT: 617 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT32); 618 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 619 break; 620 case GL_LUMINANCE_ALPHA8I_EXT: 621 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT8); 622 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 623 break; 624 case GL_LUMINANCE_ALPHA16I_EXT: 625 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT16); 626 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 627 break; 628 case GL_LUMINANCE_ALPHA32I_EXT: 629 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT32); 630 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 631 break; 632 case GL_INTENSITY8UI_EXT: 633 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT8); 634 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 635 break; 636 case GL_INTENSITY16UI_EXT: 637 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT16); 638 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 639 break; 640 case GL_INTENSITY32UI_EXT: 641 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT32); 642 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 643 break; 644 case GL_INTENSITY8I_EXT: 645 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT8); 646 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 647 break; 648 case GL_INTENSITY16I_EXT: 649 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT16); 650 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 651 break; 652 case GL_INTENSITY32I_EXT: 653 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT32); 654 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 655 break; 656 657 case GL_RGB8UI_EXT: 658 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8); 659 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR8888_UINT); 660 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 661 break; 662 case GL_RGB16UI_EXT: 663 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16); 664 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_UINT); 665 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 666 break; 667 case GL_RGB32UI_EXT: 668 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32); 669 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR32323232_UINT); 670 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 671 break; 672 case GL_RGB8I_EXT: 673 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT8); 674 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR8888_SINT); 675 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 676 break; 677 case GL_RGB16I_EXT: 678 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT16); 679 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_SINT); 680 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 681 break; 682 case GL_RGB32I_EXT: 683 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT32); 684 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR32323232_SINT); 685 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 686 break; 687 case GL_RGBA8UI_EXT: 688 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 689 break; 690 case GL_RGBA16UI_EXT: 691 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 692 break; 693 case GL_RGBA32UI_EXT: 694 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 695 break; 696 case GL_RGBA8I_EXT: 697 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8); 698 break; 699 case GL_RGBA16I_EXT: 700 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16); 701 break; 702 case GL_RGBA32I_EXT: 703 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32); 704 break; 705 706 case GL_R8: 707 case GL_RED: 708 RETURN_IF_SUPPORTED(MESA_FORMAT_R8); 709 break; 710 711 case GL_COMPRESSED_RED: 712 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) 713 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1); 714 RETURN_IF_SUPPORTED(MESA_FORMAT_R8); 715 break; 716 717 case GL_R16: 718 RETURN_IF_SUPPORTED(MESA_FORMAT_R16); 719 break; 720 721 case GL_RG: 722 case GL_RG8: 723 RETURN_IF_SUPPORTED(MESA_FORMAT_GR88); 724 break; 725 726 case GL_COMPRESSED_RG: 727 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) 728 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2); 729 RETURN_IF_SUPPORTED(MESA_FORMAT_GR88); 730 break; 731 732 case GL_RG16: 733 RETURN_IF_SUPPORTED(MESA_FORMAT_GR1616); 734 break; 735 736 case GL_R16F: 737 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16); 738 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16); 739 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32); 740 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 741 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 742 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 743 break; 744 case GL_R32F: 745 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32); 746 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 747 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 748 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16); 749 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16); 750 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 751 break; 752 case GL_RG16F: 753 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16); 754 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 755 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 756 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 757 break; 758 case GL_RG32F: 759 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 760 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 761 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16); 762 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 763 break; 764 765 case GL_R8UI: 766 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8); 767 break; 768 case GL_RG8UI: 769 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8); 770 break; 771 case GL_R16UI: 772 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16); 773 break; 774 case GL_RG16UI: 775 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16); 776 break; 777 case GL_R32UI: 778 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32); 779 break; 780 case GL_RG32UI: 781 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32); 782 break; 783 case GL_R8I: 784 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT8); 785 break; 786 case GL_RG8I: 787 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT8); 788 break; 789 case GL_R16I: 790 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT16); 791 break; 792 case GL_RG16I: 793 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT16); 794 break; 795 case GL_R32I: 796 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT32); 797 break; 798 case GL_RG32I: 799 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT32); 800 break; 801 802 case GL_RGB10_A2UI: 803 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010_UINT); 804 RETURN_IF_SUPPORTED(MESA_FORMAT_ABGR2101010_UINT); 805 break; 806 807 case GL_BGRA: 808 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888); 809 break; 810 } 811 812 _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()", 813 _mesa_lookup_enum_by_nr(internalFormat)); 814 return MESA_FORMAT_NONE; 815} 816 817GLboolean 818_mesa_tex_target_is_array(GLenum target) 819{ 820 switch (target) { 821 case GL_TEXTURE_1D_ARRAY_EXT: 822 case GL_TEXTURE_2D_ARRAY_EXT: 823 case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 824 case GL_TEXTURE_CUBE_MAP_ARRAY: 825 return GL_TRUE; 826 default: 827 return GL_FALSE; 828 } 829} 830