texformat.c revision abd5627a6a034885b0b01b995c73870da1361bb0
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 "texcompress.h" 38#include "texformat.h" 39 40 41/** 42 * Choose an appropriate texture format given the format, type and 43 * internalFormat parameters passed to glTexImage(). 44 * 45 * \param ctx the GL context. 46 * \param internalFormat user's prefered internal texture format. 47 * \param format incoming image pixel format. 48 * \param type incoming image data type. 49 * 50 * \return a pointer to a gl_texture_format object which describes the 51 * choosen texture format, or NULL on failure. 52 * 53 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers 54 * will typically override this function with a specialized version. 55 */ 56gl_format 57_mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat, 58 GLenum format, GLenum type ) 59{ 60 (void) format; 61 (void) type; 62 63 switch (internalFormat) { 64 /* shallow RGBA formats */ 65 case 4: 66 case GL_RGBA: 67 case GL_RGBA8: 68 return MESA_FORMAT_RGBA8888; 69 case GL_RGB5_A1: 70 return MESA_FORMAT_ARGB1555; 71 case GL_RGBA2: 72 return MESA_FORMAT_ARGB4444_REV; /* just to test another format*/ 73 case GL_RGBA4: 74 return MESA_FORMAT_ARGB4444; 75 76 /* deep RGBA formats */ 77 case GL_RGB10_A2: 78 case GL_RGBA12: 79 case GL_RGBA16: 80 return MESA_FORMAT_RGBA_16; 81 82 /* shallow RGB formats */ 83 case 3: 84 case GL_RGB: 85 case GL_RGB8: 86 return MESA_FORMAT_RGB888; 87 case GL_R3_G3_B2: 88 return MESA_FORMAT_RGB332; 89 case GL_RGB4: 90 return MESA_FORMAT_RGB565_REV; /* just to test another format */ 91 case GL_RGB5: 92 return MESA_FORMAT_RGB565; 93 94 /* deep RGB formats */ 95 case GL_RGB10: 96 case GL_RGB12: 97 case GL_RGB16: 98 return MESA_FORMAT_RGBA_16; 99 100 /* Alpha formats */ 101 case GL_ALPHA: 102 case GL_ALPHA4: 103 case GL_ALPHA12: 104 case GL_ALPHA16: 105 case GL_ALPHA8: 106 return MESA_FORMAT_A8; 107 108 /* Luminance formats */ 109 case 1: 110 case GL_LUMINANCE: 111 case GL_LUMINANCE4: 112 case GL_LUMINANCE12: 113 case GL_LUMINANCE16: 114 case GL_LUMINANCE8: 115 return MESA_FORMAT_L8; 116 117 /* Luminance/Alpha formats */ 118 case 2: 119 case GL_LUMINANCE_ALPHA: 120 case GL_LUMINANCE4_ALPHA4: 121 case GL_LUMINANCE6_ALPHA2: 122 case GL_LUMINANCE8_ALPHA8: 123 return MESA_FORMAT_AL88; 124 125 case GL_LUMINANCE12_ALPHA4: 126 case GL_LUMINANCE12_ALPHA12: 127 case GL_LUMINANCE16_ALPHA16: 128 return MESA_FORMAT_AL1616; 129 130 case GL_INTENSITY: 131 case GL_INTENSITY4: 132 case GL_INTENSITY12: 133 case GL_INTENSITY16: 134 case GL_INTENSITY8: 135 return MESA_FORMAT_I8; 136 137 case GL_COLOR_INDEX: 138 case GL_COLOR_INDEX1_EXT: 139 case GL_COLOR_INDEX2_EXT: 140 case GL_COLOR_INDEX4_EXT: 141 case GL_COLOR_INDEX12_EXT: 142 case GL_COLOR_INDEX16_EXT: 143 case GL_COLOR_INDEX8_EXT: 144 return MESA_FORMAT_CI8; 145 146 default: 147 ; /* fallthrough */ 148 } 149 150 if (ctx->Extensions.ARB_depth_texture) { 151 switch (internalFormat) { 152 case GL_DEPTH_COMPONENT: 153 case GL_DEPTH_COMPONENT24: 154 case GL_DEPTH_COMPONENT32: 155 return MESA_FORMAT_Z32; 156 case GL_DEPTH_COMPONENT16: 157 return MESA_FORMAT_Z16; 158 default: 159 ; /* fallthrough */ 160 } 161 } 162 163 switch (internalFormat) { 164 case GL_COMPRESSED_ALPHA_ARB: 165 return MESA_FORMAT_A8; 166 case GL_COMPRESSED_LUMINANCE_ARB: 167 return MESA_FORMAT_L8; 168 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: 169 return MESA_FORMAT_AL88; 170 case GL_COMPRESSED_INTENSITY_ARB: 171 return MESA_FORMAT_I8; 172 case GL_COMPRESSED_RGB_ARB: 173 if (ctx->Extensions.EXT_texture_compression_s3tc || 174 ctx->Extensions.S3_s3tc) 175 return MESA_FORMAT_RGB_DXT1; 176 if (ctx->Extensions.TDFX_texture_compression_FXT1) 177 return MESA_FORMAT_RGB_FXT1; 178 return MESA_FORMAT_RGB888; 179 case GL_COMPRESSED_RGBA_ARB: 180 if (ctx->Extensions.EXT_texture_compression_s3tc || 181 ctx->Extensions.S3_s3tc) 182 return MESA_FORMAT_RGBA_DXT3; /* Not rgba_dxt1, see spec */ 183 if (ctx->Extensions.TDFX_texture_compression_FXT1) 184 return MESA_FORMAT_RGBA_FXT1; 185 return MESA_FORMAT_RGBA8888; 186 default: 187 ; /* fallthrough */ 188 } 189 190 if (ctx->Extensions.MESA_ycbcr_texture) { 191 if (internalFormat == GL_YCBCR_MESA) { 192 if (type == GL_UNSIGNED_SHORT_8_8_MESA) 193 return MESA_FORMAT_YCBCR; 194 else 195 return MESA_FORMAT_YCBCR_REV; 196 } 197 } 198 199#if FEATURE_texture_fxt1 200 if (ctx->Extensions.TDFX_texture_compression_FXT1) { 201 switch (internalFormat) { 202 case GL_COMPRESSED_RGB_FXT1_3DFX: 203 return MESA_FORMAT_RGB_FXT1; 204 case GL_COMPRESSED_RGBA_FXT1_3DFX: 205 return MESA_FORMAT_RGBA_FXT1; 206 default: 207 ; /* fallthrough */ 208 } 209 } 210#endif 211 212#if FEATURE_texture_s3tc 213 if (ctx->Extensions.EXT_texture_compression_s3tc) { 214 switch (internalFormat) { 215 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 216 return MESA_FORMAT_RGB_DXT1; 217 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 218 return MESA_FORMAT_RGBA_DXT1; 219 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 220 return MESA_FORMAT_RGBA_DXT3; 221 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 222 return MESA_FORMAT_RGBA_DXT5; 223 default: 224 ; /* fallthrough */ 225 } 226 } 227 228 if (ctx->Extensions.S3_s3tc) { 229 switch (internalFormat) { 230 case GL_RGB_S3TC: 231 case GL_RGB4_S3TC: 232 return MESA_FORMAT_RGB_DXT1; 233 case GL_RGBA_S3TC: 234 case GL_RGBA4_S3TC: 235 return MESA_FORMAT_RGBA_DXT3; 236 default: 237 ; /* fallthrough */ 238 } 239 } 240#endif 241 242 if (ctx->Extensions.ARB_texture_float) { 243 switch (internalFormat) { 244 case GL_ALPHA16F_ARB: 245 return MESA_FORMAT_ALPHA_FLOAT16; 246 case GL_ALPHA32F_ARB: 247 return MESA_FORMAT_ALPHA_FLOAT32; 248 case GL_LUMINANCE16F_ARB: 249 return MESA_FORMAT_LUMINANCE_FLOAT16; 250 case GL_LUMINANCE32F_ARB: 251 return MESA_FORMAT_LUMINANCE_FLOAT32; 252 case GL_LUMINANCE_ALPHA16F_ARB: 253 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16; 254 case GL_LUMINANCE_ALPHA32F_ARB: 255 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32; 256 case GL_INTENSITY16F_ARB: 257 return MESA_FORMAT_INTENSITY_FLOAT16; 258 case GL_INTENSITY32F_ARB: 259 return MESA_FORMAT_INTENSITY_FLOAT32; 260 case GL_RGB16F_ARB: 261 return MESA_FORMAT_RGB_FLOAT16; 262 case GL_RGB32F_ARB: 263 return MESA_FORMAT_RGB_FLOAT32; 264 case GL_RGBA16F_ARB: 265 return MESA_FORMAT_RGBA_FLOAT16; 266 case GL_RGBA32F_ARB: 267 return MESA_FORMAT_RGBA_FLOAT32; 268 default: 269 ; /* fallthrough */ 270 } 271 } 272 273 if (ctx->Extensions.EXT_packed_depth_stencil) { 274 switch (internalFormat) { 275 case GL_DEPTH_STENCIL_EXT: 276 case GL_DEPTH24_STENCIL8_EXT: 277 return MESA_FORMAT_Z24_S8; 278 default: 279 ; /* fallthrough */ 280 } 281 } 282 283 if (ctx->Extensions.ATI_envmap_bumpmap) { 284 switch (internalFormat) { 285 case GL_DUDV_ATI: 286 case GL_DU8DV8_ATI: 287 return MESA_FORMAT_DUDV8; 288 default: 289 ; /* fallthrough */ 290 } 291 } 292 293 if (ctx->Extensions.MESA_texture_signed_rgba) { 294 switch (internalFormat) { 295 case GL_RGBA_SNORM: 296 case GL_RGBA8_SNORM: 297 return MESA_FORMAT_SIGNED_RGBA8888; 298 default: 299 ; /* fallthrough */ 300 } 301 } 302 303 if (ctx->VersionMajor * 10 + ctx->VersionMinor >= 31) { 304 switch (internalFormat) { 305 case GL_RED_SNORM: 306 case GL_R8_SNORM: 307 return MESA_FORMAT_SIGNED_R8; 308 case GL_RG_SNORM: 309 case GL_RG8_SNORM: 310 return MESA_FORMAT_SIGNED_RG88; 311 case GL_RGB_SNORM: 312 case GL_RGB8_SNORM: 313 return MESA_FORMAT_SIGNED_RGBX8888; 314 case GL_RGBA_SNORM: 315 case GL_RGBA8_SNORM: 316 return MESA_FORMAT_SIGNED_RGBA8888; 317 case GL_R16_SNORM: 318 return MESA_FORMAT_SIGNED_R_16; 319 case GL_RG16_SNORM: 320 return MESA_FORMAT_SIGNED_RG_16; 321 case GL_RGB16_SNORM: 322 return MESA_FORMAT_SIGNED_RGB_16; 323 case GL_RGBA16_SNORM: 324 return MESA_FORMAT_SIGNED_RGBA_16; 325 default: 326 ; /* fall-through */ 327 } 328 } 329 330#if FEATURE_EXT_texture_sRGB 331 if (ctx->Extensions.EXT_texture_sRGB) { 332 switch (internalFormat) { 333 case GL_SRGB_EXT: 334 case GL_SRGB8_EXT: 335 return MESA_FORMAT_SRGB8; 336 case GL_SRGB_ALPHA_EXT: 337 case GL_SRGB8_ALPHA8_EXT: 338 return MESA_FORMAT_SRGBA8; 339 case GL_SLUMINANCE_EXT: 340 case GL_SLUMINANCE8_EXT: 341 return MESA_FORMAT_SL8; 342 case GL_SLUMINANCE_ALPHA_EXT: 343 case GL_SLUMINANCE8_ALPHA8_EXT: 344 return MESA_FORMAT_SLA8; 345 case GL_COMPRESSED_SLUMINANCE_EXT: 346 return MESA_FORMAT_SL8; 347 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 348 return MESA_FORMAT_SLA8; 349 case GL_COMPRESSED_SRGB_EXT: 350#if FEATURE_texture_s3tc 351 if (ctx->Extensions.EXT_texture_compression_s3tc) 352 return MESA_FORMAT_SRGB_DXT1; 353#endif 354 return MESA_FORMAT_SRGB8; 355 case GL_COMPRESSED_SRGB_ALPHA_EXT: 356#if FEATURE_texture_s3tc 357 if (ctx->Extensions.EXT_texture_compression_s3tc) 358 return MESA_FORMAT_SRGBA_DXT3; /* Not srgba_dxt1, see spec */ 359#endif 360 return MESA_FORMAT_SRGBA8; 361#if FEATURE_texture_s3tc 362 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 363 if (ctx->Extensions.EXT_texture_compression_s3tc) 364 return MESA_FORMAT_SRGB_DXT1; 365 break; 366 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 367 if (ctx->Extensions.EXT_texture_compression_s3tc) 368 return MESA_FORMAT_SRGBA_DXT1; 369 break; 370 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 371 if (ctx->Extensions.EXT_texture_compression_s3tc) 372 return MESA_FORMAT_SRGBA_DXT3; 373 break; 374 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 375 if (ctx->Extensions.EXT_texture_compression_s3tc) 376 return MESA_FORMAT_SRGBA_DXT5; 377 break; 378#endif 379 default: 380 ; /* fallthrough */ 381 } 382 } 383#endif /* FEATURE_EXT_texture_sRGB */ 384 385 if (ctx->Extensions.EXT_texture_integer) { 386 switch (internalFormat) { 387 case GL_RGBA32UI_EXT: 388 case GL_RGB32UI_EXT: 389 case GL_ALPHA32UI_EXT: 390 case GL_INTENSITY32UI_EXT: 391 case GL_LUMINANCE32UI_EXT: 392 case GL_LUMINANCE_ALPHA32UI_EXT: 393 return MESA_FORMAT_RGBA_UINT32; 394 case GL_RGBA16UI_EXT: 395 case GL_RGB16UI_EXT: 396 case GL_ALPHA16UI_EXT: 397 case GL_INTENSITY16UI_EXT: 398 case GL_LUMINANCE16UI_EXT: 399 case GL_LUMINANCE_ALPHA16UI_EXT: 400 return MESA_FORMAT_RGBA_UINT16; 401 case GL_RGBA8UI_EXT: 402 case GL_RGB8UI_EXT: 403 case GL_ALPHA8UI_EXT: 404 case GL_INTENSITY8UI_EXT: 405 case GL_LUMINANCE8UI_EXT: 406 case GL_LUMINANCE_ALPHA8UI_EXT: 407 return MESA_FORMAT_RGBA_UINT8; 408 case GL_RGBA32I_EXT: 409 case GL_RGB32I_EXT: 410 case GL_ALPHA32I_EXT: 411 case GL_INTENSITY32I_EXT: 412 case GL_LUMINANCE32I_EXT: 413 case GL_LUMINANCE_ALPHA32I_EXT: 414 return MESA_FORMAT_RGBA_INT32; 415 case GL_RGBA16I_EXT: 416 case GL_RGB16I_EXT: 417 case GL_ALPHA16I_EXT: 418 case GL_INTENSITY16I_EXT: 419 case GL_LUMINANCE16I_EXT: 420 case GL_LUMINANCE_ALPHA16I_EXT: 421 return MESA_FORMAT_RGBA_INT16; 422 case GL_RGBA8I_EXT: 423 case GL_RGB8I_EXT: 424 case GL_ALPHA8I_EXT: 425 case GL_INTENSITY8I_EXT: 426 case GL_LUMINANCE8I_EXT: 427 case GL_LUMINANCE_ALPHA8I_EXT: 428 return MESA_FORMAT_RGBA_INT8; 429 } 430 } 431 432 _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()"); 433 return MESA_FORMAT_NONE; 434} 435 436