blob: ab5e25dcded83f7f4309de0e0b6e5ee708a3789c [file] [log] [blame]
Gareth Hughes2c3d34c2001-03-18 08:53:49 +00001/*
2 * Mesa 3-D graphics library
Brian Paul74ae14a2009-09-30 20:47:54 -06003 * Version: 7.7
Gareth Hughes2c3d34c2001-03-18 08:53:49 +00004 *
Brian Paul74ae14a2009-09-30 20:47:54 -06005 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
6 * Copyright (c) 2008-2009 VMware, Inc.
Gareth Hughes2c3d34c2001-03-18 08:53:49 +00007 *
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.
Gareth Hughes2c3d34c2001-03-18 08:53:49 +000024 */
25
Keith Whitwell6dc85572003-07-17 13:43:59 +000026
Brian Paulf959f6e2004-04-22 00:27:31 +000027/**
28 * \file texformat.c
29 * Texture formats.
30 *
31 * \author Gareth Hughes
Brian Paul74ae14a2009-09-30 20:47:54 -060032 * \author Brian Paul
Brian Paulf959f6e2004-04-22 00:27:31 +000033 */
34
35
Gareth Hughes2c3d34c2001-03-18 08:53:49 +000036#include "context.h"
Brian Paulda5722b2009-09-27 18:09:23 -060037#include "texcompress.h"
Gareth Hughes2c3d34c2001-03-18 08:53:49 +000038#include "texformat.h"
Gareth Hughes2c3d34c2001-03-18 08:53:49 +000039
Eric Anholt001d9442010-09-23 17:17:08 -070040#define RETURN_IF_SUPPORTED(f) do { \
41 if (ctx->TextureFormatSupported[f]) \
42 return f; \
43} while (0)
Keith Whitwell6dc85572003-07-17 13:43:59 +000044
Keith Whitwell6dc85572003-07-17 13:43:59 +000045/**
Brian Paulfe031082004-01-24 17:02:19 +000046 * Choose an appropriate texture format given the format, type and
47 * internalFormat parameters passed to glTexImage().
Keith Whitwell6dc85572003-07-17 13:43:59 +000048 *
Brian Paulfe031082004-01-24 17:02:19 +000049 * \param ctx the GL context.
50 * \param internalFormat user's prefered internal texture format.
51 * \param format incoming image pixel format.
52 * \param type incoming image data type.
Keith Whitwell6dc85572003-07-17 13:43:59 +000053 *
Brian Paulfe031082004-01-24 17:02:19 +000054 * \return a pointer to a gl_texture_format object which describes the
55 * choosen texture format, or NULL on failure.
Keith Whitwell6dc85572003-07-17 13:43:59 +000056 *
57 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers
Brian Paulf959f6e2004-04-22 00:27:31 +000058 * will typically override this function with a specialized version.
Gareth Hughes2c3d34c2001-03-18 08:53:49 +000059 */
Brian Paul1f7c9142009-09-30 20:28:45 -060060gl_format
Kristian Høgsbergf9995b32010-10-12 12:26:10 -040061_mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
Brian Paul7d58f442001-04-04 21:54:20 +000062 GLenum format, GLenum type )
Gareth Hughes2c3d34c2001-03-18 08:53:49 +000063{
Brian Paul7d58f442001-04-04 21:54:20 +000064 (void) format;
65 (void) type;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +000066
Brian Paulf959f6e2004-04-22 00:27:31 +000067 switch (internalFormat) {
Brian Paul17e96712010-05-09 19:28:10 -060068 /* shallow RGBA formats */
Brian Paulf959f6e2004-04-22 00:27:31 +000069 case 4:
70 case GL_RGBA:
Brian Paula156b492004-05-12 01:50:30 +000071 case GL_RGBA8:
Eric Anholt001d9442010-09-23 17:17:08 -070072 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
73 break;
Brian Paulf959f6e2004-04-22 00:27:31 +000074 case GL_RGB5_A1:
Eric Anholt001d9442010-09-23 17:17:08 -070075 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
76 break;
Brian Paulf959f6e2004-04-22 00:27:31 +000077 case GL_RGBA2:
Eric Anholt001d9442010-09-23 17:17:08 -070078 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444_REV); /* just to test another format*/
79 break;
Brian Paulf959f6e2004-04-22 00:27:31 +000080 case GL_RGBA4:
Eric Anholt001d9442010-09-23 17:17:08 -070081 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
82 break;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +000083
Brian Paul17e96712010-05-09 19:28:10 -060084 /* deep RGBA formats */
85 case GL_RGB10_A2:
Eric Anholt001d9442010-09-23 17:17:08 -070086 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010);
87 break;
Brian Paul17e96712010-05-09 19:28:10 -060088 case GL_RGBA12:
89 case GL_RGBA16:
Eric Anholt001d9442010-09-23 17:17:08 -070090 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
91 break;
Brian Paul17e96712010-05-09 19:28:10 -060092
93 /* shallow RGB formats */
Brian Paulf959f6e2004-04-22 00:27:31 +000094 case 3:
95 case GL_RGB:
Brian Pauldefb0352004-05-13 15:26:51 +000096 case GL_RGB8:
Eric Anholt001d9442010-09-23 17:17:08 -070097 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
98 break;
Brian Paulf959f6e2004-04-22 00:27:31 +000099 case GL_R3_G3_B2:
Eric Anholt001d9442010-09-23 17:17:08 -0700100 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332);
101 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000102 case GL_RGB4:
Eric Anholt001d9442010-09-23 17:17:08 -0700103 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); /* just to test another format */
104 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000105 case GL_RGB5:
Eric Anholt001d9442010-09-23 17:17:08 -0700106 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
107 break;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000108
Brian Paul17e96712010-05-09 19:28:10 -0600109 /* deep RGB formats */
110 case GL_RGB10:
111 case GL_RGB12:
112 case GL_RGB16:
Eric Anholt001d9442010-09-23 17:17:08 -0700113 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
114 break;
Brian Paul17e96712010-05-09 19:28:10 -0600115
Brian Paulf959f6e2004-04-22 00:27:31 +0000116 /* Alpha formats */
117 case GL_ALPHA:
118 case GL_ALPHA4:
Brian Paula156b492004-05-12 01:50:30 +0000119 case GL_ALPHA8:
Eric Anholt001d9442010-09-23 17:17:08 -0700120 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
121 break;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000122
Marek Olšákeb318372010-12-22 00:32:33 +0100123 case GL_ALPHA12:
124 case GL_ALPHA16:
Eric Anholt001d9442010-09-23 17:17:08 -0700125 RETURN_IF_SUPPORTED(MESA_FORMAT_A16);
126 break;
Marek Olšákeb318372010-12-22 00:32:33 +0100127
Brian Paulf959f6e2004-04-22 00:27:31 +0000128 /* Luminance formats */
129 case 1:
130 case GL_LUMINANCE:
131 case GL_LUMINANCE4:
Brian Paulf959f6e2004-04-22 00:27:31 +0000132 case GL_LUMINANCE8:
Eric Anholt001d9442010-09-23 17:17:08 -0700133 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
134 break;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000135
Marek Olšákbb5ace62010-12-22 01:11:13 +0100136 case GL_LUMINANCE12:
137 case GL_LUMINANCE16:
Eric Anholt001d9442010-09-23 17:17:08 -0700138 RETURN_IF_SUPPORTED(MESA_FORMAT_L16);
139 break;
Marek Olšákbb5ace62010-12-22 01:11:13 +0100140
Brian Paulf959f6e2004-04-22 00:27:31 +0000141 /* Luminance/Alpha formats */
Marek Olšákbae9d512010-12-21 23:46:32 +0100142 case GL_LUMINANCE4_ALPHA4:
Eric Anholt001d9442010-09-23 17:17:08 -0700143 RETURN_IF_SUPPORTED(MESA_FORMAT_AL44);
144 break;
Marek Olšákbae9d512010-12-21 23:46:32 +0100145
Brian Paulf959f6e2004-04-22 00:27:31 +0000146 case 2:
147 case GL_LUMINANCE_ALPHA:
Brian Paulf959f6e2004-04-22 00:27:31 +0000148 case GL_LUMINANCE6_ALPHA2:
Ian Romanick12982e32009-11-16 14:53:36 -0800149 case GL_LUMINANCE8_ALPHA8:
Eric Anholt001d9442010-09-23 17:17:08 -0700150 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
151 break;
Ian Romanick12982e32009-11-16 14:53:36 -0800152
Brian Paulf959f6e2004-04-22 00:27:31 +0000153 case GL_LUMINANCE12_ALPHA4:
154 case GL_LUMINANCE12_ALPHA12:
155 case GL_LUMINANCE16_ALPHA16:
Eric Anholt001d9442010-09-23 17:17:08 -0700156 RETURN_IF_SUPPORTED(MESA_FORMAT_AL1616);
157 break;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000158
Brian Paulf959f6e2004-04-22 00:27:31 +0000159 case GL_INTENSITY:
160 case GL_INTENSITY4:
Brian Paulf959f6e2004-04-22 00:27:31 +0000161 case GL_INTENSITY8:
Eric Anholt001d9442010-09-23 17:17:08 -0700162 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
163 break;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000164
Marek Olšákfd8aa7a2010-12-22 01:12:20 +0100165 case GL_INTENSITY12:
166 case GL_INTENSITY16:
Eric Anholt001d9442010-09-23 17:17:08 -0700167 RETURN_IF_SUPPORTED(MESA_FORMAT_I16);
168 break;
Marek Olšákfd8aa7a2010-12-22 01:12:20 +0100169
Brian Paulf959f6e2004-04-22 00:27:31 +0000170 case GL_COLOR_INDEX:
171 case GL_COLOR_INDEX1_EXT:
172 case GL_COLOR_INDEX2_EXT:
173 case GL_COLOR_INDEX4_EXT:
174 case GL_COLOR_INDEX12_EXT:
175 case GL_COLOR_INDEX16_EXT:
Brian Paulf959f6e2004-04-22 00:27:31 +0000176 case GL_COLOR_INDEX8_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700177 RETURN_IF_SUPPORTED(MESA_FORMAT_CI8);
178 break;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000179
Brian Paulf959f6e2004-04-22 00:27:31 +0000180 default:
181 ; /* fallthrough */
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000182 }
Brian Paulf959f6e2004-04-22 00:27:31 +0000183
Ian Romanick4741dbc2008-10-01 15:51:56 -0700184 if (ctx->Extensions.ARB_depth_texture) {
Brian Paulf959f6e2004-04-22 00:27:31 +0000185 switch (internalFormat) {
186 case GL_DEPTH_COMPONENT:
Ian Romanick4741dbc2008-10-01 15:51:56 -0700187 case GL_DEPTH_COMPONENT24:
188 case GL_DEPTH_COMPONENT32:
Eric Anholt001d9442010-09-23 17:17:08 -0700189 RETURN_IF_SUPPORTED(MESA_FORMAT_Z32);
190 break;
Ian Romanick4741dbc2008-10-01 15:51:56 -0700191 case GL_DEPTH_COMPONENT16:
Eric Anholt001d9442010-09-23 17:17:08 -0700192 RETURN_IF_SUPPORTED(MESA_FORMAT_Z16);
193 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000194 default:
195 ; /* fallthrough */
196 }
197 }
198
Ian Romanick33fa5e42009-01-27 17:36:03 -0800199 switch (internalFormat) {
200 case GL_COMPRESSED_ALPHA_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700201 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
202 break;
Ian Romanick33fa5e42009-01-27 17:36:03 -0800203 case GL_COMPRESSED_LUMINANCE_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700204 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
205 break;
Ian Romanick33fa5e42009-01-27 17:36:03 -0800206 case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700207 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
208 break;
Ian Romanick33fa5e42009-01-27 17:36:03 -0800209 case GL_COMPRESSED_INTENSITY_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700210 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
211 break;
Ian Romanick33fa5e42009-01-27 17:36:03 -0800212 case GL_COMPRESSED_RGB_ARB:
Ian Romanick33fa5e42009-01-27 17:36:03 -0800213 if (ctx->Extensions.EXT_texture_compression_s3tc ||
214 ctx->Extensions.S3_s3tc)
Eric Anholt001d9442010-09-23 17:17:08 -0700215 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
Ian Romanick33fa5e42009-01-27 17:36:03 -0800216 if (ctx->Extensions.TDFX_texture_compression_FXT1)
Eric Anholt001d9442010-09-23 17:17:08 -0700217 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
218 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
219 break;
Brian Paul5e4f5e42009-10-23 14:37:14 -0600220 case GL_COMPRESSED_RGBA_ARB:
Ian Romanick33fa5e42009-01-27 17:36:03 -0800221 if (ctx->Extensions.EXT_texture_compression_s3tc ||
222 ctx->Extensions.S3_s3tc)
Eric Anholt001d9442010-09-23 17:17:08 -0700223 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
Brian Paul5e4f5e42009-10-23 14:37:14 -0600224 if (ctx->Extensions.TDFX_texture_compression_FXT1)
Eric Anholt001d9442010-09-23 17:17:08 -0700225 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
226 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
227 break;
Ian Romanick33fa5e42009-01-27 17:36:03 -0800228 default:
229 ; /* fallthrough */
Brian Paulf959f6e2004-04-22 00:27:31 +0000230 }
231
232 if (ctx->Extensions.MESA_ycbcr_texture) {
233 if (internalFormat == GL_YCBCR_MESA) {
234 if (type == GL_UNSIGNED_SHORT_8_8_MESA)
Eric Anholt001d9442010-09-23 17:17:08 -0700235 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR);
Brian Paulf959f6e2004-04-22 00:27:31 +0000236 else
Eric Anholt001d9442010-09-23 17:17:08 -0700237 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
Brian Paulf959f6e2004-04-22 00:27:31 +0000238 }
239 }
240
Keith Whitwell34a61c62008-09-21 19:29:15 -0700241#if FEATURE_texture_fxt1
Brian Paulf959f6e2004-04-22 00:27:31 +0000242 if (ctx->Extensions.TDFX_texture_compression_FXT1) {
243 switch (internalFormat) {
244 case GL_COMPRESSED_RGB_FXT1_3DFX:
Eric Anholt001d9442010-09-23 17:17:08 -0700245 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
246 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000247 case GL_COMPRESSED_RGBA_FXT1_3DFX:
Eric Anholt001d9442010-09-23 17:17:08 -0700248 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
249 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000250 default:
251 ; /* fallthrough */
252 }
253 }
Keith Whitwell34a61c62008-09-21 19:29:15 -0700254#endif
Brian Paulf959f6e2004-04-22 00:27:31 +0000255
Keith Whitwell34a61c62008-09-21 19:29:15 -0700256#if FEATURE_texture_s3tc
Brian Paulf959f6e2004-04-22 00:27:31 +0000257 if (ctx->Extensions.EXT_texture_compression_s3tc) {
258 switch (internalFormat) {
259 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700260 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
261 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000262 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700263 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT1);
264 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000265 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700266 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
267 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000268 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700269 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT5);
270 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000271 default:
272 ; /* fallthrough */
273 }
274 }
275
276 if (ctx->Extensions.S3_s3tc) {
277 switch (internalFormat) {
278 case GL_RGB_S3TC:
279 case GL_RGB4_S3TC:
Eric Anholt001d9442010-09-23 17:17:08 -0700280 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
281 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000282 case GL_RGBA_S3TC:
283 case GL_RGBA4_S3TC:
Eric Anholt001d9442010-09-23 17:17:08 -0700284 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3);
285 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000286 default:
287 ; /* fallthrough */
288 }
289 }
Keith Whitwell34a61c62008-09-21 19:29:15 -0700290#endif
Brian Paulf959f6e2004-04-22 00:27:31 +0000291
292 if (ctx->Extensions.ARB_texture_float) {
293 switch (internalFormat) {
294 case GL_ALPHA16F_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700295 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
296 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000297 case GL_ALPHA32F_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700298 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
299 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000300 case GL_LUMINANCE16F_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700301 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
302 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000303 case GL_LUMINANCE32F_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700304 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
305 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000306 case GL_LUMINANCE_ALPHA16F_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700307 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
308 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000309 case GL_LUMINANCE_ALPHA32F_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700310 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
311 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000312 case GL_INTENSITY16F_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700313 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
314 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000315 case GL_INTENSITY32F_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700316 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
317 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000318 case GL_RGB16F_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700319 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
320 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000321 case GL_RGB32F_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700322 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
323 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000324 case GL_RGBA16F_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700325 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
326 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000327 case GL_RGBA32F_ARB:
Eric Anholt001d9442010-09-23 17:17:08 -0700328 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
329 break;
Brian Paulf959f6e2004-04-22 00:27:31 +0000330 default:
331 ; /* fallthrough */
332 }
333 }
334
Brian Paul1ad7b992005-09-28 02:29:50 +0000335 if (ctx->Extensions.EXT_packed_depth_stencil) {
336 switch (internalFormat) {
337 case GL_DEPTH_STENCIL_EXT:
338 case GL_DEPTH24_STENCIL8_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700339 RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_S8);
340 break;
Brian Paul1ad7b992005-09-28 02:29:50 +0000341 default:
342 ; /* fallthrough */
343 }
344 }
345
Roland Scheidegger114152e2009-03-12 15:01:16 +0100346 if (ctx->Extensions.ATI_envmap_bumpmap) {
347 switch (internalFormat) {
348 case GL_DUDV_ATI:
349 case GL_DU8DV8_ATI:
Eric Anholt001d9442010-09-23 17:17:08 -0700350 RETURN_IF_SUPPORTED(MESA_FORMAT_DUDV8);
351 break;
Roland Scheidegger114152e2009-03-12 15:01:16 +0100352 default:
353 ; /* fallthrough */
354 }
355 }
356
Roland Scheideggerc6a6cc12009-03-27 19:39:52 +0100357 if (ctx->Extensions.MESA_texture_signed_rgba) {
358 switch (internalFormat) {
359 case GL_RGBA_SNORM:
360 case GL_RGBA8_SNORM:
Eric Anholt001d9442010-09-23 17:17:08 -0700361 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
362 break;
Roland Scheideggerc6a6cc12009-03-27 19:39:52 +0100363 default:
364 ; /* fallthrough */
365 }
366 }
367
Brian Paul84407d72010-04-26 20:35:19 -0600368 if (ctx->VersionMajor * 10 + ctx->VersionMinor >= 31) {
369 switch (internalFormat) {
370 case GL_RED_SNORM:
371 case GL_R8_SNORM:
Eric Anholt001d9442010-09-23 17:17:08 -0700372 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R8);
373 break;
Brian Paul84407d72010-04-26 20:35:19 -0600374 case GL_RG_SNORM:
375 case GL_RG8_SNORM:
Eric Anholt001d9442010-09-23 17:17:08 -0700376 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88);
377 break;
Brian Paul84407d72010-04-26 20:35:19 -0600378 case GL_RGB_SNORM:
379 case GL_RGB8_SNORM:
Eric Anholt001d9442010-09-23 17:17:08 -0700380 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBX8888);
381 break;
Brian Paul84407d72010-04-26 20:35:19 -0600382 case GL_RGBA_SNORM:
383 case GL_RGBA8_SNORM:
Eric Anholt001d9442010-09-23 17:17:08 -0700384 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
385 break;
Brian Paul84407d72010-04-26 20:35:19 -0600386 case GL_R16_SNORM:
Eric Anholt001d9442010-09-23 17:17:08 -0700387 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R_16);
388 break;
Brian Paul84407d72010-04-26 20:35:19 -0600389 case GL_RG16_SNORM:
Eric Anholt001d9442010-09-23 17:17:08 -0700390 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_16);
391 break;
Brian Paul84407d72010-04-26 20:35:19 -0600392 case GL_RGB16_SNORM:
Eric Anholt001d9442010-09-23 17:17:08 -0700393 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
394 break;
Brian Paul84407d72010-04-26 20:35:19 -0600395 case GL_RGBA16_SNORM:
Eric Anholt001d9442010-09-23 17:17:08 -0700396 RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
397 break;
Brian Paul84407d72010-04-26 20:35:19 -0600398 default:
399 ; /* fall-through */
400 }
401 }
Roland Scheideggerc6a6cc12009-03-27 19:39:52 +0100402
Brian Paul8d214bc2006-08-03 03:20:52 +0000403#if FEATURE_EXT_texture_sRGB
404 if (ctx->Extensions.EXT_texture_sRGB) {
405 switch (internalFormat) {
406 case GL_SRGB_EXT:
407 case GL_SRGB8_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700408 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
409 break;
Brian Paul8d214bc2006-08-03 03:20:52 +0000410 case GL_SRGB_ALPHA_EXT:
411 case GL_SRGB8_ALPHA8_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700412 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
413 break;
Brian Paul8d214bc2006-08-03 03:20:52 +0000414 case GL_SLUMINANCE_EXT:
415 case GL_SLUMINANCE8_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700416 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
417 break;
Brian Paul8d214bc2006-08-03 03:20:52 +0000418 case GL_SLUMINANCE_ALPHA_EXT:
419 case GL_SLUMINANCE8_ALPHA8_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700420 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
421 break;
Brian Paul8d214bc2006-08-03 03:20:52 +0000422 case GL_COMPRESSED_SLUMINANCE_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700423 RETURN_IF_SUPPORTED(MESA_FORMAT_SL8);
424 break;
Brian Paul8d214bc2006-08-03 03:20:52 +0000425 case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700426 RETURN_IF_SUPPORTED(MESA_FORMAT_SLA8);
427 break;
Roland Scheidegger5bd093b2008-12-12 05:06:48 +0100428 case GL_COMPRESSED_SRGB_EXT:
429#if FEATURE_texture_s3tc
430 if (ctx->Extensions.EXT_texture_compression_s3tc)
Eric Anholt001d9442010-09-23 17:17:08 -0700431 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
Roland Scheidegger5bd093b2008-12-12 05:06:48 +0100432#endif
Eric Anholt001d9442010-09-23 17:17:08 -0700433 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
434 break;
Roland Scheidegger5bd093b2008-12-12 05:06:48 +0100435 case GL_COMPRESSED_SRGB_ALPHA_EXT:
436#if FEATURE_texture_s3tc
437 if (ctx->Extensions.EXT_texture_compression_s3tc)
Eric Anholt001d9442010-09-23 17:17:08 -0700438 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
Roland Scheidegger5bd093b2008-12-12 05:06:48 +0100439#endif
Eric Anholt001d9442010-09-23 17:17:08 -0700440 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
441 break;
Roland Scheidegger5bd093b2008-12-12 05:06:48 +0100442#if FEATURE_texture_s3tc
443 case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
444 if (ctx->Extensions.EXT_texture_compression_s3tc)
Eric Anholt001d9442010-09-23 17:17:08 -0700445 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
Roland Scheidegger5bd093b2008-12-12 05:06:48 +0100446 break;
447 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
448 if (ctx->Extensions.EXT_texture_compression_s3tc)
Eric Anholt001d9442010-09-23 17:17:08 -0700449 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT1);
Roland Scheidegger5bd093b2008-12-12 05:06:48 +0100450 break;
451 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
452 if (ctx->Extensions.EXT_texture_compression_s3tc)
Eric Anholt001d9442010-09-23 17:17:08 -0700453 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3);
Roland Scheidegger5bd093b2008-12-12 05:06:48 +0100454 break;
455 case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
456 if (ctx->Extensions.EXT_texture_compression_s3tc)
Eric Anholt001d9442010-09-23 17:17:08 -0700457 RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT5);
Roland Scheidegger5bd093b2008-12-12 05:06:48 +0100458 break;
459#endif
Brian Paul8d214bc2006-08-03 03:20:52 +0000460 default:
461 ; /* fallthrough */
462 }
463 }
464#endif /* FEATURE_EXT_texture_sRGB */
465
Brian Paulabd56272010-07-05 20:07:07 -0600466 if (ctx->Extensions.EXT_texture_integer) {
467 switch (internalFormat) {
468 case GL_RGBA32UI_EXT:
469 case GL_RGB32UI_EXT:
470 case GL_ALPHA32UI_EXT:
471 case GL_INTENSITY32UI_EXT:
472 case GL_LUMINANCE32UI_EXT:
473 case GL_LUMINANCE_ALPHA32UI_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700474 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
475 break;
Brian Paulabd56272010-07-05 20:07:07 -0600476 case GL_RGBA16UI_EXT:
477 case GL_RGB16UI_EXT:
478 case GL_ALPHA16UI_EXT:
479 case GL_INTENSITY16UI_EXT:
480 case GL_LUMINANCE16UI_EXT:
481 case GL_LUMINANCE_ALPHA16UI_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700482 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
483 break;
Brian Paulabd56272010-07-05 20:07:07 -0600484 case GL_RGBA8UI_EXT:
485 case GL_RGB8UI_EXT:
486 case GL_ALPHA8UI_EXT:
487 case GL_INTENSITY8UI_EXT:
488 case GL_LUMINANCE8UI_EXT:
489 case GL_LUMINANCE_ALPHA8UI_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700490 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
491 break;
Brian Paulabd56272010-07-05 20:07:07 -0600492 case GL_RGBA32I_EXT:
493 case GL_RGB32I_EXT:
494 case GL_ALPHA32I_EXT:
495 case GL_INTENSITY32I_EXT:
496 case GL_LUMINANCE32I_EXT:
497 case GL_LUMINANCE_ALPHA32I_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700498 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
499 break;
Brian Paulabd56272010-07-05 20:07:07 -0600500 case GL_RGBA16I_EXT:
501 case GL_RGB16I_EXT:
502 case GL_ALPHA16I_EXT:
503 case GL_INTENSITY16I_EXT:
504 case GL_LUMINANCE16I_EXT:
505 case GL_LUMINANCE_ALPHA16I_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700506 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
507 break;
Brian Paulabd56272010-07-05 20:07:07 -0600508 case GL_RGBA8I_EXT:
509 case GL_RGB8I_EXT:
510 case GL_ALPHA8I_EXT:
511 case GL_INTENSITY8I_EXT:
512 case GL_LUMINANCE8I_EXT:
513 case GL_LUMINANCE_ALPHA8I_EXT:
Eric Anholt001d9442010-09-23 17:17:08 -0700514 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
515 break;
Brian Paulabd56272010-07-05 20:07:07 -0600516 }
517 }
518
Ian Romanick5d1387b2010-09-28 17:24:39 -0700519 if (ctx->Extensions.ARB_texture_rg) {
520 switch (internalFormat) {
521 case GL_R8:
522 case GL_RED:
523 case GL_COMPRESSED_RED:
Eric Anholt001d9442010-09-23 17:17:08 -0700524 RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
525 break;
Ian Romanick5d1387b2010-09-28 17:24:39 -0700526
527 case GL_R16:
Eric Anholt001d9442010-09-23 17:17:08 -0700528 RETURN_IF_SUPPORTED(MESA_FORMAT_R16);
529 break;
Ian Romanick5d1387b2010-09-28 17:24:39 -0700530
531 case GL_RG:
532 case GL_RG8:
533 case GL_COMPRESSED_RG:
Eric Anholt001d9442010-09-23 17:17:08 -0700534 RETURN_IF_SUPPORTED(MESA_FORMAT_RG88);
535 break;
Ian Romanick5d1387b2010-09-28 17:24:39 -0700536
537 case GL_RG16:
Eric Anholt001d9442010-09-23 17:17:08 -0700538 RETURN_IF_SUPPORTED(MESA_FORMAT_RG1616);
539 break;
Ian Romanick5d1387b2010-09-28 17:24:39 -0700540
541 default:
542 ; /* fallthrough */
543 }
544 }
545
Brian Paulf959f6e2004-04-22 00:27:31 +0000546 _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
Brian Paul1f7c9142009-09-30 20:28:45 -0600547 return MESA_FORMAT_NONE;
Gareth Hughes2c3d34c2001-03-18 08:53:49 +0000548}
Brian12dc9c92008-02-08 16:46:12 -0700549