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 "mfeatures.h"
30#include "macros.h"
31#include "glformats.h"
32
33
34/**
35 * Information about texture formats.
36 */
37struct gl_format_info
38{
39   gl_format Name;
40
41   /** text name for debugging */
42   const char *StrName;
43
44   /**
45    * Base format is one of GL_RED, GL_RG, GL_RGB, GL_RGBA, GL_ALPHA,
46    * GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_INTENSITY, GL_YCBCR_MESA,
47    * GL_DEPTH_COMPONENT, GL_STENCIL_INDEX, GL_DEPTH_STENCIL, GL_DUDV_ATI.
48    */
49   GLenum BaseFormat;
50
51   /**
52    * Logical data type: one of  GL_UNSIGNED_NORMALIZED, GL_SIGNED_NORMALIZED,
53    * GL_UNSIGNED_INT, GL_INT, GL_FLOAT.
54    */
55   GLenum DataType;
56
57   GLubyte RedBits;
58   GLubyte GreenBits;
59   GLubyte BlueBits;
60   GLubyte AlphaBits;
61   GLubyte LuminanceBits;
62   GLubyte IntensityBits;
63   GLubyte IndexBits;
64   GLubyte DepthBits;
65   GLubyte StencilBits;
66
67   /**
68    * To describe compressed formats.  If not compressed, Width=Height=1.
69    */
70   GLubyte BlockWidth, BlockHeight;
71   GLubyte BytesPerBlock;
72};
73
74
75/**
76 * Info about each format.
77 * These must be in the same order as the MESA_FORMAT_* enums so that
78 * we can do lookups without searching.
79 */
80static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
81{
82   {
83      MESA_FORMAT_NONE,            /* Name */
84      "MESA_FORMAT_NONE",          /* StrName */
85      GL_NONE,                     /* BaseFormat */
86      GL_NONE,                     /* DataType */
87      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
88      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
89      0, 0, 0                      /* BlockWidth/Height,Bytes */
90   },
91   {
92      MESA_FORMAT_RGBA8888,        /* Name */
93      "MESA_FORMAT_RGBA8888",      /* StrName */
94      GL_RGBA,                     /* BaseFormat */
95      GL_UNSIGNED_NORMALIZED,      /* DataType */
96      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
97      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
98      1, 1, 4                      /* BlockWidth/Height,Bytes */
99   },
100   {
101      MESA_FORMAT_RGBA8888_REV,    /* Name */
102      "MESA_FORMAT_RGBA8888_REV",  /* StrName */
103      GL_RGBA,                     /* BaseFormat */
104      GL_UNSIGNED_NORMALIZED,      /* DataType */
105      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
106      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
107      1, 1, 4                      /* BlockWidth/Height,Bytes */
108   },
109   {
110      MESA_FORMAT_ARGB8888,        /* Name */
111      "MESA_FORMAT_ARGB8888",      /* StrName */
112      GL_RGBA,                     /* BaseFormat */
113      GL_UNSIGNED_NORMALIZED,      /* DataType */
114      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
115      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
116      1, 1, 4                      /* BlockWidth/Height,Bytes */
117   },
118   {
119      MESA_FORMAT_ARGB8888_REV,    /* Name */
120      "MESA_FORMAT_ARGB8888_REV",  /* StrName */
121      GL_RGBA,                     /* BaseFormat */
122      GL_UNSIGNED_NORMALIZED,      /* DataType */
123      8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
124      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
125      1, 1, 4                      /* BlockWidth/Height,Bytes */
126   },
127   {
128      MESA_FORMAT_RGBX8888,        /* Name */
129      "MESA_FORMAT_RGBX8888",      /* StrName */
130      GL_RGB,                      /* BaseFormat */
131      GL_UNSIGNED_NORMALIZED,      /* DataType */
132      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
133      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
134      1, 1, 4                      /* BlockWidth/Height,Bytes */
135   },
136   {
137      MESA_FORMAT_RGBX8888_REV,    /* Name */
138      "MESA_FORMAT_RGBX8888_REV",  /* StrName */
139      GL_RGB,                      /* BaseFormat */
140      GL_UNSIGNED_NORMALIZED,      /* DataType */
141      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
142      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
143      1, 1, 4                      /* BlockWidth/Height,Bytes */
144   },
145   {
146      MESA_FORMAT_XRGB8888,        /* Name */
147      "MESA_FORMAT_XRGB8888",      /* StrName */
148      GL_RGB,                      /* BaseFormat */
149      GL_UNSIGNED_NORMALIZED,      /* DataType */
150      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
151      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
152      1, 1, 4                      /* BlockWidth/Height,Bytes */
153   },
154   {
155      MESA_FORMAT_XRGB8888_REV,    /* Name */
156      "MESA_FORMAT_XRGB8888_REV",  /* StrName */
157      GL_RGB,                      /* BaseFormat */
158      GL_UNSIGNED_NORMALIZED,      /* DataType */
159      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
160      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
161      1, 1, 4                      /* BlockWidth/Height,Bytes */
162   },
163   {
164      MESA_FORMAT_RGB888,          /* Name */
165      "MESA_FORMAT_RGB888",        /* StrName */
166      GL_RGB,                      /* BaseFormat */
167      GL_UNSIGNED_NORMALIZED,      /* DataType */
168      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
169      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
170      1, 1, 3                      /* BlockWidth/Height,Bytes */
171   },
172   {
173      MESA_FORMAT_BGR888,          /* Name */
174      "MESA_FORMAT_BGR888",        /* StrName */
175      GL_RGB,                      /* BaseFormat */
176      GL_UNSIGNED_NORMALIZED,      /* DataType */
177      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
178      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
179      1, 1, 3                      /* BlockWidth/Height,Bytes */
180   },
181   {
182      MESA_FORMAT_RGB565,          /* Name */
183      "MESA_FORMAT_RGB565",        /* StrName */
184      GL_RGB,                      /* BaseFormat */
185      GL_UNSIGNED_NORMALIZED,      /* DataType */
186      5, 6, 5, 0,                  /* Red/Green/Blue/AlphaBits */
187      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
188      1, 1, 2                      /* BlockWidth/Height,Bytes */
189   },
190   {
191      MESA_FORMAT_RGB565_REV,      /* Name */
192      "MESA_FORMAT_RGB565_REV",    /* StrName */
193      GL_RGB,                      /* BaseFormat */
194      GL_UNSIGNED_NORMALIZED,      /* DataType */
195      5, 6, 5, 0,                  /* Red/Green/Blue/AlphaBits */
196      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
197      1, 1, 2                      /* BlockWidth/Height,Bytes */
198   },
199   {
200      MESA_FORMAT_ARGB4444,        /* Name */
201      "MESA_FORMAT_ARGB4444",      /* StrName */
202      GL_RGBA,                     /* BaseFormat */
203      GL_UNSIGNED_NORMALIZED,      /* DataType */
204      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
205      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
206      1, 1, 2                      /* BlockWidth/Height,Bytes */
207   },
208   {
209      MESA_FORMAT_ARGB4444_REV,    /* Name */
210      "MESA_FORMAT_ARGB4444_REV",  /* StrName */
211      GL_RGBA,                     /* BaseFormat */
212      GL_UNSIGNED_NORMALIZED,      /* DataType */
213      4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
214      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
215      1, 1, 2                      /* BlockWidth/Height,Bytes */
216   },
217   {
218      MESA_FORMAT_RGBA5551,        /* Name */
219      "MESA_FORMAT_RGBA5551",      /* StrName */
220      GL_RGBA,                     /* BaseFormat */
221      GL_UNSIGNED_NORMALIZED,      /* DataType */
222      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
223      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
224      1, 1, 2                      /* BlockWidth/Height,Bytes */
225   },
226   {
227      MESA_FORMAT_ARGB1555,        /* Name */
228      "MESA_FORMAT_ARGB1555",      /* StrName */
229      GL_RGBA,                     /* BaseFormat */
230      GL_UNSIGNED_NORMALIZED,      /* DataType */
231      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
232      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
233      1, 1, 2                      /* BlockWidth/Height,Bytes */
234   },
235   {
236      MESA_FORMAT_ARGB1555_REV,    /* Name */
237      "MESA_FORMAT_ARGB1555_REV",  /* StrName */
238      GL_RGBA,                     /* BaseFormat */
239      GL_UNSIGNED_NORMALIZED,      /* DataType */
240      5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
241      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
242      1, 1, 2                      /* BlockWidth/Height,Bytes */
243   },
244   {
245      MESA_FORMAT_AL44,            /* Name */
246      "MESA_FORMAT_AL44",          /* StrName */
247      GL_LUMINANCE_ALPHA,          /* BaseFormat */
248      GL_UNSIGNED_NORMALIZED,      /* DataType */
249      0, 0, 0, 4,                  /* Red/Green/Blue/AlphaBits */
250      4, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
251      1, 1, 1                      /* BlockWidth/Height,Bytes */
252   },
253   {
254      MESA_FORMAT_AL88,            /* Name */
255      "MESA_FORMAT_AL88",          /* StrName */
256      GL_LUMINANCE_ALPHA,          /* BaseFormat */
257      GL_UNSIGNED_NORMALIZED,      /* DataType */
258      0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */
259      8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
260      1, 1, 2                      /* BlockWidth/Height,Bytes */
261   },
262   {
263      MESA_FORMAT_AL88_REV,        /* Name */
264      "MESA_FORMAT_AL88_REV",      /* StrName */
265      GL_LUMINANCE_ALPHA,          /* BaseFormat */
266      GL_UNSIGNED_NORMALIZED,      /* DataType */
267      0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */
268      8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
269      1, 1, 2                      /* BlockWidth/Height,Bytes */
270   },
271   {
272      MESA_FORMAT_AL1616,          /* Name */
273      "MESA_FORMAT_AL1616",        /* StrName */
274      GL_LUMINANCE_ALPHA,          /* BaseFormat */
275      GL_UNSIGNED_NORMALIZED,      /* DataType */
276      0, 0, 0, 16,                 /* Red/Green/Blue/AlphaBits */
277      16, 0, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */
278      1, 1, 4                      /* BlockWidth/Height,Bytes */
279   },
280   {
281      MESA_FORMAT_AL1616_REV,      /* Name */
282      "MESA_FORMAT_AL1616_REV",    /* StrName */
283      GL_LUMINANCE_ALPHA,          /* BaseFormat */
284      GL_UNSIGNED_NORMALIZED,      /* DataType */
285      0, 0, 0, 16,                 /* Red/Green/Blue/AlphaBits */
286      16, 0, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */
287      1, 1, 4                      /* BlockWidth/Height,Bytes */
288   },
289   {
290      MESA_FORMAT_RGB332,          /* Name */
291      "MESA_FORMAT_RGB332",        /* StrName */
292      GL_RGB,                      /* BaseFormat */
293      GL_UNSIGNED_NORMALIZED,      /* DataType */
294      3, 3, 2, 0,                  /* Red/Green/Blue/AlphaBits */
295      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
296      1, 1, 1                      /* BlockWidth/Height,Bytes */
297   },
298   {
299      MESA_FORMAT_A8,              /* Name */
300      "MESA_FORMAT_A8",            /* StrName */
301      GL_ALPHA,                    /* BaseFormat */
302      GL_UNSIGNED_NORMALIZED,      /* DataType */
303      0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */
304      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
305      1, 1, 1                      /* BlockWidth/Height,Bytes */
306   },
307   {
308      MESA_FORMAT_A16,             /* Name */
309      "MESA_FORMAT_A16",           /* StrName */
310      GL_ALPHA,                    /* BaseFormat */
311      GL_UNSIGNED_NORMALIZED,      /* DataType */
312      0, 0, 0, 16,                 /* Red/Green/Blue/AlphaBits */
313      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
314      1, 1, 2                      /* BlockWidth/Height,Bytes */
315   },
316   {
317      MESA_FORMAT_L8,              /* Name */
318      "MESA_FORMAT_L8",            /* StrName */
319      GL_LUMINANCE,                /* BaseFormat */
320      GL_UNSIGNED_NORMALIZED,      /* DataType */
321      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
322      8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
323      1, 1, 1                      /* BlockWidth/Height,Bytes */
324   },
325   {
326      MESA_FORMAT_L16,             /* Name */
327      "MESA_FORMAT_L16",           /* StrName */
328      GL_LUMINANCE,                /* BaseFormat */
329      GL_UNSIGNED_NORMALIZED,      /* DataType */
330      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
331      16, 0, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */
332      1, 1, 2                      /* BlockWidth/Height,Bytes */
333   },
334   {
335      MESA_FORMAT_I8,              /* Name */
336      "MESA_FORMAT_I8",            /* StrName */
337      GL_INTENSITY,                /* BaseFormat */
338      GL_UNSIGNED_NORMALIZED,      /* DataType */
339      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
340      0, 8, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
341      1, 1, 1                      /* BlockWidth/Height,Bytes */
342   },
343   {
344      MESA_FORMAT_I16,             /* Name */
345      "MESA_FORMAT_I16",           /* StrName */
346      GL_INTENSITY,                /* BaseFormat */
347      GL_UNSIGNED_NORMALIZED,      /* DataType */
348      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
349      0, 16, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */
350      1, 1, 2                      /* BlockWidth/Height,Bytes */
351   },
352   {
353      MESA_FORMAT_YCBCR,           /* Name */
354      "MESA_FORMAT_YCBCR",         /* StrName */
355      GL_YCBCR_MESA,               /* BaseFormat */
356      GL_UNSIGNED_NORMALIZED,      /* DataType */
357      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
358      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
359      1, 1, 2                      /* BlockWidth/Height,Bytes */
360   },
361   {
362      MESA_FORMAT_YCBCR_REV,       /* Name */
363      "MESA_FORMAT_YCBCR_REV",     /* StrName */
364      GL_YCBCR_MESA,               /* BaseFormat */
365      GL_UNSIGNED_NORMALIZED,      /* DataType */
366      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
367      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
368      1, 1, 2                      /* BlockWidth/Height,Bytes */
369   },
370   {
371      MESA_FORMAT_R8,
372      "MESA_FORMAT_R8",
373      GL_RED,
374      GL_UNSIGNED_NORMALIZED,
375      8, 0, 0, 0,
376      0, 0, 0, 0, 0,
377      1, 1, 1
378   },
379   {
380      MESA_FORMAT_GR88,
381      "MESA_FORMAT_GR88",
382      GL_RG,
383      GL_UNSIGNED_NORMALIZED,
384      8, 8, 0, 0,
385      0, 0, 0, 0, 0,
386      1, 1, 2
387   },
388   {
389      MESA_FORMAT_RG88,
390      "MESA_FORMAT_RG88",
391      GL_RG,
392      GL_UNSIGNED_NORMALIZED,
393      8, 8, 0, 0,
394      0, 0, 0, 0, 0,
395      1, 1, 2
396   },
397   {
398      MESA_FORMAT_R16,
399      "MESA_FORMAT_R16",
400      GL_RED,
401      GL_UNSIGNED_NORMALIZED,
402      16, 0, 0, 0,
403      0, 0, 0, 0, 0,
404      1, 1, 2
405   },
406   {
407      MESA_FORMAT_RG1616,
408      "MESA_FORMAT_RG1616",
409      GL_RG,
410      GL_UNSIGNED_NORMALIZED,
411      16, 16, 0, 0,
412      0, 0, 0, 0, 0,
413      1, 1, 4
414   },
415   {
416      MESA_FORMAT_RG1616_REV,
417      "MESA_FORMAT_RG1616_REV",
418      GL_RG,
419      GL_UNSIGNED_NORMALIZED,
420      16, 16, 0, 0,
421      0, 0, 0, 0, 0,
422      1, 1, 4
423   },
424   {
425      MESA_FORMAT_ARGB2101010,
426      "MESA_FORMAT_ARGB2101010",
427      GL_RGBA,
428      GL_UNSIGNED_NORMALIZED,
429      10, 10, 10, 2,
430      0, 0, 0, 0, 0,
431      1, 1, 4
432   },
433   {
434      MESA_FORMAT_Z24_S8,          /* Name */
435      "MESA_FORMAT_Z24_S8",        /* StrName */
436      GL_DEPTH_STENCIL,            /* BaseFormat */
437      GL_UNSIGNED_NORMALIZED,      /* DataType */
438      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
439      0, 0, 0, 24, 8,              /* Lum/Int/Index/Depth/StencilBits */
440      1, 1, 4                      /* BlockWidth/Height,Bytes */
441   },
442   {
443      MESA_FORMAT_S8_Z24,          /* Name */
444      "MESA_FORMAT_S8_Z24",        /* StrName */
445      GL_DEPTH_STENCIL,            /* BaseFormat */
446      GL_UNSIGNED_NORMALIZED,      /* DataType */
447      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
448      0, 0, 0, 24, 8,              /* Lum/Int/Index/Depth/StencilBits */
449      1, 1, 4                      /* BlockWidth/Height,Bytes */
450   },
451   {
452      MESA_FORMAT_Z16,             /* Name */
453      "MESA_FORMAT_Z16",           /* StrName */
454      GL_DEPTH_COMPONENT,          /* BaseFormat */
455      GL_UNSIGNED_NORMALIZED,      /* DataType */
456      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
457      0, 0, 0, 16, 0,              /* Lum/Int/Index/Depth/StencilBits */
458      1, 1, 2                      /* BlockWidth/Height,Bytes */
459   },
460   {
461      MESA_FORMAT_X8_Z24,          /* Name */
462      "MESA_FORMAT_X8_Z24",        /* StrName */
463      GL_DEPTH_COMPONENT,          /* BaseFormat */
464      GL_UNSIGNED_NORMALIZED,      /* DataType */
465      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
466      0, 0, 0, 24, 0,              /* Lum/Int/Index/Depth/StencilBits */
467      1, 1, 4                      /* BlockWidth/Height,Bytes */
468   },
469   {
470      MESA_FORMAT_Z24_X8,          /* Name */
471      "MESA_FORMAT_Z24_X8",        /* StrName */
472      GL_DEPTH_COMPONENT,          /* BaseFormat */
473      GL_UNSIGNED_NORMALIZED,      /* DataType */
474      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
475      0, 0, 0, 24, 0,              /* Lum/Int/Index/Depth/StencilBits */
476      1, 1, 4                      /* BlockWidth/Height,Bytes */
477   },
478   {
479      MESA_FORMAT_Z32,             /* Name */
480      "MESA_FORMAT_Z32",           /* StrName */
481      GL_DEPTH_COMPONENT,          /* BaseFormat */
482      GL_UNSIGNED_NORMALIZED,      /* DataType */
483      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
484      0, 0, 0, 32, 0,              /* Lum/Int/Index/Depth/StencilBits */
485      1, 1, 4                      /* BlockWidth/Height,Bytes */
486   },
487   {
488      MESA_FORMAT_S8,              /* Name */
489      "MESA_FORMAT_S8",            /* StrName */
490      GL_STENCIL_INDEX,            /* BaseFormat */
491      GL_UNSIGNED_INT,             /* DataType */
492      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
493      0, 0, 0, 0, 8,               /* Lum/Int/Index/Depth/StencilBits */
494      1, 1, 1                      /* BlockWidth/Height,Bytes */
495   },
496   {
497      MESA_FORMAT_SRGB8,
498      "MESA_FORMAT_SRGB8",
499      GL_RGB,
500      GL_UNSIGNED_NORMALIZED,
501      8, 8, 8, 0,
502      0, 0, 0, 0, 0,
503      1, 1, 3
504   },
505   {
506      MESA_FORMAT_SRGBA8,
507      "MESA_FORMAT_SRGBA8",
508      GL_RGBA,
509      GL_UNSIGNED_NORMALIZED,
510      8, 8, 8, 8,
511      0, 0, 0, 0, 0,
512      1, 1, 4
513   },
514   {
515      MESA_FORMAT_SARGB8,
516      "MESA_FORMAT_SARGB8",
517      GL_RGBA,
518      GL_UNSIGNED_NORMALIZED,
519      8, 8, 8, 8,
520      0, 0, 0, 0, 0,
521      1, 1, 4
522   },
523   {
524      MESA_FORMAT_SL8,
525      "MESA_FORMAT_SL8",
526      GL_LUMINANCE,
527      GL_UNSIGNED_NORMALIZED,
528      0, 0, 0, 0,
529      8, 0, 0, 0, 0,
530      1, 1, 1
531   },
532   {
533      MESA_FORMAT_SLA8,
534      "MESA_FORMAT_SLA8",
535      GL_LUMINANCE_ALPHA,
536      GL_UNSIGNED_NORMALIZED,
537      0, 0, 0, 8,
538      8, 0, 0, 0, 0,
539      1, 1, 2
540   },
541   {
542      MESA_FORMAT_SRGB_DXT1,       /* Name */
543      "MESA_FORMAT_SRGB_DXT1",     /* StrName */
544      GL_RGB,                      /* BaseFormat */
545      GL_UNSIGNED_NORMALIZED,      /* DataType */
546      4, 4, 4, 0,                  /* approx Red/Green/Blue/AlphaBits */
547      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
548      4, 4, 8                      /* 8 bytes per 4x4 block */
549   },
550   {
551      MESA_FORMAT_SRGBA_DXT1,
552      "MESA_FORMAT_SRGBA_DXT1",
553      GL_RGBA,
554      GL_UNSIGNED_NORMALIZED,
555      4, 4, 4, 4,
556      0, 0, 0, 0, 0,
557      4, 4, 8                      /* 8 bytes per 4x4 block */
558   },
559   {
560      MESA_FORMAT_SRGBA_DXT3,
561      "MESA_FORMAT_SRGBA_DXT3",
562      GL_RGBA,
563      GL_UNSIGNED_NORMALIZED,
564      4, 4, 4, 4,
565      0, 0, 0, 0, 0,
566      4, 4, 16                     /* 16 bytes per 4x4 block */
567   },
568   {
569      MESA_FORMAT_SRGBA_DXT5,
570      "MESA_FORMAT_SRGBA_DXT5",
571      GL_RGBA,
572      GL_UNSIGNED_NORMALIZED,
573      4, 4, 4, 4,
574      0, 0, 0, 0, 0,
575      4, 4, 16                     /* 16 bytes per 4x4 block */
576   },
577
578   {
579      MESA_FORMAT_RGB_FXT1,
580      "MESA_FORMAT_RGB_FXT1",
581      GL_RGB,
582      GL_UNSIGNED_NORMALIZED,
583      4, 4, 4, 0,                  /* approx Red/Green/BlueBits */
584      0, 0, 0, 0, 0,
585      8, 4, 16                     /* 16 bytes per 8x4 block */
586   },
587   {
588      MESA_FORMAT_RGBA_FXT1,
589      "MESA_FORMAT_RGBA_FXT1",
590      GL_RGBA,
591      GL_UNSIGNED_NORMALIZED,
592      4, 4, 4, 1,                  /* approx Red/Green/Blue/AlphaBits */
593      0, 0, 0, 0, 0,
594      8, 4, 16                     /* 16 bytes per 8x4 block */
595   },
596
597   {
598      MESA_FORMAT_RGB_DXT1,        /* Name */
599      "MESA_FORMAT_RGB_DXT1",      /* StrName */
600      GL_RGB,                      /* BaseFormat */
601      GL_UNSIGNED_NORMALIZED,      /* DataType */
602      4, 4, 4, 0,                  /* approx Red/Green/Blue/AlphaBits */
603      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
604      4, 4, 8                      /* 8 bytes per 4x4 block */
605   },
606   {
607      MESA_FORMAT_RGBA_DXT1,
608      "MESA_FORMAT_RGBA_DXT1",
609      GL_RGBA,
610      GL_UNSIGNED_NORMALIZED,
611      4, 4, 4, 4,
612      0, 0, 0, 0, 0,
613      4, 4, 8                      /* 8 bytes per 4x4 block */
614   },
615   {
616      MESA_FORMAT_RGBA_DXT3,
617      "MESA_FORMAT_RGBA_DXT3",
618      GL_RGBA,
619      GL_UNSIGNED_NORMALIZED,
620      4, 4, 4, 4,
621      0, 0, 0, 0, 0,
622      4, 4, 16                     /* 16 bytes per 4x4 block */
623   },
624   {
625      MESA_FORMAT_RGBA_DXT5,
626      "MESA_FORMAT_RGBA_DXT5",
627      GL_RGBA,
628      GL_UNSIGNED_NORMALIZED,
629      4, 4, 4, 4,
630      0, 0, 0, 0, 0,
631      4, 4, 16                     /* 16 bytes per 4x4 block */
632   },
633   {
634      MESA_FORMAT_RGBA_FLOAT32,
635      "MESA_FORMAT_RGBA_FLOAT32",
636      GL_RGBA,
637      GL_FLOAT,
638      32, 32, 32, 32,
639      0, 0, 0, 0, 0,
640      1, 1, 16
641   },
642   {
643      MESA_FORMAT_RGBA_FLOAT16,
644      "MESA_FORMAT_RGBA_FLOAT16",
645      GL_RGBA,
646      GL_FLOAT,
647      16, 16, 16, 16,
648      0, 0, 0, 0, 0,
649      1, 1, 8
650   },
651   {
652      MESA_FORMAT_RGB_FLOAT32,
653      "MESA_FORMAT_RGB_FLOAT32",
654      GL_RGB,
655      GL_FLOAT,
656      32, 32, 32, 0,
657      0, 0, 0, 0, 0,
658      1, 1, 12
659   },
660   {
661      MESA_FORMAT_RGB_FLOAT16,
662      "MESA_FORMAT_RGB_FLOAT16",
663      GL_RGB,
664      GL_FLOAT,
665      16, 16, 16, 0,
666      0, 0, 0, 0, 0,
667      1, 1, 6
668   },
669   {
670      MESA_FORMAT_ALPHA_FLOAT32,
671      "MESA_FORMAT_ALPHA_FLOAT32",
672      GL_ALPHA,
673      GL_FLOAT,
674      0, 0, 0, 32,
675      0, 0, 0, 0, 0,
676      1, 1, 4
677   },
678   {
679      MESA_FORMAT_ALPHA_FLOAT16,
680      "MESA_FORMAT_ALPHA_FLOAT16",
681      GL_ALPHA,
682      GL_FLOAT,
683      0, 0, 0, 16,
684      0, 0, 0, 0, 0,
685      1, 1, 2
686   },
687   {
688      MESA_FORMAT_LUMINANCE_FLOAT32,
689      "MESA_FORMAT_LUMINANCE_FLOAT32",
690      GL_LUMINANCE,
691      GL_FLOAT,
692      0, 0, 0, 0,
693      32, 0, 0, 0, 0,
694      1, 1, 4
695   },
696   {
697      MESA_FORMAT_LUMINANCE_FLOAT16,
698      "MESA_FORMAT_LUMINANCE_FLOAT16",
699      GL_LUMINANCE,
700      GL_FLOAT,
701      0, 0, 0, 0,
702      16, 0, 0, 0, 0,
703      1, 1, 2
704   },
705   {
706      MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32,
707      "MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32",
708      GL_LUMINANCE_ALPHA,
709      GL_FLOAT,
710      0, 0, 0, 32,
711      32, 0, 0, 0, 0,
712      1, 1, 8
713   },
714   {
715      MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,
716      "MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16",
717      GL_LUMINANCE_ALPHA,
718      GL_FLOAT,
719      0, 0, 0, 16,
720      16, 0, 0, 0, 0,
721      1, 1, 4
722   },
723   {
724      MESA_FORMAT_INTENSITY_FLOAT32,
725      "MESA_FORMAT_INTENSITY_FLOAT32",
726      GL_INTENSITY,
727      GL_FLOAT,
728      0, 0, 0, 0,
729      0, 32, 0, 0, 0,
730      1, 1, 4
731   },
732   {
733      MESA_FORMAT_INTENSITY_FLOAT16,
734      "MESA_FORMAT_INTENSITY_FLOAT16",
735      GL_INTENSITY,
736      GL_FLOAT,
737      0, 0, 0, 0,
738      0, 16, 0, 0, 0,
739      1, 1, 2
740   },
741   {
742      MESA_FORMAT_R_FLOAT32,
743      "MESA_FORMAT_R_FLOAT32",
744      GL_RED,
745      GL_FLOAT,
746      32, 0, 0, 0,
747      0, 0, 0, 0, 0,
748      1, 1, 4
749   },
750   {
751      MESA_FORMAT_R_FLOAT16,
752      "MESA_FORMAT_R_FLOAT16",
753      GL_RED,
754      GL_FLOAT,
755      16, 0, 0, 0,
756      0, 0, 0, 0, 0,
757      1, 1, 2
758   },
759   {
760      MESA_FORMAT_RG_FLOAT32,
761      "MESA_FORMAT_RG_FLOAT32",
762      GL_RG,
763      GL_FLOAT,
764      32, 32, 0, 0,
765      0, 0, 0, 0, 0,
766      1, 1, 8
767   },
768   {
769      MESA_FORMAT_RG_FLOAT16,
770      "MESA_FORMAT_RG_FLOAT16",
771      GL_RG,
772      GL_FLOAT,
773      16, 16, 0, 0,
774      0, 0, 0, 0, 0,
775      1, 1, 4
776   },
777
778   /* unnormalized signed int formats */
779   /* unnormalized unsigned int formats */
780   {
781      MESA_FORMAT_ALPHA_UINT8,
782      "MESA_FORMAT_ALPHA_UINT8",
783      GL_ALPHA,
784      GL_UNSIGNED_INT,
785      0, 0, 0, 8,
786      0, 0, 0, 0, 0,
787      1, 1, 1
788   },
789   {
790      MESA_FORMAT_ALPHA_UINT16,
791      "MESA_FORMAT_ALPHA_UINT16",
792      GL_ALPHA,
793      GL_UNSIGNED_INT,
794      0, 0, 0, 16,
795      0, 0, 0, 0, 0,
796      1, 1, 2
797   },
798   {
799      MESA_FORMAT_ALPHA_UINT32,
800      "MESA_FORMAT_ALPHA_UINT32",
801      GL_ALPHA,
802      GL_UNSIGNED_INT,
803      0, 0, 0, 32,
804      0, 0, 0, 0, 0,
805      1, 1, 4
806   },
807   {
808      MESA_FORMAT_ALPHA_INT8,
809      "MESA_FORMAT_ALPHA_INT8",
810      GL_ALPHA,
811      GL_INT,
812      0, 0, 0, 8,
813      0, 0, 0, 0, 0,
814      1, 1, 1
815   },
816   {
817      MESA_FORMAT_ALPHA_INT16,
818      "MESA_FORMAT_ALPHA_INT16",
819      GL_ALPHA,
820      GL_INT,
821      0, 0, 0, 16,
822      0, 0, 0, 0, 0,
823      1, 1, 2
824   },
825   {
826      MESA_FORMAT_ALPHA_INT32,
827      "MESA_FORMAT_ALPHA_INT32",
828      GL_ALPHA,
829      GL_INT,
830      0, 0, 0, 32,
831      0, 0, 0, 0, 0,
832      1, 1, 4
833   },
834   {
835      MESA_FORMAT_INTENSITY_UINT8,
836      "MESA_FORMAT_INTENSITY_UINT8",
837      GL_INTENSITY,
838      GL_UNSIGNED_INT,
839      0, 0, 0, 0,
840      0, 8, 0, 0, 0,
841      1, 1, 1
842   },
843   {
844      MESA_FORMAT_INTENSITY_UINT16,
845      "MESA_FORMAT_INTENSITY_UINT16",
846      GL_INTENSITY,
847      GL_UNSIGNED_INT,
848      0, 0, 0, 0,
849      0, 16, 0, 0, 0,
850      1, 1, 2
851   },
852   {
853      MESA_FORMAT_INTENSITY_UINT32,
854      "MESA_FORMAT_INTENSITY_UINT32",
855      GL_INTENSITY,
856      GL_UNSIGNED_INT,
857      0, 0, 0, 0,
858      0, 32, 0, 0, 0,
859      1, 1, 4
860   },
861   {
862      MESA_FORMAT_INTENSITY_INT8,
863      "MESA_FORMAT_INTENSITY_INT8",
864      GL_INTENSITY,
865      GL_INT,
866      0, 0, 0, 0,
867      0, 8, 0, 0, 0,
868      1, 1, 1
869   },
870   {
871      MESA_FORMAT_INTENSITY_INT16,
872      "MESA_FORMAT_INTENSITY_INT16",
873      GL_INTENSITY,
874      GL_INT,
875      0, 0, 0, 0,
876      0, 16, 0, 0, 0,
877      1, 1, 2
878   },
879   {
880      MESA_FORMAT_INTENSITY_INT32,
881      "MESA_FORMAT_INTENSITY_INT32",
882      GL_INTENSITY,
883      GL_INT,
884      0, 0, 0, 0,
885      0, 32, 0, 0, 0,
886      1, 1, 4
887   },
888   {
889      MESA_FORMAT_LUMINANCE_UINT8,
890      "MESA_FORMAT_LUMINANCE_UINT8",
891      GL_LUMINANCE,
892      GL_UNSIGNED_INT,
893      0, 0, 0, 0,
894      8, 0, 0, 0, 0,
895      1, 1, 1
896   },
897   {
898      MESA_FORMAT_LUMINANCE_UINT16,
899      "MESA_FORMAT_LUMINANCE_UINT16",
900      GL_LUMINANCE,
901      GL_UNSIGNED_INT,
902      0, 0, 0, 0,
903      16, 0, 0, 0, 0,
904      1, 1, 2
905   },
906   {
907      MESA_FORMAT_LUMINANCE_UINT32,
908      "MESA_FORMAT_LUMINANCE_UINT32",
909      GL_LUMINANCE,
910      GL_UNSIGNED_INT,
911      0, 0, 0, 0,
912      32, 0, 0, 0, 0,
913      1, 1, 4
914   },
915   {
916      MESA_FORMAT_LUMINANCE_INT8,
917      "MESA_FORMAT_LUMINANCE_INT8",
918      GL_LUMINANCE,
919      GL_INT,
920      0, 0, 0, 0,
921      8, 0, 0, 0, 0,
922      1, 1, 1
923   },
924   {
925      MESA_FORMAT_LUMINANCE_INT16,
926      "MESA_FORMAT_LUMINANCE_INT16",
927      GL_LUMINANCE,
928      GL_INT,
929      0, 0, 0, 0,
930      16, 0, 0, 0, 0,
931      1, 1, 2
932   },
933   {
934      MESA_FORMAT_LUMINANCE_INT32,
935      "MESA_FORMAT_LUMINANCE_INT32",
936      GL_LUMINANCE,
937      GL_INT,
938      0, 0, 0, 0,
939      32, 0, 0, 0, 0,
940      1, 1, 4
941   },
942   {
943      MESA_FORMAT_LUMINANCE_ALPHA_UINT8,
944      "MESA_FORMAT_LUMINANCE_ALPHA_UINT8",
945      GL_LUMINANCE_ALPHA,
946      GL_UNSIGNED_INT,
947      0, 0, 0, 8,
948      8, 0, 0, 0, 0,
949      1, 1, 2
950   },
951   {
952      MESA_FORMAT_LUMINANCE_ALPHA_UINT16,
953      "MESA_FORMAT_LUMINANCE_ALPHA_UINT16",
954      GL_LUMINANCE_ALPHA,
955      GL_UNSIGNED_INT,
956      0, 0, 0, 16,
957      16, 0, 0, 0, 0,
958      1, 1, 4
959   },
960   {
961      MESA_FORMAT_LUMINANCE_ALPHA_UINT32,
962      "MESA_FORMAT_LUMINANCE_ALPHA_UINT32",
963      GL_LUMINANCE_ALPHA,
964      GL_UNSIGNED_INT,
965      0, 0, 0, 32,
966      32, 0, 0, 0, 0,
967      1, 1, 8
968   },
969   {
970      MESA_FORMAT_LUMINANCE_ALPHA_INT8,
971      "MESA_FORMAT_LUMINANCE_ALPHA_INT8",
972      GL_LUMINANCE_ALPHA,
973      GL_INT,
974      0, 0, 0, 8,
975      8, 0, 0, 0, 0,
976      1, 1, 2
977   },
978   {
979      MESA_FORMAT_LUMINANCE_ALPHA_INT16,
980      "MESA_FORMAT_LUMINANCE_ALPHA_INT16",
981      GL_LUMINANCE_ALPHA,
982      GL_INT,
983      0, 0, 0, 16,
984      16, 0, 0, 0, 0,
985      1, 1, 4
986   },
987   {
988      MESA_FORMAT_LUMINANCE_ALPHA_INT32,
989      "MESA_FORMAT_LUMINANCE_ALPHA_INT32",
990      GL_LUMINANCE_ALPHA,
991      GL_INT,
992      0, 0, 0, 32,
993      32, 0, 0, 0, 0,
994      1, 1, 8
995   },
996
997   {
998      MESA_FORMAT_R_INT8,
999      "MESA_FORMAT_R_INT8",
1000      GL_RED,
1001      GL_INT,
1002      8, 0, 0, 0,
1003      0, 0, 0, 0, 0,
1004      1, 1, 1
1005   },
1006   {
1007      MESA_FORMAT_RG_INT8,
1008      "MESA_FORMAT_RG_INT8",
1009      GL_RG,
1010      GL_INT,
1011      8, 8, 0, 0,
1012      0, 0, 0, 0, 0,
1013      1, 1, 2
1014   },
1015   {
1016      MESA_FORMAT_RGB_INT8,
1017      "MESA_FORMAT_RGB_INT8",
1018      GL_RGB,
1019      GL_INT,
1020      8, 8, 8, 0,
1021      0, 0, 0, 0, 0,
1022      1, 1, 3
1023   },
1024   {
1025      MESA_FORMAT_RGBA_INT8,
1026      "MESA_FORMAT_RGBA_INT8",
1027      GL_RGBA,
1028      GL_INT,
1029      8, 8, 8, 8,
1030      0, 0, 0, 0, 0,
1031      1, 1, 4
1032   },
1033   {
1034      MESA_FORMAT_R_INT16,
1035      "MESA_FORMAT_R_INT16",
1036      GL_RED,
1037      GL_INT,
1038      16, 0, 0, 0,
1039      0, 0, 0, 0, 0,
1040      1, 1, 2
1041   },
1042   {
1043      MESA_FORMAT_RG_INT16,
1044      "MESA_FORMAT_RG_INT16",
1045      GL_RG,
1046      GL_INT,
1047      16, 16, 0, 0,
1048      0, 0, 0, 0, 0,
1049      1, 1, 4
1050   },
1051   {
1052      MESA_FORMAT_RGB_INT16,
1053      "MESA_FORMAT_RGB_INT16",
1054      GL_RGB,
1055      GL_INT,
1056      16, 16, 16, 0,
1057      0, 0, 0, 0, 0,
1058      1, 1, 6
1059   },
1060   {
1061      MESA_FORMAT_RGBA_INT16,
1062      "MESA_FORMAT_RGBA_INT16",
1063      GL_RGBA,
1064      GL_INT,
1065      16, 16, 16, 16,
1066      0, 0, 0, 0, 0,
1067      1, 1, 8
1068   },
1069   {
1070      MESA_FORMAT_R_INT32,
1071      "MESA_FORMAT_R_INT32",
1072      GL_RED,
1073      GL_INT,
1074      32, 0, 0, 0,
1075      0, 0, 0, 0, 0,
1076      1, 1, 4
1077   },
1078   {
1079      MESA_FORMAT_RG_INT32,
1080      "MESA_FORMAT_RG_INT32",
1081      GL_RG,
1082      GL_INT,
1083      32, 32, 0, 0,
1084      0, 0, 0, 0, 0,
1085      1, 1, 8
1086   },
1087   {
1088      MESA_FORMAT_RGB_INT32,
1089      "MESA_FORMAT_RGB_INT32",
1090      GL_RGB,
1091      GL_INT,
1092      32, 32, 32, 0,
1093      0, 0, 0, 0, 0,
1094      1, 1, 12
1095   },
1096   {
1097      MESA_FORMAT_RGBA_INT32,
1098      "MESA_FORMAT_RGBA_INT32",
1099      GL_RGBA,
1100      GL_INT,
1101      32, 32, 32, 32,
1102      0, 0, 0, 0, 0,
1103      1, 1, 16
1104   },
1105   {
1106      MESA_FORMAT_R_UINT8,
1107      "MESA_FORMAT_R_UINT8",
1108      GL_RED,
1109      GL_UNSIGNED_INT,
1110      8, 0, 0, 0,
1111      0, 0, 0, 0, 0,
1112      1, 1, 1
1113   },
1114   {
1115      MESA_FORMAT_RG_UINT8,
1116      "MESA_FORMAT_RG_UINT8",
1117      GL_RG,
1118      GL_UNSIGNED_INT,
1119      8, 8, 0, 0,
1120      0, 0, 0, 0, 0,
1121      1, 1, 2
1122   },
1123   {
1124      MESA_FORMAT_RGB_UINT8,
1125      "MESA_FORMAT_RGB_UINT8",
1126      GL_RGB,
1127      GL_UNSIGNED_INT,
1128      8, 8, 8, 0,
1129      0, 0, 0, 0, 0,
1130      1, 1, 3
1131   },
1132   {
1133      MESA_FORMAT_RGBA_UINT8,
1134      "MESA_FORMAT_RGBA_UINT8",
1135      GL_RGBA,
1136      GL_UNSIGNED_INT,
1137      8, 8, 8, 8,
1138      0, 0, 0, 0, 0,
1139      1, 1, 4
1140   },
1141   {
1142      MESA_FORMAT_R_UINT16,
1143      "MESA_FORMAT_R_UINT16",
1144      GL_RED,
1145      GL_UNSIGNED_INT,
1146      16, 0, 0, 0,
1147      0, 0, 0, 0, 0,
1148      1, 1, 2
1149   },
1150   {
1151      MESA_FORMAT_RG_UINT16,
1152      "MESA_FORMAT_RG_UINT16",
1153      GL_RG,
1154      GL_UNSIGNED_INT,
1155      16, 16, 0, 0,
1156      0, 0, 0, 0, 0,
1157      1, 1, 4
1158   },
1159   {
1160      MESA_FORMAT_RGB_UINT16,
1161      "MESA_FORMAT_RGB_UINT16",
1162      GL_RGB,
1163      GL_UNSIGNED_INT,
1164      16, 16, 16, 0,
1165      0, 0, 0, 0, 0,
1166      1, 1, 6
1167   },
1168   {
1169      MESA_FORMAT_RGBA_UINT16,
1170      "MESA_FORMAT_RGBA_UINT16",
1171      GL_RGBA,
1172      GL_UNSIGNED_INT,
1173      16, 16, 16, 16,
1174      0, 0, 0, 0, 0,
1175      1, 1, 8
1176   },
1177   {
1178      MESA_FORMAT_R_UINT32,
1179      "MESA_FORMAT_R_UINT32",
1180      GL_RED,
1181      GL_UNSIGNED_INT,
1182      32, 0, 0, 0,
1183      0, 0, 0, 0, 0,
1184      1, 1, 4
1185   },
1186   {
1187      MESA_FORMAT_RG_UINT32,
1188      "MESA_FORMAT_RG_UINT32",
1189      GL_RG,
1190      GL_UNSIGNED_INT,
1191      32, 32, 0, 0,
1192      0, 0, 0, 0, 0,
1193      1, 1, 8
1194   },
1195   {
1196      MESA_FORMAT_RGB_UINT32,
1197      "MESA_FORMAT_RGB_UINT32",
1198      GL_RGB,
1199      GL_UNSIGNED_INT,
1200      32, 32, 32, 0,
1201      0, 0, 0, 0, 0,
1202      1, 1, 12
1203   },
1204   {
1205      MESA_FORMAT_RGBA_UINT32,
1206      "MESA_FORMAT_RGBA_UINT32",
1207      GL_RGBA,
1208      GL_UNSIGNED_INT,
1209      32, 32, 32, 32,
1210      0, 0, 0, 0, 0,
1211      1, 1, 16
1212   },
1213
1214
1215   {
1216      MESA_FORMAT_DUDV8,
1217      "MESA_FORMAT_DUDV8",
1218      GL_DUDV_ATI,
1219      GL_SIGNED_NORMALIZED,
1220      0, 0, 0, 0,
1221      0, 0, 0, 0, 0,
1222      1, 1, 2
1223   },
1224
1225   /* Signed 8 bits / channel */
1226   {
1227      MESA_FORMAT_SIGNED_R8,        /* Name */
1228      "MESA_FORMAT_SIGNED_R8",      /* StrName */
1229      GL_RED,                       /* BaseFormat */
1230      GL_SIGNED_NORMALIZED,         /* DataType */
1231      8, 0, 0, 0,                   /* Red/Green/Blue/AlphaBits */
1232      0, 0, 0, 0, 0,                /* Lum/Int/Index/Depth/StencilBits */
1233      1, 1, 1                       /* BlockWidth/Height,Bytes */
1234   },
1235   {
1236      MESA_FORMAT_SIGNED_RG88_REV,
1237      "MESA_FORMAT_SIGNED_RG88_REV",
1238      GL_RG,
1239      GL_SIGNED_NORMALIZED,
1240      8, 8, 0, 0,
1241      0, 0, 0, 0, 0,
1242      1, 1, 2
1243   },
1244   {
1245      MESA_FORMAT_SIGNED_RGBX8888,
1246      "MESA_FORMAT_SIGNED_RGBX8888",
1247      GL_RGB,
1248      GL_SIGNED_NORMALIZED,
1249      8, 8, 8, 0,
1250      0, 0, 0, 0, 0,
1251      1, 1, 4                       /* 4 bpp, but no alpha */
1252   },
1253   {
1254      MESA_FORMAT_SIGNED_RGBA8888,
1255      "MESA_FORMAT_SIGNED_RGBA8888",
1256      GL_RGBA,
1257      GL_SIGNED_NORMALIZED,
1258      8, 8, 8, 8,
1259      0, 0, 0, 0, 0,
1260      1, 1, 4
1261   },
1262   {
1263      MESA_FORMAT_SIGNED_RGBA8888_REV,
1264      "MESA_FORMAT_SIGNED_RGBA8888_REV",
1265      GL_RGBA,
1266      GL_SIGNED_NORMALIZED,
1267      8, 8, 8, 8,
1268      0, 0, 0, 0, 0,
1269      1, 1, 4
1270   },
1271
1272   /* Signed 16 bits / channel */
1273   {
1274      MESA_FORMAT_SIGNED_R16,
1275      "MESA_FORMAT_SIGNED_R16",
1276      GL_RED,
1277      GL_SIGNED_NORMALIZED,
1278      16, 0, 0, 0,
1279      0, 0, 0, 0, 0,
1280      1, 1, 2
1281   },
1282   {
1283      MESA_FORMAT_SIGNED_GR1616,
1284      "MESA_FORMAT_SIGNED_GR1616",
1285      GL_RG,
1286      GL_SIGNED_NORMALIZED,
1287      16, 16, 0, 0,
1288      0, 0, 0, 0, 0,
1289      1, 1, 4
1290   },
1291   {
1292      MESA_FORMAT_SIGNED_RGB_16,
1293      "MESA_FORMAT_SIGNED_RGB_16",
1294      GL_RGB,
1295      GL_SIGNED_NORMALIZED,
1296      16, 16, 16, 0,
1297      0, 0, 0, 0, 0,
1298      1, 1, 6
1299   },
1300   {
1301      MESA_FORMAT_SIGNED_RGBA_16,
1302      "MESA_FORMAT_SIGNED_RGBA_16",
1303      GL_RGBA,
1304      GL_SIGNED_NORMALIZED,
1305      16, 16, 16, 16,
1306      0, 0, 0, 0, 0,
1307      1, 1, 8
1308   },
1309   {
1310      MESA_FORMAT_RGBA_16,
1311      "MESA_FORMAT_RGBA_16",
1312      GL_RGBA,
1313      GL_UNSIGNED_NORMALIZED,
1314      16, 16, 16, 16,
1315      0, 0, 0, 0, 0,
1316      1, 1, 8
1317   },
1318   {
1319     MESA_FORMAT_RED_RGTC1,
1320     "MESA_FORMAT_RED_RGTC1",
1321     GL_RED,
1322     GL_UNSIGNED_NORMALIZED,
1323     8, 0, 0, 0,
1324     0, 0, 0, 0, 0,
1325     4, 4, 8                     /* 8 bytes per 4x4 block */
1326   },
1327   {
1328     MESA_FORMAT_SIGNED_RED_RGTC1,
1329     "MESA_FORMAT_SIGNED_RED_RGTC1",
1330     GL_RED,
1331     GL_SIGNED_NORMALIZED,
1332     8, 0, 0, 0,
1333     0, 0, 0, 0, 0,
1334     4, 4, 8                     /* 8 bytes per 4x4 block */
1335   },
1336   {
1337     MESA_FORMAT_RG_RGTC2,
1338     "MESA_FORMAT_RG_RGTC2",
1339     GL_RG,
1340     GL_UNSIGNED_NORMALIZED,
1341     8, 8, 0, 0,
1342     0, 0, 0, 0, 0,
1343     4, 4, 16                     /* 16 bytes per 4x4 block */
1344   },
1345   {
1346     MESA_FORMAT_SIGNED_RG_RGTC2,
1347     "MESA_FORMAT_SIGNED_RG_RGTC2",
1348     GL_RG,
1349     GL_SIGNED_NORMALIZED,
1350     8, 8, 0, 0,
1351     0, 0, 0, 0, 0,
1352     4, 4, 16                     /* 16 bytes per 4x4 block */
1353   },
1354   {
1355     MESA_FORMAT_L_LATC1,
1356     "MESA_FORMAT_L_LATC1",
1357     GL_LUMINANCE,
1358     GL_UNSIGNED_NORMALIZED,
1359     0, 0, 0, 0,
1360     4, 0, 0, 0, 0,
1361     4, 4, 8                     /* 8 bytes per 4x4 block */
1362   },
1363   {
1364     MESA_FORMAT_SIGNED_L_LATC1,
1365     "MESA_FORMAT_SIGNED_L_LATC1",
1366     GL_LUMINANCE,
1367     GL_SIGNED_NORMALIZED,
1368     0, 0, 0, 0,
1369     4, 0, 0, 0, 0,
1370     4, 4, 8                     /* 8 bytes per 4x4 block */
1371   },
1372   {
1373     MESA_FORMAT_LA_LATC2,
1374     "MESA_FORMAT_LA_LATC2",
1375     GL_LUMINANCE_ALPHA,
1376     GL_UNSIGNED_NORMALIZED,
1377     0, 0, 0, 4,
1378     4, 0, 0, 0, 0,
1379     4, 4, 16                     /* 16 bytes per 4x4 block */
1380   },
1381   {
1382     MESA_FORMAT_SIGNED_LA_LATC2,
1383     "MESA_FORMAT_SIGNED_LA_LATC2",
1384     GL_LUMINANCE_ALPHA,
1385     GL_SIGNED_NORMALIZED,
1386     0, 0, 0, 4,
1387     4, 0, 0, 0, 0,
1388     4, 4, 16                     /* 16 bytes per 4x4 block */
1389   },
1390
1391   {
1392      MESA_FORMAT_ETC1_RGB8,
1393      "MESA_FORMAT_ETC1_RGB8",
1394      GL_RGB,
1395      GL_UNSIGNED_NORMALIZED,
1396      8, 8, 8, 0,
1397      0, 0, 0, 0, 0,
1398      4, 4, 8                     /* 8 bytes per 4x4 block */
1399   },
1400
1401   /* Signed formats from EXT_texture_snorm that are not in GL3.1 */
1402   {
1403      MESA_FORMAT_SIGNED_A8,
1404      "MESA_FORMAT_SIGNED_A8",
1405      GL_ALPHA,
1406      GL_SIGNED_NORMALIZED,
1407      0, 0, 0, 8,
1408      0, 0, 0, 0, 0,
1409      1, 1, 1
1410   },
1411   {
1412      MESA_FORMAT_SIGNED_L8,
1413      "MESA_FORMAT_SIGNED_L8",
1414      GL_LUMINANCE,
1415      GL_SIGNED_NORMALIZED,
1416      0, 0, 0, 0,
1417      8, 0, 0, 0, 0,
1418      1, 1, 1
1419   },
1420   {
1421      MESA_FORMAT_SIGNED_AL88,
1422      "MESA_FORMAT_SIGNED_AL88",
1423      GL_LUMINANCE_ALPHA,
1424      GL_SIGNED_NORMALIZED,
1425      0, 0, 0, 8,
1426      8, 0, 0, 0, 0,
1427      1, 1, 2
1428   },
1429   {
1430      MESA_FORMAT_SIGNED_I8,
1431      "MESA_FORMAT_SIGNED_I8",
1432      GL_INTENSITY,
1433      GL_SIGNED_NORMALIZED,
1434      0, 0, 0, 0,
1435      0, 8, 0, 0, 0,
1436      1, 1, 1
1437   },
1438   {
1439      MESA_FORMAT_SIGNED_A16,
1440      "MESA_FORMAT_SIGNED_A16",
1441      GL_ALPHA,
1442      GL_SIGNED_NORMALIZED,
1443      0, 0, 0, 16,
1444      0, 0, 0, 0, 0,
1445      1, 1, 2
1446   },
1447   {
1448      MESA_FORMAT_SIGNED_L16,
1449      "MESA_FORMAT_SIGNED_L16",
1450      GL_LUMINANCE,
1451      GL_SIGNED_NORMALIZED,
1452      0, 0, 0, 0,
1453      16, 0, 0, 0, 0,
1454      1, 1, 2
1455   },
1456   {
1457      MESA_FORMAT_SIGNED_AL1616,
1458      "MESA_FORMAT_SIGNED_AL1616",
1459      GL_LUMINANCE_ALPHA,
1460      GL_SIGNED_NORMALIZED,
1461      0, 0, 0, 16,
1462      16, 0, 0, 0, 0,
1463      1, 1, 4
1464   },
1465   {
1466      MESA_FORMAT_SIGNED_I16,
1467      "MESA_FORMAT_SIGNED_I16",
1468      GL_INTENSITY,
1469      GL_SIGNED_NORMALIZED,
1470      0, 0, 0, 0,
1471      0, 16, 0, 0, 0,
1472      1, 1, 2
1473   },
1474   {
1475      MESA_FORMAT_RGB9_E5_FLOAT,
1476      "MESA_FORMAT_RGB9_E5",
1477      GL_RGB,
1478      GL_FLOAT,
1479      9, 9, 9, 0,
1480      0, 0, 0, 0, 0,
1481      1, 1, 4
1482   },
1483   {
1484      MESA_FORMAT_R11_G11_B10_FLOAT,
1485      "MESA_FORMAT_R11_G11_B10_FLOAT",
1486      GL_RGB,
1487      GL_FLOAT,
1488      11, 11, 10, 0,
1489      0, 0, 0, 0, 0,
1490      1, 1, 4
1491   },
1492   /* ARB_depth_buffer_float */
1493   {
1494      MESA_FORMAT_Z32_FLOAT,       /* Name */
1495      "MESA_FORMAT_Z32_FLOAT",     /* StrName */
1496      GL_DEPTH_COMPONENT,          /* BaseFormat */
1497      GL_FLOAT,                    /* DataType */
1498      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
1499      0, 0, 0, 32, 0,              /* Lum/Int/Index/Depth/StencilBits */
1500      1, 1, 4                      /* BlockWidth/Height,Bytes */
1501   },
1502   {
1503      MESA_FORMAT_Z32_FLOAT_X24S8, /* Name */
1504      "MESA_FORMAT_Z32_FLOAT_X24S8", /* StrName */
1505      GL_DEPTH_STENCIL,            /* BaseFormat */
1506      /* DataType here is used to answer GL_TEXTURE_DEPTH_TYPE queries, and is
1507       * never used for stencil because stencil is always GL_UNSIGNED_INT.
1508       */
1509      GL_FLOAT,                    /* DataType */
1510      0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
1511      0, 0, 0, 32, 8,              /* Lum/Int/Index/Depth/StencilBits */
1512      1, 1, 8                      /* BlockWidth/Height,Bytes */
1513   },
1514   {
1515      MESA_FORMAT_ARGB2101010_UINT,
1516      "MESA_FORMAT_ARGB2101010_UINT",
1517      GL_RGBA,
1518      GL_UNSIGNED_INT,
1519      10, 10, 10, 2,
1520      0, 0, 0, 0, 0,
1521      1, 1, 4
1522   },
1523   {
1524      MESA_FORMAT_ABGR2101010_UINT,
1525      "MESA_FORMAT_ABGR2101010_UINT",
1526      GL_RGBA,
1527      GL_UNSIGNED_INT,
1528      10, 10, 10, 2,
1529      0, 0, 0, 0, 0,
1530      1, 1, 4
1531   },
1532};
1533
1534
1535
1536static const struct gl_format_info *
1537_mesa_get_format_info(gl_format format)
1538{
1539   const struct gl_format_info *info = &format_info[format];
1540   assert(info->Name == format);
1541   return info;
1542}
1543
1544
1545/** Return string name of format (for debugging) */
1546const char *
1547_mesa_get_format_name(gl_format format)
1548{
1549   const struct gl_format_info *info = _mesa_get_format_info(format);
1550   return info->StrName;
1551}
1552
1553
1554
1555/**
1556 * Return bytes needed to store a block of pixels in the given format.
1557 * Normally, a block is 1x1 (a single pixel).  But for compressed formats
1558 * a block may be 4x4 or 8x4, etc.
1559 *
1560 * Note: not GLuint, so as not to coerce math to unsigned. cf. fdo #37351
1561 */
1562GLint
1563_mesa_get_format_bytes(gl_format format)
1564{
1565   const struct gl_format_info *info = _mesa_get_format_info(format);
1566   ASSERT(info->BytesPerBlock);
1567   ASSERT(info->BytesPerBlock <= MAX_PIXEL_BYTES ||
1568          _mesa_is_format_compressed(format));
1569   return info->BytesPerBlock;
1570}
1571
1572
1573/**
1574 * Return bits per component for the given format.
1575 * \param format  one of MESA_FORMAT_x
1576 * \param pname  the component, such as GL_RED_BITS, GL_TEXTURE_BLUE_BITS, etc.
1577 */
1578GLint
1579_mesa_get_format_bits(gl_format format, GLenum pname)
1580{
1581   const struct gl_format_info *info = _mesa_get_format_info(format);
1582
1583   switch (pname) {
1584   case GL_RED_BITS:
1585   case GL_TEXTURE_RED_SIZE:
1586   case GL_RENDERBUFFER_RED_SIZE_EXT:
1587   case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
1588      return info->RedBits;
1589   case GL_GREEN_BITS:
1590   case GL_TEXTURE_GREEN_SIZE:
1591   case GL_RENDERBUFFER_GREEN_SIZE_EXT:
1592   case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
1593      return info->GreenBits;
1594   case GL_BLUE_BITS:
1595   case GL_TEXTURE_BLUE_SIZE:
1596   case GL_RENDERBUFFER_BLUE_SIZE_EXT:
1597   case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
1598      return info->BlueBits;
1599   case GL_ALPHA_BITS:
1600   case GL_TEXTURE_ALPHA_SIZE:
1601   case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
1602   case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
1603      return info->AlphaBits;
1604   case GL_TEXTURE_INTENSITY_SIZE:
1605      return info->IntensityBits;
1606   case GL_TEXTURE_LUMINANCE_SIZE:
1607      return info->LuminanceBits;
1608   case GL_INDEX_BITS:
1609      return info->IndexBits;
1610   case GL_DEPTH_BITS:
1611   case GL_TEXTURE_DEPTH_SIZE_ARB:
1612   case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
1613   case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
1614      return info->DepthBits;
1615   case GL_STENCIL_BITS:
1616   case GL_TEXTURE_STENCIL_SIZE_EXT:
1617   case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
1618   case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
1619      return info->StencilBits;
1620   default:
1621      _mesa_problem(NULL, "bad pname in _mesa_get_format_bits()");
1622      return 0;
1623   }
1624}
1625
1626
1627GLuint
1628_mesa_get_format_max_bits(gl_format format)
1629{
1630   const struct gl_format_info *info = _mesa_get_format_info(format);
1631   GLuint max = MAX2(info->RedBits, info->GreenBits);
1632   max = MAX2(max, info->BlueBits);
1633   max = MAX2(max, info->AlphaBits);
1634   max = MAX2(max, info->LuminanceBits);
1635   max = MAX2(max, info->IntensityBits);
1636   max = MAX2(max, info->DepthBits);
1637   max = MAX2(max, info->StencilBits);
1638   return max;
1639}
1640
1641
1642/**
1643 * Return the data type (or more specifically, the data representation)
1644 * for the given format.
1645 * The return value will be one of:
1646 *    GL_UNSIGNED_NORMALIZED = unsigned int representing [0,1]
1647 *    GL_SIGNED_NORMALIZED = signed int representing [-1, 1]
1648 *    GL_UNSIGNED_INT = an ordinary unsigned integer
1649 *    GL_INT = an ordinary signed integer
1650 *    GL_FLOAT = an ordinary float
1651 */
1652GLenum
1653_mesa_get_format_datatype(gl_format format)
1654{
1655   const struct gl_format_info *info = _mesa_get_format_info(format);
1656   return info->DataType;
1657}
1658
1659
1660/**
1661 * Return the basic format for the given type.  The result will be one of
1662 * GL_RGB, GL_RGBA, GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_INTENSITY,
1663 * GL_YCBCR_MESA, GL_DEPTH_COMPONENT, GL_STENCIL_INDEX, GL_DEPTH_STENCIL.
1664 */
1665GLenum
1666_mesa_get_format_base_format(gl_format format)
1667{
1668   const struct gl_format_info *info = _mesa_get_format_info(format);
1669   return info->BaseFormat;
1670}
1671
1672
1673/**
1674 * Return the block size (in pixels) for the given format.  Normally
1675 * the block size is 1x1.  But compressed formats will have block sizes
1676 * of 4x4 or 8x4 pixels, etc.
1677 * \param bw  returns block width in pixels
1678 * \param bh  returns block height in pixels
1679 */
1680void
1681_mesa_get_format_block_size(gl_format format, GLuint *bw, GLuint *bh)
1682{
1683   const struct gl_format_info *info = _mesa_get_format_info(format);
1684   *bw = info->BlockWidth;
1685   *bh = info->BlockHeight;
1686}
1687
1688
1689/** Is the given format a compressed format? */
1690GLboolean
1691_mesa_is_format_compressed(gl_format format)
1692{
1693   const struct gl_format_info *info = _mesa_get_format_info(format);
1694   return info->BlockWidth > 1 || info->BlockHeight > 1;
1695}
1696
1697
1698/**
1699 * Determine if the given format represents a packed depth/stencil buffer.
1700 */
1701GLboolean
1702_mesa_is_format_packed_depth_stencil(gl_format format)
1703{
1704   const struct gl_format_info *info = _mesa_get_format_info(format);
1705
1706   return info->BaseFormat == GL_DEPTH_STENCIL;
1707}
1708
1709
1710/**
1711 * Is the given format a signed/unsigned integer color format?
1712 */
1713GLboolean
1714_mesa_is_format_integer_color(gl_format format)
1715{
1716   const struct gl_format_info *info = _mesa_get_format_info(format);
1717   return (info->DataType == GL_INT || info->DataType == GL_UNSIGNED_INT) &&
1718      info->BaseFormat != GL_DEPTH_COMPONENT &&
1719      info->BaseFormat != GL_DEPTH_STENCIL &&
1720      info->BaseFormat != GL_STENCIL_INDEX;
1721}
1722
1723
1724/**
1725 * Is the given format an unsigned integer format?
1726 */
1727GLboolean
1728_mesa_is_format_unsigned(gl_format format)
1729{
1730   const struct gl_format_info *info = _mesa_get_format_info(format);
1731   return _mesa_is_type_unsigned(info->DataType);
1732}
1733
1734
1735/**
1736 * Return color encoding for given format.
1737 * \return GL_LINEAR or GL_SRGB
1738 */
1739GLenum
1740_mesa_get_format_color_encoding(gl_format format)
1741{
1742   /* XXX this info should be encoded in gl_format_info */
1743   switch (format) {
1744   case MESA_FORMAT_SRGB8:
1745   case MESA_FORMAT_SRGBA8:
1746   case MESA_FORMAT_SARGB8:
1747   case MESA_FORMAT_SL8:
1748   case MESA_FORMAT_SLA8:
1749   case MESA_FORMAT_SRGB_DXT1:
1750   case MESA_FORMAT_SRGBA_DXT1:
1751   case MESA_FORMAT_SRGBA_DXT3:
1752   case MESA_FORMAT_SRGBA_DXT5:
1753      return GL_SRGB;
1754   default:
1755      return GL_LINEAR;
1756   }
1757}
1758
1759
1760/**
1761 * For an sRGB format, return the corresponding linear color space format.
1762 * For non-sRGB formats, return the format as-is.
1763 */
1764gl_format
1765_mesa_get_srgb_format_linear(gl_format format)
1766{
1767   switch (format) {
1768   case MESA_FORMAT_SRGB8:
1769      format = MESA_FORMAT_RGB888;
1770      break;
1771   case MESA_FORMAT_SRGBA8:
1772      format = MESA_FORMAT_RGBA8888;
1773      break;
1774   case MESA_FORMAT_SARGB8:
1775      format = MESA_FORMAT_ARGB8888;
1776      break;
1777   case MESA_FORMAT_SL8:
1778      format = MESA_FORMAT_L8;
1779      break;
1780   case MESA_FORMAT_SLA8:
1781      format = MESA_FORMAT_AL88;
1782      break;
1783   case MESA_FORMAT_SRGB_DXT1:
1784      format = MESA_FORMAT_RGB_DXT1;
1785      break;
1786   case MESA_FORMAT_SRGBA_DXT1:
1787      format = MESA_FORMAT_RGBA_DXT1;
1788      break;
1789   case MESA_FORMAT_SRGBA_DXT3:
1790      format = MESA_FORMAT_RGBA_DXT3;
1791      break;
1792   case MESA_FORMAT_SRGBA_DXT5:
1793      format = MESA_FORMAT_RGBA_DXT5;
1794      break;
1795   default:
1796      break;
1797   }
1798   return format;
1799}
1800
1801
1802/**
1803 * If the given format is a compressed format, return a corresponding
1804 * uncompressed format.
1805 */
1806gl_format
1807_mesa_get_uncompressed_format(gl_format format)
1808{
1809   switch (format) {
1810   case MESA_FORMAT_RGB_FXT1:
1811      return MESA_FORMAT_RGB888;
1812   case MESA_FORMAT_RGBA_FXT1:
1813      return MESA_FORMAT_RGBA8888;
1814   case MESA_FORMAT_RGB_DXT1:
1815   case MESA_FORMAT_SRGB_DXT1:
1816      return MESA_FORMAT_RGB888;
1817   case MESA_FORMAT_RGBA_DXT1:
1818   case MESA_FORMAT_SRGBA_DXT1:
1819      return MESA_FORMAT_RGBA8888;
1820   case MESA_FORMAT_RGBA_DXT3:
1821   case MESA_FORMAT_SRGBA_DXT3:
1822      return MESA_FORMAT_RGBA8888;
1823   case MESA_FORMAT_RGBA_DXT5:
1824   case MESA_FORMAT_SRGBA_DXT5:
1825      return MESA_FORMAT_RGBA8888;
1826   case MESA_FORMAT_RED_RGTC1:
1827      return MESA_FORMAT_R8;
1828   case MESA_FORMAT_SIGNED_RED_RGTC1:
1829      return MESA_FORMAT_SIGNED_R8;
1830   case MESA_FORMAT_RG_RGTC2:
1831      return MESA_FORMAT_GR88;
1832   case MESA_FORMAT_SIGNED_RG_RGTC2:
1833      return MESA_FORMAT_SIGNED_RG88_REV;
1834   case MESA_FORMAT_L_LATC1:
1835      return MESA_FORMAT_L8;
1836   case MESA_FORMAT_SIGNED_L_LATC1:
1837      return MESA_FORMAT_SIGNED_L8;
1838   case MESA_FORMAT_LA_LATC2:
1839      return MESA_FORMAT_AL88;
1840   case MESA_FORMAT_SIGNED_LA_LATC2:
1841      return MESA_FORMAT_SIGNED_AL88;
1842   case MESA_FORMAT_ETC1_RGB8:
1843      return MESA_FORMAT_RGB888;
1844   default:
1845#ifdef DEBUG
1846      assert(!_mesa_is_format_compressed(format));
1847#endif
1848      return format;
1849   }
1850}
1851
1852
1853GLuint
1854_mesa_format_num_components(gl_format format)
1855{
1856   const struct gl_format_info *info = _mesa_get_format_info(format);
1857   return ((info->RedBits > 0) +
1858           (info->GreenBits > 0) +
1859           (info->BlueBits > 0) +
1860           (info->AlphaBits > 0) +
1861           (info->LuminanceBits > 0) +
1862           (info->IntensityBits > 0) +
1863           (info->DepthBits > 0) +
1864           (info->StencilBits > 0));
1865}
1866
1867
1868/**
1869 * Return number of bytes needed to store an image of the given size
1870 * in the given format.
1871 */
1872GLuint
1873_mesa_format_image_size(gl_format format, GLsizei width,
1874                        GLsizei height, GLsizei depth)
1875{
1876   const struct gl_format_info *info = _mesa_get_format_info(format);
1877   /* Strictly speaking, a conditional isn't needed here */
1878   if (info->BlockWidth > 1 || info->BlockHeight > 1) {
1879      /* compressed format (2D only for now) */
1880      const GLuint bw = info->BlockWidth, bh = info->BlockHeight;
1881      const GLuint wblocks = (width + bw - 1) / bw;
1882      const GLuint hblocks = (height + bh - 1) / bh;
1883      const GLuint sz = wblocks * hblocks * info->BytesPerBlock;
1884      return sz * depth;
1885   }
1886   else {
1887      /* non-compressed */
1888      const GLuint sz = width * height * depth * info->BytesPerBlock;
1889      return sz;
1890   }
1891}
1892
1893
1894/**
1895 * Same as _mesa_format_image_size() but returns a 64-bit value to
1896 * accomodate very large textures.
1897 */
1898uint64_t
1899_mesa_format_image_size64(gl_format format, GLsizei width,
1900                          GLsizei height, GLsizei depth)
1901{
1902   const struct gl_format_info *info = _mesa_get_format_info(format);
1903   /* Strictly speaking, a conditional isn't needed here */
1904   if (info->BlockWidth > 1 || info->BlockHeight > 1) {
1905      /* compressed format (2D only for now) */
1906      const uint64_t bw = info->BlockWidth, bh = info->BlockHeight;
1907      const uint64_t wblocks = (width + bw - 1) / bw;
1908      const uint64_t hblocks = (height + bh - 1) / bh;
1909      const uint64_t sz = wblocks * hblocks * info->BytesPerBlock;
1910      return sz * depth;
1911   }
1912   else {
1913      /* non-compressed */
1914      const uint64_t sz = ((uint64_t) width *
1915                           (uint64_t) height *
1916                           (uint64_t) depth *
1917                           info->BytesPerBlock);
1918      return sz;
1919   }
1920}
1921
1922
1923
1924GLint
1925_mesa_format_row_stride(gl_format format, GLsizei width)
1926{
1927   const struct gl_format_info *info = _mesa_get_format_info(format);
1928   /* Strictly speaking, a conditional isn't needed here */
1929   if (info->BlockWidth > 1 || info->BlockHeight > 1) {
1930      /* compressed format */
1931      const GLuint bw = info->BlockWidth;
1932      const GLuint wblocks = (width + bw - 1) / bw;
1933      const GLint stride = wblocks * info->BytesPerBlock;
1934      return stride;
1935   }
1936   else {
1937      const GLint stride = width * info->BytesPerBlock;
1938      return stride;
1939   }
1940}
1941
1942
1943/**
1944 * Debug/test: check that all formats are handled in the
1945 * _mesa_format_to_type_and_comps() function.  When new pixel formats
1946 * are added to Mesa, that function needs to be updated.
1947 * This is a no-op after the first call.
1948 */
1949static void
1950check_format_to_type_and_comps(void)
1951{
1952   gl_format f;
1953
1954   for (f = MESA_FORMAT_NONE + 1; f < MESA_FORMAT_COUNT; f++) {
1955      GLenum datatype = 0;
1956      GLuint comps = 0;
1957      /* This function will emit a problem/warning if the format is
1958       * not handled.
1959       */
1960      _mesa_format_to_type_and_comps(f, &datatype, &comps);
1961   }
1962}
1963
1964
1965/**
1966 * Do sanity checking of the format info table.
1967 */
1968void
1969_mesa_test_formats(void)
1970{
1971   GLuint i;
1972
1973   STATIC_ASSERT(Elements(format_info) == MESA_FORMAT_COUNT);
1974
1975   for (i = 0; i < MESA_FORMAT_COUNT; i++) {
1976      const struct gl_format_info *info = _mesa_get_format_info(i);
1977      assert(info);
1978
1979      assert(info->Name == i);
1980
1981      if (info->Name == MESA_FORMAT_NONE)
1982         continue;
1983
1984      if (info->BlockWidth == 1 && info->BlockHeight == 1) {
1985         if (info->RedBits > 0) {
1986            GLuint t = info->RedBits + info->GreenBits
1987               + info->BlueBits + info->AlphaBits;
1988            assert(t / 8 <= info->BytesPerBlock);
1989            (void) t;
1990         }
1991      }
1992
1993      assert(info->DataType == GL_UNSIGNED_NORMALIZED ||
1994             info->DataType == GL_SIGNED_NORMALIZED ||
1995             info->DataType == GL_UNSIGNED_INT ||
1996             info->DataType == GL_INT ||
1997             info->DataType == GL_FLOAT ||
1998             /* Z32_FLOAT_X24S8 has DataType of GL_NONE */
1999             info->DataType == GL_NONE);
2000
2001      if (info->BaseFormat == GL_RGB) {
2002         assert(info->RedBits > 0);
2003         assert(info->GreenBits > 0);
2004         assert(info->BlueBits > 0);
2005         assert(info->AlphaBits == 0);
2006         assert(info->LuminanceBits == 0);
2007         assert(info->IntensityBits == 0);
2008      }
2009      else if (info->BaseFormat == GL_RGBA) {
2010         assert(info->RedBits > 0);
2011         assert(info->GreenBits > 0);
2012         assert(info->BlueBits > 0);
2013         assert(info->AlphaBits > 0);
2014         assert(info->LuminanceBits == 0);
2015         assert(info->IntensityBits == 0);
2016      }
2017      else if (info->BaseFormat == GL_RG) {
2018         assert(info->RedBits > 0);
2019         assert(info->GreenBits > 0);
2020         assert(info->BlueBits == 0);
2021         assert(info->AlphaBits == 0);
2022         assert(info->LuminanceBits == 0);
2023         assert(info->IntensityBits == 0);
2024      }
2025      else if (info->BaseFormat == GL_RED) {
2026         assert(info->RedBits > 0);
2027         assert(info->GreenBits == 0);
2028         assert(info->BlueBits == 0);
2029         assert(info->AlphaBits == 0);
2030         assert(info->LuminanceBits == 0);
2031         assert(info->IntensityBits == 0);
2032      }
2033      else if (info->BaseFormat == GL_LUMINANCE) {
2034         assert(info->RedBits == 0);
2035         assert(info->GreenBits == 0);
2036         assert(info->BlueBits == 0);
2037         assert(info->AlphaBits == 0);
2038         assert(info->LuminanceBits > 0);
2039         assert(info->IntensityBits == 0);
2040      }
2041      else if (info->BaseFormat == GL_INTENSITY) {
2042         assert(info->RedBits == 0);
2043         assert(info->GreenBits == 0);
2044         assert(info->BlueBits == 0);
2045         assert(info->AlphaBits == 0);
2046         assert(info->LuminanceBits == 0);
2047         assert(info->IntensityBits > 0);
2048      }
2049   }
2050
2051   check_format_to_type_and_comps();
2052}
2053
2054
2055
2056/**
2057 * Return datatype and number of components per texel for the given gl_format.
2058 * Only used for mipmap generation code.
2059 */
2060void
2061_mesa_format_to_type_and_comps(gl_format format,
2062                               GLenum *datatype, GLuint *comps)
2063{
2064   switch (format) {
2065   case MESA_FORMAT_RGBA8888:
2066   case MESA_FORMAT_RGBA8888_REV:
2067   case MESA_FORMAT_ARGB8888:
2068   case MESA_FORMAT_ARGB8888_REV:
2069   case MESA_FORMAT_RGBX8888:
2070   case MESA_FORMAT_RGBX8888_REV:
2071   case MESA_FORMAT_XRGB8888:
2072   case MESA_FORMAT_XRGB8888_REV:
2073      *datatype = GL_UNSIGNED_BYTE;
2074      *comps = 4;
2075      return;
2076   case MESA_FORMAT_RGB888:
2077   case MESA_FORMAT_BGR888:
2078      *datatype = GL_UNSIGNED_BYTE;
2079      *comps = 3;
2080      return;
2081   case MESA_FORMAT_RGB565:
2082   case MESA_FORMAT_RGB565_REV:
2083      *datatype = GL_UNSIGNED_SHORT_5_6_5;
2084      *comps = 3;
2085      return;
2086
2087   case MESA_FORMAT_ARGB4444:
2088   case MESA_FORMAT_ARGB4444_REV:
2089      *datatype = GL_UNSIGNED_SHORT_4_4_4_4;
2090      *comps = 4;
2091      return;
2092
2093   case MESA_FORMAT_ARGB1555:
2094   case MESA_FORMAT_ARGB1555_REV:
2095      *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
2096      *comps = 4;
2097      return;
2098
2099   case MESA_FORMAT_ARGB2101010:
2100      *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
2101      *comps = 4;
2102      return;
2103
2104   case MESA_FORMAT_RGBA5551:
2105      *datatype = GL_UNSIGNED_SHORT_5_5_5_1;
2106      *comps = 4;
2107      return;
2108
2109   case MESA_FORMAT_AL44:
2110      *datatype = MESA_UNSIGNED_BYTE_4_4;
2111      *comps = 2;
2112      return;
2113
2114   case MESA_FORMAT_AL88:
2115   case MESA_FORMAT_AL88_REV:
2116   case MESA_FORMAT_GR88:
2117   case MESA_FORMAT_RG88:
2118      *datatype = GL_UNSIGNED_BYTE;
2119      *comps = 2;
2120      return;
2121
2122   case MESA_FORMAT_AL1616:
2123   case MESA_FORMAT_AL1616_REV:
2124   case MESA_FORMAT_RG1616:
2125   case MESA_FORMAT_RG1616_REV:
2126      *datatype = GL_UNSIGNED_SHORT;
2127      *comps = 2;
2128      return;
2129
2130   case MESA_FORMAT_R16:
2131   case MESA_FORMAT_A16:
2132   case MESA_FORMAT_L16:
2133   case MESA_FORMAT_I16:
2134      *datatype = GL_UNSIGNED_SHORT;
2135      *comps = 1;
2136      return;
2137
2138   case MESA_FORMAT_RGB332:
2139      *datatype = GL_UNSIGNED_BYTE_3_3_2;
2140      *comps = 3;
2141      return;
2142
2143   case MESA_FORMAT_A8:
2144   case MESA_FORMAT_L8:
2145   case MESA_FORMAT_I8:
2146   case MESA_FORMAT_R8:
2147   case MESA_FORMAT_S8:
2148      *datatype = GL_UNSIGNED_BYTE;
2149      *comps = 1;
2150      return;
2151
2152   case MESA_FORMAT_YCBCR:
2153   case MESA_FORMAT_YCBCR_REV:
2154      *datatype = GL_UNSIGNED_SHORT;
2155      *comps = 2;
2156      return;
2157
2158   case MESA_FORMAT_Z24_S8:
2159      *datatype = GL_UNSIGNED_INT_24_8_MESA;
2160      *comps = 2;
2161      return;
2162
2163   case MESA_FORMAT_S8_Z24:
2164      *datatype = GL_UNSIGNED_INT_8_24_REV_MESA;
2165      *comps = 2;
2166      return;
2167
2168   case MESA_FORMAT_Z16:
2169      *datatype = GL_UNSIGNED_SHORT;
2170      *comps = 1;
2171      return;
2172
2173   case MESA_FORMAT_X8_Z24:
2174      *datatype = GL_UNSIGNED_INT;
2175      *comps = 1;
2176      return;
2177
2178   case MESA_FORMAT_Z24_X8:
2179      *datatype = GL_UNSIGNED_INT;
2180      *comps = 1;
2181      return;
2182
2183   case MESA_FORMAT_Z32:
2184      *datatype = GL_UNSIGNED_INT;
2185      *comps = 1;
2186      return;
2187
2188   case MESA_FORMAT_Z32_FLOAT:
2189      *datatype = GL_FLOAT;
2190      *comps = 1;
2191      return;
2192
2193   case MESA_FORMAT_Z32_FLOAT_X24S8:
2194      *datatype = GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
2195      *comps = 1;
2196      return;
2197
2198   case MESA_FORMAT_DUDV8:
2199      *datatype = GL_BYTE;
2200      *comps = 2;
2201      return;
2202
2203   case MESA_FORMAT_SIGNED_R8:
2204   case MESA_FORMAT_SIGNED_A8:
2205   case MESA_FORMAT_SIGNED_L8:
2206   case MESA_FORMAT_SIGNED_I8:
2207      *datatype = GL_BYTE;
2208      *comps = 1;
2209      return;
2210   case MESA_FORMAT_SIGNED_RG88_REV:
2211   case MESA_FORMAT_SIGNED_AL88:
2212      *datatype = GL_BYTE;
2213      *comps = 2;
2214      return;
2215   case MESA_FORMAT_SIGNED_RGBA8888:
2216   case MESA_FORMAT_SIGNED_RGBA8888_REV:
2217   case MESA_FORMAT_SIGNED_RGBX8888:
2218      *datatype = GL_BYTE;
2219      *comps = 4;
2220      return;
2221
2222   case MESA_FORMAT_RGBA_16:
2223      *datatype = GL_UNSIGNED_SHORT;
2224      *comps = 4;
2225      return;
2226
2227   case MESA_FORMAT_SIGNED_R16:
2228   case MESA_FORMAT_SIGNED_A16:
2229   case MESA_FORMAT_SIGNED_L16:
2230   case MESA_FORMAT_SIGNED_I16:
2231      *datatype = GL_SHORT;
2232      *comps = 1;
2233      return;
2234   case MESA_FORMAT_SIGNED_GR1616:
2235   case MESA_FORMAT_SIGNED_AL1616:
2236      *datatype = GL_SHORT;
2237      *comps = 2;
2238      return;
2239   case MESA_FORMAT_SIGNED_RGB_16:
2240      *datatype = GL_SHORT;
2241      *comps = 3;
2242      return;
2243   case MESA_FORMAT_SIGNED_RGBA_16:
2244      *datatype = GL_SHORT;
2245      *comps = 4;
2246      return;
2247
2248#if FEATURE_EXT_texture_sRGB
2249   case MESA_FORMAT_SRGB8:
2250      *datatype = GL_UNSIGNED_BYTE;
2251      *comps = 3;
2252      return;
2253   case MESA_FORMAT_SRGBA8:
2254   case MESA_FORMAT_SARGB8:
2255      *datatype = GL_UNSIGNED_BYTE;
2256      *comps = 4;
2257      return;
2258   case MESA_FORMAT_SL8:
2259      *datatype = GL_UNSIGNED_BYTE;
2260      *comps = 1;
2261      return;
2262   case MESA_FORMAT_SLA8:
2263      *datatype = GL_UNSIGNED_BYTE;
2264      *comps = 2;
2265      return;
2266#endif
2267
2268#if FEATURE_texture_fxt1
2269   case MESA_FORMAT_RGB_FXT1:
2270   case MESA_FORMAT_RGBA_FXT1:
2271#endif
2272#if FEATURE_texture_s3tc
2273   case MESA_FORMAT_RGB_DXT1:
2274   case MESA_FORMAT_RGBA_DXT1:
2275   case MESA_FORMAT_RGBA_DXT3:
2276   case MESA_FORMAT_RGBA_DXT5:
2277#if FEATURE_EXT_texture_sRGB
2278   case MESA_FORMAT_SRGB_DXT1:
2279   case MESA_FORMAT_SRGBA_DXT1:
2280   case MESA_FORMAT_SRGBA_DXT3:
2281   case MESA_FORMAT_SRGBA_DXT5:
2282#endif
2283#endif
2284   case MESA_FORMAT_RED_RGTC1:
2285   case MESA_FORMAT_SIGNED_RED_RGTC1:
2286   case MESA_FORMAT_RG_RGTC2:
2287   case MESA_FORMAT_SIGNED_RG_RGTC2:
2288   case MESA_FORMAT_L_LATC1:
2289   case MESA_FORMAT_SIGNED_L_LATC1:
2290   case MESA_FORMAT_LA_LATC2:
2291   case MESA_FORMAT_SIGNED_LA_LATC2:
2292   case MESA_FORMAT_ETC1_RGB8:
2293      /* XXX generate error instead? */
2294      *datatype = GL_UNSIGNED_BYTE;
2295      *comps = 0;
2296      return;
2297
2298   case MESA_FORMAT_RGBA_FLOAT32:
2299      *datatype = GL_FLOAT;
2300      *comps = 4;
2301      return;
2302   case MESA_FORMAT_RGBA_FLOAT16:
2303      *datatype = GL_HALF_FLOAT_ARB;
2304      *comps = 4;
2305      return;
2306   case MESA_FORMAT_RGB_FLOAT32:
2307      *datatype = GL_FLOAT;
2308      *comps = 3;
2309      return;
2310   case MESA_FORMAT_RGB_FLOAT16:
2311      *datatype = GL_HALF_FLOAT_ARB;
2312      *comps = 3;
2313      return;
2314   case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
2315   case MESA_FORMAT_RG_FLOAT32:
2316      *datatype = GL_FLOAT;
2317      *comps = 2;
2318      return;
2319   case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
2320   case MESA_FORMAT_RG_FLOAT16:
2321      *datatype = GL_HALF_FLOAT_ARB;
2322      *comps = 2;
2323      return;
2324   case MESA_FORMAT_ALPHA_FLOAT32:
2325   case MESA_FORMAT_LUMINANCE_FLOAT32:
2326   case MESA_FORMAT_INTENSITY_FLOAT32:
2327   case MESA_FORMAT_R_FLOAT32:
2328      *datatype = GL_FLOAT;
2329      *comps = 1;
2330      return;
2331   case MESA_FORMAT_ALPHA_FLOAT16:
2332   case MESA_FORMAT_LUMINANCE_FLOAT16:
2333   case MESA_FORMAT_INTENSITY_FLOAT16:
2334   case MESA_FORMAT_R_FLOAT16:
2335      *datatype = GL_HALF_FLOAT_ARB;
2336      *comps = 1;
2337      return;
2338
2339   case MESA_FORMAT_ALPHA_UINT8:
2340   case MESA_FORMAT_LUMINANCE_UINT8:
2341   case MESA_FORMAT_INTENSITY_UINT8:
2342      *datatype = GL_UNSIGNED_BYTE;
2343      *comps = 1;
2344      return;
2345   case MESA_FORMAT_LUMINANCE_ALPHA_UINT8:
2346      *datatype = GL_UNSIGNED_BYTE;
2347      *comps = 2;
2348      return;
2349
2350   case MESA_FORMAT_ALPHA_UINT16:
2351   case MESA_FORMAT_LUMINANCE_UINT16:
2352   case MESA_FORMAT_INTENSITY_UINT16:
2353      *datatype = GL_UNSIGNED_SHORT;
2354      *comps = 1;
2355      return;
2356   case MESA_FORMAT_LUMINANCE_ALPHA_UINT16:
2357      *datatype = GL_UNSIGNED_SHORT;
2358      *comps = 2;
2359      return;
2360   case MESA_FORMAT_ALPHA_UINT32:
2361   case MESA_FORMAT_LUMINANCE_UINT32:
2362   case MESA_FORMAT_INTENSITY_UINT32:
2363      *datatype = GL_UNSIGNED_INT;
2364      *comps = 1;
2365      return;
2366   case MESA_FORMAT_LUMINANCE_ALPHA_UINT32:
2367      *datatype = GL_UNSIGNED_INT;
2368      *comps = 2;
2369      return;
2370   case MESA_FORMAT_ALPHA_INT8:
2371   case MESA_FORMAT_LUMINANCE_INT8:
2372   case MESA_FORMAT_INTENSITY_INT8:
2373      *datatype = GL_BYTE;
2374      *comps = 1;
2375      return;
2376   case MESA_FORMAT_LUMINANCE_ALPHA_INT8:
2377      *datatype = GL_BYTE;
2378      *comps = 2;
2379      return;
2380
2381   case MESA_FORMAT_ALPHA_INT16:
2382   case MESA_FORMAT_LUMINANCE_INT16:
2383   case MESA_FORMAT_INTENSITY_INT16:
2384      *datatype = GL_SHORT;
2385      *comps = 1;
2386      return;
2387   case MESA_FORMAT_LUMINANCE_ALPHA_INT16:
2388      *datatype = GL_SHORT;
2389      *comps = 2;
2390      return;
2391
2392   case MESA_FORMAT_ALPHA_INT32:
2393   case MESA_FORMAT_LUMINANCE_INT32:
2394   case MESA_FORMAT_INTENSITY_INT32:
2395      *datatype = GL_INT;
2396      *comps = 1;
2397      return;
2398   case MESA_FORMAT_LUMINANCE_ALPHA_INT32:
2399      *datatype = GL_INT;
2400      *comps = 2;
2401      return;
2402
2403   case MESA_FORMAT_R_INT8:
2404      *datatype = GL_BYTE;
2405      *comps = 1;
2406      return;
2407   case MESA_FORMAT_RG_INT8:
2408      *datatype = GL_BYTE;
2409      *comps = 2;
2410      return;
2411   case MESA_FORMAT_RGB_INT8:
2412      *datatype = GL_BYTE;
2413      *comps = 3;
2414      return;
2415   case MESA_FORMAT_RGBA_INT8:
2416      *datatype = GL_BYTE;
2417      *comps = 4;
2418      return;
2419   case MESA_FORMAT_R_INT16:
2420      *datatype = GL_SHORT;
2421      *comps = 1;
2422      return;
2423   case MESA_FORMAT_RG_INT16:
2424      *datatype = GL_SHORT;
2425      *comps = 2;
2426      return;
2427   case MESA_FORMAT_RGB_INT16:
2428      *datatype = GL_SHORT;
2429      *comps = 3;
2430      return;
2431   case MESA_FORMAT_RGBA_INT16:
2432      *datatype = GL_SHORT;
2433      *comps = 4;
2434      return;
2435   case MESA_FORMAT_R_INT32:
2436      *datatype = GL_INT;
2437      *comps = 1;
2438      return;
2439   case MESA_FORMAT_RG_INT32:
2440      *datatype = GL_INT;
2441      *comps = 2;
2442      return;
2443   case MESA_FORMAT_RGB_INT32:
2444      *datatype = GL_INT;
2445      *comps = 3;
2446      return;
2447   case MESA_FORMAT_RGBA_INT32:
2448      *datatype = GL_INT;
2449      *comps = 4;
2450      return;
2451
2452   /**
2453    * \name Non-normalized unsigned integer formats.
2454    */
2455   case MESA_FORMAT_R_UINT8:
2456      *datatype = GL_UNSIGNED_BYTE;
2457      *comps = 1;
2458      return;
2459   case MESA_FORMAT_RG_UINT8:
2460      *datatype = GL_UNSIGNED_BYTE;
2461      *comps = 2;
2462      return;
2463   case MESA_FORMAT_RGB_UINT8:
2464      *datatype = GL_UNSIGNED_BYTE;
2465      *comps = 3;
2466      return;
2467   case MESA_FORMAT_RGBA_UINT8:
2468      *datatype = GL_UNSIGNED_BYTE;
2469      *comps = 4;
2470      return;
2471   case MESA_FORMAT_R_UINT16:
2472      *datatype = GL_UNSIGNED_SHORT;
2473      *comps = 1;
2474      return;
2475   case MESA_FORMAT_RG_UINT16:
2476      *datatype = GL_UNSIGNED_SHORT;
2477      *comps = 2;
2478      return;
2479   case MESA_FORMAT_RGB_UINT16:
2480      *datatype = GL_UNSIGNED_SHORT;
2481      *comps = 3;
2482      return;
2483   case MESA_FORMAT_RGBA_UINT16:
2484      *datatype = GL_UNSIGNED_SHORT;
2485      *comps = 4;
2486      return;
2487   case MESA_FORMAT_R_UINT32:
2488      *datatype = GL_UNSIGNED_INT;
2489      *comps = 1;
2490      return;
2491   case MESA_FORMAT_RG_UINT32:
2492      *datatype = GL_UNSIGNED_INT;
2493      *comps = 2;
2494      return;
2495   case MESA_FORMAT_RGB_UINT32:
2496      *datatype = GL_UNSIGNED_INT;
2497      *comps = 3;
2498      return;
2499   case MESA_FORMAT_RGBA_UINT32:
2500      *datatype = GL_UNSIGNED_INT;
2501      *comps = 4;
2502      return;
2503
2504   case MESA_FORMAT_RGB9_E5_FLOAT:
2505      *datatype = GL_UNSIGNED_INT_5_9_9_9_REV;
2506      *comps = 3;
2507      return;
2508
2509   case MESA_FORMAT_R11_G11_B10_FLOAT:
2510      *datatype = GL_UNSIGNED_INT_10F_11F_11F_REV;
2511      *comps = 3;
2512      return;
2513
2514   case MESA_FORMAT_ARGB2101010_UINT:
2515   case MESA_FORMAT_ABGR2101010_UINT:
2516      *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
2517      *comps = 4;
2518      return;
2519
2520   case MESA_FORMAT_COUNT:
2521      assert(0);
2522      return;
2523
2524   case MESA_FORMAT_NONE:
2525   /* For debug builds, warn if any formats are not handled */
2526#ifdef DEBUG
2527   default:
2528#endif
2529      _mesa_problem(NULL, "bad format %s in _mesa_format_to_type_and_comps",
2530                    _mesa_get_format_name(format));
2531      *datatype = 0;
2532      *comps = 1;
2533   }
2534}
2535
2536/**
2537 * Check if a gl_format exactly matches a GL formaat/type combination
2538 * such that we can use memcpy() from one to the other.
2539 * \param gl_format  a MESA_FORMAT_x value
2540 * \param format  the user-specified image format
2541 * \param type  the user-specified image datatype
2542 * \param swapBytes  typically the current pixel pack/unpack byteswap state
2543 * \return GL_TRUE if the formats match, GL_FALSE otherwise.
2544 */
2545GLboolean
2546_mesa_format_matches_format_and_type(gl_format gl_format,
2547				     GLenum format, GLenum type,
2548                                     GLboolean swapBytes)
2549{
2550   const GLboolean littleEndian = _mesa_little_endian();
2551
2552   /* Note: When reading a GL format/type combination, the format lists channel
2553    * assignments from most significant channel in the type to least
2554    * significant.  A type with _REV indicates that the assignments are
2555    * swapped, so they are listed from least significant to most significant.
2556    *
2557    * For sanity, please keep this switch statement ordered the same as the
2558    * enums in formats.h.
2559    */
2560
2561   switch (gl_format) {
2562
2563   case MESA_FORMAT_NONE:
2564   case MESA_FORMAT_COUNT:
2565      return GL_FALSE;
2566
2567   case MESA_FORMAT_RGBA8888:
2568      if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8 && !swapBytes)
2569         return GL_TRUE;
2570
2571      if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8_REV && swapBytes)
2572         return GL_TRUE;
2573
2574      if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && !littleEndian)
2575         return GL_TRUE;
2576
2577      if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8_REV
2578          && !swapBytes)
2579         return GL_TRUE;
2580
2581      if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8
2582          && swapBytes)
2583         return GL_TRUE;
2584
2585      if (format == GL_ABGR_EXT && type == GL_UNSIGNED_BYTE && littleEndian)
2586         return GL_TRUE;
2587
2588      return GL_FALSE;
2589
2590   case MESA_FORMAT_RGBA8888_REV:
2591      if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
2592          !swapBytes)
2593         return GL_TRUE;
2594
2595      if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8 && swapBytes)
2596         return GL_TRUE;
2597
2598      if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && littleEndian)
2599         return GL_TRUE;
2600
2601      if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8 &&
2602          !swapBytes)
2603         return GL_TRUE;
2604
2605      if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
2606          swapBytes)
2607         return GL_TRUE;
2608
2609      if (format == GL_ABGR_EXT && type == GL_UNSIGNED_BYTE && !littleEndian)
2610         return GL_TRUE;
2611
2612      return GL_FALSE;
2613
2614   case MESA_FORMAT_ARGB8888:
2615      if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
2616          !swapBytes)
2617         return GL_TRUE;
2618
2619      if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8 && swapBytes)
2620         return GL_TRUE;
2621
2622      if (format == GL_BGRA && type == GL_UNSIGNED_BYTE && littleEndian)
2623         return GL_TRUE;
2624
2625      return GL_FALSE;
2626
2627   case MESA_FORMAT_ARGB8888_REV:
2628      if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8 && !swapBytes)
2629         return GL_TRUE;
2630
2631      if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
2632          swapBytes)
2633         return GL_TRUE;
2634
2635      if (format == GL_BGRA && type == GL_UNSIGNED_BYTE && !littleEndian)
2636         return GL_TRUE;
2637
2638      return GL_FALSE;
2639
2640   case MESA_FORMAT_RGBX8888:
2641   case MESA_FORMAT_RGBX8888_REV:
2642      return GL_FALSE;
2643
2644   case MESA_FORMAT_XRGB8888:
2645   case MESA_FORMAT_XRGB8888_REV:
2646      return GL_FALSE;
2647
2648   case MESA_FORMAT_RGB888:
2649      return format == GL_BGR && type == GL_UNSIGNED_BYTE && littleEndian;
2650
2651   case MESA_FORMAT_BGR888:
2652      return format == GL_RGB && type == GL_UNSIGNED_BYTE && littleEndian;
2653
2654   case MESA_FORMAT_RGB565:
2655      return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5 && !swapBytes;
2656
2657   case MESA_FORMAT_RGB565_REV:
2658      /* Some of the 16-bit MESA_FORMATs that would seem to correspond to
2659       * GL_UNSIGNED_SHORT_* are byte-swapped instead of channel-reversed,
2660       * according to formats.h, so they can't be matched.
2661       */
2662      return GL_FALSE;
2663
2664   case MESA_FORMAT_ARGB4444:
2665      return format == GL_BGRA && type == GL_UNSIGNED_SHORT_4_4_4_4_REV &&
2666         !swapBytes;
2667
2668   case MESA_FORMAT_ARGB4444_REV:
2669      return GL_FALSE;
2670
2671   case MESA_FORMAT_RGBA5551:
2672      return format == GL_RGBA && type == GL_UNSIGNED_SHORT_5_5_5_1 &&
2673         !swapBytes;
2674
2675   case MESA_FORMAT_ARGB1555:
2676      return format == GL_BGRA && type == GL_UNSIGNED_SHORT_1_5_5_5_REV &&
2677         !swapBytes;
2678
2679   case MESA_FORMAT_ARGB1555_REV:
2680      return GL_FALSE;
2681
2682   case MESA_FORMAT_AL44:
2683      return GL_FALSE;
2684   case MESA_FORMAT_AL88:
2685      return format == GL_LUMINANCE_ALPHA && type == GL_UNSIGNED_BYTE && littleEndian;
2686   case MESA_FORMAT_AL88_REV:
2687      return GL_FALSE;
2688
2689   case MESA_FORMAT_AL1616:
2690      return format == GL_LUMINANCE_ALPHA && type == GL_UNSIGNED_SHORT && littleEndian && !swapBytes;
2691   case MESA_FORMAT_AL1616_REV:
2692      return GL_FALSE;
2693
2694   case MESA_FORMAT_RGB332:
2695      return format == GL_RGB && type == GL_UNSIGNED_BYTE_3_3_2;
2696
2697   case MESA_FORMAT_A8:
2698      return format == GL_ALPHA && type == GL_UNSIGNED_BYTE;
2699   case MESA_FORMAT_A16:
2700      return format == GL_ALPHA && type == GL_UNSIGNED_SHORT &&
2701         littleEndian && !swapBytes;
2702   case MESA_FORMAT_L8:
2703      return format == GL_LUMINANCE && type == GL_UNSIGNED_BYTE;
2704   case MESA_FORMAT_L16:
2705      return format == GL_LUMINANCE && type == GL_UNSIGNED_SHORT &&
2706         littleEndian && !swapBytes;
2707   case MESA_FORMAT_I8:
2708      return format == GL_INTENSITY && type == GL_UNSIGNED_BYTE;
2709   case MESA_FORMAT_I16:
2710      return format == GL_INTENSITY && type == GL_UNSIGNED_SHORT &&
2711         littleEndian && !swapBytes;
2712
2713   case MESA_FORMAT_YCBCR:
2714   case MESA_FORMAT_YCBCR_REV:
2715      return GL_FALSE;
2716
2717   case MESA_FORMAT_R8:
2718      return format == GL_RED && type == GL_UNSIGNED_BYTE;
2719   case MESA_FORMAT_GR88:
2720      return format == GL_RG && type == GL_UNSIGNED_BYTE && littleEndian;
2721   case MESA_FORMAT_RG88:
2722      return GL_FALSE;
2723
2724   case MESA_FORMAT_R16:
2725      return format == GL_RED && type == GL_UNSIGNED_SHORT && littleEndian &&
2726         !swapBytes;
2727   case MESA_FORMAT_RG1616:
2728      return format == GL_RG && type == GL_UNSIGNED_SHORT && littleEndian &&
2729         !swapBytes;
2730   case MESA_FORMAT_RG1616_REV:
2731      return GL_FALSE;
2732
2733   case MESA_FORMAT_ARGB2101010:
2734      return format == GL_BGRA && type == GL_UNSIGNED_INT_2_10_10_10_REV &&
2735         !swapBytes;
2736
2737   case MESA_FORMAT_Z24_S8:
2738      return format == GL_DEPTH_STENCIL && type == GL_UNSIGNED_INT_24_8 &&
2739         !swapBytes;
2740   case MESA_FORMAT_Z24_X8:
2741   case MESA_FORMAT_S8_Z24:
2742      return GL_FALSE;
2743
2744   case MESA_FORMAT_Z16:
2745      return format == GL_DEPTH_COMPONENT && type == GL_UNSIGNED_SHORT &&
2746         !swapBytes;
2747
2748   case MESA_FORMAT_X8_Z24:
2749      return GL_FALSE;
2750
2751   case MESA_FORMAT_Z32:
2752      return format == GL_DEPTH_COMPONENT && type == GL_UNSIGNED_INT &&
2753         !swapBytes;
2754
2755   case MESA_FORMAT_S8:
2756      return format == GL_STENCIL_INDEX && type == GL_UNSIGNED_BYTE;
2757
2758   case MESA_FORMAT_SRGB8:
2759   case MESA_FORMAT_SRGBA8:
2760   case MESA_FORMAT_SARGB8:
2761   case MESA_FORMAT_SL8:
2762   case MESA_FORMAT_SLA8:
2763   case MESA_FORMAT_SRGB_DXT1:
2764   case MESA_FORMAT_SRGBA_DXT1:
2765   case MESA_FORMAT_SRGBA_DXT3:
2766   case MESA_FORMAT_SRGBA_DXT5:
2767      return GL_FALSE;
2768
2769   case MESA_FORMAT_RGB_FXT1:
2770   case MESA_FORMAT_RGBA_FXT1:
2771   case MESA_FORMAT_RGB_DXT1:
2772   case MESA_FORMAT_RGBA_DXT1:
2773   case MESA_FORMAT_RGBA_DXT3:
2774   case MESA_FORMAT_RGBA_DXT5:
2775      return GL_FALSE;
2776
2777   case MESA_FORMAT_RGBA_FLOAT32:
2778      return format == GL_RGBA && type == GL_FLOAT && !swapBytes;
2779   case MESA_FORMAT_RGBA_FLOAT16:
2780      return format == GL_RGBA && type == GL_HALF_FLOAT && !swapBytes;
2781
2782   case MESA_FORMAT_RGB_FLOAT32:
2783      return format == GL_RGB && type == GL_FLOAT && !swapBytes;
2784   case MESA_FORMAT_RGB_FLOAT16:
2785      return format == GL_RGB && type == GL_HALF_FLOAT && !swapBytes;
2786
2787   case MESA_FORMAT_ALPHA_FLOAT32:
2788      return format == GL_ALPHA && type == GL_FLOAT && !swapBytes;
2789   case MESA_FORMAT_ALPHA_FLOAT16:
2790      return format == GL_ALPHA && type == GL_HALF_FLOAT && !swapBytes;
2791
2792   case MESA_FORMAT_LUMINANCE_FLOAT32:
2793      return format == GL_LUMINANCE && type == GL_FLOAT && !swapBytes;
2794   case MESA_FORMAT_LUMINANCE_FLOAT16:
2795      return format == GL_LUMINANCE && type == GL_HALF_FLOAT && !swapBytes;
2796
2797   case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
2798      return format == GL_LUMINANCE_ALPHA && type == GL_FLOAT && !swapBytes;
2799   case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
2800      return format == GL_LUMINANCE_ALPHA && type == GL_HALF_FLOAT && !swapBytes;
2801
2802   case MESA_FORMAT_INTENSITY_FLOAT32:
2803      return format == GL_INTENSITY && type == GL_FLOAT && !swapBytes;
2804   case MESA_FORMAT_INTENSITY_FLOAT16:
2805      return format == GL_INTENSITY && type == GL_HALF_FLOAT && !swapBytes;
2806
2807   case MESA_FORMAT_R_FLOAT32:
2808      return format == GL_RED && type == GL_FLOAT && !swapBytes;
2809   case MESA_FORMAT_R_FLOAT16:
2810      return format == GL_RED && type == GL_HALF_FLOAT && !swapBytes;
2811
2812   case MESA_FORMAT_RG_FLOAT32:
2813      return format == GL_RG && type == GL_FLOAT && !swapBytes;
2814   case MESA_FORMAT_RG_FLOAT16:
2815      return format == GL_RG && type == GL_HALF_FLOAT && !swapBytes;
2816
2817      /* FINISHME: What do we want to do for GL_EXT_texture_integer? */
2818   case MESA_FORMAT_ALPHA_UINT8:
2819   case MESA_FORMAT_ALPHA_UINT16:
2820   case MESA_FORMAT_ALPHA_UINT32:
2821   case MESA_FORMAT_ALPHA_INT8:
2822   case MESA_FORMAT_ALPHA_INT16:
2823   case MESA_FORMAT_ALPHA_INT32:
2824      return GL_FALSE;
2825
2826   case MESA_FORMAT_INTENSITY_UINT8:
2827   case MESA_FORMAT_INTENSITY_UINT16:
2828   case MESA_FORMAT_INTENSITY_UINT32:
2829   case MESA_FORMAT_INTENSITY_INT8:
2830   case MESA_FORMAT_INTENSITY_INT16:
2831   case MESA_FORMAT_INTENSITY_INT32:
2832      return GL_FALSE;
2833
2834   case MESA_FORMAT_LUMINANCE_UINT8:
2835   case MESA_FORMAT_LUMINANCE_UINT16:
2836   case MESA_FORMAT_LUMINANCE_UINT32:
2837   case MESA_FORMAT_LUMINANCE_INT8:
2838   case MESA_FORMAT_LUMINANCE_INT16:
2839   case MESA_FORMAT_LUMINANCE_INT32:
2840      return GL_FALSE;
2841
2842   case MESA_FORMAT_LUMINANCE_ALPHA_UINT8:
2843   case MESA_FORMAT_LUMINANCE_ALPHA_UINT16:
2844   case MESA_FORMAT_LUMINANCE_ALPHA_UINT32:
2845   case MESA_FORMAT_LUMINANCE_ALPHA_INT8:
2846   case MESA_FORMAT_LUMINANCE_ALPHA_INT16:
2847   case MESA_FORMAT_LUMINANCE_ALPHA_INT32:
2848      return GL_FALSE;
2849
2850   case MESA_FORMAT_R_INT8:
2851   case MESA_FORMAT_RG_INT8:
2852   case MESA_FORMAT_RGB_INT8:
2853   case MESA_FORMAT_RGBA_INT8:
2854   case MESA_FORMAT_R_INT16:
2855   case MESA_FORMAT_RG_INT16:
2856   case MESA_FORMAT_RGB_INT16:
2857   case MESA_FORMAT_RGBA_INT16:
2858   case MESA_FORMAT_R_INT32:
2859   case MESA_FORMAT_RG_INT32:
2860   case MESA_FORMAT_RGB_INT32:
2861   case MESA_FORMAT_RGBA_INT32:
2862      return GL_FALSE;
2863
2864   case MESA_FORMAT_R_UINT8:
2865   case MESA_FORMAT_RG_UINT8:
2866   case MESA_FORMAT_RGB_UINT8:
2867   case MESA_FORMAT_RGBA_UINT8:
2868   case MESA_FORMAT_R_UINT16:
2869   case MESA_FORMAT_RG_UINT16:
2870   case MESA_FORMAT_RGB_UINT16:
2871   case MESA_FORMAT_RGBA_UINT16:
2872   case MESA_FORMAT_R_UINT32:
2873   case MESA_FORMAT_RG_UINT32:
2874   case MESA_FORMAT_RGB_UINT32:
2875   case MESA_FORMAT_RGBA_UINT32:
2876      return GL_FALSE;
2877
2878   case MESA_FORMAT_DUDV8:
2879   case MESA_FORMAT_SIGNED_R8:
2880   case MESA_FORMAT_SIGNED_RG88_REV:
2881   case MESA_FORMAT_SIGNED_RGBX8888:
2882      return GL_FALSE;
2883
2884   case MESA_FORMAT_SIGNED_RGBA8888:
2885      if (format == GL_RGBA && type == GL_BYTE && !littleEndian)
2886         return GL_TRUE;
2887
2888      if (format == GL_ABGR_EXT && type == GL_BYTE && littleEndian)
2889         return GL_TRUE;
2890
2891      return GL_FALSE;
2892
2893   case MESA_FORMAT_SIGNED_RGBA8888_REV:
2894      if (format == GL_RGBA && type == GL_BYTE && littleEndian)
2895         return GL_TRUE;
2896
2897      if (format == GL_ABGR_EXT && type == GL_BYTE && !littleEndian)
2898         return GL_TRUE;
2899
2900      return GL_FALSE;
2901
2902   case MESA_FORMAT_SIGNED_R16:
2903   case MESA_FORMAT_SIGNED_GR1616:
2904   case MESA_FORMAT_SIGNED_RGB_16:
2905   case MESA_FORMAT_SIGNED_RGBA_16:
2906   case MESA_FORMAT_RGBA_16:
2907      /* FINISHME: SNORM */
2908      return GL_FALSE;
2909
2910   case MESA_FORMAT_RED_RGTC1:
2911   case MESA_FORMAT_SIGNED_RED_RGTC1:
2912   case MESA_FORMAT_RG_RGTC2:
2913   case MESA_FORMAT_SIGNED_RG_RGTC2:
2914      return GL_FALSE;
2915
2916   case MESA_FORMAT_L_LATC1:
2917   case MESA_FORMAT_SIGNED_L_LATC1:
2918   case MESA_FORMAT_LA_LATC2:
2919   case MESA_FORMAT_SIGNED_LA_LATC2:
2920      return GL_FALSE;
2921
2922   case MESA_FORMAT_ETC1_RGB8:
2923      return GL_FALSE;
2924
2925   case MESA_FORMAT_SIGNED_A8:
2926   case MESA_FORMAT_SIGNED_L8:
2927   case MESA_FORMAT_SIGNED_AL88:
2928   case MESA_FORMAT_SIGNED_I8:
2929   case MESA_FORMAT_SIGNED_A16:
2930   case MESA_FORMAT_SIGNED_L16:
2931   case MESA_FORMAT_SIGNED_AL1616:
2932   case MESA_FORMAT_SIGNED_I16:
2933      /* FINISHME: SNORM */
2934      return GL_FALSE;
2935
2936   case MESA_FORMAT_ARGB2101010_UINT:
2937      return (format == GL_BGRA_INTEGER_EXT &&
2938              type == GL_UNSIGNED_INT_2_10_10_10_REV &&
2939              !swapBytes);
2940
2941   case MESA_FORMAT_ABGR2101010_UINT:
2942      return (format == GL_RGBA_INTEGER_EXT &&
2943              type == GL_UNSIGNED_INT_2_10_10_10_REV &&
2944              !swapBytes);
2945
2946   case MESA_FORMAT_RGB9_E5_FLOAT:
2947      return format == GL_RGB && type == GL_UNSIGNED_INT_5_9_9_9_REV &&
2948         !swapBytes;
2949
2950   case MESA_FORMAT_R11_G11_B10_FLOAT:
2951      return format == GL_RGB && type == GL_UNSIGNED_INT_10F_11F_11F_REV &&
2952         !swapBytes;
2953
2954   case MESA_FORMAT_Z32_FLOAT:
2955      return format == GL_DEPTH_COMPONENT && type == GL_FLOAT && !swapBytes;
2956
2957   case MESA_FORMAT_Z32_FLOAT_X24S8:
2958      return GL_FALSE;
2959   }
2960
2961   return GL_FALSE;
2962}
2963
2964