texformat.c revision 1271424615b62544662a606bb23f6d7117a8b0e7
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) 2008-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 texformat.c
29 * Texture formats.
30 *
31 * \author Gareth Hughes
32 * \author Brian Paul
33 */
34
35
36#include "context.h"
37#include "mfeatures.h"
38#include "mtypes.h"
39#include "texcompress.h"
40#include "texformat.h"
41
42#define RETURN_IF_SUPPORTED(f) do {		\
43   if (ctx->TextureFormatSupported[f])		\
44      return f;					\
45} while (0)
46
47/**
48 * Choose an appropriate texture format given the format, type and
49 * internalFormat parameters passed to glTexImage().
50 *
51 * \param ctx  the GL context.
52 * \param internalFormat  user's prefered internal texture format.
53 * \param format  incoming image pixel format.
54 * \param type  incoming image data type.
55 *
56 * \return a pointer to a gl_texture_format object which describes the
57 * choosen texture format, or NULL on failure.
58 *
59 * This is called via dd_function_table::ChooseTextureFormat.  Hardware drivers
60 * will typically override this function with a specialized version.
61 */
62gl_format
63_mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
64                         GLenum format, GLenum type )
65{
66   (void) format;
67   (void) type;
68
69   switch (internalFormat) {
70      /* shallow RGBA formats */
71      case 4:
72      case GL_RGBA:
73	 if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
74	    RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
75	 } else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
76	    RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
77	 }
78	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
79	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
80	 break;
81
82      case GL_RGBA8:
83	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
84	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
85	 break;
86      case GL_RGB5_A1:
87	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
88	 break;
89      case GL_RGBA2:
90	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444_REV); /* just to test another format*/
91	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
92	 break;
93      case GL_RGBA4:
94	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
95	 break;
96
97      /* deep RGBA formats */
98      case GL_RGB10_A2:
99	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
100	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
101	 break;
102      case GL_RGBA12:
103      case GL_RGBA16:
104	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
105	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
106	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
107	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
108	 break;
109
110      /* shallow RGB formats */
111      case 3:
112      case GL_RGB:
113      case GL_RGB8:
114	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
115	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
116	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
117	 break;
118      case GL_R3_G3_B2:
119	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332);
120	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
121	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
122	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
123	 break;
124      case GL_RGB4:
125	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); /* just to test another format */
126	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
127	 break;
128      case GL_RGB5:
129	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
130	 break;
131
132      /* deep RGB formats */
133      case GL_RGB10:
134      case GL_RGB12:
135      case GL_RGB16:
136	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
137	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
138	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
139	 break;
140
141      /* Alpha formats */
142      case GL_ALPHA:
143      case GL_ALPHA4:
144      case GL_ALPHA8:
145	 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
146	 break;
147
148      case GL_ALPHA12:
149      case GL_ALPHA16:
150	 RETURN_IF_SUPPORTED(MESA_FORMAT_A16);
151	 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
152	 break;
153
154      /* Luminance formats */
155      case 1:
156      case GL_LUMINANCE:
157      case GL_LUMINANCE4:
158      case GL_LUMINANCE8:
159	 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
160	 break;
161
162      case GL_LUMINANCE12:
163      case GL_LUMINANCE16:
164	 RETURN_IF_SUPPORTED(MESA_FORMAT_L16);
165	 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
166	 break;
167
168      /* Luminance/Alpha formats */
169      case GL_LUMINANCE4_ALPHA4:
170	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL44);
171	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
172	 break;
173
174      case 2:
175      case GL_LUMINANCE_ALPHA:
176      case GL_LUMINANCE6_ALPHA2:
177      case GL_LUMINANCE8_ALPHA8:
178	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
179	 break;
180
181      case GL_LUMINANCE12_ALPHA4:
182      case GL_LUMINANCE12_ALPHA12:
183      case GL_LUMINANCE16_ALPHA16:
184	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL1616);
185	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
186	 break;
187
188      case GL_INTENSITY:
189      case GL_INTENSITY4:
190      case GL_INTENSITY8:
191	 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
192	 break;
193
194      case GL_INTENSITY12:
195      case GL_INTENSITY16:
196	 RETURN_IF_SUPPORTED(MESA_FORMAT_I16);
197	 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
198	 break;
199
200      case GL_COLOR_INDEX:
201      case GL_COLOR_INDEX1_EXT:
202      case GL_COLOR_INDEX2_EXT:
203      case GL_COLOR_INDEX4_EXT:
204      case GL_COLOR_INDEX12_EXT:
205      case GL_COLOR_INDEX16_EXT:
206      case GL_COLOR_INDEX8_EXT:
207	 RETURN_IF_SUPPORTED(MESA_FORMAT_CI8);
208	 break;
209
210      default:
211         ; /* fallthrough */
212   }
213
214   if (ctx->Extensions.ARB_depth_texture) {
215      switch (internalFormat) {
216         case GL_DEPTH_COMPONENT:
217         case GL_DEPTH_COMPONENT24:
218         case GL_DEPTH_COMPONENT32:
219	    RETURN_IF_SUPPORTED(MESA_FORMAT_Z32);
220	    RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
221	    break;
222         case GL_DEPTH_COMPONENT16:
223	    RETURN_IF_SUPPORTED(MESA_FORMAT_Z16);
224	    RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
225         default:
226            ; /* fallthrough */
227      }
228   }
229
230   switch (internalFormat) {
231      case GL_COMPRESSED_ALPHA_ARB:
232	 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
233	 break;
234      case GL_COMPRESSED_LUMINANCE_ARB:
235	 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
236	 break;
237      case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
238	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
239	 break;
240      case GL_COMPRESSED_INTENSITY_ARB:
241	 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
242	 break;
243      case GL_COMPRESSED_RGB_ARB:
244         if (ctx->Extensions.EXT_texture_compression_s3tc ||
245             ctx->Extensions.S3_s3tc)
246	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
247         if (ctx->Extensions.TDFX_texture_compression_FXT1)
248	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
249	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
250	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
251	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
252	 break;
253      case GL_COMPRESSED_RGBA_ARB:
254         if (ctx->Extensions.EXT_texture_compression_s3tc ||
255             ctx->Extensions.S3_s3tc)
256	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
257         if (ctx->Extensions.TDFX_texture_compression_FXT1)
258	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
259	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
260	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
261	 break;
262      default:
263         ; /* fallthrough */
264   }
265
266   if (ctx->Extensions.MESA_ycbcr_texture) {
267      if (internalFormat == GL_YCBCR_MESA) {
268         if (type == GL_UNSIGNED_SHORT_8_8_MESA)
269	    RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR);
270         else
271	    RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
272      }
273   }
274
275#if FEATURE_texture_fxt1
276   if (ctx->Extensions.TDFX_texture_compression_FXT1) {
277      switch (internalFormat) {
278         case GL_COMPRESSED_RGB_FXT1_3DFX:
279	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
280	 break;
281         case GL_COMPRESSED_RGBA_FXT1_3DFX:
282	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
283	 break;
284         default:
285            ; /* fallthrough */
286      }
287   }
288#endif
289
290#if FEATURE_texture_s3tc
291   if (ctx->Extensions.EXT_texture_compression_s3tc) {
292      switch (internalFormat) {
293         case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
294	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
295	    break;
296         case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
297	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT1);
298	    break;
299         case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
300	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
301	    break;
302         case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
303	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT5);
304	    break;
305         default:
306            ; /* fallthrough */
307      }
308   }
309
310   if (ctx->Extensions.S3_s3tc) {
311      switch (internalFormat) {
312         case GL_RGB_S3TC:
313         case GL_RGB4_S3TC:
314	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
315	    break;
316         case GL_RGBA_S3TC:
317         case GL_RGBA4_S3TC:
318	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
319	    break;
320         default:
321            ; /* fallthrough */
322      }
323   }
324#endif
325
326   if (ctx->Extensions.ARB_texture_float) {
327      switch (internalFormat) {
328         case GL_ALPHA16F_ARB:
329	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
330	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
331	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
332	    break;
333         case GL_ALPHA32F_ARB:
334	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
335	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
336	    break;
337         case GL_LUMINANCE16F_ARB:
338	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
339	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
340	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
341	    break;
342         case GL_LUMINANCE32F_ARB:
343	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
344	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
345	    break;
346         case GL_LUMINANCE_ALPHA16F_ARB:
347	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
348	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
349	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
350	    break;
351         case GL_LUMINANCE_ALPHA32F_ARB:
352	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
353	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
354	    break;
355         case GL_INTENSITY16F_ARB:
356	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
357	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
358	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
359	    break;
360         case GL_INTENSITY32F_ARB:
361	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
362	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
363	    break;
364         case GL_RGB16F_ARB:
365	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
366	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
367	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
368	    break;
369         case GL_RGB32F_ARB:
370	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
371	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
372	    break;
373         case GL_RGBA16F_ARB:
374	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
375	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
376	    break;
377         case GL_RGBA32F_ARB:
378	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
379	    break;
380         default:
381            ; /* fallthrough */
382      }
383   }
384
385   if (ctx->Extensions.EXT_texture_shared_exponent) {
386      switch (internalFormat) {
387         case GL_RGB9_E5:
388            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]);
389            return MESA_FORMAT_RGB9_E5_FLOAT;
390         default:
391            ; /* fallthrough */
392      }
393   }
394
395   if (ctx->Extensions.EXT_packed_depth_stencil) {
396      switch (internalFormat) {
397         case GL_DEPTH_STENCIL_EXT:
398         case GL_DEPTH24_STENCIL8_EXT:
399	    RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8);
400	    RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
401	    break;
402         default:
403            ; /* fallthrough */
404      }
405   }
406
407   if (ctx->Extensions.ATI_envmap_bumpmap) {
408      switch (internalFormat) {
409         case GL_DUDV_ATI:
410         case GL_DU8DV8_ATI:
411	    RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8);
412	    break;
413         default:
414            ; /* fallthrough */
415      }
416   }
417
418   if (ctx->Extensions.EXT_texture_snorm) {
419      switch (internalFormat) {
420         case GL_RED_SNORM:
421         case GL_R8_SNORM:
422	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8);
423	    break;
424         case GL_RG_SNORM:
425         case GL_RG8_SNORM:
426	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV);
427	    break;
428         case GL_RGB_SNORM:
429         case GL_RGB8_SNORM:
430	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
431	    /* FALLTHROUGH */
432         case GL_RGBA_SNORM:
433         case GL_RGBA8_SNORM:
434	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
435	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
436	    break;
437         case GL_ALPHA_SNORM:
438         case GL_ALPHA8_SNORM:
439            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8);
440	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
441	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
442            break;
443         case GL_LUMINANCE_SNORM:
444         case GL_LUMINANCE8_SNORM:
445            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8);
446	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
447	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
448	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
449            break;
450         case GL_LUMINANCE_ALPHA_SNORM:
451         case GL_LUMINANCE8_ALPHA8_SNORM:
452            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88);
453	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
454	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
455            break;
456         case GL_INTENSITY_SNORM:
457         case GL_INTENSITY8_SNORM:
458            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8);
459	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
460	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
461            break;
462         case GL_R16_SNORM:
463	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16);
464	    break;
465         case GL_RG16_SNORM:
466	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616);
467	    break;
468         case GL_RGB16_SNORM:
469	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
470	    /* FALLTHROUGH */
471         case GL_RGBA16_SNORM:
472	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
473	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
474	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
475	    break;
476         case GL_ALPHA16_SNORM:
477            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16);
478	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
479	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
480	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
481            break;
482         case GL_LUMINANCE16_SNORM:
483            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16);
484	    /* FALLTHROUGH */
485         case GL_LUMINANCE16_ALPHA16_SNORM:
486            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616);
487	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
488	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
489	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
490            break;
491         case GL_INTENSITY16_SNORM:
492            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16);
493	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
494	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
495	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
496            break;
497         default:
498            ; /* fall-through */
499      }
500   }
501
502#if FEATURE_EXT_texture_sRGB
503   if (ctx->Extensions.EXT_texture_sRGB) {
504      switch (internalFormat) {
505         case GL_SRGB_EXT:
506         case GL_SRGB8_EXT:
507	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
508	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
509	    break;
510         case GL_SRGB_ALPHA_EXT:
511         case GL_SRGB8_ALPHA8_EXT:
512	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
513	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
514	    break;
515         case GL_SLUMINANCE_EXT:
516         case GL_SLUMINANCE8_EXT:
517	    RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
518	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
519	    break;
520         case GL_SLUMINANCE_ALPHA_EXT:
521         case GL_SLUMINANCE8_ALPHA8_EXT:
522	    RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
523	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
524	    break;
525         case GL_COMPRESSED_SLUMINANCE_EXT:
526	    RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
527	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
528	    break;
529         case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
530	    RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
531	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
532	    break;
533         case GL_COMPRESSED_SRGB_EXT:
534#if FEATURE_texture_s3tc
535            if (ctx->Extensions.EXT_texture_compression_s3tc)
536	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
537#endif
538	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
539	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
540	    break;
541         case GL_COMPRESSED_SRGB_ALPHA_EXT:
542#if FEATURE_texture_s3tc
543            if (ctx->Extensions.EXT_texture_compression_s3tc)
544	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
545#endif
546	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
547	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
548	    break;
549#if FEATURE_texture_s3tc
550         case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
551            if (ctx->Extensions.EXT_texture_compression_s3tc)
552	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
553	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
554            break;
555         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
556            if (ctx->Extensions.EXT_texture_compression_s3tc)
557	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT1);
558	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
559            break;
560         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
561            if (ctx->Extensions.EXT_texture_compression_s3tc)
562	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3);
563	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
564            break;
565         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
566            if (ctx->Extensions.EXT_texture_compression_s3tc)
567	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT5);
568	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
569            break;
570#endif
571         default:
572            ; /* fallthrough */
573      }
574   }
575#endif /* FEATURE_EXT_texture_sRGB */
576
577   if (ctx->Extensions.EXT_texture_integer) {
578      switch (internalFormat) {
579      case GL_RGBA32UI_EXT:
580      case GL_RGB32UI_EXT:
581      case GL_ALPHA32UI_EXT:
582      case GL_INTENSITY32UI_EXT:
583      case GL_LUMINANCE32UI_EXT:
584      case GL_LUMINANCE_ALPHA32UI_EXT:
585	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
586	 break;
587      case GL_RGBA16UI_EXT:
588      case GL_RGB16UI_EXT:
589      case GL_ALPHA16UI_EXT:
590      case GL_INTENSITY16UI_EXT:
591      case GL_LUMINANCE16UI_EXT:
592      case GL_LUMINANCE_ALPHA16UI_EXT:
593	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
594	 break;
595      case GL_RGBA8UI_EXT:
596      case GL_RGB8UI_EXT:
597      case GL_ALPHA8UI_EXT:
598      case GL_INTENSITY8UI_EXT:
599      case GL_LUMINANCE8UI_EXT:
600      case GL_LUMINANCE_ALPHA8UI_EXT:
601	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
602	 break;
603      case GL_RGBA32I_EXT:
604      case GL_RGB32I_EXT:
605      case GL_ALPHA32I_EXT:
606      case GL_INTENSITY32I_EXT:
607      case GL_LUMINANCE32I_EXT:
608      case GL_LUMINANCE_ALPHA32I_EXT:
609	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
610	 break;
611      case GL_RGBA16I_EXT:
612      case GL_RGB16I_EXT:
613      case GL_ALPHA16I_EXT:
614      case GL_INTENSITY16I_EXT:
615      case GL_LUMINANCE16I_EXT:
616      case GL_LUMINANCE_ALPHA16I_EXT:
617	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
618	 break;
619      case GL_RGBA8I_EXT:
620      case GL_RGB8I_EXT:
621      case GL_ALPHA8I_EXT:
622      case GL_INTENSITY8I_EXT:
623      case GL_LUMINANCE8I_EXT:
624      case GL_LUMINANCE_ALPHA8I_EXT:
625	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
626	 break;
627      }
628   }
629
630   if (ctx->Extensions.ARB_texture_rg) {
631      switch (internalFormat) {
632      case GL_R8:
633      case GL_RED:
634	 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
635	 break;
636
637      case GL_COMPRESSED_RED:
638	 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
639	 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
640	 break;
641
642      case GL_R16:
643	 RETURN_IF_SUPPORTED(MESA_FORMAT_R16);
644	 break;
645
646      case GL_RG:
647      case GL_RG8:
648	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88);
649	 break;
650
651      case GL_COMPRESSED_RG:
652	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
653	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88);
654	 break;
655
656      case GL_RG16:
657	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG1616);
658	 break;
659
660      default:
661         ; /* fallthrough */
662      }
663   }
664
665   if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.ARB_texture_float) {
666      switch (internalFormat) {
667      case GL_R16F:
668	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
669	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
670	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
671	 break;
672      case GL_R32F:
673	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
674	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
675	 break;
676      case GL_RG16F:
677	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
678	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
679	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
680	 break;
681      case GL_RG32F:
682	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
683	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
684	 break;
685
686      default:
687         ; /* fallthrough */
688      }
689   }
690
691   if (ctx->Extensions.EXT_texture_format_BGRA8888) {
692      switch (internalFormat) {
693      case GL_BGRA:
694	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
695	 break;
696
697      default:
698         ; /* fallthrough */
699      }
700   }
701
702   if (ctx->Extensions.ARB_texture_compression_rgtc) {
703      switch (internalFormat) {
704         case GL_COMPRESSED_RED_RGTC1:
705	    RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
706	    break;
707         case GL_COMPRESSED_SIGNED_RED_RGTC1:
708	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RED_RGTC1);
709	    break;
710         case GL_COMPRESSED_RG_RGTC2:
711	    RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
712	    break;
713         case GL_COMPRESSED_SIGNED_RG_RGTC2:
714	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_RGTC2);
715	    break;
716         default:
717            ; /* fallthrough */
718      }
719   }
720
721   if (ctx->Extensions.EXT_texture_compression_latc) {
722      switch (internalFormat) {
723         case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
724            RETURN_IF_SUPPORTED(MESA_FORMAT_L_LATC1);
725            break;
726         case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
727            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L_LATC1);
728            break;
729         case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
730            RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
731            break;
732         case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
733            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_LA_LATC2);
734            break;
735         default:
736            ; /* fallthrough */
737      }
738   }
739
740   if (ctx->Extensions.ATI_texture_compression_3dc) {
741      switch (internalFormat) {
742         case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
743            RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
744            break;
745         default:
746            ; /* fallthrough */
747      }
748   }
749
750   _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
751   return MESA_FORMAT_NONE;
752}
753
754