texformat.c revision abd5627a6a034885b0b01b995c73870da1361bb0
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
36#include "context.h"
37#include "texcompress.h"
38#include "texformat.h"
39
40
41/**
42 * Choose an appropriate texture format given the format, type and
43 * internalFormat parameters passed to glTexImage().
44 *
45 * \param ctx  the GL context.
46 * \param internalFormat  user's prefered internal texture format.
47 * \param format  incoming image pixel format.
48 * \param type  incoming image data type.
49 *
50 * \return a pointer to a gl_texture_format object which describes the
51 * choosen texture format, or NULL on failure.
52 *
53 * This is called via dd_function_table::ChooseTextureFormat.  Hardware drivers
54 * will typically override this function with a specialized version.
55 */
56gl_format
57_mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
58                         GLenum format, GLenum type )
59{
60   (void) format;
61   (void) type;
62
63   switch (internalFormat) {
64      /* shallow RGBA formats */
65      case 4:
66      case GL_RGBA:
67      case GL_RGBA8:
68         return MESA_FORMAT_RGBA8888;
69      case GL_RGB5_A1:
70         return MESA_FORMAT_ARGB1555;
71      case GL_RGBA2:
72         return MESA_FORMAT_ARGB4444_REV; /* just to test another format*/
73      case GL_RGBA4:
74         return MESA_FORMAT_ARGB4444;
75
76      /* deep RGBA formats */
77      case GL_RGB10_A2:
78      case GL_RGBA12:
79      case GL_RGBA16:
80         return MESA_FORMAT_RGBA_16;
81
82      /* shallow RGB formats */
83      case 3:
84      case GL_RGB:
85      case GL_RGB8:
86         return MESA_FORMAT_RGB888;
87      case GL_R3_G3_B2:
88         return MESA_FORMAT_RGB332;
89      case GL_RGB4:
90         return MESA_FORMAT_RGB565_REV; /* just to test another format */
91      case GL_RGB5:
92         return MESA_FORMAT_RGB565;
93
94      /* deep RGB formats */
95      case GL_RGB10:
96      case GL_RGB12:
97      case GL_RGB16:
98         return MESA_FORMAT_RGBA_16;
99
100      /* Alpha formats */
101      case GL_ALPHA:
102      case GL_ALPHA4:
103      case GL_ALPHA12:
104      case GL_ALPHA16:
105      case GL_ALPHA8:
106         return MESA_FORMAT_A8;
107
108      /* Luminance formats */
109      case 1:
110      case GL_LUMINANCE:
111      case GL_LUMINANCE4:
112      case GL_LUMINANCE12:
113      case GL_LUMINANCE16:
114      case GL_LUMINANCE8:
115         return MESA_FORMAT_L8;
116
117      /* Luminance/Alpha formats */
118      case 2:
119      case GL_LUMINANCE_ALPHA:
120      case GL_LUMINANCE4_ALPHA4:
121      case GL_LUMINANCE6_ALPHA2:
122      case GL_LUMINANCE8_ALPHA8:
123         return MESA_FORMAT_AL88;
124
125      case GL_LUMINANCE12_ALPHA4:
126      case GL_LUMINANCE12_ALPHA12:
127      case GL_LUMINANCE16_ALPHA16:
128         return MESA_FORMAT_AL1616;
129
130      case GL_INTENSITY:
131      case GL_INTENSITY4:
132      case GL_INTENSITY12:
133      case GL_INTENSITY16:
134      case GL_INTENSITY8:
135         return MESA_FORMAT_I8;
136
137      case GL_COLOR_INDEX:
138      case GL_COLOR_INDEX1_EXT:
139      case GL_COLOR_INDEX2_EXT:
140      case GL_COLOR_INDEX4_EXT:
141      case GL_COLOR_INDEX12_EXT:
142      case GL_COLOR_INDEX16_EXT:
143      case GL_COLOR_INDEX8_EXT:
144         return MESA_FORMAT_CI8;
145
146      default:
147         ; /* fallthrough */
148   }
149
150   if (ctx->Extensions.ARB_depth_texture) {
151      switch (internalFormat) {
152         case GL_DEPTH_COMPONENT:
153         case GL_DEPTH_COMPONENT24:
154         case GL_DEPTH_COMPONENT32:
155            return MESA_FORMAT_Z32;
156         case GL_DEPTH_COMPONENT16:
157            return MESA_FORMAT_Z16;
158         default:
159            ; /* fallthrough */
160      }
161   }
162
163   switch (internalFormat) {
164      case GL_COMPRESSED_ALPHA_ARB:
165         return MESA_FORMAT_A8;
166      case GL_COMPRESSED_LUMINANCE_ARB:
167         return MESA_FORMAT_L8;
168      case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
169         return MESA_FORMAT_AL88;
170      case GL_COMPRESSED_INTENSITY_ARB:
171         return MESA_FORMAT_I8;
172      case GL_COMPRESSED_RGB_ARB:
173         if (ctx->Extensions.EXT_texture_compression_s3tc ||
174             ctx->Extensions.S3_s3tc)
175            return MESA_FORMAT_RGB_DXT1;
176         if (ctx->Extensions.TDFX_texture_compression_FXT1)
177            return MESA_FORMAT_RGB_FXT1;
178         return MESA_FORMAT_RGB888;
179      case GL_COMPRESSED_RGBA_ARB:
180         if (ctx->Extensions.EXT_texture_compression_s3tc ||
181             ctx->Extensions.S3_s3tc)
182            return MESA_FORMAT_RGBA_DXT3; /* Not rgba_dxt1, see spec */
183         if (ctx->Extensions.TDFX_texture_compression_FXT1)
184            return MESA_FORMAT_RGBA_FXT1;
185         return MESA_FORMAT_RGBA8888;
186      default:
187         ; /* fallthrough */
188   }
189
190   if (ctx->Extensions.MESA_ycbcr_texture) {
191      if (internalFormat == GL_YCBCR_MESA) {
192         if (type == GL_UNSIGNED_SHORT_8_8_MESA)
193            return MESA_FORMAT_YCBCR;
194         else
195            return MESA_FORMAT_YCBCR_REV;
196      }
197   }
198
199#if FEATURE_texture_fxt1
200   if (ctx->Extensions.TDFX_texture_compression_FXT1) {
201      switch (internalFormat) {
202         case GL_COMPRESSED_RGB_FXT1_3DFX:
203            return MESA_FORMAT_RGB_FXT1;
204         case GL_COMPRESSED_RGBA_FXT1_3DFX:
205            return MESA_FORMAT_RGBA_FXT1;
206         default:
207            ; /* fallthrough */
208      }
209   }
210#endif
211
212#if FEATURE_texture_s3tc
213   if (ctx->Extensions.EXT_texture_compression_s3tc) {
214      switch (internalFormat) {
215         case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
216            return MESA_FORMAT_RGB_DXT1;
217         case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
218            return MESA_FORMAT_RGBA_DXT1;
219         case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
220            return MESA_FORMAT_RGBA_DXT3;
221         case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
222            return MESA_FORMAT_RGBA_DXT5;
223         default:
224            ; /* fallthrough */
225      }
226   }
227
228   if (ctx->Extensions.S3_s3tc) {
229      switch (internalFormat) {
230         case GL_RGB_S3TC:
231         case GL_RGB4_S3TC:
232            return MESA_FORMAT_RGB_DXT1;
233         case GL_RGBA_S3TC:
234         case GL_RGBA4_S3TC:
235            return MESA_FORMAT_RGBA_DXT3;
236         default:
237            ; /* fallthrough */
238      }
239   }
240#endif
241
242   if (ctx->Extensions.ARB_texture_float) {
243      switch (internalFormat) {
244         case GL_ALPHA16F_ARB:
245            return MESA_FORMAT_ALPHA_FLOAT16;
246         case GL_ALPHA32F_ARB:
247            return MESA_FORMAT_ALPHA_FLOAT32;
248         case GL_LUMINANCE16F_ARB:
249            return MESA_FORMAT_LUMINANCE_FLOAT16;
250         case GL_LUMINANCE32F_ARB:
251            return MESA_FORMAT_LUMINANCE_FLOAT32;
252         case GL_LUMINANCE_ALPHA16F_ARB:
253            return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
254         case GL_LUMINANCE_ALPHA32F_ARB:
255            return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
256         case GL_INTENSITY16F_ARB:
257            return MESA_FORMAT_INTENSITY_FLOAT16;
258         case GL_INTENSITY32F_ARB:
259            return MESA_FORMAT_INTENSITY_FLOAT32;
260         case GL_RGB16F_ARB:
261            return MESA_FORMAT_RGB_FLOAT16;
262         case GL_RGB32F_ARB:
263            return MESA_FORMAT_RGB_FLOAT32;
264         case GL_RGBA16F_ARB:
265            return MESA_FORMAT_RGBA_FLOAT16;
266         case GL_RGBA32F_ARB:
267            return MESA_FORMAT_RGBA_FLOAT32;
268         default:
269            ; /* fallthrough */
270      }
271   }
272
273   if (ctx->Extensions.EXT_packed_depth_stencil) {
274      switch (internalFormat) {
275         case GL_DEPTH_STENCIL_EXT:
276         case GL_DEPTH24_STENCIL8_EXT:
277            return MESA_FORMAT_Z24_S8;
278         default:
279            ; /* fallthrough */
280      }
281   }
282
283   if (ctx->Extensions.ATI_envmap_bumpmap) {
284      switch (internalFormat) {
285         case GL_DUDV_ATI:
286         case GL_DU8DV8_ATI:
287            return MESA_FORMAT_DUDV8;
288         default:
289            ; /* fallthrough */
290      }
291   }
292
293   if (ctx->Extensions.MESA_texture_signed_rgba) {
294      switch (internalFormat) {
295         case GL_RGBA_SNORM:
296         case GL_RGBA8_SNORM:
297            return MESA_FORMAT_SIGNED_RGBA8888;
298         default:
299            ; /* fallthrough */
300      }
301   }
302
303   if (ctx->VersionMajor * 10 + ctx->VersionMinor >= 31) {
304      switch (internalFormat) {
305         case GL_RED_SNORM:
306         case GL_R8_SNORM:
307            return MESA_FORMAT_SIGNED_R8;
308         case GL_RG_SNORM:
309         case GL_RG8_SNORM:
310            return MESA_FORMAT_SIGNED_RG88;
311         case GL_RGB_SNORM:
312         case GL_RGB8_SNORM:
313            return MESA_FORMAT_SIGNED_RGBX8888;
314         case GL_RGBA_SNORM:
315         case GL_RGBA8_SNORM:
316            return MESA_FORMAT_SIGNED_RGBA8888;
317         case GL_R16_SNORM:
318            return MESA_FORMAT_SIGNED_R_16;
319         case GL_RG16_SNORM:
320            return MESA_FORMAT_SIGNED_RG_16;
321         case GL_RGB16_SNORM:
322            return MESA_FORMAT_SIGNED_RGB_16;
323         case GL_RGBA16_SNORM:
324            return MESA_FORMAT_SIGNED_RGBA_16;
325         default:
326            ; /* fall-through */
327      }
328   }
329
330#if FEATURE_EXT_texture_sRGB
331   if (ctx->Extensions.EXT_texture_sRGB) {
332      switch (internalFormat) {
333         case GL_SRGB_EXT:
334         case GL_SRGB8_EXT:
335            return MESA_FORMAT_SRGB8;
336         case GL_SRGB_ALPHA_EXT:
337         case GL_SRGB8_ALPHA8_EXT:
338            return MESA_FORMAT_SRGBA8;
339         case GL_SLUMINANCE_EXT:
340         case GL_SLUMINANCE8_EXT:
341            return MESA_FORMAT_SL8;
342         case GL_SLUMINANCE_ALPHA_EXT:
343         case GL_SLUMINANCE8_ALPHA8_EXT:
344            return MESA_FORMAT_SLA8;
345         case GL_COMPRESSED_SLUMINANCE_EXT:
346            return MESA_FORMAT_SL8;
347         case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
348            return MESA_FORMAT_SLA8;
349         case GL_COMPRESSED_SRGB_EXT:
350#if FEATURE_texture_s3tc
351            if (ctx->Extensions.EXT_texture_compression_s3tc)
352               return MESA_FORMAT_SRGB_DXT1;
353#endif
354            return MESA_FORMAT_SRGB8;
355         case GL_COMPRESSED_SRGB_ALPHA_EXT:
356#if FEATURE_texture_s3tc
357            if (ctx->Extensions.EXT_texture_compression_s3tc)
358               return MESA_FORMAT_SRGBA_DXT3; /* Not srgba_dxt1, see spec */
359#endif
360            return MESA_FORMAT_SRGBA8;
361#if FEATURE_texture_s3tc
362         case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
363            if (ctx->Extensions.EXT_texture_compression_s3tc)
364               return MESA_FORMAT_SRGB_DXT1;
365            break;
366         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
367            if (ctx->Extensions.EXT_texture_compression_s3tc)
368               return MESA_FORMAT_SRGBA_DXT1;
369            break;
370         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
371            if (ctx->Extensions.EXT_texture_compression_s3tc)
372               return MESA_FORMAT_SRGBA_DXT3;
373            break;
374         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
375            if (ctx->Extensions.EXT_texture_compression_s3tc)
376               return MESA_FORMAT_SRGBA_DXT5;
377            break;
378#endif
379         default:
380            ; /* fallthrough */
381      }
382   }
383#endif /* FEATURE_EXT_texture_sRGB */
384
385   if (ctx->Extensions.EXT_texture_integer) {
386      switch (internalFormat) {
387      case GL_RGBA32UI_EXT:
388      case GL_RGB32UI_EXT:
389      case GL_ALPHA32UI_EXT:
390      case GL_INTENSITY32UI_EXT:
391      case GL_LUMINANCE32UI_EXT:
392      case GL_LUMINANCE_ALPHA32UI_EXT:
393         return MESA_FORMAT_RGBA_UINT32;
394      case GL_RGBA16UI_EXT:
395      case GL_RGB16UI_EXT:
396      case GL_ALPHA16UI_EXT:
397      case GL_INTENSITY16UI_EXT:
398      case GL_LUMINANCE16UI_EXT:
399      case GL_LUMINANCE_ALPHA16UI_EXT:
400         return MESA_FORMAT_RGBA_UINT16;
401      case GL_RGBA8UI_EXT:
402      case GL_RGB8UI_EXT:
403      case GL_ALPHA8UI_EXT:
404      case GL_INTENSITY8UI_EXT:
405      case GL_LUMINANCE8UI_EXT:
406      case GL_LUMINANCE_ALPHA8UI_EXT:
407         return MESA_FORMAT_RGBA_UINT8;
408      case GL_RGBA32I_EXT:
409      case GL_RGB32I_EXT:
410      case GL_ALPHA32I_EXT:
411      case GL_INTENSITY32I_EXT:
412      case GL_LUMINANCE32I_EXT:
413      case GL_LUMINANCE_ALPHA32I_EXT:
414         return MESA_FORMAT_RGBA_INT32;
415      case GL_RGBA16I_EXT:
416      case GL_RGB16I_EXT:
417      case GL_ALPHA16I_EXT:
418      case GL_INTENSITY16I_EXT:
419      case GL_LUMINANCE16I_EXT:
420      case GL_LUMINANCE_ALPHA16I_EXT:
421         return MESA_FORMAT_RGBA_INT16;
422      case GL_RGBA8I_EXT:
423      case GL_RGB8I_EXT:
424      case GL_ALPHA8I_EXT:
425      case GL_INTENSITY8I_EXT:
426      case GL_LUMINANCE8I_EXT:
427      case GL_LUMINANCE_ALPHA8I_EXT:
428         return MESA_FORMAT_RGBA_INT8;
429      }
430   }
431
432   _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
433   return MESA_FORMAT_NONE;
434}
435
436