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