[OPENGL32/MESA]
[reactos.git] / reactos / dll / opengl / 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 #include <precomp.h>
36
37 #define RETURN_IF_SUPPORTED(f) do { \
38 if (ctx->TextureFormatSupported[f]) \
39 return f; \
40 } while (0)
41
42 /**
43 * Choose an appropriate texture format given the format, type and
44 * internalFormat parameters passed to glTexImage().
45 *
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.
50 *
51 * \return a pointer to a gl_texture_format object which describes the
52 * choosen texture format, or NULL on failure.
53 *
54 * This is called via dd_function_table::ChooseTextureFormat. Hardware drivers
55 * will typically override this function with a specialized version.
56 */
57 gl_format
58 _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
59 GLenum format, GLenum type )
60 {
61 (void) format;
62 (void) type;
63
64 switch (internalFormat) {
65 /* shallow RGBA formats */
66 case 4:
67 case GL_RGBA:
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);
72 }
73 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
74 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
75 break;
76
77 case GL_RGBA8:
78 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
79 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
80 break;
81 case GL_RGB5_A1:
82 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB1555);
83 break;
84 case GL_RGBA2:
85 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444_REV); /* just to test another format*/
86 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
87 break;
88 case GL_RGBA4:
89 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB4444);
90 break;
91
92 /* deep RGBA formats */
93 case GL_RGB10_A2:
94 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
95 break;
96 case GL_RGBA12:
97 case GL_RGBA16:
98 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
99 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
100 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
101 break;
102
103 /* shallow RGB formats */
104 case 3:
105 case GL_RGB:
106 case GL_RGB8:
107 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
108 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
109 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
110 break;
111 case GL_R3_G3_B2:
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);
118 break;
119 case GL_RGB4:
120 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV); /* just to test another format */
121 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
122 break;
123 case GL_RGB5:
124 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
125 break;
126
127 /* deep RGB formats */
128 case GL_RGB10:
129 case GL_RGB12:
130 case GL_RGB16:
131 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_16);
132 RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
133 RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
134 break;
135
136 /* Alpha formats */
137 case GL_ALPHA:
138 case GL_ALPHA4:
139 case GL_ALPHA8:
140 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
141 break;
142
143 case GL_ALPHA12:
144 case GL_ALPHA16:
145 RETURN_IF_SUPPORTED(MESA_FORMAT_A16);
146 RETURN_IF_SUPPORTED(MESA_FORMAT_A8);
147 break;
148
149 /* Luminance formats */
150 case 1:
151 case GL_LUMINANCE:
152 case GL_LUMINANCE4:
153 case GL_LUMINANCE8:
154 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
155 break;
156
157 case GL_LUMINANCE12:
158 case GL_LUMINANCE16:
159 RETURN_IF_SUPPORTED(MESA_FORMAT_L16);
160 RETURN_IF_SUPPORTED(MESA_FORMAT_L8);
161 break;
162
163 /* Luminance/Alpha formats */
164 case GL_LUMINANCE4_ALPHA4:
165 RETURN_IF_SUPPORTED(MESA_FORMAT_AL44);
166 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
167 break;
168
169 case 2:
170 case GL_LUMINANCE_ALPHA:
171 case GL_LUMINANCE6_ALPHA2:
172 case GL_LUMINANCE8_ALPHA8:
173 RETURN_IF_SUPPORTED(MESA_FORMAT_AL88);
174 break;
175
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);
181 break;
182
183 case GL_INTENSITY:
184 case GL_INTENSITY4:
185 case GL_INTENSITY8:
186 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
187 break;
188
189 case GL_INTENSITY12:
190 case GL_INTENSITY16:
191 RETURN_IF_SUPPORTED(MESA_FORMAT_I16);
192 RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
193 break;
194
195 default:
196 ; /* fallthrough */
197 }
198
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);
203 else
204 RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
205 }
206 }
207
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);
213 break;
214 case GL_ALPHA16UI_EXT:
215 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT16);
216 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
217 break;
218 case GL_ALPHA32UI_EXT:
219 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_UINT32);
220 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
221 break;
222 case GL_ALPHA8I_EXT:
223 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT8);
224 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
225 break;
226 case GL_ALPHA16I_EXT:
227 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT16);
228 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
229 break;
230 case GL_ALPHA32I_EXT:
231 RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_INT32);
232 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
233 break;
234 case GL_LUMINANCE8UI_EXT:
235 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT8);
236 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
237 break;
238 case GL_LUMINANCE16UI_EXT:
239 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT16);
240 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
241 break;
242 case GL_LUMINANCE32UI_EXT:
243 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_UINT32);
244 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
245 break;
246 case GL_LUMINANCE8I_EXT:
247 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT8);
248 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
249 break;
250 case GL_LUMINANCE16I_EXT:
251 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT16);
252 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
253 break;
254 case GL_LUMINANCE32I_EXT:
255 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_INT32);
256 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
257 break;
258 case GL_LUMINANCE_ALPHA8UI_EXT:
259 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT8);
260 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
261 break;
262 case GL_LUMINANCE_ALPHA16UI_EXT:
263 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT16);
264 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
265 break;
266 case GL_LUMINANCE_ALPHA32UI_EXT:
267 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_UINT32);
268 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
269 break;
270 case GL_LUMINANCE_ALPHA8I_EXT:
271 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT8);
272 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
273 break;
274 case GL_LUMINANCE_ALPHA16I_EXT:
275 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT16);
276 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
277 break;
278 case GL_LUMINANCE_ALPHA32I_EXT:
279 RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_INT32);
280 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
281 break;
282 case GL_INTENSITY8UI_EXT:
283 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT8);
284 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
285 break;
286 case GL_INTENSITY16UI_EXT:
287 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT16);
288 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
289 break;
290 case GL_INTENSITY32UI_EXT:
291 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_UINT32);
292 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
293 break;
294 case GL_INTENSITY8I_EXT:
295 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT8);
296 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
297 break;
298 case GL_INTENSITY16I_EXT:
299 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT16);
300 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
301 break;
302 case GL_INTENSITY32I_EXT:
303 RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT32);
304 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
305 break;
306 }
307 }
308
309 if (ctx->VersionMajor >= 3 ||
310 ctx->Extensions.EXT_texture_integer) {
311 switch (internalFormat) {
312 case GL_RGB8UI_EXT:
313 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8);
314 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
315 break;
316 case GL_RGB16UI_EXT:
317 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16);
318 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
319 break;
320 case GL_RGB32UI_EXT:
321 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32);
322 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
323 break;
324 case GL_RGB8I_EXT:
325 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT8);
326 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
327 break;
328 case GL_RGB16I_EXT:
329 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT16);
330 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
331 break;
332 case GL_RGB32I_EXT:
333 RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_INT32);
334 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
335 break;
336 case GL_RGBA8UI_EXT:
337 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
338 break;
339 case GL_RGBA16UI_EXT:
340 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
341 break;
342 case GL_RGBA32UI_EXT:
343 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
344 break;
345 case GL_RGBA8I_EXT:
346 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT8);
347 break;
348 case GL_RGBA16I_EXT:
349 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT16);
350 break;
351 case GL_RGBA32I_EXT:
352 RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
353 break;
354 }
355 }
356
357 _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()",
358 _mesa_lookup_enum_by_nr(internalFormat));
359 return MESA_FORMAT_NONE;
360 }
361