mesa: remove gl_texture_format
[mesa.git] / src / mesa / main / texformat.c
1 /*
2 * Mesa 3-D graphics library
3 * Version: 6.5.1
4 *
5 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
6 * Copyright (c) 2008 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 texformat.c
29 * Texture formats.
30 *
31 * \author Gareth Hughes
32 */
33
34
35 #include "colormac.h"
36 #include "context.h"
37 #include "texcompress.h"
38 #include "texcompress_fxt1.h"
39 #include "texcompress_s3tc.h"
40 #include "texformat.h"
41 #include "texstore.h"
42
43
44 #if FEATURE_EXT_texture_sRGB
45
46 /**
47 * Convert an 8-bit sRGB value from non-linear space to a
48 * linear RGB value in [0, 1].
49 * Implemented with a 256-entry lookup table.
50 */
51 static INLINE GLfloat
52 nonlinear_to_linear(GLubyte cs8)
53 {
54 static GLfloat table[256];
55 static GLboolean tableReady = GL_FALSE;
56 if (!tableReady) {
57 /* compute lookup table now */
58 GLuint i;
59 for (i = 0; i < 256; i++) {
60 const GLfloat cs = UBYTE_TO_FLOAT(i);
61 if (cs <= 0.04045) {
62 table[i] = cs / 12.92f;
63 }
64 else {
65 table[i] = (GLfloat) _mesa_pow((cs + 0.055) / 1.055, 2.4);
66 }
67 }
68 tableReady = GL_TRUE;
69 }
70 return table[cs8];
71 }
72
73
74 #endif /* FEATURE_EXT_texture_sRGB */
75
76
77 /* Texel fetch routines for all supported formats
78 */
79 #define DIM 1
80 #include "texformat_tmp.h"
81
82 #define DIM 2
83 #include "texformat_tmp.h"
84
85 #define DIM 3
86 #include "texformat_tmp.h"
87
88 /**
89 * Null texel fetch function.
90 *
91 * Have to have this so the FetchTexel function pointer is never NULL.
92 */
93 static void fetch_null_texelf( const struct gl_texture_image *texImage,
94 GLint i, GLint j, GLint k, GLfloat *texel )
95 {
96 (void) texImage; (void) i; (void) j; (void) k;
97 texel[RCOMP] = 0.0;
98 texel[GCOMP] = 0.0;
99 texel[BCOMP] = 0.0;
100 texel[ACOMP] = 0.0;
101 _mesa_warning(NULL, "fetch_null_texelf() called!");
102 }
103
104 static void store_null_texel(struct gl_texture_image *texImage,
105 GLint i, GLint j, GLint k, const void *texel)
106 {
107 (void) texImage;
108 (void) i;
109 (void) j;
110 (void) k;
111 (void) texel;
112 /* no-op */
113 }
114
115
116 /**
117 * Choose an appropriate texture format given the format, type and
118 * internalFormat parameters passed to glTexImage().
119 *
120 * \param ctx the GL context.
121 * \param internalFormat user's prefered internal texture format.
122 * \param format incoming image pixel format.
123 * \param type incoming image data type.
124 *
125 * \return a pointer to a gl_texture_format object which describes the
126 * choosen texture format, or NULL on failure.
127 *
128 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers
129 * will typically override this function with a specialized version.
130 */
131 gl_format
132 _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
133 GLenum format, GLenum type )
134 {
135 (void) format;
136 (void) type;
137
138 switch (internalFormat) {
139 /* RGBA formats */
140 case 4:
141 case GL_RGBA:
142 case GL_RGB10_A2:
143 case GL_RGBA12:
144 case GL_RGBA16:
145 return MESA_FORMAT_RGBA;
146 case GL_RGBA8:
147 return MESA_FORMAT_RGBA8888;
148 case GL_RGB5_A1:
149 return MESA_FORMAT_ARGB1555;
150 case GL_RGBA2:
151 return MESA_FORMAT_ARGB4444_REV; /* just to test another format*/
152 case GL_RGBA4:
153 return MESA_FORMAT_ARGB4444;
154
155 /* RGB formats */
156 case 3:
157 case GL_RGB:
158 case GL_RGB10:
159 case GL_RGB12:
160 case GL_RGB16:
161 return MESA_FORMAT_RGB;
162 case GL_RGB8:
163 return MESA_FORMAT_RGB888;
164 case GL_R3_G3_B2:
165 return MESA_FORMAT_RGB332;
166 case GL_RGB4:
167 return MESA_FORMAT_RGB565_REV; /* just to test another format */
168 case GL_RGB5:
169 return MESA_FORMAT_RGB565;
170
171 /* Alpha formats */
172 case GL_ALPHA:
173 case GL_ALPHA4:
174 case GL_ALPHA12:
175 case GL_ALPHA16:
176 return MESA_FORMAT_ALPHA;
177 case GL_ALPHA8:
178 return MESA_FORMAT_A8;
179
180 /* Luminance formats */
181 case 1:
182 case GL_LUMINANCE:
183 case GL_LUMINANCE4:
184 case GL_LUMINANCE12:
185 case GL_LUMINANCE16:
186 return MESA_FORMAT_LUMINANCE;
187 case GL_LUMINANCE8:
188 return MESA_FORMAT_L8;
189
190 /* Luminance/Alpha formats */
191 case 2:
192 case GL_LUMINANCE_ALPHA:
193 case GL_LUMINANCE4_ALPHA4:
194 case GL_LUMINANCE6_ALPHA2:
195 case GL_LUMINANCE12_ALPHA4:
196 case GL_LUMINANCE12_ALPHA12:
197 case GL_LUMINANCE16_ALPHA16:
198 return MESA_FORMAT_LUMINANCE_ALPHA;
199 case GL_LUMINANCE8_ALPHA8:
200 return MESA_FORMAT_AL88;
201
202 case GL_INTENSITY:
203 case GL_INTENSITY4:
204 case GL_INTENSITY12:
205 case GL_INTENSITY16:
206 return MESA_FORMAT_INTENSITY;
207 case GL_INTENSITY8:
208 return MESA_FORMAT_I8;
209
210 case GL_COLOR_INDEX:
211 case GL_COLOR_INDEX1_EXT:
212 case GL_COLOR_INDEX2_EXT:
213 case GL_COLOR_INDEX4_EXT:
214 case GL_COLOR_INDEX12_EXT:
215 case GL_COLOR_INDEX16_EXT:
216 case GL_COLOR_INDEX8_EXT:
217 return MESA_FORMAT_CI8;
218
219 default:
220 ; /* fallthrough */
221 }
222
223 if (ctx->Extensions.ARB_depth_texture) {
224 switch (internalFormat) {
225 case GL_DEPTH_COMPONENT:
226 case GL_DEPTH_COMPONENT24:
227 case GL_DEPTH_COMPONENT32:
228 return MESA_FORMAT_Z32;
229 case GL_DEPTH_COMPONENT16:
230 return MESA_FORMAT_Z16;
231 default:
232 ; /* fallthrough */
233 }
234 }
235
236 switch (internalFormat) {
237 case GL_COMPRESSED_ALPHA_ARB:
238 return MESA_FORMAT_ALPHA;
239 case GL_COMPRESSED_LUMINANCE_ARB:
240 return MESA_FORMAT_LUMINANCE;
241 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
242 return MESA_FORMAT_LUMINANCE_ALPHA;
243 case GL_COMPRESSED_INTENSITY_ARB:
244 return MESA_FORMAT_INTENSITY;
245 case GL_COMPRESSED_RGB_ARB:
246 #if FEATURE_texture_fxt1
247 if (ctx->Extensions.TDFX_texture_compression_FXT1)
248 return MESA_FORMAT_RGB_FXT1;
249 #endif
250 #if FEATURE_texture_s3tc
251 if (ctx->Extensions.EXT_texture_compression_s3tc ||
252 ctx->Extensions.S3_s3tc)
253 return MESA_FORMAT_RGB_DXT1;
254 #endif
255 return MESA_FORMAT_RGB;
256 case GL_COMPRESSED_RGBA_ARB:
257 #if FEATURE_texture_fxt1
258 if (ctx->Extensions.TDFX_texture_compression_FXT1)
259 return MESA_FORMAT_RGBA_FXT1;
260 #endif
261 #if FEATURE_texture_s3tc
262 if (ctx->Extensions.EXT_texture_compression_s3tc ||
263 ctx->Extensions.S3_s3tc)
264 return MESA_FORMAT_RGBA_DXT3; /* Not rgba_dxt1, see spec */
265 #endif
266 return MESA_FORMAT_RGBA;
267 default:
268 ; /* fallthrough */
269 }
270
271 if (ctx->Extensions.MESA_ycbcr_texture) {
272 if (internalFormat == GL_YCBCR_MESA) {
273 if (type == GL_UNSIGNED_SHORT_8_8_MESA)
274 return MESA_FORMAT_YCBCR;
275 else
276 return MESA_FORMAT_YCBCR_REV;
277 }
278 }
279
280 #if FEATURE_texture_fxt1
281 if (ctx->Extensions.TDFX_texture_compression_FXT1) {
282 switch (internalFormat) {
283 case GL_COMPRESSED_RGB_FXT1_3DFX:
284 return MESA_FORMAT_RGB_FXT1;
285 case GL_COMPRESSED_RGBA_FXT1_3DFX:
286 return MESA_FORMAT_RGBA_FXT1;
287 default:
288 ; /* fallthrough */
289 }
290 }
291 #endif
292
293 #if FEATURE_texture_s3tc
294 if (ctx->Extensions.EXT_texture_compression_s3tc) {
295 switch (internalFormat) {
296 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
297 return MESA_FORMAT_RGB_DXT1;
298 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
299 return MESA_FORMAT_RGBA_DXT1;
300 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
301 return MESA_FORMAT_RGBA_DXT3;
302 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
303 return MESA_FORMAT_RGBA_DXT5;
304 default:
305 ; /* fallthrough */
306 }
307 }
308
309 if (ctx->Extensions.S3_s3tc) {
310 switch (internalFormat) {
311 case GL_RGB_S3TC:
312 case GL_RGB4_S3TC:
313 return MESA_FORMAT_RGB_DXT1;
314 case GL_RGBA_S3TC:
315 case GL_RGBA4_S3TC:
316 return MESA_FORMAT_RGBA_DXT3;
317 default:
318 ; /* fallthrough */
319 }
320 }
321 #endif
322
323 if (ctx->Extensions.ARB_texture_float) {
324 switch (internalFormat) {
325 case GL_ALPHA16F_ARB:
326 return MESA_FORMAT_ALPHA_FLOAT16;
327 case GL_ALPHA32F_ARB:
328 return MESA_FORMAT_ALPHA_FLOAT32;
329 case GL_LUMINANCE16F_ARB:
330 return MESA_FORMAT_LUMINANCE_FLOAT16;
331 case GL_LUMINANCE32F_ARB:
332 return MESA_FORMAT_LUMINANCE_FLOAT32;
333 case GL_LUMINANCE_ALPHA16F_ARB:
334 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
335 case GL_LUMINANCE_ALPHA32F_ARB:
336 return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
337 case GL_INTENSITY16F_ARB:
338 return MESA_FORMAT_INTENSITY_FLOAT16;
339 case GL_INTENSITY32F_ARB:
340 return MESA_FORMAT_INTENSITY_FLOAT32;
341 case GL_RGB16F_ARB:
342 return MESA_FORMAT_RGB_FLOAT16;
343 case GL_RGB32F_ARB:
344 return MESA_FORMAT_RGB_FLOAT32;
345 case GL_RGBA16F_ARB:
346 return MESA_FORMAT_RGBA_FLOAT16;
347 case GL_RGBA32F_ARB:
348 return MESA_FORMAT_RGBA_FLOAT32;
349 default:
350 ; /* fallthrough */
351 }
352 }
353
354 if (ctx->Extensions.EXT_packed_depth_stencil) {
355 switch (internalFormat) {
356 case GL_DEPTH_STENCIL_EXT:
357 case GL_DEPTH24_STENCIL8_EXT:
358 return MESA_FORMAT_Z24_S8;
359 default:
360 ; /* fallthrough */
361 }
362 }
363
364 if (ctx->Extensions.ATI_envmap_bumpmap) {
365 switch (internalFormat) {
366 case GL_DUDV_ATI:
367 case GL_DU8DV8_ATI:
368 return MESA_FORMAT_DUDV8;
369 default:
370 ; /* fallthrough */
371 }
372 }
373
374 if (ctx->Extensions.MESA_texture_signed_rgba) {
375 switch (internalFormat) {
376 case GL_RGBA_SNORM:
377 case GL_RGBA8_SNORM:
378 return MESA_FORMAT_SIGNED_RGBA8888;
379 default:
380 ; /* fallthrough */
381 }
382 }
383
384
385 #if FEATURE_EXT_texture_sRGB
386 if (ctx->Extensions.EXT_texture_sRGB) {
387 switch (internalFormat) {
388 case GL_SRGB_EXT:
389 case GL_SRGB8_EXT:
390 return MESA_FORMAT_SRGB8;
391 case GL_SRGB_ALPHA_EXT:
392 case GL_SRGB8_ALPHA8_EXT:
393 return MESA_FORMAT_SRGBA8;
394 case GL_SLUMINANCE_EXT:
395 case GL_SLUMINANCE8_EXT:
396 return MESA_FORMAT_SL8;
397 case GL_SLUMINANCE_ALPHA_EXT:
398 case GL_SLUMINANCE8_ALPHA8_EXT:
399 return MESA_FORMAT_SLA8;
400 case GL_COMPRESSED_SLUMINANCE_EXT:
401 return MESA_FORMAT_SL8;
402 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
403 return MESA_FORMAT_SLA8;
404 case GL_COMPRESSED_SRGB_EXT:
405 #if FEATURE_texture_s3tc
406 if (ctx->Extensions.EXT_texture_compression_s3tc)
407 return MESA_FORMAT_SRGB_DXT1;
408 #endif
409 return MESA_FORMAT_SRGB8;
410 case GL_COMPRESSED_SRGB_ALPHA_EXT:
411 #if FEATURE_texture_s3tc
412 if (ctx->Extensions.EXT_texture_compression_s3tc)
413 return MESA_FORMAT_SRGBA_DXT3; /* Not srgba_dxt1, see spec */
414 #endif
415 return MESA_FORMAT_SRGBA8;
416 #if FEATURE_texture_s3tc
417 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
418 if (ctx->Extensions.EXT_texture_compression_s3tc)
419 return MESA_FORMAT_SRGB_DXT1;
420 break;
421 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
422 if (ctx->Extensions.EXT_texture_compression_s3tc)
423 return MESA_FORMAT_SRGBA_DXT1;
424 break;
425 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
426 if (ctx->Extensions.EXT_texture_compression_s3tc)
427 return MESA_FORMAT_SRGBA_DXT3;
428 break;
429 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
430 if (ctx->Extensions.EXT_texture_compression_s3tc)
431 return MESA_FORMAT_SRGBA_DXT5;
432 break;
433 #endif
434 default:
435 ; /* fallthrough */
436 }
437 }
438 #endif /* FEATURE_EXT_texture_sRGB */
439
440 _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
441 return MESA_FORMAT_NONE;
442 }
443
444
445
446 /**
447 * Return datatype and number of components per texel for the given gl_format.
448 */
449 void
450 _mesa_format_to_type_and_comps(gl_format format,
451 GLenum *datatype, GLuint *comps)
452 {
453 switch (format) {
454 case MESA_FORMAT_RGBA8888:
455 case MESA_FORMAT_RGBA8888_REV:
456 case MESA_FORMAT_ARGB8888:
457 case MESA_FORMAT_ARGB8888_REV:
458 *datatype = CHAN_TYPE;
459 *comps = 4;
460 return;
461 case MESA_FORMAT_RGB888:
462 case MESA_FORMAT_BGR888:
463 *datatype = GL_UNSIGNED_BYTE;
464 *comps = 3;
465 return;
466 case MESA_FORMAT_RGB565:
467 case MESA_FORMAT_RGB565_REV:
468 *datatype = GL_UNSIGNED_SHORT_5_6_5;
469 *comps = 3;
470 return;
471
472 case MESA_FORMAT_ARGB4444:
473 case MESA_FORMAT_ARGB4444_REV:
474 *datatype = GL_UNSIGNED_SHORT_4_4_4_4;
475 *comps = 4;
476 return;
477
478 case MESA_FORMAT_ARGB1555:
479 case MESA_FORMAT_ARGB1555_REV:
480 *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
481 *comps = 4;
482 return;
483
484 case MESA_FORMAT_AL88:
485 case MESA_FORMAT_AL88_REV:
486 *datatype = GL_UNSIGNED_BYTE;
487 *comps = 2;
488 return;
489 case MESA_FORMAT_RGB332:
490 *datatype = GL_UNSIGNED_BYTE_3_3_2;
491 *comps = 3;
492 return;
493
494 case MESA_FORMAT_A8:
495 case MESA_FORMAT_L8:
496 case MESA_FORMAT_I8:
497 case MESA_FORMAT_CI8:
498 *datatype = GL_UNSIGNED_BYTE;
499 *comps = 1;
500 return;
501
502 case MESA_FORMAT_YCBCR:
503 case MESA_FORMAT_YCBCR_REV:
504 *datatype = GL_UNSIGNED_SHORT;
505 *comps = 2;
506 return;
507
508 case MESA_FORMAT_Z24_S8:
509 *datatype = GL_UNSIGNED_INT;
510 *comps = 1; /* XXX OK? */
511 return;
512
513 case MESA_FORMAT_S8_Z24:
514 *datatype = GL_UNSIGNED_INT;
515 *comps = 1; /* XXX OK? */
516 return;
517
518 case MESA_FORMAT_Z16:
519 *datatype = GL_UNSIGNED_SHORT;
520 *comps = 1;
521 return;
522
523 case MESA_FORMAT_Z32:
524 *datatype = GL_UNSIGNED_INT;
525 *comps = 1;
526 return;
527
528 case MESA_FORMAT_DUDV8:
529 *datatype = GL_BYTE;
530 *comps = 2;
531 return;
532
533 case MESA_FORMAT_SIGNED_RGBA8888:
534 case MESA_FORMAT_SIGNED_RGBA8888_REV:
535 *datatype = GL_BYTE;
536 *comps = 4;
537 return;
538
539 #if FEATURE_EXT_texture_sRGB
540 case MESA_FORMAT_SRGB8:
541 *datatype = GL_UNSIGNED_BYTE;
542 *comps = 3;
543 return;
544 case MESA_FORMAT_SRGBA8:
545 case MESA_FORMAT_SARGB8:
546 *datatype = GL_UNSIGNED_BYTE;
547 *comps = 4;
548 return;
549 case MESA_FORMAT_SL8:
550 *datatype = GL_UNSIGNED_BYTE;
551 *comps = 1;
552 return;
553 case MESA_FORMAT_SLA8:
554 *datatype = GL_UNSIGNED_BYTE;
555 *comps = 2;
556 return;
557 #endif
558
559 #if FEATURE_texture_fxt1
560 case MESA_FORMAT_RGB_FXT1:
561 case MESA_FORMAT_RGBA_FXT1:
562 #endif
563 #if FEATURE_texture_s3tc
564 case MESA_FORMAT_RGB_DXT1:
565 case MESA_FORMAT_RGBA_DXT1:
566 case MESA_FORMAT_RGBA_DXT3:
567 case MESA_FORMAT_RGBA_DXT5:
568 #if FEATURE_EXT_texture_sRGB
569 case MESA_FORMAT_SRGB_DXT1:
570 case MESA_FORMAT_SRGBA_DXT1:
571 case MESA_FORMAT_SRGBA_DXT3:
572 case MESA_FORMAT_SRGBA_DXT5:
573 #endif
574 /* XXX generate error instead? */
575 *datatype = GL_UNSIGNED_BYTE;
576 *comps = 0;
577 return;
578 #endif
579
580 case MESA_FORMAT_RGBA:
581 *datatype = CHAN_TYPE;
582 *comps = 4;
583 return;
584 case MESA_FORMAT_RGB:
585 *datatype = CHAN_TYPE;
586 *comps = 3;
587 return;
588 case MESA_FORMAT_LUMINANCE_ALPHA:
589 *datatype = CHAN_TYPE;
590 *comps = 2;
591 return;
592 case MESA_FORMAT_ALPHA:
593 case MESA_FORMAT_LUMINANCE:
594 case MESA_FORMAT_INTENSITY:
595 *datatype = CHAN_TYPE;
596 *comps = 1;
597 return;
598
599 case MESA_FORMAT_RGBA_FLOAT32:
600 *datatype = GL_FLOAT;
601 *comps = 4;
602 return;
603 case MESA_FORMAT_RGBA_FLOAT16:
604 *datatype = GL_HALF_FLOAT_ARB;
605 *comps = 4;
606 return;
607 case MESA_FORMAT_RGB_FLOAT32:
608 *datatype = GL_FLOAT;
609 *comps = 3;
610 return;
611 case MESA_FORMAT_RGB_FLOAT16:
612 *datatype = GL_HALF_FLOAT_ARB;
613 *comps = 3;
614 return;
615 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
616 *datatype = GL_FLOAT;
617 *comps = 2;
618 return;
619 case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
620 *datatype = GL_HALF_FLOAT_ARB;
621 *comps = 2;
622 return;
623 case MESA_FORMAT_ALPHA_FLOAT32:
624 case MESA_FORMAT_LUMINANCE_FLOAT32:
625 case MESA_FORMAT_INTENSITY_FLOAT32:
626 *datatype = GL_FLOAT;
627 *comps = 1;
628 return;
629 case MESA_FORMAT_ALPHA_FLOAT16:
630 case MESA_FORMAT_LUMINANCE_FLOAT16:
631 case MESA_FORMAT_INTENSITY_FLOAT16:
632 *datatype = GL_HALF_FLOAT_ARB;
633 *comps = 1;
634 return;
635
636 default:
637 _mesa_problem(NULL, "bad format in _mesa_format_to_type_and_comps");
638 *datatype = 0;
639 *comps = 1;
640 }
641 }
642
643
644
645 /**
646 * Table to map MESA_FORMAT_ to texel fetch/store funcs.
647 * XXX this is somewhat temporary.
648 */
649 static struct {
650 GLuint Name;
651 FetchTexelFuncF Fetch1D;
652 FetchTexelFuncF Fetch2D;
653 FetchTexelFuncF Fetch3D;
654 StoreTexelFunc StoreTexel;
655 }
656 texfetch_funcs[MESA_FORMAT_COUNT] =
657 {
658 {
659 MESA_FORMAT_RGBA,
660 fetch_texel_1d_f_rgba,
661 fetch_texel_2d_f_rgba,
662 fetch_texel_3d_f_rgba,
663 store_texel_rgba
664 },
665 {
666 MESA_FORMAT_RGB,
667 fetch_texel_1d_f_rgb,
668 fetch_texel_2d_f_rgb,
669 fetch_texel_3d_f_rgb,
670 store_texel_rgb
671 },
672 {
673 MESA_FORMAT_ALPHA,
674 fetch_texel_1d_f_alpha,
675 fetch_texel_2d_f_alpha,
676 fetch_texel_3d_f_alpha,
677 store_texel_alpha
678 },
679 {
680 MESA_FORMAT_LUMINANCE,
681 fetch_texel_1d_f_luminance,
682 fetch_texel_2d_f_luminance,
683 fetch_texel_3d_f_luminance,
684 store_texel_luminance
685 },
686 {
687 MESA_FORMAT_LUMINANCE_ALPHA,
688 fetch_texel_1d_f_luminance_alpha,
689 fetch_texel_2d_f_luminance_alpha,
690 fetch_texel_3d_f_luminance_alpha,
691 store_texel_luminance_alpha
692 },
693 {
694 MESA_FORMAT_INTENSITY,
695 fetch_texel_1d_f_intensity,
696 fetch_texel_2d_f_intensity,
697 fetch_texel_3d_f_intensity,
698 store_texel_intensity
699 },
700 {
701 MESA_FORMAT_SRGB8,
702 fetch_texel_1d_srgb8,
703 fetch_texel_2d_srgb8,
704 fetch_texel_3d_srgb8,
705 store_texel_srgb8
706 },
707 {
708 MESA_FORMAT_SRGBA8,
709 fetch_texel_1d_srgba8,
710 fetch_texel_2d_srgba8,
711 fetch_texel_3d_srgba8,
712 store_texel_srgba8
713 },
714 {
715 MESA_FORMAT_SARGB8,
716 fetch_texel_1d_sargb8,
717 fetch_texel_2d_sargb8,
718 fetch_texel_3d_sargb8,
719 store_texel_sargb8
720 },
721 {
722 MESA_FORMAT_SL8,
723 fetch_texel_1d_sl8,
724 fetch_texel_2d_sl8,
725 fetch_texel_3d_sl8,
726 store_texel_sl8
727 },
728 {
729 MESA_FORMAT_SLA8,
730 fetch_texel_1d_sla8,
731 fetch_texel_2d_sla8,
732 fetch_texel_3d_sla8,
733 store_texel_sla8
734 },
735 {
736 MESA_FORMAT_RGB_FXT1,
737 NULL,
738 _mesa_fetch_texel_2d_f_rgb_fxt1,
739 NULL,
740 NULL
741 },
742 {
743 MESA_FORMAT_RGBA_FXT1,
744 NULL,
745 _mesa_fetch_texel_2d_f_rgba_fxt1,
746 NULL,
747 NULL
748 },
749 {
750 MESA_FORMAT_RGB_DXT1,
751 NULL,
752 _mesa_fetch_texel_2d_f_rgb_dxt1,
753 NULL,
754 NULL
755 },
756 {
757 MESA_FORMAT_RGBA_DXT1,
758 NULL,
759 _mesa_fetch_texel_2d_f_rgba_dxt1,
760 NULL,
761 NULL
762 },
763 {
764 MESA_FORMAT_RGBA_DXT3,
765 NULL,
766 _mesa_fetch_texel_2d_f_rgba_dxt3,
767 NULL,
768 NULL
769 },
770 {
771 MESA_FORMAT_RGBA_DXT5,
772 NULL,
773 _mesa_fetch_texel_2d_f_rgba_dxt5,
774 NULL,
775 NULL
776 },
777 {
778 MESA_FORMAT_SRGB_DXT1,
779 NULL,
780 _mesa_fetch_texel_2d_f_srgb_dxt1,
781 NULL,
782 NULL
783 },
784 {
785 MESA_FORMAT_SRGBA_DXT1,
786 NULL,
787 _mesa_fetch_texel_2d_f_srgba_dxt1,
788 NULL,
789 NULL
790 },
791 {
792 MESA_FORMAT_SRGBA_DXT3,
793 NULL,
794 _mesa_fetch_texel_2d_f_srgba_dxt3,
795 NULL,
796 NULL
797 },
798 {
799 MESA_FORMAT_SRGBA_DXT5,
800 NULL,
801 _mesa_fetch_texel_2d_f_srgba_dxt5,
802 NULL,
803 NULL
804 },
805 {
806 MESA_FORMAT_RGBA_FLOAT32,
807 fetch_texel_1d_f_rgba_f32,
808 fetch_texel_2d_f_rgba_f32,
809 fetch_texel_3d_f_rgba_f32,
810 store_texel_rgba_f32
811 },
812 {
813 MESA_FORMAT_RGBA_FLOAT16,
814 fetch_texel_1d_f_rgba_f16,
815 fetch_texel_2d_f_rgba_f16,
816 fetch_texel_3d_f_rgba_f16,
817 store_texel_rgba_f16
818 },
819 {
820 MESA_FORMAT_RGB_FLOAT32,
821 fetch_texel_1d_f_rgb_f32,
822 fetch_texel_2d_f_rgb_f32,
823 fetch_texel_3d_f_rgb_f32,
824 store_texel_rgb_f32
825 },
826 {
827 MESA_FORMAT_RGB_FLOAT16,
828 fetch_texel_1d_f_rgb_f16,
829 fetch_texel_2d_f_rgb_f16,
830 fetch_texel_3d_f_rgb_f16,
831 store_texel_rgb_f16
832 },
833 {
834 MESA_FORMAT_ALPHA_FLOAT32,
835 fetch_texel_1d_f_alpha_f32,
836 fetch_texel_2d_f_alpha_f32,
837 fetch_texel_3d_f_alpha_f32,
838 store_texel_alpha_f32
839 },
840 {
841 MESA_FORMAT_ALPHA_FLOAT16,
842 fetch_texel_1d_f_alpha_f16,
843 fetch_texel_2d_f_alpha_f16,
844 fetch_texel_3d_f_alpha_f16,
845 store_texel_alpha_f16
846 },
847 {
848 MESA_FORMAT_LUMINANCE_FLOAT32,
849 fetch_texel_1d_f_luminance_f32,
850 fetch_texel_2d_f_luminance_f32,
851 fetch_texel_3d_f_luminance_f32,
852 store_texel_luminance_f32
853 },
854 {
855 MESA_FORMAT_LUMINANCE_FLOAT16,
856 fetch_texel_1d_f_luminance_f16,
857 fetch_texel_2d_f_luminance_f16,
858 fetch_texel_3d_f_luminance_f16,
859 store_texel_luminance_f16
860 },
861 {
862 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32,
863 fetch_texel_1d_f_luminance_alpha_f32,
864 fetch_texel_2d_f_luminance_alpha_f32,
865 fetch_texel_3d_f_luminance_alpha_f32,
866 store_texel_luminance_alpha_f32
867 },
868 {
869 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,
870 fetch_texel_1d_f_luminance_alpha_f16,
871 fetch_texel_2d_f_luminance_alpha_f16,
872 fetch_texel_3d_f_luminance_alpha_f16,
873 store_texel_luminance_alpha_f16
874 },
875 {
876 MESA_FORMAT_INTENSITY_FLOAT32,
877 fetch_texel_1d_f_intensity_f32,
878 fetch_texel_2d_f_intensity_f32,
879 fetch_texel_3d_f_intensity_f32,
880 store_texel_intensity_f32
881 },
882 {
883 MESA_FORMAT_INTENSITY_FLOAT16,
884 fetch_texel_1d_f_intensity_f16,
885 fetch_texel_2d_f_intensity_f16,
886 fetch_texel_3d_f_intensity_f16,
887 store_texel_intensity_f16
888 },
889 {
890 MESA_FORMAT_DUDV8,
891 fetch_texel_1d_dudv8,
892 fetch_texel_2d_dudv8,
893 fetch_texel_3d_dudv8,
894 NULL
895 },
896 {
897 MESA_FORMAT_SIGNED_RGBA8888,
898 fetch_texel_1d_signed_rgba8888,
899 fetch_texel_2d_signed_rgba8888,
900 fetch_texel_3d_signed_rgba8888,
901 store_texel_signed_rgba8888
902 },
903 {
904 MESA_FORMAT_SIGNED_RGBA8888_REV,
905 fetch_texel_1d_signed_rgba8888_rev,
906 fetch_texel_2d_signed_rgba8888_rev,
907 fetch_texel_3d_signed_rgba8888_rev,
908 store_texel_signed_rgba8888_rev
909 },
910 {
911 MESA_FORMAT_RGBA8888,
912 fetch_texel_1d_f_rgba8888,
913 fetch_texel_2d_f_rgba8888,
914 fetch_texel_3d_f_rgba8888,
915 store_texel_rgba8888
916 },
917 {
918 MESA_FORMAT_RGBA8888_REV,
919 fetch_texel_1d_f_rgba8888_rev,
920 fetch_texel_2d_f_rgba8888_rev,
921 fetch_texel_3d_f_rgba8888_rev,
922 store_texel_rgba8888_rev
923 },
924 {
925 MESA_FORMAT_ARGB8888,
926 fetch_texel_1d_f_argb8888,
927 fetch_texel_2d_f_argb8888,
928 fetch_texel_3d_f_argb8888,
929 store_texel_argb8888
930 },
931 {
932 MESA_FORMAT_ARGB8888_REV,
933 fetch_texel_1d_f_argb8888_rev,
934 fetch_texel_2d_f_argb8888_rev,
935 fetch_texel_3d_f_argb8888_rev,
936 store_texel_argb8888_rev
937 },
938 {
939 MESA_FORMAT_RGB888,
940 fetch_texel_1d_f_rgb888,
941 fetch_texel_2d_f_rgb888,
942 fetch_texel_3d_f_rgb888,
943 store_texel_rgb888
944 },
945 {
946 MESA_FORMAT_BGR888,
947 fetch_texel_1d_f_bgr888,
948 fetch_texel_2d_f_bgr888,
949 fetch_texel_3d_f_bgr888,
950 store_texel_bgr888
951 },
952 {
953 MESA_FORMAT_RGB565,
954 fetch_texel_1d_f_rgb565,
955 fetch_texel_2d_f_rgb565,
956 fetch_texel_3d_f_rgb565,
957 store_texel_rgb565
958 },
959 {
960 MESA_FORMAT_RGB565_REV,
961 fetch_texel_1d_f_rgb565_rev,
962 fetch_texel_2d_f_rgb565_rev,
963 fetch_texel_3d_f_rgb565_rev,
964 store_texel_rgb565_rev
965 },
966 {
967 MESA_FORMAT_RGBA4444,
968 fetch_texel_1d_f_rgba4444,
969 fetch_texel_2d_f_rgba4444,
970 fetch_texel_3d_f_rgba4444,
971 store_texel_rgba4444
972 },
973 {
974 MESA_FORMAT_ARGB4444,
975 fetch_texel_1d_f_argb4444,
976 fetch_texel_2d_f_argb4444,
977 fetch_texel_3d_f_argb4444,
978 store_texel_argb4444
979 },
980 {
981 MESA_FORMAT_ARGB4444_REV,
982 fetch_texel_1d_f_argb4444_rev,
983 fetch_texel_2d_f_argb4444_rev,
984 fetch_texel_3d_f_argb4444_rev,
985 store_texel_argb4444_rev
986 },
987 {
988 MESA_FORMAT_RGBA5551,
989 fetch_texel_1d_f_rgba5551,
990 fetch_texel_2d_f_rgba5551,
991 fetch_texel_3d_f_rgba5551,
992 store_texel_rgba5551
993 },
994 {
995 MESA_FORMAT_ARGB1555,
996 fetch_texel_1d_f_argb1555,
997 fetch_texel_2d_f_argb1555,
998 fetch_texel_3d_f_argb1555,
999 store_texel_argb1555
1000 },
1001 {
1002 MESA_FORMAT_ARGB1555_REV,
1003 fetch_texel_1d_f_argb1555_rev,
1004 fetch_texel_2d_f_argb1555_rev,
1005 fetch_texel_3d_f_argb1555_rev,
1006 store_texel_argb1555_rev
1007 },
1008 {
1009 MESA_FORMAT_AL88,
1010 fetch_texel_1d_f_al88,
1011 fetch_texel_2d_f_al88,
1012 fetch_texel_3d_f_al88,
1013 store_texel_al88
1014 },
1015 {
1016 MESA_FORMAT_AL88_REV,
1017 fetch_texel_1d_f_al88_rev,
1018 fetch_texel_2d_f_al88_rev,
1019 fetch_texel_3d_f_al88_rev,
1020 store_texel_al88_rev
1021 },
1022 {
1023 MESA_FORMAT_RGB332,
1024 fetch_texel_1d_f_rgb332,
1025 fetch_texel_2d_f_rgb332,
1026 fetch_texel_3d_f_rgb332,
1027 store_texel_rgb332
1028 },
1029 {
1030 MESA_FORMAT_A8,
1031 fetch_texel_1d_f_a8,
1032 fetch_texel_2d_f_a8,
1033 fetch_texel_3d_f_a8,
1034 store_texel_a8
1035 },
1036 {
1037 MESA_FORMAT_L8,
1038 fetch_texel_1d_f_l8,
1039 fetch_texel_2d_f_l8,
1040 fetch_texel_3d_f_l8,
1041 store_texel_l8
1042 },
1043 {
1044 MESA_FORMAT_I8,
1045 fetch_texel_1d_f_i8,
1046 fetch_texel_2d_f_i8,
1047 fetch_texel_3d_f_i8,
1048 store_texel_i8
1049 },
1050 {
1051 MESA_FORMAT_CI8,
1052 fetch_texel_1d_f_ci8,
1053 fetch_texel_2d_f_ci8,
1054 fetch_texel_3d_f_ci8,
1055 store_texel_ci8
1056 },
1057 {
1058 MESA_FORMAT_YCBCR,
1059 fetch_texel_1d_f_ycbcr,
1060 fetch_texel_2d_f_ycbcr,
1061 fetch_texel_3d_f_ycbcr,
1062 store_texel_ycbcr
1063 },
1064 {
1065 MESA_FORMAT_YCBCR_REV,
1066 fetch_texel_1d_f_ycbcr_rev,
1067 fetch_texel_2d_f_ycbcr_rev,
1068 fetch_texel_3d_f_ycbcr_rev,
1069 store_texel_ycbcr_rev
1070 },
1071 {
1072 MESA_FORMAT_Z24_S8,
1073 fetch_texel_1d_f_z24_s8,
1074 fetch_texel_2d_f_z24_s8,
1075 fetch_texel_3d_f_z24_s8,
1076 store_texel_z24_s8
1077 },
1078 {
1079 MESA_FORMAT_S8_Z24,
1080 fetch_texel_1d_f_s8_z24,
1081 fetch_texel_2d_f_s8_z24,
1082 fetch_texel_3d_f_s8_z24,
1083 store_texel_s8_z24
1084 },
1085 {
1086 MESA_FORMAT_Z16,
1087 fetch_texel_1d_f_z16,
1088 fetch_texel_2d_f_z16,
1089 fetch_texel_3d_f_z16,
1090 store_texel_z16
1091 },
1092 {
1093 MESA_FORMAT_Z32,
1094 fetch_texel_1d_f_z32,
1095 fetch_texel_2d_f_z32,
1096 fetch_texel_3d_f_z32,
1097 store_texel_z32
1098 }
1099 };
1100
1101
1102 FetchTexelFuncF
1103 _mesa_get_texel_fetch_func(GLuint format, GLuint dims)
1104 {
1105 FetchTexelFuncF f;
1106 GLuint i;
1107 /* XXX replace loop with direct table lookup */
1108 for (i = 0; i < MESA_FORMAT_COUNT; i++) {
1109 if (texfetch_funcs[i].Name == format) {
1110 switch (dims) {
1111 case 1:
1112 f = texfetch_funcs[i].Fetch1D;
1113 break;
1114 case 2:
1115 f = texfetch_funcs[i].Fetch2D;
1116 break;
1117 case 3:
1118 f = texfetch_funcs[i].Fetch3D;
1119 break;
1120 }
1121 if (!f)
1122 f = fetch_null_texelf;
1123 return f;
1124 }
1125 }
1126 return NULL;
1127 }
1128
1129
1130 StoreTexelFunc
1131 _mesa_get_texel_store_func(GLuint format)
1132 {
1133 GLuint i;
1134 /* XXX replace loop with direct table lookup */
1135 for (i = 0; i < MESA_FORMAT_COUNT; i++) {
1136 if (texfetch_funcs[i].Name == format) {
1137 if (texfetch_funcs[i].StoreTexel)
1138 return texfetch_funcs[i].StoreTexel;
1139 else
1140 return store_null_texel;
1141 }
1142 }
1143 return NULL;
1144 }