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  * Authors:
28  *   Brian Paul
29  */
30 
31 
32 #ifndef FORMATS_H
33 #define FORMATS_H
34 
35 
36 #include <GL/gl.h>
37 
38 
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
43 
44 /* OpenGL doesn't have GL_UNSIGNED_BYTE_4_4, so we must define our own type
45  * for GL_LUMINANCE4_ALPHA4. */
46 #define MESA_UNSIGNED_BYTE_4_4 (GL_UNSIGNED_BYTE<<1)
47 
48 
49 /**
50  * Max number of bytes for any non-compressed pixel format below, or for
51  * intermediate pixel storage in Mesa.  This should never be less than
52  * 16.  Maybe 32 someday?
53  */
54 #define MAX_PIXEL_BYTES 16
55 
56 
57 /**
58  * Mesa texture/renderbuffer image formats.
59  */
60 typedef enum
61 {
62    MESA_FORMAT_NONE = 0,
63 
64    /**
65     * \name Basic hardware formats
66     */
67    /*@{*/
68 				/* msb <------ TEXEL BITS -----------> lsb */
69 				/* ---- ---- ---- ---- ---- ---- ---- ---- */
70    MESA_FORMAT_RGBA8888,	/* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
71    MESA_FORMAT_RGBA8888_REV,	/* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
72    MESA_FORMAT_ARGB8888,	/* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */
73    MESA_FORMAT_ARGB8888_REV,	/* BBBB BBBB GGGG GGGG RRRR RRRR AAAA AAAA */
74    MESA_FORMAT_RGBX8888,	/* RRRR RRRR GGGG GGGG BBBB BBBB XXXX XXXX */
75    MESA_FORMAT_RGBX8888_REV,	/* xxxx xxxx BBBB BBBB GGGG GGGG RRRR RRRR */
76    MESA_FORMAT_XRGB8888,	/* xxxx xxxx RRRR RRRR GGGG GGGG BBBB BBBB */
77    MESA_FORMAT_XRGB8888_REV,	/* BBBB BBBB GGGG GGGG RRRR RRRR xxxx xxxx */
78    MESA_FORMAT_RGB888,		/*           RRRR RRRR GGGG GGGG BBBB BBBB */
79    MESA_FORMAT_BGR888,		/*           BBBB BBBB GGGG GGGG RRRR RRRR */
80    MESA_FORMAT_RGB565,		/*                     RRRR RGGG GGGB BBBB */
81    MESA_FORMAT_RGB565_REV,	/*                     GGGB BBBB RRRR RGGG */
82    MESA_FORMAT_ARGB4444,	/*                     AAAA RRRR GGGG BBBB */
83    MESA_FORMAT_ARGB4444_REV,	/*                     GGGG BBBB AAAA RRRR */
84    MESA_FORMAT_RGBA5551,        /*                     RRRR RGGG GGBB BBBA */
85    MESA_FORMAT_ARGB1555,	/*                     ARRR RRGG GGGB BBBB */
86    MESA_FORMAT_ARGB1555_REV,	/*                     GGGB BBBB ARRR RRGG */
87    MESA_FORMAT_AL44,		/*                               AAAA LLLL */
88    MESA_FORMAT_AL88,		/*                     AAAA AAAA LLLL LLLL */
89    MESA_FORMAT_AL88_REV,	/*                     LLLL LLLL AAAA AAAA */
90    MESA_FORMAT_AL1616,          /* AAAA AAAA AAAA AAAA LLLL LLLL LLLL LLLL */
91    MESA_FORMAT_AL1616_REV,      /* LLLL LLLL LLLL LLLL AAAA AAAA AAAA AAAA */
92    MESA_FORMAT_RGB332,		/*                               RRRG GGBB */
93    MESA_FORMAT_A8,		/*                               AAAA AAAA */
94    MESA_FORMAT_A16,             /*                     AAAA AAAA AAAA AAAA */
95    MESA_FORMAT_L8,		/*                               LLLL LLLL */
96    MESA_FORMAT_L16,             /*                     LLLL LLLL LLLL LLLL */
97    MESA_FORMAT_I8,		/*                               IIII IIII */
98    MESA_FORMAT_I16,             /*                     IIII IIII IIII IIII */
99    MESA_FORMAT_YCBCR,		/*                     YYYY YYYY UorV UorV */
100    MESA_FORMAT_YCBCR_REV,	/*                     UorV UorV YYYY YYYY */
101    MESA_FORMAT_R8,		/*                               RRRR RRRR */
102    MESA_FORMAT_GR88,		/*                     GGGG GGGG RRRR RRRR */
103    MESA_FORMAT_RG88,    	/*                     RRRR RRRR GGGG GGGG */
104    MESA_FORMAT_R16,		/*                     RRRR RRRR RRRR RRRR */
105    MESA_FORMAT_RG1616,		/* GGGG GGGG GGGG GGGG RRRR RRRR RRRR RRRR */
106    MESA_FORMAT_RG1616_REV,	/* RRRR RRRR RRRR RRRR GGGG GGGG GGGG GGGG */
107    MESA_FORMAT_ARGB2101010,     /* AARR RRRR RRRR GGGG GGGG GGBB BBBB BBBB */
108    MESA_FORMAT_Z24_S8,          /* ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ SSSS SSSS */
109    MESA_FORMAT_S8_Z24,          /* SSSS SSSS ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */
110    MESA_FORMAT_Z16,             /*                     ZZZZ ZZZZ ZZZZ ZZZZ */
111    MESA_FORMAT_X8_Z24,          /* xxxx xxxx ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */
112    MESA_FORMAT_Z24_X8,          /* ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ xxxx xxxx */
113    MESA_FORMAT_Z32,             /* ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */
114    MESA_FORMAT_S8,              /*                               SSSS SSSS */
115    /*@}*/
116 
117    /**
118     * \name 8-bit/channel sRGB formats
119     */
120    /*@{*/
121    MESA_FORMAT_SRGB8,           /*           RRRR RRRR GGGG GGGG BBBB BBBB */
122    MESA_FORMAT_SRGBA8,          /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
123    MESA_FORMAT_SARGB8,          /* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */
124    MESA_FORMAT_SL8,             /*                               LLLL LLLL */
125    MESA_FORMAT_SLA8,            /*                     AAAA AAAA LLLL LLLL */
126    MESA_FORMAT_SRGB_DXT1,
127    MESA_FORMAT_SRGBA_DXT1,
128    MESA_FORMAT_SRGBA_DXT3,
129    MESA_FORMAT_SRGBA_DXT5,
130    /*@}*/
131 
132    /**
133     * \name Compressed texture formats.
134     */
135    /*@{*/
136    MESA_FORMAT_RGB_FXT1,
137    MESA_FORMAT_RGBA_FXT1,
138    MESA_FORMAT_RGB_DXT1,
139    MESA_FORMAT_RGBA_DXT1,
140    MESA_FORMAT_RGBA_DXT3,
141    MESA_FORMAT_RGBA_DXT5,
142    /*@}*/
143 
144    /**
145     * \name Floating point texture formats.
146     */
147    /*@{*/
148    MESA_FORMAT_RGBA_FLOAT32,
149    MESA_FORMAT_RGBA_FLOAT16,
150    MESA_FORMAT_RGB_FLOAT32,
151    MESA_FORMAT_RGB_FLOAT16,
152    MESA_FORMAT_ALPHA_FLOAT32,
153    MESA_FORMAT_ALPHA_FLOAT16,
154    MESA_FORMAT_LUMINANCE_FLOAT32,
155    MESA_FORMAT_LUMINANCE_FLOAT16,
156    MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32,
157    MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,
158    MESA_FORMAT_INTENSITY_FLOAT32,
159    MESA_FORMAT_INTENSITY_FLOAT16,
160    MESA_FORMAT_R_FLOAT32,
161    MESA_FORMAT_R_FLOAT16,
162    MESA_FORMAT_RG_FLOAT32,
163    MESA_FORMAT_RG_FLOAT16,
164    /*@}*/
165 
166    /**
167     * \name Non-normalized signed integer formats.
168     * XXX Note: these are just stand-ins for some better hardware
169     * formats TBD such as BGRA or ARGB.
170     */
171    MESA_FORMAT_ALPHA_UINT8,
172    MESA_FORMAT_ALPHA_UINT16,
173    MESA_FORMAT_ALPHA_UINT32,
174    MESA_FORMAT_ALPHA_INT8,
175    MESA_FORMAT_ALPHA_INT16,
176    MESA_FORMAT_ALPHA_INT32,
177 
178    MESA_FORMAT_INTENSITY_UINT8,
179    MESA_FORMAT_INTENSITY_UINT16,
180    MESA_FORMAT_INTENSITY_UINT32,
181    MESA_FORMAT_INTENSITY_INT8,
182    MESA_FORMAT_INTENSITY_INT16,
183    MESA_FORMAT_INTENSITY_INT32,
184 
185    MESA_FORMAT_LUMINANCE_UINT8,
186    MESA_FORMAT_LUMINANCE_UINT16,
187    MESA_FORMAT_LUMINANCE_UINT32,
188    MESA_FORMAT_LUMINANCE_INT8,
189    MESA_FORMAT_LUMINANCE_INT16,
190    MESA_FORMAT_LUMINANCE_INT32,
191 
192    MESA_FORMAT_LUMINANCE_ALPHA_UINT8,
193    MESA_FORMAT_LUMINANCE_ALPHA_UINT16,
194    MESA_FORMAT_LUMINANCE_ALPHA_UINT32,
195    MESA_FORMAT_LUMINANCE_ALPHA_INT8,
196    MESA_FORMAT_LUMINANCE_ALPHA_INT16,
197    MESA_FORMAT_LUMINANCE_ALPHA_INT32,
198 
199    MESA_FORMAT_R_INT8,
200    MESA_FORMAT_RG_INT8,
201    MESA_FORMAT_RGB_INT8,
202    MESA_FORMAT_RGBA_INT8,
203    MESA_FORMAT_R_INT16,
204    MESA_FORMAT_RG_INT16,
205    MESA_FORMAT_RGB_INT16,
206    MESA_FORMAT_RGBA_INT16,
207    MESA_FORMAT_R_INT32,
208    MESA_FORMAT_RG_INT32,
209    MESA_FORMAT_RGB_INT32,
210    MESA_FORMAT_RGBA_INT32,
211 
212    /**
213     * \name Non-normalized unsigned integer formats.
214     */
215    MESA_FORMAT_R_UINT8,
216    MESA_FORMAT_RG_UINT8,
217    MESA_FORMAT_RGB_UINT8,
218    MESA_FORMAT_RGBA_UINT8,
219    MESA_FORMAT_R_UINT16,
220    MESA_FORMAT_RG_UINT16,
221    MESA_FORMAT_RGB_UINT16,
222    MESA_FORMAT_RGBA_UINT16,
223    MESA_FORMAT_R_UINT32,
224    MESA_FORMAT_RG_UINT32,
225    MESA_FORMAT_RGB_UINT32,
226    MESA_FORMAT_RGBA_UINT32,
227 
228                                   /* msb <------ TEXEL BITS -----------> lsb */
229                                   /* ---- ---- ---- ---- ---- ---- ---- ---- */
230    /**
231     * \name Signed fixed point texture formats.
232     */
233    /*@{*/
234    MESA_FORMAT_DUDV8,             /*                     DUDU DUDU DVDV DVDV */
235    MESA_FORMAT_SIGNED_R8,         /*                               RRRR RRRR */
236    MESA_FORMAT_SIGNED_RG88_REV,   /*                     GGGG GGGG RRRR RRRR */
237    MESA_FORMAT_SIGNED_RGBX8888,   /* RRRR RRRR GGGG GGGG BBBB BBBB xxxx xxxx */
238    MESA_FORMAT_SIGNED_RGBA8888,   /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
239    MESA_FORMAT_SIGNED_RGBA8888_REV,/*AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
240    MESA_FORMAT_SIGNED_R16,        /*                     RRRR RRRR RRRR RRRR */
241    MESA_FORMAT_SIGNED_GR1616,     /* GGGG GGGG GGGG GGGG RRRR RRRR RRRR RRRR */
242    MESA_FORMAT_SIGNED_RGB_16,     /* ushort[0]=R, ushort[1]=G, ushort[2]=B */
243    MESA_FORMAT_SIGNED_RGBA_16,    /* ... */
244    MESA_FORMAT_RGBA_16,           /* ... */
245    /*@}*/
246 
247    /*@{*/
248    MESA_FORMAT_RED_RGTC1,
249    MESA_FORMAT_SIGNED_RED_RGTC1,
250    MESA_FORMAT_RG_RGTC2,
251    MESA_FORMAT_SIGNED_RG_RGTC2,
252    /*@}*/
253 
254    /*@{*/
255    MESA_FORMAT_L_LATC1,
256    MESA_FORMAT_SIGNED_L_LATC1,
257    MESA_FORMAT_LA_LATC2,
258    MESA_FORMAT_SIGNED_LA_LATC2,
259    /*@}*/
260 
261    MESA_FORMAT_ETC1_RGB8,
262 
263    MESA_FORMAT_SIGNED_A8,         /*                               AAAA AAAA */
264    MESA_FORMAT_SIGNED_L8,         /*                               LLLL LLLL */
265    MESA_FORMAT_SIGNED_AL88,       /*                     AAAA AAAA LLLL LLLL */
266    MESA_FORMAT_SIGNED_I8,         /*                               IIII IIII */
267    MESA_FORMAT_SIGNED_A16,        /*                     AAAA AAAA AAAA AAAA */
268    MESA_FORMAT_SIGNED_L16,        /*                     LLLL LLLL LLLL LLLL */
269    MESA_FORMAT_SIGNED_AL1616,     /* AAAA AAAA AAAA AAAA LLLL LLLL LLLL LLLL */
270    MESA_FORMAT_SIGNED_I16,        /*                     IIII IIII IIII IIII */
271 
272    MESA_FORMAT_RGB9_E5_FLOAT,
273    MESA_FORMAT_R11_G11_B10_FLOAT,
274 
275    MESA_FORMAT_Z32_FLOAT,
276    MESA_FORMAT_Z32_FLOAT_X24S8,
277 
278    MESA_FORMAT_ARGB2101010_UINT,
279    MESA_FORMAT_ABGR2101010_UINT,
280 
281    MESA_FORMAT_COUNT
282 } gl_format;
283 
284 
285 extern const char *
286 _mesa_get_format_name(gl_format format);
287 
288 extern GLint
289 _mesa_get_format_bytes(gl_format format);
290 
291 extern GLint
292 _mesa_get_format_bits(gl_format format, GLenum pname);
293 
294 extern GLuint
295 _mesa_get_format_max_bits(gl_format format);
296 
297 extern GLenum
298 _mesa_get_format_datatype(gl_format format);
299 
300 extern GLenum
301 _mesa_get_format_base_format(gl_format format);
302 
303 extern void
304 _mesa_get_format_block_size(gl_format format, GLuint *bw, GLuint *bh);
305 
306 extern GLboolean
307 _mesa_is_format_compressed(gl_format format);
308 
309 extern GLboolean
310 _mesa_is_format_packed_depth_stencil(gl_format format);
311 
312 extern GLboolean
313 _mesa_is_format_integer_color(gl_format format);
314 
315 extern GLboolean
316 _mesa_is_format_unsigned(gl_format format);
317 
318 extern GLenum
319 _mesa_get_format_color_encoding(gl_format format);
320 
321 extern GLuint
322 _mesa_format_image_size(gl_format format, GLsizei width,
323                         GLsizei height, GLsizei depth);
324 
325 extern uint64_t
326 _mesa_format_image_size64(gl_format format, GLsizei width,
327                           GLsizei height, GLsizei depth);
328 
329 extern GLint
330 _mesa_format_row_stride(gl_format format, GLsizei width);
331 
332 extern void
333 _mesa_format_to_type_and_comps(gl_format format,
334                                GLenum *datatype, GLuint *comps);
335 
336 extern void
337 _mesa_test_formats(void);
338 
339 extern gl_format
340 _mesa_get_srgb_format_linear(gl_format format);
341 
342 extern gl_format
343 _mesa_get_uncompressed_format(gl_format format);
344 
345 extern GLuint
346 _mesa_format_num_components(gl_format format);
347 
348 GLboolean
349 _mesa_format_matches_format_and_type(gl_format gl_format,
350 				     GLenum format, GLenum type,
351                                      GLboolean swapBytes);
352 
353 #ifdef __cplusplus
354 }
355 #endif
356 
357 #endif /* FORMATS_H */
358