texformat.c revision 55d232a81566cf7ab8855c42e2ef1a280276a04c
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      default:
208         ; /* fallthrough */
209   }
210
211   if (ctx->Extensions.ARB_depth_texture) {
212      switch (internalFormat) {
213         case GL_DEPTH_COMPONENT:
214         case GL_DEPTH_COMPONENT24:
215         case GL_DEPTH_COMPONENT32:
216	    RETURN_IF_SUPPORTED(MESA_FORMAT_Z32);
217	    RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24);
218	    RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
219	    break;
220         case GL_DEPTH_COMPONENT16:
221	    RETURN_IF_SUPPORTED(MESA_FORMAT_Z16);
222	    RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24);
223	    RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
224         default:
225            ; /* fallthrough */
226      }
227   }
228
229   switch (internalFormat) {
230      case GL_COMPRESSED_ALPHA_ARB:
231	 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
232	 break;
233      case GL_COMPRESSED_LUMINANCE_ARB:
234	 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
235	 break;
236      case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
237	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
238	 break;
239      case GL_COMPRESSED_INTENSITY_ARB:
240	 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
241	 break;
242      case GL_COMPRESSED_RGB_ARB:
243         if (ctx->Extensions.EXT_texture_compression_s3tc ||
244             ctx->Extensions.S3_s3tc)
245	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
246         if (ctx->Extensions.TDFX_texture_compression_FXT1)
247	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
248	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
249	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
250	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
251	 break;
252      case GL_COMPRESSED_RGBA_ARB:
253         if (ctx->Extensions.EXT_texture_compression_s3tc ||
254             ctx->Extensions.S3_s3tc)
255	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
256         if (ctx->Extensions.TDFX_texture_compression_FXT1)
257	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
258	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
259	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
260	 break;
261      default:
262         ; /* fallthrough */
263   }
264
265   if (ctx->Extensions.MESA_ycbcr_texture) {
266      if (internalFormat == GL_YCBCR_MESA) {
267         if (type == GL_UNSIGNED_SHORT_8_8_MESA)
268	    RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR);
269         else
270	    RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
271      }
272   }
273
274#if FEATURE_texture_fxt1
275   if (ctx->Extensions.TDFX_texture_compression_FXT1) {
276      switch (internalFormat) {
277         case GL_COMPRESSED_RGB_FXT1_3DFX:
278	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
279	 break;
280         case GL_COMPRESSED_RGBA_FXT1_3DFX:
281	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
282	 break;
283         default:
284            ; /* fallthrough */
285      }
286   }
287#endif
288
289#if FEATURE_texture_s3tc
290   if (ctx->Extensions.EXT_texture_compression_s3tc) {
291      switch (internalFormat) {
292         case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
293	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
294	    break;
295         case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
296	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT1);
297	    break;
298         case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
299	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
300	    break;
301         case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
302	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT5);
303	    break;
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_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
314	    break;
315         case GL_RGBA_S3TC:
316         case GL_RGBA4_S3TC:
317	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
318	    break;
319         default:
320            ; /* fallthrough */
321      }
322   }
323#endif
324
325   if (ctx->Extensions.ARB_texture_float) {
326      switch (internalFormat) {
327         case GL_ALPHA16F_ARB:
328	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
329	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
330	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
331	    break;
332         case GL_ALPHA32F_ARB:
333	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
334	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
335	    break;
336         case GL_LUMINANCE16F_ARB:
337	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
338	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
339	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
340	    break;
341         case GL_LUMINANCE32F_ARB:
342	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
343	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
344	    break;
345         case GL_LUMINANCE_ALPHA16F_ARB:
346	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
347	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
348	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
349	    break;
350         case GL_LUMINANCE_ALPHA32F_ARB:
351	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
352	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
353	    break;
354         case GL_INTENSITY16F_ARB:
355	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
356	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
357	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
358	    break;
359         case GL_INTENSITY32F_ARB:
360	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
361	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
362	    break;
363         case GL_RGB16F_ARB:
364	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
365	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
366	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
367	    break;
368         case GL_RGB32F_ARB:
369	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
370	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
371	    break;
372         case GL_RGBA16F_ARB:
373	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
374	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
375	    break;
376         case GL_RGBA32F_ARB:
377	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
378	    break;
379         default:
380            ; /* fallthrough */
381      }
382   }
383
384   if (ctx->Extensions.EXT_texture_shared_exponent) {
385      switch (internalFormat) {
386         case GL_RGB9_E5:
387            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]);
388            return MESA_FORMAT_RGB9_E5_FLOAT;
389         default:
390            ; /* fallthrough */
391      }
392   }
393
394   if (ctx->Extensions.EXT_packed_float) {
395      switch (internalFormat) {
396         case GL_R11F_G11F_B10F:
397            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11_G11_B10_FLOAT]);
398            return MESA_FORMAT_R11_G11_B10_FLOAT;
399         default:
400            ; /* fallthrough */
401      }
402   }
403
404   if (ctx->Extensions.EXT_packed_depth_stencil) {
405      switch (internalFormat) {
406         case GL_DEPTH_STENCIL_EXT:
407         case GL_DEPTH24_STENCIL8_EXT:
408	    RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8);
409	    RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
410	    break;
411         default:
412            ; /* fallthrough */
413      }
414   }
415
416   if (ctx->Extensions.ARB_depth_buffer_float) {
417      switch (internalFormat) {
418         case GL_DEPTH_COMPONENT32F:
419            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT]);
420            return MESA_FORMAT_Z32_FLOAT;
421         case GL_DEPTH32F_STENCIL8:
422            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8]);
423            return MESA_FORMAT_Z32_FLOAT_X24S8;
424         default:
425            ; /* fallthrough */
426      }
427   }
428
429   if (ctx->Extensions.ATI_envmap_bumpmap) {
430      switch (internalFormat) {
431         case GL_DUDV_ATI:
432         case GL_DU8DV8_ATI:
433	    RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8);
434	    break;
435         default:
436            ; /* fallthrough */
437      }
438   }
439
440   if (ctx->Extensions.EXT_texture_snorm) {
441      switch (internalFormat) {
442         case GL_RED_SNORM:
443         case GL_R8_SNORM:
444	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8);
445	    break;
446         case GL_RG_SNORM:
447         case GL_RG8_SNORM:
448	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV);
449	    break;
450         case GL_RGB_SNORM:
451         case GL_RGB8_SNORM:
452	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
453	    /* FALLTHROUGH */
454         case GL_RGBA_SNORM:
455         case GL_RGBA8_SNORM:
456	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
457	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
458	    break;
459         case GL_ALPHA_SNORM:
460         case GL_ALPHA8_SNORM:
461            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8);
462	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
463	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
464            break;
465         case GL_LUMINANCE_SNORM:
466         case GL_LUMINANCE8_SNORM:
467            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8);
468	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
469	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
470	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
471            break;
472         case GL_LUMINANCE_ALPHA_SNORM:
473         case GL_LUMINANCE8_ALPHA8_SNORM:
474            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88);
475	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
476	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
477            break;
478         case GL_INTENSITY_SNORM:
479         case GL_INTENSITY8_SNORM:
480            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8);
481	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
482	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
483            break;
484         case GL_R16_SNORM:
485	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16);
486	    break;
487         case GL_RG16_SNORM:
488	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616);
489	    break;
490         case GL_RGB16_SNORM:
491	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
492	    /* FALLTHROUGH */
493         case GL_RGBA16_SNORM:
494	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
495	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
496	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
497	    break;
498         case GL_ALPHA16_SNORM:
499            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16);
500	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
501	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
502	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
503            break;
504         case GL_LUMINANCE16_SNORM:
505            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16);
506	    /* FALLTHROUGH */
507         case GL_LUMINANCE16_ALPHA16_SNORM:
508            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616);
509	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
510	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
511	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
512            break;
513         case GL_INTENSITY16_SNORM:
514            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16);
515	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
516	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
517	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
518            break;
519         default:
520            ; /* fall-through */
521      }
522   }
523
524#if FEATURE_EXT_texture_sRGB
525   if (ctx->Extensions.EXT_texture_sRGB) {
526      switch (internalFormat) {
527         case GL_SRGB_EXT:
528         case GL_SRGB8_EXT:
529	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
530	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
531	    break;
532         case GL_SRGB_ALPHA_EXT:
533         case GL_SRGB8_ALPHA8_EXT:
534	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
535	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
536	    break;
537         case GL_SLUMINANCE_EXT:
538         case GL_SLUMINANCE8_EXT:
539	    RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
540	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
541	    break;
542         case GL_SLUMINANCE_ALPHA_EXT:
543         case GL_SLUMINANCE8_ALPHA8_EXT:
544	    RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
545	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
546	    break;
547         case GL_COMPRESSED_SLUMINANCE_EXT:
548	    RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
549	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
550	    break;
551         case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
552	    RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
553	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
554	    break;
555         case GL_COMPRESSED_SRGB_EXT:
556#if FEATURE_texture_s3tc
557            if (ctx->Extensions.EXT_texture_compression_s3tc)
558	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
559#endif
560	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
561	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
562	    break;
563         case GL_COMPRESSED_SRGB_ALPHA_EXT:
564#if FEATURE_texture_s3tc
565            if (ctx->Extensions.EXT_texture_compression_s3tc)
566	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
567#endif
568	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
569	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
570	    break;
571#if FEATURE_texture_s3tc
572         case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
573            if (ctx->Extensions.EXT_texture_compression_s3tc)
574	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
575	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
576            break;
577         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
578            if (ctx->Extensions.EXT_texture_compression_s3tc)
579	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT1);
580	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
581            break;
582         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
583            if (ctx->Extensions.EXT_texture_compression_s3tc)
584	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3);
585	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
586            break;
587         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
588            if (ctx->Extensions.EXT_texture_compression_s3tc)
589	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT5);
590	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
591            break;
592#endif
593         default:
594            ; /* fallthrough */
595      }
596   }
597#endif /* FEATURE_EXT_texture_sRGB */
598
599   if (ctx->Extensions.EXT_texture_integer) {
600      switch (internalFormat) {
601      case GL_RGBA32UI_EXT:
602      case GL_RGB32UI_EXT:
603      case GL_ALPHA32UI_EXT:
604      case GL_INTENSITY32UI_EXT:
605      case GL_LUMINANCE32UI_EXT:
606      case GL_LUMINANCE_ALPHA32UI_EXT:
607	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
608	 break;
609      case GL_RGBA16UI_EXT:
610      case GL_RGB16UI_EXT:
611      case GL_ALPHA16UI_EXT:
612      case GL_INTENSITY16UI_EXT:
613      case GL_LUMINANCE16UI_EXT:
614      case GL_LUMINANCE_ALPHA16UI_EXT:
615	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
616	 break;
617      case GL_RGBA8UI_EXT:
618      case GL_RGB8UI_EXT:
619      case GL_ALPHA8UI_EXT:
620      case GL_INTENSITY8UI_EXT:
621      case GL_LUMINANCE8UI_EXT:
622      case GL_LUMINANCE_ALPHA8UI_EXT:
623	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
624	 break;
625      case GL_RGBA32I_EXT:
626      case GL_RGB32I_EXT:
627      case GL_ALPHA32I_EXT:
628      case GL_INTENSITY32I_EXT:
629      case GL_LUMINANCE32I_EXT:
630      case GL_LUMINANCE_ALPHA32I_EXT:
631	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
632	 break;
633      case GL_RGBA16I_EXT:
634      case GL_RGB16I_EXT:
635      case GL_ALPHA16I_EXT:
636      case GL_INTENSITY16I_EXT:
637      case GL_LUMINANCE16I_EXT:
638      case GL_LUMINANCE_ALPHA16I_EXT:
639	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
640	 break;
641      case GL_RGBA8I_EXT:
642      case GL_RGB8I_EXT:
643      case GL_ALPHA8I_EXT:
644      case GL_INTENSITY8I_EXT:
645      case GL_LUMINANCE8I_EXT:
646      case GL_LUMINANCE_ALPHA8I_EXT:
647	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
648	 break;
649      }
650   }
651
652   if (ctx->Extensions.ARB_texture_rg) {
653      switch (internalFormat) {
654      case GL_R8:
655      case GL_RED:
656	 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
657	 break;
658
659      case GL_COMPRESSED_RED:
660	 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
661	 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
662	 break;
663
664      case GL_R16:
665	 RETURN_IF_SUPPORTED(MESA_FORMAT_R16);
666	 break;
667
668      case GL_RG:
669      case GL_RG8:
670	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88);
671	 break;
672
673      case GL_COMPRESSED_RG:
674	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
675	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88);
676	 break;
677
678      case GL_RG16:
679	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG1616);
680	 break;
681
682      default:
683         ; /* fallthrough */
684      }
685   }
686
687   if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.ARB_texture_float) {
688      switch (internalFormat) {
689      case GL_R16F:
690	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
691	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
692	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
693	 break;
694      case GL_R32F:
695	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
696	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
697	 break;
698      case GL_RG16F:
699	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
700	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
701	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
702	 break;
703      case GL_RG32F:
704	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
705	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
706	 break;
707
708      default:
709         ; /* fallthrough */
710      }
711   }
712
713   if (ctx->Extensions.EXT_texture_format_BGRA8888) {
714      switch (internalFormat) {
715      case GL_BGRA:
716	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
717	 break;
718
719      default:
720         ; /* fallthrough */
721      }
722   }
723
724   if (ctx->Extensions.ARB_texture_compression_rgtc) {
725      switch (internalFormat) {
726         case GL_COMPRESSED_RED_RGTC1:
727	    RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
728	    break;
729         case GL_COMPRESSED_SIGNED_RED_RGTC1:
730	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RED_RGTC1);
731	    break;
732         case GL_COMPRESSED_RG_RGTC2:
733	    RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
734	    break;
735         case GL_COMPRESSED_SIGNED_RG_RGTC2:
736	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_RGTC2);
737	    break;
738         default:
739            ; /* fallthrough */
740      }
741   }
742
743   if (ctx->Extensions.EXT_texture_compression_latc) {
744      switch (internalFormat) {
745         case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
746            RETURN_IF_SUPPORTED(MESA_FORMAT_L_LATC1);
747            break;
748         case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
749            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L_LATC1);
750            break;
751         case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
752            RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
753            break;
754         case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
755            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_LA_LATC2);
756            break;
757         default:
758            ; /* fallthrough */
759      }
760   }
761
762   if (ctx->Extensions.ATI_texture_compression_3dc) {
763      switch (internalFormat) {
764         case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
765            RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
766            break;
767         default:
768            ; /* fallthrough */
769      }
770   }
771
772   _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
773   return MESA_FORMAT_NONE;
774}
775
776