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