texformat.c revision 4000c0112a49c28793844f454278b50e00943173
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_B4G4R4A4_UNORM);
74      } else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
75         RETURN_IF_SUPPORTED(MESA_FORMAT_B5G5R5A1_UNORM);
76      } else if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
77         RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM);
78      }
79      /* fallthrough */
80
81   case GL_RGBA8:
82      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_UNORM);
83      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM);
84      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
85      break;
86   case GL_RGB5_A1:
87      RETURN_IF_SUPPORTED(MESA_FORMAT_B5G5R5A1_UNORM);
88      break;
89   case GL_RGBA2:
90      RETURN_IF_SUPPORTED(MESA_FORMAT_A4R4G4B4_UNORM); /* just to test another format*/
91      RETURN_IF_SUPPORTED(MESA_FORMAT_B4G4R4A4_UNORM);
92      break;
93   case GL_RGBA4:
94      RETURN_IF_SUPPORTED(MESA_FORMAT_B4G4R4A4_UNORM);
95      break;
96
97   /* deep RGBA formats */
98   case GL_RGB10_A2:
99      RETURN_IF_SUPPORTED(MESA_FORMAT_R10G10B10A2_UNORM);
100      RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM);
101      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
102      break;
103   case GL_RGBA12:
104   case GL_RGBA16:
105      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UNORM16);
106      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UNORM16);
107      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM);
108      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
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_B10G10R10A2_UNORM);
116      }
117      /* fallthrough */
118   case GL_RGB8:
119      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UNORM8);
120      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_UNORM);
121      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_UNORM);
122
123      RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8);
124      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM);
125      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
126      break;
127   case GL_R3_G3_B2:
128      RETURN_IF_SUPPORTED(MESA_FORMAT_B2G3R3_UNORM);
129      RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM);
130      RETURN_IF_SUPPORTED(MESA_FORMAT_R5G6B5_UNORM);
131      RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8);
132      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM);
133      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
134      break;
135   case GL_RGB4:
136      RETURN_IF_SUPPORTED(MESA_FORMAT_R5G6B5_UNORM); /* just to test another format */
137      RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM);
138      break;
139   case GL_RGB5:
140      RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM);
141      break;
142
143   /* deep RGB formats */
144   case GL_RGB10:
145   case GL_RGB12:
146   case GL_RGB16:
147      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UNORM16);
148      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UNORM16);
149      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM);
150      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
151      break;
152
153   /* Alpha formats */
154   case GL_ALPHA:
155   case GL_ALPHA4:
156   case GL_ALPHA8:
157      RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM8);
158      break;
159
160   case GL_ALPHA12:
161   case GL_ALPHA16:
162      RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM16);
163      RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM8);
164      break;
165
166   /* Luminance formats */
167   case 1:
168   case GL_LUMINANCE:
169   case GL_LUMINANCE4:
170   case GL_LUMINANCE8:
171      RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM8);
172      break;
173
174   case GL_LUMINANCE12:
175   case GL_LUMINANCE16:
176      RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM16);
177      RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM8);
178      break;
179
180      /* Luminance/Alpha formats */
181   case GL_LUMINANCE4_ALPHA4:
182      RETURN_IF_SUPPORTED(MESA_FORMAT_L4A4_UNORM);
183      RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM);
184      break;
185
186   case 2:
187   case GL_LUMINANCE_ALPHA:
188   case GL_LUMINANCE6_ALPHA2:
189   case GL_LUMINANCE8_ALPHA8:
190      RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM);
191      break;
192
193   case GL_LUMINANCE12_ALPHA4:
194   case GL_LUMINANCE12_ALPHA12:
195   case GL_LUMINANCE16_ALPHA16:
196      RETURN_IF_SUPPORTED(MESA_FORMAT_L16A16_UNORM);
197      RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM);
198      break;
199
200   case GL_INTENSITY:
201   case GL_INTENSITY4:
202   case GL_INTENSITY8:
203      RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM8);
204      break;
205
206   case GL_INTENSITY12:
207   case GL_INTENSITY16:
208      RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM16);
209      RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM8);
210      break;
211
212   case GL_DEPTH_COMPONENT:
213   case GL_DEPTH_COMPONENT24:
214   case GL_DEPTH_COMPONENT32:
215      RETURN_IF_SUPPORTED(MESA_FORMAT_Z_UNORM32);
216      RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_X8_UINT);
217      RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_S8_UINT);
218      break;
219   case GL_DEPTH_COMPONENT16:
220      RETURN_IF_SUPPORTED(MESA_FORMAT_Z_UNORM16);
221      RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_X8_UINT);
222      RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_S8_UINT);
223      break;
224
225   case GL_COMPRESSED_ALPHA_ARB:
226      RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM8);
227      break;
228   case GL_COMPRESSED_LUMINANCE_ARB:
229      RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM8);
230      break;
231   case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
232      RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM);
233      break;
234   case GL_COMPRESSED_INTENSITY_ARB:
235      RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM8);
236      break;
237   case GL_COMPRESSED_RGB_ARB:
238      /* We don't use texture compression for 1D and 1D array textures.
239       * For 1D textures, compressions doesn't buy us much.
240       * For 1D ARRAY textures, there's complicated issues with updating
241       * sub-regions on non-block boundaries with glCopyTexSubImage, among
242       * other issues.  FWIW, the GL_EXT_texture_array extension prohibits
243       * 1D ARRAY textures in S3TC format.
244       */
245      if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
246         if (ctx->Mesa_DXTn)
247            RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
248         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
249      }
250      RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8);
251      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM);
252      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
253      break;
254   case GL_COMPRESSED_RGBA_ARB:
255      /* We don't use texture compression for 1D and 1D array textures. */
256      if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
257         if (ctx->Mesa_DXTn)
258            RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
259         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
260      }
261      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM);
262      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
263      break;
264
265   case GL_RGB565:
266      RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM);
267      break;
268
269   case GL_YCBCR_MESA:
270      if (type == GL_UNSIGNED_SHORT_8_8_MESA)
271         RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR);
272      else
273         RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
274      break;
275
276   /* For non-generic compressed format we assert two things:
277    *
278    * 1. The format has already been validated against the set of available
279    *    extensions.
280    *
281    * 2. The driver only enables the extension if it supports all of the
282    *    formats that are part of that extension.
283    */
284   case GL_COMPRESSED_RGB_FXT1_3DFX:
285      return MESA_FORMAT_RGB_FXT1;
286   case GL_COMPRESSED_RGBA_FXT1_3DFX:
287      return MESA_FORMAT_RGBA_FXT1;
288   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
289   case GL_RGB_S3TC:
290   case GL_RGB4_S3TC:
291      return MESA_FORMAT_RGB_DXT1;
292   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
293      return MESA_FORMAT_RGBA_DXT1;
294   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
295   case GL_RGBA_S3TC:
296   case GL_RGBA4_S3TC:
297      return MESA_FORMAT_RGBA_DXT3;
298   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
299      return MESA_FORMAT_RGBA_DXT5;
300   case GL_COMPRESSED_RED_RGTC1:
301      return MESA_FORMAT_R_RGTC1_UNORM;
302   case GL_COMPRESSED_SIGNED_RED_RGTC1:
303      return MESA_FORMAT_R_RGTC1_SNORM;
304   case GL_COMPRESSED_RG_RGTC2:
305      return MESA_FORMAT_RG_RGTC2_UNORM;
306   case GL_COMPRESSED_SIGNED_RG_RGTC2:
307      return MESA_FORMAT_RG_RGTC2_SNORM;
308   case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
309      return MESA_FORMAT_L_LATC1_UNORM;
310   case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
311      return MESA_FORMAT_L_LATC1_SNORM;
312   case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
313      return MESA_FORMAT_LA_LATC2_UNORM;
314   case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
315      return MESA_FORMAT_LA_LATC2_SNORM;
316   case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
317      return MESA_FORMAT_LA_LATC2_UNORM;
318   case GL_ETC1_RGB8_OES:
319      return MESA_FORMAT_ETC1_RGB8;
320   case GL_COMPRESSED_RGB8_ETC2:
321      return MESA_FORMAT_ETC2_RGB8;
322   case GL_COMPRESSED_SRGB8_ETC2:
323      return MESA_FORMAT_ETC2_SRGB8;
324   case GL_COMPRESSED_RGBA8_ETC2_EAC:
325      return MESA_FORMAT_ETC2_RGBA8_EAC;
326   case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
327      return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC;
328   case GL_COMPRESSED_R11_EAC:
329      return MESA_FORMAT_ETC2_R11_EAC;
330   case GL_COMPRESSED_RG11_EAC:
331      return MESA_FORMAT_ETC2_RG11_EAC;
332   case GL_COMPRESSED_SIGNED_R11_EAC:
333      return MESA_FORMAT_ETC2_SIGNED_R11_EAC;
334   case GL_COMPRESSED_SIGNED_RG11_EAC:
335      return MESA_FORMAT_ETC2_SIGNED_RG11_EAC;
336   case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
337      return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
338   case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
339      return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
340   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
341      return MESA_FORMAT_SRGB_DXT1;
342   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
343      return MESA_FORMAT_SRGBA_DXT1;
344   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
345      return MESA_FORMAT_SRGBA_DXT3;
346   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
347      return MESA_FORMAT_SRGBA_DXT5;
348
349   case GL_ALPHA16F_ARB:
350      RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT16);
351      RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT32);
352      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
353      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
354      break;
355   case GL_ALPHA32F_ARB:
356      RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT32);
357      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
358      RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT16);
359      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
360      break;
361   case GL_LUMINANCE16F_ARB:
362      RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT16);
363      RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT32);
364      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
365      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
366      break;
367   case GL_LUMINANCE32F_ARB:
368      RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT32);
369      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
370      RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT16);
371      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
372      break;
373   case GL_LUMINANCE_ALPHA16F_ARB:
374      RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT16);
375      RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT32);
376      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
377      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
378      break;
379   case GL_LUMINANCE_ALPHA32F_ARB:
380      RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT32);
381      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
382      RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT16);
383      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
384      break;
385   case GL_INTENSITY16F_ARB:
386      RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT16);
387      RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT32);
388      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
389      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
390      break;
391   case GL_INTENSITY32F_ARB:
392      RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT32);
393      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
394      RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT16);
395      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
396      break;
397   case GL_RGB16F_ARB:
398      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
399      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_FLOAT16);
400      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
401      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
402      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
403      break;
404   case GL_RGB32F_ARB:
405      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
406      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_FLOAT32);
407      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
408      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
409      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
410      break;
411   case GL_RGBA16F_ARB:
412      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
413      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
414      break;
415   case GL_RGBA32F_ARB:
416      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
417      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
418      break;
419
420   case GL_RGB9_E5:
421      /* GL_EXT_texture_shared_exponent -- just one format to support */
422      ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R9G9B9E5_FLOAT]);
423      return MESA_FORMAT_R9G9B9E5_FLOAT;
424
425   case GL_R11F_G11F_B10F:
426      /* GL_EXT_texture_packed_float -- just one format to support */
427      ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11G11B10_FLOAT]);
428      return MESA_FORMAT_R11G11B10_FLOAT;
429
430   case GL_DEPTH_STENCIL_EXT:
431   case GL_DEPTH24_STENCIL8_EXT:
432      RETURN_IF_SUPPORTED(MESA_FORMAT_S8_UINT_Z24_UNORM);
433      RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_S8_UINT);
434      break;
435
436   case GL_DEPTH_COMPONENT32F:
437      ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z_FLOAT32]);
438      return MESA_FORMAT_Z_FLOAT32;
439   case GL_DEPTH32F_STENCIL8:
440      ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_S8X24_UINT]);
441      return MESA_FORMAT_Z32_FLOAT_S8X24_UINT;
442
443   case GL_RED_SNORM:
444   case GL_R8_SNORM:
445      RETURN_IF_SUPPORTED(MESA_FORMAT_R_SNORM8);
446      break;
447   case GL_RG_SNORM:
448   case GL_RG8_SNORM:
449      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8_SNORM);
450      break;
451   case GL_RGB_SNORM:
452   case GL_RGB8_SNORM:
453      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_SNORM);
454      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
455      RETURN_IF_SUPPORTED(MESA_FORMAT_X8B8G8R8_SNORM);
456      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
457      break;
458   case GL_RGBA_SNORM:
459   case GL_RGBA8_SNORM:
460      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
461      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
462      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
463      break;
464   case GL_ALPHA_SNORM:
465   case GL_ALPHA8_SNORM:
466      RETURN_IF_SUPPORTED(MESA_FORMAT_A_SNORM8);
467      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
468      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
469      break;
470   case GL_LUMINANCE_SNORM:
471   case GL_LUMINANCE8_SNORM:
472      RETURN_IF_SUPPORTED(MESA_FORMAT_L_SNORM8);
473      RETURN_IF_SUPPORTED(MESA_FORMAT_X8B8G8R8_SNORM);
474      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
475      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
476      break;
477   case GL_LUMINANCE_ALPHA_SNORM:
478   case GL_LUMINANCE8_ALPHA8_SNORM:
479      RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_SNORM);
480      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
481      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
482      break;
483   case GL_INTENSITY_SNORM:
484   case GL_INTENSITY8_SNORM:
485      RETURN_IF_SUPPORTED(MESA_FORMAT_I_SNORM8);
486      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
487      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
488      break;
489   case GL_R16_SNORM:
490      RETURN_IF_SUPPORTED(MESA_FORMAT_R_SNORM16);
491      break;
492   case GL_RG16_SNORM:
493      RETURN_IF_SUPPORTED(MESA_FORMAT_R16G16_SNORM);
494      break;
495   case GL_RGB16_SNORM:
496      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SNORM16);
497      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SNORM16);
498      /* FALLTHROUGH */
499   case GL_RGBA16_SNORM:
500      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16);
501      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
502      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
503      break;
504   case GL_ALPHA16_SNORM:
505      RETURN_IF_SUPPORTED(MESA_FORMAT_A_SNORM16);
506      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16);
507      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
508      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
509      break;
510   case GL_LUMINANCE16_SNORM:
511      RETURN_IF_SUPPORTED(MESA_FORMAT_L_SNORM16);
512      /* FALLTHROUGH */
513   case GL_LUMINANCE16_ALPHA16_SNORM:
514      RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SNORM16);
515      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16);
516      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
517      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
518      break;
519   case GL_INTENSITY16_SNORM:
520      RETURN_IF_SUPPORTED(MESA_FORMAT_I_SNORM16);
521      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16);
522      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
523      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
524      break;
525
526   case GL_SRGB_EXT:
527   case GL_SRGB8_EXT:
528      /* there is no MESA_FORMAT_RGB_SRGB8 */
529      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_SRGB);
530      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SRGB);
531
532      RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_SRGB8);
533      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
534      break;
535   case GL_SRGB_ALPHA_EXT:
536   case GL_SRGB8_ALPHA8_EXT:
537      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SRGB);
538
539      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SRGB);
540      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
541      break;
542   case GL_SLUMINANCE_EXT:
543   case GL_SLUMINANCE8_EXT:
544      RETURN_IF_SUPPORTED(MESA_FORMAT_L_SRGB8);
545      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
546      break;
547   case GL_SLUMINANCE_ALPHA_EXT:
548   case GL_SLUMINANCE8_ALPHA8_EXT:
549      RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_SRGB);
550      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
551      break;
552   case GL_COMPRESSED_SLUMINANCE_EXT:
553      RETURN_IF_SUPPORTED(MESA_FORMAT_L_SRGB8);
554      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
555      break;
556   case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
557      RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_SRGB);
558      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
559      break;
560   case GL_COMPRESSED_SRGB_EXT:
561      if (ctx->Mesa_DXTn)
562         RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
563      RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_SRGB8);
564      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
565      break;
566   case GL_COMPRESSED_SRGB_ALPHA_EXT:
567      if (ctx->Mesa_DXTn)
568         RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
569      RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SRGB);
570      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
571      break;
572
573   case GL_ALPHA8UI_EXT:
574      RETURN_IF_SUPPORTED(MESA_FORMAT_A_UINT8);
575      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
576      break;
577   case GL_ALPHA16UI_EXT:
578      RETURN_IF_SUPPORTED(MESA_FORMAT_A_UINT16);
579      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
580      break;
581   case GL_ALPHA32UI_EXT:
582      RETURN_IF_SUPPORTED(MESA_FORMAT_A_UINT32);
583      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
584      break;
585   case GL_ALPHA8I_EXT:
586      RETURN_IF_SUPPORTED(MESA_FORMAT_A_SINT8);
587      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8);
588      break;
589   case GL_ALPHA16I_EXT:
590      RETURN_IF_SUPPORTED(MESA_FORMAT_A_SINT16);
591      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16);
592      break;
593   case GL_ALPHA32I_EXT:
594      RETURN_IF_SUPPORTED(MESA_FORMAT_A_SINT32);
595      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32);
596      break;
597   case GL_LUMINANCE8UI_EXT:
598      RETURN_IF_SUPPORTED(MESA_FORMAT_L_UINT8);
599      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
600      break;
601   case GL_LUMINANCE16UI_EXT:
602      RETURN_IF_SUPPORTED(MESA_FORMAT_L_UINT16);
603      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
604      break;
605   case GL_LUMINANCE32UI_EXT:
606      RETURN_IF_SUPPORTED(MESA_FORMAT_L_UINT32);
607      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
608      break;
609   case GL_LUMINANCE8I_EXT:
610      RETURN_IF_SUPPORTED(MESA_FORMAT_L_SINT8);
611      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8);
612      break;
613   case GL_LUMINANCE16I_EXT:
614      RETURN_IF_SUPPORTED(MESA_FORMAT_L_SINT16);
615      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16);
616      break;
617   case GL_LUMINANCE32I_EXT:
618      RETURN_IF_SUPPORTED(MESA_FORMAT_L_SINT32);
619      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32);
620      break;
621   case GL_LUMINANCE_ALPHA8UI_EXT:
622      RETURN_IF_SUPPORTED(MESA_FORMAT_LA_UINT8);
623      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
624      break;
625   case GL_LUMINANCE_ALPHA16UI_EXT:
626      RETURN_IF_SUPPORTED(MESA_FORMAT_LA_UINT16);
627      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
628      break;
629   case GL_LUMINANCE_ALPHA32UI_EXT:
630      RETURN_IF_SUPPORTED(MESA_FORMAT_LA_UINT32);
631      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
632      break;
633   case GL_LUMINANCE_ALPHA8I_EXT:
634      RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SINT8);
635      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8);
636      break;
637   case GL_LUMINANCE_ALPHA16I_EXT:
638      RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SINT16);
639      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16);
640      break;
641   case GL_LUMINANCE_ALPHA32I_EXT:
642      RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SINT32);
643      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32);
644      break;
645   case GL_INTENSITY8UI_EXT:
646      RETURN_IF_SUPPORTED(MESA_FORMAT_I_UINT8);
647      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
648      break;
649   case GL_INTENSITY16UI_EXT:
650      RETURN_IF_SUPPORTED(MESA_FORMAT_I_UINT16);
651      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
652      break;
653   case GL_INTENSITY32UI_EXT:
654      RETURN_IF_SUPPORTED(MESA_FORMAT_I_UINT32);
655      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
656      break;
657   case GL_INTENSITY8I_EXT:
658      RETURN_IF_SUPPORTED(MESA_FORMAT_I_SINT8);
659      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8);
660      break;
661   case GL_INTENSITY16I_EXT:
662      RETURN_IF_SUPPORTED(MESA_FORMAT_I_SINT16);
663      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16);
664      break;
665   case GL_INTENSITY32I_EXT:
666      RETURN_IF_SUPPORTED(MESA_FORMAT_I_SINT32);
667      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32);
668      break;
669
670   case GL_RGB8UI_EXT:
671      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8);
672      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UINT8);
673      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
674      break;
675   case GL_RGB16UI_EXT:
676      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16);
677      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UINT16);
678      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
679      break;
680   case GL_RGB32UI_EXT:
681      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32);
682      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UINT32);
683      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
684      break;
685   case GL_RGB8I_EXT:
686      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SINT8);
687      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SINT8);
688      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8);
689      break;
690   case GL_RGB16I_EXT:
691      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SINT16);
692      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SINT16);
693      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16);
694      break;
695   case GL_RGB32I_EXT:
696      RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SINT32);
697      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SINT32);
698      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32);
699      break;
700   case GL_RGBA8UI_EXT:
701      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
702      break;
703   case GL_RGBA16UI_EXT:
704      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
705      break;
706   case GL_RGBA32UI_EXT:
707      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
708      break;
709   case GL_RGBA8I_EXT:
710      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8);
711      break;
712   case GL_RGBA16I_EXT:
713      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16);
714      break;
715   case GL_RGBA32I_EXT:
716      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32);
717      break;
718
719   case GL_R8:
720   case GL_RED:
721      RETURN_IF_SUPPORTED(MESA_FORMAT_R_UNORM8);
722      break;
723
724   case GL_COMPRESSED_RED:
725      if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
726         RETURN_IF_SUPPORTED(MESA_FORMAT_R_RGTC1_UNORM);
727      RETURN_IF_SUPPORTED(MESA_FORMAT_R_UNORM8);
728      break;
729
730   case GL_R16:
731      RETURN_IF_SUPPORTED(MESA_FORMAT_R_UNORM16);
732      break;
733
734   case GL_RG:
735   case GL_RG8:
736      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8_UNORM);
737      break;
738
739   case GL_COMPRESSED_RG:
740      if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
741         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2_UNORM);
742      RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8_UNORM);
743      break;
744
745   case GL_RG16:
746      RETURN_IF_SUPPORTED(MESA_FORMAT_R16G16_UNORM);
747      break;
748
749   case GL_R16F:
750      RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
751      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
752      RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
753      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
754      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
755      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
756      break;
757   case GL_R32F:
758      RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
759      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
760      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
761      RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
762      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
763      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
764      break;
765   case GL_RG16F:
766      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
767      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
768      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
769      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
770      break;
771   case GL_RG32F:
772      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
773      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
774      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
775      RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
776      break;
777
778   case GL_R8UI:
779      RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8);
780      break;
781   case GL_RG8UI:
782      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8);
783      break;
784   case GL_R16UI:
785      RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16);
786      break;
787   case GL_RG16UI:
788      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16);
789      break;
790   case GL_R32UI:
791      RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32);
792      break;
793   case GL_RG32UI:
794      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32);
795      break;
796   case GL_R8I:
797      RETURN_IF_SUPPORTED(MESA_FORMAT_R_SINT8);
798      break;
799   case GL_RG8I:
800      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_SINT8);
801      break;
802   case GL_R16I:
803      RETURN_IF_SUPPORTED(MESA_FORMAT_R_SINT16);
804      break;
805   case GL_RG16I:
806      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_SINT16);
807      break;
808   case GL_R32I:
809      RETURN_IF_SUPPORTED(MESA_FORMAT_R_SINT32);
810      break;
811   case GL_RG32I:
812      RETURN_IF_SUPPORTED(MESA_FORMAT_RG_SINT32);
813      break;
814
815   case GL_RGB10_A2UI:
816      RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UINT);
817      RETURN_IF_SUPPORTED(MESA_FORMAT_R10G10B10A2_UINT);
818      break;
819
820   case GL_BGRA:
821      RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
822      break;
823   }
824
825   _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()",
826                 _mesa_lookup_enum_by_nr(internalFormat));
827   return MESA_FORMAT_NONE;
828}
829
830GLboolean
831_mesa_tex_target_is_array(GLenum target)
832{
833   switch (target) {
834   case GL_TEXTURE_1D_ARRAY_EXT:
835   case GL_TEXTURE_2D_ARRAY_EXT:
836   case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
837   case GL_TEXTURE_CUBE_MAP_ARRAY:
838      return GL_TRUE;
839   default:
840      return GL_FALSE;
841   }
842}
843