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