texformat.c revision 4000c0112a49c28793844f454278b50e00943173
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 mesa_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 */ 62mesa_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_B4G4R4A4_UNORM); 74 } else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) { 75 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G5R5A1_UNORM); 76 } else if (type == GL_UNSIGNED_INT_2_10_10_10_REV) { 77 RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM); 78 } 79 /* fallthrough */ 80 81 case GL_RGBA8: 82 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_UNORM); 83 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM); 84 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM); 85 break; 86 case GL_RGB5_A1: 87 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G5R5A1_UNORM); 88 break; 89 case GL_RGBA2: 90 RETURN_IF_SUPPORTED(MESA_FORMAT_A4R4G4B4_UNORM); /* just to test another format*/ 91 RETURN_IF_SUPPORTED(MESA_FORMAT_B4G4R4A4_UNORM); 92 break; 93 case GL_RGBA4: 94 RETURN_IF_SUPPORTED(MESA_FORMAT_B4G4R4A4_UNORM); 95 break; 96 97 /* deep RGBA formats */ 98 case GL_RGB10_A2: 99 RETURN_IF_SUPPORTED(MESA_FORMAT_R10G10B10A2_UNORM); 100 RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM); 101 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM); 102 break; 103 case GL_RGBA12: 104 case GL_RGBA16: 105 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UNORM16); 106 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UNORM16); 107 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM); 108 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM); 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_B10G10R10A2_UNORM); 116 } 117 /* fallthrough */ 118 case GL_RGB8: 119 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UNORM8); 120 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_UNORM); 121 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_UNORM); 122 123 RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8); 124 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM); 125 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM); 126 break; 127 case GL_R3_G3_B2: 128 RETURN_IF_SUPPORTED(MESA_FORMAT_B2G3R3_UNORM); 129 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM); 130 RETURN_IF_SUPPORTED(MESA_FORMAT_R5G6B5_UNORM); 131 RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8); 132 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM); 133 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM); 134 break; 135 case GL_RGB4: 136 RETURN_IF_SUPPORTED(MESA_FORMAT_R5G6B5_UNORM); /* just to test another format */ 137 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM); 138 break; 139 case GL_RGB5: 140 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM); 141 break; 142 143 /* deep RGB formats */ 144 case GL_RGB10: 145 case GL_RGB12: 146 case GL_RGB16: 147 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UNORM16); 148 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UNORM16); 149 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM); 150 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM); 151 break; 152 153 /* Alpha formats */ 154 case GL_ALPHA: 155 case GL_ALPHA4: 156 case GL_ALPHA8: 157 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM8); 158 break; 159 160 case GL_ALPHA12: 161 case GL_ALPHA16: 162 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM16); 163 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM8); 164 break; 165 166 /* Luminance formats */ 167 case 1: 168 case GL_LUMINANCE: 169 case GL_LUMINANCE4: 170 case GL_LUMINANCE8: 171 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM8); 172 break; 173 174 case GL_LUMINANCE12: 175 case GL_LUMINANCE16: 176 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM16); 177 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM8); 178 break; 179 180 /* Luminance/Alpha formats */ 181 case GL_LUMINANCE4_ALPHA4: 182 RETURN_IF_SUPPORTED(MESA_FORMAT_L4A4_UNORM); 183 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM); 184 break; 185 186 case 2: 187 case GL_LUMINANCE_ALPHA: 188 case GL_LUMINANCE6_ALPHA2: 189 case GL_LUMINANCE8_ALPHA8: 190 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM); 191 break; 192 193 case GL_LUMINANCE12_ALPHA4: 194 case GL_LUMINANCE12_ALPHA12: 195 case GL_LUMINANCE16_ALPHA16: 196 RETURN_IF_SUPPORTED(MESA_FORMAT_L16A16_UNORM); 197 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM); 198 break; 199 200 case GL_INTENSITY: 201 case GL_INTENSITY4: 202 case GL_INTENSITY8: 203 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM8); 204 break; 205 206 case GL_INTENSITY12: 207 case GL_INTENSITY16: 208 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM16); 209 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM8); 210 break; 211 212 case GL_DEPTH_COMPONENT: 213 case GL_DEPTH_COMPONENT24: 214 case GL_DEPTH_COMPONENT32: 215 RETURN_IF_SUPPORTED(MESA_FORMAT_Z_UNORM32); 216 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_X8_UINT); 217 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_S8_UINT); 218 break; 219 case GL_DEPTH_COMPONENT16: 220 RETURN_IF_SUPPORTED(MESA_FORMAT_Z_UNORM16); 221 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_X8_UINT); 222 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_S8_UINT); 223 break; 224 225 case GL_COMPRESSED_ALPHA_ARB: 226 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM8); 227 break; 228 case GL_COMPRESSED_LUMINANCE_ARB: 229 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM8); 230 break; 231 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: 232 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM); 233 break; 234 case GL_COMPRESSED_INTENSITY_ARB: 235 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM8); 236 break; 237 case GL_COMPRESSED_RGB_ARB: 238 /* We don't use texture compression for 1D and 1D array textures. 239 * For 1D textures, compressions doesn't buy us much. 240 * For 1D ARRAY textures, there's complicated issues with updating 241 * sub-regions on non-block boundaries with glCopyTexSubImage, among 242 * other issues. FWIW, the GL_EXT_texture_array extension prohibits 243 * 1D ARRAY textures in S3TC format. 244 */ 245 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) { 246 if (ctx->Mesa_DXTn) 247 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1); 248 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1); 249 } 250 RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8); 251 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM); 252 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM); 253 break; 254 case GL_COMPRESSED_RGBA_ARB: 255 /* We don't use texture compression for 1D and 1D array textures. */ 256 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) { 257 if (ctx->Mesa_DXTn) 258 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */ 259 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1); 260 } 261 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM); 262 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM); 263 break; 264 265 case GL_RGB565: 266 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM); 267 break; 268 269 case GL_YCBCR_MESA: 270 if (type == GL_UNSIGNED_SHORT_8_8_MESA) 271 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR); 272 else 273 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV); 274 break; 275 276 /* For non-generic compressed format we assert two things: 277 * 278 * 1. The format has already been validated against the set of available 279 * extensions. 280 * 281 * 2. The driver only enables the extension if it supports all of the 282 * formats that are part of that extension. 283 */ 284 case GL_COMPRESSED_RGB_FXT1_3DFX: 285 return MESA_FORMAT_RGB_FXT1; 286 case GL_COMPRESSED_RGBA_FXT1_3DFX: 287 return MESA_FORMAT_RGBA_FXT1; 288 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 289 case GL_RGB_S3TC: 290 case GL_RGB4_S3TC: 291 return MESA_FORMAT_RGB_DXT1; 292 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 293 return MESA_FORMAT_RGBA_DXT1; 294 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 295 case GL_RGBA_S3TC: 296 case GL_RGBA4_S3TC: 297 return MESA_FORMAT_RGBA_DXT3; 298 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 299 return MESA_FORMAT_RGBA_DXT5; 300 case GL_COMPRESSED_RED_RGTC1: 301 return MESA_FORMAT_R_RGTC1_UNORM; 302 case GL_COMPRESSED_SIGNED_RED_RGTC1: 303 return MESA_FORMAT_R_RGTC1_SNORM; 304 case GL_COMPRESSED_RG_RGTC2: 305 return MESA_FORMAT_RG_RGTC2_UNORM; 306 case GL_COMPRESSED_SIGNED_RG_RGTC2: 307 return MESA_FORMAT_RG_RGTC2_SNORM; 308 case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 309 return MESA_FORMAT_L_LATC1_UNORM; 310 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 311 return MESA_FORMAT_L_LATC1_SNORM; 312 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 313 return MESA_FORMAT_LA_LATC2_UNORM; 314 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 315 return MESA_FORMAT_LA_LATC2_SNORM; 316 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 317 return MESA_FORMAT_LA_LATC2_UNORM; 318 case GL_ETC1_RGB8_OES: 319 return MESA_FORMAT_ETC1_RGB8; 320 case GL_COMPRESSED_RGB8_ETC2: 321 return MESA_FORMAT_ETC2_RGB8; 322 case GL_COMPRESSED_SRGB8_ETC2: 323 return MESA_FORMAT_ETC2_SRGB8; 324 case GL_COMPRESSED_RGBA8_ETC2_EAC: 325 return MESA_FORMAT_ETC2_RGBA8_EAC; 326 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: 327 return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC; 328 case GL_COMPRESSED_R11_EAC: 329 return MESA_FORMAT_ETC2_R11_EAC; 330 case GL_COMPRESSED_RG11_EAC: 331 return MESA_FORMAT_ETC2_RG11_EAC; 332 case GL_COMPRESSED_SIGNED_R11_EAC: 333 return MESA_FORMAT_ETC2_SIGNED_R11_EAC; 334 case GL_COMPRESSED_SIGNED_RG11_EAC: 335 return MESA_FORMAT_ETC2_SIGNED_RG11_EAC; 336 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: 337 return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1; 338 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: 339 return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1; 340 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 341 return MESA_FORMAT_SRGB_DXT1; 342 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 343 return MESA_FORMAT_SRGBA_DXT1; 344 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 345 return MESA_FORMAT_SRGBA_DXT3; 346 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 347 return MESA_FORMAT_SRGBA_DXT5; 348 349 case GL_ALPHA16F_ARB: 350 RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT16); 351 RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT32); 352 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 353 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 354 break; 355 case GL_ALPHA32F_ARB: 356 RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT32); 357 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 358 RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT16); 359 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 360 break; 361 case GL_LUMINANCE16F_ARB: 362 RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT16); 363 RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT32); 364 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 365 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 366 break; 367 case GL_LUMINANCE32F_ARB: 368 RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT32); 369 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 370 RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT16); 371 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 372 break; 373 case GL_LUMINANCE_ALPHA16F_ARB: 374 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT16); 375 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT32); 376 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 377 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 378 break; 379 case GL_LUMINANCE_ALPHA32F_ARB: 380 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT32); 381 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 382 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT16); 383 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 384 break; 385 case GL_INTENSITY16F_ARB: 386 RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT16); 387 RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT32); 388 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 389 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 390 break; 391 case GL_INTENSITY32F_ARB: 392 RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT32); 393 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 394 RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT16); 395 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 396 break; 397 case GL_RGB16F_ARB: 398 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16); 399 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_FLOAT16); 400 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 401 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32); 402 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 403 break; 404 case GL_RGB32F_ARB: 405 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32); 406 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_FLOAT32); 407 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 408 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16); 409 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 410 break; 411 case GL_RGBA16F_ARB: 412 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 413 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 414 break; 415 case GL_RGBA32F_ARB: 416 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 417 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 418 break; 419 420 case GL_RGB9_E5: 421 /* GL_EXT_texture_shared_exponent -- just one format to support */ 422 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R9G9B9E5_FLOAT]); 423 return MESA_FORMAT_R9G9B9E5_FLOAT; 424 425 case GL_R11F_G11F_B10F: 426 /* GL_EXT_texture_packed_float -- just one format to support */ 427 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11G11B10_FLOAT]); 428 return MESA_FORMAT_R11G11B10_FLOAT; 429 430 case GL_DEPTH_STENCIL_EXT: 431 case GL_DEPTH24_STENCIL8_EXT: 432 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_UINT_Z24_UNORM); 433 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_S8_UINT); 434 break; 435 436 case GL_DEPTH_COMPONENT32F: 437 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z_FLOAT32]); 438 return MESA_FORMAT_Z_FLOAT32; 439 case GL_DEPTH32F_STENCIL8: 440 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_S8X24_UINT]); 441 return MESA_FORMAT_Z32_FLOAT_S8X24_UINT; 442 443 case GL_RED_SNORM: 444 case GL_R8_SNORM: 445 RETURN_IF_SUPPORTED(MESA_FORMAT_R_SNORM8); 446 break; 447 case GL_RG_SNORM: 448 case GL_RG8_SNORM: 449 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8_SNORM); 450 break; 451 case GL_RGB_SNORM: 452 case GL_RGB8_SNORM: 453 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_SNORM); 454 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM); 455 RETURN_IF_SUPPORTED(MESA_FORMAT_X8B8G8R8_SNORM); 456 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM); 457 break; 458 case GL_RGBA_SNORM: 459 case GL_RGBA8_SNORM: 460 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM); 461 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM); 462 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM); 463 break; 464 case GL_ALPHA_SNORM: 465 case GL_ALPHA8_SNORM: 466 RETURN_IF_SUPPORTED(MESA_FORMAT_A_SNORM8); 467 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM); 468 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM); 469 break; 470 case GL_LUMINANCE_SNORM: 471 case GL_LUMINANCE8_SNORM: 472 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SNORM8); 473 RETURN_IF_SUPPORTED(MESA_FORMAT_X8B8G8R8_SNORM); 474 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM); 475 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM); 476 break; 477 case GL_LUMINANCE_ALPHA_SNORM: 478 case GL_LUMINANCE8_ALPHA8_SNORM: 479 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_SNORM); 480 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM); 481 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM); 482 break; 483 case GL_INTENSITY_SNORM: 484 case GL_INTENSITY8_SNORM: 485 RETURN_IF_SUPPORTED(MESA_FORMAT_I_SNORM8); 486 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM); 487 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM); 488 break; 489 case GL_R16_SNORM: 490 RETURN_IF_SUPPORTED(MESA_FORMAT_R_SNORM16); 491 break; 492 case GL_RG16_SNORM: 493 RETURN_IF_SUPPORTED(MESA_FORMAT_R16G16_SNORM); 494 break; 495 case GL_RGB16_SNORM: 496 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SNORM16); 497 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SNORM16); 498 /* FALLTHROUGH */ 499 case GL_RGBA16_SNORM: 500 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16); 501 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM); 502 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM); 503 break; 504 case GL_ALPHA16_SNORM: 505 RETURN_IF_SUPPORTED(MESA_FORMAT_A_SNORM16); 506 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16); 507 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM); 508 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM); 509 break; 510 case GL_LUMINANCE16_SNORM: 511 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SNORM16); 512 /* FALLTHROUGH */ 513 case GL_LUMINANCE16_ALPHA16_SNORM: 514 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SNORM16); 515 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16); 516 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM); 517 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM); 518 break; 519 case GL_INTENSITY16_SNORM: 520 RETURN_IF_SUPPORTED(MESA_FORMAT_I_SNORM16); 521 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16); 522 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM); 523 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM); 524 break; 525 526 case GL_SRGB_EXT: 527 case GL_SRGB8_EXT: 528 /* there is no MESA_FORMAT_RGB_SRGB8 */ 529 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_SRGB); 530 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SRGB); 531 532 RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_SRGB8); 533 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB); 534 break; 535 case GL_SRGB_ALPHA_EXT: 536 case GL_SRGB8_ALPHA8_EXT: 537 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SRGB); 538 539 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SRGB); 540 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB); 541 break; 542 case GL_SLUMINANCE_EXT: 543 case GL_SLUMINANCE8_EXT: 544 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SRGB8); 545 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB); 546 break; 547 case GL_SLUMINANCE_ALPHA_EXT: 548 case GL_SLUMINANCE8_ALPHA8_EXT: 549 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_SRGB); 550 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB); 551 break; 552 case GL_COMPRESSED_SLUMINANCE_EXT: 553 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SRGB8); 554 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB); 555 break; 556 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 557 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_SRGB); 558 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB); 559 break; 560 case GL_COMPRESSED_SRGB_EXT: 561 if (ctx->Mesa_DXTn) 562 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1); 563 RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_SRGB8); 564 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB); 565 break; 566 case GL_COMPRESSED_SRGB_ALPHA_EXT: 567 if (ctx->Mesa_DXTn) 568 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */ 569 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SRGB); 570 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB); 571 break; 572 573 case GL_ALPHA8UI_EXT: 574 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UINT8); 575 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 576 break; 577 case GL_ALPHA16UI_EXT: 578 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UINT16); 579 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 580 break; 581 case GL_ALPHA32UI_EXT: 582 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UINT32); 583 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 584 break; 585 case GL_ALPHA8I_EXT: 586 RETURN_IF_SUPPORTED(MESA_FORMAT_A_SINT8); 587 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8); 588 break; 589 case GL_ALPHA16I_EXT: 590 RETURN_IF_SUPPORTED(MESA_FORMAT_A_SINT16); 591 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16); 592 break; 593 case GL_ALPHA32I_EXT: 594 RETURN_IF_SUPPORTED(MESA_FORMAT_A_SINT32); 595 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32); 596 break; 597 case GL_LUMINANCE8UI_EXT: 598 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UINT8); 599 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 600 break; 601 case GL_LUMINANCE16UI_EXT: 602 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UINT16); 603 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 604 break; 605 case GL_LUMINANCE32UI_EXT: 606 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UINT32); 607 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 608 break; 609 case GL_LUMINANCE8I_EXT: 610 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SINT8); 611 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8); 612 break; 613 case GL_LUMINANCE16I_EXT: 614 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SINT16); 615 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16); 616 break; 617 case GL_LUMINANCE32I_EXT: 618 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SINT32); 619 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32); 620 break; 621 case GL_LUMINANCE_ALPHA8UI_EXT: 622 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_UINT8); 623 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 624 break; 625 case GL_LUMINANCE_ALPHA16UI_EXT: 626 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_UINT16); 627 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 628 break; 629 case GL_LUMINANCE_ALPHA32UI_EXT: 630 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_UINT32); 631 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 632 break; 633 case GL_LUMINANCE_ALPHA8I_EXT: 634 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SINT8); 635 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8); 636 break; 637 case GL_LUMINANCE_ALPHA16I_EXT: 638 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SINT16); 639 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16); 640 break; 641 case GL_LUMINANCE_ALPHA32I_EXT: 642 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SINT32); 643 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32); 644 break; 645 case GL_INTENSITY8UI_EXT: 646 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UINT8); 647 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 648 break; 649 case GL_INTENSITY16UI_EXT: 650 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UINT16); 651 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 652 break; 653 case GL_INTENSITY32UI_EXT: 654 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UINT32); 655 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 656 break; 657 case GL_INTENSITY8I_EXT: 658 RETURN_IF_SUPPORTED(MESA_FORMAT_I_SINT8); 659 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8); 660 break; 661 case GL_INTENSITY16I_EXT: 662 RETURN_IF_SUPPORTED(MESA_FORMAT_I_SINT16); 663 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16); 664 break; 665 case GL_INTENSITY32I_EXT: 666 RETURN_IF_SUPPORTED(MESA_FORMAT_I_SINT32); 667 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32); 668 break; 669 670 case GL_RGB8UI_EXT: 671 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8); 672 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UINT8); 673 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 674 break; 675 case GL_RGB16UI_EXT: 676 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16); 677 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UINT16); 678 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 679 break; 680 case GL_RGB32UI_EXT: 681 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32); 682 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UINT32); 683 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 684 break; 685 case GL_RGB8I_EXT: 686 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SINT8); 687 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SINT8); 688 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8); 689 break; 690 case GL_RGB16I_EXT: 691 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SINT16); 692 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SINT16); 693 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16); 694 break; 695 case GL_RGB32I_EXT: 696 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SINT32); 697 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SINT32); 698 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32); 699 break; 700 case GL_RGBA8UI_EXT: 701 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8); 702 break; 703 case GL_RGBA16UI_EXT: 704 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16); 705 break; 706 case GL_RGBA32UI_EXT: 707 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32); 708 break; 709 case GL_RGBA8I_EXT: 710 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8); 711 break; 712 case GL_RGBA16I_EXT: 713 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16); 714 break; 715 case GL_RGBA32I_EXT: 716 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32); 717 break; 718 719 case GL_R8: 720 case GL_RED: 721 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UNORM8); 722 break; 723 724 case GL_COMPRESSED_RED: 725 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) 726 RETURN_IF_SUPPORTED(MESA_FORMAT_R_RGTC1_UNORM); 727 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UNORM8); 728 break; 729 730 case GL_R16: 731 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UNORM16); 732 break; 733 734 case GL_RG: 735 case GL_RG8: 736 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8_UNORM); 737 break; 738 739 case GL_COMPRESSED_RG: 740 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) 741 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2_UNORM); 742 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8_UNORM); 743 break; 744 745 case GL_RG16: 746 RETURN_IF_SUPPORTED(MESA_FORMAT_R16G16_UNORM); 747 break; 748 749 case GL_R16F: 750 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16); 751 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16); 752 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32); 753 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 754 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 755 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 756 break; 757 case GL_R32F: 758 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32); 759 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 760 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 761 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16); 762 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16); 763 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 764 break; 765 case GL_RG16F: 766 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16); 767 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 768 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 769 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 770 break; 771 case GL_RG32F: 772 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32); 773 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32); 774 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16); 775 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16); 776 break; 777 778 case GL_R8UI: 779 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8); 780 break; 781 case GL_RG8UI: 782 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8); 783 break; 784 case GL_R16UI: 785 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16); 786 break; 787 case GL_RG16UI: 788 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16); 789 break; 790 case GL_R32UI: 791 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32); 792 break; 793 case GL_RG32UI: 794 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32); 795 break; 796 case GL_R8I: 797 RETURN_IF_SUPPORTED(MESA_FORMAT_R_SINT8); 798 break; 799 case GL_RG8I: 800 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_SINT8); 801 break; 802 case GL_R16I: 803 RETURN_IF_SUPPORTED(MESA_FORMAT_R_SINT16); 804 break; 805 case GL_RG16I: 806 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_SINT16); 807 break; 808 case GL_R32I: 809 RETURN_IF_SUPPORTED(MESA_FORMAT_R_SINT32); 810 break; 811 case GL_RG32I: 812 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_SINT32); 813 break; 814 815 case GL_RGB10_A2UI: 816 RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UINT); 817 RETURN_IF_SUPPORTED(MESA_FORMAT_R10G10B10A2_UINT); 818 break; 819 820 case GL_BGRA: 821 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM); 822 break; 823 } 824 825 _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()", 826 _mesa_lookup_enum_by_nr(internalFormat)); 827 return MESA_FORMAT_NONE; 828} 829 830GLboolean 831_mesa_tex_target_is_array(GLenum target) 832{ 833 switch (target) { 834 case GL_TEXTURE_1D_ARRAY_EXT: 835 case GL_TEXTURE_2D_ARRAY_EXT: 836 case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 837 case GL_TEXTURE_CUBE_MAP_ARRAY: 838 return GL_TRUE; 839 default: 840 return GL_FALSE; 841 } 842} 843