dc22838cbd0f8f68ad0c4120d521f9d20497a1fa
[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 mesa_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 /* Packed unorm formats */
152 {
153 MESA_FORMAT_A8B8G8R8_UNORM,
154 fetch_texel_1d_f_rgba8888,
155 fetch_texel_2d_f_rgba8888,
156 fetch_texel_3d_f_rgba8888
157 },
158 {
159 MESA_FORMAT_X8B8G8R8_UNORM,
160 fetch_texel_1d_f_rgbx8888,
161 fetch_texel_2d_f_rgbx8888,
162 fetch_texel_3d_f_rgbx8888
163 },
164 {
165 MESA_FORMAT_R8G8B8A8_UNORM,
166 fetch_texel_1d_f_rgba8888_rev,
167 fetch_texel_2d_f_rgba8888_rev,
168 fetch_texel_3d_f_rgba8888_rev
169 },
170 {
171 MESA_FORMAT_R8G8B8X8_UNORM,
172 fetch_texel_1d_f_rgbx8888_rev,
173 fetch_texel_2d_f_rgbx8888_rev,
174 fetch_texel_3d_f_rgbx8888_rev
175 },
176 {
177 MESA_FORMAT_B8G8R8A8_UNORM,
178 fetch_texel_1d_f_argb8888,
179 fetch_texel_2d_f_argb8888,
180 fetch_texel_3d_f_argb8888
181 },
182 {
183 MESA_FORMAT_B8G8R8X8_UNORM,
184 fetch_texel_1d_f_xrgb8888,
185 fetch_texel_2d_f_xrgb8888,
186 fetch_texel_3d_f_xrgb8888
187 },
188 {
189 MESA_FORMAT_A8R8G8B8_UNORM,
190 fetch_texel_1d_f_argb8888_rev,
191 fetch_texel_2d_f_argb8888_rev,
192 fetch_texel_3d_f_argb8888_rev
193 },
194 {
195 MESA_FORMAT_X8R8G8B8_UNORM,
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_L16A16_UNORM,
202 fetch_texel_1d_f_al1616,
203 fetch_texel_2d_f_al1616,
204 fetch_texel_3d_f_al1616
205 },
206 {
207 MESA_FORMAT_A16L16_UNORM,
208 fetch_texel_1d_f_al1616_rev,
209 fetch_texel_2d_f_al1616_rev,
210 fetch_texel_3d_f_al1616_rev
211 },
212 {
213 MESA_FORMAT_B5G6R5_UNORM,
214 fetch_texel_1d_f_rgb565,
215 fetch_texel_2d_f_rgb565,
216 fetch_texel_3d_f_rgb565
217 },
218 {
219 MESA_FORMAT_R5G6B5_UNORM,
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_B4G4R4A4_UNORM,
226 fetch_texel_1d_f_argb4444,
227 fetch_texel_2d_f_argb4444,
228 fetch_texel_3d_f_argb4444
229 },
230 {
231 MESA_FORMAT_B4G4R4X4_UNORM,
232 NULL,
233 NULL,
234 NULL
235 },
236 {
237 MESA_FORMAT_A4R4G4B4_UNORM,
238 fetch_texel_1d_f_argb4444_rev,
239 fetch_texel_2d_f_argb4444_rev,
240 fetch_texel_3d_f_argb4444_rev
241 },
242 {
243 MESA_FORMAT_A1B5G5R5_UNORM,
244 fetch_texel_1d_f_rgba5551,
245 fetch_texel_2d_f_rgba5551,
246 fetch_texel_3d_f_rgba5551
247 },
248 {
249 MESA_FORMAT_B5G5R5A1_UNORM,
250 fetch_texel_1d_f_argb1555,
251 fetch_texel_2d_f_argb1555,
252 fetch_texel_3d_f_argb1555
253 },
254 {
255 MESA_FORMAT_B5G5R5X1_UNORM,
256 NULL,
257 NULL,
258 NULL
259 },
260 {
261 MESA_FORMAT_A1R5G5B5_UNORM,
262 fetch_texel_1d_f_argb1555_rev,
263 fetch_texel_2d_f_argb1555_rev,
264 fetch_texel_3d_f_argb1555_rev
265 },
266 {
267 MESA_FORMAT_L8A8_UNORM,
268 fetch_texel_1d_f_al88,
269 fetch_texel_2d_f_al88,
270 fetch_texel_3d_f_al88
271 },
272 {
273 MESA_FORMAT_A8L8_UNORM,
274 fetch_texel_1d_f_al88_rev,
275 fetch_texel_2d_f_al88_rev,
276 fetch_texel_3d_f_al88_rev
277 },
278 {
279 MESA_FORMAT_R8G8_UNORM,
280 fetch_texel_1d_f_gr88,
281 fetch_texel_2d_f_gr88,
282 fetch_texel_3d_f_gr88
283 },
284 {
285 MESA_FORMAT_G8R8_UNORM,
286 fetch_texel_1d_f_rg88,
287 fetch_texel_2d_f_rg88,
288 fetch_texel_3d_f_rg88
289 },
290 {
291 MESA_FORMAT_L4A4_UNORM,
292 fetch_texel_1d_f_al44,
293 fetch_texel_2d_f_al44,
294 fetch_texel_3d_f_al44
295 },
296 {
297 MESA_FORMAT_B2G3R3_UNORM,
298 fetch_texel_1d_f_rgb332,
299 fetch_texel_2d_f_rgb332,
300 fetch_texel_3d_f_rgb332
301 },
302 {
303 MESA_FORMAT_R16G16_UNORM,
304 fetch_texel_1d_f_rg1616,
305 fetch_texel_2d_f_rg1616,
306 fetch_texel_3d_f_rg1616
307 },
308 {
309 MESA_FORMAT_G16R16_UNORM,
310 fetch_texel_1d_f_rg1616_rev,
311 fetch_texel_2d_f_rg1616_rev,
312 fetch_texel_3d_f_rg1616_rev
313 },
314 {
315 MESA_FORMAT_B10G10R10A2_UNORM,
316 fetch_texel_1d_f_argb2101010,
317 fetch_texel_2d_f_argb2101010,
318 fetch_texel_3d_f_argb2101010
319 },
320 {
321 MESA_FORMAT_B10G10R10X2_UNORM,
322 NULL,
323 NULL,
324 NULL
325 },
326 {
327 MESA_FORMAT_R10G10B10A2_UNORM,
328 NULL,
329 NULL,
330 NULL
331 },
332 {
333 MESA_FORMAT_S8_UINT_Z24_UNORM,
334 fetch_texel_1d_f_z24_s8,
335 fetch_texel_2d_f_z24_s8,
336 fetch_texel_3d_f_z24_s8
337 },
338 {
339 MESA_FORMAT_X8Z24_UNORM,
340 fetch_texel_1d_f_z24_s8,
341 fetch_texel_2d_f_z24_s8,
342 fetch_texel_3d_f_z24_s8
343 },
344 {
345 MESA_FORMAT_Z24_UNORM_S8_UINT,
346 fetch_texel_1d_f_s8_z24,
347 fetch_texel_2d_f_s8_z24,
348 fetch_texel_3d_f_s8_z24
349 },
350 {
351 MESA_FORMAT_Z24_UNORM_X8_UINT,
352 fetch_texel_1d_f_s8_z24,
353 fetch_texel_2d_f_s8_z24,
354 fetch_texel_3d_f_s8_z24
355 },
356 {
357 MESA_FORMAT_YCBCR,
358 fetch_texel_1d_f_ycbcr,
359 fetch_texel_2d_f_ycbcr,
360 fetch_texel_3d_f_ycbcr
361 },
362 {
363 MESA_FORMAT_YCBCR_REV,
364 fetch_texel_1d_f_ycbcr_rev,
365 fetch_texel_2d_f_ycbcr_rev,
366 fetch_texel_3d_f_ycbcr_rev
367 },
368 {
369 MESA_FORMAT_DUDV8,
370 fetch_texel_1d_dudv8,
371 fetch_texel_2d_dudv8,
372 fetch_texel_3d_dudv8
373 },
374
375 /* Array unorm formats */
376 {
377 MESA_FORMAT_A_UNORM8,
378 fetch_texel_1d_f_a8,
379 fetch_texel_2d_f_a8,
380 fetch_texel_3d_f_a8
381 },
382 {
383 MESA_FORMAT_A_UNORM16,
384 fetch_texel_1d_f_a16,
385 fetch_texel_2d_f_a16,
386 fetch_texel_3d_f_a16
387 },
388 {
389 MESA_FORMAT_L_UNORM8,
390 fetch_texel_1d_f_l8,
391 fetch_texel_2d_f_l8,
392 fetch_texel_3d_f_l8
393 },
394 {
395 MESA_FORMAT_L_UNORM16,
396 fetch_texel_1d_f_l16,
397 fetch_texel_2d_f_l16,
398 fetch_texel_3d_f_l16
399 },
400 {
401 MESA_FORMAT_I_UNORM8,
402 fetch_texel_1d_f_i8,
403 fetch_texel_2d_f_i8,
404 fetch_texel_3d_f_i8
405 },
406 {
407 MESA_FORMAT_I_UNORM16,
408 fetch_texel_1d_f_i16,
409 fetch_texel_2d_f_i16,
410 fetch_texel_3d_f_i16
411 },
412 {
413 MESA_FORMAT_R_UNORM8,
414 fetch_texel_1d_f_r8,
415 fetch_texel_2d_f_r8,
416 fetch_texel_3d_f_r8
417 },
418 {
419 MESA_FORMAT_R_UNORM16,
420 fetch_texel_1d_f_r16,
421 fetch_texel_2d_f_r16,
422 fetch_texel_3d_f_r16
423 },
424 {
425 MESA_FORMAT_BGR_UNORM8,
426 fetch_texel_1d_f_rgb888,
427 fetch_texel_2d_f_rgb888,
428 fetch_texel_3d_f_rgb888
429 },
430 {
431 MESA_FORMAT_RGB_UNORM8,
432 fetch_texel_1d_f_bgr888,
433 fetch_texel_2d_f_bgr888,
434 fetch_texel_3d_f_bgr888
435 },
436 {
437 MESA_FORMAT_RGBA_UNORM16,
438 fetch_texel_1d_rgba_16,
439 fetch_texel_2d_rgba_16,
440 fetch_texel_3d_rgba_16
441 },
442 {
443 MESA_FORMAT_RGBX_UNORM16,
444 fetch_texel_1d_xbgr16161616_unorm,
445 fetch_texel_2d_xbgr16161616_unorm,
446 fetch_texel_3d_xbgr16161616_unorm
447 },
448 {
449 MESA_FORMAT_Z_UNORM16,
450 fetch_texel_1d_f_z16,
451 fetch_texel_2d_f_z16,
452 fetch_texel_3d_f_z16
453 },
454 {
455 MESA_FORMAT_Z_UNORM32,
456 fetch_texel_1d_f_z32,
457 fetch_texel_2d_f_z32,
458 fetch_texel_3d_f_z32
459 },
460 {
461 MESA_FORMAT_S_UINT8,
462 NULL,
463 NULL,
464 NULL
465 },
466
467 /* Packed signed/normalized formats */
468 {
469 MESA_FORMAT_A8B8G8R8_SNORM,
470 fetch_texel_1d_signed_rgba8888,
471 fetch_texel_2d_signed_rgba8888,
472 fetch_texel_3d_signed_rgba8888
473 },
474 {
475 MESA_FORMAT_X8B8G8R8_SNORM,
476 fetch_texel_1d_signed_rgbx8888,
477 fetch_texel_2d_signed_rgbx8888,
478 fetch_texel_3d_signed_rgbx8888
479 },
480 {
481 MESA_FORMAT_R8G8B8A8_SNORM,
482 fetch_texel_1d_signed_rgba8888_rev,
483 fetch_texel_2d_signed_rgba8888_rev,
484 fetch_texel_3d_signed_rgba8888_rev
485 },
486 {
487 MESA_FORMAT_R8G8B8X8_SNORM,
488 NULL,
489 NULL,
490 NULL
491 },
492 {
493 MESA_FORMAT_R16G16_SNORM,
494 fetch_texel_1d_signed_rg1616,
495 fetch_texel_2d_signed_rg1616,
496 fetch_texel_3d_signed_rg1616
497 },
498 {
499 MESA_FORMAT_G16R16_SNORM,
500 NULL,
501 NULL,
502 NULL
503 },
504 {
505 MESA_FORMAT_R8G8_SNORM,
506 fetch_texel_1d_signed_rg88_rev,
507 fetch_texel_2d_signed_rg88_rev,
508 fetch_texel_3d_signed_rg88_rev
509 },
510 {
511 MESA_FORMAT_G8R8_SNORM,
512 NULL,
513 NULL,
514 NULL
515 },
516 {
517 MESA_FORMAT_L8A8_SNORM,
518 fetch_texel_1d_signed_al88,
519 fetch_texel_2d_signed_al88,
520 fetch_texel_3d_signed_al88
521 },
522
523 /* Array signed/normalized formats */
524 {
525 MESA_FORMAT_A_SNORM8,
526 fetch_texel_1d_signed_a8,
527 fetch_texel_2d_signed_a8,
528 fetch_texel_3d_signed_a8
529 },
530 {
531 MESA_FORMAT_A_SNORM16,
532 fetch_texel_1d_signed_a16,
533 fetch_texel_2d_signed_a16,
534 fetch_texel_3d_signed_a16
535 },
536 {
537 MESA_FORMAT_L_SNORM8,
538 fetch_texel_1d_signed_l8,
539 fetch_texel_2d_signed_l8,
540 fetch_texel_3d_signed_l8
541 },
542 {
543 MESA_FORMAT_L_SNORM16,
544 fetch_texel_1d_signed_l16,
545 fetch_texel_2d_signed_l16,
546 fetch_texel_3d_signed_l16
547 },
548 {
549 MESA_FORMAT_I_SNORM8,
550 fetch_texel_1d_signed_i8,
551 fetch_texel_2d_signed_i8,
552 fetch_texel_3d_signed_i8
553 },
554 {
555 MESA_FORMAT_I_SNORM16,
556 fetch_texel_1d_signed_i16,
557 fetch_texel_2d_signed_i16,
558 fetch_texel_3d_signed_i16
559 },
560 {
561 MESA_FORMAT_R_SNORM8,
562 fetch_texel_1d_signed_r8,
563 fetch_texel_2d_signed_r8,
564 fetch_texel_3d_signed_r8
565 },
566 {
567 MESA_FORMAT_R_SNORM16,
568 fetch_texel_1d_signed_r16,
569 fetch_texel_2d_signed_r16,
570 fetch_texel_3d_signed_r16
571 },
572 {
573 MESA_FORMAT_LA_SNORM16,
574 fetch_texel_1d_signed_al1616,
575 fetch_texel_2d_signed_al1616,
576 fetch_texel_3d_signed_al1616
577 },
578 {
579 MESA_FORMAT_RGB_SNORM16,
580 fetch_texel_1d_signed_rgb_16,
581 fetch_texel_2d_signed_rgb_16,
582 fetch_texel_3d_signed_rgb_16
583 },
584 {
585 MESA_FORMAT_RGBA_SNORM16,
586 fetch_texel_1d_signed_rgba_16,
587 fetch_texel_2d_signed_rgba_16,
588 fetch_texel_3d_signed_rgba_16
589 },
590 {
591 MESA_FORMAT_RGBX_SNORM16,
592 NULL,
593 NULL,
594 NULL
595 },
596
597 /* Packed sRGB formats */
598 {
599 MESA_FORMAT_A8B8G8R8_SRGB,
600 fetch_texel_1d_srgba8,
601 fetch_texel_2d_srgba8,
602 fetch_texel_3d_srgba8
603 },
604 {
605 MESA_FORMAT_B8G8R8A8_SRGB,
606 fetch_texel_1d_sargb8,
607 fetch_texel_2d_sargb8,
608 fetch_texel_3d_sargb8
609 },
610 {
611 MESA_FORMAT_B8G8R8X8_SRGB,
612 NULL,
613 NULL,
614 NULL
615 },
616 {
617 MESA_FORMAT_R8G8B8A8_SRGB,
618 fetch_texel_1d_sabgr8,
619 fetch_texel_2d_sabgr8,
620 fetch_texel_3d_sabgr8
621 },
622 {
623 MESA_FORMAT_R8G8B8X8_SRGB,
624 fetch_texel_1d_sxbgr8,
625 fetch_texel_2d_sxbgr8,
626 fetch_texel_3d_sxbgr8
627 },
628 {
629 MESA_FORMAT_L8A8_SRGB,
630 fetch_texel_1d_sla8,
631 fetch_texel_2d_sla8,
632 fetch_texel_3d_sla8
633 },
634
635 /* Array sRGB formats */
636 {
637 MESA_FORMAT_L_SRGB8,
638 fetch_texel_1d_sl8,
639 fetch_texel_2d_sl8,
640 fetch_texel_3d_sl8
641 },
642 {
643 MESA_FORMAT_BGR_SRGB8,
644 fetch_texel_1d_srgb8,
645 fetch_texel_2d_srgb8,
646 fetch_texel_3d_srgb8
647 },
648
649 /* Packed float formats */
650 {
651 MESA_FORMAT_R9G9B9E5_FLOAT,
652 fetch_texel_1d_rgb9_e5,
653 fetch_texel_2d_rgb9_e5,
654 fetch_texel_3d_rgb9_e5
655 },
656 {
657 MESA_FORMAT_R11G11B10_FLOAT,
658 fetch_texel_1d_r11_g11_b10f,
659 fetch_texel_2d_r11_g11_b10f,
660 fetch_texel_3d_r11_g11_b10f
661 },
662 {
663 MESA_FORMAT_Z32_FLOAT_S8X24_UINT,
664 fetch_texel_1d_z32f_x24s8,
665 fetch_texel_2d_z32f_x24s8,
666 fetch_texel_3d_z32f_x24s8
667 },
668
669 /* Array float formats */
670 {
671 MESA_FORMAT_A_FLOAT16,
672 fetch_texel_1d_f_alpha_f16,
673 fetch_texel_2d_f_alpha_f16,
674 fetch_texel_3d_f_alpha_f16
675 },
676 {
677 MESA_FORMAT_A_FLOAT32,
678 fetch_texel_1d_f_alpha_f32,
679 fetch_texel_2d_f_alpha_f32,
680 fetch_texel_3d_f_alpha_f32
681 },
682 {
683 MESA_FORMAT_L_FLOAT16,
684 fetch_texel_1d_f_luminance_f16,
685 fetch_texel_2d_f_luminance_f16,
686 fetch_texel_3d_f_luminance_f16
687 },
688 {
689 MESA_FORMAT_L_FLOAT32,
690 fetch_texel_1d_f_luminance_f32,
691 fetch_texel_2d_f_luminance_f32,
692 fetch_texel_3d_f_luminance_f32
693 },
694 {
695 MESA_FORMAT_LA_FLOAT16,
696 fetch_texel_1d_f_luminance_alpha_f16,
697 fetch_texel_2d_f_luminance_alpha_f16,
698 fetch_texel_3d_f_luminance_alpha_f16
699 },
700 {
701 MESA_FORMAT_LA_FLOAT32,
702 fetch_texel_1d_f_luminance_alpha_f32,
703 fetch_texel_2d_f_luminance_alpha_f32,
704 fetch_texel_3d_f_luminance_alpha_f32
705 },
706 {
707 MESA_FORMAT_I_FLOAT16,
708 fetch_texel_1d_f_intensity_f16,
709 fetch_texel_2d_f_intensity_f16,
710 fetch_texel_3d_f_intensity_f16
711 },
712 {
713 MESA_FORMAT_I_FLOAT32,
714 fetch_texel_1d_f_intensity_f32,
715 fetch_texel_2d_f_intensity_f32,
716 fetch_texel_3d_f_intensity_f32
717 },
718 {
719 MESA_FORMAT_R_FLOAT16,
720 fetch_texel_1d_f_r_f16,
721 fetch_texel_2d_f_r_f16,
722 fetch_texel_3d_f_r_f16
723 },
724 {
725 MESA_FORMAT_R_FLOAT32,
726 fetch_texel_1d_f_r_f32,
727 fetch_texel_2d_f_r_f32,
728 fetch_texel_3d_f_r_f32
729 },
730 {
731 MESA_FORMAT_RG_FLOAT16,
732 fetch_texel_1d_f_rg_f16,
733 fetch_texel_2d_f_rg_f16,
734 fetch_texel_3d_f_rg_f16
735 },
736 {
737 MESA_FORMAT_RG_FLOAT32,
738 fetch_texel_1d_f_rg_f32,
739 fetch_texel_2d_f_rg_f32,
740 fetch_texel_3d_f_rg_f32
741 },
742 {
743 MESA_FORMAT_RGB_FLOAT16,
744 fetch_texel_1d_f_rgb_f16,
745 fetch_texel_2d_f_rgb_f16,
746 fetch_texel_3d_f_rgb_f16
747 },
748 {
749 MESA_FORMAT_RGB_FLOAT32,
750 fetch_texel_1d_f_rgb_f32,
751 fetch_texel_2d_f_rgb_f32,
752 fetch_texel_3d_f_rgb_f32
753 },
754 {
755 MESA_FORMAT_RGBA_FLOAT16,
756 fetch_texel_1d_f_rgba_f16,
757 fetch_texel_2d_f_rgba_f16,
758 fetch_texel_3d_f_rgba_f16
759 },
760 {
761 MESA_FORMAT_RGBA_FLOAT32,
762 fetch_texel_1d_f_rgba_f32,
763 fetch_texel_2d_f_rgba_f32,
764 fetch_texel_3d_f_rgba_f32
765 },
766 {
767 MESA_FORMAT_RGBX_FLOAT16,
768 fetch_texel_1d_xbgr16161616_float,
769 fetch_texel_2d_xbgr16161616_float,
770 fetch_texel_3d_xbgr16161616_float
771 },
772 {
773 MESA_FORMAT_RGBX_FLOAT32,
774 fetch_texel_1d_xbgr32323232_float,
775 fetch_texel_2d_xbgr32323232_float,
776 fetch_texel_3d_xbgr32323232_float
777 },
778 {
779 MESA_FORMAT_Z_FLOAT32,
780 fetch_texel_1d_f_r_f32, /* Reuse the R32F functions. */
781 fetch_texel_2d_f_r_f32,
782 fetch_texel_3d_f_r_f32
783 },
784
785 /* Packed signed/unsigned non-normalized integer formats */
786 {
787 MESA_FORMAT_B10G10R10A2_UINT,
788 NULL,
789 NULL,
790 NULL
791 },
792 {
793 MESA_FORMAT_R10G10B10A2_UINT,
794 NULL,
795 NULL,
796 NULL
797 },
798
799 /* Array signed/unsigned non-normalized integer formats */
800 {
801 MESA_FORMAT_A_UINT8,
802 NULL,
803 NULL,
804 NULL
805 },
806 {
807 MESA_FORMAT_A_UINT16,
808 NULL,
809 NULL,
810 NULL
811 },
812 {
813 MESA_FORMAT_A_UINT32,
814 NULL,
815 NULL,
816 NULL
817 },
818 {
819 MESA_FORMAT_A_SINT8,
820 NULL,
821 NULL,
822 NULL
823 },
824 {
825 MESA_FORMAT_A_SINT16,
826 NULL,
827 NULL,
828 NULL
829 },
830 {
831 MESA_FORMAT_A_SINT32,
832 NULL,
833 NULL,
834 NULL
835 },
836 {
837 MESA_FORMAT_I_UINT8,
838 NULL,
839 NULL,
840 NULL
841 },
842 {
843 MESA_FORMAT_I_UINT16,
844 NULL,
845 NULL,
846 NULL
847 },
848 {
849 MESA_FORMAT_I_UINT32,
850 NULL,
851 NULL,
852 NULL
853 },
854 {
855 MESA_FORMAT_I_SINT8,
856 NULL,
857 NULL,
858 NULL
859 },
860 {
861 MESA_FORMAT_I_SINT16,
862 NULL,
863 NULL,
864 NULL
865 },
866 {
867 MESA_FORMAT_I_SINT32,
868 NULL,
869 NULL,
870 NULL
871 },
872 {
873 MESA_FORMAT_L_UINT8,
874 NULL,
875 NULL,
876 NULL
877 },
878 {
879 MESA_FORMAT_L_UINT16,
880 NULL,
881 NULL,
882 NULL
883 },
884 {
885 MESA_FORMAT_L_UINT32,
886 NULL,
887 NULL,
888 NULL
889 },
890 {
891 MESA_FORMAT_L_SINT8,
892 NULL,
893 NULL,
894 NULL
895 },
896 {
897 MESA_FORMAT_L_SINT16,
898 NULL,
899 NULL,
900 NULL
901 },
902 {
903 MESA_FORMAT_L_SINT32,
904 NULL,
905 NULL,
906 NULL
907 },
908 {
909 MESA_FORMAT_LA_UINT8,
910 NULL,
911 NULL,
912 NULL
913 },
914 {
915 MESA_FORMAT_LA_UINT16,
916 NULL,
917 NULL,
918 NULL
919 },
920 {
921 MESA_FORMAT_LA_UINT32,
922 NULL,
923 NULL,
924 NULL
925 },
926 {
927 MESA_FORMAT_LA_SINT8,
928 NULL,
929 NULL,
930 NULL
931 },
932 {
933 MESA_FORMAT_LA_SINT16,
934 NULL,
935 NULL,
936 NULL
937 },
938 {
939 MESA_FORMAT_LA_SINT32,
940 NULL,
941 NULL,
942 NULL
943 },
944 {
945 MESA_FORMAT_R_UINT8,
946 NULL,
947 NULL,
948 NULL
949 },
950 {
951 MESA_FORMAT_R_UINT16,
952 NULL,
953 NULL,
954 NULL
955 },
956 {
957 MESA_FORMAT_R_UINT32,
958 NULL,
959 NULL,
960 NULL
961 },
962 {
963 MESA_FORMAT_R_SINT8,
964 NULL,
965 NULL,
966 NULL
967 },
968 {
969 MESA_FORMAT_R_SINT16,
970 NULL,
971 NULL,
972 NULL
973 },
974 {
975 MESA_FORMAT_R_SINT32,
976 NULL,
977 NULL,
978 NULL
979 },
980 {
981 MESA_FORMAT_RG_UINT8,
982 NULL,
983 NULL,
984 NULL
985 },
986 {
987 MESA_FORMAT_RG_UINT16,
988 NULL,
989 NULL,
990 NULL
991 },
992 {
993 MESA_FORMAT_RG_UINT32,
994 NULL,
995 NULL,
996 NULL
997 },
998 {
999 MESA_FORMAT_RG_SINT8,
1000 NULL,
1001 NULL,
1002 NULL
1003 },
1004 {
1005 MESA_FORMAT_RG_SINT16,
1006 NULL,
1007 NULL,
1008 NULL
1009 },
1010 {
1011 MESA_FORMAT_RG_SINT32,
1012 NULL,
1013 NULL,
1014 NULL
1015 },
1016 {
1017 MESA_FORMAT_RGB_UINT8,
1018 NULL,
1019 NULL,
1020 NULL
1021 },
1022 {
1023 MESA_FORMAT_RGB_UINT16,
1024 NULL,
1025 NULL,
1026 NULL
1027 },
1028 {
1029 MESA_FORMAT_RGB_UINT32,
1030 NULL,
1031 NULL,
1032 NULL
1033 },
1034 {
1035 MESA_FORMAT_RGB_SINT8,
1036 NULL,
1037 NULL,
1038 NULL
1039 },
1040 {
1041 MESA_FORMAT_RGB_SINT16,
1042 NULL,
1043 NULL,
1044 NULL
1045 },
1046 {
1047 MESA_FORMAT_RGB_SINT32,
1048 NULL,
1049 NULL,
1050 NULL
1051 },
1052 {
1053 MESA_FORMAT_RGBA_UINT8,
1054 fetch_texel_1d_rgba_uint8,
1055 fetch_texel_2d_rgba_uint8,
1056 fetch_texel_3d_rgba_uint8
1057 },
1058 {
1059 MESA_FORMAT_RGBA_UINT16,
1060 fetch_texel_1d_rgba_uint16,
1061 fetch_texel_2d_rgba_uint16,
1062 fetch_texel_3d_rgba_uint16
1063 },
1064 {
1065 MESA_FORMAT_RGBA_UINT32,
1066 fetch_texel_1d_rgba_uint32,
1067 fetch_texel_2d_rgba_uint32,
1068 fetch_texel_3d_rgba_uint32
1069 },
1070 {
1071 MESA_FORMAT_RGBA_SINT8,
1072 fetch_texel_1d_rgba_int8,
1073 fetch_texel_2d_rgba_int8,
1074 fetch_texel_3d_rgba_int8
1075 },
1076 {
1077 MESA_FORMAT_RGBA_SINT16,
1078 fetch_texel_1d_rgba_int16,
1079 fetch_texel_2d_rgba_int16,
1080 fetch_texel_3d_rgba_int16
1081 },
1082 {
1083 MESA_FORMAT_RGBA_SINT32,
1084 fetch_texel_1d_rgba_int32,
1085 fetch_texel_2d_rgba_int32,
1086 fetch_texel_3d_rgba_int32
1087 },
1088 {
1089 MESA_FORMAT_RGBX_UINT8,
1090 NULL,
1091 NULL,
1092 NULL
1093 },
1094 {
1095 MESA_FORMAT_RGBX_UINT16,
1096 NULL,
1097 NULL,
1098 NULL
1099 },
1100 {
1101 MESA_FORMAT_RGBX_UINT32,
1102 NULL,
1103 NULL,
1104 NULL
1105 },
1106 {
1107 MESA_FORMAT_RGBX_SINT8,
1108 NULL,
1109 NULL,
1110 NULL
1111 },
1112 {
1113 MESA_FORMAT_RGBX_SINT16,
1114 NULL,
1115 NULL,
1116 NULL
1117 },
1118 {
1119 MESA_FORMAT_RGBX_SINT32,
1120 NULL,
1121 NULL,
1122 NULL
1123 },
1124
1125 /* DXT compressed formats */
1126 {
1127 MESA_FORMAT_RGB_DXT1,
1128 fetch_compressed,
1129 fetch_compressed,
1130 fetch_compressed
1131 },
1132 {
1133 MESA_FORMAT_RGBA_DXT1,
1134 fetch_compressed,
1135 fetch_compressed,
1136 fetch_compressed
1137 },
1138 {
1139 MESA_FORMAT_RGBA_DXT3,
1140 fetch_compressed,
1141 fetch_compressed,
1142 fetch_compressed
1143 },
1144 {
1145 MESA_FORMAT_RGBA_DXT5,
1146 fetch_compressed,
1147 fetch_compressed,
1148 fetch_compressed
1149 },
1150
1151 /* DXT sRGB compressed formats */
1152 {
1153 MESA_FORMAT_SRGB_DXT1,
1154 fetch_compressed,
1155 fetch_compressed,
1156 fetch_compressed
1157 },
1158 {
1159 MESA_FORMAT_SRGBA_DXT1,
1160 fetch_compressed,
1161 fetch_compressed,
1162 fetch_compressed
1163 },
1164 {
1165 MESA_FORMAT_SRGBA_DXT3,
1166 fetch_compressed,
1167 fetch_compressed,
1168 fetch_compressed
1169 },
1170 {
1171 MESA_FORMAT_SRGBA_DXT5,
1172 fetch_compressed,
1173 fetch_compressed,
1174 fetch_compressed
1175 },
1176
1177 /* FXT1 compressed formats */
1178 {
1179 MESA_FORMAT_RGB_FXT1,
1180 fetch_compressed,
1181 fetch_compressed,
1182 fetch_compressed
1183 },
1184 {
1185 MESA_FORMAT_RGBA_FXT1,
1186 fetch_compressed,
1187 fetch_compressed,
1188 fetch_compressed
1189 },
1190
1191 /* RGTC compressed formats */
1192 {
1193 MESA_FORMAT_R_RGTC1_UNORM,
1194 fetch_compressed,
1195 fetch_compressed,
1196 fetch_compressed
1197 },
1198 {
1199 MESA_FORMAT_R_RGTC1_SNORM,
1200 fetch_compressed,
1201 fetch_compressed,
1202 fetch_compressed
1203 },
1204 {
1205 MESA_FORMAT_RG_RGTC2_UNORM,
1206 fetch_compressed,
1207 fetch_compressed,
1208 fetch_compressed
1209 },
1210 {
1211 MESA_FORMAT_RG_RGTC2_SNORM,
1212 fetch_compressed,
1213 fetch_compressed,
1214 fetch_compressed
1215 },
1216
1217 /* LATC1/2 compressed formats */
1218 {
1219 MESA_FORMAT_L_LATC1_UNORM,
1220 fetch_compressed,
1221 fetch_compressed,
1222 fetch_compressed
1223 },
1224 {
1225 MESA_FORMAT_L_LATC1_SNORM,
1226 fetch_compressed,
1227 fetch_compressed,
1228 fetch_compressed
1229 },
1230 {
1231 MESA_FORMAT_LA_LATC2_UNORM,
1232 fetch_compressed,
1233 fetch_compressed,
1234 fetch_compressed
1235 },
1236 {
1237 MESA_FORMAT_LA_LATC2_SNORM,
1238 fetch_compressed,
1239 fetch_compressed,
1240 fetch_compressed
1241 },
1242
1243 /* ETC1/2 compressed formats */
1244 {
1245 MESA_FORMAT_ETC1_RGB8,
1246 fetch_compressed,
1247 fetch_compressed,
1248 fetch_compressed
1249 },
1250 {
1251 MESA_FORMAT_ETC2_RGB8,
1252 fetch_compressed,
1253 fetch_compressed,
1254 fetch_compressed
1255 },
1256 {
1257 MESA_FORMAT_ETC2_SRGB8,
1258 fetch_compressed,
1259 fetch_compressed,
1260 fetch_compressed
1261 },
1262 {
1263 MESA_FORMAT_ETC2_RGBA8_EAC,
1264 fetch_compressed,
1265 fetch_compressed,
1266 fetch_compressed
1267 },
1268 {
1269 MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC,
1270 fetch_compressed,
1271 fetch_compressed,
1272 fetch_compressed
1273 },
1274 {
1275 MESA_FORMAT_ETC2_R11_EAC,
1276 fetch_compressed,
1277 fetch_compressed,
1278 fetch_compressed
1279 },
1280 {
1281 MESA_FORMAT_ETC2_RG11_EAC,
1282 fetch_compressed,
1283 fetch_compressed,
1284 fetch_compressed
1285 },
1286 {
1287 MESA_FORMAT_ETC2_SIGNED_R11_EAC,
1288 fetch_compressed,
1289 fetch_compressed,
1290 fetch_compressed
1291 },
1292 {
1293 MESA_FORMAT_ETC2_SIGNED_RG11_EAC,
1294 fetch_compressed,
1295 fetch_compressed,
1296 fetch_compressed
1297 },
1298 {
1299 MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1,
1300 fetch_compressed,
1301 fetch_compressed,
1302 fetch_compressed
1303 },
1304 {
1305 MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1,
1306 fetch_compressed,
1307 fetch_compressed,
1308 fetch_compressed
1309 }
1310 };
1311
1312
1313 /**
1314 * Initialize the texture image's FetchTexel methods.
1315 */
1316 static void
1317 set_fetch_functions(const struct gl_sampler_object *samp,
1318 struct swrast_texture_image *texImage, GLuint dims)
1319 {
1320 mesa_format format = texImage->Base.TexFormat;
1321
1322 #ifdef DEBUG
1323 /* check that the table entries are sorted by format name */
1324 mesa_format fmt;
1325 for (fmt = 0; fmt < MESA_FORMAT_COUNT; fmt++) {
1326 assert(texfetch_funcs[fmt].Name == fmt);
1327 }
1328 #endif
1329
1330 STATIC_ASSERT(Elements(texfetch_funcs) == MESA_FORMAT_COUNT);
1331
1332 if (samp->sRGBDecode == GL_SKIP_DECODE_EXT &&
1333 _mesa_get_format_color_encoding(format) == GL_SRGB) {
1334 format = _mesa_get_srgb_format_linear(format);
1335 }
1336
1337 assert(format < MESA_FORMAT_COUNT);
1338
1339 switch (dims) {
1340 case 1:
1341 texImage->FetchTexel = texfetch_funcs[format].Fetch1D;
1342 break;
1343 case 2:
1344 texImage->FetchTexel = texfetch_funcs[format].Fetch2D;
1345 break;
1346 case 3:
1347 texImage->FetchTexel = texfetch_funcs[format].Fetch3D;
1348 break;
1349 default:
1350 assert(!"Bad dims in set_fetch_functions()");
1351 }
1352
1353 texImage->FetchCompressedTexel = _mesa_get_compressed_fetch_func(format);
1354
1355 ASSERT(texImage->FetchTexel);
1356 }
1357
1358 void
1359 _mesa_update_fetch_functions(struct gl_context *ctx, GLuint unit)
1360 {
1361 struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current;
1362 struct gl_sampler_object *samp;
1363 GLuint face, i;
1364 GLuint dims;
1365
1366 if (!texObj)
1367 return;
1368
1369 samp = _mesa_get_samplerobj(ctx, unit);
1370
1371 dims = _mesa_get_texture_dimensions(texObj->Target);
1372
1373 for (face = 0; face < 6; face++) {
1374 for (i = 0; i < MAX_TEXTURE_LEVELS; i++) {
1375 if (texObj->Image[face][i]) {
1376 set_fetch_functions(samp,
1377 swrast_texture_image(texObj->Image[face][i]),
1378 dims);
1379 }
1380 }
1381 }
1382 }