mesa: Add new MESA_FORMATs for ETC2 compressed textures
[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 }
79 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
80 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
81 break;
82
83 case GL_RGBA8:
84 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
85 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
86 break;
87 case GL_RGB5_A1:
88 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
89 break;
90 case GL_RGBA2:
91 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444_REV); /* just to test another format*/
92 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
93 break;
94 case GL_RGBA4:
95 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
96 break;
97
98 /* deep RGBA formats */
99 case GL_RGB10_A2:
100 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
101 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
102 break;
103 case GL_RGBA12:
104 case GL_RGBA16:
105 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
106 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
107 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
108 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
109 break;
110
111 /* shallow RGB formats */
112 case 3:
113 case GL_RGB:
114 case GL_RGB8:
115 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
116 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
117 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
118 break;
119 case GL_R3_G3_B2:
120 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332);
121 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
122 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV);
123 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
124 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
125 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
126 break;
127 case GL_RGB4:
128 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); /* just to test another format */
129 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
130 break;
131 case GL_RGB5:
132 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
133 break;
134
135 /* deep RGB formats */
136 case GL_RGB10:
137 case GL_RGB12:
138 case GL_RGB16:
139 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
140 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
141 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
142 break;
143
144 /* Alpha formats */
145 case GL_ALPHA:
146 case GL_ALPHA4:
147 case GL_ALPHA8:
148 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
149 break;
150
151 case GL_ALPHA12:
152 case GL_ALPHA16:
153 RETURN_IF_SUPPORTED(MESA_FORMAT_A16);
154 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
155 break;
156
157 /* Luminance formats */
158 case 1:
159 case GL_LUMINANCE:
160 case GL_LUMINANCE4:
161 case GL_LUMINANCE8:
162 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
163 break;
164
165 case GL_LUMINANCE12:
166 case GL_LUMINANCE16:
167 RETURN_IF_SUPPORTED(MESA_FORMAT_L16);
168 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
169 break;
170
171 /* Luminance/Alpha formats */
172 case GL_LUMINANCE4_ALPHA4:
173 RETURN_IF_SUPPORTED(MESA_FORMAT_AL44);
174 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
175 break;
176
177 case 2:
178 case GL_LUMINANCE_ALPHA:
179 case GL_LUMINANCE6_ALPHA2:
180 case GL_LUMINANCE8_ALPHA8:
181 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
182 break;
183
184 case GL_LUMINANCE12_ALPHA4:
185 case GL_LUMINANCE12_ALPHA12:
186 case GL_LUMINANCE16_ALPHA16:
187 RETURN_IF_SUPPORTED(MESA_FORMAT_AL1616);
188 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
189 break;
190
191 case GL_INTENSITY:
192 case GL_INTENSITY4:
193 case GL_INTENSITY8:
194 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
195 break;
196
197 case GL_INTENSITY12:
198 case GL_INTENSITY16:
199 RETURN_IF_SUPPORTED(MESA_FORMAT_I16);
200 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
201 break;
202
203 default:
204 ; /* fallthrough */
205 }
206
207 if (ctx->Extensions.ARB_depth_texture) {
208 switch (internalFormat) {
209 case GL_DEPTH_COMPONENT:
210 case GL_DEPTH_COMPONENT24:
211 case GL_DEPTH_COMPONENT32:
212 RETURN_IF_SUPPORTED(MESA_FORMAT_Z32);
213 RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24);
214 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
215 break;
216 case GL_DEPTH_COMPONENT16:
217 RETURN_IF_SUPPORTED(MESA_FORMAT_Z16);
218 RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24);
219 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
220 default:
221 ; /* fallthrough */
222 }
223 }
224
225 switch (internalFormat) {
226 case GL_COMPRESSED_ALPHA_ARB:
227 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
228 break;
229 case GL_COMPRESSED_LUMINANCE_ARB:
230 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
231 break;
232 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
233 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
234 break;
235 case GL_COMPRESSED_INTENSITY_ARB:
236 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
237 break;
238 case GL_COMPRESSED_RGB_ARB:
239 /* We don't use texture compression for 1D and 1D array textures.
240 * For 1D textures, compressions doesn't buy us much.
241 * For 1D ARRAY textures, there's complicated issues with updating
242 * sub-regions on non-block boundaries with glCopyTexSubImage, among
243 * other issues. FWIW, the GL_EXT_texture_array extension prohibits
244 * 1D ARRAY textures in S3TC format.
245 */
246 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
247 if (ctx->Extensions.EXT_texture_compression_s3tc ||
248 ctx->Extensions.S3_s3tc)
249 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
250 if (ctx->Extensions.TDFX_texture_compression_FXT1)
251 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
252 }
253 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
254 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
255 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
256 break;
257 case GL_COMPRESSED_RGBA_ARB:
258 /* We don't use texture compression for 1D and 1D array textures. */
259 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
260 if (ctx->Extensions.EXT_texture_compression_s3tc ||
261 ctx->Extensions.S3_s3tc)
262 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
263 if (ctx->Extensions.TDFX_texture_compression_FXT1)
264 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
265 }
266 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
267 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
268 break;
269 default:
270 ; /* fallthrough */
271 }
272
273 if (ctx->Extensions.ARB_ES2_compatibility) {
274 switch (internalFormat) {
275 case GL_RGB565:
276 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
277 break;
278 default:
279 ; /* fallthrough */
280 }
281 }
282
283 if (ctx->Extensions.MESA_ycbcr_texture) {
284 if (internalFormat == GL_YCBCR_MESA) {
285 if (type == GL_UNSIGNED_SHORT_8_8_MESA)
286 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR);
287 else
288 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
289 }
290 }
291
292 if (ctx->Extensions.TDFX_texture_compression_FXT1) {
293 switch (internalFormat) {
294 case GL_COMPRESSED_RGB_FXT1_3DFX:
295 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
296 break;
297 case GL_COMPRESSED_RGBA_FXT1_3DFX:
298 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
299 break;
300 default:
301 ; /* fallthrough */
302 }
303 }
304
305 if (ctx->Extensions.EXT_texture_compression_s3tc ||
306 (ctx->API == API_OPENGLES2 &&
307 ctx->Extensions.ANGLE_texture_compression_dxt)) {
308 switch (internalFormat) {
309 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
310 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
311 break;
312 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
313 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT1);
314 break;
315 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
316 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
317 break;
318 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
319 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT5);
320 break;
321 default:
322 ; /* fallthrough */
323 }
324 }
325
326 if (ctx->Extensions.S3_s3tc) {
327 switch (internalFormat) {
328 case GL_RGB_S3TC:
329 case GL_RGB4_S3TC:
330 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
331 break;
332 case GL_RGBA_S3TC:
333 case GL_RGBA4_S3TC:
334 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
335 break;
336 default:
337 ; /* fallthrough */
338 }
339 }
340
341 if (ctx->Extensions.ARB_texture_float) {
342 switch (internalFormat) {
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_RGBA_FLOAT16);
394 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
395 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
396 break;
397 case GL_RGB32F_ARB:
398 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
399 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
400 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
401 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
402 break;
403 case GL_RGBA16F_ARB:
404 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
405 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
406 break;
407 case GL_RGBA32F_ARB:
408 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
409 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
410 break;
411 default:
412 ; /* fallthrough */
413 }
414 }
415
416 if (ctx->Extensions.EXT_texture_shared_exponent) {
417 switch (internalFormat) {
418 case GL_RGB9_E5:
419 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]);
420 return MESA_FORMAT_RGB9_E5_FLOAT;
421 default:
422 ; /* fallthrough */
423 }
424 }
425
426 if (ctx->Extensions.EXT_packed_float) {
427 switch (internalFormat) {
428 case GL_R11F_G11F_B10F:
429 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11_G11_B10_FLOAT]);
430 return MESA_FORMAT_R11_G11_B10_FLOAT;
431 default:
432 ; /* fallthrough */
433 }
434 }
435
436 if (ctx->Extensions.EXT_packed_depth_stencil) {
437 switch (internalFormat) {
438 case GL_DEPTH_STENCIL_EXT:
439 case GL_DEPTH24_STENCIL8_EXT:
440 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8);
441 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
442 break;
443 default:
444 ; /* fallthrough */
445 }
446 }
447
448 if (ctx->Extensions.ARB_depth_buffer_float) {
449 switch (internalFormat) {
450 case GL_DEPTH_COMPONENT32F:
451 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT]);
452 return MESA_FORMAT_Z32_FLOAT;
453 case GL_DEPTH32F_STENCIL8:
454 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8]);
455 return MESA_FORMAT_Z32_FLOAT_X24S8;
456 default:
457 ; /* fallthrough */
458 }
459 }
460
461 if (ctx->Extensions.ATI_envmap_bumpmap) {
462 switch (internalFormat) {
463 case GL_DUDV_ATI:
464 case GL_DU8DV8_ATI:
465 RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8);
466 break;
467 default:
468 ; /* fallthrough */
469 }
470 }
471
472 if (ctx->Extensions.EXT_texture_snorm) {
473 switch (internalFormat) {
474 case GL_RED_SNORM:
475 case GL_R8_SNORM:
476 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8);
477 break;
478 case GL_RG_SNORM:
479 case GL_RG8_SNORM:
480 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV);
481 break;
482 case GL_RGB_SNORM:
483 case GL_RGB8_SNORM:
484 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
485 /* FALLTHROUGH */
486 case GL_RGBA_SNORM:
487 case GL_RGBA8_SNORM:
488 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
489 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
490 break;
491 case GL_ALPHA_SNORM:
492 case GL_ALPHA8_SNORM:
493 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8);
494 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
495 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
496 break;
497 case GL_LUMINANCE_SNORM:
498 case GL_LUMINANCE8_SNORM:
499 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8);
500 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
501 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
502 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
503 break;
504 case GL_LUMINANCE_ALPHA_SNORM:
505 case GL_LUMINANCE8_ALPHA8_SNORM:
506 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88);
507 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
508 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
509 break;
510 case GL_INTENSITY_SNORM:
511 case GL_INTENSITY8_SNORM:
512 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8);
513 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
514 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
515 break;
516 case GL_R16_SNORM:
517 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16);
518 break;
519 case GL_RG16_SNORM:
520 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616);
521 break;
522 case GL_RGB16_SNORM:
523 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
524 /* FALLTHROUGH */
525 case GL_RGBA16_SNORM:
526 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
527 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
528 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
529 break;
530 case GL_ALPHA16_SNORM:
531 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16);
532 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
533 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
534 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
535 break;
536 case GL_LUMINANCE16_SNORM:
537 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16);
538 /* FALLTHROUGH */
539 case GL_LUMINANCE16_ALPHA16_SNORM:
540 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616);
541 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
542 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
543 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
544 break;
545 case GL_INTENSITY16_SNORM:
546 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16);
547 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
548 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
549 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
550 break;
551 default:
552 ; /* fall-through */
553 }
554 }
555
556 if (ctx->Extensions.EXT_texture_sRGB) {
557 switch (internalFormat) {
558 case GL_SRGB_EXT:
559 case GL_SRGB8_EXT:
560 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
561 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
562 break;
563 case GL_SRGB_ALPHA_EXT:
564 case GL_SRGB8_ALPHA8_EXT:
565 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
566 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
567 break;
568 case GL_SLUMINANCE_EXT:
569 case GL_SLUMINANCE8_EXT:
570 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
571 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
572 break;
573 case GL_SLUMINANCE_ALPHA_EXT:
574 case GL_SLUMINANCE8_ALPHA8_EXT:
575 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
576 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
577 break;
578 case GL_COMPRESSED_SLUMINANCE_EXT:
579 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
580 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
581 break;
582 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
583 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
584 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
585 break;
586 case GL_COMPRESSED_SRGB_EXT:
587 if (ctx->Extensions.EXT_texture_compression_s3tc)
588 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
589 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
590 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
591 break;
592 case GL_COMPRESSED_SRGB_ALPHA_EXT:
593 if (ctx->Extensions.EXT_texture_compression_s3tc)
594 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
595 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
596 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
597 break;
598 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
599 if (ctx->Extensions.EXT_texture_compression_s3tc)
600 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
601 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
602 break;
603 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
604 if (ctx->Extensions.EXT_texture_compression_s3tc)
605 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT1);
606 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
607 break;
608 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
609 if (ctx->Extensions.EXT_texture_compression_s3tc ||
610 (ctx->API == API_OPENGLES2 &&
611 ctx->Extensions.ANGLE_texture_compression_dxt))
612 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3);
613 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
614 break;
615 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_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_DXT5);
620 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
621 break;
622 default:
623 ; /* fallthrough */
624 }
625 }
626
627 if (ctx->Extensions.EXT_texture_integer) {
628 switch (internalFormat) {
629 case GL_ALPHA8UI_EXT:
630 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT8);
631 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
632 break;
633 case GL_ALPHA16UI_EXT:
634 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT16);
635 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
636 break;
637 case GL_ALPHA32UI_EXT:
638 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT32);
639 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
640 break;
641 case GL_ALPHA8I_EXT:
642 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT8);
643 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
644 break;
645 case GL_ALPHA16I_EXT:
646 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT16);
647 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
648 break;
649 case GL_ALPHA32I_EXT:
650 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT32);
651 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
652 break;
653 case GL_LUMINANCE8UI_EXT:
654 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT8);
655 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
656 break;
657 case GL_LUMINANCE16UI_EXT:
658 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT16);
659 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
660 break;
661 case GL_LUMINANCE32UI_EXT:
662 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT32);
663 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
664 break;
665 case GL_LUMINANCE8I_EXT:
666 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT8);
667 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
668 break;
669 case GL_LUMINANCE16I_EXT:
670 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT16);
671 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
672 break;
673 case GL_LUMINANCE32I_EXT:
674 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT32);
675 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
676 break;
677 case GL_LUMINANCE_ALPHA8UI_EXT:
678 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT8);
679 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
680 break;
681 case GL_LUMINANCE_ALPHA16UI_EXT:
682 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT16);
683 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
684 break;
685 case GL_LUMINANCE_ALPHA32UI_EXT:
686 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT32);
687 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
688 break;
689 case GL_LUMINANCE_ALPHA8I_EXT:
690 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT8);
691 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
692 break;
693 case GL_LUMINANCE_ALPHA16I_EXT:
694 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT16);
695 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
696 break;
697 case GL_LUMINANCE_ALPHA32I_EXT:
698 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT32);
699 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
700 break;
701 case GL_INTENSITY8UI_EXT:
702 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT8);
703 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
704 break;
705 case GL_INTENSITY16UI_EXT:
706 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT16);
707 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
708 break;
709 case GL_INTENSITY32UI_EXT:
710 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT32);
711 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
712 break;
713 case GL_INTENSITY8I_EXT:
714 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT8);
715 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
716 break;
717 case GL_INTENSITY16I_EXT:
718 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT16);
719 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
720 break;
721 case GL_INTENSITY32I_EXT:
722 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT32);
723 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
724 break;
725 }
726 }
727
728 if (ctx->Version >= 30 ||
729 ctx->Extensions.EXT_texture_integer) {
730 switch (internalFormat) {
731 case GL_RGB8UI_EXT:
732 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8);
733 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
734 break;
735 case GL_RGB16UI_EXT:
736 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16);
737 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
738 break;
739 case GL_RGB32UI_EXT:
740 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32);
741 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
742 break;
743 case GL_RGB8I_EXT:
744 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT8);
745 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
746 break;
747 case GL_RGB16I_EXT:
748 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT16);
749 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
750 break;
751 case GL_RGB32I_EXT:
752 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT32);
753 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
754 break;
755 case GL_RGBA8UI_EXT:
756 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
757 break;
758 case GL_RGBA16UI_EXT:
759 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
760 break;
761 case GL_RGBA32UI_EXT:
762 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
763 break;
764 case GL_RGBA8I_EXT:
765 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
766 break;
767 case GL_RGBA16I_EXT:
768 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
769 break;
770 case GL_RGBA32I_EXT:
771 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
772 break;
773 }
774 }
775
776 if (ctx->Extensions.ARB_texture_rg) {
777 switch (internalFormat) {
778 case GL_R8:
779 case GL_RED:
780 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
781 break;
782
783 case GL_COMPRESSED_RED:
784 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
785 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
786 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
787 break;
788
789 case GL_R16:
790 RETURN_IF_SUPPORTED(MESA_FORMAT_R16);
791 break;
792
793 case GL_RG:
794 case GL_RG8:
795 RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
796 break;
797
798 case GL_COMPRESSED_RG:
799 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
800 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
801 RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
802 break;
803
804 case GL_RG16:
805 RETURN_IF_SUPPORTED(MESA_FORMAT_RG1616);
806 break;
807
808 default:
809 ; /* fallthrough */
810 }
811 }
812
813 if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.ARB_texture_float) {
814 switch (internalFormat) {
815 case GL_R16F:
816 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
817 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
818 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
819 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
820 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
821 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
822 break;
823 case GL_R32F:
824 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
825 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
826 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
827 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
828 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
829 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
830 break;
831 case GL_RG16F:
832 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
833 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
834 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
835 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
836 break;
837 case GL_RG32F:
838 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
839 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
840 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
841 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
842 break;
843
844 default:
845 ; /* fallthrough */
846 }
847 }
848
849 if (ctx->Version >= 30 ||
850 (ctx->Extensions.ARB_texture_rg &&
851 ctx->Extensions.EXT_texture_integer)) {
852 switch (internalFormat) {
853 case GL_R8UI:
854 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8);
855 break;
856 case GL_RG8UI:
857 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8);
858 break;
859 case GL_R16UI:
860 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16);
861 break;
862 case GL_RG16UI:
863 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16);
864 break;
865 case GL_R32UI:
866 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32);
867 break;
868 case GL_RG32UI:
869 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32);
870 break;
871 case GL_R8I:
872 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT8);
873 break;
874 case GL_RG8I:
875 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT8);
876 break;
877 case GL_R16I:
878 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT16);
879 break;
880 case GL_RG16I:
881 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT16);
882 break;
883 case GL_R32I:
884 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT32);
885 break;
886 case GL_RG32I:
887 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT32);
888 break;
889 default:
890 break;
891 }
892 }
893
894 if (ctx->Extensions.ARB_texture_rgb10_a2ui) {
895 switch (internalFormat) {
896 case GL_RGB10_A2UI:
897 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010_UINT);
898 RETURN_IF_SUPPORTED(MESA_FORMAT_ABGR2101010_UINT);
899 break;
900 default:
901 break;
902 }
903 }
904 /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0).
905 */
906 if (_mesa_is_gles(ctx)) {
907 switch (internalFormat) {
908 case GL_BGRA:
909 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
910 break;
911
912 default:
913 ; /* fallthrough */
914 }
915 }
916
917 if (ctx->Extensions.ARB_texture_compression_rgtc) {
918 switch (internalFormat) {
919 case GL_COMPRESSED_RED_RGTC1:
920 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
921 break;
922 case GL_COMPRESSED_SIGNED_RED_RGTC1:
923 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RED_RGTC1);
924 break;
925 case GL_COMPRESSED_RG_RGTC2:
926 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
927 break;
928 case GL_COMPRESSED_SIGNED_RG_RGTC2:
929 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_RGTC2);
930 break;
931 default:
932 ; /* fallthrough */
933 }
934 }
935
936 if (ctx->Extensions.EXT_texture_compression_latc) {
937 switch (internalFormat) {
938 case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
939 RETURN_IF_SUPPORTED(MESA_FORMAT_L_LATC1);
940 break;
941 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
942 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L_LATC1);
943 break;
944 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
945 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
946 break;
947 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
948 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_LA_LATC2);
949 break;
950 default:
951 ; /* fallthrough */
952 }
953 }
954
955 if (ctx->Extensions.ATI_texture_compression_3dc) {
956 switch (internalFormat) {
957 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
958 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
959 break;
960 default:
961 ; /* fallthrough */
962 }
963 }
964
965 if (ctx->Extensions.OES_compressed_ETC1_RGB8_texture) {
966 switch (internalFormat) {
967 case GL_ETC1_RGB8_OES:
968 RETURN_IF_SUPPORTED(MESA_FORMAT_ETC1_RGB8);
969 break;
970 default:
971 ; /* fallthrough */
972 }
973 }
974
975 if (_mesa_is_gles3(ctx)) {
976 switch (internalFormat) {
977 case GL_COMPRESSED_RGB8_ETC2:
978 RETURN_IF_SUPPORTED(MESA_FORMAT_ETC2_RGB8);
979 break;
980 case GL_COMPRESSED_SRGB8_ETC2:
981 RETURN_IF_SUPPORTED(MESA_FORMAT_ETC2_SRGB8);
982 break;
983 case GL_COMPRESSED_RGBA8_ETC2_EAC:
984 RETURN_IF_SUPPORTED(MESA_FORMAT_ETC2_RGBA8_EAC);
985 break;
986 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
987 RETURN_IF_SUPPORTED(MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC);
988 break;
989 case GL_COMPRESSED_R11_EAC:
990 RETURN_IF_SUPPORTED(MESA_FORMAT_ETC2_R11_EAC);
991 break;
992 case GL_COMPRESSED_RG11_EAC:
993 RETURN_IF_SUPPORTED(MESA_FORMAT_ETC2_RG11_EAC);
994 break;
995 case GL_COMPRESSED_SIGNED_R11_EAC:
996 RETURN_IF_SUPPORTED(MESA_FORMAT_ETC2_SIGNED_R11_EAC);
997 break;
998 case GL_COMPRESSED_SIGNED_RG11_EAC:
999 RETURN_IF_SUPPORTED(MESA_FORMAT_ETC2_SIGNED_RG11_EAC);
1000 break;
1001 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
1002 RETURN_IF_SUPPORTED(MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1);
1003 break;
1004 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
1005 RETURN_IF_SUPPORTED(MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1);
1006 break;
1007 default:
1008 ; /* fallthrough */
1009 }
1010 }
1011
1012 _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()",
1013 _mesa_lookup_enum_by_nr(internalFormat));
1014 return MESA_FORMAT_NONE;
1015 }
1016