texformat.c revision 71fe9437169cfdafda8814aa814bb85429fb6cfc
1/*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
5 * Copyright (c) 2008-2009 VMware, Inc.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 * 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 "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 target  a texture target (GL_TEXTURE_x)
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 the closest mesa_format for the given format/type arguments
58 *
59 * This is called via dd_function_table::ChooseTextureFormat.  Hardware
60 * drivers may override this function with a specialized version.
61 */
62mesa_format
63_mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
64                        GLint internalFormat, GLenum format, GLenum type)
65{
66   (void) format;
67
68   switch (internalFormat) {
69   /* shallow RGBA formats */
70   case 4:
71   case GL_RGBA:
72      if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
73         RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
74      } else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
75         RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
76      } else if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
77         RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
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      if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
115         RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
116      }
117      /* fallthrough */
118   case GL_RGB8:
119      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
120      RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
121      RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
122      break;
123   case GL_R3_G3_B2:
124      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332);
125      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
126      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV);
127      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
128      RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
129      RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
130      break;
131   case GL_RGB4:
132      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); /* just to test another format */
133      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
134      break;
135   case GL_RGB5:
136      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
137      break;
138
139   /* deep RGB formats */
140   case GL_RGB10:
141   case GL_RGB12:
142   case GL_RGB16:
143      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_UNORM);
144      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
145      RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
146      RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
147      break;
148
149   /* Alpha formats */
150   case GL_ALPHA:
151   case GL_ALPHA4:
152   case GL_ALPHA8:
153      RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
154      break;
155
156   case GL_ALPHA12:
157   case GL_ALPHA16:
158      RETURN_IF_SUPPORTED(MESA_FORMAT_A16);
159      RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
160      break;
161
162   /* Luminance formats */
163   case 1:
164   case GL_LUMINANCE:
165   case GL_LUMINANCE4:
166   case GL_LUMINANCE8:
167      RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
168      break;
169
170   case GL_LUMINANCE12:
171   case GL_LUMINANCE16:
172      RETURN_IF_SUPPORTED(MESA_FORMAT_L16);
173      RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
174      break;
175
176      /* Luminance/Alpha formats */
177   case GL_LUMINANCE4_ALPHA4:
178      RETURN_IF_SUPPORTED(MESA_FORMAT_AL44);
179      RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
180      break;
181
182   case 2:
183   case GL_LUMINANCE_ALPHA:
184   case GL_LUMINANCE6_ALPHA2:
185   case GL_LUMINANCE8_ALPHA8:
186      RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
187      break;
188
189   case GL_LUMINANCE12_ALPHA4:
190   case GL_LUMINANCE12_ALPHA12:
191   case GL_LUMINANCE16_ALPHA16:
192      RETURN_IF_SUPPORTED(MESA_FORMAT_AL1616);
193      RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
194      break;
195
196   case GL_INTENSITY:
197   case GL_INTENSITY4:
198   case GL_INTENSITY8:
199      RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
200      break;
201
202   case GL_INTENSITY12:
203   case GL_INTENSITY16:
204      RETURN_IF_SUPPORTED(MESA_FORMAT_I16);
205      RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
206      break;
207
208   case GL_DEPTH_COMPONENT:
209   case GL_DEPTH_COMPONENT24:
210   case GL_DEPTH_COMPONENT32:
211      RETURN_IF_SUPPORTED(MESA_FORMAT_Z32);
212      RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24);
213      RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
214      break;
215   case GL_DEPTH_COMPONENT16:
216      RETURN_IF_SUPPORTED(MESA_FORMAT_Z16);
217      RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24);
218      RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
219      break;
220
221   case GL_COMPRESSED_ALPHA_ARB:
222      RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
223      break;
224   case GL_COMPRESSED_LUMINANCE_ARB:
225      RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
226      break;
227   case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
228      RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
229      break;
230   case GL_COMPRESSED_INTENSITY_ARB:
231      RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
232      break;
233   case GL_COMPRESSED_RGB_ARB:
234      /* We don't use texture compression for 1D and 1D array textures.
235       * For 1D textures, compressions doesn't buy us much.
236       * For 1D ARRAY textures, there's complicated issues with updating
237       * sub-regions on non-block boundaries with glCopyTexSubImage, among
238       * other issues.  FWIW, the GL_EXT_texture_array extension prohibits
239       * 1D ARRAY textures in S3TC format.
240       */
241      if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
242         if (ctx->Mesa_DXTn)
243            RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
244         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
245      }
246      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
247      RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
248      RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
249      break;
250   case GL_COMPRESSED_RGBA_ARB:
251      /* We don't use texture compression for 1D and 1D array textures. */
252      if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
253         if (ctx->Mesa_DXTn)
254            RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
255         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
256      }
257      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
258      RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
259      break;
260
261   case GL_RGB565:
262      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
263      break;
264
265   case GL_YCBCR_MESA:
266      if (type == GL_UNSIGNED_SHORT_8_8_MESA)
267         RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR);
268      else
269         RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
270      break;
271
272   /* For non-generic compressed format we assert two things:
273    *
274    * 1. The format has already been validated against the set of available
275    *    extensions.
276    *
277    * 2. The driver only enables the extension if it supports all of the
278    *    formats that are part of that extension.
279    */
280   case GL_COMPRESSED_RGB_FXT1_3DFX:
281      return MESA_FORMAT_RGB_FXT1;
282   case GL_COMPRESSED_RGBA_FXT1_3DFX:
283      return MESA_FORMAT_RGBA_FXT1;
284   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
285   case GL_RGB_S3TC:
286   case GL_RGB4_S3TC:
287      return MESA_FORMAT_RGB_DXT1;
288   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
289      return MESA_FORMAT_RGBA_DXT1;
290   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
291   case GL_RGBA_S3TC:
292   case GL_RGBA4_S3TC:
293      return MESA_FORMAT_RGBA_DXT3;
294   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
295      return MESA_FORMAT_RGBA_DXT5;
296   case GL_COMPRESSED_RED_RGTC1:
297      return MESA_FORMAT_RED_RGTC1;
298   case GL_COMPRESSED_SIGNED_RED_RGTC1:
299      return MESA_FORMAT_SIGNED_RED_RGTC1;
300   case GL_COMPRESSED_RG_RGTC2:
301      return MESA_FORMAT_RG_RGTC2;
302   case GL_COMPRESSED_SIGNED_RG_RGTC2:
303      return MESA_FORMAT_SIGNED_RG_RGTC2;
304   case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
305      return MESA_FORMAT_L_LATC1;
306   case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
307      return MESA_FORMAT_SIGNED_L_LATC1;
308   case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
309      return MESA_FORMAT_LA_LATC2;
310   case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
311      return MESA_FORMAT_SIGNED_LA_LATC2;
312   case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
313      return MESA_FORMAT_LA_LATC2;
314   case GL_ETC1_RGB8_OES:
315      return MESA_FORMAT_ETC1_RGB8;
316   case GL_COMPRESSED_RGB8_ETC2:
317      return MESA_FORMAT_ETC2_RGB8;
318   case GL_COMPRESSED_SRGB8_ETC2:
319      return MESA_FORMAT_ETC2_SRGB8;
320   case GL_COMPRESSED_RGBA8_ETC2_EAC:
321      return MESA_FORMAT_ETC2_RGBA8_EAC;
322   case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
323      return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC;
324   case GL_COMPRESSED_R11_EAC:
325      return MESA_FORMAT_ETC2_R11_EAC;
326   case GL_COMPRESSED_RG11_EAC:
327      return MESA_FORMAT_ETC2_RG11_EAC;
328   case GL_COMPRESSED_SIGNED_R11_EAC:
329      return MESA_FORMAT_ETC2_SIGNED_R11_EAC;
330   case GL_COMPRESSED_SIGNED_RG11_EAC:
331      return MESA_FORMAT_ETC2_SIGNED_RG11_EAC;
332   case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
333      return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
334   case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
335      return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
336   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
337      return MESA_FORMAT_SRGB_DXT1;
338   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
339      return MESA_FORMAT_SRGBA_DXT1;
340   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
341      return MESA_FORMAT_SRGBA_DXT3;
342   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
343      return MESA_FORMAT_SRGBA_DXT5;
344
345   case GL_ALPHA16F_ARB:
346      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
347      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
348      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
349      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
350      break;
351   case GL_ALPHA32F_ARB:
352      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
353      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
354      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
355      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
356      break;
357   case GL_LUMINANCE16F_ARB:
358      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
359      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
360      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
361      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
362      break;
363   case GL_LUMINANCE32F_ARB:
364      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
365      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
366      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
367      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
368      break;
369   case GL_LUMINANCE_ALPHA16F_ARB:
370      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
371      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
372      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
373      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
374      break;
375   case GL_LUMINANCE_ALPHA32F_ARB:
376      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
377      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
378      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
379      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
380      break;
381   case GL_INTENSITY16F_ARB:
382      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
383      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
384      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
385      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
386      break;
387   case GL_INTENSITY32F_ARB:
388      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
389      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
390      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
391      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
392      break;
393   case GL_RGB16F_ARB:
394      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
395      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_FLOAT);
396      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
397      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
398      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
399      break;
400   case GL_RGB32F_ARB:
401      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
402      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR32323232_FLOAT);
403      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
404      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
405      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
406      break;
407   case GL_RGBA16F_ARB:
408      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
409      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
410      break;
411   case GL_RGBA32F_ARB:
412      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
413      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
414      break;
415
416   case GL_RGB9_E5:
417      /* GL_EXT_texture_shared_exponent -- just one format to support */
418      ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]);
419      return MESA_FORMAT_RGB9_E5_FLOAT;
420
421   case GL_R11F_G11F_B10F:
422      /* GL_EXT_texture_packed_float -- just one format to support */
423      ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11_G11_B10_FLOAT]);
424      return MESA_FORMAT_R11_G11_B10_FLOAT;
425
426   case GL_DEPTH_STENCIL_EXT:
427   case GL_DEPTH24_STENCIL8_EXT:
428      RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8);
429      RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
430      break;
431
432   case GL_DEPTH_COMPONENT32F:
433      ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT]);
434      return MESA_FORMAT_Z32_FLOAT;
435   case GL_DEPTH32F_STENCIL8:
436      ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8]);
437      return MESA_FORMAT_Z32_FLOAT_X24S8;
438
439   case GL_DUDV_ATI:
440   case GL_DU8DV8_ATI:
441      RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8);
442      break;
443
444   case GL_RED_SNORM:
445   case GL_R8_SNORM:
446      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8);
447      break;
448   case GL_RG_SNORM:
449   case GL_RG8_SNORM:
450      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV);
451      break;
452   case GL_RGB_SNORM:
453   case GL_RGB8_SNORM:
454      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
455      /* FALLTHROUGH */
456   case GL_RGBA_SNORM:
457   case GL_RGBA8_SNORM:
458      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
459      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
460      break;
461   case GL_ALPHA_SNORM:
462   case GL_ALPHA8_SNORM:
463      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8);
464      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
465      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
466      break;
467   case GL_LUMINANCE_SNORM:
468   case GL_LUMINANCE8_SNORM:
469      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8);
470      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
471      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
472      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
473      break;
474   case GL_LUMINANCE_ALPHA_SNORM:
475   case GL_LUMINANCE8_ALPHA8_SNORM:
476      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88);
477      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
478      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
479      break;
480   case GL_INTENSITY_SNORM:
481   case GL_INTENSITY8_SNORM:
482      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8);
483      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
484      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
485      break;
486   case GL_R16_SNORM:
487      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16);
488      break;
489   case GL_RG16_SNORM:
490      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616);
491      break;
492   case GL_RGB16_SNORM:
493      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
494      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_SNORM);
495      /* FALLTHROUGH */
496   case GL_RGBA16_SNORM:
497      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
498      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
499      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
500      break;
501   case GL_ALPHA16_SNORM:
502      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16);
503      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
504      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
505      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
506      break;
507   case GL_LUMINANCE16_SNORM:
508      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16);
509      /* FALLTHROUGH */
510   case GL_LUMINANCE16_ALPHA16_SNORM:
511      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616);
512      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
513      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
514      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
515      break;
516   case GL_INTENSITY16_SNORM:
517      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16);
518      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
519      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
520      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
521      break;
522
523   case GL_SRGB_EXT:
524   case GL_SRGB8_EXT:
525      RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
526      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
527      break;
528   case GL_SRGB_ALPHA_EXT:
529   case GL_SRGB8_ALPHA8_EXT:
530      RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
531      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
532      break;
533   case GL_SLUMINANCE_EXT:
534   case GL_SLUMINANCE8_EXT:
535      RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
536      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
537      break;
538   case GL_SLUMINANCE_ALPHA_EXT:
539   case GL_SLUMINANCE8_ALPHA8_EXT:
540      RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
541      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
542      break;
543   case GL_COMPRESSED_SLUMINANCE_EXT:
544      RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
545      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
546      break;
547   case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
548      RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
549      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
550      break;
551   case GL_COMPRESSED_SRGB_EXT:
552      if (ctx->Mesa_DXTn)
553         RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
554      RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
555      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
556      break;
557   case GL_COMPRESSED_SRGB_ALPHA_EXT:
558      if (ctx->Mesa_DXTn)
559         RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
560      RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
561      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
562      break;
563
564   case GL_ALPHA8UI_EXT:
565      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT8);
566      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
567      break;
568   case GL_ALPHA16UI_EXT:
569      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT16);
570      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
571      break;
572   case GL_ALPHA32UI_EXT:
573      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT32);
574      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
575      break;
576   case GL_ALPHA8I_EXT:
577      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT8);
578      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
579      break;
580   case GL_ALPHA16I_EXT:
581      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT16);
582      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
583      break;
584   case GL_ALPHA32I_EXT:
585      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT32);
586      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
587      break;
588   case GL_LUMINANCE8UI_EXT:
589      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT8);
590      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
591      break;
592   case GL_LUMINANCE16UI_EXT:
593      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT16);
594      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
595      break;
596   case GL_LUMINANCE32UI_EXT:
597      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT32);
598      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
599      break;
600   case GL_LUMINANCE8I_EXT:
601      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT8);
602      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
603      break;
604   case GL_LUMINANCE16I_EXT:
605      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT16);
606      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
607      break;
608   case GL_LUMINANCE32I_EXT:
609      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT32);
610      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
611      break;
612   case GL_LUMINANCE_ALPHA8UI_EXT:
613      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT8);
614      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
615      break;
616   case GL_LUMINANCE_ALPHA16UI_EXT:
617      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT16);
618      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
619      break;
620   case GL_LUMINANCE_ALPHA32UI_EXT:
621      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT32);
622      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
623      break;
624   case GL_LUMINANCE_ALPHA8I_EXT:
625      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT8);
626      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
627      break;
628   case GL_LUMINANCE_ALPHA16I_EXT:
629      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT16);
630      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
631      break;
632   case GL_LUMINANCE_ALPHA32I_EXT:
633      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT32);
634      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
635      break;
636   case GL_INTENSITY8UI_EXT:
637      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT8);
638      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
639      break;
640   case GL_INTENSITY16UI_EXT:
641      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT16);
642      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
643      break;
644   case GL_INTENSITY32UI_EXT:
645      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT32);
646      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
647      break;
648   case GL_INTENSITY8I_EXT:
649      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT8);
650      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
651      break;
652   case GL_INTENSITY16I_EXT:
653      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT16);
654      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
655      break;
656   case GL_INTENSITY32I_EXT:
657      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT32);
658      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
659      break;
660
661   case GL_RGB8UI_EXT:
662      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8);
663      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR8888_UINT);
664      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
665      break;
666   case GL_RGB16UI_EXT:
667      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16);
668      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_UINT);
669      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
670      break;
671   case GL_RGB32UI_EXT:
672      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32);
673      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR32323232_UINT);
674      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
675      break;
676   case GL_RGB8I_EXT:
677      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT8);
678      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR8888_SINT);
679      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
680      break;
681   case GL_RGB16I_EXT:
682      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT16);
683      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_SINT);
684      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
685      break;
686   case GL_RGB32I_EXT:
687      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT32);
688      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR32323232_SINT);
689      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
690      break;
691   case GL_RGBA8UI_EXT:
692      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
693      break;
694   case GL_RGBA16UI_EXT:
695      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
696      break;
697   case GL_RGBA32UI_EXT:
698      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
699      break;
700   case GL_RGBA8I_EXT:
701      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
702      break;
703   case GL_RGBA16I_EXT:
704      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
705      break;
706   case GL_RGBA32I_EXT:
707      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
708      break;
709
710   case GL_R8:
711   case GL_RED:
712      RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
713      break;
714
715   case GL_COMPRESSED_RED:
716      if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
717         RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
718      RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
719      break;
720
721   case GL_R16:
722      RETURN_IF_SUPPORTED(MESA_FORMAT_R16);
723      break;
724
725   case GL_RG:
726   case GL_RG8:
727      RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
728      break;
729
730   case GL_COMPRESSED_RG:
731      if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
732         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
733      RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
734      break;
735
736   case GL_RG16:
737      RETURN_IF_SUPPORTED(MESA_FORMAT_GR1616);
738      break;
739
740   case GL_R16F:
741      RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
742      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
743      RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
744      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
745      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
746      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
747      break;
748   case GL_R32F:
749      RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
750      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
751      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
752      RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
753      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
754      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
755      break;
756   case GL_RG16F:
757      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
758      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
759      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
760      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
761      break;
762   case GL_RG32F:
763      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
764      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
765      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
766      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
767      break;
768
769   case GL_R8UI:
770      RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8);
771      break;
772   case GL_RG8UI:
773      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8);
774      break;
775   case GL_R16UI:
776      RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16);
777      break;
778   case GL_RG16UI:
779      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16);
780      break;
781   case GL_R32UI:
782      RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32);
783      break;
784   case GL_RG32UI:
785      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32);
786      break;
787   case GL_R8I:
788      RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT8);
789      break;
790   case GL_RG8I:
791      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT8);
792      break;
793   case GL_R16I:
794      RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT16);
795      break;
796   case GL_RG16I:
797      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT16);
798      break;
799   case GL_R32I:
800      RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT32);
801      break;
802   case GL_RG32I:
803      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT32);
804      break;
805
806   case GL_RGB10_A2UI:
807      RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010_UINT);
808      RETURN_IF_SUPPORTED(MESA_FORMAT_ABGR2101010_UINT);
809      break;
810
811   case GL_BGRA:
812      RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
813      break;
814   }
815
816   _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()",
817                 _mesa_lookup_enum_by_nr(internalFormat));
818   return MESA_FORMAT_NONE;
819}
820
821GLboolean
822_mesa_tex_target_is_array(GLenum target)
823{
824   switch (target) {
825   case GL_TEXTURE_1D_ARRAY_EXT:
826   case GL_TEXTURE_2D_ARRAY_EXT:
827   case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
828   case GL_TEXTURE_CUBE_MAP_ARRAY:
829      return GL_TRUE;
830   default:
831      return GL_FALSE;
832   }
833}
834