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
36 #include "main/colormac.h"
37 #include "main/macros.h"
38 #include "main/texcompress.h"
39 #include "main/texcompress_fxt1.h"
40 #include "main/texcompress_s3tc.h"
41 #include "main/texcompress_rgtc.h"
42 #include "main/teximage.h"
43 #include "s_context.h"
44 #include "s_texfetch.h"
45 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
46 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
50 * Convert an 8-bit sRGB value from non-linear space to a
51 * linear RGB value in [0, 1].
52 * Implemented with a 256-entry lookup table.
55 nonlinear_to_linear(GLubyte cs8
)
57 static GLfloat table
[256];
58 static GLboolean tableReady
= GL_FALSE
;
60 /* compute lookup table now */
62 for (i
= 0; i
< 256; i
++) {
63 const GLfloat cs
= UBYTE_TO_FLOAT(i
);
65 table
[i
] = cs
/ 12.92f
;
68 table
[i
] = (GLfloat
) pow((cs
+ 0.055) / 1.055, 2.4);
78 /* Texel fetch routines for all supported formats
81 #include "s_texfetch_tmp.h"
84 #include "s_texfetch_tmp.h"
87 #include "s_texfetch_tmp.h"
90 * Null texel fetch function.
92 * Have to have this so the FetchTexel function pointer is never NULL.
94 static void fetch_null_texelf( const struct swrast_texture_image
*texImage
,
95 GLint i
, GLint j
, GLint k
, GLfloat
*texel
)
97 (void) texImage
; (void) i
; (void) j
; (void) k
;
102 _mesa_warning(NULL
, "fetch_null_texelf() called!");
105 static void store_null_texel(struct swrast_texture_image
*texImage
,
106 GLint i
, GLint j
, GLint k
, const void *texel
)
119 * Table to map MESA_FORMAT_ to texel fetch/store funcs.
120 * XXX this is somewhat temporary.
124 FetchTexelFuncF Fetch1D
;
125 FetchTexelFuncF Fetch2D
;
126 FetchTexelFuncF Fetch3D
;
127 StoreTexelFunc StoreTexel
;
129 texfetch_funcs
[MESA_FORMAT_COUNT
] =
140 MESA_FORMAT_RGBA8888
,
141 fetch_texel_1d_f_rgba8888
,
142 fetch_texel_2d_f_rgba8888
,
143 fetch_texel_3d_f_rgba8888
,
147 MESA_FORMAT_RGBA8888_REV
,
148 fetch_texel_1d_f_rgba8888_rev
,
149 fetch_texel_2d_f_rgba8888_rev
,
150 fetch_texel_3d_f_rgba8888_rev
,
151 store_texel_rgba8888_rev
154 MESA_FORMAT_ARGB8888
,
155 fetch_texel_1d_f_argb8888
,
156 fetch_texel_2d_f_argb8888
,
157 fetch_texel_3d_f_argb8888
,
161 MESA_FORMAT_ARGB8888_REV
,
162 fetch_texel_1d_f_argb8888_rev
,
163 fetch_texel_2d_f_argb8888_rev
,
164 fetch_texel_3d_f_argb8888_rev
,
165 store_texel_argb8888_rev
168 MESA_FORMAT_XRGB8888
,
169 fetch_texel_1d_f_xrgb8888
,
170 fetch_texel_2d_f_xrgb8888
,
171 fetch_texel_3d_f_xrgb8888
,
175 MESA_FORMAT_XRGB8888_REV
,
176 fetch_texel_1d_f_xrgb8888_rev
,
177 fetch_texel_2d_f_xrgb8888_rev
,
178 fetch_texel_3d_f_xrgb8888_rev
,
179 store_texel_xrgb8888_rev
,
183 fetch_texel_1d_f_rgb888
,
184 fetch_texel_2d_f_rgb888
,
185 fetch_texel_3d_f_rgb888
,
190 fetch_texel_1d_f_bgr888
,
191 fetch_texel_2d_f_bgr888
,
192 fetch_texel_3d_f_bgr888
,
197 fetch_texel_1d_f_rgb565
,
198 fetch_texel_2d_f_rgb565
,
199 fetch_texel_3d_f_rgb565
,
203 MESA_FORMAT_RGB565_REV
,
204 fetch_texel_1d_f_rgb565_rev
,
205 fetch_texel_2d_f_rgb565_rev
,
206 fetch_texel_3d_f_rgb565_rev
,
207 store_texel_rgb565_rev
210 MESA_FORMAT_ARGB4444
,
211 fetch_texel_1d_f_argb4444
,
212 fetch_texel_2d_f_argb4444
,
213 fetch_texel_3d_f_argb4444
,
217 MESA_FORMAT_ARGB4444_REV
,
218 fetch_texel_1d_f_argb4444_rev
,
219 fetch_texel_2d_f_argb4444_rev
,
220 fetch_texel_3d_f_argb4444_rev
,
221 store_texel_argb4444_rev
224 MESA_FORMAT_RGBA5551
,
225 fetch_texel_1d_f_rgba5551
,
226 fetch_texel_2d_f_rgba5551
,
227 fetch_texel_3d_f_rgba5551
,
231 MESA_FORMAT_ARGB1555
,
232 fetch_texel_1d_f_argb1555
,
233 fetch_texel_2d_f_argb1555
,
234 fetch_texel_3d_f_argb1555
,
238 MESA_FORMAT_ARGB1555_REV
,
239 fetch_texel_1d_f_argb1555_rev
,
240 fetch_texel_2d_f_argb1555_rev
,
241 fetch_texel_3d_f_argb1555_rev
,
242 store_texel_argb1555_rev
246 fetch_texel_1d_f_al44
,
247 fetch_texel_2d_f_al44
,
248 fetch_texel_3d_f_al44
,
253 fetch_texel_1d_f_al88
,
254 fetch_texel_2d_f_al88
,
255 fetch_texel_3d_f_al88
,
259 MESA_FORMAT_AL88_REV
,
260 fetch_texel_1d_f_al88_rev
,
261 fetch_texel_2d_f_al88_rev
,
262 fetch_texel_3d_f_al88_rev
,
267 fetch_texel_1d_f_al1616
,
268 fetch_texel_2d_f_al1616
,
269 fetch_texel_3d_f_al1616
,
273 MESA_FORMAT_AL1616_REV
,
274 fetch_texel_1d_f_al1616_rev
,
275 fetch_texel_2d_f_al1616_rev
,
276 fetch_texel_3d_f_al1616_rev
,
277 store_texel_al1616_rev
281 fetch_texel_1d_f_rgb332
,
282 fetch_texel_2d_f_rgb332
,
283 fetch_texel_3d_f_rgb332
,
295 fetch_texel_1d_f_a16
,
296 fetch_texel_2d_f_a16
,
297 fetch_texel_3d_f_a16
,
309 fetch_texel_1d_f_l16
,
310 fetch_texel_2d_f_l16
,
311 fetch_texel_3d_f_l16
,
323 fetch_texel_1d_f_i16
,
324 fetch_texel_2d_f_i16
,
325 fetch_texel_3d_f_i16
,
330 fetch_texel_1d_f_ycbcr
,
331 fetch_texel_2d_f_ycbcr
,
332 fetch_texel_3d_f_ycbcr
,
336 MESA_FORMAT_YCBCR_REV
,
337 fetch_texel_1d_f_ycbcr_rev
,
338 fetch_texel_2d_f_ycbcr_rev
,
339 fetch_texel_3d_f_ycbcr_rev
,
340 store_texel_ycbcr_rev
351 fetch_texel_1d_f_rg88
,
352 fetch_texel_2d_f_rg88
,
353 fetch_texel_3d_f_rg88
,
357 MESA_FORMAT_RG88_REV
,
358 fetch_texel_1d_f_rg88_rev
,
359 fetch_texel_2d_f_rg88_rev
,
360 fetch_texel_3d_f_rg88_rev
,
361 store_texel_rg88_rev
,
365 fetch_texel_1d_f_r16
,
366 fetch_texel_2d_f_r16
,
367 fetch_texel_3d_f_r16
,
372 fetch_texel_1d_f_rg1616
,
373 fetch_texel_2d_f_rg1616
,
374 fetch_texel_3d_f_rg1616
,
378 MESA_FORMAT_RG1616_REV
,
379 fetch_texel_1d_f_rg1616_rev
,
380 fetch_texel_2d_f_rg1616_rev
,
381 fetch_texel_3d_f_rg1616_rev
,
382 store_texel_rg1616_rev
,
385 MESA_FORMAT_ARGB2101010
,
386 fetch_texel_1d_f_argb2101010
,
387 fetch_texel_2d_f_argb2101010
,
388 fetch_texel_3d_f_argb2101010
,
389 store_texel_argb2101010
393 fetch_texel_1d_f_z24_s8
,
394 fetch_texel_2d_f_z24_s8
,
395 fetch_texel_3d_f_z24_s8
,
400 fetch_texel_1d_f_s8_z24
,
401 fetch_texel_2d_f_s8_z24
,
402 fetch_texel_3d_f_s8_z24
,
407 fetch_texel_1d_f_z16
,
408 fetch_texel_2d_f_z16
,
409 fetch_texel_3d_f_z16
,
414 fetch_texel_1d_f_s8_z24
,
415 fetch_texel_2d_f_s8_z24
,
416 fetch_texel_3d_f_s8_z24
,
421 fetch_texel_1d_f_z24_s8
,
422 fetch_texel_2d_f_z24_s8
,
423 fetch_texel_3d_f_z24_s8
,
428 fetch_texel_1d_f_z32
,
429 fetch_texel_2d_f_z32
,
430 fetch_texel_3d_f_z32
,
442 fetch_texel_1d_srgb8
,
443 fetch_texel_2d_srgb8
,
444 fetch_texel_3d_srgb8
,
449 fetch_texel_1d_srgba8
,
450 fetch_texel_2d_srgba8
,
451 fetch_texel_3d_srgba8
,
456 fetch_texel_1d_sargb8
,
457 fetch_texel_2d_sargb8
,
458 fetch_texel_3d_sargb8
,
476 MESA_FORMAT_SRGB_DXT1
,
478 _mesa_fetch_texel_2d_f_srgb_dxt1
,
483 MESA_FORMAT_SRGBA_DXT1
,
485 _mesa_fetch_texel_2d_f_srgba_dxt1
,
490 MESA_FORMAT_SRGBA_DXT3
,
492 _mesa_fetch_texel_2d_f_srgba_dxt3
,
497 MESA_FORMAT_SRGBA_DXT5
,
499 _mesa_fetch_texel_2d_f_srgba_dxt5
,
505 MESA_FORMAT_RGB_FXT1
,
507 _mesa_fetch_texel_2d_f_rgb_fxt1
,
512 MESA_FORMAT_RGBA_FXT1
,
514 _mesa_fetch_texel_2d_f_rgba_fxt1
,
519 MESA_FORMAT_RGB_DXT1
,
521 _mesa_fetch_texel_2d_f_rgb_dxt1
,
526 MESA_FORMAT_RGBA_DXT1
,
528 _mesa_fetch_texel_2d_f_rgba_dxt1
,
533 MESA_FORMAT_RGBA_DXT3
,
535 _mesa_fetch_texel_2d_f_rgba_dxt3
,
540 MESA_FORMAT_RGBA_DXT5
,
542 _mesa_fetch_texel_2d_f_rgba_dxt5
,
547 MESA_FORMAT_RGBA_FLOAT32
,
548 fetch_texel_1d_f_rgba_f32
,
549 fetch_texel_2d_f_rgba_f32
,
550 fetch_texel_3d_f_rgba_f32
,
554 MESA_FORMAT_RGBA_FLOAT16
,
555 fetch_texel_1d_f_rgba_f16
,
556 fetch_texel_2d_f_rgba_f16
,
557 fetch_texel_3d_f_rgba_f16
,
561 MESA_FORMAT_RGB_FLOAT32
,
562 fetch_texel_1d_f_rgb_f32
,
563 fetch_texel_2d_f_rgb_f32
,
564 fetch_texel_3d_f_rgb_f32
,
568 MESA_FORMAT_RGB_FLOAT16
,
569 fetch_texel_1d_f_rgb_f16
,
570 fetch_texel_2d_f_rgb_f16
,
571 fetch_texel_3d_f_rgb_f16
,
575 MESA_FORMAT_ALPHA_FLOAT32
,
576 fetch_texel_1d_f_alpha_f32
,
577 fetch_texel_2d_f_alpha_f32
,
578 fetch_texel_3d_f_alpha_f32
,
579 store_texel_alpha_f32
582 MESA_FORMAT_ALPHA_FLOAT16
,
583 fetch_texel_1d_f_alpha_f16
,
584 fetch_texel_2d_f_alpha_f16
,
585 fetch_texel_3d_f_alpha_f16
,
586 store_texel_alpha_f16
589 MESA_FORMAT_LUMINANCE_FLOAT32
,
590 fetch_texel_1d_f_luminance_f32
,
591 fetch_texel_2d_f_luminance_f32
,
592 fetch_texel_3d_f_luminance_f32
,
593 store_texel_luminance_f32
596 MESA_FORMAT_LUMINANCE_FLOAT16
,
597 fetch_texel_1d_f_luminance_f16
,
598 fetch_texel_2d_f_luminance_f16
,
599 fetch_texel_3d_f_luminance_f16
,
600 store_texel_luminance_f16
603 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
,
604 fetch_texel_1d_f_luminance_alpha_f32
,
605 fetch_texel_2d_f_luminance_alpha_f32
,
606 fetch_texel_3d_f_luminance_alpha_f32
,
607 store_texel_luminance_alpha_f32
610 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
,
611 fetch_texel_1d_f_luminance_alpha_f16
,
612 fetch_texel_2d_f_luminance_alpha_f16
,
613 fetch_texel_3d_f_luminance_alpha_f16
,
614 store_texel_luminance_alpha_f16
617 MESA_FORMAT_INTENSITY_FLOAT32
,
618 fetch_texel_1d_f_intensity_f32
,
619 fetch_texel_2d_f_intensity_f32
,
620 fetch_texel_3d_f_intensity_f32
,
621 store_texel_intensity_f32
624 MESA_FORMAT_INTENSITY_FLOAT16
,
625 fetch_texel_1d_f_intensity_f16
,
626 fetch_texel_2d_f_intensity_f16
,
627 fetch_texel_3d_f_intensity_f16
,
628 store_texel_intensity_f16
631 MESA_FORMAT_R_FLOAT32
,
632 fetch_texel_1d_f_r_f32
,
633 fetch_texel_2d_f_r_f32
,
634 fetch_texel_3d_f_r_f32
,
638 MESA_FORMAT_R_FLOAT16
,
639 fetch_texel_1d_f_r_f16
,
640 fetch_texel_2d_f_r_f16
,
641 fetch_texel_3d_f_r_f16
,
645 MESA_FORMAT_RG_FLOAT32
,
646 fetch_texel_1d_f_rg_f32
,
647 fetch_texel_2d_f_rg_f32
,
648 fetch_texel_3d_f_rg_f32
,
652 MESA_FORMAT_RG_FLOAT16
,
653 fetch_texel_1d_f_rg_f16
,
654 fetch_texel_2d_f_rg_f16
,
655 fetch_texel_3d_f_rg_f16
,
659 /* non-normalized, signed int */
661 MESA_FORMAT_RGBA_INT8
,
662 fetch_texel_1d_rgba_int8
,
663 fetch_texel_2d_rgba_int8
,
664 fetch_texel_3d_rgba_int8
,
665 store_texel_rgba_int8
668 MESA_FORMAT_RGBA_INT16
,
669 fetch_texel_1d_rgba_int16
,
670 fetch_texel_2d_rgba_int16
,
671 fetch_texel_3d_rgba_int16
,
672 store_texel_rgba_int16
675 MESA_FORMAT_RGBA_INT32
,
676 fetch_texel_1d_rgba_int32
,
677 fetch_texel_2d_rgba_int32
,
678 fetch_texel_3d_rgba_int32
,
679 store_texel_rgba_int32
682 /* non-normalized, unsigned int */
684 MESA_FORMAT_RGBA_UINT8
,
685 fetch_texel_1d_rgba_uint8
,
686 fetch_texel_2d_rgba_uint8
,
687 fetch_texel_3d_rgba_uint8
,
688 store_texel_rgba_uint8
691 MESA_FORMAT_RGBA_UINT16
,
692 fetch_texel_1d_rgba_uint16
,
693 fetch_texel_2d_rgba_uint16
,
694 fetch_texel_3d_rgba_uint16
,
695 store_texel_rgba_uint16
698 MESA_FORMAT_RGBA_UINT32
,
699 fetch_texel_1d_rgba_uint32
,
700 fetch_texel_2d_rgba_uint32
,
701 fetch_texel_3d_rgba_uint32
,
702 store_texel_rgba_uint32
708 fetch_texel_1d_dudv8
,
709 fetch_texel_2d_dudv8
,
710 fetch_texel_3d_dudv8
,
714 /* signed, normalized */
716 MESA_FORMAT_SIGNED_R8
,
717 fetch_texel_1d_signed_r8
,
718 fetch_texel_2d_signed_r8
,
719 fetch_texel_3d_signed_r8
,
720 store_texel_signed_r8
723 MESA_FORMAT_SIGNED_RG88_REV
,
724 fetch_texel_1d_signed_rg88_rev
,
725 fetch_texel_2d_signed_rg88_rev
,
726 fetch_texel_3d_signed_rg88_rev
,
727 store_texel_signed_rg88_rev
730 MESA_FORMAT_SIGNED_RGBX8888
,
731 fetch_texel_1d_signed_rgbx8888
,
732 fetch_texel_2d_signed_rgbx8888
,
733 fetch_texel_3d_signed_rgbx8888
,
734 store_texel_signed_rgbx8888
737 MESA_FORMAT_SIGNED_RGBA8888
,
738 fetch_texel_1d_signed_rgba8888
,
739 fetch_texel_2d_signed_rgba8888
,
740 fetch_texel_3d_signed_rgba8888
,
741 store_texel_signed_rgba8888
744 MESA_FORMAT_SIGNED_RGBA8888_REV
,
745 fetch_texel_1d_signed_rgba8888_rev
,
746 fetch_texel_2d_signed_rgba8888_rev
,
747 fetch_texel_3d_signed_rgba8888_rev
,
748 store_texel_signed_rgba8888_rev
751 MESA_FORMAT_SIGNED_R16
,
752 fetch_texel_1d_signed_r16
,
753 fetch_texel_2d_signed_r16
,
754 fetch_texel_3d_signed_r16
,
755 store_texel_signed_r16
758 MESA_FORMAT_SIGNED_GR1616
,
759 fetch_texel_1d_signed_rg1616
,
760 fetch_texel_2d_signed_rg1616
,
761 fetch_texel_3d_signed_rg1616
,
762 store_texel_signed_rg1616
765 MESA_FORMAT_SIGNED_RGB_16
,
766 fetch_texel_1d_signed_rgb_16
,
767 fetch_texel_2d_signed_rgb_16
,
768 fetch_texel_3d_signed_rgb_16
,
769 store_texel_signed_rgb_16
772 MESA_FORMAT_SIGNED_RGBA_16
,
773 fetch_texel_1d_signed_rgba_16
,
774 fetch_texel_2d_signed_rgba_16
,
775 fetch_texel_3d_signed_rgba_16
,
776 store_texel_signed_rgba_16
780 fetch_texel_1d_rgba_16
,
781 fetch_texel_2d_rgba_16
,
782 fetch_texel_3d_rgba_16
,
786 MESA_FORMAT_RED_RGTC1
,
788 _mesa_fetch_texel_2d_f_red_rgtc1
,
793 MESA_FORMAT_SIGNED_RED_RGTC1
,
795 _mesa_fetch_texel_2d_f_signed_red_rgtc1
,
800 MESA_FORMAT_RG_RGTC2
,
802 _mesa_fetch_texel_2d_f_rg_rgtc2
,
807 MESA_FORMAT_SIGNED_RG_RGTC2
,
809 _mesa_fetch_texel_2d_f_signed_rg_rgtc2
,
816 _mesa_fetch_texel_2d_f_l_latc1
,
821 MESA_FORMAT_SIGNED_L_LATC1
,
823 _mesa_fetch_texel_2d_f_signed_l_latc1
,
828 MESA_FORMAT_LA_LATC2
,
830 _mesa_fetch_texel_2d_f_la_latc2
,
835 MESA_FORMAT_SIGNED_LA_LATC2
,
837 _mesa_fetch_texel_2d_f_signed_la_latc2
,
842 MESA_FORMAT_SIGNED_A8
,
843 fetch_texel_1d_signed_a8
,
844 fetch_texel_2d_signed_a8
,
845 fetch_texel_3d_signed_a8
,
846 store_texel_signed_a8
849 MESA_FORMAT_SIGNED_L8
,
850 fetch_texel_1d_signed_l8
,
851 fetch_texel_2d_signed_l8
,
852 fetch_texel_3d_signed_l8
,
853 store_texel_signed_l8
856 MESA_FORMAT_SIGNED_AL88
,
857 fetch_texel_1d_signed_al88
,
858 fetch_texel_2d_signed_al88
,
859 fetch_texel_3d_signed_al88
,
860 store_texel_signed_al88
863 MESA_FORMAT_SIGNED_I8
,
864 fetch_texel_1d_signed_i8
,
865 fetch_texel_2d_signed_i8
,
866 fetch_texel_3d_signed_i8
,
867 store_texel_signed_i8
870 MESA_FORMAT_SIGNED_A16
,
871 fetch_texel_1d_signed_a16
,
872 fetch_texel_2d_signed_a16
,
873 fetch_texel_3d_signed_a16
,
874 store_texel_signed_a16
877 MESA_FORMAT_SIGNED_L16
,
878 fetch_texel_1d_signed_l16
,
879 fetch_texel_2d_signed_l16
,
880 fetch_texel_3d_signed_l16
,
881 store_texel_signed_l16
884 MESA_FORMAT_SIGNED_AL1616
,
885 fetch_texel_1d_signed_al1616
,
886 fetch_texel_2d_signed_al1616
,
887 fetch_texel_3d_signed_al1616
,
888 store_texel_signed_al1616
891 MESA_FORMAT_SIGNED_I16
,
892 fetch_texel_1d_signed_i16
,
893 fetch_texel_2d_signed_i16
,
894 fetch_texel_3d_signed_i16
,
895 store_texel_signed_i16
898 MESA_FORMAT_RGB9_E5_FLOAT
,
899 fetch_texel_1d_rgb9_e5
,
900 fetch_texel_2d_rgb9_e5
,
901 fetch_texel_3d_rgb9_e5
,
905 MESA_FORMAT_R11_G11_B10_FLOAT
,
906 fetch_texel_1d_r11_g11_b10f
,
907 fetch_texel_2d_r11_g11_b10f
,
908 fetch_texel_3d_r11_g11_b10f
,
909 store_texel_r11_g11_b10f
912 MESA_FORMAT_Z32_FLOAT
,
913 fetch_texel_1d_f_r_f32
, /* Reuse the R32F functions. */
914 fetch_texel_2d_f_r_f32
,
915 fetch_texel_3d_f_r_f32
,
919 MESA_FORMAT_Z32_FLOAT_X24S8
,
920 fetch_texel_1d_z32f_x24s8
,
921 fetch_texel_2d_z32f_x24s8
,
922 fetch_texel_3d_z32f_x24s8
,
923 store_texel_z32f_x24s8
929 _mesa_get_texel_fetch_func(gl_format format
, GLuint dims
)
932 /* check that the table entries are sorted by format name */
934 for (fmt
= 0; fmt
< MESA_FORMAT_COUNT
; fmt
++) {
935 assert(texfetch_funcs
[fmt
].Name
== fmt
);
939 assert(Elements(texfetch_funcs
) == MESA_FORMAT_COUNT
);
940 assert(format
< MESA_FORMAT_COUNT
);
944 return texfetch_funcs
[format
].Fetch1D
;
946 return texfetch_funcs
[format
].Fetch2D
;
948 return texfetch_funcs
[format
].Fetch3D
;
950 assert(0 && "bad dims in _mesa_get_texel_fetch_func");
957 _mesa_get_texel_store_func(gl_format format
)
959 assert(format
< MESA_FORMAT_COUNT
);
960 return texfetch_funcs
[format
].StoreTexel
;
965 * Adaptor for fetching a GLchan texel from a float-valued texture.
968 fetch_texel_float_to_chan(const struct swrast_texture_image
*texImage
,
969 GLint i
, GLint j
, GLint k
, GLchan
*texelOut
)
972 GLenum baseFormat
= _mesa_get_format_base_format(texImage
->Base
.TexFormat
);
974 ASSERT(texImage
->FetchTexelf
);
975 texImage
->FetchTexelf(texImage
, i
, j
, k
, temp
);
976 if (baseFormat
== GL_DEPTH_COMPONENT
||
977 baseFormat
== GL_DEPTH_STENCIL_EXT
) {
978 /* just one channel */
979 UNCLAMPED_FLOAT_TO_CHAN(texelOut
[0], temp
[0]);
983 UNCLAMPED_FLOAT_TO_CHAN(texelOut
[0], temp
[0]);
984 UNCLAMPED_FLOAT_TO_CHAN(texelOut
[1], temp
[1]);
985 UNCLAMPED_FLOAT_TO_CHAN(texelOut
[2], temp
[2]);
986 UNCLAMPED_FLOAT_TO_CHAN(texelOut
[3], temp
[3]);
993 * Adaptor for fetching a float texel from a GLchan-valued texture.
996 fetch_texel_chan_to_float(const struct swrast_texture_image
*texImage
,
997 GLint i
, GLint j
, GLint k
, GLfloat
*texelOut
)
1000 GLenum baseFormat
= _mesa_get_format_base_format(texImage
->TexFormat
);
1002 ASSERT(texImage
->FetchTexelc
);
1003 texImage
->FetchTexelc(texImage
, i
, j
, k
, temp
);
1004 if (baseFormat
== GL_DEPTH_COMPONENT
||
1005 baseFormat
== GL_DEPTH_STENCIL_EXT
) {
1006 /* just one channel */
1007 texelOut
[0] = CHAN_TO_FLOAT(temp
[0]);
1011 texelOut
[0] = CHAN_TO_FLOAT(temp
[0]);
1012 texelOut
[1] = CHAN_TO_FLOAT(temp
[1]);
1013 texelOut
[2] = CHAN_TO_FLOAT(temp
[2]);
1014 texelOut
[3] = CHAN_TO_FLOAT(temp
[3]);
1021 * Initialize the texture image's FetchTexelc and FetchTexelf methods.
1024 set_fetch_functions(struct swrast_texture_image
*texImage
, GLuint dims
)
1026 gl_format format
= texImage
->Base
.TexFormat
;
1028 ASSERT(dims
== 1 || dims
== 2 || dims
== 3);
1030 if (texImage
->Base
.TexObject
->Sampler
.sRGBDecode
== GL_SKIP_DECODE_EXT
&&
1031 _mesa_get_format_color_encoding(format
) == GL_SRGB
) {
1032 format
= _mesa_get_srgb_format_linear(format
);
1035 texImage
->FetchTexelf
= _mesa_get_texel_fetch_func(format
, dims
);
1037 texImage
->FetchTexelc
= fetch_texel_float_to_chan
;
1039 ASSERT(texImage
->FetchTexelc
);
1040 ASSERT(texImage
->FetchTexelf
);
1044 _mesa_update_fetch_functions(struct gl_texture_object
*texObj
)
1049 dims
= _mesa_get_texture_dimensions(texObj
->Target
);
1051 for (face
= 0; face
< 6; face
++) {
1052 for (i
= 0; i
< MAX_TEXTURE_LEVELS
; i
++) {
1053 if (texObj
->Image
[face
][i
]) {
1054 set_fetch_functions(swrast_texture_image(texObj
->Image
[face
][i
]),