mesa: fix hodge podge indentation, update comments in texformat.c
[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 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 * OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
28 /**
29 * \file texformat.c
30 * Texture formats.
31 *
32 * \author Gareth Hughes
33 * \author Brian Paul
34 */
35
36
37 #include "context.h"
38 #include "enums.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 target a texture target (GL_TEXTURE_x)
54 * \param internalFormat user's prefered internal texture format.
55 * \param format incoming image pixel format.
56 * \param type incoming image data type.
57 *
58 * \return the closest gl_format for the given format/type arguments
59 *
60 * This is called via dd_function_table::ChooseTextureFormat. Hardware
61 * drivers may 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
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 } else if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
78 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
79 }
80 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
81 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
82 break;
83
84 case GL_RGBA8:
85 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
86 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
87 break;
88 case GL_RGB5_A1:
89 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
90 break;
91 case GL_RGBA2:
92 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444_REV); /* just to test another format*/
93 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
94 break;
95 case GL_RGBA4:
96 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
97 break;
98
99 /* deep RGBA formats */
100 case GL_RGB10_A2:
101 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
102 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
103 break;
104 case GL_RGBA12:
105 case GL_RGBA16:
106 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
107 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
108 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
109 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
110 break;
111
112 /* shallow RGB formats */
113 case 3:
114 case GL_RGB:
115 if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
116 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
117 }
118 /* fallthrough */
119 case GL_RGB8:
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_R3_G3_B2:
125 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332);
126 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
127 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV);
128 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
129 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
130 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
131 break;
132 case GL_RGB4:
133 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); /* just to test another format */
134 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
135 break;
136 case GL_RGB5:
137 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
138 break;
139
140 /* deep RGB formats */
141 case GL_RGB10:
142 case GL_RGB12:
143 case GL_RGB16:
144 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_UNORM);
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 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 break;
221
222 case GL_COMPRESSED_ALPHA_ARB:
223 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
224 break;
225 case GL_COMPRESSED_LUMINANCE_ARB:
226 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
227 break;
228 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
229 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
230 break;
231 case GL_COMPRESSED_INTENSITY_ARB:
232 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
233 break;
234 case GL_COMPRESSED_RGB_ARB:
235 /* We don't use texture compression for 1D and 1D array textures.
236 * For 1D textures, compressions doesn't buy us much.
237 * For 1D ARRAY textures, there's complicated issues with updating
238 * sub-regions on non-block boundaries with glCopyTexSubImage, among
239 * other issues. FWIW, the GL_EXT_texture_array extension prohibits
240 * 1D ARRAY textures in S3TC format.
241 */
242 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
243 if (ctx->Extensions.EXT_texture_compression_s3tc ||
244 ctx->Extensions.ANGLE_texture_compression_dxt)
245 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
246 if (ctx->Extensions.TDFX_texture_compression_FXT1)
247 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
248 }
249 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
250 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
251 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
252 break;
253 case GL_COMPRESSED_RGBA_ARB:
254 /* We don't use texture compression for 1D and 1D array textures. */
255 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
256 if (ctx->Extensions.EXT_texture_compression_s3tc ||
257 ctx->Extensions.ANGLE_texture_compression_dxt)
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 }
262 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
263 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
264 break;
265
266 case GL_RGB565:
267 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
268 break;
269
270 case GL_YCBCR_MESA:
271 if (type == GL_UNSIGNED_SHORT_8_8_MESA)
272 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR);
273 else
274 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
275 break;
276
277 /* For non-generic compressed format we assert two things:
278 *
279 * 1. The format has already been validated against the set of available
280 * extensions.
281 *
282 * 2. The driver only enables the extension if it supports all of the
283 * formats that are part of that extension.
284 */
285 case GL_COMPRESSED_RGB_FXT1_3DFX:
286 return MESA_FORMAT_RGB_FXT1;
287 case GL_COMPRESSED_RGBA_FXT1_3DFX:
288 return MESA_FORMAT_RGBA_FXT1;
289 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
290 case GL_RGB_S3TC:
291 case GL_RGB4_S3TC:
292 return MESA_FORMAT_RGB_DXT1;
293 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
294 return MESA_FORMAT_RGBA_DXT1;
295 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
296 case GL_RGBA_S3TC:
297 case GL_RGBA4_S3TC:
298 return MESA_FORMAT_RGBA_DXT3;
299 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
300 return MESA_FORMAT_RGBA_DXT5;
301 case GL_COMPRESSED_RED_RGTC1:
302 return MESA_FORMAT_RED_RGTC1;
303 case GL_COMPRESSED_SIGNED_RED_RGTC1:
304 return MESA_FORMAT_SIGNED_RED_RGTC1;
305 case GL_COMPRESSED_RG_RGTC2:
306 return MESA_FORMAT_RG_RGTC2;
307 case GL_COMPRESSED_SIGNED_RG_RGTC2:
308 return MESA_FORMAT_SIGNED_RG_RGTC2;
309 case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
310 return MESA_FORMAT_L_LATC1;
311 case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
312 return MESA_FORMAT_SIGNED_L_LATC1;
313 case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
314 return MESA_FORMAT_LA_LATC2;
315 case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
316 return MESA_FORMAT_SIGNED_LA_LATC2;
317 case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
318 return MESA_FORMAT_LA_LATC2;
319 case GL_ETC1_RGB8_OES:
320 return MESA_FORMAT_ETC1_RGB8;
321 case GL_COMPRESSED_RGB8_ETC2:
322 return MESA_FORMAT_ETC2_RGB8;
323 case GL_COMPRESSED_SRGB8_ETC2:
324 return MESA_FORMAT_ETC2_SRGB8;
325 case GL_COMPRESSED_RGBA8_ETC2_EAC:
326 return MESA_FORMAT_ETC2_RGBA8_EAC;
327 case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
328 return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC;
329 case GL_COMPRESSED_R11_EAC:
330 return MESA_FORMAT_ETC2_R11_EAC;
331 case GL_COMPRESSED_RG11_EAC:
332 return MESA_FORMAT_ETC2_RG11_EAC;
333 case GL_COMPRESSED_SIGNED_R11_EAC:
334 return MESA_FORMAT_ETC2_SIGNED_R11_EAC;
335 case GL_COMPRESSED_SIGNED_RG11_EAC:
336 return MESA_FORMAT_ETC2_SIGNED_RG11_EAC;
337 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
338 return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
339 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
340 return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
341 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
342 return MESA_FORMAT_SRGB_DXT1;
343 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
344 return MESA_FORMAT_SRGBA_DXT1;
345 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
346 return MESA_FORMAT_SRGBA_DXT3;
347 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
348 return MESA_FORMAT_SRGBA_DXT5;
349
350 case GL_ALPHA16F_ARB:
351 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
352 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
353 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
354 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
355 break;
356 case GL_ALPHA32F_ARB:
357 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
358 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
359 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
360 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
361 break;
362 case GL_LUMINANCE16F_ARB:
363 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
364 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
365 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
366 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
367 break;
368 case GL_LUMINANCE32F_ARB:
369 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
370 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
371 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
372 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
373 break;
374 case GL_LUMINANCE_ALPHA16F_ARB:
375 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
376 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
377 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
378 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
379 break;
380 case GL_LUMINANCE_ALPHA32F_ARB:
381 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
382 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
383 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
384 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
385 break;
386 case GL_INTENSITY16F_ARB:
387 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
388 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
389 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
390 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
391 break;
392 case GL_INTENSITY32F_ARB:
393 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
394 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
395 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
396 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
397 break;
398 case GL_RGB16F_ARB:
399 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
400 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_FLOAT);
401 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
402 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
403 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
404 break;
405 case GL_RGB32F_ARB:
406 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
407 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR32323232_FLOAT);
408 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
409 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
410 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
411 break;
412 case GL_RGBA16F_ARB:
413 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
414 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
415 break;
416 case GL_RGBA32F_ARB:
417 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
418 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
419 break;
420
421 case GL_RGB9_E5:
422 /* GL_EXT_texture_shared_exponent -- just one format to support */
423 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_RGB9_E5_FLOAT]);
424 return MESA_FORMAT_RGB9_E5_FLOAT;
425
426 case GL_R11F_G11F_B10F:
427 /* GL_EXT_texture_packed_float -- just one format to support */
428 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_R11_G11_B10_FLOAT]);
429 return MESA_FORMAT_R11_G11_B10_FLOAT;
430
431 case GL_DEPTH_STENCIL_EXT:
432 case GL_DEPTH24_STENCIL8_EXT:
433 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8);
434 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_Z24);
435 break;
436
437 case GL_DEPTH_COMPONENT32F:
438 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT]);
439 return MESA_FORMAT_Z32_FLOAT;
440 case GL_DEPTH32F_STENCIL8:
441 ASSERT(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_X24S8]);
442 return MESA_FORMAT_Z32_FLOAT_X24S8;
443
444 case GL_DUDV_ATI:
445 case GL_DU8DV8_ATI:
446 RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8);
447 break;
448
449 case GL_RED_SNORM:
450 case GL_R8_SNORM:
451 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8);
452 break;
453 case GL_RG_SNORM:
454 case GL_RG8_SNORM:
455 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV);
456 break;
457 case GL_RGB_SNORM:
458 case GL_RGB8_SNORM:
459 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
460 /* FALLTHROUGH */
461 case GL_RGBA_SNORM:
462 case GL_RGBA8_SNORM:
463 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
464 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
465 break;
466 case GL_ALPHA_SNORM:
467 case GL_ALPHA8_SNORM:
468 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8);
469 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
470 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
471 break;
472 case GL_LUMINANCE_SNORM:
473 case GL_LUMINANCE8_SNORM:
474 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8);
475 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
476 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
477 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
478 break;
479 case GL_LUMINANCE_ALPHA_SNORM:
480 case GL_LUMINANCE8_ALPHA8_SNORM:
481 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88);
482 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
483 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
484 break;
485 case GL_INTENSITY_SNORM:
486 case GL_INTENSITY8_SNORM:
487 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8);
488 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
489 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
490 break;
491 case GL_R16_SNORM:
492 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16);
493 break;
494 case GL_RG16_SNORM:
495 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616);
496 break;
497 case GL_RGB16_SNORM:
498 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
499 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_SNORM);
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
528 case GL_SRGB_EXT:
529 case GL_SRGB8_EXT:
530 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
531 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
532 break;
533 case GL_SRGB_ALPHA_EXT:
534 case GL_SRGB8_ALPHA8_EXT:
535 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
536 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
537 break;
538 case GL_SLUMINANCE_EXT:
539 case GL_SLUMINANCE8_EXT:
540 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
541 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
542 break;
543 case GL_SLUMINANCE_ALPHA_EXT:
544 case GL_SLUMINANCE8_ALPHA8_EXT:
545 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
546 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
547 break;
548 case GL_COMPRESSED_SLUMINANCE_EXT:
549 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
550 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
551 break;
552 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
553 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
554 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
555 break;
556 case GL_COMPRESSED_SRGB_EXT:
557 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
558 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
559 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
560 break;
561 case GL_COMPRESSED_SRGB_ALPHA_EXT:
562 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
563 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
564 RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
565 break;
566
567 case GL_ALPHA8UI_EXT:
568 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT8);
569 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
570 break;
571 case GL_ALPHA16UI_EXT:
572 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT16);
573 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
574 break;
575 case GL_ALPHA32UI_EXT:
576 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT32);
577 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
578 break;
579 case GL_ALPHA8I_EXT:
580 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT8);
581 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
582 break;
583 case GL_ALPHA16I_EXT:
584 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT16);
585 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
586 break;
587 case GL_ALPHA32I_EXT:
588 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT32);
589 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
590 break;
591 case GL_LUMINANCE8UI_EXT:
592 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT8);
593 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
594 break;
595 case GL_LUMINANCE16UI_EXT:
596 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT16);
597 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
598 break;
599 case GL_LUMINANCE32UI_EXT:
600 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT32);
601 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
602 break;
603 case GL_LUMINANCE8I_EXT:
604 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT8);
605 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
606 break;
607 case GL_LUMINANCE16I_EXT:
608 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT16);
609 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
610 break;
611 case GL_LUMINANCE32I_EXT:
612 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT32);
613 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
614 break;
615 case GL_LUMINANCE_ALPHA8UI_EXT:
616 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT8);
617 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
618 break;
619 case GL_LUMINANCE_ALPHA16UI_EXT:
620 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT16);
621 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
622 break;
623 case GL_LUMINANCE_ALPHA32UI_EXT:
624 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT32);
625 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
626 break;
627 case GL_LUMINANCE_ALPHA8I_EXT:
628 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT8);
629 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
630 break;
631 case GL_LUMINANCE_ALPHA16I_EXT:
632 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT16);
633 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
634 break;
635 case GL_LUMINANCE_ALPHA32I_EXT:
636 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT32);
637 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
638 break;
639 case GL_INTENSITY8UI_EXT:
640 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT8);
641 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
642 break;
643 case GL_INTENSITY16UI_EXT:
644 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT16);
645 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
646 break;
647 case GL_INTENSITY32UI_EXT:
648 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT32);
649 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
650 break;
651 case GL_INTENSITY8I_EXT:
652 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT8);
653 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
654 break;
655 case GL_INTENSITY16I_EXT:
656 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT16);
657 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
658 break;
659 case GL_INTENSITY32I_EXT:
660 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT32);
661 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
662 break;
663
664 case GL_RGB8UI_EXT:
665 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8);
666 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR8888_UINT);
667 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
668 break;
669 case GL_RGB16UI_EXT:
670 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16);
671 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_UINT);
672 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
673 break;
674 case GL_RGB32UI_EXT:
675 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32);
676 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR32323232_UINT);
677 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
678 break;
679 case GL_RGB8I_EXT:
680 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT8);
681 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR8888_SINT);
682 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
683 break;
684 case GL_RGB16I_EXT:
685 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT16);
686 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR16161616_SINT);
687 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
688 break;
689 case GL_RGB32I_EXT:
690 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT32);
691 RETURN_IF_SUPPORTED(MESA_FORMAT_XBGR32323232_SINT);
692 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
693 break;
694 case GL_RGBA8UI_EXT:
695 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
696 break;
697 case GL_RGBA16UI_EXT:
698 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
699 break;
700 case GL_RGBA32UI_EXT:
701 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
702 break;
703 case GL_RGBA8I_EXT:
704 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
705 break;
706 case GL_RGBA16I_EXT:
707 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
708 break;
709 case GL_RGBA32I_EXT:
710 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
711 break;
712
713 case GL_R8:
714 case GL_RED:
715 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
716 break;
717
718 case GL_COMPRESSED_RED:
719 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
720 RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
721 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
722 break;
723
724 case GL_R16:
725 RETURN_IF_SUPPORTED(MESA_FORMAT_R16);
726 break;
727
728 case GL_RG:
729 case GL_RG8:
730 RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
731 break;
732
733 case GL_COMPRESSED_RG:
734 if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
735 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
736 RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
737 break;
738
739 case GL_RG16:
740 RETURN_IF_SUPPORTED(MESA_FORMAT_GR1616);
741 break;
742
743 case GL_R16F:
744 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
745 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
746 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
747 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
748 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
749 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
750 break;
751 case GL_R32F:
752 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
753 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
754 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
755 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
756 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
757 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
758 break;
759 case GL_RG16F:
760 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
761 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
762 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
763 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
764 break;
765 case GL_RG32F:
766 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
767 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
768 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
769 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
770 break;
771
772 case GL_R8UI:
773 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8);
774 break;
775 case GL_RG8UI:
776 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8);
777 break;
778 case GL_R16UI:
779 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16);
780 break;
781 case GL_RG16UI:
782 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16);
783 break;
784 case GL_R32UI:
785 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32);
786 break;
787 case GL_RG32UI:
788 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32);
789 break;
790 case GL_R8I:
791 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT8);
792 break;
793 case GL_RG8I:
794 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT8);
795 break;
796 case GL_R16I:
797 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT16);
798 break;
799 case GL_RG16I:
800 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT16);
801 break;
802 case GL_R32I:
803 RETURN_IF_SUPPORTED(MESA_FORMAT_R_INT32);
804 break;
805 case GL_RG32I:
806 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_INT32);
807 break;
808
809 case GL_RGB10_A2UI:
810 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010_UINT);
811 RETURN_IF_SUPPORTED(MESA_FORMAT_ABGR2101010_UINT);
812 break;
813
814 case GL_BGRA:
815 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
816 break;
817 }
818
819 _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()",
820 _mesa_lookup_enum_by_nr(internalFormat));
821 return MESA_FORMAT_NONE;
822 }