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