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