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