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