texformat.c revision 2b3fdb1fae00f58dcb4db7eeeb03eb77a1ef51b2
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 "enums.h"
38#include "mfeatures.h"
39#include "mtypes.h"
40#include "texcompress.h"
41#include "texformat.h"
42
43#define RETURN_IF_SUPPORTED(f) do {		\
44   if (ctx->TextureFormatSupported[f])		\
45      return f;					\
46} while (0)
47
48/**
49 * Choose an appropriate texture format given the format, type and
50 * internalFormat parameters passed to glTexImage().
51 *
52 * \param ctx  the GL context.
53 * \param internalFormat  user's prefered internal texture format.
54 * \param format  incoming image pixel format.
55 * \param type  incoming image data type.
56 *
57 * \return a pointer to a gl_texture_format object which describes the
58 * choosen texture format, or NULL on failure.
59 *
60 * This is called via dd_function_table::ChooseTextureFormat.  Hardware drivers
61 * will typically override this function with a specialized version.
62 */
63gl_format
64_mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
65                         GLenum format, GLenum type )
66{
67   (void) format;
68   (void) type;
69
70   switch (internalFormat) {
71      /* shallow RGBA formats */
72      case 4:
73      case GL_RGBA:
74	 if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
75	    RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
76	 } else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
77	    RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
78	 }
79	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
80	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
81	 break;
82
83      case GL_RGBA8:
84	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
85	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
86	 break;
87      case GL_RGB5_A1:
88	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
89	 break;
90      case GL_RGBA2:
91	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444_REV); /* just to test another format*/
92	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
93	 break;
94      case GL_RGBA4:
95	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
96	 break;
97
98      /* deep RGBA formats */
99      case GL_RGB10_A2:
100	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
101	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
102	 break;
103      case GL_RGBA12:
104      case GL_RGBA16:
105	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
106	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
107	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
108	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
109	 break;
110
111      /* shallow RGB formats */
112      case 3:
113      case GL_RGB:
114      case GL_RGB8:
115	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
116	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
117	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
118	 break;
119      case GL_R3_G3_B2:
120	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332);
121	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
122	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV);
123	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
124	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
125	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
126	 break;
127      case GL_RGB4:
128	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); /* just to test another format */
129	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
130	 break;
131      case GL_RGB5:
132	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
133	 break;
134
135      /* deep RGB formats */
136      case GL_RGB10:
137      case GL_RGB12:
138      case GL_RGB16:
139	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
140	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
141	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
142	 break;
143
144      /* Alpha formats */
145      case GL_ALPHA:
146      case GL_ALPHA4:
147      case GL_ALPHA8:
148	 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
149	 break;
150
151      case GL_ALPHA12:
152      case GL_ALPHA16:
153	 RETURN_IF_SUPPORTED(MESA_FORMAT_A16);
154	 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
155	 break;
156
157      /* Luminance formats */
158      case 1:
159      case GL_LUMINANCE:
160      case GL_LUMINANCE4:
161      case GL_LUMINANCE8:
162	 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
163	 break;
164
165      case GL_LUMINANCE12:
166      case GL_LUMINANCE16:
167	 RETURN_IF_SUPPORTED(MESA_FORMAT_L16);
168	 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
169	 break;
170
171      /* Luminance/Alpha formats */
172      case GL_LUMINANCE4_ALPHA4:
173	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL44);
174	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
175	 break;
176
177      case 2:
178      case GL_LUMINANCE_ALPHA:
179      case GL_LUMINANCE6_ALPHA2:
180      case GL_LUMINANCE8_ALPHA8:
181	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
182	 break;
183
184      case GL_LUMINANCE12_ALPHA4:
185      case GL_LUMINANCE12_ALPHA12:
186      case GL_LUMINANCE16_ALPHA16:
187	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL1616);
188	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
189	 break;
190
191      case GL_INTENSITY:
192      case GL_INTENSITY4:
193      case GL_INTENSITY8:
194	 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
195	 break;
196
197      case GL_INTENSITY12:
198      case GL_INTENSITY16:
199	 RETURN_IF_SUPPORTED(MESA_FORMAT_I16);
200	 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
201	 break;
202
203      default:
204         ; /* fallthrough */
205   }
206
207   if (ctx->Extensions.ARB_depth_texture) {
208      switch (internalFormat) {
209         case GL_DEPTH_COMPONENT:
210         case GL_DEPTH_COMPONENT24:
211         case GL_DEPTH_COMPONENT32:
212	    RETURN_IF_SUPPORTED(MESA_FORMAT_Z32);
213	    RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24);
214	    RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
215	    break;
216         case GL_DEPTH_COMPONENT16:
217	    RETURN_IF_SUPPORTED(MESA_FORMAT_Z16);
218	    RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24);
219	    RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
220         default:
221            ; /* fallthrough */
222      }
223   }
224
225   switch (internalFormat) {
226      case GL_COMPRESSED_ALPHA_ARB:
227	 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
228	 break;
229      case GL_COMPRESSED_LUMINANCE_ARB:
230	 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
231	 break;
232      case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
233	 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
234	 break;
235      case GL_COMPRESSED_INTENSITY_ARB:
236	 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
237	 break;
238      case GL_COMPRESSED_RGB_ARB:
239         if (ctx->Extensions.EXT_texture_compression_s3tc ||
240             ctx->Extensions.S3_s3tc)
241	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
242         if (ctx->Extensions.TDFX_texture_compression_FXT1)
243	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
244	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
245	 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
246	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
247	 break;
248      case GL_COMPRESSED_RGBA_ARB:
249         if (ctx->Extensions.EXT_texture_compression_s3tc ||
250             ctx->Extensions.S3_s3tc)
251	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
252         if (ctx->Extensions.TDFX_texture_compression_FXT1)
253	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
254	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
255	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
256	 break;
257      default:
258         ; /* fallthrough */
259   }
260
261   if (ctx->Extensions.MESA_ycbcr_texture) {
262      if (internalFormat == GL_YCBCR_MESA) {
263         if (type == GL_UNSIGNED_SHORT_8_8_MESA)
264	    RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR);
265         else
266	    RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
267      }
268   }
269
270#if FEATURE_texture_fxt1
271   if (ctx->Extensions.TDFX_texture_compression_FXT1) {
272      switch (internalFormat) {
273         case GL_COMPRESSED_RGB_FXT1_3DFX:
274	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
275	 break;
276         case GL_COMPRESSED_RGBA_FXT1_3DFX:
277	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
278	 break;
279         default:
280            ; /* fallthrough */
281      }
282   }
283#endif
284
285#if FEATURE_texture_s3tc
286   if (ctx->Extensions.EXT_texture_compression_s3tc) {
287      switch (internalFormat) {
288         case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
289	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
290	    break;
291         case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
292	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT1);
293	    break;
294         case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
295	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
296	    break;
297         case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
298	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT5);
299	    break;
300         default:
301            ; /* fallthrough */
302      }
303   }
304
305   if (ctx->Extensions.S3_s3tc) {
306      switch (internalFormat) {
307         case GL_RGB_S3TC:
308         case GL_RGB4_S3TC:
309	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
310	    break;
311         case GL_RGBA_S3TC:
312         case GL_RGBA4_S3TC:
313	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
314	    break;
315         default:
316            ; /* fallthrough */
317      }
318   }
319#endif
320
321   if (ctx->Extensions.ARB_texture_float) {
322      switch (internalFormat) {
323         case GL_ALPHA16F_ARB:
324	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
325	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
326	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
327	    break;
328         case GL_ALPHA32F_ARB:
329	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
330	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
331	    RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
332	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
333	    break;
334         case GL_LUMINANCE16F_ARB:
335	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
336	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
337	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
338	    break;
339         case GL_LUMINANCE32F_ARB:
340	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
341	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
342	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
343	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
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	    RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
354	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
355	    break;
356         case GL_INTENSITY16F_ARB:
357	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
358	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
359	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
360	    break;
361         case GL_INTENSITY32F_ARB:
362	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
363	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
364	    RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
365	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
366	    break;
367         case GL_RGB16F_ARB:
368	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
369	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
370	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
371	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
372	    break;
373         case GL_RGB32F_ARB:
374	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
375	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
376	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
377	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
378	    break;
379         case GL_RGBA16F_ARB:
380	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
381	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
382	    break;
383         case GL_RGBA32F_ARB:
384	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
385	    RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
386	    break;
387         default:
388            ; /* fallthrough */
389      }
390   }
391
392   if (ctx->Extensions.EXT_texture_shared_exponent) {
393      switch (internalFormat) {
394         case GL_RGB9_E5:
395            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]);
396            return MESA_FORMAT_RGB9_E5_FLOAT;
397         default:
398            ; /* fallthrough */
399      }
400   }
401
402   if (ctx->Extensions.EXT_packed_float) {
403      switch (internalFormat) {
404         case GL_R11F_G11F_B10F:
405            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11_G11_B10_FLOAT]);
406            return MESA_FORMAT_R11_G11_B10_FLOAT;
407         default:
408            ; /* fallthrough */
409      }
410   }
411
412   if (ctx->Extensions.EXT_packed_depth_stencil) {
413      switch (internalFormat) {
414         case GL_DEPTH_STENCIL_EXT:
415         case GL_DEPTH24_STENCIL8_EXT:
416	    RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8);
417	    RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
418	    break;
419         default:
420            ; /* fallthrough */
421      }
422   }
423
424   if (ctx->Extensions.ARB_depth_buffer_float) {
425      switch (internalFormat) {
426         case GL_DEPTH_COMPONENT32F:
427            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT]);
428            return MESA_FORMAT_Z32_FLOAT;
429         case GL_DEPTH32F_STENCIL8:
430            ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8]);
431            return MESA_FORMAT_Z32_FLOAT_X24S8;
432         default:
433            ; /* fallthrough */
434      }
435   }
436
437   if (ctx->Extensions.ATI_envmap_bumpmap) {
438      switch (internalFormat) {
439         case GL_DUDV_ATI:
440         case GL_DU8DV8_ATI:
441	    RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8);
442	    break;
443         default:
444            ; /* fallthrough */
445      }
446   }
447
448   if (ctx->Extensions.EXT_texture_snorm) {
449      switch (internalFormat) {
450         case GL_RED_SNORM:
451         case GL_R8_SNORM:
452	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8);
453	    break;
454         case GL_RG_SNORM:
455         case GL_RG8_SNORM:
456	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV);
457	    break;
458         case GL_RGB_SNORM:
459         case GL_RGB8_SNORM:
460	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
461	    /* FALLTHROUGH */
462         case GL_RGBA_SNORM:
463         case GL_RGBA8_SNORM:
464	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
465	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
466	    break;
467         case GL_ALPHA_SNORM:
468         case GL_ALPHA8_SNORM:
469            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8);
470	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
471	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
472            break;
473         case GL_LUMINANCE_SNORM:
474         case GL_LUMINANCE8_SNORM:
475            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8);
476	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
477	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
478	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
479            break;
480         case GL_LUMINANCE_ALPHA_SNORM:
481         case GL_LUMINANCE8_ALPHA8_SNORM:
482            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88);
483	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
484	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
485            break;
486         case GL_INTENSITY_SNORM:
487         case GL_INTENSITY8_SNORM:
488            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8);
489	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
490	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
491            break;
492         case GL_R16_SNORM:
493	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16);
494	    break;
495         case GL_RG16_SNORM:
496	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616);
497	    break;
498         case GL_RGB16_SNORM:
499	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
500	    /* FALLTHROUGH */
501         case GL_RGBA16_SNORM:
502	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
503	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
504	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
505	    break;
506         case GL_ALPHA16_SNORM:
507            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16);
508	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
509	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
510	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
511            break;
512         case GL_LUMINANCE16_SNORM:
513            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16);
514	    /* FALLTHROUGH */
515         case GL_LUMINANCE16_ALPHA16_SNORM:
516            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616);
517	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
518	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
519	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
520            break;
521         case GL_INTENSITY16_SNORM:
522            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16);
523	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
524	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
525	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
526            break;
527         default:
528            ; /* fall-through */
529      }
530   }
531
532#if FEATURE_EXT_texture_sRGB
533   if (ctx->Extensions.EXT_texture_sRGB) {
534      switch (internalFormat) {
535         case GL_SRGB_EXT:
536         case GL_SRGB8_EXT:
537	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
538	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
539	    break;
540         case GL_SRGB_ALPHA_EXT:
541         case GL_SRGB8_ALPHA8_EXT:
542	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
543	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
544	    break;
545         case GL_SLUMINANCE_EXT:
546         case GL_SLUMINANCE8_EXT:
547	    RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
548	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
549	    break;
550         case GL_SLUMINANCE_ALPHA_EXT:
551         case GL_SLUMINANCE8_ALPHA8_EXT:
552	    RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
553	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
554	    break;
555         case GL_COMPRESSED_SLUMINANCE_EXT:
556	    RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
557	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
558	    break;
559         case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
560	    RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
561	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
562	    break;
563         case GL_COMPRESSED_SRGB_EXT:
564#if FEATURE_texture_s3tc
565            if (ctx->Extensions.EXT_texture_compression_s3tc)
566	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
567#endif
568	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
569	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
570	    break;
571         case GL_COMPRESSED_SRGB_ALPHA_EXT:
572#if FEATURE_texture_s3tc
573            if (ctx->Extensions.EXT_texture_compression_s3tc)
574	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
575#endif
576	    RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
577	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
578	    break;
579#if FEATURE_texture_s3tc
580         case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
581            if (ctx->Extensions.EXT_texture_compression_s3tc)
582	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
583	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
584            break;
585         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
586            if (ctx->Extensions.EXT_texture_compression_s3tc)
587	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT1);
588	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
589            break;
590         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
591            if (ctx->Extensions.EXT_texture_compression_s3tc)
592	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3);
593	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
594            break;
595         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
596            if (ctx->Extensions.EXT_texture_compression_s3tc)
597	       RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT5);
598	    RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
599            break;
600#endif
601         default:
602            ; /* fallthrough */
603      }
604   }
605#endif /* FEATURE_EXT_texture_sRGB */
606
607   if (ctx->Extensions.EXT_texture_integer) {
608      switch (internalFormat) {
609      case GL_ALPHA8UI_EXT:
610         RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT8);
611         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
612         break;
613      case GL_ALPHA16UI_EXT:
614         RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT16);
615         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
616         break;
617      case GL_ALPHA32UI_EXT:
618         RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT32);
619         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
620         break;
621      case GL_ALPHA8I_EXT:
622         RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT8);
623         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
624         break;
625      case GL_ALPHA16I_EXT:
626         RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT16);
627         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
628         break;
629      case GL_ALPHA32I_EXT:
630         RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT32);
631         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
632         break;
633      case GL_LUMINANCE8UI_EXT:
634         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT8);
635         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
636         break;
637      case GL_LUMINANCE16UI_EXT:
638         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT16);
639         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
640         break;
641      case GL_LUMINANCE32UI_EXT:
642         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT32);
643         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
644         break;
645      case GL_LUMINANCE8I_EXT:
646         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT8);
647         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
648         break;
649      case GL_LUMINANCE16I_EXT:
650         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT16);
651         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
652         break;
653      case GL_LUMINANCE32I_EXT:
654         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT32);
655         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
656         break;
657      case GL_LUMINANCE_ALPHA8UI_EXT:
658         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT8);
659         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
660         break;
661      case GL_LUMINANCE_ALPHA16UI_EXT:
662         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT16);
663         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
664         break;
665      case GL_LUMINANCE_ALPHA32UI_EXT:
666         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT32);
667         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
668         break;
669      case GL_LUMINANCE_ALPHA8I_EXT:
670         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT8);
671         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
672         break;
673      case GL_LUMINANCE_ALPHA16I_EXT:
674         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT16);
675         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
676         break;
677      case GL_LUMINANCE_ALPHA32I_EXT:
678         RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT32);
679         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
680         break;
681      case GL_INTENSITY8UI_EXT:
682         RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT8);
683         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
684         break;
685      case GL_INTENSITY16UI_EXT:
686         RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT16);
687         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
688         break;
689      case GL_INTENSITY32UI_EXT:
690         RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT32);
691         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
692         break;
693      case GL_INTENSITY8I_EXT:
694         RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT8);
695         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
696         break;
697      case GL_INTENSITY16I_EXT:
698         RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT16);
699         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
700         break;
701      case GL_INTENSITY32I_EXT:
702         RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT32);
703         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
704         break;
705      case GL_RGB8UI_EXT:
706         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8);
707         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
708         break;
709      case GL_RGB16UI_EXT:
710         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16);
711         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
712         break;
713      case GL_RGB32UI_EXT:
714         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32);
715         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
716         break;
717      case GL_RGB8I_EXT:
718         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT8);
719         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
720         break;
721      case GL_RGB16I_EXT:
722         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT16);
723         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
724         break;
725      case GL_RGB32I_EXT:
726         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT32);
727         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
728         break;
729      case GL_RGBA8UI_EXT:
730         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
731         break;
732      case GL_RGBA16UI_EXT:
733         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
734         break;
735      case GL_RGBA32UI_EXT:
736         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
737         break;
738      case GL_RGBA8I_EXT:
739         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
740         break;
741      case GL_RGBA16I_EXT:
742         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
743         break;
744      case GL_RGBA32I_EXT:
745         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
746         break;
747      }
748   }
749
750   if (ctx->Extensions.ARB_texture_rg) {
751      switch (internalFormat) {
752      case GL_R8:
753      case GL_RED:
754	 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
755	 break;
756
757      case GL_COMPRESSED_RED:
758	 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
759	 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
760	 break;
761
762      case GL_R16:
763	 RETURN_IF_SUPPORTED(MESA_FORMAT_R16);
764	 break;
765
766      case GL_RG:
767      case GL_RG8:
768	 RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
769	 break;
770
771      case GL_COMPRESSED_RG:
772	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
773	 RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
774	 break;
775
776      case GL_RG16:
777	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG1616);
778	 break;
779
780      default:
781         ; /* fallthrough */
782      }
783   }
784
785   if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.ARB_texture_float) {
786      switch (internalFormat) {
787      case GL_R16F:
788	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
789	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
790	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
791	 break;
792      case GL_R32F:
793	 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
794	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
795	 break;
796      case GL_RG16F:
797	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
798	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
799	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
800	 break;
801      case GL_RG32F:
802	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
803	 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
804	 break;
805
806      default:
807         ; /* fallthrough */
808      }
809   }
810
811   if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.EXT_texture_integer) {
812      switch (internalFormat) {
813      case GL_R8UI:
814         RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8);
815         break;
816      case GL_RG8UI:
817         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8);
818         break;
819      case GL_R16UI:
820         RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16);
821	 break;
822      case GL_RG16UI:
823	 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16);
824         break;
825      case GL_R32UI:
826         RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32);
827         break;
828      case GL_RG32UI:
829         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32);
830         break;
831      case GL_R8I:
832         RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT8);
833         break;
834      case GL_RG8I:
835         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT8);
836         break;
837      case GL_R16I:
838         RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT16);
839         break;
840      case GL_RG16I:
841         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT16);
842         break;
843      case GL_R32I:
844         RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT32);
845         break;
846      case GL_RG32I:
847         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT32);
848         break;
849      default:
850         break;
851      }
852   }
853
854   if (ctx->Extensions.ARB_texture_rgb10_a2ui) {
855      switch (internalFormat) {
856      case GL_RGB10_A2UI:
857         RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010_UINT);
858         break;
859      default:
860         break;
861      }
862   }
863   /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0).
864    */
865   if (ctx->API != API_OPENGL) {
866      switch (internalFormat) {
867      case GL_BGRA:
868	 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
869	 break;
870
871      default:
872         ; /* fallthrough */
873      }
874   }
875
876   if (ctx->Extensions.ARB_texture_compression_rgtc) {
877      switch (internalFormat) {
878         case GL_COMPRESSED_RED_RGTC1:
879	    RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
880	    break;
881         case GL_COMPRESSED_SIGNED_RED_RGTC1:
882	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RED_RGTC1);
883	    break;
884         case GL_COMPRESSED_RG_RGTC2:
885	    RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
886	    break;
887         case GL_COMPRESSED_SIGNED_RG_RGTC2:
888	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_RGTC2);
889	    break;
890         default:
891            ; /* fallthrough */
892      }
893   }
894
895   if (ctx->Extensions.EXT_texture_compression_latc) {
896      switch (internalFormat) {
897         case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
898            RETURN_IF_SUPPORTED(MESA_FORMAT_L_LATC1);
899            break;
900         case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
901            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L_LATC1);
902            break;
903         case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
904            RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
905            break;
906         case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
907            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_LA_LATC2);
908            break;
909         default:
910            ; /* fallthrough */
911      }
912   }
913
914   if (ctx->Extensions.ATI_texture_compression_3dc) {
915      switch (internalFormat) {
916         case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
917            RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
918            break;
919         default:
920            ; /* fallthrough */
921      }
922   }
923
924   if (ctx->Extensions.OES_compressed_ETC1_RGB8_texture) {
925      switch (internalFormat) {
926         case GL_ETC1_RGB8_OES:
927            RETURN_IF_SUPPORTED(MESA_FORMAT_ETC1_RGB8);
928            break;
929         default:
930            ; /* fallthrough */
931      }
932   }
933
934   _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()",
935                 _mesa_lookup_enum_by_nr(internalFormat));
936   return MESA_FORMAT_NONE;
937}
938
939