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