Merge remote-tracking branch 'origin/master' into pipe-video
[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 "mfeatures.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 internalFormat user's prefered internal texture format.
53 * \param format incoming image pixel format.
54 * \param type incoming image data type.
55 *
56 * \return a pointer to a gl_texture_format object which describes the
57 * choosen texture format, or NULL on failure.
58 *
59 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers
60 * will typically override this function with a specialized version.
61 */
62 gl_format
63 _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
64 GLenum format, GLenum type )
65 {
66 (void) format;
67 (void) type;
68
69 switch (internalFormat) {
70 /* shallow RGBA formats */
71 case 4:
72 case GL_RGBA:
73 if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
74 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
75 } else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
76 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
77 }
78 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
79 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
80 break;
81
82 case GL_RGBA8:
83 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
84 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
85 break;
86 case GL_RGB5_A1:
87 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
88 break;
89 case GL_RGBA2:
90 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444_REV); /* just to test another format*/
91 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
92 break;
93 case GL_RGBA4:
94 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
95 break;
96
97 /* deep RGBA formats */
98 case GL_RGB10_A2:
99 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
100 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
101 break;
102 case GL_RGBA12:
103 case GL_RGBA16:
104 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
105 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
106 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
107 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
108 break;
109
110 /* shallow RGB formats */
111 case 3:
112 case GL_RGB:
113 case GL_RGB8:
114 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
115 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
116 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
117 break;
118 case GL_R3_G3_B2:
119 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332);
120 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
121 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
122 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
123 break;
124 case GL_RGB4:
125 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); /* just to test another format */
126 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
127 break;
128 case GL_RGB5:
129 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
130 break;
131
132 /* deep RGB formats */
133 case GL_RGB10:
134 case GL_RGB12:
135 case GL_RGB16:
136 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
137 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
138 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
139 break;
140
141 /* Alpha formats */
142 case GL_ALPHA:
143 case GL_ALPHA4:
144 case GL_ALPHA8:
145 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
146 break;
147
148 case GL_ALPHA12:
149 case GL_ALPHA16:
150 RETURN_IF_SUPPORTED(MESA_FORMAT_A16);
151 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
152 break;
153
154 /* Luminance formats */
155 case 1:
156 case GL_LUMINANCE:
157 case GL_LUMINANCE4:
158 case GL_LUMINANCE8:
159 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
160 break;
161
162 case GL_LUMINANCE12:
163 case GL_LUMINANCE16:
164 RETURN_IF_SUPPORTED(MESA_FORMAT_L16);
165 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
166 break;
167
168 /* Luminance/Alpha formats */
169 case GL_LUMINANCE4_ALPHA4:
170 RETURN_IF_SUPPORTED(MESA_FORMAT_AL44);
171 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
172 break;
173
174 case 2:
175 case GL_LUMINANCE_ALPHA:
176 case GL_LUMINANCE6_ALPHA2:
177 case GL_LUMINANCE8_ALPHA8:
178 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
179 break;
180
181 case GL_LUMINANCE12_ALPHA4:
182 case GL_LUMINANCE12_ALPHA12:
183 case GL_LUMINANCE16_ALPHA16:
184 RETURN_IF_SUPPORTED(MESA_FORMAT_AL1616);
185 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
186 break;
187
188 case GL_INTENSITY:
189 case GL_INTENSITY4:
190 case GL_INTENSITY8:
191 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
192 break;
193
194 case GL_INTENSITY12:
195 case GL_INTENSITY16:
196 RETURN_IF_SUPPORTED(MESA_FORMAT_I16);
197 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
198 break;
199
200 case GL_COLOR_INDEX:
201 case GL_COLOR_INDEX1_EXT:
202 case GL_COLOR_INDEX2_EXT:
203 case GL_COLOR_INDEX4_EXT:
204 case GL_COLOR_INDEX12_EXT:
205 case GL_COLOR_INDEX16_EXT:
206 case GL_COLOR_INDEX8_EXT:
207 RETURN_IF_SUPPORTED(MESA_FORMAT_CI8);
208 break;
209
210 default:
211 ; /* fallthrough */
212 }
213
214 if (ctx->Extensions.ARB_depth_texture) {
215 switch (internalFormat) {
216 case GL_DEPTH_COMPONENT:
217 case GL_DEPTH_COMPONENT24:
218 case GL_DEPTH_COMPONENT32:
219 RETURN_IF_SUPPORTED(MESA_FORMAT_Z32);
220 RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24);
221 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
222 break;
223 case GL_DEPTH_COMPONENT16:
224 RETURN_IF_SUPPORTED(MESA_FORMAT_Z16);
225 RETURN_IF_SUPPORTED(MESA_FORMAT_X8_Z24);
226 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
227 default:
228 ; /* fallthrough */
229 }
230 }
231
232 switch (internalFormat) {
233 case GL_COMPRESSED_ALPHA_ARB:
234 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
235 break;
236 case GL_COMPRESSED_LUMINANCE_ARB:
237 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
238 break;
239 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
240 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
241 break;
242 case GL_COMPRESSED_INTENSITY_ARB:
243 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
244 break;
245 case GL_COMPRESSED_RGB_ARB:
246 if (ctx->Extensions.EXT_texture_compression_s3tc ||
247 ctx->Extensions.S3_s3tc)
248 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
249 if (ctx->Extensions.TDFX_texture_compression_FXT1)
250 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
251 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
252 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
253 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
254 break;
255 case GL_COMPRESSED_RGBA_ARB:
256 if (ctx->Extensions.EXT_texture_compression_s3tc ||
257 ctx->Extensions.S3_s3tc)
258 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
259 if (ctx->Extensions.TDFX_texture_compression_FXT1)
260 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
261 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
262 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
263 break;
264 default:
265 ; /* fallthrough */
266 }
267
268 if (ctx->Extensions.MESA_ycbcr_texture) {
269 if (internalFormat == 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 }
275 }
276
277 #if FEATURE_texture_fxt1
278 if (ctx->Extensions.TDFX_texture_compression_FXT1) {
279 switch (internalFormat) {
280 case GL_COMPRESSED_RGB_FXT1_3DFX:
281 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
282 break;
283 case GL_COMPRESSED_RGBA_FXT1_3DFX:
284 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
285 break;
286 default:
287 ; /* fallthrough */
288 }
289 }
290 #endif
291
292 #if FEATURE_texture_s3tc
293 if (ctx->Extensions.EXT_texture_compression_s3tc) {
294 switch (internalFormat) {
295 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
296 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
297 break;
298 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
299 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT1);
300 break;
301 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
302 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
303 break;
304 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
305 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT5);
306 break;
307 default:
308 ; /* fallthrough */
309 }
310 }
311
312 if (ctx->Extensions.S3_s3tc) {
313 switch (internalFormat) {
314 case GL_RGB_S3TC:
315 case GL_RGB4_S3TC:
316 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
317 break;
318 case GL_RGBA_S3TC:
319 case GL_RGBA4_S3TC:
320 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
321 break;
322 default:
323 ; /* fallthrough */
324 }
325 }
326 #endif
327
328 if (ctx->Extensions.ARB_texture_float) {
329 switch (internalFormat) {
330 case GL_ALPHA16F_ARB:
331 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
332 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
333 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
334 break;
335 case GL_ALPHA32F_ARB:
336 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
337 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
338 break;
339 case GL_LUMINANCE16F_ARB:
340 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
341 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
342 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
343 break;
344 case GL_LUMINANCE32F_ARB:
345 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
346 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
347 break;
348 case GL_LUMINANCE_ALPHA16F_ARB:
349 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
350 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
351 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
352 break;
353 case GL_LUMINANCE_ALPHA32F_ARB:
354 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
355 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
356 break;
357 case GL_INTENSITY16F_ARB:
358 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
359 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
360 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
361 break;
362 case GL_INTENSITY32F_ARB:
363 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
364 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
365 break;
366 case GL_RGB16F_ARB:
367 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
368 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
369 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
370 break;
371 case GL_RGB32F_ARB:
372 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
373 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
374 break;
375 case GL_RGBA16F_ARB:
376 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
377 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
378 break;
379 case GL_RGBA32F_ARB:
380 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
381 break;
382 default:
383 ; /* fallthrough */
384 }
385 }
386
387 if (ctx->Extensions.EXT_texture_shared_exponent) {
388 switch (internalFormat) {
389 case GL_RGB9_E5:
390 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]);
391 return MESA_FORMAT_RGB9_E5_FLOAT;
392 default:
393 ; /* fallthrough */
394 }
395 }
396
397 if (ctx->Extensions.EXT_packed_float) {
398 switch (internalFormat) {
399 case GL_R11F_G11F_B10F:
400 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11_G11_B10_FLOAT]);
401 return MESA_FORMAT_R11_G11_B10_FLOAT;
402 default:
403 ; /* fallthrough */
404 }
405 }
406
407 if (ctx->Extensions.EXT_packed_depth_stencil) {
408 switch (internalFormat) {
409 case GL_DEPTH_STENCIL_EXT:
410 case GL_DEPTH24_STENCIL8_EXT:
411 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8);
412 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
413 break;
414 default:
415 ; /* fallthrough */
416 }
417 }
418
419 if (ctx->Extensions.ARB_depth_buffer_float) {
420 switch (internalFormat) {
421 case GL_DEPTH_COMPONENT32F:
422 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT]);
423 return MESA_FORMAT_Z32_FLOAT;
424 case GL_DEPTH32F_STENCIL8:
425 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8]);
426 return MESA_FORMAT_Z32_FLOAT_X24S8;
427 default:
428 ; /* fallthrough */
429 }
430 }
431
432 if (ctx->Extensions.ATI_envmap_bumpmap) {
433 switch (internalFormat) {
434 case GL_DUDV_ATI:
435 case GL_DU8DV8_ATI:
436 RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8);
437 break;
438 default:
439 ; /* fallthrough */
440 }
441 }
442
443 if (ctx->Extensions.EXT_texture_snorm) {
444 switch (internalFormat) {
445 case GL_RED_SNORM:
446 case GL_R8_SNORM:
447 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8);
448 break;
449 case GL_RG_SNORM:
450 case GL_RG8_SNORM:
451 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV);
452 break;
453 case GL_RGB_SNORM:
454 case GL_RGB8_SNORM:
455 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
456 /* FALLTHROUGH */
457 case GL_RGBA_SNORM:
458 case GL_RGBA8_SNORM:
459 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
460 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
461 break;
462 case GL_ALPHA_SNORM:
463 case GL_ALPHA8_SNORM:
464 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8);
465 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
466 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
467 break;
468 case GL_LUMINANCE_SNORM:
469 case GL_LUMINANCE8_SNORM:
470 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8);
471 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
472 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
473 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
474 break;
475 case GL_LUMINANCE_ALPHA_SNORM:
476 case GL_LUMINANCE8_ALPHA8_SNORM:
477 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88);
478 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
479 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
480 break;
481 case GL_INTENSITY_SNORM:
482 case GL_INTENSITY8_SNORM:
483 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8);
484 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
485 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
486 break;
487 case GL_R16_SNORM:
488 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16);
489 break;
490 case GL_RG16_SNORM:
491 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616);
492 break;
493 case GL_RGB16_SNORM:
494 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
495 /* FALLTHROUGH */
496 case GL_RGBA16_SNORM:
497 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
498 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
499 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
500 break;
501 case GL_ALPHA16_SNORM:
502 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16);
503 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
504 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
505 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
506 break;
507 case GL_LUMINANCE16_SNORM:
508 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16);
509 /* FALLTHROUGH */
510 case GL_LUMINANCE16_ALPHA16_SNORM:
511 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616);
512 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
513 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
514 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
515 break;
516 case GL_INTENSITY16_SNORM:
517 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16);
518 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
519 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
520 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
521 break;
522 default:
523 ; /* fall-through */
524 }
525 }
526
527 #if FEATURE_EXT_texture_sRGB
528 if (ctx->Extensions.EXT_texture_sRGB) {
529 switch (internalFormat) {
530 case GL_SRGB_EXT:
531 case GL_SRGB8_EXT:
532 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
533 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
534 break;
535 case GL_SRGB_ALPHA_EXT:
536 case GL_SRGB8_ALPHA8_EXT:
537 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
538 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
539 break;
540 case GL_SLUMINANCE_EXT:
541 case GL_SLUMINANCE8_EXT:
542 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
543 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
544 break;
545 case GL_SLUMINANCE_ALPHA_EXT:
546 case GL_SLUMINANCE8_ALPHA8_EXT:
547 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
548 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
549 break;
550 case GL_COMPRESSED_SLUMINANCE_EXT:
551 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
552 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
553 break;
554 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
555 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
556 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
557 break;
558 case GL_COMPRESSED_SRGB_EXT:
559 #if FEATURE_texture_s3tc
560 if (ctx->Extensions.EXT_texture_compression_s3tc)
561 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
562 #endif
563 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
564 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
565 break;
566 case GL_COMPRESSED_SRGB_ALPHA_EXT:
567 #if FEATURE_texture_s3tc
568 if (ctx->Extensions.EXT_texture_compression_s3tc)
569 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
570 #endif
571 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
572 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
573 break;
574 #if FEATURE_texture_s3tc
575 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
576 if (ctx->Extensions.EXT_texture_compression_s3tc)
577 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
578 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
579 break;
580 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
581 if (ctx->Extensions.EXT_texture_compression_s3tc)
582 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT1);
583 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
584 break;
585 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
586 if (ctx->Extensions.EXT_texture_compression_s3tc)
587 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3);
588 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
589 break;
590 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
591 if (ctx->Extensions.EXT_texture_compression_s3tc)
592 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT5);
593 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
594 break;
595 #endif
596 default:
597 ; /* fallthrough */
598 }
599 }
600 #endif /* FEATURE_EXT_texture_sRGB */
601
602 if (ctx->Extensions.EXT_texture_integer) {
603 switch (internalFormat) {
604 case GL_RGBA32UI_EXT:
605 case GL_RGB32UI_EXT:
606 case GL_ALPHA32UI_EXT:
607 case GL_INTENSITY32UI_EXT:
608 case GL_LUMINANCE32UI_EXT:
609 case GL_LUMINANCE_ALPHA32UI_EXT:
610 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
611 break;
612 case GL_RGBA16UI_EXT:
613 case GL_RGB16UI_EXT:
614 case GL_ALPHA16UI_EXT:
615 case GL_INTENSITY16UI_EXT:
616 case GL_LUMINANCE16UI_EXT:
617 case GL_LUMINANCE_ALPHA16UI_EXT:
618 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
619 break;
620 case GL_RGBA8UI_EXT:
621 case GL_RGB8UI_EXT:
622 case GL_ALPHA8UI_EXT:
623 case GL_INTENSITY8UI_EXT:
624 case GL_LUMINANCE8UI_EXT:
625 case GL_LUMINANCE_ALPHA8UI_EXT:
626 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
627 break;
628 case GL_RGBA32I_EXT:
629 case GL_RGB32I_EXT:
630 case GL_ALPHA32I_EXT:
631 case GL_INTENSITY32I_EXT:
632 case GL_LUMINANCE32I_EXT:
633 case GL_LUMINANCE_ALPHA32I_EXT:
634 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
635 break;
636 case GL_RGBA16I_EXT:
637 case GL_RGB16I_EXT:
638 case GL_ALPHA16I_EXT:
639 case GL_INTENSITY16I_EXT:
640 case GL_LUMINANCE16I_EXT:
641 case GL_LUMINANCE_ALPHA16I_EXT:
642 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
643 break;
644 case GL_RGBA8I_EXT:
645 case GL_RGB8I_EXT:
646 case GL_ALPHA8I_EXT:
647 case GL_INTENSITY8I_EXT:
648 case GL_LUMINANCE8I_EXT:
649 case GL_LUMINANCE_ALPHA8I_EXT:
650 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
651 break;
652 }
653 }
654
655 if (ctx->Extensions.ARB_texture_rg) {
656 switch (internalFormat) {
657 case GL_R8:
658 case GL_RED:
659 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
660 break;
661
662 case GL_COMPRESSED_RED:
663 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
664 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
665 break;
666
667 case GL_R16:
668 RETURN_IF_SUPPORTED(MESA_FORMAT_R16);
669 break;
670
671 case GL_RG:
672 case GL_RG8:
673 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88);
674 break;
675
676 case GL_COMPRESSED_RG:
677 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
678 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88);
679 break;
680
681 case GL_RG16:
682 RETURN_IF_SUPPORTED(MESA_FORMAT_RG1616);
683 break;
684
685 default:
686 ; /* fallthrough */
687 }
688 }
689
690 if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.ARB_texture_float) {
691 switch (internalFormat) {
692 case GL_R16F:
693 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
694 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
695 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
696 break;
697 case GL_R32F:
698 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
699 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
700 break;
701 case GL_RG16F:
702 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
703 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
704 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
705 break;
706 case GL_RG32F:
707 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
708 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
709 break;
710
711 default:
712 ; /* fallthrough */
713 }
714 }
715
716 if (ctx->Extensions.EXT_texture_format_BGRA8888) {
717 switch (internalFormat) {
718 case GL_BGRA:
719 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
720 break;
721
722 default:
723 ; /* fallthrough */
724 }
725 }
726
727 if (ctx->Extensions.ARB_texture_compression_rgtc) {
728 switch (internalFormat) {
729 case GL_COMPRESSED_RED_RGTC1:
730 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
731 break;
732 case GL_COMPRESSED_SIGNED_RED_RGTC1:
733 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RED_RGTC1);
734 break;
735 case GL_COMPRESSED_RG_RGTC2:
736 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
737 break;
738 case GL_COMPRESSED_SIGNED_RG_RGTC2:
739 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_RGTC2);
740 break;
741 default:
742 ; /* fallthrough */
743 }
744 }
745
746 if (ctx->Extensions.EXT_texture_compression_latc) {
747 switch (internalFormat) {
748 case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
749 RETURN_IF_SUPPORTED(MESA_FORMAT_L_LATC1);
750 break;
751 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
752 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L_LATC1);
753 break;
754 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
755 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
756 break;
757 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
758 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_LA_LATC2);
759 break;
760 default:
761 ; /* fallthrough */
762 }
763 }
764
765 if (ctx->Extensions.ATI_texture_compression_3dc) {
766 switch (internalFormat) {
767 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
768 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
769 break;
770 default:
771 ; /* fallthrough */
772 }
773 }
774
775 _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
776 return MESA_FORMAT_NONE;
777 }
778