2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
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:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
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.
30 * \author Gareth Hughes
36 #include "texformat.h"
40 #if FEATURE_EXT_texture_sRGB
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.
48 nonlinear_to_linear(GLubyte cs8
)
50 static GLfloat table
[256];
51 static GLboolean tableReady
= GL_FALSE
;
53 /* compute lookup table now */
55 for (i
= 0; i
< 256; i
++) {
56 const GLfloat cs
= UBYTE_TO_FLOAT(i
);
58 table
[i
] = cs
/ 12.92;
61 table
[i
] = _mesa_pow((cs
+ 0.055) / 1.055, 2.4);
70 #endif /* FEATURE_EXT_texture_sRGB */
73 /* Texel fetch routines for all supported formats
76 #include "texformat_tmp.h"
79 #include "texformat_tmp.h"
82 #include "texformat_tmp.h"
85 * Null texel fetch function.
87 * Have to have this so the FetchTexel function pointer is never NULL.
89 static void fetch_null_texel( const struct gl_texture_image
*texImage
,
90 GLint i
, GLint j
, GLint k
, GLchan
*texel
)
92 (void) texImage
; (void) i
; (void) j
; (void) k
;
97 _mesa_warning(NULL
, "fetch_null_texel() called!");
100 static void fetch_null_texelf( const struct gl_texture_image
*texImage
,
101 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
103 (void) texImage
; (void) i
; (void) j
; (void) k
;
108 _mesa_warning(NULL
, "fetch_null_texelf() called!");
111 static void store_null_texel(struct gl_texture_image
*texImage
,
112 GLint i
, GLint j
, GLint k
, const void *texel
)
124 * Notes about the predefined gl_texture_formats:
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.
137 /***************************************************************/
138 /** \name Default GLchan-based formats */
141 const 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 */
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 */
165 const 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 */
173 0, /* LuminanceBits */
174 0, /* IntensityBits */
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 */
189 const struct gl_texture_format _mesa_texformat_alpha
= {
190 MESA_FORMAT_ALPHA
, /* MesaFormat */
191 GL_ALPHA
, /* BaseFormat */
192 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
196 CHAN_BITS
, /* AlphaBits */
197 0, /* LuminanceBits */
198 0, /* IntensityBits */
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 */
213 const struct gl_texture_format _mesa_texformat_luminance
= {
214 MESA_FORMAT_LUMINANCE
, /* MesaFormat */
215 GL_LUMINANCE
, /* BaseFormat */
216 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
221 CHAN_BITS
, /* LuminanceBits */
222 0, /* IntensityBits */
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 */
237 const 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 */
244 CHAN_BITS
, /* AlphaBits */
245 CHAN_BITS
, /* LuminanceBits */
246 0, /* IntensityBits */
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 */
261 const struct gl_texture_format _mesa_texformat_intensity
= {
262 MESA_FORMAT_INTENSITY
, /* MesaFormat */
263 GL_INTENSITY
, /* BaseFormat */
264 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
269 0, /* LuminanceBits */
270 CHAN_BITS
, /* IntensityBits */
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 */
286 #if FEATURE_EXT_texture_sRGB
288 const struct gl_texture_format _mesa_texformat_srgb8
= {
289 MESA_FORMAT_SRGB8
, /* MesaFormat */
290 GL_RGB
, /* BaseFormat */
291 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
296 0, /* LuminanceBits */
297 0, /* IntensityBits */
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 */
312 const struct gl_texture_format _mesa_texformat_srgba8
= {
313 MESA_FORMAT_SRGBA8
, /* MesaFormat */
314 GL_RGBA
, /* BaseFormat */
315 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
320 0, /* LuminanceBits */
321 0, /* IntensityBits */
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 */
336 const struct gl_texture_format _mesa_texformat_sl8
= {
337 MESA_FORMAT_SL8
, /* MesaFormat */
338 GL_LUMINANCE
, /* BaseFormat */
339 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
344 8, /* LuminanceBits */
345 0, /* IntensityBits */
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 */
360 const struct gl_texture_format _mesa_texformat_sla8
= {
361 MESA_FORMAT_SLA8
, /* MesaFormat */
362 GL_LUMINANCE_ALPHA
, /* BaseFormat */
363 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
368 8, /* LuminanceBits */
369 0, /* IntensityBits */
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 */
384 #endif /* FEATURE_EXT_texture_sRGB */
386 const 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 */
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 */
410 const 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 */
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 */
434 const 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 */
442 0, /* LuminanceBits */
443 0, /* IntensityBits */
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 */
458 const 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 */
466 0, /* LuminanceBits */
467 0, /* IntensityBits */
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 */
482 const struct gl_texture_format _mesa_texformat_alpha_float32
= {
483 MESA_FORMAT_ALPHA_FLOAT32
, /* MesaFormat */
484 GL_ALPHA
, /* BaseFormat */
485 GL_FLOAT
, /* DataType */
489 8 * sizeof(GLfloat
), /* AlphaBits */
490 0, /* LuminanceBits */
491 0, /* IntensityBits */
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 */
506 const struct gl_texture_format _mesa_texformat_alpha_float16
= {
507 MESA_FORMAT_ALPHA_FLOAT16
, /* MesaFormat */
508 GL_ALPHA
, /* BaseFormat */
509 GL_FLOAT
, /* DataType */
513 8 * sizeof(GLhalfARB
), /* AlphaBits */
514 0, /* LuminanceBits */
515 0, /* IntensityBits */
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 */
530 const struct gl_texture_format _mesa_texformat_luminance_float32
= {
531 MESA_FORMAT_LUMINANCE_FLOAT32
, /* MesaFormat */
532 GL_LUMINANCE
, /* BaseFormat */
533 GL_FLOAT
, /* DataType */
538 8 * sizeof(GLfloat
), /* LuminanceBits */
539 0, /* IntensityBits */
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 */
554 const struct gl_texture_format _mesa_texformat_luminance_float16
= {
555 MESA_FORMAT_LUMINANCE_FLOAT16
, /* MesaFormat */
556 GL_LUMINANCE
, /* BaseFormat */
557 GL_FLOAT
, /* DataType */
562 8 * sizeof(GLhalfARB
), /* LuminanceBits */
563 0, /* IntensityBits */
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 */
578 const 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 */
585 8 * sizeof(GLfloat
), /* AlphaBits */
586 8 * sizeof(GLfloat
), /* LuminanceBits */
587 0, /* IntensityBits */
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 */
602 const 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 */
609 8 * sizeof(GLhalfARB
), /* AlphaBits */
610 8 * sizeof(GLhalfARB
), /* LuminanceBits */
611 0, /* IntensityBits */
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 */
626 const struct gl_texture_format _mesa_texformat_intensity_float32
= {
627 MESA_FORMAT_INTENSITY_FLOAT32
, /* MesaFormat */
628 GL_INTENSITY
, /* BaseFormat */
629 GL_FLOAT
, /* DataType */
634 0, /* LuminanceBits */
635 8 * sizeof(GLfloat
), /* IntensityBits */
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 */
650 const struct gl_texture_format _mesa_texformat_intensity_float16
= {
651 MESA_FORMAT_INTENSITY_FLOAT16
, /* MesaFormat */
652 GL_INTENSITY
, /* BaseFormat */
653 GL_FLOAT
, /* DataType */
658 0, /* LuminanceBits */
659 8 * sizeof(GLhalfARB
), /* IntensityBits */
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 */
678 /***************************************************************/
679 /** \name Hardware formats */
682 const struct gl_texture_format _mesa_texformat_rgba8888
= {
683 MESA_FORMAT_RGBA8888
, /* MesaFormat */
684 GL_RGBA
, /* BaseFormat */
685 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
690 0, /* LuminanceBits */
691 0, /* IntensityBits */
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 */
706 const struct gl_texture_format _mesa_texformat_rgba8888_rev
= {
707 MESA_FORMAT_RGBA8888_REV
, /* MesaFormat */
708 GL_RGBA
, /* BaseFormat */
709 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
714 0, /* LuminanceBits */
715 0, /* IntensityBits */
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 */
730 const struct gl_texture_format _mesa_texformat_argb8888
= {
731 MESA_FORMAT_ARGB8888
, /* MesaFormat */
732 GL_RGBA
, /* BaseFormat */
733 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
738 0, /* LuminanceBits */
739 0, /* IntensityBits */
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 */
754 const struct gl_texture_format _mesa_texformat_argb8888_rev
= {
755 MESA_FORMAT_ARGB8888_REV
, /* MesaFormat */
756 GL_RGBA
, /* BaseFormat */
757 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
762 0, /* LuminanceBits */
763 0, /* IntensityBits */
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 */
778 const struct gl_texture_format _mesa_texformat_rgb888
= {
779 MESA_FORMAT_RGB888
, /* MesaFormat */
780 GL_RGB
, /* BaseFormat */
781 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
786 0, /* LuminanceBits */
787 0, /* IntensityBits */
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 */
802 const struct gl_texture_format _mesa_texformat_bgr888
= {
803 MESA_FORMAT_BGR888
, /* MesaFormat */
804 GL_RGB
, /* BaseFormat */
805 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
810 0, /* LuminanceBits */
811 0, /* IntensityBits */
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 */
826 const struct gl_texture_format _mesa_texformat_rgb565
= {
827 MESA_FORMAT_RGB565
, /* MesaFormat */
828 GL_RGB
, /* BaseFormat */
829 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
834 0, /* LuminanceBits */
835 0, /* IntensityBits */
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 */
850 const struct gl_texture_format _mesa_texformat_rgb565_rev
= {
851 MESA_FORMAT_RGB565_REV
, /* MesaFormat */
852 GL_RGB
, /* BaseFormat */
853 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
858 0, /* LuminanceBits */
859 0, /* IntensityBits */
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 */
874 const struct gl_texture_format _mesa_texformat_argb4444
= {
875 MESA_FORMAT_ARGB4444
, /* MesaFormat */
876 GL_RGBA
, /* BaseFormat */
877 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
882 0, /* LuminanceBits */
883 0, /* IntensityBits */
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 */
898 const struct gl_texture_format _mesa_texformat_argb4444_rev
= {
899 MESA_FORMAT_ARGB4444_REV
, /* MesaFormat */
900 GL_RGBA
, /* BaseFormat */
901 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
906 0, /* LuminanceBits */
907 0, /* IntensityBits */
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 */
922 const struct gl_texture_format _mesa_texformat_argb1555
= {
923 MESA_FORMAT_ARGB1555
, /* MesaFormat */
924 GL_RGBA
, /* BaseFormat */
925 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
930 0, /* LuminanceBits */
931 0, /* IntensityBits */
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 */
946 const struct gl_texture_format _mesa_texformat_argb1555_rev
= {
947 MESA_FORMAT_ARGB1555_REV
, /* MesaFormat */
948 GL_RGBA
, /* BaseFormat */
949 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
954 0, /* LuminanceBits */
955 0, /* IntensityBits */
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 */
970 const struct gl_texture_format _mesa_texformat_al88
= {
971 MESA_FORMAT_AL88
, /* MesaFormat */
972 GL_LUMINANCE_ALPHA
, /* BaseFormat */
973 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
978 8, /* LuminanceBits */
979 0, /* IntensityBits */
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 */
994 const 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 */
1002 8, /* LuminanceBits */
1003 0, /* IntensityBits */
1006 0, /* StencilBits */
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 */
1018 const struct gl_texture_format _mesa_texformat_rgb332
= {
1019 MESA_FORMAT_RGB332
, /* MesaFormat */
1020 GL_RGB
, /* BaseFormat */
1021 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
1026 0, /* LuminanceBits */
1027 0, /* IntensityBits */
1030 0, /* StencilBits */
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 */
1042 const struct gl_texture_format _mesa_texformat_a8
= {
1043 MESA_FORMAT_A8
, /* MesaFormat */
1044 GL_ALPHA
, /* BaseFormat */
1045 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
1050 0, /* LuminanceBits */
1051 0, /* IntensityBits */
1054 0, /* StencilBits */
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 */
1066 const struct gl_texture_format _mesa_texformat_l8
= {
1067 MESA_FORMAT_L8
, /* MesaFormat */
1068 GL_LUMINANCE
, /* BaseFormat */
1069 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
1074 8, /* LuminanceBits */
1075 0, /* IntensityBits */
1078 0, /* StencilBits */
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 */
1090 const struct gl_texture_format _mesa_texformat_i8
= {
1091 MESA_FORMAT_I8
, /* MesaFormat */
1092 GL_INTENSITY
, /* BaseFormat */
1093 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
1098 0, /* LuminanceBits */
1099 8, /* IntensityBits */
1102 0, /* StencilBits */
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 */
1114 const struct gl_texture_format _mesa_texformat_ci8
= {
1115 MESA_FORMAT_CI8
, /* MesaFormat */
1116 GL_COLOR_INDEX
, /* BaseFormat */
1117 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
1122 0, /* LuminanceBits */
1123 0, /* IntensityBits */
1126 0, /* StencilBits */
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 */
1138 const struct gl_texture_format _mesa_texformat_ycbcr
= {
1139 MESA_FORMAT_YCBCR
, /* MesaFormat */
1140 GL_YCBCR_MESA
, /* BaseFormat */
1141 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
1146 0, /* LuminanceBits */
1147 0, /* IntensityBits */
1150 0, /* StencilBits */
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 */
1162 const 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 */
1170 0, /* LuminanceBits */
1171 0, /* IntensityBits */
1174 0, /* StencilBits */
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 */
1186 const 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 */
1194 0, /* LuminanceBits */
1195 0, /* IntensityBits */
1198 8, /* StencilBits */
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 */
1210 const struct gl_texture_format _mesa_texformat_z16
= {
1211 MESA_FORMAT_Z16
, /* MesaFormat */
1212 GL_DEPTH_COMPONENT
, /* BaseFormat */
1213 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
1218 0, /* LuminanceBits */
1219 0, /* IntensityBits */
1221 sizeof(GLushort
) * 8, /* DepthBits */
1222 0, /* StencilBits */
1223 sizeof(GLushort
), /* TexelBytes */
1224 _mesa_texstore_z16
, /* StoreTexImageFunc */
1225 NULL
, /* FetchTexel1D */
1226 NULL
, /* FetchTexel1D */
1227 NULL
, /* FetchTexel1D */
1228 fetch_texel_1d_f_z16
, /* FetchTexel1Df */
1229 fetch_texel_2d_f_z16
, /* FetchTexel2Df */
1230 fetch_texel_3d_f_z16
, /* FetchTexel3Df */
1231 store_texel_z16
/* StoreTexel */
1234 const struct gl_texture_format _mesa_texformat_z32
= {
1235 MESA_FORMAT_Z32
, /* MesaFormat */
1236 GL_DEPTH_COMPONENT
, /* BaseFormat */
1237 GL_UNSIGNED_NORMALIZED_ARB
, /* DataType */
1242 0, /* LuminanceBits */
1243 0, /* IntensityBits */
1245 sizeof(GLuint
) * 8, /* DepthBits */
1246 0, /* StencilBits */
1247 sizeof(GLuint
), /* TexelBytes */
1248 _mesa_texstore_z32
, /* StoreTexImageFunc */
1249 NULL
, /* FetchTexel1D */
1250 NULL
, /* FetchTexel1D */
1251 NULL
, /* FetchTexel1D */
1252 fetch_texel_1d_f_z32
, /* FetchTexel1Df */
1253 fetch_texel_2d_f_z32
, /* FetchTexel2Df */
1254 fetch_texel_3d_f_z32
, /* FetchTexel3Df */
1255 store_texel_z32
/* StoreTexel */
1261 /***************************************************************/
1262 /** \name Null format (useful for proxy textures) */
1265 const struct gl_texture_format _mesa_null_texformat
= {
1266 -1, /* MesaFormat */
1268 GL_NONE
, /* DataType */
1273 0, /* LuminanceBits */
1274 0, /* IntensityBits */
1277 0, /* StencilBits */
1279 NULL
, /* StoreTexImageFunc */
1280 fetch_null_texel
, /* FetchTexel1D */
1281 fetch_null_texel
, /* FetchTexel2D */
1282 fetch_null_texel
, /* FetchTexel3D */
1283 fetch_null_texelf
, /* FetchTexel1Df */
1284 fetch_null_texelf
, /* FetchTexel2Df */
1285 fetch_null_texelf
, /* FetchTexel3Df */
1286 store_null_texel
/* StoreTexel */
1293 * Choose an appropriate texture format given the format, type and
1294 * internalFormat parameters passed to glTexImage().
1296 * \param ctx the GL context.
1297 * \param internalFormat user's prefered internal texture format.
1298 * \param format incoming image pixel format.
1299 * \param type incoming image data type.
1301 * \return a pointer to a gl_texture_format object which describes the
1302 * choosen texture format, or NULL on failure.
1304 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers
1305 * will typically override this function with a specialized version.
1307 const struct gl_texture_format
*
1308 _mesa_choose_tex_format( GLcontext
*ctx
, GLint internalFormat
,
1309 GLenum format
, GLenum type
)
1314 switch (internalFormat
) {
1321 return &_mesa_texformat_rgba
;
1323 return &_mesa_texformat_rgba8888
;
1325 return &_mesa_texformat_argb1555
;
1327 return &_mesa_texformat_argb4444_rev
; /* just to test another format*/
1329 return &_mesa_texformat_argb4444
;
1337 return &_mesa_texformat_rgb
;
1339 return &_mesa_texformat_rgb888
;
1341 return &_mesa_texformat_rgb332
;
1343 return &_mesa_texformat_rgb565_rev
; /* just to test another format */
1345 return &_mesa_texformat_rgb565
;
1352 return &_mesa_texformat_alpha
;
1354 return &_mesa_texformat_a8
;
1356 /* Luminance formats */
1360 case GL_LUMINANCE12
:
1361 case GL_LUMINANCE16
:
1362 return &_mesa_texformat_luminance
;
1364 return &_mesa_texformat_l8
;
1366 /* Luminance/Alpha formats */
1368 case GL_LUMINANCE_ALPHA
:
1369 case GL_LUMINANCE4_ALPHA4
:
1370 case GL_LUMINANCE6_ALPHA2
:
1371 case GL_LUMINANCE12_ALPHA4
:
1372 case GL_LUMINANCE12_ALPHA12
:
1373 case GL_LUMINANCE16_ALPHA16
:
1374 return &_mesa_texformat_luminance_alpha
;
1375 case GL_LUMINANCE8_ALPHA8
:
1376 return &_mesa_texformat_al88
;
1380 case GL_INTENSITY12
:
1381 case GL_INTENSITY16
:
1382 return &_mesa_texformat_intensity
;
1384 return &_mesa_texformat_i8
;
1386 case GL_COLOR_INDEX
:
1387 case GL_COLOR_INDEX1_EXT
:
1388 case GL_COLOR_INDEX2_EXT
:
1389 case GL_COLOR_INDEX4_EXT
:
1390 case GL_COLOR_INDEX12_EXT
:
1391 case GL_COLOR_INDEX16_EXT
:
1392 case GL_COLOR_INDEX8_EXT
:
1393 return &_mesa_texformat_ci8
;
1399 if (ctx
->Extensions
.SGIX_depth_texture
||
1400 ctx
->Extensions
.ARB_depth_texture
) {
1401 switch (internalFormat
) {
1402 case GL_DEPTH_COMPONENT
:
1403 case GL_DEPTH_COMPONENT24_SGIX
:
1404 case GL_DEPTH_COMPONENT32_SGIX
:
1405 return &_mesa_texformat_z32
;
1406 case GL_DEPTH_COMPONENT16_SGIX
:
1407 return &_mesa_texformat_z16
;
1413 if (ctx
->Extensions
.ARB_texture_compression
) {
1414 switch (internalFormat
) {
1415 case GL_COMPRESSED_ALPHA_ARB
:
1416 return &_mesa_texformat_alpha
;
1417 case GL_COMPRESSED_LUMINANCE_ARB
:
1418 return &_mesa_texformat_luminance
;
1419 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB
:
1420 return &_mesa_texformat_luminance_alpha
;
1421 case GL_COMPRESSED_INTENSITY_ARB
:
1422 return &_mesa_texformat_intensity
;
1423 case GL_COMPRESSED_RGB_ARB
:
1424 if (ctx
->Extensions
.TDFX_texture_compression_FXT1
)
1425 return &_mesa_texformat_rgb_fxt1
;
1426 else if (ctx
->Extensions
.EXT_texture_compression_s3tc
||
1427 ctx
->Extensions
.S3_s3tc
)
1428 return &_mesa_texformat_rgb_dxt1
;
1430 return &_mesa_texformat_rgb
;
1431 case GL_COMPRESSED_RGBA_ARB
:
1432 if (ctx
->Extensions
.TDFX_texture_compression_FXT1
)
1433 return &_mesa_texformat_rgba_fxt1
;
1434 else if (ctx
->Extensions
.EXT_texture_compression_s3tc
||
1435 ctx
->Extensions
.S3_s3tc
)
1436 return &_mesa_texformat_rgba_dxt3
; /* Not rgba_dxt1, see spec */
1438 return &_mesa_texformat_rgba
;
1444 if (ctx
->Extensions
.MESA_ycbcr_texture
) {
1445 if (internalFormat
== GL_YCBCR_MESA
) {
1446 if (type
== GL_UNSIGNED_SHORT_8_8_MESA
)
1447 return &_mesa_texformat_ycbcr
;
1449 return &_mesa_texformat_ycbcr_rev
;
1453 if (ctx
->Extensions
.TDFX_texture_compression_FXT1
) {
1454 switch (internalFormat
) {
1455 case GL_COMPRESSED_RGB_FXT1_3DFX
:
1456 return &_mesa_texformat_rgb_fxt1
;
1457 case GL_COMPRESSED_RGBA_FXT1_3DFX
:
1458 return &_mesa_texformat_rgba_fxt1
;
1464 if (ctx
->Extensions
.EXT_texture_compression_s3tc
) {
1465 switch (internalFormat
) {
1466 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT
:
1467 return &_mesa_texformat_rgb_dxt1
;
1468 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
:
1469 return &_mesa_texformat_rgba_dxt1
;
1470 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
:
1471 return &_mesa_texformat_rgba_dxt3
;
1472 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
:
1473 return &_mesa_texformat_rgba_dxt5
;
1479 if (ctx
->Extensions
.S3_s3tc
) {
1480 switch (internalFormat
) {
1483 return &_mesa_texformat_rgb_dxt1
;
1486 return &_mesa_texformat_rgba_dxt3
;
1492 if (ctx
->Extensions
.ARB_texture_float
) {
1493 switch (internalFormat
) {
1494 case GL_ALPHA16F_ARB
:
1495 return &_mesa_texformat_alpha_float16
;
1496 case GL_ALPHA32F_ARB
:
1497 return &_mesa_texformat_alpha_float32
;
1498 case GL_LUMINANCE16F_ARB
:
1499 return &_mesa_texformat_luminance_float16
;
1500 case GL_LUMINANCE32F_ARB
:
1501 return &_mesa_texformat_luminance_float32
;
1502 case GL_LUMINANCE_ALPHA16F_ARB
:
1503 return &_mesa_texformat_luminance_alpha_float16
;
1504 case GL_LUMINANCE_ALPHA32F_ARB
:
1505 return &_mesa_texformat_luminance_alpha_float32
;
1506 case GL_INTENSITY16F_ARB
:
1507 return &_mesa_texformat_intensity_float16
;
1508 case GL_INTENSITY32F_ARB
:
1509 return &_mesa_texformat_intensity_float32
;
1511 return &_mesa_texformat_rgb_float16
;
1513 return &_mesa_texformat_rgb_float32
;
1514 case GL_RGBA16F_ARB
:
1515 return &_mesa_texformat_rgba_float16
;
1516 case GL_RGBA32F_ARB
:
1517 return &_mesa_texformat_rgba_float32
;
1523 if (ctx
->Extensions
.EXT_packed_depth_stencil
) {
1524 switch (internalFormat
) {
1525 case GL_DEPTH_STENCIL_EXT
:
1526 case GL_DEPTH24_STENCIL8_EXT
:
1527 return &_mesa_texformat_z24_s8
;
1533 #if FEATURE_EXT_texture_sRGB
1534 if (ctx
->Extensions
.EXT_texture_sRGB
) {
1535 switch (internalFormat
) {
1538 return &_mesa_texformat_srgb8
;
1539 case GL_SRGB_ALPHA_EXT
:
1540 case GL_SRGB8_ALPHA8_EXT
:
1541 return &_mesa_texformat_srgba8
;
1542 case GL_SLUMINANCE_EXT
:
1543 case GL_SLUMINANCE8_EXT
:
1544 return &_mesa_texformat_sl8
;
1545 case GL_SLUMINANCE_ALPHA_EXT
:
1546 case GL_SLUMINANCE8_ALPHA8_EXT
:
1547 return &_mesa_texformat_sla8
;
1548 /* NOTE: not supporting any compression of sRGB at this time */
1549 case GL_COMPRESSED_SRGB_EXT
:
1550 return &_mesa_texformat_srgb8
;
1551 case GL_COMPRESSED_SRGB_ALPHA_EXT
:
1552 return &_mesa_texformat_srgba8
;
1553 case GL_COMPRESSED_SLUMINANCE_EXT
:
1554 return &_mesa_texformat_sl8
;
1555 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
:
1556 return &_mesa_texformat_sla8
;
1557 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
:
1558 return &_mesa_texformat_srgb8
;
1559 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
:
1560 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
:
1561 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
:
1562 return &_mesa_texformat_srgba8
;
1567 #endif /* FEATURE_EXT_texture_sRGB */
1569 _mesa_problem(ctx
, "unexpected format in _mesa_choose_tex_format()");
1576 * Return datatype and number of components per texel for the
1577 * given gl_texture_format.
1580 _mesa_format_to_type_and_comps(const struct gl_texture_format
*format
,
1581 GLenum
*datatype
, GLuint
*comps
)
1583 switch (format
->MesaFormat
) {
1584 case MESA_FORMAT_RGBA8888
:
1585 case MESA_FORMAT_RGBA8888_REV
:
1586 case MESA_FORMAT_ARGB8888
:
1587 case MESA_FORMAT_ARGB8888_REV
:
1588 *datatype
= CHAN_TYPE
;
1591 case MESA_FORMAT_RGB888
:
1592 case MESA_FORMAT_BGR888
:
1593 *datatype
= GL_UNSIGNED_BYTE
;
1596 case MESA_FORMAT_RGB565
:
1597 case MESA_FORMAT_RGB565_REV
:
1598 *datatype
= GL_UNSIGNED_SHORT_5_6_5
;
1602 case MESA_FORMAT_ARGB4444
:
1603 case MESA_FORMAT_ARGB4444_REV
:
1604 *datatype
= GL_UNSIGNED_SHORT_4_4_4_4
;
1608 case MESA_FORMAT_ARGB1555
:
1609 case MESA_FORMAT_ARGB1555_REV
:
1610 *datatype
= GL_UNSIGNED_SHORT_1_5_5_5_REV
;
1614 case MESA_FORMAT_AL88
:
1615 case MESA_FORMAT_AL88_REV
:
1616 *datatype
= GL_UNSIGNED_BYTE
;
1619 case MESA_FORMAT_RGB332
:
1620 *datatype
= GL_UNSIGNED_BYTE_3_3_2
;
1624 case MESA_FORMAT_A8
:
1625 case MESA_FORMAT_L8
:
1626 case MESA_FORMAT_I8
:
1627 case MESA_FORMAT_CI8
:
1628 *datatype
= GL_UNSIGNED_BYTE
;
1632 case MESA_FORMAT_YCBCR
:
1633 case MESA_FORMAT_YCBCR_REV
:
1634 *datatype
= GL_UNSIGNED_SHORT
;
1638 case MESA_FORMAT_Z24_S8
:
1639 *datatype
= GL_UNSIGNED_INT
;
1640 *comps
= 1; /* XXX OK? */
1643 case MESA_FORMAT_Z16
:
1644 *datatype
= GL_UNSIGNED_SHORT
;
1648 case MESA_FORMAT_Z32
:
1649 *datatype
= GL_UNSIGNED_INT
;
1653 case MESA_FORMAT_SRGB8
:
1654 *datatype
= GL_UNSIGNED_BYTE
;
1657 case MESA_FORMAT_SRGBA8
:
1658 *datatype
= GL_UNSIGNED_BYTE
;
1661 case MESA_FORMAT_SL8
:
1662 *datatype
= GL_UNSIGNED_BYTE
;
1665 case MESA_FORMAT_SLA8
:
1666 *datatype
= GL_UNSIGNED_BYTE
;
1670 case MESA_FORMAT_RGB_FXT1
:
1671 case MESA_FORMAT_RGBA_FXT1
:
1672 case MESA_FORMAT_RGB_DXT1
:
1673 case MESA_FORMAT_RGBA_DXT1
:
1674 case MESA_FORMAT_RGBA_DXT3
:
1675 case MESA_FORMAT_RGBA_DXT5
:
1676 /* XXX generate error instead? */
1677 *datatype
= GL_UNSIGNED_BYTE
;
1681 case MESA_FORMAT_RGBA
:
1682 *datatype
= CHAN_TYPE
;
1685 case MESA_FORMAT_RGB
:
1686 *datatype
= CHAN_TYPE
;
1689 case MESA_FORMAT_LUMINANCE_ALPHA
:
1690 *datatype
= CHAN_TYPE
;
1693 case MESA_FORMAT_ALPHA
:
1694 case MESA_FORMAT_LUMINANCE
:
1695 case MESA_FORMAT_INTENSITY
:
1696 *datatype
= CHAN_TYPE
;
1700 case MESA_FORMAT_RGBA_FLOAT32
:
1701 *datatype
= GL_FLOAT
;
1704 case MESA_FORMAT_RGBA_FLOAT16
:
1705 *datatype
= GL_HALF_FLOAT_ARB
;
1708 case MESA_FORMAT_RGB_FLOAT32
:
1709 *datatype
= GL_FLOAT
;
1712 case MESA_FORMAT_RGB_FLOAT16
:
1713 *datatype
= GL_HALF_FLOAT_ARB
;
1716 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
:
1717 *datatype
= GL_FLOAT
;
1720 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
:
1721 *datatype
= GL_HALF_FLOAT_ARB
;
1724 case MESA_FORMAT_ALPHA_FLOAT32
:
1725 case MESA_FORMAT_LUMINANCE_FLOAT32
:
1726 case MESA_FORMAT_INTENSITY_FLOAT32
:
1727 *datatype
= GL_FLOAT
;
1730 case MESA_FORMAT_ALPHA_FLOAT16
:
1731 case MESA_FORMAT_LUMINANCE_FLOAT16
:
1732 case MESA_FORMAT_INTENSITY_FLOAT16
:
1733 *datatype
= GL_HALF_FLOAT_ARB
;
1738 _mesa_problem(NULL
, "bad format in _mesa_format_to_type_and_comps");