texformat.c revision bb386a1ecae6d7f805af44df463b0e4d661eef85
1/* 2 * Mesa 3-D graphics library 3 * Version: 6.5.1 4 * 5 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 6 * Copyright (c) 2008 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 */ 33 34 35#include "colormac.h" 36#include "context.h" 37#include "texformat.h" 38#include "texstore.h" 39 40 41#if FEATURE_EXT_texture_sRGB 42 43/** 44 * Convert an 8-bit sRGB value from non-linear space to a 45 * linear RGB value in [0, 1]. 46 * Implemented with a 256-entry lookup table. 47 */ 48static INLINE GLfloat 49nonlinear_to_linear(GLubyte cs8) 50{ 51 static GLfloat table[256]; 52 static GLboolean tableReady = GL_FALSE; 53 if (!tableReady) { 54 /* compute lookup table now */ 55 GLuint i; 56 for (i = 0; i < 256; i++) { 57 const GLfloat cs = UBYTE_TO_FLOAT(i); 58 if (cs <= 0.04045) { 59 table[i] = cs / 12.92f; 60 } 61 else { 62 table[i] = (GLfloat) _mesa_pow((cs + 0.055) / 1.055, 2.4); 63 } 64 } 65 tableReady = GL_TRUE; 66 } 67 return table[cs8]; 68} 69 70 71#endif /* FEATURE_EXT_texture_sRGB */ 72 73 74/* Texel fetch routines for all supported formats 75 */ 76#define DIM 1 77#include "texformat_tmp.h" 78 79#define DIM 2 80#include "texformat_tmp.h" 81 82#define DIM 3 83#include "texformat_tmp.h" 84 85/** 86 * Null texel fetch function. 87 * 88 * Have to have this so the FetchTexel function pointer is never NULL. 89 */ 90static void fetch_null_texel( const struct gl_texture_image *texImage, 91 GLint i, GLint j, GLint k, GLchan *texel ) 92{ 93 (void) texImage; (void) i; (void) j; (void) k; 94 texel[RCOMP] = 0; 95 texel[GCOMP] = 0; 96 texel[BCOMP] = 0; 97 texel[ACOMP] = 0; 98 _mesa_warning(NULL, "fetch_null_texel() called!"); 99} 100 101static void fetch_null_texelf( const struct gl_texture_image *texImage, 102 GLint i, GLint j, GLint k, GLfloat *texel ) 103{ 104 (void) texImage; (void) i; (void) j; (void) k; 105 texel[RCOMP] = 0.0; 106 texel[GCOMP] = 0.0; 107 texel[BCOMP] = 0.0; 108 texel[ACOMP] = 0.0; 109 _mesa_warning(NULL, "fetch_null_texelf() called!"); 110} 111 112static void store_null_texel(struct gl_texture_image *texImage, 113 GLint i, GLint j, GLint k, const void *texel) 114{ 115 (void) texImage; 116 (void) i; 117 (void) j; 118 (void) k; 119 (void) texel; 120 /* no-op */ 121} 122 123 124/** 125 * Notes about the predefined gl_texture_formats: 126 * 127 * 1. There are 1D, 2D and 3D functions for fetching texels from texture 128 * images, returning both GLchan values and GLfloat values. (six 129 * functions in total) 130 * You don't have to provide both the GLchan and GLfloat functions; 131 * just one or the other is OK. Mesa will use an "adaptor" to convert 132 * between GLchan/GLfloat when needed. 133 * Since the adaptors have small performance penalty, we provide both 134 * GLchan and GLfloat functions for some common formats like RGB, RGBA. 135 */ 136 137 138/***************************************************************/ 139/** \name Default GLchan-based formats */ 140/*@{*/ 141 142const struct gl_texture_format _mesa_texformat_rgba = { 143 MESA_FORMAT_RGBA, /* MesaFormat */ 144 GL_RGBA, /* BaseFormat */ 145 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 146 CHAN_BITS, /* RedBits */ 147 CHAN_BITS, /* GreenBits */ 148 CHAN_BITS, /* BlueBits */ 149 CHAN_BITS, /* AlphaBits */ 150 0, /* LuminanceBits */ 151 0, /* IntensityBits */ 152 0, /* IndexBits */ 153 0, /* DepthBits */ 154 0, /* StencilBits */ 155 4 * sizeof(GLchan), /* TexelBytes */ 156 _mesa_texstore_rgba, /* StoreTexImageFunc */ 157 fetch_texel_1d_rgba, /* FetchTexel1D */ 158 fetch_texel_2d_rgba, /* FetchTexel2D */ 159 fetch_texel_3d_rgba, /* FetchTexel3D */ 160 fetch_texel_1d_f_rgba, /* FetchTexel1Df */ 161 fetch_texel_2d_f_rgba, /* FetchTexel2Df */ 162 fetch_texel_3d_f_rgba, /* FetchTexel3Df */ 163 store_texel_rgba /* StoreTexel */ 164}; 165 166const struct gl_texture_format _mesa_texformat_rgb = { 167 MESA_FORMAT_RGB, /* MesaFormat */ 168 GL_RGB, /* BaseFormat */ 169 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 170 CHAN_BITS, /* RedBits */ 171 CHAN_BITS, /* GreenBits */ 172 CHAN_BITS, /* BlueBits */ 173 0, /* AlphaBits */ 174 0, /* LuminanceBits */ 175 0, /* IntensityBits */ 176 0, /* IndexBits */ 177 0, /* DepthBits */ 178 0, /* StencilBits */ 179 3 * sizeof(GLchan), /* TexelBytes */ 180 _mesa_texstore_rgba,/*yes*/ /* StoreTexImageFunc */ 181 fetch_texel_1d_rgb, /* FetchTexel1D */ 182 fetch_texel_2d_rgb, /* FetchTexel2D */ 183 fetch_texel_3d_rgb, /* FetchTexel3D */ 184 fetch_texel_1d_f_rgb, /* FetchTexel1Df */ 185 fetch_texel_2d_f_rgb, /* FetchTexel2Df */ 186 fetch_texel_3d_f_rgb, /* FetchTexel3Df */ 187 store_texel_rgb /* StoreTexel */ 188}; 189 190const struct gl_texture_format _mesa_texformat_alpha = { 191 MESA_FORMAT_ALPHA, /* MesaFormat */ 192 GL_ALPHA, /* BaseFormat */ 193 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 194 0, /* RedBits */ 195 0, /* GreenBits */ 196 0, /* BlueBits */ 197 CHAN_BITS, /* AlphaBits */ 198 0, /* LuminanceBits */ 199 0, /* IntensityBits */ 200 0, /* IndexBits */ 201 0, /* DepthBits */ 202 0, /* StencilBits */ 203 sizeof(GLchan), /* TexelBytes */ 204 _mesa_texstore_rgba,/*yes*/ /* StoreTexImageFunc */ 205 fetch_texel_1d_alpha, /* FetchTexel1D */ 206 fetch_texel_2d_alpha, /* FetchTexel2D */ 207 fetch_texel_3d_alpha, /* FetchTexel3D */ 208 NULL, /* FetchTexel1Df */ 209 NULL, /* FetchTexel2Df */ 210 NULL, /* FetchTexel3Df */ 211 store_texel_alpha /* StoreTexel */ 212}; 213 214const struct gl_texture_format _mesa_texformat_luminance = { 215 MESA_FORMAT_LUMINANCE, /* MesaFormat */ 216 GL_LUMINANCE, /* BaseFormat */ 217 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 218 0, /* RedBits */ 219 0, /* GreenBits */ 220 0, /* BlueBits */ 221 0, /* AlphaBits */ 222 CHAN_BITS, /* LuminanceBits */ 223 0, /* IntensityBits */ 224 0, /* IndexBits */ 225 0, /* DepthBits */ 226 0, /* StencilBits */ 227 sizeof(GLchan), /* TexelBytes */ 228 _mesa_texstore_rgba,/*yes*/ /* StoreTexImageFunc */ 229 fetch_texel_1d_luminance, /* FetchTexel1D */ 230 fetch_texel_2d_luminance, /* FetchTexel2D */ 231 fetch_texel_3d_luminance, /* FetchTexel3D */ 232 NULL, /* FetchTexel1Df */ 233 NULL, /* FetchTexel2Df */ 234 NULL, /* FetchTexel3Df */ 235 store_texel_luminance /* StoreTexel */ 236}; 237 238const struct gl_texture_format _mesa_texformat_luminance_alpha = { 239 MESA_FORMAT_LUMINANCE_ALPHA, /* MesaFormat */ 240 GL_LUMINANCE_ALPHA, /* BaseFormat */ 241 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 242 0, /* RedBits */ 243 0, /* GreenBits */ 244 0, /* BlueBits */ 245 CHAN_BITS, /* AlphaBits */ 246 CHAN_BITS, /* LuminanceBits */ 247 0, /* IntensityBits */ 248 0, /* IndexBits */ 249 0, /* DepthBits */ 250 0, /* StencilBits */ 251 2 * sizeof(GLchan), /* TexelBytes */ 252 _mesa_texstore_rgba,/*yes*/ /* StoreTexImageFunc */ 253 fetch_texel_1d_luminance_alpha, /* FetchTexel1D */ 254 fetch_texel_2d_luminance_alpha, /* FetchTexel2D */ 255 fetch_texel_3d_luminance_alpha, /* FetchTexel3D */ 256 NULL, /* FetchTexel1Df */ 257 NULL, /* FetchTexel2Df */ 258 NULL, /* FetchTexel3Df */ 259 store_texel_luminance_alpha /* StoreTexel */ 260}; 261 262const struct gl_texture_format _mesa_texformat_intensity = { 263 MESA_FORMAT_INTENSITY, /* MesaFormat */ 264 GL_INTENSITY, /* BaseFormat */ 265 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 266 0, /* RedBits */ 267 0, /* GreenBits */ 268 0, /* BlueBits */ 269 0, /* AlphaBits */ 270 0, /* LuminanceBits */ 271 CHAN_BITS, /* IntensityBits */ 272 0, /* IndexBits */ 273 0, /* DepthBits */ 274 0, /* StencilBits */ 275 sizeof(GLchan), /* TexelBytes */ 276 _mesa_texstore_rgba,/*yes*/ /* StoreTexImageFunc */ 277 fetch_texel_1d_intensity, /* FetchTexel1D */ 278 fetch_texel_2d_intensity, /* FetchTexel2D */ 279 fetch_texel_3d_intensity, /* FetchTexel3D */ 280 NULL, /* FetchTexel1Df */ 281 NULL, /* FetchTexel2Df */ 282 NULL, /* FetchTexel3Df */ 283 store_texel_intensity /* StoreTexel */ 284}; 285 286 287#if FEATURE_EXT_texture_sRGB 288 289const struct gl_texture_format _mesa_texformat_srgb8 = { 290 MESA_FORMAT_SRGB8, /* MesaFormat */ 291 GL_RGB, /* BaseFormat */ 292 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 293 8, /* RedBits */ 294 8, /* GreenBits */ 295 8, /* BlueBits */ 296 0, /* AlphaBits */ 297 0, /* LuminanceBits */ 298 0, /* IntensityBits */ 299 0, /* IndexBits */ 300 0, /* DepthBits */ 301 0, /* StencilBits */ 302 3, /* TexelBytes */ 303 _mesa_texstore_srgb8, /* StoreTexImageFunc */ 304 NULL, /* FetchTexel1D */ 305 NULL, /* FetchTexel2D */ 306 NULL, /* FetchTexel3D */ 307 fetch_texel_1d_srgb8, /* FetchTexel1Df */ 308 fetch_texel_2d_srgb8, /* FetchTexel2Df */ 309 fetch_texel_3d_srgb8, /* FetchTexel3Df */ 310 store_texel_srgb8 /* StoreTexel */ 311}; 312 313const struct gl_texture_format _mesa_texformat_srgba8 = { 314 MESA_FORMAT_SRGBA8, /* MesaFormat */ 315 GL_RGBA, /* BaseFormat */ 316 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 317 8, /* RedBits */ 318 8, /* GreenBits */ 319 8, /* BlueBits */ 320 8, /* AlphaBits */ 321 0, /* LuminanceBits */ 322 0, /* IntensityBits */ 323 0, /* IndexBits */ 324 0, /* DepthBits */ 325 0, /* StencilBits */ 326 4, /* TexelBytes */ 327 _mesa_texstore_srgba8, /* StoreTexImageFunc */ 328 NULL, /* FetchTexel1D */ 329 NULL, /* FetchTexel2D */ 330 NULL, /* FetchTexel3D */ 331 fetch_texel_1d_srgba8, /* FetchTexel1Df */ 332 fetch_texel_2d_srgba8, /* FetchTexel2Df */ 333 fetch_texel_3d_srgba8, /* FetchTexel3Df */ 334 store_texel_srgba8 /* StoreTexel */ 335}; 336 337const struct gl_texture_format _mesa_texformat_sargb8 = { 338 MESA_FORMAT_SARGB8, /* MesaFormat */ 339 GL_RGBA, /* BaseFormat */ 340 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 341 8, /* RedBits */ 342 8, /* GreenBits */ 343 8, /* BlueBits */ 344 8, /* AlphaBits */ 345 0, /* LuminanceBits */ 346 0, /* IntensityBits */ 347 0, /* IndexBits */ 348 0, /* DepthBits */ 349 0, /* StencilBits */ 350 4, /* TexelBytes */ 351 _mesa_texstore_sargb8, /* StoreTexImageFunc */ 352 NULL, /* FetchTexel1D */ 353 NULL, /* FetchTexel2D */ 354 NULL, /* FetchTexel3D */ 355 fetch_texel_1d_sargb8, /* FetchTexel1Df */ 356 fetch_texel_2d_sargb8, /* FetchTexel2Df */ 357 fetch_texel_3d_sargb8, /* FetchTexel3Df */ 358 store_texel_sargb8 /* StoreTexel */ 359}; 360 361const struct gl_texture_format _mesa_texformat_sl8 = { 362 MESA_FORMAT_SL8, /* MesaFormat */ 363 GL_LUMINANCE, /* BaseFormat */ 364 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 365 0, /* RedBits */ 366 0, /* GreenBits */ 367 0, /* BlueBits */ 368 0, /* AlphaBits */ 369 8, /* LuminanceBits */ 370 0, /* IntensityBits */ 371 0, /* IndexBits */ 372 0, /* DepthBits */ 373 0, /* StencilBits */ 374 1, /* TexelBytes */ 375 _mesa_texstore_sl8, /* StoreTexImageFunc */ 376 NULL, /* FetchTexel1D */ 377 NULL, /* FetchTexel2D */ 378 NULL, /* FetchTexel3D */ 379 fetch_texel_1d_sl8, /* FetchTexel1Df */ 380 fetch_texel_2d_sl8, /* FetchTexel2Df */ 381 fetch_texel_3d_sl8, /* FetchTexel3Df */ 382 store_texel_sl8 /* StoreTexel */ 383}; 384 385const struct gl_texture_format _mesa_texformat_sla8 = { 386 MESA_FORMAT_SLA8, /* MesaFormat */ 387 GL_LUMINANCE_ALPHA, /* BaseFormat */ 388 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 389 0, /* RedBits */ 390 0, /* GreenBits */ 391 0, /* BlueBits */ 392 8, /* AlphaBits */ 393 8, /* LuminanceBits */ 394 0, /* IntensityBits */ 395 0, /* IndexBits */ 396 0, /* DepthBits */ 397 0, /* StencilBits */ 398 2, /* TexelBytes */ 399 _mesa_texstore_sla8, /* StoreTexImageFunc */ 400 NULL, /* FetchTexel1D */ 401 NULL, /* FetchTexel2D */ 402 NULL, /* FetchTexel3D */ 403 fetch_texel_1d_sla8, /* FetchTexel1Df */ 404 fetch_texel_2d_sla8, /* FetchTexel2Df */ 405 fetch_texel_3d_sla8, /* FetchTexel3Df */ 406 store_texel_sla8 /* StoreTexel */ 407}; 408 409#endif /* FEATURE_EXT_texture_sRGB */ 410 411const struct gl_texture_format _mesa_texformat_rgba_float32 = { 412 MESA_FORMAT_RGBA_FLOAT32, /* MesaFormat */ 413 GL_RGBA, /* BaseFormat */ 414 GL_FLOAT, /* DataType */ 415 8 * sizeof(GLfloat), /* RedBits */ 416 8 * sizeof(GLfloat), /* GreenBits */ 417 8 * sizeof(GLfloat), /* BlueBits */ 418 8 * sizeof(GLfloat), /* AlphaBits */ 419 0, /* LuminanceBits */ 420 0, /* IntensityBits */ 421 0, /* IndexBits */ 422 0, /* DepthBits */ 423 0, /* StencilBits */ 424 4 * sizeof(GLfloat), /* TexelBytes */ 425 _mesa_texstore_rgba_float32, /* StoreTexImageFunc */ 426 NULL, /* FetchTexel1D */ 427 NULL, /* FetchTexel1D */ 428 NULL, /* FetchTexel1D */ 429 fetch_texel_1d_f_rgba_f32, /* FetchTexel1Df */ 430 fetch_texel_2d_f_rgba_f32, /* FetchTexel2Df */ 431 fetch_texel_3d_f_rgba_f32, /* FetchTexel3Df */ 432 store_texel_rgba_f32 /* StoreTexel */ 433}; 434 435const struct gl_texture_format _mesa_texformat_rgba_float16 = { 436 MESA_FORMAT_RGBA_FLOAT16, /* MesaFormat */ 437 GL_RGBA, /* BaseFormat */ 438 GL_FLOAT, /* DataType */ 439 8 * sizeof(GLhalfARB), /* RedBits */ 440 8 * sizeof(GLhalfARB), /* GreenBits */ 441 8 * sizeof(GLhalfARB), /* BlueBits */ 442 8 * sizeof(GLhalfARB), /* AlphaBits */ 443 0, /* LuminanceBits */ 444 0, /* IntensityBits */ 445 0, /* IndexBits */ 446 0, /* DepthBits */ 447 0, /* StencilBits */ 448 4 * sizeof(GLhalfARB), /* TexelBytes */ 449 _mesa_texstore_rgba_float16, /* StoreTexImageFunc */ 450 NULL, /* FetchTexel1D */ 451 NULL, /* FetchTexel1D */ 452 NULL, /* FetchTexel1D */ 453 fetch_texel_1d_f_rgba_f16, /* FetchTexel1Df */ 454 fetch_texel_2d_f_rgba_f16, /* FetchTexel2Df */ 455 fetch_texel_3d_f_rgba_f16, /* FetchTexel3Df */ 456 store_texel_rgba_f16 /* StoreTexel */ 457}; 458 459const struct gl_texture_format _mesa_texformat_rgb_float32 = { 460 MESA_FORMAT_RGB_FLOAT32, /* MesaFormat */ 461 GL_RGB, /* BaseFormat */ 462 GL_FLOAT, /* DataType */ 463 8 * sizeof(GLfloat), /* RedBits */ 464 8 * sizeof(GLfloat), /* GreenBits */ 465 8 * sizeof(GLfloat), /* BlueBits */ 466 0, /* AlphaBits */ 467 0, /* LuminanceBits */ 468 0, /* IntensityBits */ 469 0, /* IndexBits */ 470 0, /* DepthBits */ 471 0, /* StencilBits */ 472 3 * sizeof(GLfloat), /* TexelBytes */ 473 _mesa_texstore_rgba_float32,/*yes*/ /* StoreTexImageFunc */ 474 NULL, /* FetchTexel1D */ 475 NULL, /* FetchTexel1D */ 476 NULL, /* FetchTexel1D */ 477 fetch_texel_1d_f_rgb_f32, /* FetchTexel1Df */ 478 fetch_texel_2d_f_rgb_f32, /* FetchTexel2Df */ 479 fetch_texel_3d_f_rgb_f32, /* FetchTexel3Df */ 480 store_texel_rgb_f32 /* StoreTexel */ 481}; 482 483const struct gl_texture_format _mesa_texformat_rgb_float16 = { 484 MESA_FORMAT_RGB_FLOAT16, /* MesaFormat */ 485 GL_RGB, /* BaseFormat */ 486 GL_FLOAT, /* DataType */ 487 8 * sizeof(GLhalfARB), /* RedBits */ 488 8 * sizeof(GLhalfARB), /* GreenBits */ 489 8 * sizeof(GLhalfARB), /* BlueBits */ 490 0, /* AlphaBits */ 491 0, /* LuminanceBits */ 492 0, /* IntensityBits */ 493 0, /* IndexBits */ 494 0, /* DepthBits */ 495 0, /* StencilBits */ 496 3 * sizeof(GLhalfARB), /* TexelBytes */ 497 _mesa_texstore_rgba_float16,/*yes*/ /* StoreTexImageFunc */ 498 NULL, /* FetchTexel1D */ 499 NULL, /* FetchTexel1D */ 500 NULL, /* FetchTexel1D */ 501 fetch_texel_1d_f_rgb_f16, /* FetchTexel1Df */ 502 fetch_texel_2d_f_rgb_f16, /* FetchTexel2Df */ 503 fetch_texel_3d_f_rgb_f16, /* FetchTexel3Df */ 504 store_texel_rgb_f16 /* StoreTexel */ 505}; 506 507const struct gl_texture_format _mesa_texformat_alpha_float32 = { 508 MESA_FORMAT_ALPHA_FLOAT32, /* MesaFormat */ 509 GL_ALPHA, /* BaseFormat */ 510 GL_FLOAT, /* DataType */ 511 0, /* RedBits */ 512 0, /* GreenBits */ 513 0, /* BlueBits */ 514 8 * sizeof(GLfloat), /* AlphaBits */ 515 0, /* LuminanceBits */ 516 0, /* IntensityBits */ 517 0, /* IndexBits */ 518 0, /* DepthBits */ 519 0, /* StencilBits */ 520 1 * sizeof(GLfloat), /* TexelBytes */ 521 _mesa_texstore_rgba_float32,/*yes*/ /* StoreTexImageFunc */ 522 NULL, /* FetchTexel1D */ 523 NULL, /* FetchTexel1D */ 524 NULL, /* FetchTexel1D */ 525 fetch_texel_1d_f_alpha_f32, /* FetchTexel1Df */ 526 fetch_texel_2d_f_alpha_f32, /* FetchTexel2Df */ 527 fetch_texel_3d_f_alpha_f32, /* FetchTexel3Df */ 528 store_texel_alpha_f32 /* StoreTexel */ 529}; 530 531const struct gl_texture_format _mesa_texformat_alpha_float16 = { 532 MESA_FORMAT_ALPHA_FLOAT16, /* MesaFormat */ 533 GL_ALPHA, /* BaseFormat */ 534 GL_FLOAT, /* DataType */ 535 0, /* RedBits */ 536 0, /* GreenBits */ 537 0, /* BlueBits */ 538 8 * sizeof(GLhalfARB), /* AlphaBits */ 539 0, /* LuminanceBits */ 540 0, /* IntensityBits */ 541 0, /* IndexBits */ 542 0, /* DepthBits */ 543 0, /* StencilBits */ 544 1 * sizeof(GLhalfARB), /* TexelBytes */ 545 _mesa_texstore_rgba_float16,/*yes*/ /* StoreTexImageFunc */ 546 NULL, /* FetchTexel1D */ 547 NULL, /* FetchTexel1D */ 548 NULL, /* FetchTexel1D */ 549 fetch_texel_1d_f_alpha_f16, /* FetchTexel1Df */ 550 fetch_texel_2d_f_alpha_f16, /* FetchTexel2Df */ 551 fetch_texel_3d_f_alpha_f16, /* FetchTexel3Df */ 552 store_texel_alpha_f16 /* StoreTexel */ 553}; 554 555const struct gl_texture_format _mesa_texformat_luminance_float32 = { 556 MESA_FORMAT_LUMINANCE_FLOAT32, /* MesaFormat */ 557 GL_LUMINANCE, /* BaseFormat */ 558 GL_FLOAT, /* DataType */ 559 0, /* RedBits */ 560 0, /* GreenBits */ 561 0, /* BlueBits */ 562 0, /* AlphaBits */ 563 8 * sizeof(GLfloat), /* LuminanceBits */ 564 0, /* IntensityBits */ 565 0, /* IndexBits */ 566 0, /* DepthBits */ 567 0, /* StencilBits */ 568 1 * sizeof(GLfloat), /* TexelBytes */ 569 _mesa_texstore_rgba_float32,/*yes*/ /* StoreTexImageFunc */ 570 NULL, /* FetchTexel1D */ 571 NULL, /* FetchTexel2D */ 572 NULL, /* FetchTexel3D */ 573 fetch_texel_1d_f_luminance_f32, /* FetchTexel1Df */ 574 fetch_texel_2d_f_luminance_f32, /* FetchTexel2Df */ 575 fetch_texel_3d_f_luminance_f32, /* FetchTexel3Df */ 576 store_texel_luminance_f32 /* StoreTexel */ 577}; 578 579const struct gl_texture_format _mesa_texformat_luminance_float16 = { 580 MESA_FORMAT_LUMINANCE_FLOAT16, /* MesaFormat */ 581 GL_LUMINANCE, /* BaseFormat */ 582 GL_FLOAT, /* DataType */ 583 0, /* RedBits */ 584 0, /* GreenBits */ 585 0, /* BlueBits */ 586 0, /* AlphaBits */ 587 8 * sizeof(GLhalfARB), /* LuminanceBits */ 588 0, /* IntensityBits */ 589 0, /* IndexBits */ 590 0, /* DepthBits */ 591 0, /* StencilBits */ 592 1 * sizeof(GLhalfARB), /* TexelBytes */ 593 _mesa_texstore_rgba_float16,/*yes*/ /* StoreTexImageFunc */ 594 NULL, /* FetchTexel1D */ 595 NULL, /* FetchTexel2D */ 596 NULL, /* FetchTexel3D */ 597 fetch_texel_1d_f_luminance_f16, /* FetchTexel1Df */ 598 fetch_texel_2d_f_luminance_f16, /* FetchTexel2Df */ 599 fetch_texel_3d_f_luminance_f16, /* FetchTexel3Df */ 600 store_texel_luminance_f16 /* StoreTexel */ 601}; 602 603const struct gl_texture_format _mesa_texformat_luminance_alpha_float32 = { 604 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32, /* MesaFormat */ 605 GL_LUMINANCE_ALPHA, /* BaseFormat */ 606 GL_FLOAT, /* DataType */ 607 0, /* RedBits */ 608 0, /* GreenBits */ 609 0, /* BlueBits */ 610 8 * sizeof(GLfloat), /* AlphaBits */ 611 8 * sizeof(GLfloat), /* LuminanceBits */ 612 0, /* IntensityBits */ 613 0, /* IndexBits */ 614 0, /* DepthBits */ 615 0, /* StencilBits */ 616 2 * sizeof(GLfloat), /* TexelBytes */ 617 _mesa_texstore_rgba_float32, /* StoreTexImageFunc */ 618 NULL, /* FetchTexel1D */ 619 NULL, /* FetchTexel2D */ 620 NULL, /* FetchTexel3D */ 621 fetch_texel_1d_f_luminance_alpha_f32,/* FetchTexel1Df */ 622 fetch_texel_2d_f_luminance_alpha_f32,/* FetchTexel2Df */ 623 fetch_texel_3d_f_luminance_alpha_f32,/* FetchTexel3Df */ 624 store_texel_luminance_alpha_f32 /* StoreTexel */ 625}; 626 627const struct gl_texture_format _mesa_texformat_luminance_alpha_float16 = { 628 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, /* MesaFormat */ 629 GL_LUMINANCE_ALPHA, /* BaseFormat */ 630 GL_FLOAT, /* DataType */ 631 0, /* RedBits */ 632 0, /* GreenBits */ 633 0, /* BlueBits */ 634 8 * sizeof(GLhalfARB), /* AlphaBits */ 635 8 * sizeof(GLhalfARB), /* LuminanceBits */ 636 0, /* IntensityBits */ 637 0, /* IndexBits */ 638 0, /* DepthBits */ 639 0, /* StencilBits */ 640 2 * sizeof(GLhalfARB), /* TexelBytes */ 641 _mesa_texstore_rgba_float16, /* StoreTexImageFunc */ 642 NULL, /* FetchTexel1D */ 643 NULL, /* FetchTexel2D */ 644 NULL, /* FetchTexel3D */ 645 fetch_texel_1d_f_luminance_alpha_f16,/* FetchTexel1Df */ 646 fetch_texel_2d_f_luminance_alpha_f16,/* FetchTexel2Df */ 647 fetch_texel_3d_f_luminance_alpha_f16,/* FetchTexel3Df */ 648 store_texel_luminance_alpha_f16 /* StoreTexel */ 649}; 650 651const struct gl_texture_format _mesa_texformat_intensity_float32 = { 652 MESA_FORMAT_INTENSITY_FLOAT32, /* MesaFormat */ 653 GL_INTENSITY, /* BaseFormat */ 654 GL_FLOAT, /* DataType */ 655 0, /* RedBits */ 656 0, /* GreenBits */ 657 0, /* BlueBits */ 658 0, /* AlphaBits */ 659 0, /* LuminanceBits */ 660 8 * sizeof(GLfloat), /* IntensityBits */ 661 0, /* IndexBits */ 662 0, /* DepthBits */ 663 0, /* StencilBits */ 664 1 * sizeof(GLfloat), /* TexelBytes */ 665 _mesa_texstore_rgba_float32,/*yes*/ /* StoreTexImageFunc */ 666 NULL, /* FetchTexel1D */ 667 NULL, /* FetchTexel2D */ 668 NULL, /* FetchTexel3D */ 669 fetch_texel_1d_f_intensity_f32, /* FetchTexel1Df */ 670 fetch_texel_2d_f_intensity_f32, /* FetchTexel2Df */ 671 fetch_texel_3d_f_intensity_f32, /* FetchTexel3Df */ 672 store_texel_intensity_f32 /* StoreTexel */ 673}; 674 675const struct gl_texture_format _mesa_texformat_intensity_float16 = { 676 MESA_FORMAT_INTENSITY_FLOAT16, /* MesaFormat */ 677 GL_INTENSITY, /* BaseFormat */ 678 GL_FLOAT, /* DataType */ 679 0, /* RedBits */ 680 0, /* GreenBits */ 681 0, /* BlueBits */ 682 0, /* AlphaBits */ 683 0, /* LuminanceBits */ 684 8 * sizeof(GLhalfARB), /* IntensityBits */ 685 0, /* IndexBits */ 686 0, /* DepthBits */ 687 0, /* StencilBits */ 688 1 * sizeof(GLhalfARB), /* TexelBytes */ 689 _mesa_texstore_rgba_float16,/*yes*/ /* StoreTexImageFunc */ 690 NULL, /* FetchTexel1D */ 691 NULL, /* FetchTexel2D */ 692 NULL, /* FetchTexel3D */ 693 fetch_texel_1d_f_intensity_f16, /* FetchTexel1Df */ 694 fetch_texel_2d_f_intensity_f16, /* FetchTexel2Df */ 695 fetch_texel_3d_f_intensity_f16, /* FetchTexel3Df */ 696 store_texel_intensity_f16 /* StoreTexel */ 697}; 698 699const struct gl_texture_format _mesa_texformat_dudv8 = { 700 MESA_FORMAT_DUDV8, /* MesaFormat */ 701 GL_DUDV_ATI, /* BaseFormat */ 702 GL_SIGNED_NORMALIZED, /* DataType */ 703 /* maybe should add dudvBits field, but spec seems to be 704 lacking the ability to query with GetTexLevelParameter anyway */ 705 0, /* RedBits */ 706 0, /* GreenBits */ 707 0, /* BlueBits */ 708 0, /* AlphaBits */ 709 0, /* LuminanceBits */ 710 0, /* IntensityBits */ 711 0, /* IndexBits */ 712 0, /* DepthBits */ 713 0, /* StencilBits */ 714 2, /* TexelBytes */ 715 _mesa_texstore_dudv8, /* StoreTexImageFunc */ 716 NULL, /* FetchTexel1D */ 717 NULL, /* FetchTexel2D */ 718 NULL, /* FetchTexel3D */ 719 fetch_texel_1d_dudv8, /* FetchTexel1Df */ 720 fetch_texel_2d_dudv8, /* FetchTexel2Df */ 721 fetch_texel_3d_dudv8, /* FetchTexel3Df */ 722 NULL /* StoreTexel */ 723}; 724 725const struct gl_texture_format _mesa_texformat_signed_rgba8888 = { 726 MESA_FORMAT_SIGNED_RGBA8888, /* MesaFormat */ 727 GL_RGBA, /* BaseFormat */ 728 GL_SIGNED_NORMALIZED, /* DataType */ 729 8, /* RedBits */ 730 8, /* GreenBits */ 731 8, /* BlueBits */ 732 8, /* AlphaBits */ 733 0, /* LuminanceBits */ 734 0, /* IntensityBits */ 735 0, /* IndexBits */ 736 0, /* DepthBits */ 737 0, /* StencilBits */ 738 4, /* TexelBytes */ 739 _mesa_texstore_signed_rgba8888, /* StoreTexImageFunc */ 740 NULL, /* FetchTexel1D */ 741 NULL, /* FetchTexel2D */ 742 NULL, /* FetchTexel3D */ 743 fetch_texel_1d_signed_rgba8888, /* FetchTexel1Df */ 744 fetch_texel_2d_signed_rgba8888, /* FetchTexel2Df */ 745 fetch_texel_3d_signed_rgba8888, /* FetchTexel3Df */ 746 store_texel_signed_rgba8888 /* StoreTexel */ 747}; 748 749const struct gl_texture_format _mesa_texformat_signed_rgba8888_rev = { 750 MESA_FORMAT_SIGNED_RGBA8888_REV, /* MesaFormat */ 751 GL_RGBA, /* BaseFormat */ 752 GL_SIGNED_NORMALIZED, /* DataType */ 753 8, /* RedBits */ 754 8, /* GreenBits */ 755 8, /* BlueBits */ 756 8, /* AlphaBits */ 757 0, /* LuminanceBits */ 758 0, /* IntensityBits */ 759 0, /* IndexBits */ 760 0, /* DepthBits */ 761 0, /* StencilBits */ 762 4, /* TexelBytes */ 763 _mesa_texstore_signed_rgba8888, /* StoreTexImageFunc */ 764 NULL, /* FetchTexel1D */ 765 NULL, /* FetchTexel2D */ 766 NULL, /* FetchTexel3D */ 767 fetch_texel_1d_signed_rgba8888_rev, /* FetchTexel1Df */ 768 fetch_texel_2d_signed_rgba8888_rev, /* FetchTexel2Df */ 769 fetch_texel_3d_signed_rgba8888_rev, /* FetchTexel3Df */ 770 store_texel_signed_rgba8888_rev /* StoreTexel */ 771}; 772 773/*@}*/ 774 775 776/***************************************************************/ 777/** \name Hardware formats */ 778/*@{*/ 779 780const struct gl_texture_format _mesa_texformat_rgba8888 = { 781 MESA_FORMAT_RGBA8888, /* MesaFormat */ 782 GL_RGBA, /* BaseFormat */ 783 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 784 8, /* RedBits */ 785 8, /* GreenBits */ 786 8, /* BlueBits */ 787 8, /* AlphaBits */ 788 0, /* LuminanceBits */ 789 0, /* IntensityBits */ 790 0, /* IndexBits */ 791 0, /* DepthBits */ 792 0, /* StencilBits */ 793 4, /* TexelBytes */ 794 _mesa_texstore_rgba8888, /* StoreTexImageFunc */ 795 fetch_texel_1d_rgba8888, /* FetchTexel1D */ 796 fetch_texel_2d_rgba8888, /* FetchTexel2D */ 797 fetch_texel_3d_rgba8888, /* FetchTexel3D */ 798 NULL, /* FetchTexel1Df */ 799 NULL, /* FetchTexel2Df */ 800 NULL, /* FetchTexel3Df */ 801 store_texel_rgba8888 /* StoreTexel */ 802}; 803 804const struct gl_texture_format _mesa_texformat_rgba8888_rev = { 805 MESA_FORMAT_RGBA8888_REV, /* MesaFormat */ 806 GL_RGBA, /* BaseFormat */ 807 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 808 8, /* RedBits */ 809 8, /* GreenBits */ 810 8, /* BlueBits */ 811 8, /* AlphaBits */ 812 0, /* LuminanceBits */ 813 0, /* IntensityBits */ 814 0, /* IndexBits */ 815 0, /* DepthBits */ 816 0, /* StencilBits */ 817 4, /* TexelBytes */ 818 _mesa_texstore_rgba8888, /* StoreTexImageFunc */ 819 fetch_texel_1d_rgba8888_rev, /* FetchTexel1D */ 820 fetch_texel_2d_rgba8888_rev, /* FetchTexel2D */ 821 fetch_texel_3d_rgba8888_rev, /* FetchTexel3D */ 822 NULL, /* FetchTexel1Df */ 823 NULL, /* FetchTexel2Df */ 824 NULL, /* FetchTexel3Df */ 825 store_texel_rgba8888_rev /* StoreTexel */ 826}; 827 828const struct gl_texture_format _mesa_texformat_argb8888 = { 829 MESA_FORMAT_ARGB8888, /* MesaFormat */ 830 GL_RGBA, /* BaseFormat */ 831 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 832 8, /* RedBits */ 833 8, /* GreenBits */ 834 8, /* BlueBits */ 835 8, /* AlphaBits */ 836 0, /* LuminanceBits */ 837 0, /* IntensityBits */ 838 0, /* IndexBits */ 839 0, /* DepthBits */ 840 0, /* StencilBits */ 841 4, /* TexelBytes */ 842 _mesa_texstore_argb8888, /* StoreTexImageFunc */ 843 fetch_texel_1d_argb8888, /* FetchTexel1D */ 844 fetch_texel_2d_argb8888, /* FetchTexel2D */ 845 fetch_texel_3d_argb8888, /* FetchTexel3D */ 846 NULL, /* FetchTexel1Df */ 847 NULL, /* FetchTexel2Df */ 848 NULL, /* FetchTexel3Df */ 849 store_texel_argb8888 /* StoreTexel */ 850}; 851 852const struct gl_texture_format _mesa_texformat_argb8888_rev = { 853 MESA_FORMAT_ARGB8888_REV, /* MesaFormat */ 854 GL_RGBA, /* BaseFormat */ 855 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 856 8, /* RedBits */ 857 8, /* GreenBits */ 858 8, /* BlueBits */ 859 8, /* AlphaBits */ 860 0, /* LuminanceBits */ 861 0, /* IntensityBits */ 862 0, /* IndexBits */ 863 0, /* DepthBits */ 864 0, /* StencilBits */ 865 4, /* TexelBytes */ 866 _mesa_texstore_argb8888, /* StoreTexImageFunc */ 867 fetch_texel_1d_argb8888_rev, /* FetchTexel1D */ 868 fetch_texel_2d_argb8888_rev, /* FetchTexel2D */ 869 fetch_texel_3d_argb8888_rev, /* FetchTexel3D */ 870 NULL, /* FetchTexel1Df */ 871 NULL, /* FetchTexel2Df */ 872 NULL, /* FetchTexel3Df */ 873 store_texel_argb8888_rev /* StoreTexel */ 874}; 875 876const struct gl_texture_format _mesa_texformat_rgb888 = { 877 MESA_FORMAT_RGB888, /* MesaFormat */ 878 GL_RGB, /* BaseFormat */ 879 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 880 8, /* RedBits */ 881 8, /* GreenBits */ 882 8, /* BlueBits */ 883 0, /* AlphaBits */ 884 0, /* LuminanceBits */ 885 0, /* IntensityBits */ 886 0, /* IndexBits */ 887 0, /* DepthBits */ 888 0, /* StencilBits */ 889 3, /* TexelBytes */ 890 _mesa_texstore_rgb888, /* StoreTexImageFunc */ 891 fetch_texel_1d_rgb888, /* FetchTexel1D */ 892 fetch_texel_2d_rgb888, /* FetchTexel2D */ 893 fetch_texel_3d_rgb888, /* FetchTexel3D */ 894 NULL, /* FetchTexel1Df */ 895 NULL, /* FetchTexel2Df */ 896 NULL, /* FetchTexel3Df */ 897 store_texel_rgb888 /* StoreTexel */ 898}; 899 900const struct gl_texture_format _mesa_texformat_bgr888 = { 901 MESA_FORMAT_BGR888, /* MesaFormat */ 902 GL_RGB, /* BaseFormat */ 903 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 904 8, /* RedBits */ 905 8, /* GreenBits */ 906 8, /* BlueBits */ 907 0, /* AlphaBits */ 908 0, /* LuminanceBits */ 909 0, /* IntensityBits */ 910 0, /* IndexBits */ 911 0, /* DepthBits */ 912 0, /* StencilBits */ 913 3, /* TexelBytes */ 914 _mesa_texstore_bgr888, /* StoreTexImageFunc */ 915 fetch_texel_1d_bgr888, /* FetchTexel1D */ 916 fetch_texel_2d_bgr888, /* FetchTexel2D */ 917 fetch_texel_3d_bgr888, /* FetchTexel3D */ 918 NULL, /* FetchTexel1Df */ 919 NULL, /* FetchTexel2Df */ 920 NULL, /* FetchTexel3Df */ 921 store_texel_bgr888 /* StoreTexel */ 922}; 923 924const struct gl_texture_format _mesa_texformat_rgb565 = { 925 MESA_FORMAT_RGB565, /* MesaFormat */ 926 GL_RGB, /* BaseFormat */ 927 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 928 5, /* RedBits */ 929 6, /* GreenBits */ 930 5, /* BlueBits */ 931 0, /* AlphaBits */ 932 0, /* LuminanceBits */ 933 0, /* IntensityBits */ 934 0, /* IndexBits */ 935 0, /* DepthBits */ 936 0, /* StencilBits */ 937 2, /* TexelBytes */ 938 _mesa_texstore_rgb565, /* StoreTexImageFunc */ 939 fetch_texel_1d_rgb565, /* FetchTexel1D */ 940 fetch_texel_2d_rgb565, /* FetchTexel2D */ 941 fetch_texel_3d_rgb565, /* FetchTexel3D */ 942 NULL, /* FetchTexel1Df */ 943 NULL, /* FetchTexel2Df */ 944 NULL, /* FetchTexel3Df */ 945 store_texel_rgb565 /* StoreTexel */ 946}; 947 948const struct gl_texture_format _mesa_texformat_rgb565_rev = { 949 MESA_FORMAT_RGB565_REV, /* MesaFormat */ 950 GL_RGB, /* BaseFormat */ 951 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 952 5, /* RedBits */ 953 6, /* GreenBits */ 954 5, /* BlueBits */ 955 0, /* AlphaBits */ 956 0, /* LuminanceBits */ 957 0, /* IntensityBits */ 958 0, /* IndexBits */ 959 0, /* DepthBits */ 960 0, /* StencilBits */ 961 2, /* TexelBytes */ 962 _mesa_texstore_rgb565, /* StoreTexImageFunc */ 963 fetch_texel_1d_rgb565_rev, /* FetchTexel1D */ 964 fetch_texel_2d_rgb565_rev, /* FetchTexel2D */ 965 fetch_texel_3d_rgb565_rev, /* FetchTexel3D */ 966 NULL, /* FetchTexel1Df */ 967 NULL, /* FetchTexel2Df */ 968 NULL, /* FetchTexel3Df */ 969 store_texel_rgb565_rev /* StoreTexel */ 970}; 971 972const struct gl_texture_format _mesa_texformat_rgba4444 = { 973 MESA_FORMAT_RGBA4444, /* MesaFormat */ 974 GL_RGBA, /* BaseFormat */ 975 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 976 4, /* RedBits */ 977 4, /* GreenBits */ 978 4, /* BlueBits */ 979 4, /* AlphaBits */ 980 0, /* LuminanceBits */ 981 0, /* IntensityBits */ 982 0, /* IndexBits */ 983 0, /* DepthBits */ 984 0, /* StencilBits */ 985 2, /* TexelBytes */ 986 _mesa_texstore_rgba4444, /* StoreTexImageFunc */ 987 fetch_texel_1d_rgba4444, /* FetchTexel1D */ 988 fetch_texel_2d_rgba4444, /* FetchTexel2D */ 989 fetch_texel_3d_rgba4444, /* FetchTexel3D */ 990 NULL, /* FetchTexel1Df */ 991 NULL, /* FetchTexel2Df */ 992 NULL, /* FetchTexel3Df */ 993 store_texel_rgba4444 /* StoreTexel */ 994}; 995 996const struct gl_texture_format _mesa_texformat_argb4444 = { 997 MESA_FORMAT_ARGB4444, /* MesaFormat */ 998 GL_RGBA, /* BaseFormat */ 999 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1000 4, /* RedBits */ 1001 4, /* GreenBits */ 1002 4, /* BlueBits */ 1003 4, /* AlphaBits */ 1004 0, /* LuminanceBits */ 1005 0, /* IntensityBits */ 1006 0, /* IndexBits */ 1007 0, /* DepthBits */ 1008 0, /* StencilBits */ 1009 2, /* TexelBytes */ 1010 _mesa_texstore_argb4444, /* StoreTexImageFunc */ 1011 fetch_texel_1d_argb4444, /* FetchTexel1D */ 1012 fetch_texel_2d_argb4444, /* FetchTexel2D */ 1013 fetch_texel_3d_argb4444, /* FetchTexel3D */ 1014 NULL, /* FetchTexel1Df */ 1015 NULL, /* FetchTexel2Df */ 1016 NULL, /* FetchTexel3Df */ 1017 store_texel_argb4444 /* StoreTexel */ 1018}; 1019 1020const struct gl_texture_format _mesa_texformat_argb4444_rev = { 1021 MESA_FORMAT_ARGB4444_REV, /* MesaFormat */ 1022 GL_RGBA, /* BaseFormat */ 1023 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1024 4, /* RedBits */ 1025 4, /* GreenBits */ 1026 4, /* BlueBits */ 1027 4, /* AlphaBits */ 1028 0, /* LuminanceBits */ 1029 0, /* IntensityBits */ 1030 0, /* IndexBits */ 1031 0, /* DepthBits */ 1032 0, /* StencilBits */ 1033 2, /* TexelBytes */ 1034 _mesa_texstore_argb4444, /* StoreTexImageFunc */ 1035 fetch_texel_1d_argb4444_rev, /* FetchTexel1D */ 1036 fetch_texel_2d_argb4444_rev, /* FetchTexel2D */ 1037 fetch_texel_3d_argb4444_rev, /* FetchTexel3D */ 1038 NULL, /* FetchTexel1Df */ 1039 NULL, /* FetchTexel2Df */ 1040 NULL, /* FetchTexel3Df */ 1041 store_texel_argb4444_rev /* StoreTexel */ 1042}; 1043 1044const struct gl_texture_format _mesa_texformat_rgba5551 = { 1045 MESA_FORMAT_RGBA5551, /* MesaFormat */ 1046 GL_RGBA, /* BaseFormat */ 1047 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1048 5, /* RedBits */ 1049 5, /* GreenBits */ 1050 5, /* BlueBits */ 1051 1, /* AlphaBits */ 1052 0, /* LuminanceBits */ 1053 0, /* IntensityBits */ 1054 0, /* IndexBits */ 1055 0, /* DepthBits */ 1056 0, /* StencilBits */ 1057 2, /* TexelBytes */ 1058 _mesa_texstore_rgba5551, /* StoreTexImageFunc */ 1059 fetch_texel_1d_rgba5551, /* FetchTexel1D */ 1060 fetch_texel_2d_rgba5551, /* FetchTexel2D */ 1061 fetch_texel_3d_rgba5551, /* FetchTexel3D */ 1062 NULL, /* FetchTexel1Df */ 1063 NULL, /* FetchTexel2Df */ 1064 NULL, /* FetchTexel3Df */ 1065 store_texel_rgba5551 /* StoreTexel */ 1066}; 1067 1068const struct gl_texture_format _mesa_texformat_argb1555 = { 1069 MESA_FORMAT_ARGB1555, /* MesaFormat */ 1070 GL_RGBA, /* BaseFormat */ 1071 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1072 5, /* RedBits */ 1073 5, /* GreenBits */ 1074 5, /* BlueBits */ 1075 1, /* AlphaBits */ 1076 0, /* LuminanceBits */ 1077 0, /* IntensityBits */ 1078 0, /* IndexBits */ 1079 0, /* DepthBits */ 1080 0, /* StencilBits */ 1081 2, /* TexelBytes */ 1082 _mesa_texstore_argb1555, /* StoreTexImageFunc */ 1083 fetch_texel_1d_argb1555, /* FetchTexel1D */ 1084 fetch_texel_2d_argb1555, /* FetchTexel2D */ 1085 fetch_texel_3d_argb1555, /* FetchTexel3D */ 1086 NULL, /* FetchTexel1Df */ 1087 NULL, /* FetchTexel2Df */ 1088 NULL, /* FetchTexel3Df */ 1089 store_texel_argb1555 /* StoreTexel */ 1090}; 1091 1092const struct gl_texture_format _mesa_texformat_argb1555_rev = { 1093 MESA_FORMAT_ARGB1555_REV, /* MesaFormat */ 1094 GL_RGBA, /* BaseFormat */ 1095 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1096 5, /* RedBits */ 1097 5, /* GreenBits */ 1098 5, /* BlueBits */ 1099 1, /* AlphaBits */ 1100 0, /* LuminanceBits */ 1101 0, /* IntensityBits */ 1102 0, /* IndexBits */ 1103 0, /* DepthBits */ 1104 0, /* StencilBits */ 1105 2, /* TexelBytes */ 1106 _mesa_texstore_argb1555, /* StoreTexImageFunc */ 1107 fetch_texel_1d_argb1555_rev, /* FetchTexel1D */ 1108 fetch_texel_2d_argb1555_rev, /* FetchTexel2D */ 1109 fetch_texel_3d_argb1555_rev, /* FetchTexel3D */ 1110 NULL, /* FetchTexel1Df */ 1111 NULL, /* FetchTexel2Df */ 1112 NULL, /* FetchTexel3Df */ 1113 store_texel_argb1555_rev /* StoreTexel */ 1114}; 1115 1116const struct gl_texture_format _mesa_texformat_al88 = { 1117 MESA_FORMAT_AL88, /* MesaFormat */ 1118 GL_LUMINANCE_ALPHA, /* BaseFormat */ 1119 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1120 0, /* RedBits */ 1121 0, /* GreenBits */ 1122 0, /* BlueBits */ 1123 8, /* AlphaBits */ 1124 8, /* LuminanceBits */ 1125 0, /* IntensityBits */ 1126 0, /* IndexBits */ 1127 0, /* DepthBits */ 1128 0, /* StencilBits */ 1129 2, /* TexelBytes */ 1130 _mesa_texstore_al88, /* StoreTexImageFunc */ 1131 fetch_texel_1d_al88, /* FetchTexel1D */ 1132 fetch_texel_2d_al88, /* FetchTexel2D */ 1133 fetch_texel_3d_al88, /* FetchTexel3D */ 1134 NULL, /* FetchTexel1Df */ 1135 NULL, /* FetchTexel2Df */ 1136 NULL, /* FetchTexel3Df */ 1137 store_texel_al88 /* StoreTexel */ 1138}; 1139 1140const struct gl_texture_format _mesa_texformat_al88_rev = { 1141 MESA_FORMAT_AL88_REV, /* MesaFormat */ 1142 GL_LUMINANCE_ALPHA, /* BaseFormat */ 1143 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1144 0, /* RedBits */ 1145 0, /* GreenBits */ 1146 0, /* BlueBits */ 1147 8, /* AlphaBits */ 1148 8, /* LuminanceBits */ 1149 0, /* IntensityBits */ 1150 0, /* IndexBits */ 1151 0, /* DepthBits */ 1152 0, /* StencilBits */ 1153 2, /* TexelBytes */ 1154 _mesa_texstore_al88, /* StoreTexImageFunc */ 1155 fetch_texel_1d_al88_rev, /* FetchTexel1D */ 1156 fetch_texel_2d_al88_rev, /* FetchTexel2D */ 1157 fetch_texel_3d_al88_rev, /* FetchTexel3D */ 1158 NULL, /* FetchTexel1Df */ 1159 NULL, /* FetchTexel2Df */ 1160 NULL, /* FetchTexel3Df */ 1161 store_texel_al88_rev /* StoreTexel */ 1162}; 1163 1164const struct gl_texture_format _mesa_texformat_rgb332 = { 1165 MESA_FORMAT_RGB332, /* MesaFormat */ 1166 GL_RGB, /* BaseFormat */ 1167 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1168 3, /* RedBits */ 1169 3, /* GreenBits */ 1170 2, /* BlueBits */ 1171 0, /* AlphaBits */ 1172 0, /* LuminanceBits */ 1173 0, /* IntensityBits */ 1174 0, /* IndexBits */ 1175 0, /* DepthBits */ 1176 0, /* StencilBits */ 1177 1, /* TexelBytes */ 1178 _mesa_texstore_rgb332, /* StoreTexImageFunc */ 1179 fetch_texel_1d_rgb332, /* FetchTexel1D */ 1180 fetch_texel_2d_rgb332, /* FetchTexel2D */ 1181 fetch_texel_3d_rgb332, /* FetchTexel3D */ 1182 NULL, /* FetchTexel1Df */ 1183 NULL, /* FetchTexel2Df */ 1184 NULL, /* FetchTexel3Df */ 1185 store_texel_rgb332 /* StoreTexel */ 1186}; 1187 1188const struct gl_texture_format _mesa_texformat_a8 = { 1189 MESA_FORMAT_A8, /* MesaFormat */ 1190 GL_ALPHA, /* BaseFormat */ 1191 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1192 0, /* RedBits */ 1193 0, /* GreenBits */ 1194 0, /* BlueBits */ 1195 8, /* AlphaBits */ 1196 0, /* LuminanceBits */ 1197 0, /* IntensityBits */ 1198 0, /* IndexBits */ 1199 0, /* DepthBits */ 1200 0, /* StencilBits */ 1201 1, /* TexelBytes */ 1202 _mesa_texstore_a8, /* StoreTexImageFunc */ 1203 fetch_texel_1d_a8, /* FetchTexel1D */ 1204 fetch_texel_2d_a8, /* FetchTexel2D */ 1205 fetch_texel_3d_a8, /* FetchTexel3D */ 1206 NULL, /* FetchTexel1Df */ 1207 NULL, /* FetchTexel2Df */ 1208 NULL, /* FetchTexel3Df */ 1209 store_texel_a8 /* StoreTexel */ 1210}; 1211 1212const struct gl_texture_format _mesa_texformat_l8 = { 1213 MESA_FORMAT_L8, /* MesaFormat */ 1214 GL_LUMINANCE, /* BaseFormat */ 1215 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1216 0, /* RedBits */ 1217 0, /* GreenBits */ 1218 0, /* BlueBits */ 1219 0, /* AlphaBits */ 1220 8, /* LuminanceBits */ 1221 0, /* IntensityBits */ 1222 0, /* IndexBits */ 1223 0, /* DepthBits */ 1224 0, /* StencilBits */ 1225 1, /* TexelBytes */ 1226 _mesa_texstore_a8,/*yes*/ /* StoreTexImageFunc */ 1227 fetch_texel_1d_l8, /* FetchTexel1D */ 1228 fetch_texel_2d_l8, /* FetchTexel2D */ 1229 fetch_texel_3d_l8, /* FetchTexel3D */ 1230 NULL, /* FetchTexel1Df */ 1231 NULL, /* FetchTexel2Df */ 1232 NULL, /* FetchTexel3Df */ 1233 store_texel_l8 /* StoreTexel */ 1234}; 1235 1236const struct gl_texture_format _mesa_texformat_i8 = { 1237 MESA_FORMAT_I8, /* MesaFormat */ 1238 GL_INTENSITY, /* BaseFormat */ 1239 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1240 0, /* RedBits */ 1241 0, /* GreenBits */ 1242 0, /* BlueBits */ 1243 0, /* AlphaBits */ 1244 0, /* LuminanceBits */ 1245 8, /* IntensityBits */ 1246 0, /* IndexBits */ 1247 0, /* DepthBits */ 1248 0, /* StencilBits */ 1249 1, /* TexelBytes */ 1250 _mesa_texstore_a8,/*yes*/ /* StoreTexImageFunc */ 1251 fetch_texel_1d_i8, /* FetchTexel1D */ 1252 fetch_texel_2d_i8, /* FetchTexel2D */ 1253 fetch_texel_3d_i8, /* FetchTexel3D */ 1254 NULL, /* FetchTexel1Df */ 1255 NULL, /* FetchTexel2Df */ 1256 NULL, /* FetchTexel3Df */ 1257 store_texel_i8 /* StoreTexel */ 1258}; 1259 1260const struct gl_texture_format _mesa_texformat_ci8 = { 1261 MESA_FORMAT_CI8, /* MesaFormat */ 1262 GL_COLOR_INDEX, /* BaseFormat */ 1263 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1264 0, /* RedBits */ 1265 0, /* GreenBits */ 1266 0, /* BlueBits */ 1267 0, /* AlphaBits */ 1268 0, /* LuminanceBits */ 1269 0, /* IntensityBits */ 1270 8, /* IndexBits */ 1271 0, /* DepthBits */ 1272 0, /* StencilBits */ 1273 1, /* TexelBytes */ 1274 _mesa_texstore_ci8, /* StoreTexImageFunc */ 1275 fetch_texel_1d_ci8, /* FetchTexel1D */ 1276 fetch_texel_2d_ci8, /* FetchTexel2D */ 1277 fetch_texel_3d_ci8, /* FetchTexel3D */ 1278 NULL, /* FetchTexel1Df */ 1279 NULL, /* FetchTexel2Df */ 1280 NULL, /* FetchTexel3Df */ 1281 store_texel_ci8 /* StoreTexel */ 1282}; 1283 1284const struct gl_texture_format _mesa_texformat_ycbcr = { 1285 MESA_FORMAT_YCBCR, /* MesaFormat */ 1286 GL_YCBCR_MESA, /* BaseFormat */ 1287 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1288 0, /* RedBits */ 1289 0, /* GreenBits */ 1290 0, /* BlueBits */ 1291 0, /* AlphaBits */ 1292 0, /* LuminanceBits */ 1293 0, /* IntensityBits */ 1294 0, /* IndexBits */ 1295 0, /* DepthBits */ 1296 0, /* StencilBits */ 1297 2, /* TexelBytes */ 1298 _mesa_texstore_ycbcr, /* StoreTexImageFunc */ 1299 fetch_texel_1d_ycbcr, /* FetchTexel1D */ 1300 fetch_texel_2d_ycbcr, /* FetchTexel2D */ 1301 fetch_texel_3d_ycbcr, /* FetchTexel3D */ 1302 NULL, /* FetchTexel1Df */ 1303 NULL, /* FetchTexel2Df */ 1304 NULL, /* FetchTexel3Df */ 1305 store_texel_ycbcr /* StoreTexel */ 1306}; 1307 1308const struct gl_texture_format _mesa_texformat_ycbcr_rev = { 1309 MESA_FORMAT_YCBCR_REV, /* MesaFormat */ 1310 GL_YCBCR_MESA, /* BaseFormat */ 1311 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1312 0, /* RedBits */ 1313 0, /* GreenBits */ 1314 0, /* BlueBits */ 1315 0, /* AlphaBits */ 1316 0, /* LuminanceBits */ 1317 0, /* IntensityBits */ 1318 0, /* IndexBits */ 1319 0, /* DepthBits */ 1320 0, /* StencilBits */ 1321 2, /* TexelBytes */ 1322 _mesa_texstore_ycbcr, /* StoreTexImageFunc */ 1323 fetch_texel_1d_ycbcr_rev, /* FetchTexel1D */ 1324 fetch_texel_2d_ycbcr_rev, /* FetchTexel2D */ 1325 fetch_texel_3d_ycbcr_rev, /* FetchTexel3D */ 1326 NULL, /* FetchTexel1Df */ 1327 NULL, /* FetchTexel2Df */ 1328 NULL, /* FetchTexel3Df */ 1329 store_texel_ycbcr_rev /* StoreTexel */ 1330}; 1331 1332const struct gl_texture_format _mesa_texformat_z24_s8 = { 1333 MESA_FORMAT_Z24_S8, /* MesaFormat */ 1334 GL_DEPTH_STENCIL_EXT, /* BaseFormat */ 1335 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1336 0, /* RedBits */ 1337 0, /* GreenBits */ 1338 0, /* BlueBits */ 1339 0, /* AlphaBits */ 1340 0, /* LuminanceBits */ 1341 0, /* IntensityBits */ 1342 0, /* IndexBits */ 1343 24, /* DepthBits */ 1344 8, /* StencilBits */ 1345 4, /* TexelBytes */ 1346 _mesa_texstore_z24_s8, /* StoreTexImageFunc */ 1347 NULL, /* FetchTexel1D */ 1348 NULL, /* FetchTexel2D */ 1349 NULL, /* FetchTexel3D */ 1350 fetch_texel_1d_f_z24_s8, /* FetchTexel1Df */ 1351 fetch_texel_2d_f_z24_s8, /* FetchTexel2Df */ 1352 fetch_texel_3d_f_z24_s8, /* FetchTexel3Df */ 1353 store_texel_z24_s8 /* StoreTexel */ 1354}; 1355 1356const struct gl_texture_format _mesa_texformat_s8_z24 = { 1357 MESA_FORMAT_S8_Z24, /* MesaFormat */ 1358 GL_DEPTH_STENCIL_EXT, /* BaseFormat */ 1359 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1360 0, /* RedBits */ 1361 0, /* GreenBits */ 1362 0, /* BlueBits */ 1363 0, /* AlphaBits */ 1364 0, /* LuminanceBits */ 1365 0, /* IntensityBits */ 1366 0, /* IndexBits */ 1367 24, /* DepthBits */ 1368 8, /* StencilBits */ 1369 4, /* TexelBytes */ 1370 _mesa_texstore_s8_z24, /* StoreTexImageFunc */ 1371 NULL, /* FetchTexel1D */ 1372 NULL, /* FetchTexel2D */ 1373 NULL, /* FetchTexel3D */ 1374 fetch_texel_1d_f_s8_z24, /* FetchTexel1Df */ 1375 fetch_texel_2d_f_s8_z24, /* FetchTexel2Df */ 1376 fetch_texel_3d_f_s8_z24, /* FetchTexel3Df */ 1377 store_texel_s8_z24 /* StoreTexel */ 1378}; 1379 1380const struct gl_texture_format _mesa_texformat_z16 = { 1381 MESA_FORMAT_Z16, /* MesaFormat */ 1382 GL_DEPTH_COMPONENT, /* BaseFormat */ 1383 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1384 0, /* RedBits */ 1385 0, /* GreenBits */ 1386 0, /* BlueBits */ 1387 0, /* AlphaBits */ 1388 0, /* LuminanceBits */ 1389 0, /* IntensityBits */ 1390 0, /* IndexBits */ 1391 sizeof(GLushort) * 8, /* DepthBits */ 1392 0, /* StencilBits */ 1393 sizeof(GLushort), /* TexelBytes */ 1394 _mesa_texstore_z16, /* StoreTexImageFunc */ 1395 NULL, /* FetchTexel1D */ 1396 NULL, /* FetchTexel1D */ 1397 NULL, /* FetchTexel1D */ 1398 fetch_texel_1d_f_z16, /* FetchTexel1Df */ 1399 fetch_texel_2d_f_z16, /* FetchTexel2Df */ 1400 fetch_texel_3d_f_z16, /* FetchTexel3Df */ 1401 store_texel_z16 /* StoreTexel */ 1402}; 1403 1404const struct gl_texture_format _mesa_texformat_z32 = { 1405 MESA_FORMAT_Z32, /* MesaFormat */ 1406 GL_DEPTH_COMPONENT, /* BaseFormat */ 1407 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1408 0, /* RedBits */ 1409 0, /* GreenBits */ 1410 0, /* BlueBits */ 1411 0, /* AlphaBits */ 1412 0, /* LuminanceBits */ 1413 0, /* IntensityBits */ 1414 0, /* IndexBits */ 1415 sizeof(GLuint) * 8, /* DepthBits */ 1416 0, /* StencilBits */ 1417 sizeof(GLuint), /* TexelBytes */ 1418 _mesa_texstore_z32, /* StoreTexImageFunc */ 1419 NULL, /* FetchTexel1D */ 1420 NULL, /* FetchTexel1D */ 1421 NULL, /* FetchTexel1D */ 1422 fetch_texel_1d_f_z32, /* FetchTexel1Df */ 1423 fetch_texel_2d_f_z32, /* FetchTexel2Df */ 1424 fetch_texel_3d_f_z32, /* FetchTexel3Df */ 1425 store_texel_z32 /* StoreTexel */ 1426}; 1427 1428/*@}*/ 1429 1430 1431/***************************************************************/ 1432/** \name Null format (useful for proxy textures) */ 1433/*@{*/ 1434 1435const struct gl_texture_format _mesa_null_texformat = { 1436 -1, /* MesaFormat */ 1437 0, /* BaseFormat */ 1438 GL_NONE, /* DataType */ 1439 0, /* RedBits */ 1440 0, /* GreenBits */ 1441 0, /* BlueBits */ 1442 0, /* AlphaBits */ 1443 0, /* LuminanceBits */ 1444 0, /* IntensityBits */ 1445 0, /* IndexBits */ 1446 0, /* DepthBits */ 1447 0, /* StencilBits */ 1448 0, /* TexelBytes */ 1449 NULL, /* StoreTexImageFunc */ 1450 fetch_null_texel, /* FetchTexel1D */ 1451 fetch_null_texel, /* FetchTexel2D */ 1452 fetch_null_texel, /* FetchTexel3D */ 1453 fetch_null_texelf, /* FetchTexel1Df */ 1454 fetch_null_texelf, /* FetchTexel2Df */ 1455 fetch_null_texelf, /* FetchTexel3Df */ 1456 store_null_texel /* StoreTexel */ 1457}; 1458 1459/*@}*/ 1460 1461 1462/** 1463 * Choose an appropriate texture format given the format, type and 1464 * internalFormat parameters passed to glTexImage(). 1465 * 1466 * \param ctx the GL context. 1467 * \param internalFormat user's prefered internal texture format. 1468 * \param format incoming image pixel format. 1469 * \param type incoming image data type. 1470 * 1471 * \return a pointer to a gl_texture_format object which describes the 1472 * choosen texture format, or NULL on failure. 1473 * 1474 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers 1475 * will typically override this function with a specialized version. 1476 */ 1477const struct gl_texture_format * 1478_mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat, 1479 GLenum format, GLenum type ) 1480{ 1481 (void) format; 1482 (void) type; 1483 1484 switch (internalFormat) { 1485 /* RGBA formats */ 1486 case 4: 1487 case GL_RGBA: 1488 case GL_RGB10_A2: 1489 case GL_RGBA12: 1490 case GL_RGBA16: 1491 return &_mesa_texformat_rgba; 1492 case GL_RGBA8: 1493 return &_mesa_texformat_rgba8888; 1494 case GL_RGB5_A1: 1495 return &_mesa_texformat_argb1555; 1496 case GL_RGBA2: 1497 return &_mesa_texformat_argb4444_rev; /* just to test another format*/ 1498 case GL_RGBA4: 1499 return &_mesa_texformat_argb4444; 1500 1501 /* RGB formats */ 1502 case 3: 1503 case GL_RGB: 1504 case GL_RGB10: 1505 case GL_RGB12: 1506 case GL_RGB16: 1507 return &_mesa_texformat_rgb; 1508 case GL_RGB8: 1509 return &_mesa_texformat_rgb888; 1510 case GL_R3_G3_B2: 1511 return &_mesa_texformat_rgb332; 1512 case GL_RGB4: 1513 return &_mesa_texformat_rgb565_rev; /* just to test another format */ 1514 case GL_RGB5: 1515 return &_mesa_texformat_rgb565; 1516 1517 /* Alpha formats */ 1518 case GL_ALPHA: 1519 case GL_ALPHA4: 1520 case GL_ALPHA12: 1521 case GL_ALPHA16: 1522 return &_mesa_texformat_alpha; 1523 case GL_ALPHA8: 1524 return &_mesa_texformat_a8; 1525 1526 /* Luminance formats */ 1527 case 1: 1528 case GL_LUMINANCE: 1529 case GL_LUMINANCE4: 1530 case GL_LUMINANCE12: 1531 case GL_LUMINANCE16: 1532 return &_mesa_texformat_luminance; 1533 case GL_LUMINANCE8: 1534 return &_mesa_texformat_l8; 1535 1536 /* Luminance/Alpha formats */ 1537 case 2: 1538 case GL_LUMINANCE_ALPHA: 1539 case GL_LUMINANCE4_ALPHA4: 1540 case GL_LUMINANCE6_ALPHA2: 1541 case GL_LUMINANCE12_ALPHA4: 1542 case GL_LUMINANCE12_ALPHA12: 1543 case GL_LUMINANCE16_ALPHA16: 1544 return &_mesa_texformat_luminance_alpha; 1545 case GL_LUMINANCE8_ALPHA8: 1546 return &_mesa_texformat_al88; 1547 1548 case GL_INTENSITY: 1549 case GL_INTENSITY4: 1550 case GL_INTENSITY12: 1551 case GL_INTENSITY16: 1552 return &_mesa_texformat_intensity; 1553 case GL_INTENSITY8: 1554 return &_mesa_texformat_i8; 1555 1556 case GL_COLOR_INDEX: 1557 case GL_COLOR_INDEX1_EXT: 1558 case GL_COLOR_INDEX2_EXT: 1559 case GL_COLOR_INDEX4_EXT: 1560 case GL_COLOR_INDEX12_EXT: 1561 case GL_COLOR_INDEX16_EXT: 1562 case GL_COLOR_INDEX8_EXT: 1563 return &_mesa_texformat_ci8; 1564 1565 default: 1566 ; /* fallthrough */ 1567 } 1568 1569 if (ctx->Extensions.ARB_depth_texture) { 1570 switch (internalFormat) { 1571 case GL_DEPTH_COMPONENT: 1572 case GL_DEPTH_COMPONENT24: 1573 case GL_DEPTH_COMPONENT32: 1574 return &_mesa_texformat_z32; 1575 case GL_DEPTH_COMPONENT16: 1576 return &_mesa_texformat_z16; 1577 default: 1578 ; /* fallthrough */ 1579 } 1580 } 1581 1582 switch (internalFormat) { 1583 case GL_COMPRESSED_ALPHA_ARB: 1584 return &_mesa_texformat_alpha; 1585 case GL_COMPRESSED_LUMINANCE_ARB: 1586 return &_mesa_texformat_luminance; 1587 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: 1588 return &_mesa_texformat_luminance_alpha; 1589 case GL_COMPRESSED_INTENSITY_ARB: 1590 return &_mesa_texformat_intensity; 1591 case GL_COMPRESSED_RGB_ARB: 1592#if FEATURE_texture_fxt1 1593 if (ctx->Extensions.TDFX_texture_compression_FXT1) 1594 return &_mesa_texformat_rgb_fxt1; 1595#endif 1596#if FEATURE_texture_s3tc 1597 if (ctx->Extensions.EXT_texture_compression_s3tc || 1598 ctx->Extensions.S3_s3tc) 1599 return &_mesa_texformat_rgb_dxt1; 1600#endif 1601 return &_mesa_texformat_rgb; 1602 case GL_COMPRESSED_RGBA_ARB: 1603#if FEATURE_texture_fxt1 1604 if (ctx->Extensions.TDFX_texture_compression_FXT1) 1605 return &_mesa_texformat_rgba_fxt1; 1606#endif 1607#if FEATURE_texture_s3tc 1608 if (ctx->Extensions.EXT_texture_compression_s3tc || 1609 ctx->Extensions.S3_s3tc) 1610 return &_mesa_texformat_rgba_dxt3; /* Not rgba_dxt1, see spec */ 1611#endif 1612 return &_mesa_texformat_rgba; 1613 default: 1614 ; /* fallthrough */ 1615 } 1616 1617 if (ctx->Extensions.MESA_ycbcr_texture) { 1618 if (internalFormat == GL_YCBCR_MESA) { 1619 if (type == GL_UNSIGNED_SHORT_8_8_MESA) 1620 return &_mesa_texformat_ycbcr; 1621 else 1622 return &_mesa_texformat_ycbcr_rev; 1623 } 1624 } 1625 1626#if FEATURE_texture_fxt1 1627 if (ctx->Extensions.TDFX_texture_compression_FXT1) { 1628 switch (internalFormat) { 1629 case GL_COMPRESSED_RGB_FXT1_3DFX: 1630 return &_mesa_texformat_rgb_fxt1; 1631 case GL_COMPRESSED_RGBA_FXT1_3DFX: 1632 return &_mesa_texformat_rgba_fxt1; 1633 default: 1634 ; /* fallthrough */ 1635 } 1636 } 1637#endif 1638 1639#if FEATURE_texture_s3tc 1640 if (ctx->Extensions.EXT_texture_compression_s3tc) { 1641 switch (internalFormat) { 1642 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 1643 return &_mesa_texformat_rgb_dxt1; 1644 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 1645 return &_mesa_texformat_rgba_dxt1; 1646 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 1647 return &_mesa_texformat_rgba_dxt3; 1648 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 1649 return &_mesa_texformat_rgba_dxt5; 1650 default: 1651 ; /* fallthrough */ 1652 } 1653 } 1654 1655 if (ctx->Extensions.S3_s3tc) { 1656 switch (internalFormat) { 1657 case GL_RGB_S3TC: 1658 case GL_RGB4_S3TC: 1659 return &_mesa_texformat_rgb_dxt1; 1660 case GL_RGBA_S3TC: 1661 case GL_RGBA4_S3TC: 1662 return &_mesa_texformat_rgba_dxt3; 1663 default: 1664 ; /* fallthrough */ 1665 } 1666 } 1667#endif 1668 1669 if (ctx->Extensions.ARB_texture_float) { 1670 switch (internalFormat) { 1671 case GL_ALPHA16F_ARB: 1672 return &_mesa_texformat_alpha_float16; 1673 case GL_ALPHA32F_ARB: 1674 return &_mesa_texformat_alpha_float32; 1675 case GL_LUMINANCE16F_ARB: 1676 return &_mesa_texformat_luminance_float16; 1677 case GL_LUMINANCE32F_ARB: 1678 return &_mesa_texformat_luminance_float32; 1679 case GL_LUMINANCE_ALPHA16F_ARB: 1680 return &_mesa_texformat_luminance_alpha_float16; 1681 case GL_LUMINANCE_ALPHA32F_ARB: 1682 return &_mesa_texformat_luminance_alpha_float32; 1683 case GL_INTENSITY16F_ARB: 1684 return &_mesa_texformat_intensity_float16; 1685 case GL_INTENSITY32F_ARB: 1686 return &_mesa_texformat_intensity_float32; 1687 case GL_RGB16F_ARB: 1688 return &_mesa_texformat_rgb_float16; 1689 case GL_RGB32F_ARB: 1690 return &_mesa_texformat_rgb_float32; 1691 case GL_RGBA16F_ARB: 1692 return &_mesa_texformat_rgba_float16; 1693 case GL_RGBA32F_ARB: 1694 return &_mesa_texformat_rgba_float32; 1695 default: 1696 ; /* fallthrough */ 1697 } 1698 } 1699 1700 if (ctx->Extensions.EXT_packed_depth_stencil) { 1701 switch (internalFormat) { 1702 case GL_DEPTH_STENCIL_EXT: 1703 case GL_DEPTH24_STENCIL8_EXT: 1704 return &_mesa_texformat_z24_s8; 1705 default: 1706 ; /* fallthrough */ 1707 } 1708 } 1709 1710 if (ctx->Extensions.ATI_envmap_bumpmap) { 1711 switch (internalFormat) { 1712 case GL_DUDV_ATI: 1713 case GL_DU8DV8_ATI: 1714 return &_mesa_texformat_dudv8; 1715 default: 1716 ; /* fallthrough */ 1717 } 1718 } 1719 1720 if (ctx->Extensions.MESA_texture_signed_rgba) { 1721 switch (internalFormat) { 1722 case GL_RGBA_SNORM: 1723 case GL_RGBA8_SNORM: 1724 return &_mesa_texformat_signed_rgba8888; 1725 default: 1726 ; /* fallthrough */ 1727 } 1728 } 1729 1730 1731#if FEATURE_EXT_texture_sRGB 1732 if (ctx->Extensions.EXT_texture_sRGB) { 1733 switch (internalFormat) { 1734 case GL_SRGB_EXT: 1735 case GL_SRGB8_EXT: 1736 return &_mesa_texformat_srgb8; 1737 case GL_SRGB_ALPHA_EXT: 1738 case GL_SRGB8_ALPHA8_EXT: 1739 return &_mesa_texformat_srgba8; 1740 case GL_SLUMINANCE_EXT: 1741 case GL_SLUMINANCE8_EXT: 1742 return &_mesa_texformat_sl8; 1743 case GL_SLUMINANCE_ALPHA_EXT: 1744 case GL_SLUMINANCE8_ALPHA8_EXT: 1745 return &_mesa_texformat_sla8; 1746 case GL_COMPRESSED_SLUMINANCE_EXT: 1747 return &_mesa_texformat_sl8; 1748 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 1749 return &_mesa_texformat_sla8; 1750 case GL_COMPRESSED_SRGB_EXT: 1751#if FEATURE_texture_s3tc 1752 if (ctx->Extensions.EXT_texture_compression_s3tc) 1753 return &_mesa_texformat_srgb_dxt1; 1754#endif 1755 return &_mesa_texformat_srgb8; 1756 case GL_COMPRESSED_SRGB_ALPHA_EXT: 1757#if FEATURE_texture_s3tc 1758 if (ctx->Extensions.EXT_texture_compression_s3tc) 1759 return &_mesa_texformat_srgba_dxt3; /* Not srgba_dxt1, see spec */ 1760#endif 1761 return &_mesa_texformat_srgba8; 1762#if FEATURE_texture_s3tc 1763 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 1764 if (ctx->Extensions.EXT_texture_compression_s3tc) 1765 return &_mesa_texformat_srgb_dxt1; 1766 break; 1767 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 1768 if (ctx->Extensions.EXT_texture_compression_s3tc) 1769 return &_mesa_texformat_srgba_dxt1; 1770 break; 1771 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 1772 if (ctx->Extensions.EXT_texture_compression_s3tc) 1773 return &_mesa_texformat_srgba_dxt3; 1774 break; 1775 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 1776 if (ctx->Extensions.EXT_texture_compression_s3tc) 1777 return &_mesa_texformat_srgba_dxt5; 1778 break; 1779#endif 1780 default: 1781 ; /* fallthrough */ 1782 } 1783 } 1784#endif /* FEATURE_EXT_texture_sRGB */ 1785 1786 _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()"); 1787 return NULL; 1788} 1789 1790 1791 1792/** 1793 * Return datatype and number of components per texel for the 1794 * given gl_texture_format. 1795 */ 1796void 1797_mesa_format_to_type_and_comps(const struct gl_texture_format *format, 1798 GLenum *datatype, GLuint *comps) 1799{ 1800 switch (format->MesaFormat) { 1801 case MESA_FORMAT_RGBA8888: 1802 case MESA_FORMAT_RGBA8888_REV: 1803 case MESA_FORMAT_ARGB8888: 1804 case MESA_FORMAT_ARGB8888_REV: 1805 *datatype = CHAN_TYPE; 1806 *comps = 4; 1807 return; 1808 case MESA_FORMAT_RGB888: 1809 case MESA_FORMAT_BGR888: 1810 *datatype = GL_UNSIGNED_BYTE; 1811 *comps = 3; 1812 return; 1813 case MESA_FORMAT_RGB565: 1814 case MESA_FORMAT_RGB565_REV: 1815 *datatype = GL_UNSIGNED_SHORT_5_6_5; 1816 *comps = 3; 1817 return; 1818 1819 case MESA_FORMAT_ARGB4444: 1820 case MESA_FORMAT_ARGB4444_REV: 1821 *datatype = GL_UNSIGNED_SHORT_4_4_4_4; 1822 *comps = 4; 1823 return; 1824 1825 case MESA_FORMAT_ARGB1555: 1826 case MESA_FORMAT_ARGB1555_REV: 1827 *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV; 1828 *comps = 4; 1829 return; 1830 1831 case MESA_FORMAT_AL88: 1832 case MESA_FORMAT_AL88_REV: 1833 *datatype = GL_UNSIGNED_BYTE; 1834 *comps = 2; 1835 return; 1836 case MESA_FORMAT_RGB332: 1837 *datatype = GL_UNSIGNED_BYTE_3_3_2; 1838 *comps = 3; 1839 return; 1840 1841 case MESA_FORMAT_A8: 1842 case MESA_FORMAT_L8: 1843 case MESA_FORMAT_I8: 1844 case MESA_FORMAT_CI8: 1845 *datatype = GL_UNSIGNED_BYTE; 1846 *comps = 1; 1847 return; 1848 1849 case MESA_FORMAT_YCBCR: 1850 case MESA_FORMAT_YCBCR_REV: 1851 *datatype = GL_UNSIGNED_SHORT; 1852 *comps = 2; 1853 return; 1854 1855 case MESA_FORMAT_Z24_S8: 1856 *datatype = GL_UNSIGNED_INT; 1857 *comps = 1; /* XXX OK? */ 1858 return; 1859 1860 case MESA_FORMAT_S8_Z24: 1861 *datatype = GL_UNSIGNED_INT; 1862 *comps = 1; /* XXX OK? */ 1863 return; 1864 1865 case MESA_FORMAT_Z16: 1866 *datatype = GL_UNSIGNED_SHORT; 1867 *comps = 1; 1868 return; 1869 1870 case MESA_FORMAT_Z32: 1871 *datatype = GL_UNSIGNED_INT; 1872 *comps = 1; 1873 return; 1874 1875 case MESA_FORMAT_DUDV8: 1876 *datatype = GL_BYTE; 1877 *comps = 2; 1878 return; 1879 1880 case MESA_FORMAT_SIGNED_RGBA8888: 1881 case MESA_FORMAT_SIGNED_RGBA8888_REV: 1882 *datatype = GL_BYTE; 1883 *comps = 4; 1884 return; 1885 1886#if FEATURE_EXT_texture_sRGB 1887 case MESA_FORMAT_SRGB8: 1888 *datatype = GL_UNSIGNED_BYTE; 1889 *comps = 3; 1890 return; 1891 case MESA_FORMAT_SRGBA8: 1892 case MESA_FORMAT_SARGB8: 1893 *datatype = GL_UNSIGNED_BYTE; 1894 *comps = 4; 1895 return; 1896 case MESA_FORMAT_SL8: 1897 *datatype = GL_UNSIGNED_BYTE; 1898 *comps = 1; 1899 return; 1900 case MESA_FORMAT_SLA8: 1901 *datatype = GL_UNSIGNED_BYTE; 1902 *comps = 2; 1903 return; 1904#endif 1905 1906#if FEATURE_texture_fxt1 1907 case MESA_FORMAT_RGB_FXT1: 1908 case MESA_FORMAT_RGBA_FXT1: 1909#endif 1910#if FEATURE_texture_s3tc 1911 case MESA_FORMAT_RGB_DXT1: 1912 case MESA_FORMAT_RGBA_DXT1: 1913 case MESA_FORMAT_RGBA_DXT3: 1914 case MESA_FORMAT_RGBA_DXT5: 1915#if FEATURE_EXT_texture_sRGB 1916 case MESA_FORMAT_SRGB_DXT1: 1917 case MESA_FORMAT_SRGBA_DXT1: 1918 case MESA_FORMAT_SRGBA_DXT3: 1919 case MESA_FORMAT_SRGBA_DXT5: 1920#endif 1921 /* XXX generate error instead? */ 1922 *datatype = GL_UNSIGNED_BYTE; 1923 *comps = 0; 1924 return; 1925#endif 1926 1927 case MESA_FORMAT_RGBA: 1928 *datatype = CHAN_TYPE; 1929 *comps = 4; 1930 return; 1931 case MESA_FORMAT_RGB: 1932 *datatype = CHAN_TYPE; 1933 *comps = 3; 1934 return; 1935 case MESA_FORMAT_LUMINANCE_ALPHA: 1936 *datatype = CHAN_TYPE; 1937 *comps = 2; 1938 return; 1939 case MESA_FORMAT_ALPHA: 1940 case MESA_FORMAT_LUMINANCE: 1941 case MESA_FORMAT_INTENSITY: 1942 *datatype = CHAN_TYPE; 1943 *comps = 1; 1944 return; 1945 1946 case MESA_FORMAT_RGBA_FLOAT32: 1947 *datatype = GL_FLOAT; 1948 *comps = 4; 1949 return; 1950 case MESA_FORMAT_RGBA_FLOAT16: 1951 *datatype = GL_HALF_FLOAT_ARB; 1952 *comps = 4; 1953 return; 1954 case MESA_FORMAT_RGB_FLOAT32: 1955 *datatype = GL_FLOAT; 1956 *comps = 3; 1957 return; 1958 case MESA_FORMAT_RGB_FLOAT16: 1959 *datatype = GL_HALF_FLOAT_ARB; 1960 *comps = 3; 1961 return; 1962 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32: 1963 *datatype = GL_FLOAT; 1964 *comps = 2; 1965 return; 1966 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16: 1967 *datatype = GL_HALF_FLOAT_ARB; 1968 *comps = 2; 1969 return; 1970 case MESA_FORMAT_ALPHA_FLOAT32: 1971 case MESA_FORMAT_LUMINANCE_FLOAT32: 1972 case MESA_FORMAT_INTENSITY_FLOAT32: 1973 *datatype = GL_FLOAT; 1974 *comps = 1; 1975 return; 1976 case MESA_FORMAT_ALPHA_FLOAT16: 1977 case MESA_FORMAT_LUMINANCE_FLOAT16: 1978 case MESA_FORMAT_INTENSITY_FLOAT16: 1979 *datatype = GL_HALF_FLOAT_ARB; 1980 *comps = 1; 1981 return; 1982 1983 default: 1984 _mesa_problem(NULL, "bad format in _mesa_format_to_type_and_comps"); 1985 *datatype = 0; 1986 *comps = 1; 1987 } 1988} 1989