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