texformat.c revision b188467fdf71d8f4c5fab4aafae1253f64d9aab4
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 gl_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 */
62gl_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         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
243         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
244      }
245      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
246      RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
247      RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
248      break;
249   case GL_COMPRESSED_RGBA_ARB:
250      /* We don't use texture compression for 1D and 1D array textures. */
251      if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
252         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
253         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
254      }
255      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
256      RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
257      break;
258
259   case GL_RGB565:
260      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
261      break;
262
263   case GL_YCBCR_MESA:
264      if (type == GL_UNSIGNED_SHORT_8_8_MESA)
265         RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR);
266      else
267         RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
268      break;
269
270   /* For non-generic compressed format we assert two things:
271    *
272    * 1. The format has already been validated against the set of available
273    *    extensions.
274    *
275    * 2. The driver only enables the extension if it supports all of the
276    *    formats that are part of that extension.
277    */
278   case GL_COMPRESSED_RGB_FXT1_3DFX:
279      return MESA_FORMAT_RGB_FXT1;
280   case GL_COMPRESSED_RGBA_FXT1_3DFX:
281      return MESA_FORMAT_RGBA_FXT1;
282   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
283   case GL_RGB_S3TC:
284   case GL_RGB4_S3TC:
285      return MESA_FORMAT_RGB_DXT1;
286   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
287      return MESA_FORMAT_RGBA_DXT1;
288   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
289   case GL_RGBA_S3TC:
290   case GL_RGBA4_S3TC:
291      return MESA_FORMAT_RGBA_DXT3;
292   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
293      return MESA_FORMAT_RGBA_DXT5;
294   case GL_COMPRESSED_RED_RGTC1:
295      return MESA_FORMAT_RED_RGTC1;
296   case GL_COMPRESSED_SIGNED_RED_RGTC1:
297      return MESA_FORMAT_SIGNED_RED_RGTC1;
298   case GL_COMPRESSED_RG_RGTC2:
299      return MESA_FORMAT_RG_RGTC2;
300   case GL_COMPRESSED_SIGNED_RG_RGTC2:
301      return MESA_FORMAT_SIGNED_RG_RGTC2;
302   case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
303      return MESA_FORMAT_L_LATC1;
304   case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
305      return MESA_FORMAT_SIGNED_L_LATC1;
306   case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
307      return MESA_FORMAT_LA_LATC2;
308   case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
309      return MESA_FORMAT_SIGNED_LA_LATC2;
310   case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
311      return MESA_FORMAT_LA_LATC2;
312   case GL_ETC1_RGB8_OES:
313      return MESA_FORMAT_ETC1_RGB8;
314   case GL_COMPRESSED_RGB8_ETC2:
315      return MESA_FORMAT_ETC2_RGB8;
316   case GL_COMPRESSED_SRGB8_ETC2:
317      return MESA_FORMAT_ETC2_SRGB8;
318   case GL_COMPRESSED_RGBA8_ETC2_EAC:
319      return MESA_FORMAT_ETC2_RGBA8_EAC;
320   case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
321      return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC;
322   case GL_COMPRESSED_R11_EAC:
323      return MESA_FORMAT_ETC2_R11_EAC;
324   case GL_COMPRESSED_RG11_EAC:
325      return MESA_FORMAT_ETC2_RG11_EAC;
326   case GL_COMPRESSED_SIGNED_R11_EAC:
327      return MESA_FORMAT_ETC2_SIGNED_R11_EAC;
328   case GL_COMPRESSED_SIGNED_RG11_EAC:
329      return MESA_FORMAT_ETC2_SIGNED_RG11_EAC;
330   case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
331      return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
332   case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
333      return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
334   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
335      return MESA_FORMAT_SRGB_DXT1;
336   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
337      return MESA_FORMAT_SRGBA_DXT1;
338   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
339      return MESA_FORMAT_SRGBA_DXT3;
340   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
341      return MESA_FORMAT_SRGBA_DXT5;
342
343   case GL_ALPHA16F_ARB:
344      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
345      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
346      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
347      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
348      break;
349   case GL_ALPHA32F_ARB:
350      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
351      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
352      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
353      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
354      break;
355   case GL_LUMINANCE16F_ARB:
356      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
357      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
358      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
359      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
360      break;
361   case GL_LUMINANCE32F_ARB:
362      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
363      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
364      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
365      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
366      break;
367   case GL_LUMINANCE_ALPHA16F_ARB:
368      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
369      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
370      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
371      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
372      break;
373   case GL_LUMINANCE_ALPHA32F_ARB:
374      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
375      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
376      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
377      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
378      break;
379   case GL_INTENSITY16F_ARB:
380      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
381      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
382      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
383      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
384      break;
385   case GL_INTENSITY32F_ARB:
386      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
387      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
388      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
389      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
390      break;
391   case GL_RGB16F_ARB:
392      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
393      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_FLOAT);
394      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
395      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
396      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
397      break;
398   case GL_RGB32F_ARB:
399      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
400      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR32323232_FLOAT);
401      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
402      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
403      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
404      break;
405   case GL_RGBA16F_ARB:
406      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
407      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
408      break;
409   case GL_RGBA32F_ARB:
410      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
411      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
412      break;
413
414   case GL_RGB9_E5:
415      /* GL_EXT_texture_shared_exponent -- just one format to support */
416      ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]);
417      return MESA_FORMAT_RGB9_E5_FLOAT;
418
419   case GL_R11F_G11F_B10F:
420      /* GL_EXT_texture_packed_float -- just one format to support */
421      ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11_G11_B10_FLOAT]);
422      return MESA_FORMAT_R11_G11_B10_FLOAT;
423
424   case GL_DEPTH_STENCIL_EXT:
425   case GL_DEPTH24_STENCIL8_EXT:
426      RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8);
427      RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
428      break;
429
430   case GL_DEPTH_COMPONENT32F:
431      ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT]);
432      return MESA_FORMAT_Z32_FLOAT;
433   case GL_DEPTH32F_STENCIL8:
434      ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8]);
435      return MESA_FORMAT_Z32_FLOAT_X24S8;
436
437   case GL_DUDV_ATI:
438   case GL_DU8DV8_ATI:
439      RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8);
440      break;
441
442   case GL_RED_SNORM:
443   case GL_R8_SNORM:
444      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8);
445      break;
446   case GL_RG_SNORM:
447   case GL_RG8_SNORM:
448      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV);
449      break;
450   case GL_RGB_SNORM:
451   case GL_RGB8_SNORM:
452      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
453      /* FALLTHROUGH */
454   case GL_RGBA_SNORM:
455   case GL_RGBA8_SNORM:
456      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
457      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
458      break;
459   case GL_ALPHA_SNORM:
460   case GL_ALPHA8_SNORM:
461      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8);
462      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
463      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
464      break;
465   case GL_LUMINANCE_SNORM:
466   case GL_LUMINANCE8_SNORM:
467      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8);
468      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
469      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
470      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
471      break;
472   case GL_LUMINANCE_ALPHA_SNORM:
473   case GL_LUMINANCE8_ALPHA8_SNORM:
474      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88);
475      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
476      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
477      break;
478   case GL_INTENSITY_SNORM:
479   case GL_INTENSITY8_SNORM:
480      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8);
481      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
482      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
483      break;
484   case GL_R16_SNORM:
485      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16);
486      break;
487   case GL_RG16_SNORM:
488      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616);
489      break;
490   case GL_RGB16_SNORM:
491      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
492      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_SNORM);
493      /* FALLTHROUGH */
494   case GL_RGBA16_SNORM:
495      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
496      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
497      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
498      break;
499   case GL_ALPHA16_SNORM:
500      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16);
501      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
502      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
503      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
504      break;
505   case GL_LUMINANCE16_SNORM:
506      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16);
507      /* FALLTHROUGH */
508   case GL_LUMINANCE16_ALPHA16_SNORM:
509      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616);
510      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
511      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
512      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
513      break;
514   case GL_INTENSITY16_SNORM:
515      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16);
516      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
517      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
518      RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
519      break;
520
521   case GL_SRGB_EXT:
522   case GL_SRGB8_EXT:
523      RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
524      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
525      break;
526   case GL_SRGB_ALPHA_EXT:
527   case GL_SRGB8_ALPHA8_EXT:
528      RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
529      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
530      break;
531   case GL_SLUMINANCE_EXT:
532   case GL_SLUMINANCE8_EXT:
533      RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
534      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
535      break;
536   case GL_SLUMINANCE_ALPHA_EXT:
537   case GL_SLUMINANCE8_ALPHA8_EXT:
538      RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
539      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
540      break;
541   case GL_COMPRESSED_SLUMINANCE_EXT:
542      RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
543      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
544      break;
545   case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
546      RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
547      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
548      break;
549   case GL_COMPRESSED_SRGB_EXT:
550      RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
551      RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
552      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
553      break;
554   case GL_COMPRESSED_SRGB_ALPHA_EXT:
555      RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
556      RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
557      RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
558      break;
559
560   case GL_ALPHA8UI_EXT:
561      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT8);
562      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
563      break;
564   case GL_ALPHA16UI_EXT:
565      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT16);
566      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
567      break;
568   case GL_ALPHA32UI_EXT:
569      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT32);
570      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
571      break;
572   case GL_ALPHA8I_EXT:
573      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT8);
574      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
575      break;
576   case GL_ALPHA16I_EXT:
577      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT16);
578      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
579      break;
580   case GL_ALPHA32I_EXT:
581      RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT32);
582      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
583      break;
584   case GL_LUMINANCE8UI_EXT:
585      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT8);
586      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
587      break;
588   case GL_LUMINANCE16UI_EXT:
589      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT16);
590      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
591      break;
592   case GL_LUMINANCE32UI_EXT:
593      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT32);
594      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
595      break;
596   case GL_LUMINANCE8I_EXT:
597      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT8);
598      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
599      break;
600   case GL_LUMINANCE16I_EXT:
601      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT16);
602      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
603      break;
604   case GL_LUMINANCE32I_EXT:
605      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT32);
606      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
607      break;
608   case GL_LUMINANCE_ALPHA8UI_EXT:
609      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT8);
610      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
611      break;
612   case GL_LUMINANCE_ALPHA16UI_EXT:
613      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT16);
614      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
615      break;
616   case GL_LUMINANCE_ALPHA32UI_EXT:
617      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT32);
618      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
619      break;
620   case GL_LUMINANCE_ALPHA8I_EXT:
621      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT8);
622      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
623      break;
624   case GL_LUMINANCE_ALPHA16I_EXT:
625      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT16);
626      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
627      break;
628   case GL_LUMINANCE_ALPHA32I_EXT:
629      RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT32);
630      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
631      break;
632   case GL_INTENSITY8UI_EXT:
633      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT8);
634      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
635      break;
636   case GL_INTENSITY16UI_EXT:
637      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT16);
638      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
639      break;
640   case GL_INTENSITY32UI_EXT:
641      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT32);
642      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
643      break;
644   case GL_INTENSITY8I_EXT:
645      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT8);
646      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
647      break;
648   case GL_INTENSITY16I_EXT:
649      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT16);
650      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
651      break;
652   case GL_INTENSITY32I_EXT:
653      RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT32);
654      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
655      break;
656
657   case GL_RGB8UI_EXT:
658      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8);
659      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR8888_UINT);
660      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
661      break;
662   case GL_RGB16UI_EXT:
663      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16);
664      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_UINT);
665      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
666      break;
667   case GL_RGB32UI_EXT:
668      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32);
669      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR32323232_UINT);
670      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
671      break;
672   case GL_RGB8I_EXT:
673      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT8);
674      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR8888_SINT);
675      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
676      break;
677   case GL_RGB16I_EXT:
678      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT16);
679      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_SINT);
680      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
681      break;
682   case GL_RGB32I_EXT:
683      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT32);
684      RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR32323232_SINT);
685      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
686      break;
687   case GL_RGBA8UI_EXT:
688      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
689      break;
690   case GL_RGBA16UI_EXT:
691      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
692      break;
693   case GL_RGBA32UI_EXT:
694      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
695      break;
696   case GL_RGBA8I_EXT:
697      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
698      break;
699   case GL_RGBA16I_EXT:
700      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
701      break;
702   case GL_RGBA32I_EXT:
703      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
704      break;
705
706   case GL_R8:
707   case GL_RED:
708      RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
709      break;
710
711   case GL_COMPRESSED_RED:
712      if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
713         RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
714      RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
715      break;
716
717   case GL_R16:
718      RETURN_IF_SUPPORTED(MESA_FORMAT_R16);
719      break;
720
721   case GL_RG:
722   case GL_RG8:
723      RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
724      break;
725
726   case GL_COMPRESSED_RG:
727      if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
728         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
729      RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
730      break;
731
732   case GL_RG16:
733      RETURN_IF_SUPPORTED(MESA_FORMAT_GR1616);
734      break;
735
736   case GL_R16F:
737      RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
738      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
739      RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
740      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
741      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
742      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
743      break;
744   case GL_R32F:
745      RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
746      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
747      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
748      RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
749      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
750      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
751      break;
752   case GL_RG16F:
753      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
754      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
755      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
756      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
757      break;
758   case GL_RG32F:
759      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
760      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
761      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
762      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
763      break;
764
765   case GL_R8UI:
766      RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8);
767      break;
768   case GL_RG8UI:
769      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8);
770      break;
771   case GL_R16UI:
772      RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16);
773      break;
774   case GL_RG16UI:
775      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16);
776      break;
777   case GL_R32UI:
778      RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32);
779      break;
780   case GL_RG32UI:
781      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32);
782      break;
783   case GL_R8I:
784      RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT8);
785      break;
786   case GL_RG8I:
787      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT8);
788      break;
789   case GL_R16I:
790      RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT16);
791      break;
792   case GL_RG16I:
793      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT16);
794      break;
795   case GL_R32I:
796      RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT32);
797      break;
798   case GL_RG32I:
799      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT32);
800      break;
801
802   case GL_RGB10_A2UI:
803      RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010_UINT);
804      RETURN_IF_SUPPORTED(MESA_FORMAT_ABGR2101010_UINT);
805      break;
806
807   case GL_BGRA:
808      RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
809      break;
810   }
811
812   _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()",
813                 _mesa_lookup_enum_by_nr(internalFormat));
814   return MESA_FORMAT_NONE;
815}
816
817GLboolean
818_mesa_tex_target_is_array(GLenum target)
819{
820   switch (target) {
821   case GL_TEXTURE_1D_ARRAY_EXT:
822   case GL_TEXTURE_2D_ARRAY_EXT:
823   case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
824   case GL_TEXTURE_CUBE_MAP_ARRAY:
825      return GL_TRUE;
826   default:
827      return GL_FALSE;
828   }
829}
830