texformat.c revision 090e212c0c5e54156c3c33f7eecdfe01398a7222
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.92f; 59 } 60 else { 61 table[i] = (GLfloat) _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 _mesa_texstore_s8_z24, /* StoreTexImageFunc */ 1225 NULL, /* FetchTexel1D */ 1226 NULL, /* FetchTexel2D */ 1227 NULL, /* FetchTexel3D */ 1228 fetch_texel_1d_f_s8_z24, /* FetchTexel1Df */ 1229 fetch_texel_2d_f_s8_z24, /* FetchTexel2Df */ 1230 fetch_texel_3d_f_s8_z24, /* FetchTexel3Df */ 1231 store_texel_s8_z24 /* StoreTexel */ 1232}; 1233 1234const struct gl_texture_format _mesa_texformat_z16 = { 1235 MESA_FORMAT_Z16, /* MesaFormat */ 1236 GL_DEPTH_COMPONENT, /* BaseFormat */ 1237 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1238 0, /* RedBits */ 1239 0, /* GreenBits */ 1240 0, /* BlueBits */ 1241 0, /* AlphaBits */ 1242 0, /* LuminanceBits */ 1243 0, /* IntensityBits */ 1244 0, /* IndexBits */ 1245 sizeof(GLushort) * 8, /* DepthBits */ 1246 0, /* StencilBits */ 1247 sizeof(GLushort), /* TexelBytes */ 1248 _mesa_texstore_z16, /* StoreTexImageFunc */ 1249 NULL, /* FetchTexel1D */ 1250 NULL, /* FetchTexel1D */ 1251 NULL, /* FetchTexel1D */ 1252 fetch_texel_1d_f_z16, /* FetchTexel1Df */ 1253 fetch_texel_2d_f_z16, /* FetchTexel2Df */ 1254 fetch_texel_3d_f_z16, /* FetchTexel3Df */ 1255 store_texel_z16 /* StoreTexel */ 1256}; 1257 1258const struct gl_texture_format _mesa_texformat_z32 = { 1259 MESA_FORMAT_Z32, /* MesaFormat */ 1260 GL_DEPTH_COMPONENT, /* BaseFormat */ 1261 GL_UNSIGNED_NORMALIZED_ARB, /* DataType */ 1262 0, /* RedBits */ 1263 0, /* GreenBits */ 1264 0, /* BlueBits */ 1265 0, /* AlphaBits */ 1266 0, /* LuminanceBits */ 1267 0, /* IntensityBits */ 1268 0, /* IndexBits */ 1269 sizeof(GLuint) * 8, /* DepthBits */ 1270 0, /* StencilBits */ 1271 sizeof(GLuint), /* TexelBytes */ 1272 _mesa_texstore_z32, /* StoreTexImageFunc */ 1273 NULL, /* FetchTexel1D */ 1274 NULL, /* FetchTexel1D */ 1275 NULL, /* FetchTexel1D */ 1276 fetch_texel_1d_f_z32, /* FetchTexel1Df */ 1277 fetch_texel_2d_f_z32, /* FetchTexel2Df */ 1278 fetch_texel_3d_f_z32, /* FetchTexel3Df */ 1279 store_texel_z32 /* StoreTexel */ 1280}; 1281 1282/*@}*/ 1283 1284 1285/***************************************************************/ 1286/** \name Null format (useful for proxy textures) */ 1287/*@{*/ 1288 1289const struct gl_texture_format _mesa_null_texformat = { 1290 -1, /* MesaFormat */ 1291 0, /* BaseFormat */ 1292 GL_NONE, /* DataType */ 1293 0, /* RedBits */ 1294 0, /* GreenBits */ 1295 0, /* BlueBits */ 1296 0, /* AlphaBits */ 1297 0, /* LuminanceBits */ 1298 0, /* IntensityBits */ 1299 0, /* IndexBits */ 1300 0, /* DepthBits */ 1301 0, /* StencilBits */ 1302 0, /* TexelBytes */ 1303 NULL, /* StoreTexImageFunc */ 1304 fetch_null_texel, /* FetchTexel1D */ 1305 fetch_null_texel, /* FetchTexel2D */ 1306 fetch_null_texel, /* FetchTexel3D */ 1307 fetch_null_texelf, /* FetchTexel1Df */ 1308 fetch_null_texelf, /* FetchTexel2Df */ 1309 fetch_null_texelf, /* FetchTexel3Df */ 1310 store_null_texel /* StoreTexel */ 1311}; 1312 1313/*@}*/ 1314 1315 1316/** 1317 * Choose an appropriate texture format given the format, type and 1318 * internalFormat parameters passed to glTexImage(). 1319 * 1320 * \param ctx the GL context. 1321 * \param internalFormat user's prefered internal texture format. 1322 * \param format incoming image pixel format. 1323 * \param type incoming image data type. 1324 * 1325 * \return a pointer to a gl_texture_format object which describes the 1326 * choosen texture format, or NULL on failure. 1327 * 1328 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers 1329 * will typically override this function with a specialized version. 1330 */ 1331const struct gl_texture_format * 1332_mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat, 1333 GLenum format, GLenum type ) 1334{ 1335 (void) format; 1336 (void) type; 1337 1338 switch (internalFormat) { 1339 /* RGBA formats */ 1340 case 4: 1341 case GL_RGBA: 1342 case GL_RGB10_A2: 1343 case GL_RGBA12: 1344 case GL_RGBA16: 1345 return &_mesa_texformat_rgba; 1346 case GL_RGBA8: 1347 return &_mesa_texformat_rgba8888; 1348 case GL_RGB5_A1: 1349 return &_mesa_texformat_argb1555; 1350 case GL_RGBA2: 1351 return &_mesa_texformat_argb4444_rev; /* just to test another format*/ 1352 case GL_RGBA4: 1353 return &_mesa_texformat_argb4444; 1354 1355 /* RGB formats */ 1356 case 3: 1357 case GL_RGB: 1358 case GL_RGB10: 1359 case GL_RGB12: 1360 case GL_RGB16: 1361 return &_mesa_texformat_rgb; 1362 case GL_RGB8: 1363 return &_mesa_texformat_rgb888; 1364 case GL_R3_G3_B2: 1365 return &_mesa_texformat_rgb332; 1366 case GL_RGB4: 1367 return &_mesa_texformat_rgb565_rev; /* just to test another format */ 1368 case GL_RGB5: 1369 return &_mesa_texformat_rgb565; 1370 1371 /* Alpha formats */ 1372 case GL_ALPHA: 1373 case GL_ALPHA4: 1374 case GL_ALPHA12: 1375 case GL_ALPHA16: 1376 return &_mesa_texformat_alpha; 1377 case GL_ALPHA8: 1378 return &_mesa_texformat_a8; 1379 1380 /* Luminance formats */ 1381 case 1: 1382 case GL_LUMINANCE: 1383 case GL_LUMINANCE4: 1384 case GL_LUMINANCE12: 1385 case GL_LUMINANCE16: 1386 return &_mesa_texformat_luminance; 1387 case GL_LUMINANCE8: 1388 return &_mesa_texformat_l8; 1389 1390 /* Luminance/Alpha formats */ 1391 case 2: 1392 case GL_LUMINANCE_ALPHA: 1393 case GL_LUMINANCE4_ALPHA4: 1394 case GL_LUMINANCE6_ALPHA2: 1395 case GL_LUMINANCE12_ALPHA4: 1396 case GL_LUMINANCE12_ALPHA12: 1397 case GL_LUMINANCE16_ALPHA16: 1398 return &_mesa_texformat_luminance_alpha; 1399 case GL_LUMINANCE8_ALPHA8: 1400 return &_mesa_texformat_al88; 1401 1402 case GL_INTENSITY: 1403 case GL_INTENSITY4: 1404 case GL_INTENSITY12: 1405 case GL_INTENSITY16: 1406 return &_mesa_texformat_intensity; 1407 case GL_INTENSITY8: 1408 return &_mesa_texformat_i8; 1409 1410 case GL_COLOR_INDEX: 1411 case GL_COLOR_INDEX1_EXT: 1412 case GL_COLOR_INDEX2_EXT: 1413 case GL_COLOR_INDEX4_EXT: 1414 case GL_COLOR_INDEX12_EXT: 1415 case GL_COLOR_INDEX16_EXT: 1416 case GL_COLOR_INDEX8_EXT: 1417 return &_mesa_texformat_ci8; 1418 1419 default: 1420 ; /* fallthrough */ 1421 } 1422 1423 if (ctx->Extensions.SGIX_depth_texture || 1424 ctx->Extensions.ARB_depth_texture) { 1425 switch (internalFormat) { 1426 case GL_DEPTH_COMPONENT: 1427 case GL_DEPTH_COMPONENT24_SGIX: 1428 case GL_DEPTH_COMPONENT32_SGIX: 1429 return &_mesa_texformat_z32; 1430 case GL_DEPTH_COMPONENT16_SGIX: 1431 return &_mesa_texformat_z16; 1432 default: 1433 ; /* fallthrough */ 1434 } 1435 } 1436 1437 if (ctx->Extensions.ARB_texture_compression) { 1438 switch (internalFormat) { 1439 case GL_COMPRESSED_ALPHA_ARB: 1440 return &_mesa_texformat_alpha; 1441 case GL_COMPRESSED_LUMINANCE_ARB: 1442 return &_mesa_texformat_luminance; 1443 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: 1444 return &_mesa_texformat_luminance_alpha; 1445 case GL_COMPRESSED_INTENSITY_ARB: 1446 return &_mesa_texformat_intensity; 1447 case GL_COMPRESSED_RGB_ARB: 1448#if FEATURE_texture_fxt1 1449 if (ctx->Extensions.TDFX_texture_compression_FXT1) 1450 return &_mesa_texformat_rgb_fxt1; 1451#endif 1452#if FEATURE_texture_s3tc 1453 if (ctx->Extensions.EXT_texture_compression_s3tc || 1454 ctx->Extensions.S3_s3tc) 1455 return &_mesa_texformat_rgb_dxt1; 1456#endif 1457 return &_mesa_texformat_rgb; 1458 case GL_COMPRESSED_RGBA_ARB: 1459#if FEATURE_texture_fxt1 1460 if (ctx->Extensions.TDFX_texture_compression_FXT1) 1461 return &_mesa_texformat_rgba_fxt1; 1462#endif 1463#if FEATURE_texture_s3tc 1464 if (ctx->Extensions.EXT_texture_compression_s3tc || 1465 ctx->Extensions.S3_s3tc) 1466 return &_mesa_texformat_rgba_dxt3; /* Not rgba_dxt1, see spec */ 1467#endif 1468 return &_mesa_texformat_rgba; 1469 default: 1470 ; /* fallthrough */ 1471 } 1472 } 1473 1474 if (ctx->Extensions.MESA_ycbcr_texture) { 1475 if (internalFormat == GL_YCBCR_MESA) { 1476 if (type == GL_UNSIGNED_SHORT_8_8_MESA) 1477 return &_mesa_texformat_ycbcr; 1478 else 1479 return &_mesa_texformat_ycbcr_rev; 1480 } 1481 } 1482 1483#if FEATURE_texture_fxt1 1484 if (ctx->Extensions.TDFX_texture_compression_FXT1) { 1485 switch (internalFormat) { 1486 case GL_COMPRESSED_RGB_FXT1_3DFX: 1487 return &_mesa_texformat_rgb_fxt1; 1488 case GL_COMPRESSED_RGBA_FXT1_3DFX: 1489 return &_mesa_texformat_rgba_fxt1; 1490 default: 1491 ; /* fallthrough */ 1492 } 1493 } 1494#endif 1495 1496#if FEATURE_texture_s3tc 1497 if (ctx->Extensions.EXT_texture_compression_s3tc) { 1498 switch (internalFormat) { 1499 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 1500 return &_mesa_texformat_rgb_dxt1; 1501 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 1502 return &_mesa_texformat_rgba_dxt1; 1503 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 1504 return &_mesa_texformat_rgba_dxt3; 1505 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 1506 return &_mesa_texformat_rgba_dxt5; 1507 default: 1508 ; /* fallthrough */ 1509 } 1510 } 1511 1512 if (ctx->Extensions.S3_s3tc) { 1513 switch (internalFormat) { 1514 case GL_RGB_S3TC: 1515 case GL_RGB4_S3TC: 1516 return &_mesa_texformat_rgb_dxt1; 1517 case GL_RGBA_S3TC: 1518 case GL_RGBA4_S3TC: 1519 return &_mesa_texformat_rgba_dxt3; 1520 default: 1521 ; /* fallthrough */ 1522 } 1523 } 1524#endif 1525 1526 if (ctx->Extensions.ARB_texture_float) { 1527 switch (internalFormat) { 1528 case GL_ALPHA16F_ARB: 1529 return &_mesa_texformat_alpha_float16; 1530 case GL_ALPHA32F_ARB: 1531 return &_mesa_texformat_alpha_float32; 1532 case GL_LUMINANCE16F_ARB: 1533 return &_mesa_texformat_luminance_float16; 1534 case GL_LUMINANCE32F_ARB: 1535 return &_mesa_texformat_luminance_float32; 1536 case GL_LUMINANCE_ALPHA16F_ARB: 1537 return &_mesa_texformat_luminance_alpha_float16; 1538 case GL_LUMINANCE_ALPHA32F_ARB: 1539 return &_mesa_texformat_luminance_alpha_float32; 1540 case GL_INTENSITY16F_ARB: 1541 return &_mesa_texformat_intensity_float16; 1542 case GL_INTENSITY32F_ARB: 1543 return &_mesa_texformat_intensity_float32; 1544 case GL_RGB16F_ARB: 1545 return &_mesa_texformat_rgb_float16; 1546 case GL_RGB32F_ARB: 1547 return &_mesa_texformat_rgb_float32; 1548 case GL_RGBA16F_ARB: 1549 return &_mesa_texformat_rgba_float16; 1550 case GL_RGBA32F_ARB: 1551 return &_mesa_texformat_rgba_float32; 1552 default: 1553 ; /* fallthrough */ 1554 } 1555 } 1556 1557 if (ctx->Extensions.EXT_packed_depth_stencil) { 1558 switch (internalFormat) { 1559 case GL_DEPTH_STENCIL_EXT: 1560 case GL_DEPTH24_STENCIL8_EXT: 1561 return &_mesa_texformat_z24_s8; 1562 default: 1563 ; /* fallthrough */ 1564 } 1565 } 1566 1567#if FEATURE_EXT_texture_sRGB 1568 if (ctx->Extensions.EXT_texture_sRGB) { 1569 switch (internalFormat) { 1570 case GL_SRGB_EXT: 1571 case GL_SRGB8_EXT: 1572 return &_mesa_texformat_srgb8; 1573 case GL_SRGB_ALPHA_EXT: 1574 case GL_SRGB8_ALPHA8_EXT: 1575 return &_mesa_texformat_srgba8; 1576 case GL_SLUMINANCE_EXT: 1577 case GL_SLUMINANCE8_EXT: 1578 return &_mesa_texformat_sl8; 1579 case GL_SLUMINANCE_ALPHA_EXT: 1580 case GL_SLUMINANCE8_ALPHA8_EXT: 1581 return &_mesa_texformat_sla8; 1582 /* NOTE: not supporting any compression of sRGB at this time */ 1583 case GL_COMPRESSED_SRGB_EXT: 1584 return &_mesa_texformat_srgb8; 1585 case GL_COMPRESSED_SRGB_ALPHA_EXT: 1586 return &_mesa_texformat_srgba8; 1587 case GL_COMPRESSED_SLUMINANCE_EXT: 1588 return &_mesa_texformat_sl8; 1589 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 1590 return &_mesa_texformat_sla8; 1591 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 1592 return &_mesa_texformat_srgb8; 1593 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 1594 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 1595 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 1596 return &_mesa_texformat_srgba8; 1597 default: 1598 ; /* fallthrough */ 1599 } 1600 } 1601#endif /* FEATURE_EXT_texture_sRGB */ 1602 1603 _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()"); 1604 return NULL; 1605} 1606 1607 1608 1609/** 1610 * Return datatype and number of components per texel for the 1611 * given gl_texture_format. 1612 */ 1613void 1614_mesa_format_to_type_and_comps(const struct gl_texture_format *format, 1615 GLenum *datatype, GLuint *comps) 1616{ 1617 switch (format->MesaFormat) { 1618 case MESA_FORMAT_RGBA8888: 1619 case MESA_FORMAT_RGBA8888_REV: 1620 case MESA_FORMAT_ARGB8888: 1621 case MESA_FORMAT_ARGB8888_REV: 1622 *datatype = CHAN_TYPE; 1623 *comps = 4; 1624 return; 1625 case MESA_FORMAT_RGB888: 1626 case MESA_FORMAT_BGR888: 1627 *datatype = GL_UNSIGNED_BYTE; 1628 *comps = 3; 1629 return; 1630 case MESA_FORMAT_RGB565: 1631 case MESA_FORMAT_RGB565_REV: 1632 *datatype = GL_UNSIGNED_SHORT_5_6_5; 1633 *comps = 3; 1634 return; 1635 1636 case MESA_FORMAT_ARGB4444: 1637 case MESA_FORMAT_ARGB4444_REV: 1638 *datatype = GL_UNSIGNED_SHORT_4_4_4_4; 1639 *comps = 4; 1640 return; 1641 1642 case MESA_FORMAT_ARGB1555: 1643 case MESA_FORMAT_ARGB1555_REV: 1644 *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV; 1645 *comps = 3; 1646 return; 1647 1648 case MESA_FORMAT_AL88: 1649 case MESA_FORMAT_AL88_REV: 1650 *datatype = GL_UNSIGNED_BYTE; 1651 *comps = 2; 1652 return; 1653 case MESA_FORMAT_RGB332: 1654 *datatype = GL_UNSIGNED_BYTE_3_3_2; 1655 *comps = 3; 1656 return; 1657 1658 case MESA_FORMAT_A8: 1659 case MESA_FORMAT_L8: 1660 case MESA_FORMAT_I8: 1661 case MESA_FORMAT_CI8: 1662 *datatype = GL_UNSIGNED_BYTE; 1663 *comps = 1; 1664 return; 1665 1666 case MESA_FORMAT_YCBCR: 1667 case MESA_FORMAT_YCBCR_REV: 1668 *datatype = GL_UNSIGNED_SHORT; 1669 *comps = 2; 1670 return; 1671 1672 case MESA_FORMAT_Z24_S8: 1673 *datatype = GL_UNSIGNED_INT; 1674 *comps = 1; /* XXX OK? */ 1675 return; 1676 1677 case MESA_FORMAT_S8_Z24: 1678 *datatype = GL_UNSIGNED_INT; 1679 *comps = 1; /* XXX OK? */ 1680 return; 1681 1682 case MESA_FORMAT_Z16: 1683 *datatype = GL_UNSIGNED_SHORT; 1684 *comps = 1; 1685 return; 1686 1687 case MESA_FORMAT_Z32: 1688 *datatype = GL_UNSIGNED_INT; 1689 *comps = 1; 1690 return; 1691 1692#if FEATURE_EXT_texture_sRGB 1693 case MESA_FORMAT_SRGB8: 1694 *datatype = GL_UNSIGNED_BYTE; 1695 *comps = 3; 1696 return; 1697 case MESA_FORMAT_SRGBA8: 1698 *datatype = GL_UNSIGNED_BYTE; 1699 *comps = 4; 1700 return; 1701 case MESA_FORMAT_SL8: 1702 *datatype = GL_UNSIGNED_BYTE; 1703 *comps = 1; 1704 return; 1705 case MESA_FORMAT_SLA8: 1706 *datatype = GL_UNSIGNED_BYTE; 1707 *comps = 2; 1708 return; 1709#endif 1710 1711#if FEATURE_texture_fxt1 1712 case MESA_FORMAT_RGB_FXT1: 1713 case MESA_FORMAT_RGBA_FXT1: 1714#endif 1715#if FEATURE_texture_s3tc 1716 case MESA_FORMAT_RGB_DXT1: 1717 case MESA_FORMAT_RGBA_DXT1: 1718 case MESA_FORMAT_RGBA_DXT3: 1719 case MESA_FORMAT_RGBA_DXT5: 1720 /* XXX generate error instead? */ 1721 *datatype = GL_UNSIGNED_BYTE; 1722 *comps = 0; 1723 return; 1724#endif 1725 1726 case MESA_FORMAT_RGBA: 1727 *datatype = CHAN_TYPE; 1728 *comps = 4; 1729 return; 1730 case MESA_FORMAT_RGB: 1731 *datatype = CHAN_TYPE; 1732 *comps = 3; 1733 return; 1734 case MESA_FORMAT_LUMINANCE_ALPHA: 1735 *datatype = CHAN_TYPE; 1736 *comps = 2; 1737 return; 1738 case MESA_FORMAT_ALPHA: 1739 case MESA_FORMAT_LUMINANCE: 1740 case MESA_FORMAT_INTENSITY: 1741 *datatype = CHAN_TYPE; 1742 *comps = 1; 1743 return; 1744 1745 case MESA_FORMAT_RGBA_FLOAT32: 1746 *datatype = GL_FLOAT; 1747 *comps = 4; 1748 return; 1749 case MESA_FORMAT_RGBA_FLOAT16: 1750 *datatype = GL_HALF_FLOAT_ARB; 1751 *comps = 4; 1752 return; 1753 case MESA_FORMAT_RGB_FLOAT32: 1754 *datatype = GL_FLOAT; 1755 *comps = 3; 1756 return; 1757 case MESA_FORMAT_RGB_FLOAT16: 1758 *datatype = GL_HALF_FLOAT_ARB; 1759 *comps = 3; 1760 return; 1761 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32: 1762 *datatype = GL_FLOAT; 1763 *comps = 2; 1764 return; 1765 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16: 1766 *datatype = GL_HALF_FLOAT_ARB; 1767 *comps = 2; 1768 return; 1769 case MESA_FORMAT_ALPHA_FLOAT32: 1770 case MESA_FORMAT_LUMINANCE_FLOAT32: 1771 case MESA_FORMAT_INTENSITY_FLOAT32: 1772 *datatype = GL_FLOAT; 1773 *comps = 1; 1774 return; 1775 case MESA_FORMAT_ALPHA_FLOAT16: 1776 case MESA_FORMAT_LUMINANCE_FLOAT16: 1777 case MESA_FORMAT_INTENSITY_FLOAT16: 1778 *datatype = GL_HALF_FLOAT_ARB; 1779 *comps = 1; 1780 return; 1781 1782 default: 1783 _mesa_problem(NULL, "bad format in _mesa_format_to_type_and_comps"); 1784 *datatype = 0; 1785 *comps = 1; 1786 } 1787} 1788