OSDN Git Service

f6c269d8bafecc5ec3e674af32086aa579732774
[android-x86/external-mesa.git] / src / mesa / swrast / s_texfetch.c
1 /*
2  * Mesa 3-D graphics library
3  * Version:  7.7
4  *
5  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6  * Copyright (c) 2009  VMware, Inc.
7  *
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:
14  *
15  * The above copyright notice and this permission notice shall be included
16  * in all copies or substantial portions of the Software.
17  *
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  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
22  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24  * OTHER DEALINGS IN THE SOFTWARE.
25  */
26
27
28 /**
29  * \file s_texfetch.c
30  *
31  * Texel fetch/store functions
32  *
33  * \author Gareth Hughes
34  */
35
36
37 #include "main/colormac.h"
38 #include "main/macros.h"
39 #include "main/texcompress.h"
40 #include "main/texcompress_fxt1.h"
41 #include "main/texcompress_s3tc.h"
42 #include "main/texcompress_rgtc.h"
43 #include "main/texcompress_etc.h"
44 #include "main/teximage.h"
45 #include "main/samplerobj.h"
46 #include "s_context.h"
47 #include "s_texfetch.h"
48 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
49 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
50
51
52 /**
53  * Convert an 8-bit sRGB value from non-linear space to a
54  * linear RGB value in [0, 1].
55  * Implemented with a 256-entry lookup table.
56  */
57 static inline GLfloat
58 nonlinear_to_linear(GLubyte cs8)
59 {
60    static GLfloat table[256];
61    static GLboolean tableReady = GL_FALSE;
62    if (!tableReady) {
63       /* compute lookup table now */
64       GLuint i;
65       for (i = 0; i < 256; i++) {
66          const GLfloat cs = UBYTE_TO_FLOAT(i);
67          if (cs <= 0.04045) {
68             table[i] = cs / 12.92f;
69          }
70          else {
71             table[i] = (GLfloat) pow((cs + 0.055) / 1.055, 2.4);
72          }
73       }
74       tableReady = GL_TRUE;
75    }
76    return table[cs8];
77 }
78
79
80
81 /* Texel fetch routines for all supported formats
82  */
83 #define DIM 1
84 #include "s_texfetch_tmp.h"
85
86 #define DIM 2
87 #include "s_texfetch_tmp.h"
88
89 #define DIM 3
90 #include "s_texfetch_tmp.h"
91
92
93 /**
94  * All compressed texture texel fetching is done though this function.
95  * Basically just call a core-Mesa texel fetch function.
96  */
97 static void
98 fetch_compressed(const struct swrast_texture_image *swImage,
99                  GLint i, GLint j, GLint k, GLfloat *texel)
100 {
101    /* The FetchCompressedTexel function takes an integer pixel rowstride,
102     * while the image's rowstride is bytes per row of blocks.
103     */
104    GLuint bw, bh;
105    GLuint texelBytes = _mesa_get_format_bytes(swImage->Base.TexFormat);
106    _mesa_get_format_block_size(swImage->Base.TexFormat, &bw, &bh);
107    assert(swImage->RowStride * bw % texelBytes == 0);
108
109    swImage->FetchCompressedTexel(swImage->ImageSlices[k],
110                                  swImage->RowStride * bw / texelBytes,
111                                  i, j, texel);
112 }
113
114
115
116 /**
117  * Null texel fetch function.
118  *
119  * Have to have this so the FetchTexel function pointer is never NULL.
120  */
121 static void fetch_null_texelf( const struct swrast_texture_image *texImage,
122                                GLint i, GLint j, GLint k, GLfloat *texel )
123 {
124    (void) texImage; (void) i; (void) j; (void) k;
125    texel[RCOMP] = 0.0;
126    texel[GCOMP] = 0.0;
127    texel[BCOMP] = 0.0;
128    texel[ACOMP] = 0.0;
129    _mesa_warning(NULL, "fetch_null_texelf() called!");
130 }
131
132
133 /**
134  * Table to map MESA_FORMAT_ to texel fetch/store funcs.
135  * XXX this is somewhat temporary.
136  */
137 static struct {
138    gl_format Name;
139    FetchTexelFunc Fetch1D;
140    FetchTexelFunc Fetch2D;
141    FetchTexelFunc Fetch3D;
142 }
143 texfetch_funcs[] =
144 {
145    {
146       MESA_FORMAT_NONE,
147       fetch_null_texelf,
148       fetch_null_texelf,
149       fetch_null_texelf
150    },
151
152    {
153       MESA_FORMAT_RGBA8888,
154       fetch_texel_1d_f_rgba8888,
155       fetch_texel_2d_f_rgba8888,
156       fetch_texel_3d_f_rgba8888
157    },
158    {
159       MESA_FORMAT_RGBA8888_REV,
160       fetch_texel_1d_f_rgba8888_rev,
161       fetch_texel_2d_f_rgba8888_rev,
162       fetch_texel_3d_f_rgba8888_rev
163    },
164    {
165       MESA_FORMAT_ARGB8888,
166       fetch_texel_1d_f_argb8888,
167       fetch_texel_2d_f_argb8888,
168       fetch_texel_3d_f_argb8888
169    },
170    {
171       MESA_FORMAT_ARGB8888_REV,
172       fetch_texel_1d_f_argb8888_rev,
173       fetch_texel_2d_f_argb8888_rev,
174       fetch_texel_3d_f_argb8888_rev
175    },
176    {
177       MESA_FORMAT_RGBX8888,
178       fetch_texel_1d_f_rgbx8888,
179       fetch_texel_2d_f_rgbx8888,
180       fetch_texel_3d_f_rgbx8888
181    },
182    {
183       MESA_FORMAT_RGBX8888_REV,
184       fetch_texel_1d_f_rgbx8888_rev,
185       fetch_texel_2d_f_rgbx8888_rev,
186       fetch_texel_3d_f_rgbx8888_rev
187    },
188    {
189       MESA_FORMAT_XRGB8888,
190       fetch_texel_1d_f_xrgb8888,
191       fetch_texel_2d_f_xrgb8888,
192       fetch_texel_3d_f_xrgb8888
193    },
194    {
195       MESA_FORMAT_XRGB8888_REV,
196       fetch_texel_1d_f_xrgb8888_rev,
197       fetch_texel_2d_f_xrgb8888_rev,
198       fetch_texel_3d_f_xrgb8888_rev
199    },
200    {
201       MESA_FORMAT_RGB888,
202       fetch_texel_1d_f_rgb888,
203       fetch_texel_2d_f_rgb888,
204       fetch_texel_3d_f_rgb888
205    },
206    {
207       MESA_FORMAT_BGR888,
208       fetch_texel_1d_f_bgr888,
209       fetch_texel_2d_f_bgr888,
210       fetch_texel_3d_f_bgr888
211    },
212    {
213       MESA_FORMAT_RGB565,
214       fetch_texel_1d_f_rgb565,
215       fetch_texel_2d_f_rgb565,
216       fetch_texel_3d_f_rgb565
217    },
218    {
219       MESA_FORMAT_RGB565_REV,
220       fetch_texel_1d_f_rgb565_rev,
221       fetch_texel_2d_f_rgb565_rev,
222       fetch_texel_3d_f_rgb565_rev
223    },
224    {
225       MESA_FORMAT_ARGB4444,
226       fetch_texel_1d_f_argb4444,
227       fetch_texel_2d_f_argb4444,
228       fetch_texel_3d_f_argb4444
229    },
230    {
231       MESA_FORMAT_ARGB4444_REV,
232       fetch_texel_1d_f_argb4444_rev,
233       fetch_texel_2d_f_argb4444_rev,
234       fetch_texel_3d_f_argb4444_rev
235    },
236    {
237       MESA_FORMAT_RGBA5551,
238       fetch_texel_1d_f_rgba5551,
239       fetch_texel_2d_f_rgba5551,
240       fetch_texel_3d_f_rgba5551
241    },
242    {
243       MESA_FORMAT_ARGB1555,
244       fetch_texel_1d_f_argb1555,
245       fetch_texel_2d_f_argb1555,
246       fetch_texel_3d_f_argb1555
247    },
248    {
249       MESA_FORMAT_ARGB1555_REV,
250       fetch_texel_1d_f_argb1555_rev,
251       fetch_texel_2d_f_argb1555_rev,
252       fetch_texel_3d_f_argb1555_rev
253    },
254    {
255       MESA_FORMAT_AL44,
256       fetch_texel_1d_f_al44,
257       fetch_texel_2d_f_al44,
258       fetch_texel_3d_f_al44
259    },
260    {
261       MESA_FORMAT_AL88,
262       fetch_texel_1d_f_al88,
263       fetch_texel_2d_f_al88,
264       fetch_texel_3d_f_al88
265    },
266    {
267       MESA_FORMAT_AL88_REV,
268       fetch_texel_1d_f_al88_rev,
269       fetch_texel_2d_f_al88_rev,
270       fetch_texel_3d_f_al88_rev
271    },
272    {
273       MESA_FORMAT_AL1616,
274       fetch_texel_1d_f_al1616,
275       fetch_texel_2d_f_al1616,
276       fetch_texel_3d_f_al1616
277    },
278    {
279       MESA_FORMAT_AL1616_REV,
280       fetch_texel_1d_f_al1616_rev,
281       fetch_texel_2d_f_al1616_rev,
282       fetch_texel_3d_f_al1616_rev
283    },
284    {
285       MESA_FORMAT_RGB332,
286       fetch_texel_1d_f_rgb332,
287       fetch_texel_2d_f_rgb332,
288       fetch_texel_3d_f_rgb332
289    },
290    {
291       MESA_FORMAT_A8,
292       fetch_texel_1d_f_a8,
293       fetch_texel_2d_f_a8,
294       fetch_texel_3d_f_a8
295    },
296    {
297       MESA_FORMAT_A16,
298       fetch_texel_1d_f_a16,
299       fetch_texel_2d_f_a16,
300       fetch_texel_3d_f_a16
301    },
302    {
303       MESA_FORMAT_L8,
304       fetch_texel_1d_f_l8,
305       fetch_texel_2d_f_l8,
306       fetch_texel_3d_f_l8
307    },
308    {
309       MESA_FORMAT_L16,
310       fetch_texel_1d_f_l16,
311       fetch_texel_2d_f_l16,
312       fetch_texel_3d_f_l16
313    },
314    {
315       MESA_FORMAT_I8,
316       fetch_texel_1d_f_i8,
317       fetch_texel_2d_f_i8,
318       fetch_texel_3d_f_i8
319    },
320    {
321       MESA_FORMAT_I16,
322       fetch_texel_1d_f_i16,
323       fetch_texel_2d_f_i16,
324       fetch_texel_3d_f_i16
325    },
326    {
327       MESA_FORMAT_YCBCR,
328       fetch_texel_1d_f_ycbcr,
329       fetch_texel_2d_f_ycbcr,
330       fetch_texel_3d_f_ycbcr
331    },
332    {
333       MESA_FORMAT_YCBCR_REV,
334       fetch_texel_1d_f_ycbcr_rev,
335       fetch_texel_2d_f_ycbcr_rev,
336       fetch_texel_3d_f_ycbcr_rev
337    },
338    {
339       MESA_FORMAT_R8,
340       fetch_texel_1d_f_r8,
341       fetch_texel_2d_f_r8,
342       fetch_texel_3d_f_r8
343    },
344    {
345       MESA_FORMAT_GR88,
346       fetch_texel_1d_f_gr88,
347       fetch_texel_2d_f_gr88,
348       fetch_texel_3d_f_gr88
349    },
350    {
351       MESA_FORMAT_RG88,
352       fetch_texel_1d_f_rg88,
353       fetch_texel_2d_f_rg88,
354       fetch_texel_3d_f_rg88
355    },
356    {
357       MESA_FORMAT_R16,
358       fetch_texel_1d_f_r16,
359       fetch_texel_2d_f_r16,
360       fetch_texel_3d_f_r16
361    },
362    {
363       MESA_FORMAT_GR1616,
364       fetch_texel_1d_f_rg1616,
365       fetch_texel_2d_f_rg1616,
366       fetch_texel_3d_f_rg1616
367    },
368    {
369       MESA_FORMAT_RG1616,
370       fetch_texel_1d_f_rg1616_rev,
371       fetch_texel_2d_f_rg1616_rev,
372       fetch_texel_3d_f_rg1616_rev
373    },
374    {
375       MESA_FORMAT_ARGB2101010,
376       fetch_texel_1d_f_argb2101010,
377       fetch_texel_2d_f_argb2101010,
378       fetch_texel_3d_f_argb2101010
379    },
380    {
381       MESA_FORMAT_Z24_S8,
382       fetch_texel_1d_f_z24_s8,
383       fetch_texel_2d_f_z24_s8,
384       fetch_texel_3d_f_z24_s8
385    },
386    {
387       MESA_FORMAT_S8_Z24,
388       fetch_texel_1d_f_s8_z24,
389       fetch_texel_2d_f_s8_z24,
390       fetch_texel_3d_f_s8_z24
391    },
392    {
393       MESA_FORMAT_Z16,
394       fetch_texel_1d_f_z16,
395       fetch_texel_2d_f_z16,
396       fetch_texel_3d_f_z16
397    },
398    {
399       MESA_FORMAT_X8_Z24,
400       fetch_texel_1d_f_s8_z24,
401       fetch_texel_2d_f_s8_z24,
402       fetch_texel_3d_f_s8_z24
403    },
404    {
405       MESA_FORMAT_Z24_X8,
406       fetch_texel_1d_f_z24_s8,
407       fetch_texel_2d_f_z24_s8,
408       fetch_texel_3d_f_z24_s8
409    },
410    {
411       MESA_FORMAT_Z32,
412       fetch_texel_1d_f_z32,
413       fetch_texel_2d_f_z32,
414       fetch_texel_3d_f_z32
415    },
416    {
417       MESA_FORMAT_S8,
418       NULL,
419       NULL,
420       NULL
421    },
422    {
423       MESA_FORMAT_SRGB8,
424       fetch_texel_1d_srgb8,
425       fetch_texel_2d_srgb8,
426       fetch_texel_3d_srgb8
427    },
428    {
429       MESA_FORMAT_SRGBA8,
430       fetch_texel_1d_srgba8,
431       fetch_texel_2d_srgba8,
432       fetch_texel_3d_srgba8
433    },
434    {
435       MESA_FORMAT_SARGB8,
436       fetch_texel_1d_sargb8,
437       fetch_texel_2d_sargb8,
438       fetch_texel_3d_sargb8
439    },
440    {
441       MESA_FORMAT_SL8,
442       fetch_texel_1d_sl8,
443       fetch_texel_2d_sl8,
444       fetch_texel_3d_sl8
445    },
446    {
447       MESA_FORMAT_SLA8,
448       fetch_texel_1d_sla8,
449       fetch_texel_2d_sla8,
450       fetch_texel_3d_sla8
451    },
452    {
453       MESA_FORMAT_SRGB_DXT1,
454       fetch_compressed,
455       fetch_compressed,
456       fetch_compressed
457    },
458    {
459       MESA_FORMAT_SRGBA_DXT1,
460       fetch_compressed,
461       fetch_compressed,
462       fetch_compressed
463    },
464    {
465       MESA_FORMAT_SRGBA_DXT3,
466       fetch_compressed,
467       fetch_compressed,
468       fetch_compressed
469    },
470    {
471       MESA_FORMAT_SRGBA_DXT5,
472       fetch_compressed,
473       fetch_compressed,
474       fetch_compressed
475    },
476
477    {
478       MESA_FORMAT_RGB_FXT1,
479       fetch_compressed,
480       fetch_compressed,
481       fetch_compressed
482    },
483    {
484       MESA_FORMAT_RGBA_FXT1,
485       fetch_compressed,
486       fetch_compressed,
487       fetch_compressed
488    },
489    {
490       MESA_FORMAT_RGB_DXT1,
491       fetch_compressed,
492       fetch_compressed,
493       fetch_compressed
494    },
495    {
496       MESA_FORMAT_RGBA_DXT1,
497       fetch_compressed,
498       fetch_compressed,
499       fetch_compressed
500    },
501    {
502       MESA_FORMAT_RGBA_DXT3,
503       fetch_compressed,
504       fetch_compressed,
505       fetch_compressed
506    },
507    {
508       MESA_FORMAT_RGBA_DXT5,
509       fetch_compressed,
510       fetch_compressed,
511       fetch_compressed
512    },
513    {
514       MESA_FORMAT_RGBA_FLOAT32,
515       fetch_texel_1d_f_rgba_f32,
516       fetch_texel_2d_f_rgba_f32,
517       fetch_texel_3d_f_rgba_f32
518    },
519    {
520       MESA_FORMAT_RGBA_FLOAT16,
521       fetch_texel_1d_f_rgba_f16,
522       fetch_texel_2d_f_rgba_f16,
523       fetch_texel_3d_f_rgba_f16
524    },
525    {
526       MESA_FORMAT_RGB_FLOAT32,
527       fetch_texel_1d_f_rgb_f32,
528       fetch_texel_2d_f_rgb_f32,
529       fetch_texel_3d_f_rgb_f32
530    },
531    {
532       MESA_FORMAT_RGB_FLOAT16,
533       fetch_texel_1d_f_rgb_f16,
534       fetch_texel_2d_f_rgb_f16,
535       fetch_texel_3d_f_rgb_f16
536    },
537    {
538       MESA_FORMAT_ALPHA_FLOAT32,
539       fetch_texel_1d_f_alpha_f32,
540       fetch_texel_2d_f_alpha_f32,
541       fetch_texel_3d_f_alpha_f32
542    },
543    {
544       MESA_FORMAT_ALPHA_FLOAT16,
545       fetch_texel_1d_f_alpha_f16,
546       fetch_texel_2d_f_alpha_f16,
547       fetch_texel_3d_f_alpha_f16
548    },
549    {
550       MESA_FORMAT_LUMINANCE_FLOAT32,
551       fetch_texel_1d_f_luminance_f32,
552       fetch_texel_2d_f_luminance_f32,
553       fetch_texel_3d_f_luminance_f32
554    },
555    {
556       MESA_FORMAT_LUMINANCE_FLOAT16,
557       fetch_texel_1d_f_luminance_f16,
558       fetch_texel_2d_f_luminance_f16,
559       fetch_texel_3d_f_luminance_f16
560    },
561    {
562       MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32,
563       fetch_texel_1d_f_luminance_alpha_f32,
564       fetch_texel_2d_f_luminance_alpha_f32,
565       fetch_texel_3d_f_luminance_alpha_f32
566    },
567    {
568       MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,
569       fetch_texel_1d_f_luminance_alpha_f16,
570       fetch_texel_2d_f_luminance_alpha_f16,
571       fetch_texel_3d_f_luminance_alpha_f16
572    },
573    {
574       MESA_FORMAT_INTENSITY_FLOAT32,
575       fetch_texel_1d_f_intensity_f32,
576       fetch_texel_2d_f_intensity_f32,
577       fetch_texel_3d_f_intensity_f32
578    },
579    {
580       MESA_FORMAT_INTENSITY_FLOAT16,
581       fetch_texel_1d_f_intensity_f16,
582       fetch_texel_2d_f_intensity_f16,
583       fetch_texel_3d_f_intensity_f16
584    },
585    {
586       MESA_FORMAT_R_FLOAT32,
587       fetch_texel_1d_f_r_f32,
588       fetch_texel_2d_f_r_f32,
589       fetch_texel_3d_f_r_f32
590    },
591    {
592       MESA_FORMAT_R_FLOAT16,
593       fetch_texel_1d_f_r_f16,
594       fetch_texel_2d_f_r_f16,
595       fetch_texel_3d_f_r_f16
596    },
597    {
598       MESA_FORMAT_RG_FLOAT32,
599       fetch_texel_1d_f_rg_f32,
600       fetch_texel_2d_f_rg_f32,
601       fetch_texel_3d_f_rg_f32
602    },
603    {
604       MESA_FORMAT_RG_FLOAT16,
605       fetch_texel_1d_f_rg_f16,
606       fetch_texel_2d_f_rg_f16,
607       fetch_texel_3d_f_rg_f16
608    },
609
610    {
611       MESA_FORMAT_ALPHA_UINT8,
612       NULL,
613       NULL,
614       NULL
615    },
616
617    {
618       MESA_FORMAT_ALPHA_UINT16,
619       NULL,
620       NULL,
621       NULL
622    },
623
624    {
625       MESA_FORMAT_ALPHA_UINT32,
626       NULL,
627       NULL,
628       NULL
629    },
630
631    {
632       MESA_FORMAT_ALPHA_INT8,
633       NULL,
634       NULL,
635       NULL
636    },
637
638    {
639       MESA_FORMAT_ALPHA_INT16,
640       NULL,
641       NULL,
642       NULL
643    },
644
645    {
646       MESA_FORMAT_ALPHA_INT32,
647       NULL,
648       NULL,
649       NULL
650    },
651
652
653    {
654       MESA_FORMAT_INTENSITY_UINT8,
655       NULL,
656       NULL,
657       NULL
658    },
659
660    {
661       MESA_FORMAT_INTENSITY_UINT16,
662       NULL,
663       NULL,
664       NULL
665    },
666
667    {
668       MESA_FORMAT_INTENSITY_UINT32,
669       NULL,
670       NULL,
671       NULL
672    },
673
674    {
675       MESA_FORMAT_INTENSITY_INT8,
676       NULL,
677       NULL,
678       NULL
679    },
680
681    {
682       MESA_FORMAT_INTENSITY_INT16,
683       NULL,
684       NULL,
685       NULL
686    },
687
688    {
689       MESA_FORMAT_INTENSITY_INT32,
690       NULL,
691       NULL,
692       NULL
693    },
694
695
696    {
697       MESA_FORMAT_LUMINANCE_UINT8,
698       NULL,
699       NULL,
700       NULL
701    },
702
703    {
704       MESA_FORMAT_LUMINANCE_UINT16,
705       NULL,
706       NULL,
707       NULL
708    },
709
710    {
711       MESA_FORMAT_LUMINANCE_UINT32,
712       NULL,
713       NULL,
714       NULL
715    },
716
717    {
718       MESA_FORMAT_LUMINANCE_INT8,
719       NULL,
720       NULL,
721       NULL
722    },
723
724    {
725       MESA_FORMAT_LUMINANCE_INT16,
726       NULL,
727       NULL,
728       NULL
729    },
730
731    {
732       MESA_FORMAT_LUMINANCE_INT32,
733       NULL,
734       NULL,
735       NULL
736    },
737
738
739    {
740       MESA_FORMAT_LUMINANCE_ALPHA_UINT8,
741       NULL,
742       NULL,
743       NULL
744    },
745
746    {
747       MESA_FORMAT_LUMINANCE_ALPHA_UINT16,
748       NULL,
749       NULL,
750       NULL
751    },
752
753    {
754       MESA_FORMAT_LUMINANCE_ALPHA_UINT32,
755       NULL,
756       NULL,
757       NULL
758    },
759
760    {
761       MESA_FORMAT_LUMINANCE_ALPHA_INT8,
762       NULL,
763       NULL,
764       NULL
765    },
766
767    {
768       MESA_FORMAT_LUMINANCE_ALPHA_INT16,
769       NULL,
770       NULL,
771       NULL
772    },
773
774    {
775       MESA_FORMAT_LUMINANCE_ALPHA_INT32,
776       NULL,
777       NULL,
778       NULL
779    },
780
781
782    {
783       MESA_FORMAT_R_INT8,
784       NULL,
785       NULL,
786       NULL
787    },
788
789    {
790       MESA_FORMAT_RG_INT8,
791       NULL,
792       NULL,
793       NULL
794    },
795
796    {
797       MESA_FORMAT_RGB_INT8,
798       NULL,
799       NULL,
800       NULL
801    },
802
803    /* non-normalized, signed int */
804    {
805       MESA_FORMAT_RGBA_INT8,
806       fetch_texel_1d_rgba_int8,
807       fetch_texel_2d_rgba_int8,
808       fetch_texel_3d_rgba_int8
809    },
810    {
811       MESA_FORMAT_R_INT16,
812       NULL,
813       NULL,
814       NULL
815    },
816    {
817       MESA_FORMAT_RG_INT16,
818       NULL,
819       NULL,
820       NULL
821    },
822    {
823       MESA_FORMAT_RGB_INT16,
824       NULL,
825       NULL,
826       NULL
827    },
828    {
829       MESA_FORMAT_RGBA_INT16,
830       fetch_texel_1d_rgba_int16,
831       fetch_texel_2d_rgba_int16,
832       fetch_texel_3d_rgba_int16
833    },
834    {
835       MESA_FORMAT_R_INT32,
836       NULL,
837       NULL,
838       NULL
839    },
840    {
841       MESA_FORMAT_RG_INT32,
842       NULL,
843       NULL,
844       NULL
845    },
846    {
847       MESA_FORMAT_RGB_INT32,
848       NULL,
849       NULL,
850       NULL
851    },
852    {
853       MESA_FORMAT_RGBA_INT32,
854       fetch_texel_1d_rgba_int32,
855       fetch_texel_2d_rgba_int32,
856       fetch_texel_3d_rgba_int32
857    },
858
859    /* non-normalized, unsigned int */
860    {
861       MESA_FORMAT_R_UINT8,
862       NULL,
863       NULL,
864       NULL
865    },
866    {
867       MESA_FORMAT_RG_UINT8,
868       NULL,
869       NULL,
870       NULL
871    },
872    {
873       MESA_FORMAT_RGB_UINT8,
874       NULL,
875       NULL,
876       NULL
877    },
878    {
879       MESA_FORMAT_RGBA_UINT8,
880       fetch_texel_1d_rgba_uint8,
881       fetch_texel_2d_rgba_uint8,
882       fetch_texel_3d_rgba_uint8
883    },
884    {
885       MESA_FORMAT_R_UINT16,
886       NULL,
887       NULL,
888       NULL
889    },
890    {
891       MESA_FORMAT_RG_UINT16,
892       NULL,
893       NULL,
894       NULL
895    },
896    {
897       MESA_FORMAT_RGB_UINT16,
898       NULL,
899       NULL,
900       NULL
901    },
902    {
903       MESA_FORMAT_RGBA_UINT16,
904       fetch_texel_1d_rgba_uint16,
905       fetch_texel_2d_rgba_uint16,
906       fetch_texel_3d_rgba_uint16
907    },
908    {
909       MESA_FORMAT_R_UINT32,
910       NULL,
911       NULL,
912       NULL
913    },
914    {
915       MESA_FORMAT_RG_UINT32,
916       NULL,
917       NULL,
918       NULL
919    },
920    {
921       MESA_FORMAT_RGB_UINT32,
922       NULL,
923       NULL,
924       NULL
925    },
926    {
927       MESA_FORMAT_RGBA_UINT32,
928       fetch_texel_1d_rgba_uint32,
929       fetch_texel_2d_rgba_uint32,
930       fetch_texel_3d_rgba_uint32
931    },
932
933    /* dudv */
934    {
935       MESA_FORMAT_DUDV8,
936       fetch_texel_1d_dudv8,
937       fetch_texel_2d_dudv8,
938       fetch_texel_3d_dudv8
939    },
940
941    /* signed, normalized */
942    {
943       MESA_FORMAT_SIGNED_R8,
944       fetch_texel_1d_signed_r8,
945       fetch_texel_2d_signed_r8,
946       fetch_texel_3d_signed_r8
947    },
948    {
949       MESA_FORMAT_SIGNED_RG88_REV,
950       fetch_texel_1d_signed_rg88_rev,
951       fetch_texel_2d_signed_rg88_rev,
952       fetch_texel_3d_signed_rg88_rev
953    },
954    {
955       MESA_FORMAT_SIGNED_RGBX8888,
956       fetch_texel_1d_signed_rgbx8888,
957       fetch_texel_2d_signed_rgbx8888,
958       fetch_texel_3d_signed_rgbx8888
959    },
960    {
961       MESA_FORMAT_SIGNED_RGBA8888,
962       fetch_texel_1d_signed_rgba8888,
963       fetch_texel_2d_signed_rgba8888,
964       fetch_texel_3d_signed_rgba8888
965    },
966    {
967       MESA_FORMAT_SIGNED_RGBA8888_REV,
968       fetch_texel_1d_signed_rgba8888_rev,
969       fetch_texel_2d_signed_rgba8888_rev,
970       fetch_texel_3d_signed_rgba8888_rev
971    },
972    {
973       MESA_FORMAT_SIGNED_R16,
974       fetch_texel_1d_signed_r16,
975       fetch_texel_2d_signed_r16,
976       fetch_texel_3d_signed_r16
977    },
978    {
979       MESA_FORMAT_SIGNED_GR1616,
980       fetch_texel_1d_signed_rg1616,
981       fetch_texel_2d_signed_rg1616,
982       fetch_texel_3d_signed_rg1616
983    },
984    {
985       MESA_FORMAT_SIGNED_RGB_16,
986       fetch_texel_1d_signed_rgb_16,
987       fetch_texel_2d_signed_rgb_16,
988       fetch_texel_3d_signed_rgb_16
989    },
990    {
991       MESA_FORMAT_SIGNED_RGBA_16,
992       fetch_texel_1d_signed_rgba_16,
993       fetch_texel_2d_signed_rgba_16,
994       fetch_texel_3d_signed_rgba_16
995    },
996    {
997       MESA_FORMAT_RGBA_16,
998       fetch_texel_1d_rgba_16,
999       fetch_texel_2d_rgba_16,
1000       fetch_texel_3d_rgba_16
1001    },
1002    {
1003       MESA_FORMAT_RED_RGTC1,
1004       fetch_compressed,
1005       fetch_compressed,
1006       fetch_compressed
1007    },
1008    {
1009       MESA_FORMAT_SIGNED_RED_RGTC1,
1010       fetch_compressed,
1011       fetch_compressed,
1012       fetch_compressed
1013    },
1014    {
1015       MESA_FORMAT_RG_RGTC2,
1016       fetch_compressed,
1017       fetch_compressed,
1018       fetch_compressed
1019    },
1020    {
1021       MESA_FORMAT_SIGNED_RG_RGTC2,
1022       fetch_compressed,
1023       fetch_compressed,
1024       fetch_compressed
1025    },
1026    {
1027       MESA_FORMAT_L_LATC1,
1028       fetch_compressed,
1029       fetch_compressed,
1030       fetch_compressed
1031    },
1032    {
1033       MESA_FORMAT_SIGNED_L_LATC1,
1034       fetch_compressed,
1035       fetch_compressed,
1036       fetch_compressed
1037    },
1038    {
1039       MESA_FORMAT_LA_LATC2,
1040       fetch_compressed,
1041       fetch_compressed,
1042       fetch_compressed
1043    },
1044    {
1045       MESA_FORMAT_SIGNED_LA_LATC2,
1046       fetch_compressed,
1047       fetch_compressed,
1048       fetch_compressed
1049    },
1050    {
1051       MESA_FORMAT_ETC1_RGB8,
1052       fetch_compressed,
1053       fetch_compressed,
1054       fetch_compressed
1055    },
1056    {
1057       MESA_FORMAT_ETC2_RGB8,
1058       fetch_compressed,
1059       fetch_compressed,
1060       fetch_compressed
1061    },
1062    {
1063       MESA_FORMAT_ETC2_SRGB8,
1064       fetch_compressed,
1065       fetch_compressed,
1066       fetch_compressed
1067    },
1068    {
1069       MESA_FORMAT_ETC2_RGBA8_EAC,
1070       fetch_compressed,
1071       fetch_compressed,
1072       fetch_compressed
1073    },
1074    {
1075       MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC,
1076       fetch_compressed,
1077       fetch_compressed,
1078       fetch_compressed
1079    },
1080    {
1081       MESA_FORMAT_ETC2_R11_EAC,
1082       fetch_compressed,
1083       fetch_compressed,
1084       fetch_compressed
1085    },
1086    {
1087       MESA_FORMAT_ETC2_RG11_EAC,
1088       fetch_compressed,
1089       fetch_compressed,
1090       fetch_compressed
1091    },
1092    {
1093       MESA_FORMAT_ETC2_SIGNED_R11_EAC,
1094       fetch_compressed,
1095       fetch_compressed,
1096       fetch_compressed
1097    },
1098    {
1099       MESA_FORMAT_ETC2_SIGNED_RG11_EAC,
1100       fetch_compressed,
1101       fetch_compressed,
1102       fetch_compressed
1103    },
1104    {
1105       MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1,
1106       fetch_compressed,
1107       fetch_compressed,
1108       fetch_compressed
1109    },
1110    {
1111       MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1,
1112       fetch_compressed,
1113       fetch_compressed,
1114       fetch_compressed
1115    },
1116    {
1117       MESA_FORMAT_SIGNED_A8,
1118       fetch_texel_1d_signed_a8,
1119       fetch_texel_2d_signed_a8,
1120       fetch_texel_3d_signed_a8
1121    },
1122    {
1123       MESA_FORMAT_SIGNED_L8,
1124       fetch_texel_1d_signed_l8,
1125       fetch_texel_2d_signed_l8,
1126       fetch_texel_3d_signed_l8
1127    },
1128    {
1129       MESA_FORMAT_SIGNED_AL88,
1130       fetch_texel_1d_signed_al88,
1131       fetch_texel_2d_signed_al88,
1132       fetch_texel_3d_signed_al88
1133    },
1134    {
1135       MESA_FORMAT_SIGNED_I8,
1136       fetch_texel_1d_signed_i8,
1137       fetch_texel_2d_signed_i8,
1138       fetch_texel_3d_signed_i8
1139    },
1140    {
1141       MESA_FORMAT_SIGNED_A16,
1142       fetch_texel_1d_signed_a16,
1143       fetch_texel_2d_signed_a16,
1144       fetch_texel_3d_signed_a16
1145    },
1146    {
1147       MESA_FORMAT_SIGNED_L16,
1148       fetch_texel_1d_signed_l16,
1149       fetch_texel_2d_signed_l16,
1150       fetch_texel_3d_signed_l16
1151    },
1152    {
1153       MESA_FORMAT_SIGNED_AL1616,
1154       fetch_texel_1d_signed_al1616,
1155       fetch_texel_2d_signed_al1616,
1156       fetch_texel_3d_signed_al1616
1157    },
1158    {
1159       MESA_FORMAT_SIGNED_I16,
1160       fetch_texel_1d_signed_i16,
1161       fetch_texel_2d_signed_i16,
1162       fetch_texel_3d_signed_i16
1163    },
1164    {
1165       MESA_FORMAT_RGB9_E5_FLOAT,
1166       fetch_texel_1d_rgb9_e5,
1167       fetch_texel_2d_rgb9_e5,
1168       fetch_texel_3d_rgb9_e5
1169    },
1170    {
1171       MESA_FORMAT_R11_G11_B10_FLOAT,
1172       fetch_texel_1d_r11_g11_b10f,
1173       fetch_texel_2d_r11_g11_b10f,
1174       fetch_texel_3d_r11_g11_b10f
1175    },
1176    {
1177       MESA_FORMAT_Z32_FLOAT,
1178       fetch_texel_1d_f_r_f32, /* Reuse the R32F functions. */
1179       fetch_texel_2d_f_r_f32,
1180       fetch_texel_3d_f_r_f32
1181    },
1182    {
1183       MESA_FORMAT_Z32_FLOAT_X24S8,
1184       fetch_texel_1d_z32f_x24s8,
1185       fetch_texel_2d_z32f_x24s8,
1186       fetch_texel_3d_z32f_x24s8
1187    },
1188    {
1189       MESA_FORMAT_ARGB2101010_UINT,
1190       NULL,
1191       NULL,
1192       NULL
1193    },
1194    {
1195       MESA_FORMAT_ABGR2101010_UINT,
1196       NULL,
1197       NULL,
1198       NULL
1199    },
1200    {
1201       MESA_FORMAT_XRGB4444_UNORM,
1202       NULL,
1203       NULL,
1204       NULL
1205    },
1206    {
1207       MESA_FORMAT_XRGB1555_UNORM,
1208       NULL,
1209       NULL,
1210       NULL
1211    },
1212    {
1213       MESA_FORMAT_XBGR8888_SNORM,
1214       NULL,
1215       NULL,
1216       NULL
1217    },
1218    {
1219       MESA_FORMAT_XBGR8888_SRGB,
1220       NULL,
1221       NULL,
1222       NULL
1223    },
1224    {
1225       MESA_FORMAT_XBGR8888_UINT,
1226       NULL,
1227       NULL,
1228       NULL
1229    },
1230    {
1231       MESA_FORMAT_XBGR8888_SINT,
1232       NULL,
1233       NULL,
1234       NULL
1235    },
1236    {
1237       MESA_FORMAT_XRGB2101010_UNORM,
1238       NULL,
1239       NULL,
1240       NULL
1241    },
1242    {
1243       MESA_FORMAT_XBGR16161616_UNORM,
1244       NULL,
1245       NULL,
1246       NULL
1247    },
1248    {
1249       MESA_FORMAT_XBGR16161616_SNORM,
1250       NULL,
1251       NULL,
1252       NULL
1253    },
1254    {
1255       MESA_FORMAT_XBGR16161616_FLOAT,
1256       NULL,
1257       NULL,
1258       NULL
1259    },
1260    {
1261       MESA_FORMAT_XBGR16161616_UINT,
1262       NULL,
1263       NULL,
1264       NULL
1265    },
1266    {
1267       MESA_FORMAT_XBGR16161616_SINT,
1268       NULL,
1269       NULL,
1270       NULL
1271    },
1272    {
1273       MESA_FORMAT_XBGR32323232_FLOAT,
1274       NULL,
1275       NULL,
1276       NULL
1277    },
1278    {
1279       MESA_FORMAT_XBGR32323232_UINT,
1280       NULL,
1281       NULL,
1282       NULL
1283    },
1284    {
1285       MESA_FORMAT_XBGR32323232_SINT,
1286       NULL,
1287       NULL,
1288       NULL
1289    },
1290 };
1291
1292
1293 /**
1294  * Initialize the texture image's FetchTexel methods.
1295  */
1296 static void
1297 set_fetch_functions(const struct gl_sampler_object *samp,
1298                     struct swrast_texture_image *texImage, GLuint dims)
1299 {
1300    gl_format format = texImage->Base.TexFormat;
1301
1302 #ifdef DEBUG
1303    /* check that the table entries are sorted by format name */
1304    gl_format fmt;
1305    for (fmt = 0; fmt < MESA_FORMAT_COUNT; fmt++) {
1306       assert(texfetch_funcs[fmt].Name == fmt);
1307    }
1308 #endif
1309
1310    STATIC_ASSERT(Elements(texfetch_funcs) == MESA_FORMAT_COUNT);
1311
1312    if (samp->sRGBDecode == GL_SKIP_DECODE_EXT &&
1313        _mesa_get_format_color_encoding(format) == GL_SRGB) {
1314       format = _mesa_get_srgb_format_linear(format);
1315    }
1316
1317    assert(format < MESA_FORMAT_COUNT);
1318
1319    switch (dims) {
1320    case 1:
1321       texImage->FetchTexel = texfetch_funcs[format].Fetch1D;
1322       break;
1323    case 2:
1324       texImage->FetchTexel = texfetch_funcs[format].Fetch2D;
1325       break;
1326    case 3:
1327       texImage->FetchTexel = texfetch_funcs[format].Fetch3D;
1328       break;
1329    default:
1330       assert(!"Bad dims in set_fetch_functions()");
1331    }
1332
1333    texImage->FetchCompressedTexel = _mesa_get_compressed_fetch_func(format);
1334
1335    ASSERT(texImage->FetchTexel);
1336 }
1337
1338 void
1339 _mesa_update_fetch_functions(struct gl_context *ctx, GLuint unit)
1340 {
1341    struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current;
1342    struct gl_sampler_object *samp;
1343    GLuint face, i;
1344    GLuint dims;
1345
1346    if (!texObj)
1347       return;
1348
1349    samp = _mesa_get_samplerobj(ctx, unit);
1350
1351    dims = _mesa_get_texture_dimensions(texObj->Target);
1352
1353    for (face = 0; face < 6; face++) {
1354       for (i = 0; i < MAX_TEXTURE_LEVELS; i++) {
1355          if (texObj->Image[face][i]) {
1356             set_fetch_functions(samp,
1357                                 swrast_texture_image(texObj->Image[face][i]),
1358                                 dims);
1359          }
1360       }
1361    }
1362 }