2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
6 * Copyright (c) 2009 VMware, Inc.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 * Texel fetch/store functions
32 * \author Gareth Hughes
38 #include "texcompress.h"
39 #include "texcompress_fxt1.h"
40 #include "texcompress_s3tc.h"
45 * Convert an 8-bit sRGB value from non-linear space to a
46 * linear RGB value in [0, 1].
47 * Implemented with a 256-entry lookup table.
50 nonlinear_to_linear(GLubyte cs8
)
52 static GLfloat table
[256];
53 static GLboolean tableReady
= GL_FALSE
;
55 /* compute lookup table now */
57 for (i
= 0; i
< 256; i
++) {
58 const GLfloat cs
= UBYTE_TO_FLOAT(i
);
60 table
[i
] = cs
/ 12.92f
;
63 table
[i
] = (GLfloat
) pow((cs
+ 0.055) / 1.055, 2.4);
73 /* Texel fetch routines for all supported formats
76 #include "texfetch_tmp.h"
79 #include "texfetch_tmp.h"
82 #include "texfetch_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_texelf( const struct gl_texture_image
*texImage
,
90 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
92 (void) texImage
; (void) i
; (void) j
; (void) k
;
97 _mesa_warning(NULL
, "fetch_null_texelf() called!");
100 static void store_null_texel(struct gl_texture_image
*texImage
,
101 GLint i
, GLint j
, GLint k
, const void *texel
)
114 * Table to map MESA_FORMAT_ to texel fetch/store funcs.
115 * XXX this is somewhat temporary.
119 FetchTexelFuncF Fetch1D
;
120 FetchTexelFuncF Fetch2D
;
121 FetchTexelFuncF Fetch3D
;
122 StoreTexelFunc StoreTexel
;
124 texfetch_funcs
[MESA_FORMAT_COUNT
] =
135 MESA_FORMAT_RGBA8888
,
136 fetch_texel_1d_f_rgba8888
,
137 fetch_texel_2d_f_rgba8888
,
138 fetch_texel_3d_f_rgba8888
,
142 MESA_FORMAT_RGBA8888_REV
,
143 fetch_texel_1d_f_rgba8888_rev
,
144 fetch_texel_2d_f_rgba8888_rev
,
145 fetch_texel_3d_f_rgba8888_rev
,
146 store_texel_rgba8888_rev
149 MESA_FORMAT_ARGB8888
,
150 fetch_texel_1d_f_argb8888
,
151 fetch_texel_2d_f_argb8888
,
152 fetch_texel_3d_f_argb8888
,
156 MESA_FORMAT_ARGB8888_REV
,
157 fetch_texel_1d_f_argb8888_rev
,
158 fetch_texel_2d_f_argb8888_rev
,
159 fetch_texel_3d_f_argb8888_rev
,
160 store_texel_argb8888_rev
163 MESA_FORMAT_XRGB8888
,
164 fetch_texel_1d_f_xrgb8888
,
165 fetch_texel_2d_f_xrgb8888
,
166 fetch_texel_3d_f_xrgb8888
,
170 MESA_FORMAT_XRGB8888_REV
,
171 fetch_texel_1d_f_xrgb8888_rev
,
172 fetch_texel_2d_f_xrgb8888_rev
,
173 fetch_texel_3d_f_xrgb8888_rev
,
174 store_texel_xrgb8888_rev
,
178 fetch_texel_1d_f_rgb888
,
179 fetch_texel_2d_f_rgb888
,
180 fetch_texel_3d_f_rgb888
,
185 fetch_texel_1d_f_bgr888
,
186 fetch_texel_2d_f_bgr888
,
187 fetch_texel_3d_f_bgr888
,
192 fetch_texel_1d_f_rgb565
,
193 fetch_texel_2d_f_rgb565
,
194 fetch_texel_3d_f_rgb565
,
198 MESA_FORMAT_RGB565_REV
,
199 fetch_texel_1d_f_rgb565_rev
,
200 fetch_texel_2d_f_rgb565_rev
,
201 fetch_texel_3d_f_rgb565_rev
,
202 store_texel_rgb565_rev
205 MESA_FORMAT_ARGB4444
,
206 fetch_texel_1d_f_argb4444
,
207 fetch_texel_2d_f_argb4444
,
208 fetch_texel_3d_f_argb4444
,
212 MESA_FORMAT_ARGB4444_REV
,
213 fetch_texel_1d_f_argb4444_rev
,
214 fetch_texel_2d_f_argb4444_rev
,
215 fetch_texel_3d_f_argb4444_rev
,
216 store_texel_argb4444_rev
219 MESA_FORMAT_RGBA5551
,
220 fetch_texel_1d_f_rgba5551
,
221 fetch_texel_2d_f_rgba5551
,
222 fetch_texel_3d_f_rgba5551
,
226 MESA_FORMAT_ARGB1555
,
227 fetch_texel_1d_f_argb1555
,
228 fetch_texel_2d_f_argb1555
,
229 fetch_texel_3d_f_argb1555
,
233 MESA_FORMAT_ARGB1555_REV
,
234 fetch_texel_1d_f_argb1555_rev
,
235 fetch_texel_2d_f_argb1555_rev
,
236 fetch_texel_3d_f_argb1555_rev
,
237 store_texel_argb1555_rev
241 fetch_texel_1d_f_al88
,
242 fetch_texel_2d_f_al88
,
243 fetch_texel_3d_f_al88
,
247 MESA_FORMAT_AL88_REV
,
248 fetch_texel_1d_f_al88_rev
,
249 fetch_texel_2d_f_al88_rev
,
250 fetch_texel_3d_f_al88_rev
,
255 fetch_texel_1d_f_al1616
,
256 fetch_texel_2d_f_al1616
,
257 fetch_texel_3d_f_al1616
,
261 MESA_FORMAT_AL1616_REV
,
262 fetch_texel_1d_f_al1616_rev
,
263 fetch_texel_2d_f_al1616_rev
,
264 fetch_texel_3d_f_al1616_rev
,
265 store_texel_al1616_rev
269 fetch_texel_1d_f_rgb332
,
270 fetch_texel_2d_f_rgb332
,
271 fetch_texel_3d_f_rgb332
,
297 fetch_texel_1d_f_ci8
,
298 fetch_texel_2d_f_ci8
,
299 fetch_texel_3d_f_ci8
,
304 fetch_texel_1d_f_ycbcr
,
305 fetch_texel_2d_f_ycbcr
,
306 fetch_texel_3d_f_ycbcr
,
310 MESA_FORMAT_YCBCR_REV
,
311 fetch_texel_1d_f_ycbcr_rev
,
312 fetch_texel_2d_f_ycbcr_rev
,
313 fetch_texel_3d_f_ycbcr_rev
,
314 store_texel_ycbcr_rev
318 fetch_texel_1d_f_z24_s8
,
319 fetch_texel_2d_f_z24_s8
,
320 fetch_texel_3d_f_z24_s8
,
325 fetch_texel_1d_f_s8_z24
,
326 fetch_texel_2d_f_s8_z24
,
327 fetch_texel_3d_f_s8_z24
,
332 fetch_texel_1d_f_z16
,
333 fetch_texel_2d_f_z16
,
334 fetch_texel_3d_f_z16
,
339 fetch_texel_1d_f_s8_z24
,
340 fetch_texel_2d_f_s8_z24
,
341 fetch_texel_3d_f_s8_z24
,
346 fetch_texel_1d_f_z24_s8
,
347 fetch_texel_2d_f_z24_s8
,
348 fetch_texel_3d_f_z24_s8
,
353 fetch_texel_1d_f_z32
,
354 fetch_texel_2d_f_z32
,
355 fetch_texel_3d_f_z32
,
367 fetch_texel_1d_srgb8
,
368 fetch_texel_2d_srgb8
,
369 fetch_texel_3d_srgb8
,
374 fetch_texel_1d_srgba8
,
375 fetch_texel_2d_srgba8
,
376 fetch_texel_3d_srgba8
,
381 fetch_texel_1d_sargb8
,
382 fetch_texel_2d_sargb8
,
383 fetch_texel_3d_sargb8
,
401 MESA_FORMAT_SRGB_DXT1
,
403 _mesa_fetch_texel_2d_f_srgb_dxt1
,
408 MESA_FORMAT_SRGBA_DXT1
,
410 _mesa_fetch_texel_2d_f_srgba_dxt1
,
415 MESA_FORMAT_SRGBA_DXT3
,
417 _mesa_fetch_texel_2d_f_srgba_dxt3
,
422 MESA_FORMAT_SRGBA_DXT5
,
424 _mesa_fetch_texel_2d_f_srgba_dxt5
,
430 MESA_FORMAT_RGB_FXT1
,
432 _mesa_fetch_texel_2d_f_rgb_fxt1
,
437 MESA_FORMAT_RGBA_FXT1
,
439 _mesa_fetch_texel_2d_f_rgba_fxt1
,
444 MESA_FORMAT_RGB_DXT1
,
446 _mesa_fetch_texel_2d_f_rgb_dxt1
,
451 MESA_FORMAT_RGBA_DXT1
,
453 _mesa_fetch_texel_2d_f_rgba_dxt1
,
458 MESA_FORMAT_RGBA_DXT3
,
460 _mesa_fetch_texel_2d_f_rgba_dxt3
,
465 MESA_FORMAT_RGBA_DXT5
,
467 _mesa_fetch_texel_2d_f_rgba_dxt5
,
472 MESA_FORMAT_RGBA_FLOAT32
,
473 fetch_texel_1d_f_rgba_f32
,
474 fetch_texel_2d_f_rgba_f32
,
475 fetch_texel_3d_f_rgba_f32
,
479 MESA_FORMAT_RGBA_FLOAT16
,
480 fetch_texel_1d_f_rgba_f16
,
481 fetch_texel_2d_f_rgba_f16
,
482 fetch_texel_3d_f_rgba_f16
,
486 MESA_FORMAT_RGB_FLOAT32
,
487 fetch_texel_1d_f_rgb_f32
,
488 fetch_texel_2d_f_rgb_f32
,
489 fetch_texel_3d_f_rgb_f32
,
493 MESA_FORMAT_RGB_FLOAT16
,
494 fetch_texel_1d_f_rgb_f16
,
495 fetch_texel_2d_f_rgb_f16
,
496 fetch_texel_3d_f_rgb_f16
,
500 MESA_FORMAT_ALPHA_FLOAT32
,
501 fetch_texel_1d_f_alpha_f32
,
502 fetch_texel_2d_f_alpha_f32
,
503 fetch_texel_3d_f_alpha_f32
,
504 store_texel_alpha_f32
507 MESA_FORMAT_ALPHA_FLOAT16
,
508 fetch_texel_1d_f_alpha_f16
,
509 fetch_texel_2d_f_alpha_f16
,
510 fetch_texel_3d_f_alpha_f16
,
511 store_texel_alpha_f16
514 MESA_FORMAT_LUMINANCE_FLOAT32
,
515 fetch_texel_1d_f_luminance_f32
,
516 fetch_texel_2d_f_luminance_f32
,
517 fetch_texel_3d_f_luminance_f32
,
518 store_texel_luminance_f32
521 MESA_FORMAT_LUMINANCE_FLOAT16
,
522 fetch_texel_1d_f_luminance_f16
,
523 fetch_texel_2d_f_luminance_f16
,
524 fetch_texel_3d_f_luminance_f16
,
525 store_texel_luminance_f16
528 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
,
529 fetch_texel_1d_f_luminance_alpha_f32
,
530 fetch_texel_2d_f_luminance_alpha_f32
,
531 fetch_texel_3d_f_luminance_alpha_f32
,
532 store_texel_luminance_alpha_f32
535 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
,
536 fetch_texel_1d_f_luminance_alpha_f16
,
537 fetch_texel_2d_f_luminance_alpha_f16
,
538 fetch_texel_3d_f_luminance_alpha_f16
,
539 store_texel_luminance_alpha_f16
542 MESA_FORMAT_INTENSITY_FLOAT32
,
543 fetch_texel_1d_f_intensity_f32
,
544 fetch_texel_2d_f_intensity_f32
,
545 fetch_texel_3d_f_intensity_f32
,
546 store_texel_intensity_f32
549 MESA_FORMAT_INTENSITY_FLOAT16
,
550 fetch_texel_1d_f_intensity_f16
,
551 fetch_texel_2d_f_intensity_f16
,
552 fetch_texel_3d_f_intensity_f16
,
553 store_texel_intensity_f16
556 /* non-normalized, signed int */
558 MESA_FORMAT_RGBA_INT8
,
559 fetch_texel_1d_rgba_int8
,
560 fetch_texel_2d_rgba_int8
,
561 fetch_texel_3d_rgba_int8
,
562 store_texel_rgba_int8
565 MESA_FORMAT_RGBA_INT16
,
566 fetch_texel_1d_rgba_int16
,
567 fetch_texel_2d_rgba_int16
,
568 fetch_texel_3d_rgba_int16
,
569 store_texel_rgba_int16
572 MESA_FORMAT_RGBA_INT32
,
573 fetch_texel_1d_rgba_int32
,
574 fetch_texel_2d_rgba_int32
,
575 fetch_texel_3d_rgba_int32
,
576 store_texel_rgba_int32
579 /* non-normalized, unsigned int */
581 MESA_FORMAT_RGBA_UINT8
,
582 fetch_texel_1d_rgba_uint8
,
583 fetch_texel_2d_rgba_uint8
,
584 fetch_texel_3d_rgba_uint8
,
585 store_texel_rgba_uint8
588 MESA_FORMAT_RGBA_UINT16
,
589 fetch_texel_1d_rgba_uint16
,
590 fetch_texel_2d_rgba_uint16
,
591 fetch_texel_3d_rgba_uint16
,
592 store_texel_rgba_uint16
595 MESA_FORMAT_RGBA_UINT32
,
596 fetch_texel_1d_rgba_uint32
,
597 fetch_texel_2d_rgba_uint32
,
598 fetch_texel_3d_rgba_uint32
,
599 store_texel_rgba_uint32
605 fetch_texel_1d_dudv8
,
606 fetch_texel_2d_dudv8
,
607 fetch_texel_3d_dudv8
,
611 /* signed, normalized */
613 MESA_FORMAT_SIGNED_R8
,
614 fetch_texel_1d_signed_r8
,
615 fetch_texel_2d_signed_r8
,
616 fetch_texel_3d_signed_r8
,
617 store_texel_signed_r8
620 MESA_FORMAT_SIGNED_RG88
,
621 fetch_texel_1d_signed_rg88
,
622 fetch_texel_2d_signed_rg88
,
623 fetch_texel_3d_signed_rg88
,
624 store_texel_signed_rg88
627 MESA_FORMAT_SIGNED_RGBX8888
,
628 fetch_texel_1d_signed_rgbx8888
,
629 fetch_texel_2d_signed_rgbx8888
,
630 fetch_texel_3d_signed_rgbx8888
,
631 store_texel_signed_rgbx8888
634 MESA_FORMAT_SIGNED_RGBA8888
,
635 fetch_texel_1d_signed_rgba8888
,
636 fetch_texel_2d_signed_rgba8888
,
637 fetch_texel_3d_signed_rgba8888
,
638 store_texel_signed_rgba8888
641 MESA_FORMAT_SIGNED_RGBA8888_REV
,
642 fetch_texel_1d_signed_rgba8888_rev
,
643 fetch_texel_2d_signed_rgba8888_rev
,
644 fetch_texel_3d_signed_rgba8888_rev
,
645 store_texel_signed_rgba8888_rev
648 MESA_FORMAT_SIGNED_R_16
,
649 fetch_texel_1d_signed_r_16
,
650 fetch_texel_2d_signed_r_16
,
651 fetch_texel_3d_signed_r_16
,
652 store_texel_signed_r_16
655 MESA_FORMAT_SIGNED_RG_16
,
656 fetch_texel_1d_signed_rg_16
,
657 fetch_texel_2d_signed_rg_16
,
658 fetch_texel_3d_signed_rg_16
,
659 store_texel_signed_rg_16
662 MESA_FORMAT_SIGNED_RGB_16
,
663 fetch_texel_1d_signed_rgb_16
,
664 fetch_texel_2d_signed_rgb_16
,
665 fetch_texel_3d_signed_rgb_16
,
666 store_texel_signed_rgb_16
669 MESA_FORMAT_SIGNED_RGBA_16
,
670 fetch_texel_1d_signed_rgba_16
,
671 fetch_texel_2d_signed_rgba_16
,
672 fetch_texel_3d_signed_rgba_16
,
673 store_texel_signed_rgba_16
677 fetch_texel_1d_rgba_16
,
678 fetch_texel_2d_rgba_16
,
679 fetch_texel_3d_rgba_16
,
685 static FetchTexelFuncF
686 _mesa_get_texel_fetch_func(gl_format format
, GLuint dims
)
689 /* check that the table entries are sorted by format name */
691 for (fmt
= 0; fmt
< MESA_FORMAT_COUNT
; fmt
++) {
692 assert(texfetch_funcs
[fmt
].Name
== fmt
);
696 assert(Elements(texfetch_funcs
) == MESA_FORMAT_COUNT
);
697 assert(format
< MESA_FORMAT_COUNT
);
701 return texfetch_funcs
[format
].Fetch1D
;
703 return texfetch_funcs
[format
].Fetch2D
;
705 return texfetch_funcs
[format
].Fetch3D
;
707 assert(0 && "bad dims in _mesa_get_texel_fetch_func");
714 _mesa_get_texel_store_func(gl_format format
)
716 assert(format
< MESA_FORMAT_COUNT
);
717 return texfetch_funcs
[format
].StoreTexel
;
722 * Adaptor for fetching a GLchan texel from a float-valued texture.
725 fetch_texel_float_to_chan(const struct gl_texture_image
*texImage
,
726 GLint i
, GLint j
, GLint k
, GLchan
*texelOut
)
729 GLenum baseFormat
= _mesa_get_format_base_format(texImage
->TexFormat
);
731 ASSERT(texImage
->FetchTexelf
);
732 texImage
->FetchTexelf(texImage
, i
, j
, k
, temp
);
733 if (baseFormat
== GL_DEPTH_COMPONENT
||
734 baseFormat
== GL_DEPTH_STENCIL_EXT
) {
735 /* just one channel */
736 UNCLAMPED_FLOAT_TO_CHAN(texelOut
[0], temp
[0]);
740 UNCLAMPED_FLOAT_TO_CHAN(texelOut
[0], temp
[0]);
741 UNCLAMPED_FLOAT_TO_CHAN(texelOut
[1], temp
[1]);
742 UNCLAMPED_FLOAT_TO_CHAN(texelOut
[2], temp
[2]);
743 UNCLAMPED_FLOAT_TO_CHAN(texelOut
[3], temp
[3]);
750 * Adaptor for fetching a float texel from a GLchan-valued texture.
753 fetch_texel_chan_to_float(const struct gl_texture_image
*texImage
,
754 GLint i
, GLint j
, GLint k
, GLfloat
*texelOut
)
757 GLenum baseFormat
= _mesa_get_format_base_format(texImage
->TexFormat
);
759 ASSERT(texImage
->FetchTexelc
);
760 texImage
->FetchTexelc(texImage
, i
, j
, k
, temp
);
761 if (baseFormat
== GL_DEPTH_COMPONENT
||
762 baseFormat
== GL_DEPTH_STENCIL_EXT
) {
763 /* just one channel */
764 texelOut
[0] = CHAN_TO_FLOAT(temp
[0]);
768 texelOut
[0] = CHAN_TO_FLOAT(temp
[0]);
769 texelOut
[1] = CHAN_TO_FLOAT(temp
[1]);
770 texelOut
[2] = CHAN_TO_FLOAT(temp
[2]);
771 texelOut
[3] = CHAN_TO_FLOAT(temp
[3]);
778 * Initialize the texture image's FetchTexelc and FetchTexelf methods.
781 _mesa_set_fetch_functions(struct gl_texture_image
*texImage
, GLuint dims
)
783 ASSERT(dims
== 1 || dims
== 2 || dims
== 3);
784 ASSERT(texImage
->TexFormat
);
786 if (!texImage
->FetchTexelf
) {
787 texImage
->FetchTexelf
=
788 _mesa_get_texel_fetch_func(texImage
->TexFormat
, dims
);
791 /* now check if we need to use a float/chan adaptor */
792 if (!texImage
->FetchTexelc
) {
793 texImage
->FetchTexelc
= fetch_texel_float_to_chan
;
796 ASSERT(texImage
->FetchTexelc
);
797 ASSERT(texImage
->FetchTexelf
);