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