OSDN Git Service

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