6a650d1d1430d4a8da4da4c39d785fa03480b9ae
[mesa.git] / src / mesa / main / 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 texfetch.c
29 *
30 * Texel fetch/store functions
31 *
32 * \author Gareth Hughes
33 */
34
35
36 #include "colormac.h"
37 #include "macros.h"
38 #include "texcompress.h"
39 #include "texcompress_fxt1.h"
40 #include "texcompress_s3tc.h"
41 #include "texfetch.h"
42
43
44 /**
45 * Convert an 8-bit sRGB value from non-linear space to a
46 * linear RGB value in [0, 1].
47 * Implemented with a 256-entry lookup table.
48 */
49 static INLINE GLfloat
50 nonlinear_to_linear(GLubyte cs8)
51 {
52 static GLfloat table[256];
53 static GLboolean tableReady = GL_FALSE;
54 if (!tableReady) {
55 /* compute lookup table now */
56 GLuint i;
57 for (i = 0; i < 256; i++) {
58 const GLfloat cs = UBYTE_TO_FLOAT(i);
59 if (cs <= 0.04045) {
60 table[i] = cs / 12.92f;
61 }
62 else {
63 table[i] = (GLfloat) pow((cs + 0.055) / 1.055, 2.4);
64 }
65 }
66 tableReady = GL_TRUE;
67 }
68 return table[cs8];
69 }
70
71
72
73 /* Texel fetch routines for all supported formats
74 */
75 #define DIM 1
76 #include "texfetch_tmp.h"
77
78 #define DIM 2
79 #include "texfetch_tmp.h"
80
81 #define DIM 3
82 #include "texfetch_tmp.h"
83
84 /**
85 * Null texel fetch function.
86 *
87 * Have to have this so the FetchTexel function pointer is never NULL.
88 */
89 static void fetch_null_texelf( const struct gl_texture_image *texImage,
90 GLint i, GLint j, GLint k, GLfloat *texel )
91 {
92 (void) texImage; (void) i; (void) j; (void) k;
93 texel[RCOMP] = 0.0;
94 texel[GCOMP] = 0.0;
95 texel[BCOMP] = 0.0;
96 texel[ACOMP] = 0.0;
97 _mesa_warning(NULL, "fetch_null_texelf() called!");
98 }
99
100 static void store_null_texel(struct gl_texture_image *texImage,
101 GLint i, GLint j, GLint k, const void *texel)
102 {
103 (void) texImage;
104 (void) i;
105 (void) j;
106 (void) k;
107 (void) texel;
108 /* no-op */
109 }
110
111
112
113 /**
114 * Table to map MESA_FORMAT_ to texel fetch/store funcs.
115 * XXX this is somewhat temporary.
116 */
117 static struct {
118 gl_format Name;
119 FetchTexelFuncF Fetch1D;
120 FetchTexelFuncF Fetch2D;
121 FetchTexelFuncF Fetch3D;
122 StoreTexelFunc StoreTexel;
123 }
124 texfetch_funcs[MESA_FORMAT_COUNT] =
125 {
126 {
127 MESA_FORMAT_NONE,
128 fetch_null_texelf,
129 fetch_null_texelf,
130 fetch_null_texelf,
131 store_null_texel
132 },
133
134 {
135 MESA_FORMAT_RGBA8888,
136 fetch_texel_1d_f_rgba8888,
137 fetch_texel_2d_f_rgba8888,
138 fetch_texel_3d_f_rgba8888,
139 store_texel_rgba8888
140 },
141 {
142 MESA_FORMAT_RGBA8888_REV,
143 fetch_texel_1d_f_rgba8888_rev,
144 fetch_texel_2d_f_rgba8888_rev,
145 fetch_texel_3d_f_rgba8888_rev,
146 store_texel_rgba8888_rev
147 },
148 {
149 MESA_FORMAT_ARGB8888,
150 fetch_texel_1d_f_argb8888,
151 fetch_texel_2d_f_argb8888,
152 fetch_texel_3d_f_argb8888,
153 store_texel_argb8888
154 },
155 {
156 MESA_FORMAT_ARGB8888_REV,
157 fetch_texel_1d_f_argb8888_rev,
158 fetch_texel_2d_f_argb8888_rev,
159 fetch_texel_3d_f_argb8888_rev,
160 store_texel_argb8888_rev
161 },
162 {
163 MESA_FORMAT_XRGB8888,
164 fetch_texel_1d_f_xrgb8888,
165 fetch_texel_2d_f_xrgb8888,
166 fetch_texel_3d_f_xrgb8888,
167 store_texel_xrgb8888
168 },
169 {
170 MESA_FORMAT_XRGB8888_REV,
171 fetch_texel_1d_f_xrgb8888_rev,
172 fetch_texel_2d_f_xrgb8888_rev,
173 fetch_texel_3d_f_xrgb8888_rev,
174 store_texel_xrgb8888_rev,
175 },
176 {
177 MESA_FORMAT_RGB888,
178 fetch_texel_1d_f_rgb888,
179 fetch_texel_2d_f_rgb888,
180 fetch_texel_3d_f_rgb888,
181 store_texel_rgb888
182 },
183 {
184 MESA_FORMAT_BGR888,
185 fetch_texel_1d_f_bgr888,
186 fetch_texel_2d_f_bgr888,
187 fetch_texel_3d_f_bgr888,
188 store_texel_bgr888
189 },
190 {
191 MESA_FORMAT_RGB565,
192 fetch_texel_1d_f_rgb565,
193 fetch_texel_2d_f_rgb565,
194 fetch_texel_3d_f_rgb565,
195 store_texel_rgb565
196 },
197 {
198 MESA_FORMAT_RGB565_REV,
199 fetch_texel_1d_f_rgb565_rev,
200 fetch_texel_2d_f_rgb565_rev,
201 fetch_texel_3d_f_rgb565_rev,
202 store_texel_rgb565_rev
203 },
204 {
205 MESA_FORMAT_ARGB4444,
206 fetch_texel_1d_f_argb4444,
207 fetch_texel_2d_f_argb4444,
208 fetch_texel_3d_f_argb4444,
209 store_texel_argb4444
210 },
211 {
212 MESA_FORMAT_ARGB4444_REV,
213 fetch_texel_1d_f_argb4444_rev,
214 fetch_texel_2d_f_argb4444_rev,
215 fetch_texel_3d_f_argb4444_rev,
216 store_texel_argb4444_rev
217 },
218 {
219 MESA_FORMAT_RGBA5551,
220 fetch_texel_1d_f_rgba5551,
221 fetch_texel_2d_f_rgba5551,
222 fetch_texel_3d_f_rgba5551,
223 store_texel_rgba5551
224 },
225 {
226 MESA_FORMAT_ARGB1555,
227 fetch_texel_1d_f_argb1555,
228 fetch_texel_2d_f_argb1555,
229 fetch_texel_3d_f_argb1555,
230 store_texel_argb1555
231 },
232 {
233 MESA_FORMAT_ARGB1555_REV,
234 fetch_texel_1d_f_argb1555_rev,
235 fetch_texel_2d_f_argb1555_rev,
236 fetch_texel_3d_f_argb1555_rev,
237 store_texel_argb1555_rev
238 },
239 {
240 MESA_FORMAT_AL44,
241 fetch_texel_1d_f_al44,
242 fetch_texel_2d_f_al44,
243 fetch_texel_3d_f_al44,
244 store_texel_al44
245 },
246 {
247 MESA_FORMAT_AL88,
248 fetch_texel_1d_f_al88,
249 fetch_texel_2d_f_al88,
250 fetch_texel_3d_f_al88,
251 store_texel_al88
252 },
253 {
254 MESA_FORMAT_AL88_REV,
255 fetch_texel_1d_f_al88_rev,
256 fetch_texel_2d_f_al88_rev,
257 fetch_texel_3d_f_al88_rev,
258 store_texel_al88_rev
259 },
260 {
261 MESA_FORMAT_AL1616,
262 fetch_texel_1d_f_al1616,
263 fetch_texel_2d_f_al1616,
264 fetch_texel_3d_f_al1616,
265 store_texel_al1616
266 },
267 {
268 MESA_FORMAT_AL1616_REV,
269 fetch_texel_1d_f_al1616_rev,
270 fetch_texel_2d_f_al1616_rev,
271 fetch_texel_3d_f_al1616_rev,
272 store_texel_al1616_rev
273 },
274 {
275 MESA_FORMAT_RGB332,
276 fetch_texel_1d_f_rgb332,
277 fetch_texel_2d_f_rgb332,
278 fetch_texel_3d_f_rgb332,
279 store_texel_rgb332
280 },
281 {
282 MESA_FORMAT_A8,
283 fetch_texel_1d_f_a8,
284 fetch_texel_2d_f_a8,
285 fetch_texel_3d_f_a8,
286 store_texel_a8
287 },
288 {
289 MESA_FORMAT_A16,
290 fetch_texel_1d_f_a16,
291 fetch_texel_2d_f_a16,
292 fetch_texel_3d_f_a16,
293 store_texel_a16
294 },
295 {
296 MESA_FORMAT_L8,
297 fetch_texel_1d_f_l8,
298 fetch_texel_2d_f_l8,
299 fetch_texel_3d_f_l8,
300 store_texel_l8
301 },
302 {
303 MESA_FORMAT_I8,
304 fetch_texel_1d_f_i8,
305 fetch_texel_2d_f_i8,
306 fetch_texel_3d_f_i8,
307 store_texel_i8
308 },
309 {
310 MESA_FORMAT_CI8,
311 fetch_texel_1d_f_ci8,
312 fetch_texel_2d_f_ci8,
313 fetch_texel_3d_f_ci8,
314 store_texel_ci8
315 },
316 {
317 MESA_FORMAT_YCBCR,
318 fetch_texel_1d_f_ycbcr,
319 fetch_texel_2d_f_ycbcr,
320 fetch_texel_3d_f_ycbcr,
321 store_texel_ycbcr
322 },
323 {
324 MESA_FORMAT_YCBCR_REV,
325 fetch_texel_1d_f_ycbcr_rev,
326 fetch_texel_2d_f_ycbcr_rev,
327 fetch_texel_3d_f_ycbcr_rev,
328 store_texel_ycbcr_rev
329 },
330 {
331 MESA_FORMAT_R8,
332 fetch_texel_1d_f_r8,
333 fetch_texel_2d_f_r8,
334 fetch_texel_3d_f_r8,
335 store_texel_r8,
336 },
337 {
338 MESA_FORMAT_RG88,
339 fetch_texel_1d_f_rg88,
340 fetch_texel_2d_f_rg88,
341 fetch_texel_3d_f_rg88,
342 store_texel_rg88,
343 },
344 {
345 MESA_FORMAT_RG88_REV,
346 fetch_texel_1d_f_rg88_rev,
347 fetch_texel_2d_f_rg88_rev,
348 fetch_texel_3d_f_rg88_rev,
349 store_texel_rg88_rev,
350 },
351 {
352 MESA_FORMAT_R16,
353 fetch_texel_1d_f_r16,
354 fetch_texel_2d_f_r16,
355 fetch_texel_3d_f_r16,
356 store_texel_r16,
357 },
358 {
359 MESA_FORMAT_RG1616,
360 fetch_texel_1d_f_rg1616,
361 fetch_texel_2d_f_rg1616,
362 fetch_texel_3d_f_rg1616,
363 store_texel_rg1616,
364 },
365 {
366 MESA_FORMAT_RG1616_REV,
367 fetch_texel_1d_f_rg1616_rev,
368 fetch_texel_2d_f_rg1616_rev,
369 fetch_texel_3d_f_rg1616_rev,
370 store_texel_rg1616_rev,
371 },
372 {
373 MESA_FORMAT_ARGB2101010,
374 fetch_texel_1d_f_argb2101010,
375 fetch_texel_2d_f_argb2101010,
376 fetch_texel_3d_f_argb2101010,
377 store_texel_argb2101010
378 },
379 {
380 MESA_FORMAT_Z24_S8,
381 fetch_texel_1d_f_z24_s8,
382 fetch_texel_2d_f_z24_s8,
383 fetch_texel_3d_f_z24_s8,
384 store_texel_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 store_texel_s8_z24
392 },
393 {
394 MESA_FORMAT_Z16,
395 fetch_texel_1d_f_z16,
396 fetch_texel_2d_f_z16,
397 fetch_texel_3d_f_z16,
398 store_texel_z16
399 },
400 {
401 MESA_FORMAT_X8_Z24,
402 fetch_texel_1d_f_s8_z24,
403 fetch_texel_2d_f_s8_z24,
404 fetch_texel_3d_f_s8_z24,
405 store_texel_s8_z24
406 },
407 {
408 MESA_FORMAT_Z24_X8,
409 fetch_texel_1d_f_z24_s8,
410 fetch_texel_2d_f_z24_s8,
411 fetch_texel_3d_f_z24_s8,
412 store_texel_z24_s8
413 },
414 {
415 MESA_FORMAT_Z32,
416 fetch_texel_1d_f_z32,
417 fetch_texel_2d_f_z32,
418 fetch_texel_3d_f_z32,
419 store_texel_z32
420 },
421 {
422 MESA_FORMAT_S8,
423 NULL,
424 NULL,
425 NULL,
426 NULL
427 },
428 {
429 MESA_FORMAT_SRGB8,
430 fetch_texel_1d_srgb8,
431 fetch_texel_2d_srgb8,
432 fetch_texel_3d_srgb8,
433 store_texel_srgb8
434 },
435 {
436 MESA_FORMAT_SRGBA8,
437 fetch_texel_1d_srgba8,
438 fetch_texel_2d_srgba8,
439 fetch_texel_3d_srgba8,
440 store_texel_srgba8
441 },
442 {
443 MESA_FORMAT_SARGB8,
444 fetch_texel_1d_sargb8,
445 fetch_texel_2d_sargb8,
446 fetch_texel_3d_sargb8,
447 store_texel_sargb8
448 },
449 {
450 MESA_FORMAT_SL8,
451 fetch_texel_1d_sl8,
452 fetch_texel_2d_sl8,
453 fetch_texel_3d_sl8,
454 store_texel_sl8
455 },
456 {
457 MESA_FORMAT_SLA8,
458 fetch_texel_1d_sla8,
459 fetch_texel_2d_sla8,
460 fetch_texel_3d_sla8,
461 store_texel_sla8
462 },
463 {
464 MESA_FORMAT_SRGB_DXT1,
465 NULL,
466 _mesa_fetch_texel_2d_f_srgb_dxt1,
467 NULL,
468 NULL
469 },
470 {
471 MESA_FORMAT_SRGBA_DXT1,
472 NULL,
473 _mesa_fetch_texel_2d_f_srgba_dxt1,
474 NULL,
475 NULL
476 },
477 {
478 MESA_FORMAT_SRGBA_DXT3,
479 NULL,
480 _mesa_fetch_texel_2d_f_srgba_dxt3,
481 NULL,
482 NULL
483 },
484 {
485 MESA_FORMAT_SRGBA_DXT5,
486 NULL,
487 _mesa_fetch_texel_2d_f_srgba_dxt5,
488 NULL,
489 NULL
490 },
491
492 {
493 MESA_FORMAT_RGB_FXT1,
494 NULL,
495 _mesa_fetch_texel_2d_f_rgb_fxt1,
496 NULL,
497 NULL
498 },
499 {
500 MESA_FORMAT_RGBA_FXT1,
501 NULL,
502 _mesa_fetch_texel_2d_f_rgba_fxt1,
503 NULL,
504 NULL
505 },
506 {
507 MESA_FORMAT_RGB_DXT1,
508 NULL,
509 _mesa_fetch_texel_2d_f_rgb_dxt1,
510 NULL,
511 NULL
512 },
513 {
514 MESA_FORMAT_RGBA_DXT1,
515 NULL,
516 _mesa_fetch_texel_2d_f_rgba_dxt1,
517 NULL,
518 NULL
519 },
520 {
521 MESA_FORMAT_RGBA_DXT3,
522 NULL,
523 _mesa_fetch_texel_2d_f_rgba_dxt3,
524 NULL,
525 NULL
526 },
527 {
528 MESA_FORMAT_RGBA_DXT5,
529 NULL,
530 _mesa_fetch_texel_2d_f_rgba_dxt5,
531 NULL,
532 NULL
533 },
534 {
535 MESA_FORMAT_RGBA_FLOAT32,
536 fetch_texel_1d_f_rgba_f32,
537 fetch_texel_2d_f_rgba_f32,
538 fetch_texel_3d_f_rgba_f32,
539 store_texel_rgba_f32
540 },
541 {
542 MESA_FORMAT_RGBA_FLOAT16,
543 fetch_texel_1d_f_rgba_f16,
544 fetch_texel_2d_f_rgba_f16,
545 fetch_texel_3d_f_rgba_f16,
546 store_texel_rgba_f16
547 },
548 {
549 MESA_FORMAT_RGB_FLOAT32,
550 fetch_texel_1d_f_rgb_f32,
551 fetch_texel_2d_f_rgb_f32,
552 fetch_texel_3d_f_rgb_f32,
553 store_texel_rgb_f32
554 },
555 {
556 MESA_FORMAT_RGB_FLOAT16,
557 fetch_texel_1d_f_rgb_f16,
558 fetch_texel_2d_f_rgb_f16,
559 fetch_texel_3d_f_rgb_f16,
560 store_texel_rgb_f16
561 },
562 {
563 MESA_FORMAT_ALPHA_FLOAT32,
564 fetch_texel_1d_f_alpha_f32,
565 fetch_texel_2d_f_alpha_f32,
566 fetch_texel_3d_f_alpha_f32,
567 store_texel_alpha_f32
568 },
569 {
570 MESA_FORMAT_ALPHA_FLOAT16,
571 fetch_texel_1d_f_alpha_f16,
572 fetch_texel_2d_f_alpha_f16,
573 fetch_texel_3d_f_alpha_f16,
574 store_texel_alpha_f16
575 },
576 {
577 MESA_FORMAT_LUMINANCE_FLOAT32,
578 fetch_texel_1d_f_luminance_f32,
579 fetch_texel_2d_f_luminance_f32,
580 fetch_texel_3d_f_luminance_f32,
581 store_texel_luminance_f32
582 },
583 {
584 MESA_FORMAT_LUMINANCE_FLOAT16,
585 fetch_texel_1d_f_luminance_f16,
586 fetch_texel_2d_f_luminance_f16,
587 fetch_texel_3d_f_luminance_f16,
588 store_texel_luminance_f16
589 },
590 {
591 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32,
592 fetch_texel_1d_f_luminance_alpha_f32,
593 fetch_texel_2d_f_luminance_alpha_f32,
594 fetch_texel_3d_f_luminance_alpha_f32,
595 store_texel_luminance_alpha_f32
596 },
597 {
598 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,
599 fetch_texel_1d_f_luminance_alpha_f16,
600 fetch_texel_2d_f_luminance_alpha_f16,
601 fetch_texel_3d_f_luminance_alpha_f16,
602 store_texel_luminance_alpha_f16
603 },
604 {
605 MESA_FORMAT_INTENSITY_FLOAT32,
606 fetch_texel_1d_f_intensity_f32,
607 fetch_texel_2d_f_intensity_f32,
608 fetch_texel_3d_f_intensity_f32,
609 store_texel_intensity_f32
610 },
611 {
612 MESA_FORMAT_INTENSITY_FLOAT16,
613 fetch_texel_1d_f_intensity_f16,
614 fetch_texel_2d_f_intensity_f16,
615 fetch_texel_3d_f_intensity_f16,
616 store_texel_intensity_f16
617 },
618
619 /* non-normalized, signed int */
620 {
621 MESA_FORMAT_RGBA_INT8,
622 fetch_texel_1d_rgba_int8,
623 fetch_texel_2d_rgba_int8,
624 fetch_texel_3d_rgba_int8,
625 store_texel_rgba_int8
626 },
627 {
628 MESA_FORMAT_RGBA_INT16,
629 fetch_texel_1d_rgba_int16,
630 fetch_texel_2d_rgba_int16,
631 fetch_texel_3d_rgba_int16,
632 store_texel_rgba_int16
633 },
634 {
635 MESA_FORMAT_RGBA_INT32,
636 fetch_texel_1d_rgba_int32,
637 fetch_texel_2d_rgba_int32,
638 fetch_texel_3d_rgba_int32,
639 store_texel_rgba_int32
640 },
641
642 /* non-normalized, unsigned int */
643 {
644 MESA_FORMAT_RGBA_UINT8,
645 fetch_texel_1d_rgba_uint8,
646 fetch_texel_2d_rgba_uint8,
647 fetch_texel_3d_rgba_uint8,
648 store_texel_rgba_uint8
649 },
650 {
651 MESA_FORMAT_RGBA_UINT16,
652 fetch_texel_1d_rgba_uint16,
653 fetch_texel_2d_rgba_uint16,
654 fetch_texel_3d_rgba_uint16,
655 store_texel_rgba_uint16
656 },
657 {
658 MESA_FORMAT_RGBA_UINT32,
659 fetch_texel_1d_rgba_uint32,
660 fetch_texel_2d_rgba_uint32,
661 fetch_texel_3d_rgba_uint32,
662 store_texel_rgba_uint32
663 },
664
665 /* dudv */
666 {
667 MESA_FORMAT_DUDV8,
668 fetch_texel_1d_dudv8,
669 fetch_texel_2d_dudv8,
670 fetch_texel_3d_dudv8,
671 NULL
672 },
673
674 /* signed, normalized */
675 {
676 MESA_FORMAT_SIGNED_R8,
677 fetch_texel_1d_signed_r8,
678 fetch_texel_2d_signed_r8,
679 fetch_texel_3d_signed_r8,
680 store_texel_signed_r8
681 },
682 {
683 MESA_FORMAT_SIGNED_RG88,
684 fetch_texel_1d_signed_rg88,
685 fetch_texel_2d_signed_rg88,
686 fetch_texel_3d_signed_rg88,
687 store_texel_signed_rg88
688 },
689 {
690 MESA_FORMAT_SIGNED_RGBX8888,
691 fetch_texel_1d_signed_rgbx8888,
692 fetch_texel_2d_signed_rgbx8888,
693 fetch_texel_3d_signed_rgbx8888,
694 store_texel_signed_rgbx8888
695 },
696 {
697 MESA_FORMAT_SIGNED_RGBA8888,
698 fetch_texel_1d_signed_rgba8888,
699 fetch_texel_2d_signed_rgba8888,
700 fetch_texel_3d_signed_rgba8888,
701 store_texel_signed_rgba8888
702 },
703 {
704 MESA_FORMAT_SIGNED_RGBA8888_REV,
705 fetch_texel_1d_signed_rgba8888_rev,
706 fetch_texel_2d_signed_rgba8888_rev,
707 fetch_texel_3d_signed_rgba8888_rev,
708 store_texel_signed_rgba8888_rev
709 },
710 {
711 MESA_FORMAT_SIGNED_R_16,
712 fetch_texel_1d_signed_r_16,
713 fetch_texel_2d_signed_r_16,
714 fetch_texel_3d_signed_r_16,
715 store_texel_signed_r_16
716 },
717 {
718 MESA_FORMAT_SIGNED_RG_16,
719 fetch_texel_1d_signed_rg_16,
720 fetch_texel_2d_signed_rg_16,
721 fetch_texel_3d_signed_rg_16,
722 store_texel_signed_rg_16
723 },
724 {
725 MESA_FORMAT_SIGNED_RGB_16,
726 fetch_texel_1d_signed_rgb_16,
727 fetch_texel_2d_signed_rgb_16,
728 fetch_texel_3d_signed_rgb_16,
729 store_texel_signed_rgb_16
730 },
731 {
732 MESA_FORMAT_SIGNED_RGBA_16,
733 fetch_texel_1d_signed_rgba_16,
734 fetch_texel_2d_signed_rgba_16,
735 fetch_texel_3d_signed_rgba_16,
736 store_texel_signed_rgba_16
737 },
738 {
739 MESA_FORMAT_RGBA_16,
740 fetch_texel_1d_rgba_16,
741 fetch_texel_2d_rgba_16,
742 fetch_texel_3d_rgba_16,
743 store_texel_rgba_16
744 }
745 };
746
747
748 static FetchTexelFuncF
749 _mesa_get_texel_fetch_func(gl_format format, GLuint dims)
750 {
751 #ifdef DEBUG
752 /* check that the table entries are sorted by format name */
753 gl_format fmt;
754 for (fmt = 0; fmt < MESA_FORMAT_COUNT; fmt++) {
755 assert(texfetch_funcs[fmt].Name == fmt);
756 }
757 #endif
758
759 assert(Elements(texfetch_funcs) == MESA_FORMAT_COUNT);
760 assert(format < MESA_FORMAT_COUNT);
761
762 switch (dims) {
763 case 1:
764 return texfetch_funcs[format].Fetch1D;
765 case 2:
766 return texfetch_funcs[format].Fetch2D;
767 case 3:
768 return texfetch_funcs[format].Fetch3D;
769 default:
770 assert(0 && "bad dims in _mesa_get_texel_fetch_func");
771 return NULL;
772 }
773 }
774
775
776 StoreTexelFunc
777 _mesa_get_texel_store_func(gl_format format)
778 {
779 assert(format < MESA_FORMAT_COUNT);
780 return texfetch_funcs[format].StoreTexel;
781 }
782
783
784 /**
785 * Adaptor for fetching a GLchan texel from a float-valued texture.
786 */
787 static void
788 fetch_texel_float_to_chan(const struct gl_texture_image *texImage,
789 GLint i, GLint j, GLint k, GLchan *texelOut)
790 {
791 GLfloat temp[4];
792 GLenum baseFormat = _mesa_get_format_base_format(texImage->TexFormat);
793
794 ASSERT(texImage->FetchTexelf);
795 texImage->FetchTexelf(texImage, i, j, k, temp);
796 if (baseFormat == GL_DEPTH_COMPONENT ||
797 baseFormat == GL_DEPTH_STENCIL_EXT) {
798 /* just one channel */
799 UNCLAMPED_FLOAT_TO_CHAN(texelOut[0], temp[0]);
800 }
801 else {
802 /* four channels */
803 UNCLAMPED_FLOAT_TO_CHAN(texelOut[0], temp[0]);
804 UNCLAMPED_FLOAT_TO_CHAN(texelOut[1], temp[1]);
805 UNCLAMPED_FLOAT_TO_CHAN(texelOut[2], temp[2]);
806 UNCLAMPED_FLOAT_TO_CHAN(texelOut[3], temp[3]);
807 }
808 }
809
810
811 #if 0
812 /**
813 * Adaptor for fetching a float texel from a GLchan-valued texture.
814 */
815 static void
816 fetch_texel_chan_to_float(const struct gl_texture_image *texImage,
817 GLint i, GLint j, GLint k, GLfloat *texelOut)
818 {
819 GLchan temp[4];
820 GLenum baseFormat = _mesa_get_format_base_format(texImage->TexFormat);
821
822 ASSERT(texImage->FetchTexelc);
823 texImage->FetchTexelc(texImage, i, j, k, temp);
824 if (baseFormat == GL_DEPTH_COMPONENT ||
825 baseFormat == GL_DEPTH_STENCIL_EXT) {
826 /* just one channel */
827 texelOut[0] = CHAN_TO_FLOAT(temp[0]);
828 }
829 else {
830 /* four channels */
831 texelOut[0] = CHAN_TO_FLOAT(temp[0]);
832 texelOut[1] = CHAN_TO_FLOAT(temp[1]);
833 texelOut[2] = CHAN_TO_FLOAT(temp[2]);
834 texelOut[3] = CHAN_TO_FLOAT(temp[3]);
835 }
836 }
837 #endif
838
839
840 /**
841 * Initialize the texture image's FetchTexelc and FetchTexelf methods.
842 */
843 void
844 _mesa_set_fetch_functions(struct gl_texture_image *texImage, GLuint dims)
845 {
846 ASSERT(dims == 1 || dims == 2 || dims == 3);
847
848 texImage->FetchTexelf =
849 _mesa_get_texel_fetch_func(texImage->TexFormat, dims);
850
851 texImage->FetchTexelc = fetch_texel_float_to_chan;
852
853 ASSERT(texImage->FetchTexelc);
854 ASSERT(texImage->FetchTexelf);
855 }