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