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