mesa: remove incorrect (float) cast in mipmap do_row()
[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, GLint internalFormat,
65 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 if (ctx->Extensions.EXT_texture_compression_s3tc ||
240 ctx->Extensions.S3_s3tc)
241 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
242 if (ctx->Extensions.TDFX_texture_compression_FXT1)
243 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
244 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
245 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
246 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
247 break;
248 case GL_COMPRESSED_RGBA_ARB:
249 if (ctx->Extensions.EXT_texture_compression_s3tc ||
250 ctx->Extensions.S3_s3tc)
251 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
252 if (ctx->Extensions.TDFX_texture_compression_FXT1)
253 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
254 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
255 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
256 break;
257 default:
258 ; /* fallthrough */
259 }
260
261 if (ctx->Extensions.MESA_ycbcr_texture) {
262 if (internalFormat == GL_YCBCR_MESA) {
263 if (type == GL_UNSIGNED_SHORT_8_8_MESA)
264 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR);
265 else
266 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
267 }
268 }
269
270 #if FEATURE_texture_fxt1
271 if (ctx->Extensions.TDFX_texture_compression_FXT1) {
272 switch (internalFormat) {
273 case GL_COMPRESSED_RGB_FXT1_3DFX:
274 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
275 break;
276 case GL_COMPRESSED_RGBA_FXT1_3DFX:
277 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
278 break;
279 default:
280 ; /* fallthrough */
281 }
282 }
283 #endif
284
285 #if FEATURE_texture_s3tc
286 if (ctx->Extensions.EXT_texture_compression_s3tc) {
287 switch (internalFormat) {
288 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
289 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
290 break;
291 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
292 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT1);
293 break;
294 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
295 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
296 break;
297 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
298 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT5);
299 break;
300 default:
301 ; /* fallthrough */
302 }
303 }
304
305 if (ctx->Extensions.S3_s3tc) {
306 switch (internalFormat) {
307 case GL_RGB_S3TC:
308 case GL_RGB4_S3TC:
309 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
310 break;
311 case GL_RGBA_S3TC:
312 case GL_RGBA4_S3TC:
313 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
314 break;
315 default:
316 ; /* fallthrough */
317 }
318 }
319 #endif
320
321 if (ctx->Extensions.ARB_texture_float) {
322 switch (internalFormat) {
323 case GL_ALPHA16F_ARB:
324 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
325 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
326 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
327 break;
328 case GL_ALPHA32F_ARB:
329 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
330 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
331 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
332 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
333 break;
334 case GL_LUMINANCE16F_ARB:
335 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
336 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
337 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
338 break;
339 case GL_LUMINANCE32F_ARB:
340 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
341 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
342 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
343 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
344 break;
345 case GL_LUMINANCE_ALPHA16F_ARB:
346 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
347 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
348 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
349 break;
350 case GL_LUMINANCE_ALPHA32F_ARB:
351 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
352 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
353 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
354 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
355 break;
356 case GL_INTENSITY16F_ARB:
357 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
358 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
359 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
360 break;
361 case GL_INTENSITY32F_ARB:
362 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
363 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
364 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
365 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
366 break;
367 case GL_RGB16F_ARB:
368 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
369 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
370 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
371 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
372 break;
373 case GL_RGB32F_ARB:
374 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
375 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
376 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
377 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
378 break;
379 case GL_RGBA16F_ARB:
380 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
381 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
382 break;
383 case GL_RGBA32F_ARB:
384 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
385 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
386 break;
387 default:
388 ; /* fallthrough */
389 }
390 }
391
392 if (ctx->Extensions.EXT_texture_shared_exponent) {
393 switch (internalFormat) {
394 case GL_RGB9_E5:
395 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]);
396 return MESA_FORMAT_RGB9_E5_FLOAT;
397 default:
398 ; /* fallthrough */
399 }
400 }
401
402 if (ctx->Extensions.EXT_packed_float) {
403 switch (internalFormat) {
404 case GL_R11F_G11F_B10F:
405 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11_G11_B10_FLOAT]);
406 return MESA_FORMAT_R11_G11_B10_FLOAT;
407 default:
408 ; /* fallthrough */
409 }
410 }
411
412 if (ctx->Extensions.EXT_packed_depth_stencil) {
413 switch (internalFormat) {
414 case GL_DEPTH_STENCIL_EXT:
415 case GL_DEPTH24_STENCIL8_EXT:
416 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8);
417 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
418 break;
419 default:
420 ; /* fallthrough */
421 }
422 }
423
424 if (ctx->Extensions.ARB_depth_buffer_float) {
425 switch (internalFormat) {
426 case GL_DEPTH_COMPONENT32F:
427 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT]);
428 return MESA_FORMAT_Z32_FLOAT;
429 case GL_DEPTH32F_STENCIL8:
430 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8]);
431 return MESA_FORMAT_Z32_FLOAT_X24S8;
432 default:
433 ; /* fallthrough */
434 }
435 }
436
437 if (ctx->Extensions.ATI_envmap_bumpmap) {
438 switch (internalFormat) {
439 case GL_DUDV_ATI:
440 case GL_DU8DV8_ATI:
441 RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8);
442 break;
443 default:
444 ; /* fallthrough */
445 }
446 }
447
448 if (ctx->Extensions.EXT_texture_snorm) {
449 switch (internalFormat) {
450 case GL_RED_SNORM:
451 case GL_R8_SNORM:
452 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8);
453 break;
454 case GL_RG_SNORM:
455 case GL_RG8_SNORM:
456 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV);
457 break;
458 case GL_RGB_SNORM:
459 case GL_RGB8_SNORM:
460 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
461 /* FALLTHROUGH */
462 case GL_RGBA_SNORM:
463 case GL_RGBA8_SNORM:
464 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
465 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
466 break;
467 case GL_ALPHA_SNORM:
468 case GL_ALPHA8_SNORM:
469 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8);
470 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
471 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
472 break;
473 case GL_LUMINANCE_SNORM:
474 case GL_LUMINANCE8_SNORM:
475 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8);
476 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
477 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
478 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
479 break;
480 case GL_LUMINANCE_ALPHA_SNORM:
481 case GL_LUMINANCE8_ALPHA8_SNORM:
482 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88);
483 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
484 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
485 break;
486 case GL_INTENSITY_SNORM:
487 case GL_INTENSITY8_SNORM:
488 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8);
489 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
490 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
491 break;
492 case GL_R16_SNORM:
493 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16);
494 break;
495 case GL_RG16_SNORM:
496 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616);
497 break;
498 case GL_RGB16_SNORM:
499 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
500 /* FALLTHROUGH */
501 case GL_RGBA16_SNORM:
502 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
503 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
504 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
505 break;
506 case GL_ALPHA16_SNORM:
507 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16);
508 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
509 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
510 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
511 break;
512 case GL_LUMINANCE16_SNORM:
513 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16);
514 /* FALLTHROUGH */
515 case GL_LUMINANCE16_ALPHA16_SNORM:
516 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616);
517 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
518 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
519 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
520 break;
521 case GL_INTENSITY16_SNORM:
522 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16);
523 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
524 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
525 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
526 break;
527 default:
528 ; /* fall-through */
529 }
530 }
531
532 #if FEATURE_EXT_texture_sRGB
533 if (ctx->Extensions.EXT_texture_sRGB) {
534 switch (internalFormat) {
535 case GL_SRGB_EXT:
536 case GL_SRGB8_EXT:
537 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
538 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
539 break;
540 case GL_SRGB_ALPHA_EXT:
541 case GL_SRGB8_ALPHA8_EXT:
542 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
543 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
544 break;
545 case GL_SLUMINANCE_EXT:
546 case GL_SLUMINANCE8_EXT:
547 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
548 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
549 break;
550 case GL_SLUMINANCE_ALPHA_EXT:
551 case GL_SLUMINANCE8_ALPHA8_EXT:
552 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
553 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
554 break;
555 case GL_COMPRESSED_SLUMINANCE_EXT:
556 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
557 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
558 break;
559 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
560 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
561 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
562 break;
563 case GL_COMPRESSED_SRGB_EXT:
564 #if FEATURE_texture_s3tc
565 if (ctx->Extensions.EXT_texture_compression_s3tc)
566 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
567 #endif
568 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
569 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
570 break;
571 case GL_COMPRESSED_SRGB_ALPHA_EXT:
572 #if FEATURE_texture_s3tc
573 if (ctx->Extensions.EXT_texture_compression_s3tc)
574 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
575 #endif
576 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
577 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
578 break;
579 #if FEATURE_texture_s3tc
580 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
581 if (ctx->Extensions.EXT_texture_compression_s3tc)
582 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
583 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
584 break;
585 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
586 if (ctx->Extensions.EXT_texture_compression_s3tc)
587 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT1);
588 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
589 break;
590 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
591 if (ctx->Extensions.EXT_texture_compression_s3tc)
592 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3);
593 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
594 break;
595 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
596 if (ctx->Extensions.EXT_texture_compression_s3tc)
597 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT5);
598 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
599 break;
600 #endif
601 default:
602 ; /* fallthrough */
603 }
604 }
605 #endif /* FEATURE_EXT_texture_sRGB */
606
607 if (ctx->Extensions.EXT_texture_integer) {
608 switch (internalFormat) {
609 case GL_ALPHA8UI_EXT:
610 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT8);
611 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
612 break;
613 case GL_ALPHA16UI_EXT:
614 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT16);
615 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
616 break;
617 case GL_ALPHA32UI_EXT:
618 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT32);
619 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
620 break;
621 case GL_ALPHA8I_EXT:
622 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT8);
623 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
624 break;
625 case GL_ALPHA16I_EXT:
626 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT16);
627 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
628 break;
629 case GL_ALPHA32I_EXT:
630 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT32);
631 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
632 break;
633 case GL_LUMINANCE8UI_EXT:
634 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT8);
635 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
636 break;
637 case GL_LUMINANCE16UI_EXT:
638 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT16);
639 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
640 break;
641 case GL_LUMINANCE32UI_EXT:
642 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT32);
643 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
644 break;
645 case GL_LUMINANCE8I_EXT:
646 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT8);
647 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
648 break;
649 case GL_LUMINANCE16I_EXT:
650 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT16);
651 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
652 break;
653 case GL_LUMINANCE32I_EXT:
654 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT32);
655 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
656 break;
657 case GL_LUMINANCE_ALPHA8UI_EXT:
658 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT8);
659 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
660 break;
661 case GL_LUMINANCE_ALPHA16UI_EXT:
662 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT16);
663 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
664 break;
665 case GL_LUMINANCE_ALPHA32UI_EXT:
666 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT32);
667 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
668 break;
669 case GL_LUMINANCE_ALPHA8I_EXT:
670 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT8);
671 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
672 break;
673 case GL_LUMINANCE_ALPHA16I_EXT:
674 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT16);
675 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
676 break;
677 case GL_LUMINANCE_ALPHA32I_EXT:
678 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT32);
679 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
680 break;
681 case GL_INTENSITY8UI_EXT:
682 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT8);
683 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
684 break;
685 case GL_INTENSITY16UI_EXT:
686 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT16);
687 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
688 break;
689 case GL_INTENSITY32UI_EXT:
690 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT32);
691 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
692 break;
693 case GL_INTENSITY8I_EXT:
694 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT8);
695 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
696 break;
697 case GL_INTENSITY16I_EXT:
698 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT16);
699 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
700 break;
701 case GL_INTENSITY32I_EXT:
702 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT32);
703 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
704 break;
705 case GL_RGB8UI_EXT:
706 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8);
707 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
708 break;
709 case GL_RGB16UI_EXT:
710 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16);
711 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
712 break;
713 case GL_RGB32UI_EXT:
714 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32);
715 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
716 break;
717 case GL_RGB8I_EXT:
718 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT8);
719 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
720 break;
721 case GL_RGB16I_EXT:
722 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT16);
723 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
724 break;
725 case GL_RGB32I_EXT:
726 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT32);
727 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
728 break;
729 case GL_RGBA8UI_EXT:
730 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
731 break;
732 case GL_RGBA16UI_EXT:
733 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
734 break;
735 case GL_RGBA32UI_EXT:
736 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
737 break;
738 case GL_RGBA8I_EXT:
739 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
740 break;
741 case GL_RGBA16I_EXT:
742 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
743 break;
744 case GL_RGBA32I_EXT:
745 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
746 break;
747 }
748 }
749
750 if (ctx->Extensions.ARB_texture_rg) {
751 switch (internalFormat) {
752 case GL_R8:
753 case GL_RED:
754 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
755 break;
756
757 case GL_COMPRESSED_RED:
758 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
759 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
760 break;
761
762 case GL_R16:
763 RETURN_IF_SUPPORTED(MESA_FORMAT_R16);
764 break;
765
766 case GL_RG:
767 case GL_RG8:
768 RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
769 break;
770
771 case GL_COMPRESSED_RG:
772 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
773 RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
774 break;
775
776 case GL_RG16:
777 RETURN_IF_SUPPORTED(MESA_FORMAT_RG1616);
778 break;
779
780 default:
781 ; /* fallthrough */
782 }
783 }
784
785 if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.ARB_texture_float) {
786 switch (internalFormat) {
787 case GL_R16F:
788 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
789 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
790 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
791 break;
792 case GL_R32F:
793 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
794 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
795 break;
796 case GL_RG16F:
797 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
798 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
799 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
800 break;
801 case GL_RG32F:
802 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
803 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
804 break;
805
806 default:
807 ; /* fallthrough */
808 }
809 }
810
811 if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.EXT_texture_integer) {
812 switch (internalFormat) {
813 case GL_R8UI:
814 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8);
815 break;
816 case GL_RG8UI:
817 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8);
818 break;
819 case GL_R16UI:
820 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16);
821 break;
822 case GL_RG16UI:
823 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16);
824 break;
825 case GL_R32UI:
826 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32);
827 break;
828 case GL_RG32UI:
829 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32);
830 break;
831 case GL_R8I:
832 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT8);
833 break;
834 case GL_RG8I:
835 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT8);
836 break;
837 case GL_R16I:
838 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT16);
839 break;
840 case GL_RG16I:
841 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT16);
842 break;
843 case GL_R32I:
844 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT32);
845 break;
846 case GL_RG32I:
847 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT32);
848 break;
849 default:
850 break;
851 }
852 }
853
854 if (ctx->Extensions.ARB_texture_rgb10_a2ui) {
855 switch (internalFormat) {
856 case GL_RGB10_A2UI:
857 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010_UINT);
858 break;
859 default:
860 break;
861 }
862 }
863 /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0).
864 */
865 if (ctx->API != API_OPENGL) {
866 switch (internalFormat) {
867 case GL_BGRA:
868 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
869 break;
870
871 default:
872 ; /* fallthrough */
873 }
874 }
875
876 if (ctx->Extensions.ARB_texture_compression_rgtc) {
877 switch (internalFormat) {
878 case GL_COMPRESSED_RED_RGTC1:
879 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
880 break;
881 case GL_COMPRESSED_SIGNED_RED_RGTC1:
882 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RED_RGTC1);
883 break;
884 case GL_COMPRESSED_RG_RGTC2:
885 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
886 break;
887 case GL_COMPRESSED_SIGNED_RG_RGTC2:
888 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_RGTC2);
889 break;
890 default:
891 ; /* fallthrough */
892 }
893 }
894
895 if (ctx->Extensions.EXT_texture_compression_latc) {
896 switch (internalFormat) {
897 case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
898 RETURN_IF_SUPPORTED(MESA_FORMAT_L_LATC1);
899 break;
900 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
901 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L_LATC1);
902 break;
903 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
904 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
905 break;
906 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
907 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_LA_LATC2);
908 break;
909 default:
910 ; /* fallthrough */
911 }
912 }
913
914 if (ctx->Extensions.ATI_texture_compression_3dc) {
915 switch (internalFormat) {
916 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
917 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_LATC2);
918 break;
919 default:
920 ; /* fallthrough */
921 }
922 }
923
924 if (ctx->Extensions.OES_compressed_ETC1_RGB8_texture) {
925 switch (internalFormat) {
926 case GL_ETC1_RGB8_OES:
927 RETURN_IF_SUPPORTED(MESA_FORMAT_ETC1_RGB8);
928 break;
929 default:
930 ; /* fallthrough */
931 }
932 }
933
934 _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()",
935 _mesa_lookup_enum_by_nr(internalFormat));
936 return MESA_FORMAT_NONE;
937 }
938