2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
6 * Copyright (c) 2008-2009 VMware, Inc.
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:
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
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.
31 * \author Gareth Hughes
37 #define RETURN_IF_SUPPORTED(f) do { \
38 if (ctx->TextureFormatSupported[f]) \
43 * Choose an appropriate texture format given the format, type and
44 * internalFormat parameters passed to glTexImage().
46 * \param ctx the GL context.
47 * \param internalFormat user's prefered internal texture format.
48 * \param format incoming image pixel format.
49 * \param type incoming image data type.
51 * \return a pointer to a gl_texture_format object which describes the
52 * choosen texture format, or NULL on failure.
54 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers
55 * will typically override this function with a specialized version.
58 _mesa_choose_tex_format( struct gl_context
*ctx
, GLint internalFormat
,
59 GLenum format
, GLenum type
)
64 switch (internalFormat
) {
65 /* shallow RGBA formats */
68 if (type
== GL_UNSIGNED_SHORT_4_4_4_4_REV
) {
69 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444
);
70 } else if (type
== GL_UNSIGNED_SHORT_1_5_5_5_REV
) {
71 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555
);
73 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888
);
74 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888
);
78 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888
);
79 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888
);
82 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555
);
85 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444_REV
); /* just to test another format*/
86 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444
);
89 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444
);
92 /* deep RGBA formats */
94 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888
);
98 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16
);
99 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888
);
100 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888
);
103 /* shallow RGB formats */
107 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888
);
108 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888
);
109 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888
);
112 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332
);
113 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565
);
114 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV
);
115 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888
);
116 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888
);
117 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888
);
120 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV
); /* just to test another format */
121 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565
);
124 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565
);
127 /* deep RGB formats */
131 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16
);
132 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888
);
133 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888
);
140 RETURN_IF_SUPPORTED(MESA_FORMAT_A8
);
145 RETURN_IF_SUPPORTED(MESA_FORMAT_A16
);
146 RETURN_IF_SUPPORTED(MESA_FORMAT_A8
);
149 /* Luminance formats */
154 RETURN_IF_SUPPORTED(MESA_FORMAT_L8
);
159 RETURN_IF_SUPPORTED(MESA_FORMAT_L16
);
160 RETURN_IF_SUPPORTED(MESA_FORMAT_L8
);
163 /* Luminance/Alpha formats */
164 case GL_LUMINANCE4_ALPHA4
:
165 RETURN_IF_SUPPORTED(MESA_FORMAT_AL44
);
166 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88
);
170 case GL_LUMINANCE_ALPHA
:
171 case GL_LUMINANCE6_ALPHA2
:
172 case GL_LUMINANCE8_ALPHA8
:
173 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88
);
176 case GL_LUMINANCE12_ALPHA4
:
177 case GL_LUMINANCE12_ALPHA12
:
178 case GL_LUMINANCE16_ALPHA16
:
179 RETURN_IF_SUPPORTED(MESA_FORMAT_AL1616
);
180 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88
);
186 RETURN_IF_SUPPORTED(MESA_FORMAT_I8
);
191 RETURN_IF_SUPPORTED(MESA_FORMAT_I16
);
192 RETURN_IF_SUPPORTED(MESA_FORMAT_I8
);
199 if (ctx
->Extensions
.MESA_ycbcr_texture
) {
200 if (internalFormat
== GL_YCBCR_MESA
) {
201 if (type
== GL_UNSIGNED_SHORT_8_8_MESA
)
202 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR
);
204 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV
);
208 if (ctx
->Extensions
.EXT_texture_integer
) {
209 switch (internalFormat
) {
210 case GL_ALPHA8UI_EXT
:
211 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT8
);
212 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8
);
214 case GL_ALPHA16UI_EXT
:
215 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT16
);
216 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16
);
218 case GL_ALPHA32UI_EXT
:
219 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT32
);
220 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32
);
223 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT8
);
224 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8
);
226 case GL_ALPHA16I_EXT
:
227 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT16
);
228 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16
);
230 case GL_ALPHA32I_EXT
:
231 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT32
);
232 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32
);
234 case GL_LUMINANCE8UI_EXT
:
235 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT8
);
236 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8
);
238 case GL_LUMINANCE16UI_EXT
:
239 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT16
);
240 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16
);
242 case GL_LUMINANCE32UI_EXT
:
243 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT32
);
244 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32
);
246 case GL_LUMINANCE8I_EXT
:
247 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT8
);
248 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8
);
250 case GL_LUMINANCE16I_EXT
:
251 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT16
);
252 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16
);
254 case GL_LUMINANCE32I_EXT
:
255 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT32
);
256 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32
);
258 case GL_LUMINANCE_ALPHA8UI_EXT
:
259 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT8
);
260 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8
);
262 case GL_LUMINANCE_ALPHA16UI_EXT
:
263 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT16
);
264 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16
);
266 case GL_LUMINANCE_ALPHA32UI_EXT
:
267 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT32
);
268 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32
);
270 case GL_LUMINANCE_ALPHA8I_EXT
:
271 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT8
);
272 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8
);
274 case GL_LUMINANCE_ALPHA16I_EXT
:
275 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT16
);
276 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16
);
278 case GL_LUMINANCE_ALPHA32I_EXT
:
279 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT32
);
280 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32
);
282 case GL_INTENSITY8UI_EXT
:
283 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT8
);
284 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8
);
286 case GL_INTENSITY16UI_EXT
:
287 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT16
);
288 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16
);
290 case GL_INTENSITY32UI_EXT
:
291 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT32
);
292 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32
);
294 case GL_INTENSITY8I_EXT
:
295 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT8
);
296 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8
);
298 case GL_INTENSITY16I_EXT
:
299 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT16
);
300 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16
);
302 case GL_INTENSITY32I_EXT
:
303 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT32
);
304 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32
);
309 if (ctx
->VersionMajor
>= 3 ||
310 ctx
->Extensions
.EXT_texture_integer
) {
311 switch (internalFormat
) {
313 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8
);
314 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8
);
317 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16
);
318 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16
);
321 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32
);
322 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32
);
325 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT8
);
326 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8
);
329 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT16
);
330 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16
);
333 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT32
);
334 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32
);
337 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8
);
339 case GL_RGBA16UI_EXT
:
340 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16
);
342 case GL_RGBA32UI_EXT
:
343 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32
);
346 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8
);
349 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16
);
352 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32
);
357 _mesa_problem(ctx
, "unexpected format %s in _mesa_choose_tex_format()",
358 _mesa_lookup_enum_by_nr(internalFormat
));
359 return MESA_FORMAT_NONE
;