texformat.c revision 663a9e1b7ef7b8384abe2f81e1a8749b942f6d3a
1/** 2 * \file texformat.c 3 * Texture formats. 4 * 5 * \author Gareth Hughes 6 */ 7 8/* 9 * Mesa 3-D graphics library 10 * Version: 5.1 11 * 12 * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. 13 * 14 * Permission is hereby granted, free of charge, to any person obtaining a 15 * copy of this software and associated documentation files (the "Software"), 16 * to deal in the Software without restriction, including without limitation 17 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 18 * and/or sell copies of the Software, and to permit persons to whom the 19 * Software is furnished to do so, subject to the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be included 22 * in all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 25 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 26 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 27 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 28 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 30 */ 31 32 33#include "glheader.h" 34#include "colormac.h" 35#include "context.h" 36#include "image.h" 37#include "imports.h" 38#include "mtypes.h" 39#include "texformat.h" 40#include "teximage.h" 41#include "texstate.h" 42 43 44/* Texel fetch routines for all supported formats 45 */ 46#define DIM 1 47#include "texformat_tmp.h" 48 49#define DIM 2 50#include "texformat_tmp.h" 51 52#define DIM 3 53#include "texformat_tmp.h" 54 55/** 56 * Null texel fetch function. 57 * 58 * Have to have this so the FetchTexel function pointer is never NULL. 59 */ 60static void fetch_null_texel( const struct gl_texture_image *texImage, 61 GLint i, GLint j, GLint k, GLvoid *texel ) 62{ 63 GLchan *rgba = (GLchan *) texel; 64 rgba[RCOMP] = 0; 65 rgba[GCOMP] = 0; 66 rgba[BCOMP] = 0; 67 rgba[ACOMP] = 0; 68} 69 70 71/***************************************************************/ 72/** \name Default GLchan-based formats */ 73/*@{*/ 74 75const struct gl_texture_format _mesa_texformat_rgba = { 76 MESA_FORMAT_RGBA, /* MesaFormat */ 77 GL_RGBA, /* BaseFormat */ 78 CHAN_BITS, /* RedBits */ 79 CHAN_BITS, /* GreenBits */ 80 CHAN_BITS, /* BlueBits */ 81 CHAN_BITS, /* AlphaBits */ 82 0, /* LuminanceBits */ 83 0, /* IntensityBits */ 84 0, /* IndexBits */ 85 0, /* DepthBits */ 86 4 * CHAN_BITS / 8, /* TexelBytes */ 87 fetch_1d_texel_rgba, /* FetchTexel1D */ 88 fetch_2d_texel_rgba, /* FetchTexel2D */ 89 fetch_3d_texel_rgba, /* FetchTexel3D */ 90}; 91 92const struct gl_texture_format _mesa_texformat_rgb = { 93 MESA_FORMAT_RGB, /* MesaFormat */ 94 GL_RGB, /* BaseFormat */ 95 CHAN_BITS, /* RedBits */ 96 CHAN_BITS, /* GreenBits */ 97 CHAN_BITS, /* BlueBits */ 98 0, /* AlphaBits */ 99 0, /* LuminanceBits */ 100 0, /* IntensityBits */ 101 0, /* IndexBits */ 102 0, /* DepthBits */ 103 3 * CHAN_BITS / 8, /* TexelBytes */ 104 fetch_1d_texel_rgb, /* FetchTexel1D */ 105 fetch_2d_texel_rgb, /* FetchTexel2D */ 106 fetch_3d_texel_rgb, /* FetchTexel3D */ 107}; 108 109const struct gl_texture_format _mesa_texformat_alpha = { 110 MESA_FORMAT_ALPHA, /* MesaFormat */ 111 GL_ALPHA, /* BaseFormat */ 112 0, /* RedBits */ 113 0, /* GreenBits */ 114 0, /* BlueBits */ 115 CHAN_BITS, /* AlphaBits */ 116 0, /* LuminanceBits */ 117 0, /* IntensityBits */ 118 0, /* IndexBits */ 119 0, /* DepthBits */ 120 CHAN_BITS / 8, /* TexelBytes */ 121 fetch_1d_texel_alpha, /* FetchTexel1D */ 122 fetch_2d_texel_alpha, /* FetchTexel2D */ 123 fetch_3d_texel_alpha, /* FetchTexel3D */ 124}; 125 126const struct gl_texture_format _mesa_texformat_luminance = { 127 MESA_FORMAT_LUMINANCE, /* MesaFormat */ 128 GL_LUMINANCE, /* BaseFormat */ 129 0, /* RedBits */ 130 0, /* GreenBits */ 131 0, /* BlueBits */ 132 0, /* AlphaBits */ 133 CHAN_BITS, /* LuminanceBits */ 134 0, /* IntensityBits */ 135 0, /* IndexBits */ 136 0, /* DepthBits */ 137 CHAN_BITS / 8, /* TexelBytes */ 138 fetch_1d_texel_luminance, /* FetchTexel1D */ 139 fetch_2d_texel_luminance, /* FetchTexel2D */ 140 fetch_3d_texel_luminance, /* FetchTexel3D */ 141}; 142 143const struct gl_texture_format _mesa_texformat_luminance_alpha = { 144 MESA_FORMAT_LUMINANCE_ALPHA, /* MesaFormat */ 145 GL_LUMINANCE_ALPHA, /* BaseFormat */ 146 0, /* RedBits */ 147 0, /* GreenBits */ 148 0, /* BlueBits */ 149 CHAN_BITS, /* AlphaBits */ 150 CHAN_BITS, /* LuminanceBits */ 151 0, /* IntensityBits */ 152 0, /* IndexBits */ 153 0, /* DepthBits */ 154 2 * CHAN_BITS / 8, /* TexelBytes */ 155 fetch_1d_texel_luminance_alpha, /* FetchTexel1D */ 156 fetch_2d_texel_luminance_alpha, /* FetchTexel2D */ 157 fetch_3d_texel_luminance_alpha, /* FetchTexel3D */ 158}; 159 160const struct gl_texture_format _mesa_texformat_intensity = { 161 MESA_FORMAT_INTENSITY, /* MesaFormat */ 162 GL_INTENSITY, /* BaseFormat */ 163 0, /* RedBits */ 164 0, /* GreenBits */ 165 0, /* BlueBits */ 166 0, /* AlphaBits */ 167 0, /* LuminanceBits */ 168 CHAN_BITS, /* IntensityBits */ 169 0, /* IndexBits */ 170 0, /* DepthBits */ 171 CHAN_BITS / 8, /* TexelBytes */ 172 fetch_1d_texel_intensity, /* FetchTexel1D */ 173 fetch_2d_texel_intensity, /* FetchTexel2D */ 174 fetch_3d_texel_intensity, /* FetchTexel3D */ 175}; 176 177const struct gl_texture_format _mesa_texformat_color_index = { 178 MESA_FORMAT_COLOR_INDEX, /* MesaFormat */ 179 GL_COLOR_INDEX, /* BaseFormat */ 180 0, /* RedBits */ 181 0, /* GreenBits */ 182 0, /* BlueBits */ 183 0, /* AlphaBits */ 184 0, /* LuminanceBits */ 185 0, /* IntensityBits */ 186 CHAN_BITS, /* IndexBits */ 187 0, /* DepthBits */ 188 CHAN_BITS / 8, /* TexelBytes */ 189 fetch_1d_texel_color_index, /* FetchTexel1D */ 190 fetch_2d_texel_color_index, /* FetchTexel2D */ 191 fetch_3d_texel_color_index, /* FetchTexel3D */ 192}; 193 194const struct gl_texture_format _mesa_texformat_depth_component = { 195 MESA_FORMAT_DEPTH_COMPONENT, /* MesaFormat */ 196 GL_DEPTH_COMPONENT, /* BaseFormat */ 197 0, /* RedBits */ 198 0, /* GreenBits */ 199 0, /* BlueBits */ 200 0, /* AlphaBits */ 201 0, /* LuminanceBits */ 202 0, /* IntensityBits */ 203 0, /* IndexBits */ 204 sizeof(GLfloat) * 8, /* DepthBits */ 205 sizeof(GLfloat), /* TexelBytes */ 206 fetch_1d_texel_depth_component, /* FetchTexel1D */ 207 fetch_2d_texel_depth_component, /* FetchTexel2D */ 208 fetch_3d_texel_depth_component, /* FetchTexel3D */ 209}; 210 211/*@}*/ 212 213 214/***************************************************************/ 215/** \name Hardware formats */ 216/*@{*/ 217 218const struct gl_texture_format _mesa_texformat_rgba8888 = { 219 MESA_FORMAT_RGBA8888, /* MesaFormat */ 220 GL_RGBA, /* BaseFormat */ 221 8, /* RedBits */ 222 8, /* GreenBits */ 223 8, /* BlueBits */ 224 8, /* AlphaBits */ 225 0, /* LuminanceBits */ 226 0, /* IntensityBits */ 227 0, /* IndexBits */ 228 0, /* DepthBits */ 229 4, /* TexelBytes */ 230 fetch_1d_texel_rgba8888, /* FetchTexel1D */ 231 fetch_2d_texel_rgba8888, /* FetchTexel2D */ 232 fetch_3d_texel_rgba8888, /* FetchTexel3D */ 233}; 234 235const struct gl_texture_format _mesa_texformat_argb8888 = { 236 MESA_FORMAT_ARGB8888, /* MesaFormat */ 237 GL_RGBA, /* BaseFormat */ 238 8, /* RedBits */ 239 8, /* GreenBits */ 240 8, /* BlueBits */ 241 8, /* AlphaBits */ 242 0, /* LuminanceBits */ 243 0, /* IntensityBits */ 244 0, /* IndexBits */ 245 0, /* DepthBits */ 246 4, /* TexelBytes */ 247 fetch_1d_texel_argb8888, /* FetchTexel1D */ 248 fetch_2d_texel_argb8888, /* FetchTexel2D */ 249 fetch_3d_texel_argb8888, /* FetchTexel3D */ 250}; 251 252const struct gl_texture_format _mesa_texformat_rgb888 = { 253 MESA_FORMAT_RGB888, /* MesaFormat */ 254 GL_RGB, /* BaseFormat */ 255 8, /* RedBits */ 256 8, /* GreenBits */ 257 8, /* BlueBits */ 258 0, /* AlphaBits */ 259 0, /* LuminanceBits */ 260 0, /* IntensityBits */ 261 0, /* IndexBits */ 262 0, /* DepthBits */ 263 3, /* TexelBytes */ 264 fetch_1d_texel_rgb888, /* FetchTexel1D */ 265 fetch_2d_texel_rgb888, /* FetchTexel2D */ 266 fetch_3d_texel_rgb888, /* FetchTexel3D */ 267}; 268 269const struct gl_texture_format _mesa_texformat_rgb565 = { 270 MESA_FORMAT_RGB565, /* MesaFormat */ 271 GL_RGB, /* BaseFormat */ 272 5, /* RedBits */ 273 6, /* GreenBits */ 274 5, /* BlueBits */ 275 0, /* AlphaBits */ 276 0, /* LuminanceBits */ 277 0, /* IntensityBits */ 278 0, /* IndexBits */ 279 0, /* DepthBits */ 280 2, /* TexelBytes */ 281 fetch_1d_texel_rgb565, /* FetchTexel1D */ 282 fetch_2d_texel_rgb565, /* FetchTexel2D */ 283 fetch_3d_texel_rgb565, /* FetchTexel3D */ 284}; 285 286const struct gl_texture_format _mesa_texformat_argb4444 = { 287 MESA_FORMAT_ARGB4444, /* MesaFormat */ 288 GL_RGBA, /* BaseFormat */ 289 4, /* RedBits */ 290 4, /* GreenBits */ 291 4, /* BlueBits */ 292 4, /* AlphaBits */ 293 0, /* LuminanceBits */ 294 0, /* IntensityBits */ 295 0, /* IndexBits */ 296 0, /* DepthBits */ 297 2, /* TexelBytes */ 298 fetch_1d_texel_argb4444, /* FetchTexel1D */ 299 fetch_2d_texel_argb4444, /* FetchTexel2D */ 300 fetch_3d_texel_argb4444, /* FetchTexel3D */ 301}; 302 303const struct gl_texture_format _mesa_texformat_argb1555 = { 304 MESA_FORMAT_ARGB1555, /* MesaFormat */ 305 GL_RGBA, /* BaseFormat */ 306 5, /* RedBits */ 307 5, /* GreenBits */ 308 5, /* BlueBits */ 309 1, /* AlphaBits */ 310 0, /* LuminanceBits */ 311 0, /* IntensityBits */ 312 0, /* IndexBits */ 313 0, /* DepthBits */ 314 2, /* TexelBytes */ 315 fetch_1d_texel_argb1555, /* FetchTexel1D */ 316 fetch_2d_texel_argb1555, /* FetchTexel2D */ 317 fetch_3d_texel_argb1555, /* FetchTexel3D */ 318}; 319 320const struct gl_texture_format _mesa_texformat_al88 = { 321 MESA_FORMAT_AL88, /* MesaFormat */ 322 GL_LUMINANCE_ALPHA, /* BaseFormat */ 323 0, /* RedBits */ 324 0, /* GreenBits */ 325 0, /* BlueBits */ 326 8, /* AlphaBits */ 327 8, /* LuminanceBits */ 328 0, /* IntensityBits */ 329 0, /* IndexBits */ 330 0, /* DepthBits */ 331 2, /* TexelBytes */ 332 fetch_1d_texel_al88, /* FetchTexel1D */ 333 fetch_2d_texel_al88, /* FetchTexel2D */ 334 fetch_3d_texel_al88, /* FetchTexel3D */ 335}; 336 337const struct gl_texture_format _mesa_texformat_rgb332 = { 338 MESA_FORMAT_RGB332, /* MesaFormat */ 339 GL_RGB, /* BaseFormat */ 340 3, /* RedBits */ 341 3, /* GreenBits */ 342 2, /* BlueBits */ 343 0, /* AlphaBits */ 344 0, /* LuminanceBits */ 345 0, /* IntensityBits */ 346 0, /* IndexBits */ 347 0, /* DepthBits */ 348 1, /* TexelBytes */ 349 fetch_1d_texel_rgb332, /* FetchTexel1D */ 350 fetch_2d_texel_rgb332, /* FetchTexel2D */ 351 fetch_3d_texel_rgb332, /* FetchTexel3D */ 352}; 353 354const struct gl_texture_format _mesa_texformat_a8 = { 355 MESA_FORMAT_A8, /* MesaFormat */ 356 GL_ALPHA, /* BaseFormat */ 357 0, /* RedBits */ 358 0, /* GreenBits */ 359 0, /* BlueBits */ 360 8, /* AlphaBits */ 361 0, /* LuminanceBits */ 362 0, /* IntensityBits */ 363 0, /* IndexBits */ 364 0, /* DepthBits */ 365 1, /* TexelBytes */ 366 fetch_1d_texel_a8, /* FetchTexel1D */ 367 fetch_2d_texel_a8, /* FetchTexel2D */ 368 fetch_3d_texel_a8, /* FetchTexel3D */ 369}; 370 371const struct gl_texture_format _mesa_texformat_l8 = { 372 MESA_FORMAT_L8, /* MesaFormat */ 373 GL_LUMINANCE, /* BaseFormat */ 374 0, /* RedBits */ 375 0, /* GreenBits */ 376 0, /* BlueBits */ 377 0, /* AlphaBits */ 378 8, /* LuminanceBits */ 379 0, /* IntensityBits */ 380 0, /* IndexBits */ 381 0, /* DepthBits */ 382 1, /* TexelBytes */ 383 fetch_1d_texel_l8, /* FetchTexel1D */ 384 fetch_2d_texel_l8, /* FetchTexel2D */ 385 fetch_3d_texel_l8, /* FetchTexel3D */ 386}; 387 388const struct gl_texture_format _mesa_texformat_i8 = { 389 MESA_FORMAT_I8, /* MesaFormat */ 390 GL_INTENSITY, /* BaseFormat */ 391 0, /* RedBits */ 392 0, /* GreenBits */ 393 0, /* BlueBits */ 394 0, /* AlphaBits */ 395 0, /* LuminanceBits */ 396 8, /* IntensityBits */ 397 0, /* IndexBits */ 398 0, /* DepthBits */ 399 1, /* TexelBytes */ 400 fetch_1d_texel_i8, /* FetchTexel1D */ 401 fetch_2d_texel_i8, /* FetchTexel2D */ 402 fetch_3d_texel_i8, /* FetchTexel3D */ 403}; 404 405const struct gl_texture_format _mesa_texformat_ci8 = { 406 MESA_FORMAT_CI8, /* MesaFormat */ 407 GL_COLOR_INDEX, /* BaseFormat */ 408 0, /* RedBits */ 409 0, /* GreenBits */ 410 0, /* BlueBits */ 411 0, /* AlphaBits */ 412 0, /* LuminanceBits */ 413 0, /* IntensityBits */ 414 8, /* IndexBits */ 415 0, /* DepthBits */ 416 1, /* TexelBytes */ 417 fetch_1d_texel_ci8, /* FetchTexel1D */ 418 fetch_2d_texel_ci8, /* FetchTexel2D */ 419 fetch_3d_texel_ci8, /* FetchTexel3D */ 420}; 421 422const struct gl_texture_format _mesa_texformat_ycbcr = { 423 MESA_FORMAT_YCBCR, /* MesaFormat */ 424 GL_YCBCR_MESA, /* BaseFormat */ 425 0, /* RedBits */ 426 0, /* GreenBits */ 427 0, /* BlueBits */ 428 0, /* AlphaBits */ 429 0, /* LuminanceBits */ 430 0, /* IntensityBits */ 431 0, /* IndexBits */ 432 0, /* DepthBits */ 433 2, /* TexelBytes */ 434 fetch_1d_texel_ycbcr, /* FetchTexel1D */ 435 fetch_2d_texel_ycbcr, /* FetchTexel2D */ 436 fetch_3d_texel_ycbcr, /* FetchTexel3D */ 437}; 438 439const struct gl_texture_format _mesa_texformat_ycbcr_rev = { 440 MESA_FORMAT_YCBCR_REV, /* MesaFormat */ 441 GL_YCBCR_MESA, /* BaseFormat */ 442 0, /* RedBits */ 443 0, /* GreenBits */ 444 0, /* BlueBits */ 445 0, /* AlphaBits */ 446 0, /* LuminanceBits */ 447 0, /* IntensityBits */ 448 0, /* IndexBits */ 449 0, /* DepthBits */ 450 2, /* TexelBytes */ 451 fetch_1d_texel_ycbcr_rev, /* FetchTexel1D */ 452 fetch_2d_texel_ycbcr_rev, /* FetchTexel2D */ 453 fetch_3d_texel_ycbcr_rev, /* FetchTexel3D */ 454}; 455 456const struct gl_texture_format _mesa_texformat_rgb_fxt1 = { 457 MESA_FORMAT_RGB_FXT1, /* MesaFormat */ 458 GL_RGB, /* BaseFormat */ 459 4, /*approx*/ /* RedBits */ 460 4, /*approx*/ /* GreenBits */ 461 4, /*approx*/ /* BlueBits */ 462 0, /* AlphaBits */ 463 0, /* LuminanceBits */ 464 0, /* IntensityBits */ 465 0, /* IndexBits */ 466 0, /* DepthBits */ 467 0, /* TexelBytes */ 468 NULL, /*impossible*/ /* FetchTexel1D */ 469 fetch_2d_texel_rgb_fxt1, /* FetchTexel2D */ 470 NULL, /*impossible*/ /* FetchTexel3D */ 471}; 472 473const struct gl_texture_format _mesa_texformat_rgba_fxt1 = { 474 MESA_FORMAT_RGBA_FXT1, /* MesaFormat */ 475 GL_RGBA, /* BaseFormat */ 476 4, /*approx*/ /* RedBits */ 477 4, /*approx*/ /* GreenBits */ 478 4, /*approx*/ /* BlueBits */ 479 1, /*approx*/ /* AlphaBits */ 480 0, /* LuminanceBits */ 481 0, /* IntensityBits */ 482 0, /* IndexBits */ 483 0, /* DepthBits */ 484 0, /* TexelBytes */ 485 NULL, /*impossible*/ /* FetchTexel1D */ 486 fetch_2d_texel_rgba_fxt1, /* FetchTexel2D */ 487 NULL, /*impossible*/ /* FetchTexel3D */ 488}; 489 490const struct gl_texture_format _mesa_texformat_rgb_dxt1 = { 491 MESA_FORMAT_RGB_DXT1, /* MesaFormat */ 492 GL_RGB, /* BaseFormat */ 493 4, /*approx*/ /* RedBits */ 494 4, /*approx*/ /* GreenBits */ 495 4, /*approx*/ /* BlueBits */ 496 0, /* AlphaBits */ 497 0, /* LuminanceBits */ 498 0, /* IntensityBits */ 499 0, /* IndexBits */ 500 0, /* DepthBits */ 501 0, /* TexelBytes */ 502 NULL, /*impossible*/ /* FetchTexel1D */ 503 fetch_2d_texel_rgb_dxt1, /* FetchTexel2D */ 504 NULL, /*impossible*/ /* FetchTexel3D */ 505}; 506 507const struct gl_texture_format _mesa_texformat_rgba_dxt1 = { 508 MESA_FORMAT_RGBA_DXT1, /* MesaFormat */ 509 GL_RGBA, /* BaseFormat */ 510 4, /*approx*/ /* RedBits */ 511 4, /*approx*/ /* GreenBits */ 512 4, /*approx*/ /* BlueBits */ 513 1, /*approx*/ /* AlphaBits */ 514 0, /* LuminanceBits */ 515 0, /* IntensityBits */ 516 0, /* IndexBits */ 517 0, /* DepthBits */ 518 0, /* TexelBytes */ 519 NULL, /*impossible*/ /* FetchTexel1D */ 520 fetch_2d_texel_rgba_dxt1, /* FetchTexel2D */ 521 NULL, /*impossible*/ /* FetchTexel3D */ 522}; 523 524const struct gl_texture_format _mesa_texformat_rgba_dxt3 = { 525 MESA_FORMAT_RGBA_DXT3, /* MesaFormat */ 526 GL_RGBA, /* BaseFormat */ 527 4, /*approx*/ /* RedBits */ 528 4, /*approx*/ /* GreenBits */ 529 4, /*approx*/ /* BlueBits */ 530 4, /*approx*/ /* AlphaBits */ 531 0, /* LuminanceBits */ 532 0, /* IntensityBits */ 533 0, /* IndexBits */ 534 0, /* DepthBits */ 535 0, /* TexelBytes */ 536 NULL, /*impossible*/ /* FetchTexel1D */ 537 fetch_2d_texel_rgba_dxt3, /* FetchTexel2D */ 538 NULL, /*impossible*/ /* FetchTexel3D */ 539}; 540 541const struct gl_texture_format _mesa_texformat_rgba_dxt5 = { 542 MESA_FORMAT_RGBA_DXT5, /* MesaFormat */ 543 GL_RGBA, /* BaseFormat */ 544 4,/*approx*/ /* RedBits */ 545 4,/*approx*/ /* GreenBits */ 546 4,/*approx*/ /* BlueBits */ 547 4,/*approx*/ /* AlphaBits */ 548 0, /* LuminanceBits */ 549 0, /* IntensityBits */ 550 0, /* IndexBits */ 551 0, /* DepthBits */ 552 0, /* TexelBytes */ 553 NULL, /*impossible*/ /* FetchTexel1D */ 554 fetch_2d_texel_rgba_dxt5, /* FetchTexel2D */ 555 NULL, /*impossible*/ /* FetchTexel3D */ 556}; 557 558 559/* Big-endian */ 560#if 0 561const struct gl_texture_format _mesa_texformat_abgr8888 = { 562 MESA_FORMAT_ABGR8888, /* MesaFormat */ 563 GL_RGBA, /* BaseFormat */ 564 GL_UNSIGNED_INT_8_8_8_8, /* Type */ 565 8, /* RedBits */ 566 8, /* GreenBits */ 567 8, /* BlueBits */ 568 8, /* AlphaBits */ 569 0, /* LuminanceBits */ 570 0, /* IntensityBits */ 571 0, /* IndexBits */ 572 0, /* DepthBits */ 573 4, /* TexelBytes */ 574 fetch_1d_texel_abgr8888, /* FetchTexel1D */ 575 fetch_2d_texel_abgr8888, /* FetchTexel2D */ 576 fetch_3d_texel_abgr8888, /* FetchTexel3D */ 577}; 578 579const struct gl_texture_format _mesa_texformat_bgra8888 = { 580 MESA_FORMAT_BGRA8888, /* MesaFormat */ 581 GL_RGBA, /* BaseFormat */ 582 GL_UNSIGNED_INT_8_8_8_8, /* Type */ 583 8, /* RedBits */ 584 8, /* GreenBits */ 585 8, /* BlueBits */ 586 8, /* AlphaBits */ 587 0, /* LuminanceBits */ 588 0, /* IntensityBits */ 589 0, /* IndexBits */ 590 0, /* DepthBits */ 591 4, /* TexelBytes */ 592 fetch_1d_texel_bgra8888, /* FetchTexel1D */ 593 fetch_2d_texel_bgra8888, /* FetchTexel2D */ 594 fetch_3d_texel_bgra8888, /* FetchTexel3D */ 595}; 596 597const struct gl_texture_format _mesa_texformat_bgr888 = { 598 MESA_FORMAT_BGR888, /* MesaFormat */ 599 GL_RGB, /* BaseFormat */ 600 GL_UNSIGNED_BYTE, /* Type */ 601 8, /* RedBits */ 602 8, /* GreenBits */ 603 8, /* BlueBits */ 604 0, /* AlphaBits */ 605 0, /* LuminanceBits */ 606 0, /* IntensityBits */ 607 0, /* IndexBits */ 608 0, /* DepthBits */ 609 3, /* TexelBytes */ 610 fetch_1d_texel_bgr888, /* FetchTexel1D */ 611 fetch_2d_texel_bgr888, /* FetchTexel2D */ 612 fetch_3d_texel_bgr888, /* FetchTexel3D */ 613}; 614 615const struct gl_texture_format _mesa_texformat_bgr565 = { 616 MESA_FORMAT_BGR565, /* MesaFormat */ 617 GL_RGB, /* BaseFormat */ 618 GL_UNSIGNED_SHORT_5_6_5, /* Type */ 619 5, /* RedBits */ 620 6, /* GreenBits */ 621 5, /* BlueBits */ 622 0, /* AlphaBits */ 623 0, /* LuminanceBits */ 624 0, /* IntensityBits */ 625 0, /* IndexBits */ 626 0, /* DepthBits */ 627 2, /* TexelBytes */ 628 fetch_1d_texel_bgr565, /* FetchTexel1D */ 629 fetch_2d_texel_bgr565, /* FetchTexel2D */ 630 fetch_3d_texel_bgr565, /* FetchTexel3D */ 631}; 632 633const struct gl_texture_format _mesa_texformat_bgra4444 = { 634 MESA_FORMAT_BGRA4444, /* MesaFormat */ 635 GL_RGBA, /* BaseFormat */ 636 GL_UNSIGNED_SHORT_4_4_4_4_REV, /* Type */ 637 4, /* RedBits */ 638 4, /* GreenBits */ 639 4, /* BlueBits */ 640 4, /* AlphaBits */ 641 0, /* LuminanceBits */ 642 0, /* IntensityBits */ 643 0, /* IndexBits */ 644 0, /* DepthBits */ 645 2, /* TexelBytes */ 646 fetch_1d_texel_bgra4444, /* FetchTexel1D */ 647 fetch_2d_texel_bgra4444, /* FetchTexel2D */ 648 fetch_3d_texel_bgra4444, /* FetchTexel3D */ 649}; 650 651const struct gl_texture_format _mesa_texformat_bgra5551 = { 652 MESA_FORMAT_BGRA5551, /* MesaFormat */ 653 GL_RGBA, /* BaseFormat */ 654 GL_UNSIGNED_SHORT_1_5_5_5_REV, /* Type */ 655 5, /* RedBits */ 656 5, /* GreenBits */ 657 5, /* BlueBits */ 658 1, /* AlphaBits */ 659 0, /* LuminanceBits */ 660 0, /* IntensityBits */ 661 0, /* IndexBits */ 662 0, /* DepthBits */ 663 2, /* TexelBytes */ 664 fetch_1d_texel_bgra1555, /* FetchTexel1D */ 665 fetch_2d_texel_bgra1555, /* FetchTexel2D */ 666 fetch_3d_texel_bgra1555, /* FetchTexel3D */ 667}; 668 669const struct gl_texture_format _mesa_texformat_la88 = { 670 MESA_FORMAT_LA88, /* MesaFormat */ 671 GL_LUMINANCE_ALPHA, /* BaseFormat */ 672 GL_UNSIGNED_BYTE, /* Type */ 673 0, /* RedBits */ 674 0, /* GreenBits */ 675 0, /* BlueBits */ 676 8, /* AlphaBits */ 677 8, /* LuminanceBits */ 678 0, /* IntensityBits */ 679 0, /* IndexBits */ 680 0, /* DepthBits */ 681 2, /* TexelBytes */ 682 fetch_1d_texel_la88, /* FetchTexel1D */ 683 fetch_2d_texel_la88, /* FetchTexel2D */ 684 fetch_3d_texel_la88, /* FetchTexel3D */ 685}; 686 687const struct gl_texture_format _mesa_texformat_bgr233 = { 688 MESA_FORMAT_BGR233, /* MesaFormat */ 689 GL_RGB, /* BaseFormat */ 690 GL_UNSIGNED_BYTE_3_3_2, /* Type */ 691 3, /* RedBits */ 692 3, /* GreenBits */ 693 2, /* BlueBits */ 694 0, /* AlphaBits */ 695 0, /* LuminanceBits */ 696 0, /* IntensityBits */ 697 0, /* IndexBits */ 698 0, /* DepthBits */ 699 1, /* TexelBytes */ 700 fetch_1d_texel_bgr233, /* FetchTexel1D */ 701 fetch_2d_texel_bgr233, /* FetchTexel2D */ 702 fetch_3d_texel_bgr233, /* FetchTexel3D */ 703}; 704#endif 705 706/*@}*/ 707 708 709/***************************************************************/ 710/** \name Null format (useful for proxy textures) */ 711/*@{*/ 712 713const struct gl_texture_format _mesa_null_texformat = { 714 -1, /* MesaFormat */ 715 0, /* BaseFormat */ 716 0, /* RedBits */ 717 0, /* GreenBits */ 718 0, /* BlueBits */ 719 0, /* AlphaBits */ 720 0, /* LuminanceBits */ 721 0, /* IntensityBits */ 722 0, /* IndexBits */ 723 0, /* DepthBits */ 724 0, /* TexelBytes */ 725 fetch_null_texel, /* FetchTexel1D */ 726 fetch_null_texel, /* FetchTexel2D */ 727 fetch_null_texel, /* FetchTexel3D */ 728}; 729 730/*@}*/ 731 732 733/** 734 * Determine whether a given texture format is a hardware texture 735 * format. 736 * 737 * \param format texture format. 738 * 739 * \return GL_TRUE if \p format is a hardware texture format, or GL_FALSE 740 * otherwise. 741 * 742 * \p format is a hardware texture format if gl_texture_format::MesaFormat is 743 * lower than _format::MESA_FORMAT_RGBA. 744 */ 745GLboolean 746_mesa_is_hardware_tex_format( const struct gl_texture_format *format ) 747{ 748 return (format->MesaFormat < MESA_FORMAT_RGBA); 749} 750 751 752/** 753 * Choose an appropriate texture format. 754 * 755 * \param ctx GL context. 756 * \param internalFormat internal texture format. 757 * \param format pixel format. 758 * \param type data type. 759 * 760 * \return a pointer to a gl_texture_format in which to store the texture on 761 * success, or NULL on failure. 762 * 763 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers 764 * typically override this function with a specialized version. 765 */ 766const struct gl_texture_format * 767_mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat, 768 GLenum format, GLenum type ) 769{ 770 (void) format; 771 (void) type; 772 773 switch ( internalFormat ) { 774 /* GH: Bias towards GL_RGB, GL_RGBA texture formats. This has 775 * got to be better than sticking them way down the end of this 776 * huge list. 777 */ 778 case 4: /* Quake3 uses this... */ 779 case GL_RGBA: 780 return &_mesa_texformat_rgba; 781 782 case 3: /* ... and this. */ 783 case GL_RGB: 784 return &_mesa_texformat_rgb; 785 786 /* GH: Okay, keep checking as normal. Still test for GL_RGB, 787 * GL_RGBA formats first. 788 */ 789 case GL_RGBA2: 790 case GL_RGBA4: 791 case GL_RGB5_A1: 792 case GL_RGBA8: 793 case GL_RGB10_A2: 794 case GL_RGBA12: 795 case GL_RGBA16: 796 return &_mesa_texformat_rgba; 797 798 case GL_R3_G3_B2: 799 case GL_RGB4: 800 case GL_RGB5: 801 case GL_RGB8: 802 case GL_RGB10: 803 case GL_RGB12: 804 case GL_RGB16: 805 return &_mesa_texformat_rgb; 806 807 case GL_ALPHA: 808 case GL_ALPHA4: 809 case GL_ALPHA8: 810 case GL_ALPHA12: 811 case GL_ALPHA16: 812 return &_mesa_texformat_alpha; 813 814 case 1: 815 case GL_LUMINANCE: 816 case GL_LUMINANCE4: 817 case GL_LUMINANCE8: 818 case GL_LUMINANCE12: 819 case GL_LUMINANCE16: 820 return &_mesa_texformat_luminance; 821 822 case 2: 823 case GL_LUMINANCE_ALPHA: 824 case GL_LUMINANCE4_ALPHA4: 825 case GL_LUMINANCE6_ALPHA2: 826 case GL_LUMINANCE8_ALPHA8: 827 case GL_LUMINANCE12_ALPHA4: 828 case GL_LUMINANCE12_ALPHA12: 829 case GL_LUMINANCE16_ALPHA16: 830 return &_mesa_texformat_luminance_alpha; 831 832 case GL_INTENSITY: 833 case GL_INTENSITY4: 834 case GL_INTENSITY8: 835 case GL_INTENSITY12: 836 case GL_INTENSITY16: 837 return &_mesa_texformat_intensity; 838 839 case GL_COLOR_INDEX: 840 case GL_COLOR_INDEX1_EXT: 841 case GL_COLOR_INDEX2_EXT: 842 case GL_COLOR_INDEX4_EXT: 843 case GL_COLOR_INDEX8_EXT: 844 case GL_COLOR_INDEX12_EXT: 845 case GL_COLOR_INDEX16_EXT: 846 return &_mesa_texformat_color_index; 847 848 case GL_DEPTH_COMPONENT: 849 case GL_DEPTH_COMPONENT16_SGIX: 850 case GL_DEPTH_COMPONENT24_SGIX: 851 case GL_DEPTH_COMPONENT32_SGIX: 852 if (!ctx->Extensions.SGIX_depth_texture) 853 _mesa_problem(ctx, "depth format without GL_SGIX_depth_texture"); 854 return &_mesa_texformat_depth_component; 855 856 case GL_COMPRESSED_ALPHA_ARB: 857 if (!ctx->Extensions.ARB_texture_compression) 858 _mesa_problem(ctx, "texture compression extension not enabled"); 859 return &_mesa_texformat_alpha; 860 case GL_COMPRESSED_LUMINANCE_ARB: 861 if (!ctx->Extensions.ARB_texture_compression) 862 _mesa_problem(ctx, "texture compression extension not enabled"); 863 return &_mesa_texformat_luminance; 864 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: 865 if (!ctx->Extensions.ARB_texture_compression) 866 _mesa_problem(ctx, "texture compression extension not enabled"); 867 return &_mesa_texformat_luminance_alpha; 868 case GL_COMPRESSED_INTENSITY_ARB: 869 if (!ctx->Extensions.ARB_texture_compression) 870 _mesa_problem(ctx, "texture compression extension not enabled"); 871 return &_mesa_texformat_intensity; 872 case GL_COMPRESSED_RGB_ARB: 873 if (!ctx->Extensions.ARB_texture_compression) 874 _mesa_problem(ctx, "texture compression extension not enabled"); 875 if (ctx->Extensions.TDFX_texture_compression_FXT1) 876 return &_mesa_texformat_rgb_fxt1; 877 else if (ctx->Extensions.EXT_texture_compression_s3tc || ctx->Extensions.S3_s3tc) 878 return &_mesa_texformat_rgb_dxt1; 879 return &_mesa_texformat_rgb; 880 case GL_COMPRESSED_RGBA_ARB: 881 if (!ctx->Extensions.ARB_texture_compression) 882 _mesa_problem(ctx, "texture compression extension not enabled"); 883 if (ctx->Extensions.TDFX_texture_compression_FXT1) 884 return &_mesa_texformat_rgba_fxt1; 885 else if (ctx->Extensions.EXT_texture_compression_s3tc || ctx->Extensions.S3_s3tc) 886 return &_mesa_texformat_rgba_dxt3; /* Not rgba_dxt1! See the spec */ 887 return &_mesa_texformat_rgba; 888 889 /* GL_MESA_ycrcr_texture */ 890 case GL_YCBCR_MESA: 891 if (type == GL_UNSIGNED_SHORT_8_8_MESA) 892 return &_mesa_texformat_ycbcr; 893 else 894 return &_mesa_texformat_ycbcr_rev; 895 896 /* GL_3DFX_texture_compression_FXT1 */ 897 case GL_COMPRESSED_RGB_FXT1_3DFX: 898 if (ctx->Extensions.TDFX_texture_compression_FXT1) 899 return &_mesa_texformat_rgb_fxt1; 900 else 901 return NULL; 902 case GL_COMPRESSED_RGBA_FXT1_3DFX: 903 if (ctx->Extensions.TDFX_texture_compression_FXT1) 904 return &_mesa_texformat_rgba_fxt1; 905 else 906 return NULL; 907 908 /* GL_EXT_texture_compression_s3tc */ 909 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 910 if (ctx->Extensions.EXT_texture_compression_s3tc) 911 return &_mesa_texformat_rgb_dxt1; 912 else 913 return NULL; 914 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 915 if (ctx->Extensions.EXT_texture_compression_s3tc) 916 return &_mesa_texformat_rgba_dxt1; 917 else 918 return NULL; 919 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 920 if (ctx->Extensions.EXT_texture_compression_s3tc) 921 return &_mesa_texformat_rgba_dxt3; 922 else 923 return NULL; 924 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 925 if (ctx->Extensions.EXT_texture_compression_s3tc) 926 return &_mesa_texformat_rgba_dxt5; 927 else 928 return NULL; 929 930 /* GL_S3_s3tc */ 931 case GL_RGB_S3TC: 932 case GL_RGB4_S3TC: 933 if (ctx->Extensions.S3_s3tc) 934 return &_mesa_texformat_rgb_dxt1; 935 else 936 return NULL; 937 case GL_RGBA_S3TC: 938 case GL_RGBA4_S3TC: 939 if (ctx->Extensions.S3_s3tc) 940 return &_mesa_texformat_rgba_dxt3; 941 else 942 return NULL; 943 944 default: 945 _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()"); 946 return NULL; 947 } 948} 949 950 951/** 952 * Return the base texture format for the given compressed format 953 * 954 * Called via dd_function_table::Driver.BaseCompressedTexFormat. 955 * This function is used by software rasterizers. Hardware drivers 956 * which support texture compression should not use this function but 957 * a specialized function instead. 958 */ 959GLint 960_mesa_base_compressed_texformat(GLcontext *ctx, GLint intFormat) 961{ 962 switch (intFormat) { 963 case GL_COMPRESSED_ALPHA_ARB: 964 return GL_ALPHA; 965 case GL_COMPRESSED_LUMINANCE_ARB: 966 return GL_LUMINANCE; 967 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB: 968 return GL_LUMINANCE_ALPHA; 969 case GL_COMPRESSED_INTENSITY_ARB: 970 return GL_INTENSITY; 971 case GL_COMPRESSED_RGB_ARB: 972 return GL_RGB; 973 case GL_COMPRESSED_RGBA_ARB: 974 return GL_RGBA; 975 default: 976 return -1; /* not a recognized compressed format */ 977 } 978} 979