2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (c) 2008-2009 VMware, Inc.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 * OTHER DEALINGS IN THE SOFTWARE.
31 * \author Gareth Hughes
39 #include "texcompress.h"
40 #include "texformat.h"
41 #include "glformats.h"
43 #define RETURN_IF_SUPPORTED(f) do { \
44 if (ctx->TextureFormatSupported[f]) \
49 * Choose an appropriate texture format given the format, type and
50 * internalFormat parameters passed to glTexImage().
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.
58 * \return the closest mesa_format for the given format/type arguments
60 * This is called via dd_function_table::ChooseTextureFormat. Hardware
61 * drivers may override this function with a specialized version.
64 _mesa_choose_tex_format(struct gl_context
*ctx
, GLenum target
,
65 GLint internalFormat
, GLenum format
, GLenum type
)
69 switch (internalFormat
) {
70 /* shallow RGBA formats */
73 if (type
== GL_UNSIGNED_SHORT_4_4_4_4_REV
) {
74 RETURN_IF_SUPPORTED(MESA_FORMAT_B4G4R4A4_UNORM
);
75 } else if (type
== GL_UNSIGNED_SHORT_1_5_5_5_REV
) {
76 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G5R5A1_UNORM
);
77 } else if (type
== GL_UNSIGNED_SHORT_5_5_5_1
) {
78 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G5R5A1_UNORM
);
79 } else if (type
== GL_UNSIGNED_INT_2_10_10_10_REV
) {
80 RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM
);
85 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_UNORM
);
86 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM
);
87 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM
);
90 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G5R5A1_UNORM
);
93 RETURN_IF_SUPPORTED(MESA_FORMAT_A4R4G4B4_UNORM
); /* just to test another format*/
94 RETURN_IF_SUPPORTED(MESA_FORMAT_B4G4R4A4_UNORM
);
97 RETURN_IF_SUPPORTED(MESA_FORMAT_B4G4R4A4_UNORM
);
100 /* deep RGBA formats */
102 RETURN_IF_SUPPORTED(MESA_FORMAT_R10G10B10A2_UNORM
);
103 RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM
);
104 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM
);
108 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UNORM16
);
109 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UNORM16
);
110 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM
);
111 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM
);
114 /* shallow RGB formats */
117 if (type
== GL_UNSIGNED_INT_2_10_10_10_REV
) {
118 RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM
);
122 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UNORM8
);
123 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_UNORM
);
124 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_UNORM
);
126 RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8
);
127 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM
);
128 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM
);
131 RETURN_IF_SUPPORTED(MESA_FORMAT_B2G3R3_UNORM
);
132 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM
);
133 RETURN_IF_SUPPORTED(MESA_FORMAT_R5G6B5_UNORM
);
134 RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8
);
135 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM
);
136 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM
);
139 RETURN_IF_SUPPORTED(MESA_FORMAT_R5G6B5_UNORM
); /* just to test another format */
140 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM
);
143 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM
);
146 /* deep RGB formats */
150 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UNORM16
);
151 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UNORM16
);
152 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM
);
153 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM
);
160 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM8
);
161 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM
);
166 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM16
);
167 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM8
);
168 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM
);
171 /* Luminance formats */
176 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM8
);
181 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM16
);
182 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM8
);
185 /* Luminance/Alpha formats */
186 case GL_LUMINANCE4_ALPHA4
:
187 RETURN_IF_SUPPORTED(MESA_FORMAT_L4A4_UNORM
);
188 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM
);
192 case GL_LUMINANCE_ALPHA
:
193 case GL_LUMINANCE6_ALPHA2
:
194 case GL_LUMINANCE8_ALPHA8
:
195 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM
);
198 case GL_LUMINANCE12_ALPHA4
:
199 case GL_LUMINANCE12_ALPHA12
:
200 case GL_LUMINANCE16_ALPHA16
:
201 RETURN_IF_SUPPORTED(MESA_FORMAT_L16A16_UNORM
);
202 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM
);
208 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM8
);
213 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM16
);
214 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM8
);
217 case GL_DEPTH_COMPONENT
:
218 case GL_DEPTH_COMPONENT24
:
219 case GL_DEPTH_COMPONENT32
:
220 RETURN_IF_SUPPORTED(MESA_FORMAT_Z_UNORM32
);
221 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_X8_UINT
);
222 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_S8_UINT
);
224 case GL_DEPTH_COMPONENT16
:
225 RETURN_IF_SUPPORTED(MESA_FORMAT_Z_UNORM16
);
226 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_X8_UINT
);
227 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_S8_UINT
);
230 case GL_COMPRESSED_ALPHA_ARB
:
231 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM8
);
232 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM
);
234 case GL_COMPRESSED_LUMINANCE_ARB
:
235 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM8
);
237 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB
:
238 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM
);
240 case GL_COMPRESSED_INTENSITY_ARB
:
241 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM8
);
243 case GL_COMPRESSED_RGB_ARB
:
244 /* We don't use texture compression for 1D and 1D array textures.
245 * For 1D textures, compressions doesn't buy us much.
246 * For 1D ARRAY textures, there's complicated issues with updating
247 * sub-regions on non-block boundaries with glCopyTexSubImage, among
248 * other issues. FWIW, the GL_EXT_texture_array extension prohibits
249 * 1D ARRAY textures in S3TC format.
251 if (target
!= GL_TEXTURE_1D
&& target
!= GL_TEXTURE_1D_ARRAY
) {
252 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1
);
254 RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8
);
255 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM
);
256 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM
);
258 case GL_COMPRESSED_RGBA_ARB
:
259 /* We don't use texture compression for 1D and 1D array textures. */
260 if (target
!= GL_TEXTURE_1D
&& target
!= GL_TEXTURE_1D_ARRAY
) {
261 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3
); /* Not rgba_dxt1, see spec */
263 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM
);
264 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM
);
268 RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM
);
272 if (type
== GL_UNSIGNED_SHORT_8_8_MESA
)
273 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR
);
275 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV
);
278 case GL_ALPHA16F_ARB
:
279 RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT16
);
280 RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT32
);
281 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
282 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
284 case GL_ALPHA32F_ARB
:
285 RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT32
);
286 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
287 RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT16
);
288 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
290 case GL_LUMINANCE16F_ARB
:
291 RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT16
);
292 RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT32
);
293 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
294 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
296 case GL_LUMINANCE32F_ARB
:
297 RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT32
);
298 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
299 RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT16
);
300 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
302 case GL_LUMINANCE_ALPHA16F_ARB
:
303 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT16
);
304 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT32
);
305 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
306 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
308 case GL_LUMINANCE_ALPHA32F_ARB
:
309 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT32
);
310 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
311 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT16
);
312 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
314 case GL_INTENSITY16F_ARB
:
315 RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT16
);
316 RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT32
);
317 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
318 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
320 case GL_INTENSITY32F_ARB
:
321 RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT32
);
322 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
323 RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT16
);
324 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
327 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16
);
328 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_FLOAT16
);
329 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
330 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32
);
331 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
334 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32
);
335 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_FLOAT32
);
336 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
337 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16
);
338 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
341 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
342 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
345 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
346 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
350 /* GL_EXT_texture_shared_exponent -- just one format to support */
351 assert(ctx
->TextureFormatSupported
[MESA_FORMAT_R9G9B9E5_FLOAT
]);
352 return MESA_FORMAT_R9G9B9E5_FLOAT
;
354 case GL_R11F_G11F_B10F
:
355 /* GL_EXT_texture_packed_float -- just one format to support */
356 assert(ctx
->TextureFormatSupported
[MESA_FORMAT_R11G11B10_FLOAT
]);
357 return MESA_FORMAT_R11G11B10_FLOAT
;
359 case GL_DEPTH_STENCIL_EXT
:
360 case GL_DEPTH24_STENCIL8_EXT
:
361 RETURN_IF_SUPPORTED(MESA_FORMAT_S8_UINT_Z24_UNORM
);
362 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_S8_UINT
);
365 case GL_DEPTH_COMPONENT32F
:
366 assert(ctx
->TextureFormatSupported
[MESA_FORMAT_Z_FLOAT32
]);
367 return MESA_FORMAT_Z_FLOAT32
;
368 case GL_DEPTH32F_STENCIL8
:
369 assert(ctx
->TextureFormatSupported
[MESA_FORMAT_Z32_FLOAT_S8X24_UINT
]);
370 return MESA_FORMAT_Z32_FLOAT_S8X24_UINT
;
374 RETURN_IF_SUPPORTED(MESA_FORMAT_R_SNORM8
);
378 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8_SNORM
);
382 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_SNORM
);
383 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM
);
384 RETURN_IF_SUPPORTED(MESA_FORMAT_X8B8G8R8_SNORM
);
385 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM
);
389 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM
);
390 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM
);
391 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM
);
394 case GL_ALPHA8_SNORM
:
395 RETURN_IF_SUPPORTED(MESA_FORMAT_A_SNORM8
);
396 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM
);
397 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM
);
399 case GL_LUMINANCE_SNORM
:
400 case GL_LUMINANCE8_SNORM
:
401 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SNORM8
);
402 RETURN_IF_SUPPORTED(MESA_FORMAT_X8B8G8R8_SNORM
);
403 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM
);
404 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM
);
406 case GL_LUMINANCE_ALPHA_SNORM
:
407 case GL_LUMINANCE8_ALPHA8_SNORM
:
408 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_SNORM
);
409 RETURN_IF_SUPPORTED(MESA_FORMAT_A8L8_SNORM
);
410 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM
);
411 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM
);
413 case GL_INTENSITY_SNORM
:
414 case GL_INTENSITY8_SNORM
:
415 RETURN_IF_SUPPORTED(MESA_FORMAT_I_SNORM8
);
416 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM
);
417 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM
);
420 RETURN_IF_SUPPORTED(MESA_FORMAT_R_SNORM16
);
423 RETURN_IF_SUPPORTED(MESA_FORMAT_R16G16_SNORM
);
426 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SNORM16
);
427 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SNORM16
);
429 case GL_RGBA16_SNORM
:
430 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16
);
431 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM
);
432 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM
);
434 case GL_ALPHA16_SNORM
:
435 RETURN_IF_SUPPORTED(MESA_FORMAT_A_SNORM16
);
436 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16
);
437 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM
);
438 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM
);
440 case GL_LUMINANCE16_SNORM
:
441 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SNORM16
);
443 case GL_LUMINANCE16_ALPHA16_SNORM
:
444 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SNORM16
);
445 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16
);
446 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM
);
447 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM
);
449 case GL_INTENSITY16_SNORM
:
450 RETURN_IF_SUPPORTED(MESA_FORMAT_I_SNORM16
);
451 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16
);
452 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM
);
453 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM
);
458 /* there is no MESA_FORMAT_RGB_SRGB8 */
459 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_SRGB
);
460 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SRGB
);
462 RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_SRGB8
);
463 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB
);
465 RETURN_IF_SUPPORTED(MESA_FORMAT_X8B8G8R8_SRGB
);
466 RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB
);
468 case GL_SRGB_ALPHA_EXT
:
469 case GL_SRGB8_ALPHA8_EXT
:
470 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SRGB
);
472 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SRGB
);
473 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB
);
474 RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB
);
476 case GL_SLUMINANCE_EXT
:
477 case GL_SLUMINANCE8_EXT
:
478 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SRGB8
);
479 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB
);
480 RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB
);
482 case GL_SLUMINANCE_ALPHA_EXT
:
483 case GL_SLUMINANCE8_ALPHA8_EXT
:
484 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_SRGB
);
485 RETURN_IF_SUPPORTED(MESA_FORMAT_A8L8_SRGB
);
486 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB
);
487 RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB
);
489 case GL_COMPRESSED_SLUMINANCE_EXT
:
490 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SRGB8
);
491 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB
);
492 RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB
);
494 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT
:
495 RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_SRGB
);
496 RETURN_IF_SUPPORTED(MESA_FORMAT_A8L8_SRGB
);
497 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB
);
498 RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB
);
500 case GL_COMPRESSED_SRGB_EXT
:
501 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1
);
502 RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_SRGB8
);
503 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB
);
504 RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB
);
506 case GL_COMPRESSED_SRGB_ALPHA_EXT
:
507 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3
); /* Not srgba_dxt1, see spec */
508 RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SRGB
);
509 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB
);
510 RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB
);
513 case GL_ALPHA8UI_EXT
:
514 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UINT8
);
515 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8
);
517 case GL_ALPHA16UI_EXT
:
518 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UINT16
);
519 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16
);
521 case GL_ALPHA32UI_EXT
:
522 RETURN_IF_SUPPORTED(MESA_FORMAT_A_UINT32
);
523 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32
);
526 RETURN_IF_SUPPORTED(MESA_FORMAT_A_SINT8
);
527 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8
);
529 case GL_ALPHA16I_EXT
:
530 RETURN_IF_SUPPORTED(MESA_FORMAT_A_SINT16
);
531 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16
);
533 case GL_ALPHA32I_EXT
:
534 RETURN_IF_SUPPORTED(MESA_FORMAT_A_SINT32
);
535 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32
);
537 case GL_LUMINANCE8UI_EXT
:
538 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UINT8
);
539 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8
);
541 case GL_LUMINANCE16UI_EXT
:
542 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UINT16
);
543 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16
);
545 case GL_LUMINANCE32UI_EXT
:
546 RETURN_IF_SUPPORTED(MESA_FORMAT_L_UINT32
);
547 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32
);
549 case GL_LUMINANCE8I_EXT
:
550 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SINT8
);
551 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8
);
553 case GL_LUMINANCE16I_EXT
:
554 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SINT16
);
555 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16
);
557 case GL_LUMINANCE32I_EXT
:
558 RETURN_IF_SUPPORTED(MESA_FORMAT_L_SINT32
);
559 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32
);
561 case GL_LUMINANCE_ALPHA8UI_EXT
:
562 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_UINT8
);
563 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8
);
565 case GL_LUMINANCE_ALPHA16UI_EXT
:
566 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_UINT16
);
567 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16
);
569 case GL_LUMINANCE_ALPHA32UI_EXT
:
570 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_UINT32
);
571 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32
);
573 case GL_LUMINANCE_ALPHA8I_EXT
:
574 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SINT8
);
575 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8
);
577 case GL_LUMINANCE_ALPHA16I_EXT
:
578 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SINT16
);
579 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16
);
581 case GL_LUMINANCE_ALPHA32I_EXT
:
582 RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SINT32
);
583 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32
);
585 case GL_INTENSITY8UI_EXT
:
586 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UINT8
);
587 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8
);
589 case GL_INTENSITY16UI_EXT
:
590 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UINT16
);
591 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16
);
593 case GL_INTENSITY32UI_EXT
:
594 RETURN_IF_SUPPORTED(MESA_FORMAT_I_UINT32
);
595 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32
);
597 case GL_INTENSITY8I_EXT
:
598 RETURN_IF_SUPPORTED(MESA_FORMAT_I_SINT8
);
599 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8
);
601 case GL_INTENSITY16I_EXT
:
602 RETURN_IF_SUPPORTED(MESA_FORMAT_I_SINT16
);
603 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16
);
605 case GL_INTENSITY32I_EXT
:
606 RETURN_IF_SUPPORTED(MESA_FORMAT_I_SINT32
);
607 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32
);
611 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8
);
612 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UINT8
);
613 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8
);
616 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16
);
617 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UINT16
);
618 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16
);
621 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32
);
622 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UINT32
);
623 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32
);
626 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SINT8
);
627 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SINT8
);
628 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8
);
631 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SINT16
);
632 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SINT16
);
633 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16
);
636 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SINT32
);
637 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SINT32
);
638 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32
);
641 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8
);
643 case GL_RGBA16UI_EXT
:
644 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16
);
646 case GL_RGBA32UI_EXT
:
647 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32
);
650 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8
);
653 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16
);
656 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32
);
661 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UNORM8
);
664 case GL_COMPRESSED_RED
:
665 if (target
!= GL_TEXTURE_1D
&& target
!= GL_TEXTURE_1D_ARRAY
)
666 RETURN_IF_SUPPORTED(MESA_FORMAT_R_RGTC1_UNORM
);
667 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UNORM8
);
671 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UNORM16
);
676 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8_UNORM
);
679 case GL_COMPRESSED_RG
:
680 if (target
!= GL_TEXTURE_1D
&& target
!= GL_TEXTURE_1D_ARRAY
)
681 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2_UNORM
);
682 RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8_UNORM
);
686 RETURN_IF_SUPPORTED(MESA_FORMAT_R16G16_UNORM
);
690 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16
);
691 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16
);
692 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32
);
693 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32
);
694 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
695 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
698 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32
);
699 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32
);
700 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
701 RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16
);
702 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16
);
703 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
706 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16
);
707 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32
);
708 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
709 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
712 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32
);
713 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32
);
714 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16
);
715 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16
);
719 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8
);
722 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8
);
725 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16
);
728 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16
);
731 RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32
);
734 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32
);
737 RETURN_IF_SUPPORTED(MESA_FORMAT_R_SINT8
);
740 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_SINT8
);
743 RETURN_IF_SUPPORTED(MESA_FORMAT_R_SINT16
);
746 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_SINT16
);
749 RETURN_IF_SUPPORTED(MESA_FORMAT_R_SINT32
);
752 RETURN_IF_SUPPORTED(MESA_FORMAT_RG_SINT32
);
756 RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UINT
);
757 RETURN_IF_SUPPORTED(MESA_FORMAT_R10G10B10A2_UINT
);
761 RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM
);
764 case GL_STENCIL_INDEX
:
765 case GL_STENCIL_INDEX8
:
766 RETURN_IF_SUPPORTED(MESA_FORMAT_S_UINT8
);
770 /* For non-generic compressed format we assert two things:
772 * 1. The format has already been validated against the set of available
775 * 2. The driver only enables the extension if it supports all of the
776 * formats that are part of that extension.
778 if (_mesa_is_compressed_format(ctx
, internalFormat
))
779 return _mesa_glenum_to_compressed_format(internalFormat
);
782 _mesa_problem(ctx
, "unexpected format %s in _mesa_choose_tex_format()",
783 _mesa_enum_to_string(internalFormat
));
784 return MESA_FORMAT_NONE
;