formats.c revision c28d78f8324cfc17936af63c258a1cc55d590d60
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#include "imports.h"
28#include "formats.h"
29#include "config.h"
30#include "texstore.h"
31
32
33/**
34 * Info about each format.
35 * These must be in the same order as the MESA_FORMAT_* enums so that
36 * we can do lookups without searching.
37 */
38static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
39{
40   {
41      MESA_FORMAT_NONE,            /* Name */
42      GL_NONE,                     /* BaseFormat */
43      GL_NONE,                     /* DataType */
44      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
45      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
46      0, 0, 0                      /* BlockWidth/Height,Bytes */
47   },
48   {
49      MESA_FORMAT_RGBA8888,        /* Name */
50      GL_RGBA,                     /* BaseFormat */
51      GL_UNSIGNED_NORMALIZED,      /* DataType */
52      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
53      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
54      1, 1, 4                      /* BlockWidth/Height,Bytes */
55   },
56   {
57      MESA_FORMAT_RGBA8888_REV,    /* Name */
58      GL_RGBA,                     /* BaseFormat */
59      GL_UNSIGNED_NORMALIZED,      /* DataType */
60      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
61      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
62      1, 1, 4                      /* BlockWidth/Height,Bytes */
63   },
64   {
65      MESA_FORMAT_ARGB8888,        /* Name */
66      GL_RGBA,                     /* BaseFormat */
67      GL_UNSIGNED_NORMALIZED,      /* DataType */
68      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
69      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
70      1, 1, 4                      /* BlockWidth/Height,Bytes */
71   },
72   {
73      MESA_FORMAT_ARGB8888_REV,    /* Name */
74      GL_RGBA,                     /* BaseFormat */
75      GL_UNSIGNED_NORMALIZED,      /* DataType */
76      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
77      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
78      1, 1, 4                      /* BlockWidth/Height,Bytes */
79   },
80   {
81      MESA_FORMAT_RGB888,          /* Name */
82      GL_RGB,                      /* BaseFormat */
83      GL_UNSIGNED_NORMALIZED,      /* DataType */
84      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
85      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
86      1, 1, 3                      /* BlockWidth/Height,Bytes */
87   },
88   {
89      MESA_FORMAT_BGR888,          /* Name */
90      GL_RGB,                      /* BaseFormat */
91      GL_UNSIGNED_NORMALIZED,      /* DataType */
92      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
93      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
94      1, 1, 3                      /* BlockWidth/Height,Bytes */
95   },
96   {
97      MESA_FORMAT_RGB565,          /* Name */
98      GL_RGB,                      /* BaseFormat */
99      GL_UNSIGNED_NORMALIZED,      /* DataType */
100      5, 6, 5, 0,                  /* Red/Green/Blue/AlphaBits */
101      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
102      1, 1, 2                      /* BlockWidth/Height,Bytes */
103   },
104   {
105      MESA_FORMAT_RGB565_REV,      /* Name */
106      GL_RGB,                      /* BaseFormat */
107      GL_UNSIGNED_NORMALIZED,      /* DataType */
108      5, 6, 5, 0,                  /* Red/Green/Blue/AlphaBits */
109      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
110      1, 1, 2                      /* BlockWidth/Height,Bytes */
111   },
112   {
113      MESA_FORMAT_RGBA4444,        /* Name */
114      GL_RGBA,                     /* BaseFormat */
115      GL_UNSIGNED_NORMALIZED,      /* DataType */
116      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
117      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
118      1, 1, 2                      /* BlockWidth/Height,Bytes */
119   },
120   {
121      MESA_FORMAT_ARGB4444,        /* Name */
122      GL_RGBA,                     /* BaseFormat */
123      GL_UNSIGNED_NORMALIZED,      /* DataType */
124      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
125      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
126      1, 1, 2                      /* BlockWidth/Height,Bytes */
127   },
128   {
129      MESA_FORMAT_ARGB4444_REV,    /* Name */
130      GL_RGBA,                     /* BaseFormat */
131      GL_UNSIGNED_NORMALIZED,      /* DataType */
132      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
133      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
134      1, 1, 2                      /* BlockWidth/Height,Bytes */
135   },
136   {
137      MESA_FORMAT_RGBA5551,        /* Name */
138      GL_RGBA,                     /* BaseFormat */
139      GL_UNSIGNED_NORMALIZED,      /* DataType */
140      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
141      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
142      1, 1, 2                      /* BlockWidth/Height,Bytes */
143   },
144   {
145      MESA_FORMAT_ARGB1555,        /* Name */
146      GL_RGBA,                     /* BaseFormat */
147      GL_UNSIGNED_NORMALIZED,      /* DataType */
148      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
149      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
150      1, 1, 2                      /* BlockWidth/Height,Bytes */
151   },
152   {
153      MESA_FORMAT_ARGB1555_REV,    /* Name */
154      GL_RGBA,                     /* BaseFormat */
155      GL_UNSIGNED_NORMALIZED,      /* DataType */
156      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
157      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
158      1, 1, 2                      /* BlockWidth/Height,Bytes */
159   },
160   {
161      MESA_FORMAT_AL88,            /* Name */
162      GL_LUMINANCE_ALPHA,          /* BaseFormat */
163      GL_UNSIGNED_NORMALIZED,      /* DataType */
164      0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */
165      8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
166      1, 1, 2                      /* BlockWidth/Height,Bytes */
167   },
168   {
169      MESA_FORMAT_AL88_REV,        /* Name */
170      GL_LUMINANCE_ALPHA,          /* BaseFormat */
171      GL_UNSIGNED_NORMALIZED,      /* DataType */
172      0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */
173      8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
174      1, 1, 2                      /* BlockWidth/Height,Bytes */
175   },
176   {
177      MESA_FORMAT_RGB332,          /* Name */
178      GL_RGB,                      /* BaseFormat */
179      GL_UNSIGNED_NORMALIZED,      /* DataType */
180      3, 3, 2, 0,                  /* Red/Green/Blue/AlphaBits */
181      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
182      1, 1, 1                      /* BlockWidth/Height,Bytes */
183   },
184   {
185      MESA_FORMAT_A8,              /* Name */
186      GL_ALPHA,                    /* BaseFormat */
187      GL_UNSIGNED_NORMALIZED,      /* DataType */
188      0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */
189      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
190      1, 1, 1                      /* BlockWidth/Height,Bytes */
191   },
192   {
193      MESA_FORMAT_L8,              /* Name */
194      GL_LUMINANCE,                /* BaseFormat */
195      GL_UNSIGNED_NORMALIZED,      /* DataType */
196      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
197      8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
198      1, 1, 1                      /* BlockWidth/Height,Bytes */
199   },
200   {
201      MESA_FORMAT_I8,              /* Name */
202      GL_INTENSITY,                /* BaseFormat */
203      GL_UNSIGNED_NORMALIZED,      /* DataType */
204      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
205      0, 8, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
206      1, 1, 1                      /* BlockWidth/Height,Bytes */
207   },
208   {
209      MESA_FORMAT_CI8,             /* Name */
210      GL_COLOR_INDEX,              /* BaseFormat */
211      GL_UNSIGNED_INT,             /* DataType */
212      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
213      0, 0, 8, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
214      1, 1, 1                      /* BlockWidth/Height,Bytes */
215   },
216   {
217      MESA_FORMAT_YCBCR,           /* Name */
218      GL_YCBCR_MESA,               /* BaseFormat */
219      GL_UNSIGNED_NORMALIZED,      /* DataType */
220      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
221      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
222      1, 1, 2                      /* BlockWidth/Height,Bytes */
223   },
224   {
225      MESA_FORMAT_YCBCR_REV,       /* Name */
226      GL_YCBCR_MESA,               /* BaseFormat */
227      GL_UNSIGNED_NORMALIZED,      /* DataType */
228      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
229      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
230      1, 1, 2                      /* BlockWidth/Height,Bytes */
231   },
232   {
233      MESA_FORMAT_Z24_S8,          /* Name */
234      GL_DEPTH_STENCIL,            /* BaseFormat */
235      GL_UNSIGNED_INT,             /* DataType */
236      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
237      0, 0, 0, 24, 8,              /* Lum/Int/Index/Depth/StencilBits */
238      1, 1, 4                      /* BlockWidth/Height,Bytes */
239   },
240   {
241      MESA_FORMAT_S8_Z24,          /* Name */
242      GL_DEPTH_STENCIL,            /* BaseFormat */
243      GL_UNSIGNED_INT,             /* DataType */
244      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
245      0, 0, 0, 24, 8,              /* Lum/Int/Index/Depth/StencilBits */
246      1, 1, 4                      /* BlockWidth/Height,Bytes */
247   },
248   {
249      MESA_FORMAT_Z16,             /* Name */
250      GL_DEPTH_COMPONENT,          /* BaseFormat */
251      GL_UNSIGNED_INT,             /* DataType */
252      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
253      0, 0, 0, 16, 0,              /* Lum/Int/Index/Depth/StencilBits */
254      1, 1, 2                      /* BlockWidth/Height,Bytes */
255   },
256   {
257      MESA_FORMAT_Z32,             /* Name */
258      GL_DEPTH_COMPONENT,          /* BaseFormat */
259      GL_UNSIGNED_INT,             /* DataType */
260      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
261      0, 0, 0, 32, 0,              /* Lum/Int/Index/Depth/StencilBits */
262      1, 1, 4                      /* BlockWidth/Height,Bytes */
263   },
264   {
265      MESA_FORMAT_S8,              /* Name */
266      GL_STENCIL_INDEX,            /* BaseFormat */
267      GL_UNSIGNED_INT,             /* DataType */
268      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
269      0, 0, 0, 0, 8,               /* Lum/Int/Index/Depth/StencilBits */
270      1, 1, 1                      /* BlockWidth/Height,Bytes */
271   },
272
273#if FEATURE_EXT_texture_sRGB
274   {
275      MESA_FORMAT_SRGB8,
276      GL_RGB,
277      GL_UNSIGNED_NORMALIZED,
278      8, 8, 8, 0,
279      0, 0, 0, 0, 0,
280      1, 1, 3
281   },
282   {
283      MESA_FORMAT_SRGBA8,
284      GL_RGBA,
285      GL_UNSIGNED_NORMALIZED,
286      8, 8, 8, 8,
287      0, 0, 0, 0, 0,
288      1, 1, 4
289   },
290   {
291      MESA_FORMAT_SARGB8,
292      GL_RGBA,
293      GL_UNSIGNED_NORMALIZED,
294      8, 8, 8, 8,
295      0, 0, 0, 0, 0,
296      1, 1, 4
297   },
298   {
299      MESA_FORMAT_SL8,
300      GL_LUMINANCE_ALPHA,
301      GL_UNSIGNED_NORMALIZED,
302      0, 0, 0, 8,
303      8, 0, 0, 0, 0,
304      1, 1, 2
305   },
306   {
307      MESA_FORMAT_SLA8,
308      GL_LUMINANCE_ALPHA,
309      GL_UNSIGNED_NORMALIZED,
310      0, 0, 0, 8,
311      8, 0, 0, 0, 0,
312      1, 1, 2
313   },
314#if FEATURE_texture_s3tc
315   {
316      MESA_FORMAT_SRGB_DXT1,       /* Name */
317      GL_RGB,                      /* BaseFormat */
318      GL_UNSIGNED_NORMALIZED,      /* DataType */
319      4, 4, 4, 0,                  /* approx Red/Green/Blue/AlphaBits */
320      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
321      4, 4, 8                      /* 8 bytes per 4x4 block */
322   },
323   {
324      MESA_FORMAT_SRGBA_DXT1,
325      GL_RGBA,
326      GL_UNSIGNED_NORMALIZED,
327      4, 4, 4, 4,
328      0, 0, 0, 0, 0,
329      4, 4, 8                      /* 8 bytes per 4x4 block */
330   },
331   {
332      MESA_FORMAT_SRGBA_DXT3,
333      GL_RGBA,
334      GL_UNSIGNED_NORMALIZED,
335      4, 4, 4, 4,
336      0, 0, 0, 0, 0,
337      4, 4, 16                     /* 16 bytes per 4x4 block */
338   },
339   {
340      MESA_FORMAT_SRGBA_DXT5,
341      GL_RGBA,
342      GL_UNSIGNED_NORMALIZED,
343      4, 4, 4, 4,
344      0, 0, 0, 0, 0,
345      4, 4, 16                     /* 16 bytes per 4x4 block */
346   },
347#endif
348#endif
349
350#if FEATURE_texture_fxt1
351   {
352      MESA_FORMAT_RGB_FXT1,
353      GL_RGB,
354      GL_UNSIGNED_NORMALIZED,
355      8, 8, 8, 0,
356      0, 0, 0, 0, 0,
357      8, 4, 16                     /* 16 bytes per 8x4 block */
358   },
359   {
360      MESA_FORMAT_RGBA_FXT1,
361      GL_RGBA,
362      GL_UNSIGNED_NORMALIZED,
363      8, 8, 8, 8,
364      0, 0, 0, 0, 0,
365      8, 4, 16                     /* 16 bytes per 8x4 block */
366   },
367#endif
368
369#if FEATURE_texture_s3tc
370   {
371      MESA_FORMAT_RGB_DXT1,        /* Name */
372      GL_RGB,                      /* BaseFormat */
373      GL_UNSIGNED_NORMALIZED,      /* DataType */
374      4, 4, 4, 0,                  /* approx Red/Green/Blue/AlphaBits */
375      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
376      4, 4, 8                      /* 8 bytes per 4x4 block */
377   },
378   {
379      MESA_FORMAT_RGBA_DXT1,
380      GL_RGBA,
381      GL_UNSIGNED_NORMALIZED,
382      4, 4, 4, 4,
383      0, 0, 0, 0, 0,
384      4, 4, 8                      /* 8 bytes per 4x4 block */
385   },
386   {
387      MESA_FORMAT_RGBA_DXT3,
388      GL_RGBA,
389      GL_UNSIGNED_NORMALIZED,
390      4, 4, 4, 4,
391      0, 0, 0, 0, 0,
392      4, 4, 16                     /* 16 bytes per 4x4 block */
393   },
394   {
395      MESA_FORMAT_RGBA_DXT5,
396      GL_RGBA,
397      GL_UNSIGNED_NORMALIZED,
398      4, 4, 4, 4,
399      0, 0, 0, 0, 0,
400      4, 4, 16                     /* 16 bytes per 4x4 block */
401   },
402#endif
403
404   {
405      MESA_FORMAT_RGBA,
406      GL_RGBA,
407      GL_UNSIGNED_NORMALIZED,
408      CHAN_BITS, CHAN_BITS, CHAN_BITS, CHAN_BITS,
409      0, 0, 0, 0, 0,
410      1, 1, 4 * CHAN_BITS / 8
411   },
412   {
413      MESA_FORMAT_RGB,
414      GL_RGB,
415      GL_UNSIGNED_NORMALIZED,
416      CHAN_BITS, CHAN_BITS, CHAN_BITS, 0,
417      0, 0, 0, 0, 0,
418      1, 1, 3 * CHAN_BITS / 8
419   },
420   {
421      MESA_FORMAT_ALPHA,
422      GL_ALPHA,
423      GL_UNSIGNED_NORMALIZED,
424      0, 0, 0, CHAN_BITS,
425      0, 0, 0, 0, 0,
426      1, 1, 1 * CHAN_BITS / 8
427   },
428   {
429      MESA_FORMAT_LUMINANCE,
430      GL_LUMINANCE,
431      GL_UNSIGNED_NORMALIZED,
432      0, 0, 0, 0,
433      CHAN_BITS, 0, 0, 0, 0,
434      1, 1, 1 * CHAN_BITS / 8
435   },
436   {
437      MESA_FORMAT_LUMINANCE_ALPHA,
438      GL_LUMINANCE_ALPHA,
439      GL_UNSIGNED_NORMALIZED,
440      0, 0, 0, CHAN_BITS,
441      CHAN_BITS, 0, 0, 0, 0,
442      1, 1, 2 * CHAN_BITS / 8
443   },
444   {
445      MESA_FORMAT_INTENSITY,
446      GL_INTENSITY,
447      GL_UNSIGNED_NORMALIZED,
448      0, 0, 0, 0,
449      0, CHAN_BITS, 0, 0, 0,
450      1, 1, 1 * CHAN_BITS / 8
451   },
452   {
453      MESA_FORMAT_RGBA_FLOAT32,
454      GL_RGBA,
455      GL_FLOAT,
456      32, 32, 32, 32,
457      0, 0, 0, 0, 0,
458      1, 1, 16
459   },
460   {
461      MESA_FORMAT_RGBA_FLOAT16,
462      GL_RGBA,
463      GL_FLOAT,
464      16, 16, 16, 16,
465      0, 0, 0, 0, 0,
466      1, 1, 8
467   },
468   {
469      MESA_FORMAT_RGB_FLOAT32,
470      GL_RGB,
471      GL_FLOAT,
472      32, 32, 32, 0,
473      0, 0, 0, 0, 0,
474      1, 1, 12
475   },
476   {
477      MESA_FORMAT_RGB_FLOAT16,
478      GL_RGB,
479      GL_FLOAT,
480      16, 16, 16, 0,
481      0, 0, 0, 0, 0,
482      1, 1, 6
483   },
484   {
485      MESA_FORMAT_ALPHA_FLOAT32,
486      GL_ALPHA,
487      GL_FLOAT,
488      0, 0, 0, 32,
489      0, 0, 0, 0, 0,
490      1, 1, 4
491   },
492   {
493      MESA_FORMAT_ALPHA_FLOAT16,
494      GL_ALPHA,
495      GL_FLOAT,
496      0, 0, 0, 16,
497      0, 0, 0, 0, 0,
498      1, 1, 2
499   },
500   {
501      MESA_FORMAT_LUMINANCE_FLOAT32,
502      GL_ALPHA,
503      GL_FLOAT,
504      0, 0, 0, 0,
505      32, 0, 0, 0, 0,
506      1, 1, 4
507   },
508   {
509      MESA_FORMAT_LUMINANCE_FLOAT16,
510      GL_ALPHA,
511      GL_FLOAT,
512      0, 0, 0, 0,
513      16, 0, 0, 0, 0,
514      1, 1, 2
515   },
516   {
517      MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32,
518      GL_LUMINANCE_ALPHA,
519      GL_FLOAT,
520      0, 0, 0, 32,
521      32, 0, 0, 0, 0,
522      1, 1, 8
523   },
524   {
525      MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,
526      GL_LUMINANCE_ALPHA,
527      GL_FLOAT,
528      0, 0, 0, 16,
529      16, 0, 0, 0, 0,
530      1, 1, 4
531   },
532   {
533      MESA_FORMAT_INTENSITY_FLOAT32,
534      GL_INTENSITY,
535      GL_FLOAT,
536      0, 0, 0, 0,
537      0, 32, 0, 0, 0,
538      1, 1, 4
539   },
540   {
541      MESA_FORMAT_INTENSITY_FLOAT16,
542      GL_INTENSITY,
543      GL_FLOAT,
544      0, 0, 0, 0,
545      0, 16, 0, 0, 0,
546      1, 1, 2
547   },
548
549   {
550      MESA_FORMAT_DUDV8,
551      GL_DUDV_ATI,
552      GL_SIGNED_NORMALIZED,
553      0, 0, 0, 0,
554      0, 0, 0, 0, 0,
555      1, 1, 2
556   },
557
558   {
559      MESA_FORMAT_SIGNED_RGBA8888,
560      GL_RGBA,
561      GL_SIGNED_NORMALIZED,
562      8, 8, 8, 8,
563      0, 0, 0, 0, 0,
564      1, 1, 4
565   },
566   {
567      MESA_FORMAT_SIGNED_RGBA8888_REV,
568      GL_RGBA,
569      GL_SIGNED_NORMALIZED,
570      8, 8, 8, 8,
571      0, 0, 0, 0, 0,
572      1, 1, 4
573   },
574
575};
576
577
578
579static const struct gl_format_info *
580_mesa_get_format_info(gl_format format)
581{
582   const struct gl_format_info *info = &format_info[format];
583   assert(info->Name == format);
584   return info;
585}
586
587
588GLuint
589_mesa_get_format_bytes(gl_format format)
590{
591   const struct gl_format_info *info = _mesa_get_format_info(format);
592   ASSERT(info->BytesPerBlock);
593   return info->BytesPerBlock;
594}
595
596
597GLenum
598_mesa_get_format_base_format(gl_format format)
599{
600   const struct gl_format_info *info = _mesa_get_format_info(format);
601   return info->BaseFormat;
602}
603
604
605GLboolean
606_mesa_is_format_compressed(gl_format format)
607{
608   const struct gl_format_info *info = _mesa_get_format_info(format);
609   return info->BlockWidth > 1 || info->BlockHeight > 1;
610}
611
612
613/**
614 * Do sanity checking of the format info table.
615 */
616void
617_mesa_test_formats(void)
618{
619   GLuint i;
620
621   assert(Elements(format_info) == MESA_FORMAT_COUNT);
622
623   for (i = 0; i < MESA_FORMAT_COUNT; i++) {
624      const struct gl_format_info *info = _mesa_get_format_info(i);
625      assert(info);
626
627      assert(info->Name == i);
628
629      if (info->Name == MESA_FORMAT_NONE)
630         continue;
631
632      if (info->BlockWidth == 1 && info->BlockHeight == 1) {
633         if (info->RedBits > 0) {
634            GLuint t = info->RedBits + info->GreenBits
635               + info->BlueBits + info->AlphaBits;
636            assert(t / 8 == info->BytesPerBlock);
637         }
638      }
639
640      assert(info->DataType == GL_UNSIGNED_NORMALIZED ||
641             info->DataType == GL_SIGNED_NORMALIZED ||
642             info->DataType == GL_UNSIGNED_INT ||
643             info->DataType == GL_FLOAT);
644
645      if (info->BaseFormat == GL_RGB) {
646         assert(info->RedBits > 0);
647         assert(info->GreenBits > 0);
648         assert(info->BlueBits > 0);
649         assert(info->AlphaBits == 0);
650         assert(info->LuminanceBits == 0);
651         assert(info->IntensityBits == 0);
652      }
653      else if (info->BaseFormat == GL_RGBA) {
654         assert(info->RedBits > 0);
655         assert(info->GreenBits > 0);
656         assert(info->BlueBits > 0);
657         assert(info->AlphaBits > 0);
658         assert(info->LuminanceBits == 0);
659         assert(info->IntensityBits == 0);
660      }
661      else if (info->BaseFormat == GL_LUMINANCE) {
662         assert(info->RedBits == 0);
663         assert(info->GreenBits == 0);
664         assert(info->BlueBits == 0);
665         assert(info->AlphaBits == 0);
666         assert(info->LuminanceBits > 0);
667         assert(info->IntensityBits == 0);
668      }
669      else if (info->BaseFormat == GL_INTENSITY) {
670         assert(info->RedBits == 0);
671         assert(info->GreenBits == 0);
672         assert(info->BlueBits == 0);
673         assert(info->AlphaBits == 0);
674         assert(info->LuminanceBits == 0);
675         assert(info->IntensityBits > 0);
676      }
677
678   }
679}
680
681
682/**
683 * XXX possible replacement for _mesa_format_to_type_and_comps()
684 * Used for mipmap generation.
685 */
686void
687_mesa_format_to_type_and_comps2(gl_format format,
688                                GLenum *datatype, GLuint *comps)
689{
690   const struct gl_format_info *info = _mesa_get_format_info(format);
691
692   /* We use a bunch of heuristics here.  If this gets too ugly we could
693    * just encode the info the in the gl_format_info structures.
694    */
695   if (info->BaseFormat == GL_RGB ||
696       info->BaseFormat == GL_RGBA ||
697       info->BaseFormat == GL_ALPHA) {
698      *comps = ((info->RedBits > 0) +
699                (info->GreenBits > 0) +
700                (info->BlueBits > 0) +
701                (info->AlphaBits > 0));
702
703      if (info->DataType== GL_FLOAT) {
704         if (info->RedBits == 32)
705            *datatype = GL_FLOAT;
706         else
707            *datatype = GL_HALF_FLOAT;
708      }
709      else if (info->GreenBits == 3) {
710         *datatype = GL_UNSIGNED_BYTE_3_3_2;
711      }
712      else if (info->GreenBits == 4) {
713         *datatype = GL_UNSIGNED_SHORT_4_4_4_4;
714      }
715      else if (info->GreenBits == 6) {
716         *datatype = GL_UNSIGNED_SHORT_5_6_5;
717      }
718      else if (info->GreenBits == 5) {
719         *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
720      }
721      else if (info->RedBits == 8) {
722         *datatype = GL_UNSIGNED_BYTE;
723      }
724      else {
725         ASSERT(info->RedBits == 16);
726         *datatype = GL_UNSIGNED_SHORT;
727      }
728   }
729   else if (info->BaseFormat == GL_LUMINANCE ||
730            info->BaseFormat == GL_LUMINANCE_ALPHA) {
731      *comps = ((info->LuminanceBits > 0) +
732                (info->AlphaBits > 0));
733      if (info->LuminanceBits == 8) {
734         *datatype = GL_UNSIGNED_BYTE;
735      }
736      else if (info->LuminanceBits == 16) {
737         *datatype = GL_UNSIGNED_SHORT;
738      }
739      else {
740         *datatype = GL_FLOAT;
741      }
742   }
743   else if (info->BaseFormat == GL_INTENSITY) {
744      *comps = 1;
745      if (info->IntensityBits == 8) {
746         *datatype = GL_UNSIGNED_BYTE;
747      }
748      else if (info->IntensityBits == 16) {
749         *datatype = GL_UNSIGNED_SHORT;
750      }
751      else {
752         *datatype = GL_FLOAT;
753      }
754   }
755   else if (info->BaseFormat == GL_COLOR_INDEX) {
756      *comps = 1;
757      *datatype = GL_UNSIGNED_BYTE;
758   }
759   else if (info->BaseFormat == GL_DEPTH_COMPONENT) {
760      *comps = 1;
761      if (info->DepthBits == 16) {
762         *datatype = GL_UNSIGNED_SHORT;
763      }
764      else {
765         ASSERT(info->DepthBits == 32);
766         *datatype = GL_UNSIGNED_INT;
767      }
768   }
769   else if (info->BaseFormat == GL_DEPTH_STENCIL) {
770      *comps = 1;
771      *datatype = GL_UNSIGNED_INT;
772   }
773   else if (info->BaseFormat == GL_YCBCR_MESA) {
774      *comps = 2;
775      *datatype = GL_UNSIGNED_SHORT;
776   }
777   else if (info->BaseFormat == GL_DUDV_ATI) {
778      *comps = 2;
779      *datatype = GL_BYTE;
780   }
781   else {
782      /* any other formats? */
783      ASSERT(0);
784      *comps = 1;
785      *datatype = GL_UNSIGNED_BYTE;
786   }
787}
788
789
790GLint
791_mesa_get_format_bits(gl_format format, GLenum pname)
792{
793   const struct gl_format_info *info = _mesa_get_format_info(format);
794
795   switch (pname) {
796   case GL_TEXTURE_RED_SIZE:
797      return info->RedBits;
798   case GL_TEXTURE_GREEN_SIZE:
799      return info->GreenBits;
800   case GL_TEXTURE_BLUE_SIZE:
801      return info->BlueBits;
802   case GL_TEXTURE_ALPHA_SIZE:
803      return info->AlphaBits;
804   case GL_TEXTURE_INTENSITY_SIZE:
805      return info->IntensityBits;
806   case GL_TEXTURE_LUMINANCE_SIZE:
807      return info->LuminanceBits;
808   case GL_TEXTURE_INDEX_SIZE_EXT:
809      return info->IndexBits;
810   case GL_TEXTURE_DEPTH_SIZE_ARB:
811      return info->DepthBits;
812   case GL_TEXTURE_STENCIL_SIZE_EXT:
813      return info->StencilBits;
814   default:
815      _mesa_problem(NULL, "bad pname in _mesa_get_format_bits()");
816      return 0;
817   }
818}
819