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