Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / mesa / main / 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  * 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.
24  */
25
26
27 /**
28  * \file texfetch.c
29  *
30  * Texel fetch/store functions
31  *
32  * \author Gareth Hughes
33  */
34
35
36 #include "colormac.h"
37 #include "macros.h"
38 #include "texcompress.h"
39 #include "texcompress_fxt1.h"
40 #include "texcompress_s3tc.h"
41 #include "texcompress_rgtc.h"
42 #include "texfetch.h"
43 #include "teximage.h"
44 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
45 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
46
47
48 /**
49  * Convert an 8-bit sRGB value from non-linear space to a
50  * linear RGB value in [0, 1].
51  * Implemented with a 256-entry lookup table.
52  */
53 static INLINE GLfloat
54 nonlinear_to_linear(GLubyte cs8)
55 {
56    static GLfloat table[256];
57    static GLboolean tableReady = GL_FALSE;
58    if (!tableReady) {
59       /* compute lookup table now */
60       GLuint i;
61       for (i = 0; i < 256; i++) {
62          const GLfloat cs = UBYTE_TO_FLOAT(i);
63          if (cs <= 0.04045) {
64             table[i] = cs / 12.92f;
65          }
66          else {
67             table[i] = (GLfloat) pow((cs + 0.055) / 1.055, 2.4);
68          }
69       }
70       tableReady = GL_TRUE;
71    }
72    return table[cs8];
73 }
74
75
76
77 /* Texel fetch routines for all supported formats
78  */
79 #define DIM 1
80 #include "texfetch_tmp.h"
81
82 #define DIM 2
83 #include "texfetch_tmp.h"
84
85 #define DIM 3
86 #include "texfetch_tmp.h"
87
88 /**
89  * Null texel fetch function.
90  *
91  * Have to have this so the FetchTexel function pointer is never NULL.
92  */
93 static void fetch_null_texelf( const struct gl_texture_image *texImage,
94                                GLint i, GLint j, GLint k, GLfloat *texel )
95 {
96    (void) texImage; (void) i; (void) j; (void) k;
97    texel[RCOMP] = 0.0;
98    texel[GCOMP] = 0.0;
99    texel[BCOMP] = 0.0;
100    texel[ACOMP] = 0.0;
101    _mesa_warning(NULL, "fetch_null_texelf() called!");
102 }
103
104 static void store_null_texel(struct gl_texture_image *texImage,
105                              GLint i, GLint j, GLint k, const void *texel)
106 {
107    (void) texImage;
108    (void) i;
109    (void) j;
110    (void) k;
111    (void) texel;
112    /* no-op */
113 }
114
115
116
117 /**
118  * Table to map MESA_FORMAT_ to texel fetch/store funcs.
119  * XXX this is somewhat temporary.
120  */
121 static struct {
122    gl_format Name;
123    FetchTexelFuncF Fetch1D;
124    FetchTexelFuncF Fetch2D;
125    FetchTexelFuncF Fetch3D;
126    StoreTexelFunc StoreTexel;
127 }
128 texfetch_funcs[MESA_FORMAT_COUNT] =
129 {
130    {
131       MESA_FORMAT_NONE,
132       fetch_null_texelf,
133       fetch_null_texelf,
134       fetch_null_texelf,
135       store_null_texel
136    },
137
138    {
139       MESA_FORMAT_RGBA8888,
140       fetch_texel_1d_f_rgba8888,
141       fetch_texel_2d_f_rgba8888,
142       fetch_texel_3d_f_rgba8888,
143       store_texel_rgba8888
144    },
145    {
146       MESA_FORMAT_RGBA8888_REV,
147       fetch_texel_1d_f_rgba8888_rev,
148       fetch_texel_2d_f_rgba8888_rev,
149       fetch_texel_3d_f_rgba8888_rev,
150       store_texel_rgba8888_rev
151    },
152    {
153       MESA_FORMAT_ARGB8888,
154       fetch_texel_1d_f_argb8888,
155       fetch_texel_2d_f_argb8888,
156       fetch_texel_3d_f_argb8888,
157       store_texel_argb8888
158    },
159    {
160       MESA_FORMAT_ARGB8888_REV,
161       fetch_texel_1d_f_argb8888_rev,
162       fetch_texel_2d_f_argb8888_rev,
163       fetch_texel_3d_f_argb8888_rev,
164       store_texel_argb8888_rev
165    },
166    {
167       MESA_FORMAT_XRGB8888,
168       fetch_texel_1d_f_xrgb8888,
169       fetch_texel_2d_f_xrgb8888,
170       fetch_texel_3d_f_xrgb8888,
171       store_texel_xrgb8888
172    },
173    {
174       MESA_FORMAT_XRGB8888_REV,
175       fetch_texel_1d_f_xrgb8888_rev,
176       fetch_texel_2d_f_xrgb8888_rev,
177       fetch_texel_3d_f_xrgb8888_rev,
178       store_texel_xrgb8888_rev,
179    },
180    {
181       MESA_FORMAT_RGB888,
182       fetch_texel_1d_f_rgb888,
183       fetch_texel_2d_f_rgb888,
184       fetch_texel_3d_f_rgb888,
185       store_texel_rgb888
186    },
187    {
188       MESA_FORMAT_BGR888,
189       fetch_texel_1d_f_bgr888,
190       fetch_texel_2d_f_bgr888,
191       fetch_texel_3d_f_bgr888,
192       store_texel_bgr888
193    },
194    {
195       MESA_FORMAT_RGB565,
196       fetch_texel_1d_f_rgb565,
197       fetch_texel_2d_f_rgb565,
198       fetch_texel_3d_f_rgb565,
199       store_texel_rgb565
200    },
201    {
202       MESA_FORMAT_RGB565_REV,
203       fetch_texel_1d_f_rgb565_rev,
204       fetch_texel_2d_f_rgb565_rev,
205       fetch_texel_3d_f_rgb565_rev,
206       store_texel_rgb565_rev
207    },
208    {
209       MESA_FORMAT_ARGB4444,
210       fetch_texel_1d_f_argb4444,
211       fetch_texel_2d_f_argb4444,
212       fetch_texel_3d_f_argb4444,
213       store_texel_argb4444
214    },
215    {
216       MESA_FORMAT_ARGB4444_REV,
217       fetch_texel_1d_f_argb4444_rev,
218       fetch_texel_2d_f_argb4444_rev,
219       fetch_texel_3d_f_argb4444_rev,
220       store_texel_argb4444_rev
221    },
222    {
223       MESA_FORMAT_RGBA5551,
224       fetch_texel_1d_f_rgba5551,
225       fetch_texel_2d_f_rgba5551,
226       fetch_texel_3d_f_rgba5551,
227       store_texel_rgba5551
228    },
229    {
230       MESA_FORMAT_ARGB1555,
231       fetch_texel_1d_f_argb1555,
232       fetch_texel_2d_f_argb1555,
233       fetch_texel_3d_f_argb1555,
234       store_texel_argb1555
235    },
236    {
237       MESA_FORMAT_ARGB1555_REV,
238       fetch_texel_1d_f_argb1555_rev,
239       fetch_texel_2d_f_argb1555_rev,
240       fetch_texel_3d_f_argb1555_rev,
241       store_texel_argb1555_rev
242    },
243    {
244       MESA_FORMAT_AL44,
245       fetch_texel_1d_f_al44,
246       fetch_texel_2d_f_al44,
247       fetch_texel_3d_f_al44,
248       store_texel_al44
249    },
250    {
251       MESA_FORMAT_AL88,
252       fetch_texel_1d_f_al88,
253       fetch_texel_2d_f_al88,
254       fetch_texel_3d_f_al88,
255       store_texel_al88
256    },
257    {
258       MESA_FORMAT_AL88_REV,
259       fetch_texel_1d_f_al88_rev,
260       fetch_texel_2d_f_al88_rev,
261       fetch_texel_3d_f_al88_rev,
262       store_texel_al88_rev
263    },
264    {
265       MESA_FORMAT_AL1616,
266       fetch_texel_1d_f_al1616,
267       fetch_texel_2d_f_al1616,
268       fetch_texel_3d_f_al1616,
269       store_texel_al1616
270    },
271    {
272       MESA_FORMAT_AL1616_REV,
273       fetch_texel_1d_f_al1616_rev,
274       fetch_texel_2d_f_al1616_rev,
275       fetch_texel_3d_f_al1616_rev,
276       store_texel_al1616_rev
277    },
278    {
279       MESA_FORMAT_RGB332,
280       fetch_texel_1d_f_rgb332,
281       fetch_texel_2d_f_rgb332,
282       fetch_texel_3d_f_rgb332,
283       store_texel_rgb332
284    },
285    {
286       MESA_FORMAT_A8,
287       fetch_texel_1d_f_a8,
288       fetch_texel_2d_f_a8,
289       fetch_texel_3d_f_a8,
290       store_texel_a8
291    },
292    {
293       MESA_FORMAT_A16,
294       fetch_texel_1d_f_a16,
295       fetch_texel_2d_f_a16,
296       fetch_texel_3d_f_a16,
297       store_texel_a16
298    },
299    {
300       MESA_FORMAT_L8,
301       fetch_texel_1d_f_l8,
302       fetch_texel_2d_f_l8,
303       fetch_texel_3d_f_l8,
304       store_texel_l8
305    },
306    {
307       MESA_FORMAT_L16,
308       fetch_texel_1d_f_l16,
309       fetch_texel_2d_f_l16,
310       fetch_texel_3d_f_l16,
311       store_texel_l16
312    },
313    {
314       MESA_FORMAT_I8,
315       fetch_texel_1d_f_i8,
316       fetch_texel_2d_f_i8,
317       fetch_texel_3d_f_i8,
318       store_texel_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       store_texel_i16
326    },
327    {
328       MESA_FORMAT_CI8,
329       fetch_texel_1d_f_ci8,
330       fetch_texel_2d_f_ci8,
331       fetch_texel_3d_f_ci8,
332       store_texel_ci8
333    },
334    {
335       MESA_FORMAT_YCBCR,
336       fetch_texel_1d_f_ycbcr,
337       fetch_texel_2d_f_ycbcr,
338       fetch_texel_3d_f_ycbcr,
339       store_texel_ycbcr
340    },
341    {
342       MESA_FORMAT_YCBCR_REV,
343       fetch_texel_1d_f_ycbcr_rev,
344       fetch_texel_2d_f_ycbcr_rev,
345       fetch_texel_3d_f_ycbcr_rev,
346       store_texel_ycbcr_rev
347    },
348    {
349       MESA_FORMAT_R8,
350       fetch_texel_1d_f_r8,
351       fetch_texel_2d_f_r8,
352       fetch_texel_3d_f_r8,
353       store_texel_r8,
354    },
355    {
356       MESA_FORMAT_RG88,
357       fetch_texel_1d_f_rg88,
358       fetch_texel_2d_f_rg88,
359       fetch_texel_3d_f_rg88,
360       store_texel_rg88,
361    },
362    {
363       MESA_FORMAT_RG88_REV,
364       fetch_texel_1d_f_rg88_rev,
365       fetch_texel_2d_f_rg88_rev,
366       fetch_texel_3d_f_rg88_rev,
367       store_texel_rg88_rev,
368    },
369    {
370       MESA_FORMAT_R16,
371       fetch_texel_1d_f_r16,
372       fetch_texel_2d_f_r16,
373       fetch_texel_3d_f_r16,
374       store_texel_r16,
375    },
376    {
377       MESA_FORMAT_RG1616,
378       fetch_texel_1d_f_rg1616,
379       fetch_texel_2d_f_rg1616,
380       fetch_texel_3d_f_rg1616,
381       store_texel_rg1616,
382    },
383    {
384       MESA_FORMAT_RG1616_REV,
385       fetch_texel_1d_f_rg1616_rev,
386       fetch_texel_2d_f_rg1616_rev,
387       fetch_texel_3d_f_rg1616_rev,
388       store_texel_rg1616_rev,
389    },
390    {
391       MESA_FORMAT_ARGB2101010,
392       fetch_texel_1d_f_argb2101010,
393       fetch_texel_2d_f_argb2101010,
394       fetch_texel_3d_f_argb2101010,
395       store_texel_argb2101010
396    },
397    {
398       MESA_FORMAT_Z24_S8,
399       fetch_texel_1d_f_z24_s8,
400       fetch_texel_2d_f_z24_s8,
401       fetch_texel_3d_f_z24_s8,
402       store_texel_z24_s8
403    },
404    {
405       MESA_FORMAT_S8_Z24,
406       fetch_texel_1d_f_s8_z24,
407       fetch_texel_2d_f_s8_z24,
408       fetch_texel_3d_f_s8_z24,
409       store_texel_s8_z24
410    },
411    {
412       MESA_FORMAT_Z16,
413       fetch_texel_1d_f_z16,
414       fetch_texel_2d_f_z16,
415       fetch_texel_3d_f_z16,
416       store_texel_z16
417    },
418    {
419       MESA_FORMAT_X8_Z24,
420       fetch_texel_1d_f_s8_z24,
421       fetch_texel_2d_f_s8_z24,
422       fetch_texel_3d_f_s8_z24,
423       store_texel_s8_z24
424    },
425    {
426       MESA_FORMAT_Z24_X8,
427       fetch_texel_1d_f_z24_s8,
428       fetch_texel_2d_f_z24_s8,
429       fetch_texel_3d_f_z24_s8,
430       store_texel_z24_s8
431    },
432    {
433       MESA_FORMAT_Z32,
434       fetch_texel_1d_f_z32,
435       fetch_texel_2d_f_z32,
436       fetch_texel_3d_f_z32,
437       store_texel_z32
438    },
439    {
440       MESA_FORMAT_S8,
441       NULL,
442       NULL,
443       NULL,
444       NULL
445    },
446    {
447       MESA_FORMAT_SRGB8,
448       fetch_texel_1d_srgb8,
449       fetch_texel_2d_srgb8,
450       fetch_texel_3d_srgb8,
451       store_texel_srgb8
452    },
453    {
454       MESA_FORMAT_SRGBA8,
455       fetch_texel_1d_srgba8,
456       fetch_texel_2d_srgba8,
457       fetch_texel_3d_srgba8,
458       store_texel_srgba8
459    },
460    {
461       MESA_FORMAT_SARGB8,
462       fetch_texel_1d_sargb8,
463       fetch_texel_2d_sargb8,
464       fetch_texel_3d_sargb8,
465       store_texel_sargb8
466    },
467    {
468       MESA_FORMAT_SL8,
469       fetch_texel_1d_sl8,
470       fetch_texel_2d_sl8,
471       fetch_texel_3d_sl8,
472       store_texel_sl8
473    },
474    {
475       MESA_FORMAT_SLA8,
476       fetch_texel_1d_sla8,
477       fetch_texel_2d_sla8,
478       fetch_texel_3d_sla8,
479       store_texel_sla8
480    },
481    {
482       MESA_FORMAT_SRGB_DXT1,
483       NULL,
484       _mesa_fetch_texel_2d_f_srgb_dxt1,
485       NULL,
486       NULL
487    },
488    {
489       MESA_FORMAT_SRGBA_DXT1,
490       NULL,
491       _mesa_fetch_texel_2d_f_srgba_dxt1,
492       NULL,
493       NULL
494    },
495    {
496       MESA_FORMAT_SRGBA_DXT3,
497       NULL,
498       _mesa_fetch_texel_2d_f_srgba_dxt3,
499       NULL,
500       NULL
501    },
502    {
503       MESA_FORMAT_SRGBA_DXT5,
504       NULL,
505       _mesa_fetch_texel_2d_f_srgba_dxt5,
506       NULL,
507       NULL
508    },
509
510    {
511       MESA_FORMAT_RGB_FXT1,
512       NULL,
513       _mesa_fetch_texel_2d_f_rgb_fxt1,
514       NULL,
515       NULL
516    },
517    {
518       MESA_FORMAT_RGBA_FXT1,
519       NULL,
520       _mesa_fetch_texel_2d_f_rgba_fxt1,
521       NULL,
522       NULL
523    },
524    {
525       MESA_FORMAT_RGB_DXT1,
526       NULL,
527       _mesa_fetch_texel_2d_f_rgb_dxt1,
528       NULL,
529       NULL
530    },
531    {
532       MESA_FORMAT_RGBA_DXT1,
533       NULL,
534       _mesa_fetch_texel_2d_f_rgba_dxt1,
535       NULL,
536       NULL
537    },
538    {
539       MESA_FORMAT_RGBA_DXT3,
540       NULL,
541       _mesa_fetch_texel_2d_f_rgba_dxt3,
542       NULL,
543       NULL
544    },
545    {
546       MESA_FORMAT_RGBA_DXT5,
547       NULL,
548       _mesa_fetch_texel_2d_f_rgba_dxt5,
549       NULL,
550       NULL
551    },
552    {
553       MESA_FORMAT_RGBA_FLOAT32,
554       fetch_texel_1d_f_rgba_f32,
555       fetch_texel_2d_f_rgba_f32,
556       fetch_texel_3d_f_rgba_f32,
557       store_texel_rgba_f32
558    },
559    {
560       MESA_FORMAT_RGBA_FLOAT16,
561       fetch_texel_1d_f_rgba_f16,
562       fetch_texel_2d_f_rgba_f16,
563       fetch_texel_3d_f_rgba_f16,
564       store_texel_rgba_f16
565    },
566    {
567       MESA_FORMAT_RGB_FLOAT32,
568       fetch_texel_1d_f_rgb_f32,
569       fetch_texel_2d_f_rgb_f32,
570       fetch_texel_3d_f_rgb_f32,
571       store_texel_rgb_f32
572    },
573    {
574       MESA_FORMAT_RGB_FLOAT16,
575       fetch_texel_1d_f_rgb_f16,
576       fetch_texel_2d_f_rgb_f16,
577       fetch_texel_3d_f_rgb_f16,
578       store_texel_rgb_f16
579    },
580    {
581       MESA_FORMAT_ALPHA_FLOAT32,
582       fetch_texel_1d_f_alpha_f32,
583       fetch_texel_2d_f_alpha_f32,
584       fetch_texel_3d_f_alpha_f32,
585       store_texel_alpha_f32
586    },
587    {
588       MESA_FORMAT_ALPHA_FLOAT16,
589       fetch_texel_1d_f_alpha_f16,
590       fetch_texel_2d_f_alpha_f16,
591       fetch_texel_3d_f_alpha_f16,
592       store_texel_alpha_f16
593    },
594    {
595       MESA_FORMAT_LUMINANCE_FLOAT32,
596       fetch_texel_1d_f_luminance_f32,
597       fetch_texel_2d_f_luminance_f32,
598       fetch_texel_3d_f_luminance_f32,
599       store_texel_luminance_f32
600    },
601    {
602       MESA_FORMAT_LUMINANCE_FLOAT16,
603       fetch_texel_1d_f_luminance_f16,
604       fetch_texel_2d_f_luminance_f16,
605       fetch_texel_3d_f_luminance_f16,
606       store_texel_luminance_f16
607    },
608    {
609       MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32,
610       fetch_texel_1d_f_luminance_alpha_f32,
611       fetch_texel_2d_f_luminance_alpha_f32,
612       fetch_texel_3d_f_luminance_alpha_f32,
613       store_texel_luminance_alpha_f32
614    },
615    {
616       MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,
617       fetch_texel_1d_f_luminance_alpha_f16,
618       fetch_texel_2d_f_luminance_alpha_f16,
619       fetch_texel_3d_f_luminance_alpha_f16,
620       store_texel_luminance_alpha_f16
621    },
622    {
623       MESA_FORMAT_INTENSITY_FLOAT32,
624       fetch_texel_1d_f_intensity_f32,
625       fetch_texel_2d_f_intensity_f32,
626       fetch_texel_3d_f_intensity_f32,
627       store_texel_intensity_f32
628    },
629    {
630       MESA_FORMAT_INTENSITY_FLOAT16,
631       fetch_texel_1d_f_intensity_f16,
632       fetch_texel_2d_f_intensity_f16,
633       fetch_texel_3d_f_intensity_f16,
634       store_texel_intensity_f16
635    },
636    {
637       MESA_FORMAT_R_FLOAT32,
638       fetch_texel_1d_f_r_f32,
639       fetch_texel_2d_f_r_f32,
640       fetch_texel_3d_f_r_f32,
641       store_texel_r_f32
642    },
643    {
644       MESA_FORMAT_R_FLOAT16,
645       fetch_texel_1d_f_r_f16,
646       fetch_texel_2d_f_r_f16,
647       fetch_texel_3d_f_r_f16,
648       store_texel_r_f16
649    },
650    {
651       MESA_FORMAT_RG_FLOAT32,
652       fetch_texel_1d_f_rg_f32,
653       fetch_texel_2d_f_rg_f32,
654       fetch_texel_3d_f_rg_f32,
655       store_texel_rg_f32
656    },
657    {
658       MESA_FORMAT_RG_FLOAT16,
659       fetch_texel_1d_f_rg_f16,
660       fetch_texel_2d_f_rg_f16,
661       fetch_texel_3d_f_rg_f16,
662       store_texel_rg_f16
663    },
664
665    /* non-normalized, signed int */
666    {
667       MESA_FORMAT_RGBA_INT8,
668       fetch_texel_1d_rgba_int8,
669       fetch_texel_2d_rgba_int8,
670       fetch_texel_3d_rgba_int8,
671       store_texel_rgba_int8
672    },
673    {
674       MESA_FORMAT_RGBA_INT16,
675       fetch_texel_1d_rgba_int16,
676       fetch_texel_2d_rgba_int16,
677       fetch_texel_3d_rgba_int16,
678       store_texel_rgba_int16
679    },
680    {
681       MESA_FORMAT_RGBA_INT32,
682       fetch_texel_1d_rgba_int32,
683       fetch_texel_2d_rgba_int32,
684       fetch_texel_3d_rgba_int32,
685       store_texel_rgba_int32
686    },
687
688    /* non-normalized, unsigned int */
689    {
690       MESA_FORMAT_RGBA_UINT8,
691       fetch_texel_1d_rgba_uint8,
692       fetch_texel_2d_rgba_uint8,
693       fetch_texel_3d_rgba_uint8,
694       store_texel_rgba_uint8
695    },
696    {
697       MESA_FORMAT_RGBA_UINT16,
698       fetch_texel_1d_rgba_uint16,
699       fetch_texel_2d_rgba_uint16,
700       fetch_texel_3d_rgba_uint16,
701       store_texel_rgba_uint16
702    },
703    {
704       MESA_FORMAT_RGBA_UINT32,
705       fetch_texel_1d_rgba_uint32,
706       fetch_texel_2d_rgba_uint32,
707       fetch_texel_3d_rgba_uint32,
708       store_texel_rgba_uint32
709    },
710
711    /* dudv */
712    {
713       MESA_FORMAT_DUDV8,
714       fetch_texel_1d_dudv8,
715       fetch_texel_2d_dudv8,
716       fetch_texel_3d_dudv8,
717       NULL
718    },
719
720    /* signed, normalized */
721    {
722       MESA_FORMAT_SIGNED_R8,
723       fetch_texel_1d_signed_r8,
724       fetch_texel_2d_signed_r8,
725       fetch_texel_3d_signed_r8,
726       store_texel_signed_r8
727    },
728    {
729       MESA_FORMAT_SIGNED_RG88_REV,
730       fetch_texel_1d_signed_rg88_rev,
731       fetch_texel_2d_signed_rg88_rev,
732       fetch_texel_3d_signed_rg88_rev,
733       store_texel_signed_rg88_rev
734    },
735    {
736       MESA_FORMAT_SIGNED_RGBX8888,
737       fetch_texel_1d_signed_rgbx8888,
738       fetch_texel_2d_signed_rgbx8888,
739       fetch_texel_3d_signed_rgbx8888,
740       store_texel_signed_rgbx8888
741    },
742    {
743       MESA_FORMAT_SIGNED_RGBA8888,
744       fetch_texel_1d_signed_rgba8888,
745       fetch_texel_2d_signed_rgba8888,
746       fetch_texel_3d_signed_rgba8888,
747       store_texel_signed_rgba8888
748    },
749    {
750       MESA_FORMAT_SIGNED_RGBA8888_REV,
751       fetch_texel_1d_signed_rgba8888_rev,
752       fetch_texel_2d_signed_rgba8888_rev,
753       fetch_texel_3d_signed_rgba8888_rev,
754       store_texel_signed_rgba8888_rev
755    },
756    {
757       MESA_FORMAT_SIGNED_R16,
758       fetch_texel_1d_signed_r16,
759       fetch_texel_2d_signed_r16,
760       fetch_texel_3d_signed_r16,
761       store_texel_signed_r16
762    },
763    {
764       MESA_FORMAT_SIGNED_GR1616,
765       fetch_texel_1d_signed_rg1616,
766       fetch_texel_2d_signed_rg1616,
767       fetch_texel_3d_signed_rg1616,
768       store_texel_signed_rg1616
769    },
770    {
771       MESA_FORMAT_SIGNED_RGB_16,
772       fetch_texel_1d_signed_rgb_16,
773       fetch_texel_2d_signed_rgb_16,
774       fetch_texel_3d_signed_rgb_16,
775       store_texel_signed_rgb_16
776    },
777    {
778       MESA_FORMAT_SIGNED_RGBA_16,
779       fetch_texel_1d_signed_rgba_16,
780       fetch_texel_2d_signed_rgba_16,
781       fetch_texel_3d_signed_rgba_16,
782       store_texel_signed_rgba_16
783    },
784    {
785       MESA_FORMAT_RGBA_16,
786       fetch_texel_1d_rgba_16,
787       fetch_texel_2d_rgba_16,
788       fetch_texel_3d_rgba_16,
789       store_texel_rgba_16
790    },
791    {
792       MESA_FORMAT_RED_RGTC1,
793       NULL,
794       _mesa_fetch_texel_2d_f_red_rgtc1,
795       NULL,
796       NULL
797    },
798    {
799       MESA_FORMAT_SIGNED_RED_RGTC1,
800       NULL,
801       _mesa_fetch_texel_2d_f_signed_red_rgtc1,
802       NULL,
803       NULL
804    },
805    {
806       MESA_FORMAT_RG_RGTC2,
807       NULL,
808       _mesa_fetch_texel_2d_f_rg_rgtc2,
809       NULL,
810       NULL
811    },
812    {
813       MESA_FORMAT_SIGNED_RG_RGTC2,
814       NULL,
815       _mesa_fetch_texel_2d_f_signed_rg_rgtc2,
816       NULL,
817       NULL
818    },
819    {
820       MESA_FORMAT_L_LATC1,
821       NULL,
822       _mesa_fetch_texel_2d_f_l_latc1,
823       NULL,
824       NULL
825    },
826    {
827       MESA_FORMAT_SIGNED_L_LATC1,
828       NULL,
829       _mesa_fetch_texel_2d_f_signed_l_latc1,
830       NULL,
831       NULL
832    },
833    {
834       MESA_FORMAT_LA_LATC2,
835       NULL,
836       _mesa_fetch_texel_2d_f_la_latc2,
837       NULL,
838       NULL
839    },
840    {
841       MESA_FORMAT_SIGNED_LA_LATC2,
842       NULL,
843       _mesa_fetch_texel_2d_f_signed_la_latc2,
844       NULL,
845       NULL
846    },
847    {
848       MESA_FORMAT_SIGNED_A8,
849       fetch_texel_1d_signed_a8,
850       fetch_texel_2d_signed_a8,
851       fetch_texel_3d_signed_a8,
852       store_texel_signed_a8
853    },
854    {
855       MESA_FORMAT_SIGNED_L8,
856       fetch_texel_1d_signed_l8,
857       fetch_texel_2d_signed_l8,
858       fetch_texel_3d_signed_l8,
859       store_texel_signed_l8
860    },
861    {
862       MESA_FORMAT_SIGNED_AL88,
863       fetch_texel_1d_signed_al88,
864       fetch_texel_2d_signed_al88,
865       fetch_texel_3d_signed_al88,
866       store_texel_signed_al88
867    },
868    {
869       MESA_FORMAT_SIGNED_I8,
870       fetch_texel_1d_signed_i8,
871       fetch_texel_2d_signed_i8,
872       fetch_texel_3d_signed_i8,
873       store_texel_signed_i8
874    },
875    {
876       MESA_FORMAT_SIGNED_A16,
877       fetch_texel_1d_signed_a16,
878       fetch_texel_2d_signed_a16,
879       fetch_texel_3d_signed_a16,
880       store_texel_signed_a16
881    },
882    {
883       MESA_FORMAT_SIGNED_L16,
884       fetch_texel_1d_signed_l16,
885       fetch_texel_2d_signed_l16,
886       fetch_texel_3d_signed_l16,
887       store_texel_signed_l16
888    },
889    {
890       MESA_FORMAT_SIGNED_AL1616,
891       fetch_texel_1d_signed_al1616,
892       fetch_texel_2d_signed_al1616,
893       fetch_texel_3d_signed_al1616,
894       store_texel_signed_al1616
895    },
896    {
897       MESA_FORMAT_SIGNED_I16,
898       fetch_texel_1d_signed_i16,
899       fetch_texel_2d_signed_i16,
900       fetch_texel_3d_signed_i16,
901       store_texel_signed_i16
902    },
903    {
904       MESA_FORMAT_RGB9_E5_FLOAT,
905       fetch_texel_1d_rgb9_e5,
906       fetch_texel_2d_rgb9_e5,
907       fetch_texel_3d_rgb9_e5,
908       store_texel_rgb9_e5
909    },
910    {
911       MESA_FORMAT_R11_G11_B10_FLOAT,
912       fetch_texel_1d_r11_g11_b10f,
913       fetch_texel_2d_r11_g11_b10f,
914       fetch_texel_3d_r11_g11_b10f,
915       store_texel_r11_g11_b10f
916    }
917 };
918
919
920 FetchTexelFuncF
921 _mesa_get_texel_fetch_func(gl_format format, GLuint dims)
922 {
923 #ifdef DEBUG
924    /* check that the table entries are sorted by format name */
925    gl_format fmt;
926    for (fmt = 0; fmt < MESA_FORMAT_COUNT; fmt++) {
927       assert(texfetch_funcs[fmt].Name == fmt);
928    }
929 #endif
930
931    assert(Elements(texfetch_funcs) == MESA_FORMAT_COUNT);
932    assert(format < MESA_FORMAT_COUNT);
933
934    switch (dims) {
935    case 1:
936       return texfetch_funcs[format].Fetch1D;
937    case 2:
938       return texfetch_funcs[format].Fetch2D;
939    case 3:
940       return texfetch_funcs[format].Fetch3D;
941    default:
942       assert(0 && "bad dims in _mesa_get_texel_fetch_func");
943       return NULL;
944    }
945 }
946
947
948 StoreTexelFunc
949 _mesa_get_texel_store_func(gl_format format)
950 {
951    assert(format < MESA_FORMAT_COUNT);
952    return texfetch_funcs[format].StoreTexel;
953 }
954
955
956 /**
957  * Adaptor for fetching a GLchan texel from a float-valued texture.
958  */
959 static void
960 fetch_texel_float_to_chan(const struct gl_texture_image *texImage,
961                           GLint i, GLint j, GLint k, GLchan *texelOut)
962 {
963    GLfloat temp[4];
964    GLenum baseFormat = _mesa_get_format_base_format(texImage->TexFormat);
965
966    ASSERT(texImage->FetchTexelf);
967    texImage->FetchTexelf(texImage, i, j, k, temp);
968    if (baseFormat == GL_DEPTH_COMPONENT ||
969        baseFormat == GL_DEPTH_STENCIL_EXT) {
970       /* just one channel */
971       UNCLAMPED_FLOAT_TO_CHAN(texelOut[0], temp[0]);
972    }
973    else {
974       /* four channels */
975       UNCLAMPED_FLOAT_TO_CHAN(texelOut[0], temp[0]);
976       UNCLAMPED_FLOAT_TO_CHAN(texelOut[1], temp[1]);
977       UNCLAMPED_FLOAT_TO_CHAN(texelOut[2], temp[2]);
978       UNCLAMPED_FLOAT_TO_CHAN(texelOut[3], temp[3]);
979    }
980 }
981
982
983 #if 0
984 /**
985  * Adaptor for fetching a float texel from a GLchan-valued texture.
986  */
987 static void
988 fetch_texel_chan_to_float(const struct gl_texture_image *texImage,
989                           GLint i, GLint j, GLint k, GLfloat *texelOut)
990 {
991    GLchan temp[4];
992    GLenum baseFormat = _mesa_get_format_base_format(texImage->TexFormat);
993
994    ASSERT(texImage->FetchTexelc);
995    texImage->FetchTexelc(texImage, i, j, k, temp);
996    if (baseFormat == GL_DEPTH_COMPONENT ||
997        baseFormat == GL_DEPTH_STENCIL_EXT) {
998       /* just one channel */
999       texelOut[0] = CHAN_TO_FLOAT(temp[0]);
1000    }
1001    else {
1002       /* four channels */
1003       texelOut[0] = CHAN_TO_FLOAT(temp[0]);
1004       texelOut[1] = CHAN_TO_FLOAT(temp[1]);
1005       texelOut[2] = CHAN_TO_FLOAT(temp[2]);
1006       texelOut[3] = CHAN_TO_FLOAT(temp[3]);
1007    }
1008 }
1009 #endif
1010
1011
1012 /**
1013  * Initialize the texture image's FetchTexelc and FetchTexelf methods.
1014  */
1015 void
1016 _mesa_set_fetch_functions(struct gl_texture_image *texImage, GLuint dims)
1017 {
1018    gl_format format = texImage->TexFormat;
1019
1020    ASSERT(dims == 1 || dims == 2 || dims == 3);
1021
1022    if (texImage->TexObject->Sampler.sRGBDecode == GL_SKIP_DECODE_EXT &&
1023        _mesa_get_format_color_encoding(format) == GL_SRGB) {
1024       format = _mesa_get_srgb_format_linear(format);
1025    }
1026
1027    texImage->FetchTexelf = _mesa_get_texel_fetch_func(format, dims);
1028
1029    texImage->FetchTexelc = fetch_texel_float_to_chan;
1030
1031    ASSERT(texImage->FetchTexelc);
1032    ASSERT(texImage->FetchTexelf);
1033 }
1034
1035 void
1036 _mesa_update_fetch_functions(struct gl_texture_object *texObj)
1037 {
1038    GLuint face, i;
1039    GLuint dims;
1040
1041    dims = _mesa_get_texture_dimensions(texObj->Target);
1042
1043    for (face = 0; face < 6; face++) {
1044       for (i = 0; i < MAX_TEXTURE_LEVELS; i++) {
1045          if (texObj->Image[face][i]) {
1046             _mesa_set_fetch_functions(texObj->Image[face][i], dims);
1047          }
1048       }
1049    }
1050 }