mesa: Fix Type A _INT formats to MESA_FORMAT naming standard
[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 mesa_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_A8B8G8R8_UNORM, /* Name */
92 "MESA_FORMAT_A8B8G8R8_UNORM", /* 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_R8G8B8A8_UNORM, /* Name */
101 "MESA_FORMAT_R8G8B8A8_UNORM", /* 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_B8G8R8A8_UNORM, /* Name */
110 "MESA_FORMAT_B8G8R8A8_UNORM", /* 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_A8R8G8B8_UNORM, /* Name */
119 "MESA_FORMAT_A8R8G8B8_UNORM", /* 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_X8B8G8R8_UNORM, /* Name */
128 "MESA_FORMAT_X8B8G8R8_UNORM", /* 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_R8G8B8X8_UNORM, /* Name */
137 "MESA_FORMAT_R8G8B8X8_UNORM", /* 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_B8G8R8X8_UNORM, /* Name */
146 "MESA_FORMAT_B8G8R8X8_UNORM", /* 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_X8R8G8B8_UNORM, /* Name */
155 "MESA_FORMAT_X8R8G8B8_UNORM", /* 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_BGR_UNORM8, /* Name */
164 "MESA_FORMAT_BGR_UNORM8", /* 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_RGB_UNORM8, /* Name */
173 "MESA_FORMAT_RGB_UNORM8", /* 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_B5G6R5_UNORM, /* Name */
182 "MESA_FORMAT_B5G6R5_UNORM", /* 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_R5G6B5_UNORM, /* Name */
191 "MESA_FORMAT_R5G6B5_UNORM", /* 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_B4G4R4A4_UNORM, /* Name */
200 "MESA_FORMAT_B4G4R4A4_UNORM", /* 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_A4R4G4B4_UNORM, /* Name */
209 "MESA_FORMAT_A4R4G4B4_UNORM", /* 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_A1B5G5R5_UNORM, /* Name */
218 "MESA_FORMAT_A1B5G5R5_UNORM", /* 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_B5G5R5A1_UNORM, /* Name */
227 "MESA_FORMAT_B5G5R5A1_UNORM", /* 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_A1R5G5B5_UNORM, /* Name */
236 "MESA_FORMAT_A1R5G5B5_UNORM", /* 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_L4A4_UNORM, /* Name */
245 "MESA_FORMAT_L4A4_UNORM", /* 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_L8A8_UNORM, /* Name */
254 "MESA_FORMAT_L8A8_UNORM", /* 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_A8L8_UNORM, /* Name */
263 "MESA_FORMAT_A8L8_UNORM", /* 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_L16A16_UNORM, /* Name */
272 "MESA_FORMAT_L16A16_UNORM", /* 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_A16L16_UNORM, /* Name */
281 "MESA_FORMAT_A16L16_UNORM", /* 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_B2G3R3_UNORM, /* Name */
290 "MESA_FORMAT_B2G3R3_UNORM", /* 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_A_UNORM8, /* Name */
299 "MESA_FORMAT_A_UNORM8", /* 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_A_UNORM16, /* Name */
308 "MESA_FORMAT_A_UNORM16", /* 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_L_UNORM8, /* Name */
317 "MESA_FORMAT_L_UNORM8", /* 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_L_UNORM16, /* Name */
326 "MESA_FORMAT_L_UNORM16", /* 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_I_UNORM8, /* Name */
335 "MESA_FORMAT_I_UNORM8", /* 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_I_UNORM16, /* Name */
344 "MESA_FORMAT_I_UNORM16", /* 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_R_UNORM8,
371 "MESA_FORMAT_R_UNORM8",
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_R8G8_UNORM,
380 "MESA_FORMAT_R8G8_UNORM",
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_G8R8_UNORM,
389 "MESA_FORMAT_G8R8_UNORM",
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_R_UNORM16,
398 "MESA_FORMAT_R_UNORM16",
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_R16G16_UNORM,
407 "MESA_FORMAT_R16G16_UNORM",
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_G16R16_UNORM,
416 "MESA_FORMAT_G16R16_UNORM",
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_B10G10R10A2_UNORM,
425 "MESA_FORMAT_B10G10R10A2_UNORM",
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_S8_UINT_Z24_UNORM, /* Name */
434 "MESA_FORMAT_S8_UINT_Z24_UNORM", /* 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_Z24_UNORM_X8_UINT, /* Name */
443 "MESA_FORMAT_Z24_UNORM_X8_UINT", /* 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_Z_UNORM16, /* Name */
452 "MESA_FORMAT_Z_UNORM16", /* 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_Z24_UNORM_S8_UINT, /* Name */
461 "MESA_FORMAT_Z24_UNORM_S8_UINT", /* 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_X8Z24_UNORM, /* Name */
470 "MESA_FORMAT_X8Z24_UNORM", /* 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_Z_UNORM32, /* Name */
479 "MESA_FORMAT_Z_UNORM32", /* 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_S_UINT8, /* Name */
488 "MESA_FORMAT_S_UINT8", /* 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_BGR_SRGB8,
497 "MESA_FORMAT_BGR_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_A8B8G8R8_SRGB,
506 "MESA_FORMAT_A8B8G8R8_SRGB",
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_B8G8R8A8_SRGB,
515 "MESA_FORMAT_B8G8R8A8_SRGB",
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_L_SRGB8,
524 "MESA_FORMAT_L_SRGB8",
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_L8A8_SRGB,
533 "MESA_FORMAT_L8A8_SRGB",
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_A_FLOAT32,
670 "MESA_FORMAT_A_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_A_FLOAT16,
679 "MESA_FORMAT_A_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_L_FLOAT32,
688 "MESA_FORMAT_L_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_L_FLOAT16,
697 "MESA_FORMAT_L_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_LA_FLOAT32,
706 "MESA_FORMAT_LA_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_LA_FLOAT16,
715 "MESA_FORMAT_LA_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_I_FLOAT32,
724 "MESA_FORMAT_I_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_I_FLOAT16,
733 "MESA_FORMAT_I_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_A_UINT8,
781 "MESA_FORMAT_A_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_A_UINT16,
790 "MESA_FORMAT_A_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_A_UINT32,
799 "MESA_FORMAT_A_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_A_SINT8,
808 "MESA_FORMAT_A_SINT8",
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_A_SINT16,
817 "MESA_FORMAT_A_SINT16",
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_A_SINT32,
826 "MESA_FORMAT_A_SINT32",
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_I_UINT8,
835 "MESA_FORMAT_I_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_I_UINT16,
844 "MESA_FORMAT_I_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_I_UINT32,
853 "MESA_FORMAT_I_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_I_SINT8,
862 "MESA_FORMAT_I_SINT8",
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_I_SINT16,
871 "MESA_FORMAT_I_SINT16",
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_I_SINT32,
880 "MESA_FORMAT_I_SINT32",
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_L_UINT8,
889 "MESA_FORMAT_L_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_L_UINT16,
898 "MESA_FORMAT_L_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_L_UINT32,
907 "MESA_FORMAT_L_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_L_SINT8,
916 "MESA_FORMAT_L_SINT8",
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_L_SINT16,
925 "MESA_FORMAT_L_SINT16",
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_L_SINT32,
934 "MESA_FORMAT_L_SINT32",
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_LA_UINT8,
943 "MESA_FORMAT_LA_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_LA_UINT16,
952 "MESA_FORMAT_LA_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_LA_UINT32,
961 "MESA_FORMAT_LA_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_LA_SINT8,
970 "MESA_FORMAT_LA_SINT8",
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_LA_SINT16,
979 "MESA_FORMAT_LA_SINT16",
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_LA_SINT32,
988 "MESA_FORMAT_LA_SINT32",
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_SINT8,
998 "MESA_FORMAT_R_SINT8",
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_SINT8,
1007 "MESA_FORMAT_RG_SINT8",
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_SINT8,
1016 "MESA_FORMAT_RGB_SINT8",
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_SINT8,
1025 "MESA_FORMAT_RGBA_SINT8",
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_SINT16,
1034 "MESA_FORMAT_R_SINT16",
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_SINT16,
1043 "MESA_FORMAT_RG_SINT16",
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_SINT16,
1052 "MESA_FORMAT_RGB_SINT16",
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_SINT16,
1061 "MESA_FORMAT_RGBA_SINT16",
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_SINT32,
1070 "MESA_FORMAT_R_SINT32",
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_SINT32,
1079 "MESA_FORMAT_RG_SINT32",
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_SINT32,
1088 "MESA_FORMAT_RGB_SINT32",
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_SINT32,
1097 "MESA_FORMAT_RGBA_SINT32",
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_R_SNORM8, /* Name */
1227 "MESA_FORMAT_R_SNORM8", /* 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_R8G8_SNORM,
1236 "MESA_FORMAT_R8G8_SNORM",
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_X8B8G8R8_SNORM,
1245 "MESA_FORMAT_X8B8G8R8_SNORM",
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_A8B8G8R8_SNORM,
1254 "MESA_FORMAT_A8B8G8R8_SNORM",
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_R8G8B8A8_SNORM,
1263 "MESA_FORMAT_R8G8B8A8_SNORM",
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_R_SNORM16,
1274 "MESA_FORMAT_R_SNORM16",
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_R16G16_SNORM,
1283 "MESA_FORMAT_R16G16_SNORM",
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_RGB_SNORM16,
1292 "MESA_FORMAT_RGB_SNORM16",
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_RGBA_SNORM16,
1301 "MESA_FORMAT_RGBA_SNORM16",
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_UNORM16,
1310 "MESA_FORMAT_RGBA_UNORM16",
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_R_RGTC1_UNORM,
1319 "MESA_FORMAT_R_RGTC1_UNORM",
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_R_RGTC1_SNORM,
1328 "MESA_FORMAT_R_RGTC1_SNORM",
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_UNORM,
1337 "MESA_FORMAT_RG_RGTC2_UNORM",
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_RG_RGTC2_SNORM,
1346 "MESA_FORMAT_RG_RGTC2_SNORM",
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_UNORM,
1355 "MESA_FORMAT_L_LATC1_UNORM",
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_L_LATC1_SNORM,
1364 "MESA_FORMAT_L_LATC1_SNORM",
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_UNORM,
1373 "MESA_FORMAT_LA_LATC2_UNORM",
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_LA_LATC2_SNORM,
1382 "MESA_FORMAT_LA_LATC2_SNORM",
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_A_SNORM8,
1503 "MESA_FORMAT_A_SNORM8",
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_L_SNORM8,
1512 "MESA_FORMAT_L_SNORM8",
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_L8A8_SNORM,
1521 "MESA_FORMAT_L8A8_SNORM",
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_I_SNORM8,
1530 "MESA_FORMAT_I_SNORM8",
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_A_SNORM16,
1539 "MESA_FORMAT_A_SNORM16",
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_L_SNORM16,
1548 "MESA_FORMAT_L_SNORM16",
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_LA_SNORM16,
1557 "MESA_FORMAT_LA_SNORM16",
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_I_SNORM16,
1566 "MESA_FORMAT_I_SNORM16",
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_R9G9B9E5_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_R11G11B10_FLOAT,
1584 "MESA_FORMAT_R11G11B10_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_Z_FLOAT32, /* Name */
1594 "MESA_FORMAT_Z_FLOAT32", /* 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_S8X24_UINT, /* Name */
1603 "MESA_FORMAT_Z32_FLOAT_S8X24_UINT", /* 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_B10G10R10A2_UINT,
1615 "MESA_FORMAT_B10G10R10A2_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_R10G10B10A2_UINT,
1624 "MESA_FORMAT_R10G10B10A2_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_B4G4R4X4_UNORM,
1633 "MESA_FORMAT_B4G4R4X4_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_B5G5R5X1_UNORM,
1642 "MESA_FORMAT_B5G5R5X1_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_R8G8B8X8_SNORM,
1651 "MESA_FORMAT_R8G8B8X8_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_R8G8B8X8_SRGB,
1660 "MESA_FORMAT_R8G8B8X8_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_RGBX_UINT8,
1669 "MESA_FORMAT_RGBX_UINT8",
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_RGBX_SINT8,
1678 "MESA_FORMAT_RGBX_SINT8",
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_B10G10R10X2_UNORM,
1687 "MESA_FORMAT_B10G10R10X2_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_RGBX_UNORM16,
1696 "MESA_FORMAT_RGBX_UNORM16",
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_RGBX_SNORM16,
1705 "MESA_FORMAT_RGBX_SNORM16",
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_RGBX_FLOAT16,
1714 "MESA_FORMAT_RGBX_FLOAT16",
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_RGBX_UINT16,
1723 "MESA_FORMAT_RGBX_UINT16",
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_RGBX_SINT16,
1732 "MESA_FORMAT_RGBX_SINT16",
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_RGBX_FLOAT32,
1741 "MESA_FORMAT_RGBX_FLOAT32",
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_RGBX_UINT32,
1750 "MESA_FORMAT_RGBX_UINT32",
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_RGBX_SINT32,
1759 "MESA_FORMAT_RGBX_SINT32",
1760 GL_RGB,
1761 GL_INT,
1762 32, 32, 32, 0,
1763 0, 0, 0, 0, 0,
1764 1, 1, 16
1765 },
1766 {
1767 MESA_FORMAT_R10G10B10A2_UNORM,
1768 "MESA_FORMAT_R10G10B10A2_UNORM",
1769 GL_RGBA,
1770 GL_UNSIGNED_NORMALIZED,
1771 10, 10, 10, 2,
1772 0, 0, 0, 0, 0,
1773 1, 1, 4
1774 },
1775 {
1776 MESA_FORMAT_G8R8_SNORM,
1777 "MESA_FORMAT_G8R8_SNORM",
1778 GL_RG,
1779 GL_SIGNED_NORMALIZED,
1780 8, 8, 0, 0,
1781 0, 0, 0, 0, 0,
1782 1, 1, 2
1783 },
1784 {
1785 MESA_FORMAT_G16R16_SNORM,
1786 "MESA_FORMAT_G16R16_SNORM",
1787 GL_RG,
1788 GL_SIGNED_NORMALIZED,
1789 16, 16, 0, 0,
1790 0, 0, 0, 0, 0,
1791 1, 1, 4
1792 },
1793 };
1794
1795
1796
1797 static const struct gl_format_info *
1798 _mesa_get_format_info(mesa_format format)
1799 {
1800 const struct gl_format_info *info = &format_info[format];
1801 assert(info->Name == format);
1802 return info;
1803 }
1804
1805
1806 /** Return string name of format (for debugging) */
1807 const char *
1808 _mesa_get_format_name(mesa_format format)
1809 {
1810 const struct gl_format_info *info = _mesa_get_format_info(format);
1811 return info->StrName;
1812 }
1813
1814
1815
1816 /**
1817 * Return bytes needed to store a block of pixels in the given format.
1818 * Normally, a block is 1x1 (a single pixel). But for compressed formats
1819 * a block may be 4x4 or 8x4, etc.
1820 *
1821 * Note: not GLuint, so as not to coerce math to unsigned. cf. fdo #37351
1822 */
1823 GLint
1824 _mesa_get_format_bytes(mesa_format format)
1825 {
1826 const struct gl_format_info *info = _mesa_get_format_info(format);
1827 ASSERT(info->BytesPerBlock);
1828 ASSERT(info->BytesPerBlock <= MAX_PIXEL_BYTES ||
1829 _mesa_is_format_compressed(format));
1830 return info->BytesPerBlock;
1831 }
1832
1833
1834 /**
1835 * Return bits per component for the given format.
1836 * \param format one of MESA_FORMAT_x
1837 * \param pname the component, such as GL_RED_BITS, GL_TEXTURE_BLUE_BITS, etc.
1838 */
1839 GLint
1840 _mesa_get_format_bits(mesa_format format, GLenum pname)
1841 {
1842 const struct gl_format_info *info = _mesa_get_format_info(format);
1843
1844 switch (pname) {
1845 case GL_RED_BITS:
1846 case GL_TEXTURE_RED_SIZE:
1847 case GL_RENDERBUFFER_RED_SIZE_EXT:
1848 case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
1849 return info->RedBits;
1850 case GL_GREEN_BITS:
1851 case GL_TEXTURE_GREEN_SIZE:
1852 case GL_RENDERBUFFER_GREEN_SIZE_EXT:
1853 case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
1854 return info->GreenBits;
1855 case GL_BLUE_BITS:
1856 case GL_TEXTURE_BLUE_SIZE:
1857 case GL_RENDERBUFFER_BLUE_SIZE_EXT:
1858 case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
1859 return info->BlueBits;
1860 case GL_ALPHA_BITS:
1861 case GL_TEXTURE_ALPHA_SIZE:
1862 case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
1863 case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
1864 return info->AlphaBits;
1865 case GL_TEXTURE_INTENSITY_SIZE:
1866 return info->IntensityBits;
1867 case GL_TEXTURE_LUMINANCE_SIZE:
1868 return info->LuminanceBits;
1869 case GL_INDEX_BITS:
1870 return info->IndexBits;
1871 case GL_DEPTH_BITS:
1872 case GL_TEXTURE_DEPTH_SIZE_ARB:
1873 case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
1874 case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
1875 return info->DepthBits;
1876 case GL_STENCIL_BITS:
1877 case GL_TEXTURE_STENCIL_SIZE_EXT:
1878 case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
1879 case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
1880 return info->StencilBits;
1881 default:
1882 _mesa_problem(NULL, "bad pname in _mesa_get_format_bits()");
1883 return 0;
1884 }
1885 }
1886
1887
1888 GLuint
1889 _mesa_get_format_max_bits(mesa_format format)
1890 {
1891 const struct gl_format_info *info = _mesa_get_format_info(format);
1892 GLuint max = MAX2(info->RedBits, info->GreenBits);
1893 max = MAX2(max, info->BlueBits);
1894 max = MAX2(max, info->AlphaBits);
1895 max = MAX2(max, info->LuminanceBits);
1896 max = MAX2(max, info->IntensityBits);
1897 max = MAX2(max, info->DepthBits);
1898 max = MAX2(max, info->StencilBits);
1899 return max;
1900 }
1901
1902
1903 /**
1904 * Return the data type (or more specifically, the data representation)
1905 * for the given format.
1906 * The return value will be one of:
1907 * GL_UNSIGNED_NORMALIZED = unsigned int representing [0,1]
1908 * GL_SIGNED_NORMALIZED = signed int representing [-1, 1]
1909 * GL_UNSIGNED_INT = an ordinary unsigned integer
1910 * GL_INT = an ordinary signed integer
1911 * GL_FLOAT = an ordinary float
1912 */
1913 GLenum
1914 _mesa_get_format_datatype(mesa_format format)
1915 {
1916 const struct gl_format_info *info = _mesa_get_format_info(format);
1917 return info->DataType;
1918 }
1919
1920
1921 /**
1922 * Return the basic format for the given type. The result will be one of
1923 * GL_RGB, GL_RGBA, GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_INTENSITY,
1924 * GL_YCBCR_MESA, GL_DEPTH_COMPONENT, GL_STENCIL_INDEX, GL_DEPTH_STENCIL.
1925 */
1926 GLenum
1927 _mesa_get_format_base_format(mesa_format format)
1928 {
1929 const struct gl_format_info *info = _mesa_get_format_info(format);
1930 return info->BaseFormat;
1931 }
1932
1933
1934 /**
1935 * Return the block size (in pixels) for the given format. Normally
1936 * the block size is 1x1. But compressed formats will have block sizes
1937 * of 4x4 or 8x4 pixels, etc.
1938 * \param bw returns block width in pixels
1939 * \param bh returns block height in pixels
1940 */
1941 void
1942 _mesa_get_format_block_size(mesa_format format, GLuint *bw, GLuint *bh)
1943 {
1944 const struct gl_format_info *info = _mesa_get_format_info(format);
1945 *bw = info->BlockWidth;
1946 *bh = info->BlockHeight;
1947 }
1948
1949
1950 /** Is the given format a compressed format? */
1951 GLboolean
1952 _mesa_is_format_compressed(mesa_format format)
1953 {
1954 const struct gl_format_info *info = _mesa_get_format_info(format);
1955 return info->BlockWidth > 1 || info->BlockHeight > 1;
1956 }
1957
1958
1959 /**
1960 * Determine if the given format represents a packed depth/stencil buffer.
1961 */
1962 GLboolean
1963 _mesa_is_format_packed_depth_stencil(mesa_format format)
1964 {
1965 const struct gl_format_info *info = _mesa_get_format_info(format);
1966
1967 return info->BaseFormat == GL_DEPTH_STENCIL;
1968 }
1969
1970
1971 /**
1972 * Is the given format a signed/unsigned integer color format?
1973 */
1974 GLboolean
1975 _mesa_is_format_integer_color(mesa_format format)
1976 {
1977 const struct gl_format_info *info = _mesa_get_format_info(format);
1978 return (info->DataType == GL_INT || info->DataType == GL_UNSIGNED_INT) &&
1979 info->BaseFormat != GL_DEPTH_COMPONENT &&
1980 info->BaseFormat != GL_DEPTH_STENCIL &&
1981 info->BaseFormat != GL_STENCIL_INDEX;
1982 }
1983
1984
1985 /**
1986 * Is the given format an unsigned integer format?
1987 */
1988 GLboolean
1989 _mesa_is_format_unsigned(mesa_format format)
1990 {
1991 const struct gl_format_info *info = _mesa_get_format_info(format);
1992 return _mesa_is_type_unsigned(info->DataType);
1993 }
1994
1995
1996 /**
1997 * Does the given format store signed values?
1998 */
1999 GLboolean
2000 _mesa_is_format_signed(mesa_format format)
2001 {
2002 if (format == MESA_FORMAT_R11G11B10_FLOAT ||
2003 format == MESA_FORMAT_R9G9B9E5_FLOAT) {
2004 /* these packed float formats only store unsigned values */
2005 return GL_FALSE;
2006 }
2007 else {
2008 const struct gl_format_info *info = _mesa_get_format_info(format);
2009 return (info->DataType == GL_SIGNED_NORMALIZED ||
2010 info->DataType == GL_INT ||
2011 info->DataType == GL_FLOAT);
2012 }
2013 }
2014
2015
2016 /**
2017 * Return color encoding for given format.
2018 * \return GL_LINEAR or GL_SRGB
2019 */
2020 GLenum
2021 _mesa_get_format_color_encoding(mesa_format format)
2022 {
2023 /* XXX this info should be encoded in gl_format_info */
2024 switch (format) {
2025 case MESA_FORMAT_BGR_SRGB8:
2026 case MESA_FORMAT_A8B8G8R8_SRGB:
2027 case MESA_FORMAT_B8G8R8A8_SRGB:
2028 case MESA_FORMAT_L_SRGB8:
2029 case MESA_FORMAT_L8A8_SRGB:
2030 case MESA_FORMAT_SRGB_DXT1:
2031 case MESA_FORMAT_SRGBA_DXT1:
2032 case MESA_FORMAT_SRGBA_DXT3:
2033 case MESA_FORMAT_SRGBA_DXT5:
2034 case MESA_FORMAT_R8G8B8X8_SRGB:
2035 case MESA_FORMAT_ETC2_SRGB8:
2036 case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
2037 case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
2038 return GL_SRGB;
2039 default:
2040 return GL_LINEAR;
2041 }
2042 }
2043
2044
2045 /**
2046 * For an sRGB format, return the corresponding linear color space format.
2047 * For non-sRGB formats, return the format as-is.
2048 */
2049 mesa_format
2050 _mesa_get_srgb_format_linear(mesa_format format)
2051 {
2052 switch (format) {
2053 case MESA_FORMAT_BGR_SRGB8:
2054 format = MESA_FORMAT_BGR_UNORM8;
2055 break;
2056 case MESA_FORMAT_A8B8G8R8_SRGB:
2057 format = MESA_FORMAT_A8B8G8R8_UNORM;
2058 break;
2059 case MESA_FORMAT_B8G8R8A8_SRGB:
2060 format = MESA_FORMAT_B8G8R8A8_UNORM;
2061 break;
2062 case MESA_FORMAT_L_SRGB8:
2063 format = MESA_FORMAT_L_UNORM8;
2064 break;
2065 case MESA_FORMAT_L8A8_SRGB:
2066 format = MESA_FORMAT_L8A8_UNORM;
2067 break;
2068 case MESA_FORMAT_SRGB_DXT1:
2069 format = MESA_FORMAT_RGB_DXT1;
2070 break;
2071 case MESA_FORMAT_SRGBA_DXT1:
2072 format = MESA_FORMAT_RGBA_DXT1;
2073 break;
2074 case MESA_FORMAT_SRGBA_DXT3:
2075 format = MESA_FORMAT_RGBA_DXT3;
2076 break;
2077 case MESA_FORMAT_SRGBA_DXT5:
2078 format = MESA_FORMAT_RGBA_DXT5;
2079 break;
2080 case MESA_FORMAT_R8G8B8X8_SRGB:
2081 format = MESA_FORMAT_R8G8B8X8_UNORM;
2082 break;
2083 case MESA_FORMAT_ETC2_SRGB8:
2084 format = MESA_FORMAT_ETC2_RGB8;
2085 break;
2086 case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
2087 format = MESA_FORMAT_ETC2_RGBA8_EAC;
2088 break;
2089 case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
2090 format = MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
2091 break;
2092 default:
2093 break;
2094 }
2095 return format;
2096 }
2097
2098
2099 /**
2100 * If the given format is a compressed format, return a corresponding
2101 * uncompressed format.
2102 */
2103 mesa_format
2104 _mesa_get_uncompressed_format(mesa_format format)
2105 {
2106 switch (format) {
2107 case MESA_FORMAT_RGB_FXT1:
2108 return MESA_FORMAT_BGR_UNORM8;
2109 case MESA_FORMAT_RGBA_FXT1:
2110 return MESA_FORMAT_A8B8G8R8_UNORM;
2111 case MESA_FORMAT_RGB_DXT1:
2112 case MESA_FORMAT_SRGB_DXT1:
2113 return MESA_FORMAT_BGR_UNORM8;
2114 case MESA_FORMAT_RGBA_DXT1:
2115 case MESA_FORMAT_SRGBA_DXT1:
2116 return MESA_FORMAT_A8B8G8R8_UNORM;
2117 case MESA_FORMAT_RGBA_DXT3:
2118 case MESA_FORMAT_SRGBA_DXT3:
2119 return MESA_FORMAT_A8B8G8R8_UNORM;
2120 case MESA_FORMAT_RGBA_DXT5:
2121 case MESA_FORMAT_SRGBA_DXT5:
2122 return MESA_FORMAT_A8B8G8R8_UNORM;
2123 case MESA_FORMAT_R_RGTC1_UNORM:
2124 return MESA_FORMAT_R_UNORM8;
2125 case MESA_FORMAT_R_RGTC1_SNORM:
2126 return MESA_FORMAT_R_SNORM8;
2127 case MESA_FORMAT_RG_RGTC2_UNORM:
2128 return MESA_FORMAT_R8G8_UNORM;
2129 case MESA_FORMAT_RG_RGTC2_SNORM:
2130 return MESA_FORMAT_R8G8_SNORM;
2131 case MESA_FORMAT_L_LATC1_UNORM:
2132 return MESA_FORMAT_L_UNORM8;
2133 case MESA_FORMAT_L_LATC1_SNORM:
2134 return MESA_FORMAT_L_SNORM8;
2135 case MESA_FORMAT_LA_LATC2_UNORM:
2136 return MESA_FORMAT_L8A8_UNORM;
2137 case MESA_FORMAT_LA_LATC2_SNORM:
2138 return MESA_FORMAT_L8A8_SNORM;
2139 case MESA_FORMAT_ETC1_RGB8:
2140 case MESA_FORMAT_ETC2_RGB8:
2141 case MESA_FORMAT_ETC2_SRGB8:
2142 return MESA_FORMAT_BGR_UNORM8;
2143 case MESA_FORMAT_ETC2_RGBA8_EAC:
2144 case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
2145 case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
2146 case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
2147 return MESA_FORMAT_A8B8G8R8_UNORM;
2148 case MESA_FORMAT_ETC2_R11_EAC:
2149 case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
2150 return MESA_FORMAT_R_UNORM16;
2151 case MESA_FORMAT_ETC2_RG11_EAC:
2152 case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
2153 return MESA_FORMAT_R16G16_UNORM;
2154 default:
2155 #ifdef DEBUG
2156 assert(!_mesa_is_format_compressed(format));
2157 #endif
2158 return format;
2159 }
2160 }
2161
2162
2163 GLuint
2164 _mesa_format_num_components(mesa_format format)
2165 {
2166 const struct gl_format_info *info = _mesa_get_format_info(format);
2167 return ((info->RedBits > 0) +
2168 (info->GreenBits > 0) +
2169 (info->BlueBits > 0) +
2170 (info->AlphaBits > 0) +
2171 (info->LuminanceBits > 0) +
2172 (info->IntensityBits > 0) +
2173 (info->DepthBits > 0) +
2174 (info->StencilBits > 0));
2175 }
2176
2177
2178 /**
2179 * Return number of bytes needed to store an image of the given size
2180 * in the given format.
2181 */
2182 GLuint
2183 _mesa_format_image_size(mesa_format format, GLsizei width,
2184 GLsizei height, GLsizei depth)
2185 {
2186 const struct gl_format_info *info = _mesa_get_format_info(format);
2187 /* Strictly speaking, a conditional isn't needed here */
2188 if (info->BlockWidth > 1 || info->BlockHeight > 1) {
2189 /* compressed format (2D only for now) */
2190 const GLuint bw = info->BlockWidth, bh = info->BlockHeight;
2191 const GLuint wblocks = (width + bw - 1) / bw;
2192 const GLuint hblocks = (height + bh - 1) / bh;
2193 const GLuint sz = wblocks * hblocks * info->BytesPerBlock;
2194 return sz * depth;
2195 }
2196 else {
2197 /* non-compressed */
2198 const GLuint sz = width * height * depth * info->BytesPerBlock;
2199 return sz;
2200 }
2201 }
2202
2203
2204 /**
2205 * Same as _mesa_format_image_size() but returns a 64-bit value to
2206 * accomodate very large textures.
2207 */
2208 uint64_t
2209 _mesa_format_image_size64(mesa_format format, GLsizei width,
2210 GLsizei height, GLsizei depth)
2211 {
2212 const struct gl_format_info *info = _mesa_get_format_info(format);
2213 /* Strictly speaking, a conditional isn't needed here */
2214 if (info->BlockWidth > 1 || info->BlockHeight > 1) {
2215 /* compressed format (2D only for now) */
2216 const uint64_t bw = info->BlockWidth, bh = info->BlockHeight;
2217 const uint64_t wblocks = (width + bw - 1) / bw;
2218 const uint64_t hblocks = (height + bh - 1) / bh;
2219 const uint64_t sz = wblocks * hblocks * info->BytesPerBlock;
2220 return sz * depth;
2221 }
2222 else {
2223 /* non-compressed */
2224 const uint64_t sz = ((uint64_t) width *
2225 (uint64_t) height *
2226 (uint64_t) depth *
2227 info->BytesPerBlock);
2228 return sz;
2229 }
2230 }
2231
2232
2233
2234 GLint
2235 _mesa_format_row_stride(mesa_format format, GLsizei width)
2236 {
2237 const struct gl_format_info *info = _mesa_get_format_info(format);
2238 /* Strictly speaking, a conditional isn't needed here */
2239 if (info->BlockWidth > 1 || info->BlockHeight > 1) {
2240 /* compressed format */
2241 const GLuint bw = info->BlockWidth;
2242 const GLuint wblocks = (width + bw - 1) / bw;
2243 const GLint stride = wblocks * info->BytesPerBlock;
2244 return stride;
2245 }
2246 else {
2247 const GLint stride = width * info->BytesPerBlock;
2248 return stride;
2249 }
2250 }
2251
2252
2253 /**
2254 * Debug/test: check that all formats are handled in the
2255 * _mesa_format_to_type_and_comps() function. When new pixel formats
2256 * are added to Mesa, that function needs to be updated.
2257 * This is a no-op after the first call.
2258 */
2259 static void
2260 check_format_to_type_and_comps(void)
2261 {
2262 mesa_format f;
2263
2264 for (f = MESA_FORMAT_NONE + 1; f < MESA_FORMAT_COUNT; f++) {
2265 GLenum datatype = 0;
2266 GLuint comps = 0;
2267 /* This function will emit a problem/warning if the format is
2268 * not handled.
2269 */
2270 _mesa_format_to_type_and_comps(f, &datatype, &comps);
2271 }
2272 }
2273
2274
2275 /**
2276 * Do sanity checking of the format info table.
2277 */
2278 void
2279 _mesa_test_formats(void)
2280 {
2281 GLuint i;
2282
2283 STATIC_ASSERT(Elements(format_info) == MESA_FORMAT_COUNT);
2284
2285 for (i = 0; i < MESA_FORMAT_COUNT; i++) {
2286 const struct gl_format_info *info = _mesa_get_format_info(i);
2287 assert(info);
2288
2289 assert(info->Name == i);
2290
2291 if (info->Name == MESA_FORMAT_NONE)
2292 continue;
2293
2294 if (info->BlockWidth == 1 && info->BlockHeight == 1) {
2295 if (info->RedBits > 0) {
2296 GLuint t = info->RedBits + info->GreenBits
2297 + info->BlueBits + info->AlphaBits;
2298 assert(t / 8 <= info->BytesPerBlock);
2299 (void) t;
2300 }
2301 }
2302
2303 assert(info->DataType == GL_UNSIGNED_NORMALIZED ||
2304 info->DataType == GL_SIGNED_NORMALIZED ||
2305 info->DataType == GL_UNSIGNED_INT ||
2306 info->DataType == GL_INT ||
2307 info->DataType == GL_FLOAT ||
2308 /* Z32_FLOAT_X24S8 has DataType of GL_NONE */
2309 info->DataType == GL_NONE);
2310
2311 if (info->BaseFormat == GL_RGB) {
2312 assert(info->RedBits > 0);
2313 assert(info->GreenBits > 0);
2314 assert(info->BlueBits > 0);
2315 assert(info->AlphaBits == 0);
2316 assert(info->LuminanceBits == 0);
2317 assert(info->IntensityBits == 0);
2318 }
2319 else if (info->BaseFormat == GL_RGBA) {
2320 assert(info->RedBits > 0);
2321 assert(info->GreenBits > 0);
2322 assert(info->BlueBits > 0);
2323 assert(info->AlphaBits > 0);
2324 assert(info->LuminanceBits == 0);
2325 assert(info->IntensityBits == 0);
2326 }
2327 else if (info->BaseFormat == GL_RG) {
2328 assert(info->RedBits > 0);
2329 assert(info->GreenBits > 0);
2330 assert(info->BlueBits == 0);
2331 assert(info->AlphaBits == 0);
2332 assert(info->LuminanceBits == 0);
2333 assert(info->IntensityBits == 0);
2334 }
2335 else if (info->BaseFormat == GL_RED) {
2336 assert(info->RedBits > 0);
2337 assert(info->GreenBits == 0);
2338 assert(info->BlueBits == 0);
2339 assert(info->AlphaBits == 0);
2340 assert(info->LuminanceBits == 0);
2341 assert(info->IntensityBits == 0);
2342 }
2343 else if (info->BaseFormat == GL_LUMINANCE) {
2344 assert(info->RedBits == 0);
2345 assert(info->GreenBits == 0);
2346 assert(info->BlueBits == 0);
2347 assert(info->AlphaBits == 0);
2348 assert(info->LuminanceBits > 0);
2349 assert(info->IntensityBits == 0);
2350 }
2351 else if (info->BaseFormat == GL_INTENSITY) {
2352 assert(info->RedBits == 0);
2353 assert(info->GreenBits == 0);
2354 assert(info->BlueBits == 0);
2355 assert(info->AlphaBits == 0);
2356 assert(info->LuminanceBits == 0);
2357 assert(info->IntensityBits > 0);
2358 }
2359 }
2360
2361 check_format_to_type_and_comps();
2362 }
2363
2364
2365
2366 /**
2367 * Return datatype and number of components per texel for the given mesa_format.
2368 * Only used for mipmap generation code.
2369 */
2370 void
2371 _mesa_format_to_type_and_comps(mesa_format format,
2372 GLenum *datatype, GLuint *comps)
2373 {
2374 switch (format) {
2375 case MESA_FORMAT_A8B8G8R8_UNORM:
2376 case MESA_FORMAT_R8G8B8A8_UNORM:
2377 case MESA_FORMAT_B8G8R8A8_UNORM:
2378 case MESA_FORMAT_A8R8G8B8_UNORM:
2379 case MESA_FORMAT_X8B8G8R8_UNORM:
2380 case MESA_FORMAT_R8G8B8X8_UNORM:
2381 case MESA_FORMAT_B8G8R8X8_UNORM:
2382 case MESA_FORMAT_X8R8G8B8_UNORM:
2383 *datatype = GL_UNSIGNED_BYTE;
2384 *comps = 4;
2385 return;
2386 case MESA_FORMAT_BGR_UNORM8:
2387 case MESA_FORMAT_RGB_UNORM8:
2388 *datatype = GL_UNSIGNED_BYTE;
2389 *comps = 3;
2390 return;
2391 case MESA_FORMAT_B5G6R5_UNORM:
2392 case MESA_FORMAT_R5G6B5_UNORM:
2393 *datatype = GL_UNSIGNED_SHORT_5_6_5;
2394 *comps = 3;
2395 return;
2396
2397 case MESA_FORMAT_B4G4R4A4_UNORM:
2398 case MESA_FORMAT_A4R4G4B4_UNORM:
2399 case MESA_FORMAT_B4G4R4X4_UNORM:
2400 *datatype = GL_UNSIGNED_SHORT_4_4_4_4;
2401 *comps = 4;
2402 return;
2403
2404 case MESA_FORMAT_B5G5R5A1_UNORM:
2405 case MESA_FORMAT_A1R5G5B5_UNORM:
2406 case MESA_FORMAT_B5G5R5X1_UNORM:
2407 *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
2408 *comps = 4;
2409 return;
2410
2411 case MESA_FORMAT_B10G10R10A2_UNORM:
2412 *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
2413 *comps = 4;
2414 return;
2415
2416 case MESA_FORMAT_A1B5G5R5_UNORM:
2417 *datatype = GL_UNSIGNED_SHORT_5_5_5_1;
2418 *comps = 4;
2419 return;
2420
2421 case MESA_FORMAT_L4A4_UNORM:
2422 *datatype = MESA_UNSIGNED_BYTE_4_4;
2423 *comps = 2;
2424 return;
2425
2426 case MESA_FORMAT_L8A8_UNORM:
2427 case MESA_FORMAT_A8L8_UNORM:
2428 case MESA_FORMAT_R8G8_UNORM:
2429 case MESA_FORMAT_G8R8_UNORM:
2430 *datatype = GL_UNSIGNED_BYTE;
2431 *comps = 2;
2432 return;
2433
2434 case MESA_FORMAT_L16A16_UNORM:
2435 case MESA_FORMAT_A16L16_UNORM:
2436 case MESA_FORMAT_R16G16_UNORM:
2437 case MESA_FORMAT_G16R16_UNORM:
2438 *datatype = GL_UNSIGNED_SHORT;
2439 *comps = 2;
2440 return;
2441
2442 case MESA_FORMAT_R_UNORM16:
2443 case MESA_FORMAT_A_UNORM16:
2444 case MESA_FORMAT_L_UNORM16:
2445 case MESA_FORMAT_I_UNORM16:
2446 *datatype = GL_UNSIGNED_SHORT;
2447 *comps = 1;
2448 return;
2449
2450 case MESA_FORMAT_B2G3R3_UNORM:
2451 *datatype = GL_UNSIGNED_BYTE_3_3_2;
2452 *comps = 3;
2453 return;
2454
2455 case MESA_FORMAT_A_UNORM8:
2456 case MESA_FORMAT_L_UNORM8:
2457 case MESA_FORMAT_I_UNORM8:
2458 case MESA_FORMAT_R_UNORM8:
2459 case MESA_FORMAT_S_UINT8:
2460 *datatype = GL_UNSIGNED_BYTE;
2461 *comps = 1;
2462 return;
2463
2464 case MESA_FORMAT_YCBCR:
2465 case MESA_FORMAT_YCBCR_REV:
2466 *datatype = GL_UNSIGNED_SHORT;
2467 *comps = 2;
2468 return;
2469
2470 case MESA_FORMAT_S8_UINT_Z24_UNORM:
2471 *datatype = GL_UNSIGNED_INT_24_8_MESA;
2472 *comps = 2;
2473 return;
2474
2475 case MESA_FORMAT_Z24_UNORM_X8_UINT:
2476 *datatype = GL_UNSIGNED_INT_8_24_REV_MESA;
2477 *comps = 2;
2478 return;
2479
2480 case MESA_FORMAT_Z_UNORM16:
2481 *datatype = GL_UNSIGNED_SHORT;
2482 *comps = 1;
2483 return;
2484
2485 case MESA_FORMAT_Z24_UNORM_S8_UINT:
2486 *datatype = GL_UNSIGNED_INT;
2487 *comps = 1;
2488 return;
2489
2490 case MESA_FORMAT_X8Z24_UNORM:
2491 *datatype = GL_UNSIGNED_INT;
2492 *comps = 1;
2493 return;
2494
2495 case MESA_FORMAT_Z_UNORM32:
2496 *datatype = GL_UNSIGNED_INT;
2497 *comps = 1;
2498 return;
2499
2500 case MESA_FORMAT_Z_FLOAT32:
2501 *datatype = GL_FLOAT;
2502 *comps = 1;
2503 return;
2504
2505 case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
2506 *datatype = GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
2507 *comps = 1;
2508 return;
2509
2510 case MESA_FORMAT_DUDV8:
2511 *datatype = GL_BYTE;
2512 *comps = 2;
2513 return;
2514
2515 case MESA_FORMAT_R_SNORM8:
2516 case MESA_FORMAT_A_SNORM8:
2517 case MESA_FORMAT_L_SNORM8:
2518 case MESA_FORMAT_I_SNORM8:
2519 *datatype = GL_BYTE;
2520 *comps = 1;
2521 return;
2522 case MESA_FORMAT_R8G8_SNORM:
2523 case MESA_FORMAT_L8A8_SNORM:
2524 *datatype = GL_BYTE;
2525 *comps = 2;
2526 return;
2527 case MESA_FORMAT_A8B8G8R8_SNORM:
2528 case MESA_FORMAT_R8G8B8A8_SNORM:
2529 case MESA_FORMAT_X8B8G8R8_SNORM:
2530 *datatype = GL_BYTE;
2531 *comps = 4;
2532 return;
2533
2534 case MESA_FORMAT_RGBA_UNORM16:
2535 *datatype = GL_UNSIGNED_SHORT;
2536 *comps = 4;
2537 return;
2538
2539 case MESA_FORMAT_R_SNORM16:
2540 case MESA_FORMAT_A_SNORM16:
2541 case MESA_FORMAT_L_SNORM16:
2542 case MESA_FORMAT_I_SNORM16:
2543 *datatype = GL_SHORT;
2544 *comps = 1;
2545 return;
2546 case MESA_FORMAT_R16G16_SNORM:
2547 case MESA_FORMAT_LA_SNORM16:
2548 *datatype = GL_SHORT;
2549 *comps = 2;
2550 return;
2551 case MESA_FORMAT_RGB_SNORM16:
2552 *datatype = GL_SHORT;
2553 *comps = 3;
2554 return;
2555 case MESA_FORMAT_RGBA_SNORM16:
2556 *datatype = GL_SHORT;
2557 *comps = 4;
2558 return;
2559
2560 case MESA_FORMAT_BGR_SRGB8:
2561 *datatype = GL_UNSIGNED_BYTE;
2562 *comps = 3;
2563 return;
2564 case MESA_FORMAT_A8B8G8R8_SRGB:
2565 case MESA_FORMAT_B8G8R8A8_SRGB:
2566 *datatype = GL_UNSIGNED_BYTE;
2567 *comps = 4;
2568 return;
2569 case MESA_FORMAT_L_SRGB8:
2570 *datatype = GL_UNSIGNED_BYTE;
2571 *comps = 1;
2572 return;
2573 case MESA_FORMAT_L8A8_SRGB:
2574 *datatype = GL_UNSIGNED_BYTE;
2575 *comps = 2;
2576 return;
2577
2578 case MESA_FORMAT_RGB_FXT1:
2579 case MESA_FORMAT_RGBA_FXT1:
2580 case MESA_FORMAT_RGB_DXT1:
2581 case MESA_FORMAT_RGBA_DXT1:
2582 case MESA_FORMAT_RGBA_DXT3:
2583 case MESA_FORMAT_RGBA_DXT5:
2584 case MESA_FORMAT_SRGB_DXT1:
2585 case MESA_FORMAT_SRGBA_DXT1:
2586 case MESA_FORMAT_SRGBA_DXT3:
2587 case MESA_FORMAT_SRGBA_DXT5:
2588 case MESA_FORMAT_R_RGTC1_UNORM:
2589 case MESA_FORMAT_R_RGTC1_SNORM:
2590 case MESA_FORMAT_RG_RGTC2_UNORM:
2591 case MESA_FORMAT_RG_RGTC2_SNORM:
2592 case MESA_FORMAT_L_LATC1_UNORM:
2593 case MESA_FORMAT_L_LATC1_SNORM:
2594 case MESA_FORMAT_LA_LATC2_UNORM:
2595 case MESA_FORMAT_LA_LATC2_SNORM:
2596 case MESA_FORMAT_ETC1_RGB8:
2597 case MESA_FORMAT_ETC2_RGB8:
2598 case MESA_FORMAT_ETC2_SRGB8:
2599 case MESA_FORMAT_ETC2_RGBA8_EAC:
2600 case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
2601 case MESA_FORMAT_ETC2_R11_EAC:
2602 case MESA_FORMAT_ETC2_RG11_EAC:
2603 case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
2604 case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
2605 case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
2606 case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
2607 /* XXX generate error instead? */
2608 *datatype = GL_UNSIGNED_BYTE;
2609 *comps = 0;
2610 return;
2611
2612 case MESA_FORMAT_RGBA_FLOAT32:
2613 *datatype = GL_FLOAT;
2614 *comps = 4;
2615 return;
2616 case MESA_FORMAT_RGBA_FLOAT16:
2617 *datatype = GL_HALF_FLOAT_ARB;
2618 *comps = 4;
2619 return;
2620 case MESA_FORMAT_RGB_FLOAT32:
2621 *datatype = GL_FLOAT;
2622 *comps = 3;
2623 return;
2624 case MESA_FORMAT_RGB_FLOAT16:
2625 *datatype = GL_HALF_FLOAT_ARB;
2626 *comps = 3;
2627 return;
2628 case MESA_FORMAT_LA_FLOAT32:
2629 case MESA_FORMAT_RG_FLOAT32:
2630 *datatype = GL_FLOAT;
2631 *comps = 2;
2632 return;
2633 case MESA_FORMAT_LA_FLOAT16:
2634 case MESA_FORMAT_RG_FLOAT16:
2635 *datatype = GL_HALF_FLOAT_ARB;
2636 *comps = 2;
2637 return;
2638 case MESA_FORMAT_A_FLOAT32:
2639 case MESA_FORMAT_L_FLOAT32:
2640 case MESA_FORMAT_I_FLOAT32:
2641 case MESA_FORMAT_R_FLOAT32:
2642 *datatype = GL_FLOAT;
2643 *comps = 1;
2644 return;
2645 case MESA_FORMAT_A_FLOAT16:
2646 case MESA_FORMAT_L_FLOAT16:
2647 case MESA_FORMAT_I_FLOAT16:
2648 case MESA_FORMAT_R_FLOAT16:
2649 *datatype = GL_HALF_FLOAT_ARB;
2650 *comps = 1;
2651 return;
2652
2653 case MESA_FORMAT_A_UINT8:
2654 case MESA_FORMAT_L_UINT8:
2655 case MESA_FORMAT_I_UINT8:
2656 *datatype = GL_UNSIGNED_BYTE;
2657 *comps = 1;
2658 return;
2659 case MESA_FORMAT_LA_UINT8:
2660 *datatype = GL_UNSIGNED_BYTE;
2661 *comps = 2;
2662 return;
2663
2664 case MESA_FORMAT_A_UINT16:
2665 case MESA_FORMAT_L_UINT16:
2666 case MESA_FORMAT_I_UINT16:
2667 *datatype = GL_UNSIGNED_SHORT;
2668 *comps = 1;
2669 return;
2670 case MESA_FORMAT_LA_UINT16:
2671 *datatype = GL_UNSIGNED_SHORT;
2672 *comps = 2;
2673 return;
2674 case MESA_FORMAT_A_UINT32:
2675 case MESA_FORMAT_L_UINT32:
2676 case MESA_FORMAT_I_UINT32:
2677 *datatype = GL_UNSIGNED_INT;
2678 *comps = 1;
2679 return;
2680 case MESA_FORMAT_LA_UINT32:
2681 *datatype = GL_UNSIGNED_INT;
2682 *comps = 2;
2683 return;
2684 case MESA_FORMAT_A_SINT8:
2685 case MESA_FORMAT_L_SINT8:
2686 case MESA_FORMAT_I_SINT8:
2687 *datatype = GL_BYTE;
2688 *comps = 1;
2689 return;
2690 case MESA_FORMAT_LA_SINT8:
2691 *datatype = GL_BYTE;
2692 *comps = 2;
2693 return;
2694
2695 case MESA_FORMAT_A_SINT16:
2696 case MESA_FORMAT_L_SINT16:
2697 case MESA_FORMAT_I_SINT16:
2698 *datatype = GL_SHORT;
2699 *comps = 1;
2700 return;
2701 case MESA_FORMAT_LA_SINT16:
2702 *datatype = GL_SHORT;
2703 *comps = 2;
2704 return;
2705
2706 case MESA_FORMAT_A_SINT32:
2707 case MESA_FORMAT_L_SINT32:
2708 case MESA_FORMAT_I_SINT32:
2709 *datatype = GL_INT;
2710 *comps = 1;
2711 return;
2712 case MESA_FORMAT_LA_SINT32:
2713 *datatype = GL_INT;
2714 *comps = 2;
2715 return;
2716
2717 case MESA_FORMAT_R_SINT8:
2718 *datatype = GL_BYTE;
2719 *comps = 1;
2720 return;
2721 case MESA_FORMAT_RG_SINT8:
2722 *datatype = GL_BYTE;
2723 *comps = 2;
2724 return;
2725 case MESA_FORMAT_RGB_SINT8:
2726 *datatype = GL_BYTE;
2727 *comps = 3;
2728 return;
2729 case MESA_FORMAT_RGBA_SINT8:
2730 *datatype = GL_BYTE;
2731 *comps = 4;
2732 return;
2733 case MESA_FORMAT_R_SINT16:
2734 *datatype = GL_SHORT;
2735 *comps = 1;
2736 return;
2737 case MESA_FORMAT_RG_SINT16:
2738 *datatype = GL_SHORT;
2739 *comps = 2;
2740 return;
2741 case MESA_FORMAT_RGB_SINT16:
2742 *datatype = GL_SHORT;
2743 *comps = 3;
2744 return;
2745 case MESA_FORMAT_RGBA_SINT16:
2746 *datatype = GL_SHORT;
2747 *comps = 4;
2748 return;
2749 case MESA_FORMAT_R_SINT32:
2750 *datatype = GL_INT;
2751 *comps = 1;
2752 return;
2753 case MESA_FORMAT_RG_SINT32:
2754 *datatype = GL_INT;
2755 *comps = 2;
2756 return;
2757 case MESA_FORMAT_RGB_SINT32:
2758 *datatype = GL_INT;
2759 *comps = 3;
2760 return;
2761 case MESA_FORMAT_RGBA_SINT32:
2762 *datatype = GL_INT;
2763 *comps = 4;
2764 return;
2765
2766 /**
2767 * \name Non-normalized unsigned integer formats.
2768 */
2769 case MESA_FORMAT_R_UINT8:
2770 *datatype = GL_UNSIGNED_BYTE;
2771 *comps = 1;
2772 return;
2773 case MESA_FORMAT_RG_UINT8:
2774 *datatype = GL_UNSIGNED_BYTE;
2775 *comps = 2;
2776 return;
2777 case MESA_FORMAT_RGB_UINT8:
2778 *datatype = GL_UNSIGNED_BYTE;
2779 *comps = 3;
2780 return;
2781 case MESA_FORMAT_RGBA_UINT8:
2782 *datatype = GL_UNSIGNED_BYTE;
2783 *comps = 4;
2784 return;
2785 case MESA_FORMAT_R_UINT16:
2786 *datatype = GL_UNSIGNED_SHORT;
2787 *comps = 1;
2788 return;
2789 case MESA_FORMAT_RG_UINT16:
2790 *datatype = GL_UNSIGNED_SHORT;
2791 *comps = 2;
2792 return;
2793 case MESA_FORMAT_RGB_UINT16:
2794 *datatype = GL_UNSIGNED_SHORT;
2795 *comps = 3;
2796 return;
2797 case MESA_FORMAT_RGBA_UINT16:
2798 *datatype = GL_UNSIGNED_SHORT;
2799 *comps = 4;
2800 return;
2801 case MESA_FORMAT_R_UINT32:
2802 *datatype = GL_UNSIGNED_INT;
2803 *comps = 1;
2804 return;
2805 case MESA_FORMAT_RG_UINT32:
2806 *datatype = GL_UNSIGNED_INT;
2807 *comps = 2;
2808 return;
2809 case MESA_FORMAT_RGB_UINT32:
2810 *datatype = GL_UNSIGNED_INT;
2811 *comps = 3;
2812 return;
2813 case MESA_FORMAT_RGBA_UINT32:
2814 *datatype = GL_UNSIGNED_INT;
2815 *comps = 4;
2816 return;
2817
2818 case MESA_FORMAT_R9G9B9E5_FLOAT:
2819 *datatype = GL_UNSIGNED_INT_5_9_9_9_REV;
2820 *comps = 3;
2821 return;
2822
2823 case MESA_FORMAT_R11G11B10_FLOAT:
2824 *datatype = GL_UNSIGNED_INT_10F_11F_11F_REV;
2825 *comps = 3;
2826 return;
2827
2828 case MESA_FORMAT_B10G10R10A2_UINT:
2829 case MESA_FORMAT_R10G10B10A2_UINT:
2830 *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
2831 *comps = 4;
2832 return;
2833
2834 case MESA_FORMAT_R8G8B8X8_SRGB:
2835 case MESA_FORMAT_RGBX_UINT8:
2836 *datatype = GL_UNSIGNED_BYTE;
2837 *comps = 4;
2838 return;
2839
2840 case MESA_FORMAT_R8G8B8X8_SNORM:
2841 case MESA_FORMAT_RGBX_SINT8:
2842 *datatype = GL_BYTE;
2843 *comps = 4;
2844 return;
2845
2846 case MESA_FORMAT_B10G10R10X2_UNORM:
2847 *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
2848 *comps = 4;
2849 return;
2850
2851 case MESA_FORMAT_RGBX_UNORM16:
2852 case MESA_FORMAT_RGBX_UINT16:
2853 *datatype = GL_UNSIGNED_SHORT;
2854 *comps = 4;
2855 return;
2856
2857 case MESA_FORMAT_RGBX_SNORM16:
2858 case MESA_FORMAT_RGBX_SINT16:
2859 *datatype = GL_SHORT;
2860 *comps = 4;
2861 return;
2862
2863 case MESA_FORMAT_RGBX_FLOAT16:
2864 *datatype = GL_HALF_FLOAT;
2865 *comps = 4;
2866 return;
2867
2868 case MESA_FORMAT_RGBX_FLOAT32:
2869 *datatype = GL_FLOAT;
2870 *comps = 4;
2871 return;
2872
2873 case MESA_FORMAT_RGBX_UINT32:
2874 *datatype = GL_UNSIGNED_INT;
2875 *comps = 4;
2876 return;
2877
2878 case MESA_FORMAT_RGBX_SINT32:
2879 *datatype = GL_INT;
2880 *comps = 4;
2881 return;
2882
2883 case MESA_FORMAT_R10G10B10A2_UNORM:
2884 *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
2885 *comps = 4;
2886 return;
2887
2888 case MESA_FORMAT_G8R8_SNORM:
2889 *datatype = GL_BYTE;
2890 *comps = 2;
2891 return;
2892
2893 case MESA_FORMAT_G16R16_SNORM:
2894 *datatype = GL_SHORT;
2895 *comps = 2;
2896 return;
2897
2898 case MESA_FORMAT_COUNT:
2899 assert(0);
2900 return;
2901
2902 case MESA_FORMAT_NONE:
2903 /* For debug builds, warn if any formats are not handled */
2904 #ifdef DEBUG
2905 default:
2906 #endif
2907 _mesa_problem(NULL, "bad format %s in _mesa_format_to_type_and_comps",
2908 _mesa_get_format_name(format));
2909 *datatype = 0;
2910 *comps = 1;
2911 }
2912 }
2913
2914 /**
2915 * Check if a mesa_format exactly matches a GL format/type combination
2916 * such that we can use memcpy() from one to the other.
2917 * \param mesa_format a MESA_FORMAT_x value
2918 * \param format the user-specified image format
2919 * \param type the user-specified image datatype
2920 * \param swapBytes typically the current pixel pack/unpack byteswap state
2921 * \return GL_TRUE if the formats match, GL_FALSE otherwise.
2922 */
2923 GLboolean
2924 _mesa_format_matches_format_and_type(mesa_format mesa_format,
2925 GLenum format, GLenum type,
2926 GLboolean swapBytes)
2927 {
2928 const GLboolean littleEndian = _mesa_little_endian();
2929
2930 /* Note: When reading a GL format/type combination, the format lists channel
2931 * assignments from most significant channel in the type to least
2932 * significant. A type with _REV indicates that the assignments are
2933 * swapped, so they are listed from least significant to most significant.
2934 *
2935 * For sanity, please keep this switch statement ordered the same as the
2936 * enums in formats.h.
2937 */
2938
2939 switch (mesa_format) {
2940
2941 case MESA_FORMAT_NONE:
2942 case MESA_FORMAT_COUNT:
2943 return GL_FALSE;
2944
2945 case MESA_FORMAT_A8B8G8R8_UNORM:
2946 case MESA_FORMAT_A8B8G8R8_SRGB:
2947 if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8 && !swapBytes)
2948 return GL_TRUE;
2949
2950 if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8_REV && swapBytes)
2951 return GL_TRUE;
2952
2953 if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && !littleEndian)
2954 return GL_TRUE;
2955
2956 if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8_REV
2957 && !swapBytes)
2958 return GL_TRUE;
2959
2960 if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8
2961 && swapBytes)
2962 return GL_TRUE;
2963
2964 if (format == GL_ABGR_EXT && type == GL_UNSIGNED_BYTE && littleEndian)
2965 return GL_TRUE;
2966
2967 return GL_FALSE;
2968
2969 case MESA_FORMAT_R8G8B8A8_UNORM:
2970 if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
2971 !swapBytes)
2972 return GL_TRUE;
2973
2974 if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8 && swapBytes)
2975 return GL_TRUE;
2976
2977 if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && littleEndian)
2978 return GL_TRUE;
2979
2980 if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8 &&
2981 !swapBytes)
2982 return GL_TRUE;
2983
2984 if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
2985 swapBytes)
2986 return GL_TRUE;
2987
2988 if (format == GL_ABGR_EXT && type == GL_UNSIGNED_BYTE && !littleEndian)
2989 return GL_TRUE;
2990
2991 return GL_FALSE;
2992
2993 case MESA_FORMAT_B8G8R8A8_UNORM:
2994 case MESA_FORMAT_B8G8R8A8_SRGB:
2995 if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
2996 !swapBytes)
2997 return GL_TRUE;
2998
2999 if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8 && swapBytes)
3000 return GL_TRUE;
3001
3002 if (format == GL_BGRA && type == GL_UNSIGNED_BYTE && littleEndian)
3003 return GL_TRUE;
3004
3005 return GL_FALSE;
3006
3007 case MESA_FORMAT_A8R8G8B8_UNORM:
3008 if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8 && !swapBytes)
3009 return GL_TRUE;
3010
3011 if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
3012 swapBytes)
3013 return GL_TRUE;
3014
3015 if (format == GL_BGRA && type == GL_UNSIGNED_BYTE && !littleEndian)
3016 return GL_TRUE;
3017
3018 return GL_FALSE;
3019
3020 case MESA_FORMAT_X8B8G8R8_UNORM:
3021 case MESA_FORMAT_R8G8B8X8_UNORM:
3022 return GL_FALSE;
3023
3024 case MESA_FORMAT_B8G8R8X8_UNORM:
3025 case MESA_FORMAT_X8R8G8B8_UNORM:
3026 return GL_FALSE;
3027
3028 case MESA_FORMAT_BGR_UNORM8:
3029 case MESA_FORMAT_BGR_SRGB8:
3030 return format == GL_BGR && type == GL_UNSIGNED_BYTE && littleEndian;
3031
3032 case MESA_FORMAT_RGB_UNORM8:
3033 return format == GL_RGB && type == GL_UNSIGNED_BYTE && littleEndian;
3034
3035 case MESA_FORMAT_B5G6R5_UNORM:
3036 return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5 && !swapBytes;
3037
3038 case MESA_FORMAT_R5G6B5_UNORM:
3039 /* Some of the 16-bit MESA_FORMATs that would seem to correspond to
3040 * GL_UNSIGNED_SHORT_* are byte-swapped instead of channel-reversed,
3041 * according to formats.h, so they can't be matched.
3042 */
3043 return GL_FALSE;
3044
3045 case MESA_FORMAT_B4G4R4A4_UNORM:
3046 return format == GL_BGRA && type == GL_UNSIGNED_SHORT_4_4_4_4_REV &&
3047 !swapBytes;
3048
3049 case MESA_FORMAT_A4R4G4B4_UNORM:
3050 return GL_FALSE;
3051
3052 case MESA_FORMAT_A1B5G5R5_UNORM:
3053 return format == GL_RGBA && type == GL_UNSIGNED_SHORT_5_5_5_1 &&
3054 !swapBytes;
3055
3056 case MESA_FORMAT_B5G5R5A1_UNORM:
3057 return format == GL_BGRA && type == GL_UNSIGNED_SHORT_1_5_5_5_REV &&
3058 !swapBytes;
3059
3060 case MESA_FORMAT_A1R5G5B5_UNORM:
3061 return GL_FALSE;
3062
3063 case MESA_FORMAT_L4A4_UNORM:
3064 return GL_FALSE;
3065 case MESA_FORMAT_L8A8_UNORM:
3066 case MESA_FORMAT_L8A8_SRGB:
3067 return format == GL_LUMINANCE_ALPHA && type == GL_UNSIGNED_BYTE && littleEndian;
3068 case MESA_FORMAT_A8L8_UNORM:
3069 return GL_FALSE;
3070
3071 case MESA_FORMAT_L16A16_UNORM:
3072 return format == GL_LUMINANCE_ALPHA && type == GL_UNSIGNED_SHORT && littleEndian && !swapBytes;
3073 case MESA_FORMAT_A16L16_UNORM:
3074 return GL_FALSE;
3075
3076 case MESA_FORMAT_B2G3R3_UNORM:
3077 return format == GL_RGB && type == GL_UNSIGNED_BYTE_3_3_2;
3078
3079 case MESA_FORMAT_A_UNORM8:
3080 return format == GL_ALPHA && type == GL_UNSIGNED_BYTE;
3081 case MESA_FORMAT_A_UNORM16:
3082 return format == GL_ALPHA && type == GL_UNSIGNED_SHORT && !swapBytes;
3083 case MESA_FORMAT_L_UNORM8:
3084 case MESA_FORMAT_L_SRGB8:
3085 return format == GL_LUMINANCE && type == GL_UNSIGNED_BYTE;
3086 case MESA_FORMAT_L_UNORM16:
3087 return format == GL_LUMINANCE && type == GL_UNSIGNED_SHORT && !swapBytes;
3088 case MESA_FORMAT_I_UNORM8:
3089 return format == GL_INTENSITY && type == GL_UNSIGNED_BYTE;
3090 case MESA_FORMAT_I_UNORM16:
3091 return format == GL_INTENSITY && type == GL_UNSIGNED_SHORT && !swapBytes;
3092
3093 case MESA_FORMAT_YCBCR:
3094 return format == GL_YCBCR_MESA &&
3095 ((type == GL_UNSIGNED_SHORT_8_8_MESA && littleEndian != swapBytes) ||
3096 (type == GL_UNSIGNED_SHORT_8_8_REV_MESA && littleEndian == swapBytes));
3097 case MESA_FORMAT_YCBCR_REV:
3098 return format == GL_YCBCR_MESA &&
3099 ((type == GL_UNSIGNED_SHORT_8_8_MESA && littleEndian == swapBytes) ||
3100 (type == GL_UNSIGNED_SHORT_8_8_REV_MESA && littleEndian != swapBytes));
3101
3102 case MESA_FORMAT_R_UNORM8:
3103 return format == GL_RED && type == GL_UNSIGNED_BYTE;
3104 case MESA_FORMAT_R8G8_UNORM:
3105 return format == GL_RG && type == GL_UNSIGNED_BYTE && littleEndian;
3106 case MESA_FORMAT_G8R8_UNORM:
3107 return GL_FALSE;
3108
3109 case MESA_FORMAT_R_UNORM16:
3110 return format == GL_RED && type == GL_UNSIGNED_SHORT &&
3111 !swapBytes;
3112 case MESA_FORMAT_R16G16_UNORM:
3113 return format == GL_RG && type == GL_UNSIGNED_SHORT && littleEndian &&
3114 !swapBytes;
3115 case MESA_FORMAT_G16R16_UNORM:
3116 return GL_FALSE;
3117
3118 case MESA_FORMAT_B10G10R10A2_UNORM:
3119 return format == GL_BGRA && type == GL_UNSIGNED_INT_2_10_10_10_REV &&
3120 !swapBytes;
3121
3122 case MESA_FORMAT_S8_UINT_Z24_UNORM:
3123 return format == GL_DEPTH_STENCIL && type == GL_UNSIGNED_INT_24_8 &&
3124 !swapBytes;
3125 case MESA_FORMAT_X8Z24_UNORM:
3126 case MESA_FORMAT_Z24_UNORM_X8_UINT:
3127 return GL_FALSE;
3128
3129 case MESA_FORMAT_Z_UNORM16:
3130 return format == GL_DEPTH_COMPONENT && type == GL_UNSIGNED_SHORT &&
3131 !swapBytes;
3132
3133 case MESA_FORMAT_Z24_UNORM_S8_UINT:
3134 return GL_FALSE;
3135
3136 case MESA_FORMAT_Z_UNORM32:
3137 return format == GL_DEPTH_COMPONENT && type == GL_UNSIGNED_INT &&
3138 !swapBytes;
3139
3140 case MESA_FORMAT_S_UINT8:
3141 return format == GL_STENCIL_INDEX && type == GL_UNSIGNED_BYTE;
3142
3143 case MESA_FORMAT_SRGB_DXT1:
3144 case MESA_FORMAT_SRGBA_DXT1:
3145 case MESA_FORMAT_SRGBA_DXT3:
3146 case MESA_FORMAT_SRGBA_DXT5:
3147 return GL_FALSE;
3148
3149 case MESA_FORMAT_RGB_FXT1:
3150 case MESA_FORMAT_RGBA_FXT1:
3151 case MESA_FORMAT_RGB_DXT1:
3152 case MESA_FORMAT_RGBA_DXT1:
3153 case MESA_FORMAT_RGBA_DXT3:
3154 case MESA_FORMAT_RGBA_DXT5:
3155 return GL_FALSE;
3156
3157 case MESA_FORMAT_RGBA_FLOAT32:
3158 return format == GL_RGBA && type == GL_FLOAT && !swapBytes;
3159 case MESA_FORMAT_RGBA_FLOAT16:
3160 return format == GL_RGBA && type == GL_HALF_FLOAT && !swapBytes;
3161
3162 case MESA_FORMAT_RGB_FLOAT32:
3163 return format == GL_RGB && type == GL_FLOAT && !swapBytes;
3164 case MESA_FORMAT_RGB_FLOAT16:
3165 return format == GL_RGB && type == GL_HALF_FLOAT && !swapBytes;
3166
3167 case MESA_FORMAT_A_FLOAT32:
3168 return format == GL_ALPHA && type == GL_FLOAT && !swapBytes;
3169 case MESA_FORMAT_A_FLOAT16:
3170 return format == GL_ALPHA && type == GL_HALF_FLOAT && !swapBytes;
3171
3172 case MESA_FORMAT_L_FLOAT32:
3173 return format == GL_LUMINANCE && type == GL_FLOAT && !swapBytes;
3174 case MESA_FORMAT_L_FLOAT16:
3175 return format == GL_LUMINANCE && type == GL_HALF_FLOAT && !swapBytes;
3176
3177 case MESA_FORMAT_LA_FLOAT32:
3178 return format == GL_LUMINANCE_ALPHA && type == GL_FLOAT && !swapBytes;
3179 case MESA_FORMAT_LA_FLOAT16:
3180 return format == GL_LUMINANCE_ALPHA && type == GL_HALF_FLOAT && !swapBytes;
3181
3182 case MESA_FORMAT_I_FLOAT32:
3183 return format == GL_INTENSITY && type == GL_FLOAT && !swapBytes;
3184 case MESA_FORMAT_I_FLOAT16:
3185 return format == GL_INTENSITY && type == GL_HALF_FLOAT && !swapBytes;
3186
3187 case MESA_FORMAT_R_FLOAT32:
3188 return format == GL_RED && type == GL_FLOAT && !swapBytes;
3189 case MESA_FORMAT_R_FLOAT16:
3190 return format == GL_RED && type == GL_HALF_FLOAT && !swapBytes;
3191
3192 case MESA_FORMAT_RG_FLOAT32:
3193 return format == GL_RG && type == GL_FLOAT && !swapBytes;
3194 case MESA_FORMAT_RG_FLOAT16:
3195 return format == GL_RG && type == GL_HALF_FLOAT && !swapBytes;
3196
3197 case MESA_FORMAT_A_UINT8:
3198 return format == GL_ALPHA_INTEGER && type == GL_UNSIGNED_BYTE;
3199 case MESA_FORMAT_A_UINT16:
3200 return format == GL_ALPHA_INTEGER && type == GL_UNSIGNED_SHORT &&
3201 !swapBytes;
3202 case MESA_FORMAT_A_UINT32:
3203 return format == GL_ALPHA_INTEGER && type == GL_UNSIGNED_INT &&
3204 !swapBytes;
3205 case MESA_FORMAT_A_SINT8:
3206 return format == GL_ALPHA_INTEGER && type == GL_BYTE;
3207 case MESA_FORMAT_A_SINT16:
3208 return format == GL_ALPHA_INTEGER && type == GL_SHORT && !swapBytes;
3209 case MESA_FORMAT_A_SINT32:
3210 return format == GL_ALPHA_INTEGER && type == GL_INT && !swapBytes;
3211
3212 case MESA_FORMAT_I_UINT8:
3213 case MESA_FORMAT_I_UINT16:
3214 case MESA_FORMAT_I_UINT32:
3215 case MESA_FORMAT_I_SINT8:
3216 case MESA_FORMAT_I_SINT16:
3217 case MESA_FORMAT_I_SINT32:
3218 /* GL_INTENSITY_INTEGER_EXT doesn't exist. */
3219 return GL_FALSE;
3220
3221 case MESA_FORMAT_L_UINT8:
3222 return format == GL_LUMINANCE_INTEGER_EXT && type == GL_UNSIGNED_BYTE;
3223 case MESA_FORMAT_L_UINT16:
3224 return format == GL_LUMINANCE_INTEGER_EXT && type == GL_UNSIGNED_SHORT &&
3225 !swapBytes;
3226 case MESA_FORMAT_L_UINT32:
3227 return format == GL_LUMINANCE_INTEGER_EXT && type == GL_UNSIGNED_INT &&
3228 !swapBytes;
3229 case MESA_FORMAT_L_SINT8:
3230 return format == GL_LUMINANCE_INTEGER_EXT && type == GL_BYTE;
3231 case MESA_FORMAT_L_SINT16:
3232 return format == GL_LUMINANCE_INTEGER_EXT && type == GL_SHORT &&
3233 !swapBytes;
3234 case MESA_FORMAT_L_SINT32:
3235 return format == GL_LUMINANCE_INTEGER_EXT && type == GL_INT && !swapBytes;
3236
3237 case MESA_FORMAT_LA_UINT8:
3238 return format == GL_LUMINANCE_ALPHA_INTEGER_EXT &&
3239 type == GL_UNSIGNED_BYTE && !swapBytes;
3240 case MESA_FORMAT_LA_UINT16:
3241 return format == GL_LUMINANCE_ALPHA_INTEGER_EXT &&
3242 type == GL_UNSIGNED_SHORT && !swapBytes;
3243 case MESA_FORMAT_LA_UINT32:
3244 return format == GL_LUMINANCE_ALPHA_INTEGER_EXT &&
3245 type == GL_UNSIGNED_INT && !swapBytes;
3246 case MESA_FORMAT_LA_SINT8:
3247 return format == GL_LUMINANCE_ALPHA_INTEGER_EXT && type == GL_BYTE &&
3248 !swapBytes;
3249 case MESA_FORMAT_LA_SINT16:
3250 return format == GL_LUMINANCE_ALPHA_INTEGER_EXT && type == GL_SHORT &&
3251 !swapBytes;
3252 case MESA_FORMAT_LA_SINT32:
3253 return format == GL_LUMINANCE_ALPHA_INTEGER_EXT && type == GL_INT &&
3254 !swapBytes;
3255
3256 case MESA_FORMAT_R_SINT8:
3257 return format == GL_RED_INTEGER && type == GL_BYTE;
3258 case MESA_FORMAT_RG_SINT8:
3259 return format == GL_RG_INTEGER && type == GL_BYTE && !swapBytes;
3260 case MESA_FORMAT_RGB_SINT8:
3261 return format == GL_RGB_INTEGER && type == GL_BYTE && !swapBytes;
3262 case MESA_FORMAT_RGBA_SINT8:
3263 return format == GL_RGBA_INTEGER && type == GL_BYTE && !swapBytes;
3264 case MESA_FORMAT_R_SINT16:
3265 return format == GL_RED_INTEGER && type == GL_SHORT && !swapBytes;
3266 case MESA_FORMAT_RG_SINT16:
3267 return format == GL_RG_INTEGER && type == GL_SHORT && !swapBytes;
3268 case MESA_FORMAT_RGB_SINT16:
3269 return format == GL_RGB_INTEGER && type == GL_SHORT && !swapBytes;
3270 case MESA_FORMAT_RGBA_SINT16:
3271 return format == GL_RGBA_INTEGER && type == GL_SHORT && !swapBytes;
3272 case MESA_FORMAT_R_SINT32:
3273 return format == GL_RED_INTEGER && type == GL_INT && !swapBytes;
3274 case MESA_FORMAT_RG_SINT32:
3275 return format == GL_RG_INTEGER && type == GL_INT && !swapBytes;
3276 case MESA_FORMAT_RGB_SINT32:
3277 return format == GL_RGB_INTEGER && type == GL_INT && !swapBytes;
3278 case MESA_FORMAT_RGBA_SINT32:
3279 return format == GL_RGBA_INTEGER && type == GL_INT && !swapBytes;
3280
3281 case MESA_FORMAT_R_UINT8:
3282 return format == GL_RED_INTEGER && type == GL_UNSIGNED_BYTE;
3283 case MESA_FORMAT_RG_UINT8:
3284 return format == GL_RG_INTEGER && type == GL_UNSIGNED_BYTE && !swapBytes;
3285 case MESA_FORMAT_RGB_UINT8:
3286 return format == GL_RGB_INTEGER && type == GL_UNSIGNED_BYTE && !swapBytes;
3287 case MESA_FORMAT_RGBA_UINT8:
3288 return format == GL_RGBA_INTEGER && type == GL_UNSIGNED_BYTE &&
3289 !swapBytes;
3290 case MESA_FORMAT_R_UINT16:
3291 return format == GL_RED_INTEGER && type == GL_UNSIGNED_SHORT &&
3292 !swapBytes;
3293 case MESA_FORMAT_RG_UINT16:
3294 return format == GL_RG_INTEGER && type == GL_UNSIGNED_SHORT && !swapBytes;
3295 case MESA_FORMAT_RGB_UINT16:
3296 return format == GL_RGB_INTEGER && type == GL_UNSIGNED_SHORT &&
3297 !swapBytes;
3298 case MESA_FORMAT_RGBA_UINT16:
3299 return format == GL_RGBA_INTEGER && type == GL_UNSIGNED_SHORT &&
3300 !swapBytes;
3301 case MESA_FORMAT_R_UINT32:
3302 return format == GL_RED_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
3303 case MESA_FORMAT_RG_UINT32:
3304 return format == GL_RG_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
3305 case MESA_FORMAT_RGB_UINT32:
3306 return format == GL_RGB_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
3307 case MESA_FORMAT_RGBA_UINT32:
3308 return format == GL_RGBA_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
3309
3310 case MESA_FORMAT_DUDV8:
3311 return (format == GL_DU8DV8_ATI || format == GL_DUDV_ATI) &&
3312 type == GL_BYTE && littleEndian && !swapBytes;
3313
3314 case MESA_FORMAT_R_SNORM8:
3315 return format == GL_RED && type == GL_BYTE;
3316 case MESA_FORMAT_R8G8_SNORM:
3317 return format == GL_RG && type == GL_BYTE && littleEndian &&
3318 !swapBytes;
3319 case MESA_FORMAT_X8B8G8R8_SNORM:
3320 return GL_FALSE;
3321
3322 case MESA_FORMAT_A8B8G8R8_SNORM:
3323 if (format == GL_RGBA && type == GL_BYTE && !littleEndian)
3324 return GL_TRUE;
3325
3326 if (format == GL_ABGR_EXT && type == GL_BYTE && littleEndian)
3327 return GL_TRUE;
3328
3329 return GL_FALSE;
3330
3331 case MESA_FORMAT_R8G8B8A8_SNORM:
3332 if (format == GL_RGBA && type == GL_BYTE && littleEndian)
3333 return GL_TRUE;
3334
3335 if (format == GL_ABGR_EXT && type == GL_BYTE && !littleEndian)
3336 return GL_TRUE;
3337
3338 return GL_FALSE;
3339
3340 case MESA_FORMAT_R_SNORM16:
3341 return format == GL_RED && type == GL_SHORT &&
3342 !swapBytes;
3343 case MESA_FORMAT_R16G16_SNORM:
3344 return format == GL_RG && type == GL_SHORT && littleEndian && !swapBytes;
3345 case MESA_FORMAT_RGB_SNORM16:
3346 return format == GL_RGB && type == GL_SHORT && !swapBytes;
3347 case MESA_FORMAT_RGBA_SNORM16:
3348 return format == GL_RGBA && type == GL_SHORT && !swapBytes;
3349 case MESA_FORMAT_RGBA_UNORM16:
3350 return format == GL_RGBA && type == GL_UNSIGNED_SHORT &&
3351 !swapBytes;
3352
3353 case MESA_FORMAT_R_RGTC1_UNORM:
3354 case MESA_FORMAT_R_RGTC1_SNORM:
3355 case MESA_FORMAT_RG_RGTC2_UNORM:
3356 case MESA_FORMAT_RG_RGTC2_SNORM:
3357 return GL_FALSE;
3358
3359 case MESA_FORMAT_L_LATC1_UNORM:
3360 case MESA_FORMAT_L_LATC1_SNORM:
3361 case MESA_FORMAT_LA_LATC2_UNORM:
3362 case MESA_FORMAT_LA_LATC2_SNORM:
3363 return GL_FALSE;
3364
3365 case MESA_FORMAT_ETC1_RGB8:
3366 case MESA_FORMAT_ETC2_RGB8:
3367 case MESA_FORMAT_ETC2_SRGB8:
3368 case MESA_FORMAT_ETC2_RGBA8_EAC:
3369 case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
3370 case MESA_FORMAT_ETC2_R11_EAC:
3371 case MESA_FORMAT_ETC2_RG11_EAC:
3372 case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
3373 case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
3374 case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
3375 case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
3376 return GL_FALSE;
3377
3378 case MESA_FORMAT_A_SNORM8:
3379 return format == GL_ALPHA && type == GL_BYTE;
3380 case MESA_FORMAT_L_SNORM8:
3381 return format == GL_LUMINANCE && type == GL_BYTE;
3382 case MESA_FORMAT_L8A8_SNORM:
3383 return format == GL_LUMINANCE_ALPHA && type == GL_BYTE &&
3384 littleEndian && !swapBytes;
3385 case MESA_FORMAT_I_SNORM8:
3386 return format == GL_INTENSITY && type == GL_BYTE;
3387 case MESA_FORMAT_A_SNORM16:
3388 return format == GL_ALPHA && type == GL_SHORT && !swapBytes;
3389 case MESA_FORMAT_L_SNORM16:
3390 return format == GL_LUMINANCE && type == GL_SHORT && !swapBytes;
3391 case MESA_FORMAT_LA_SNORM16:
3392 return format == GL_LUMINANCE_ALPHA && type == GL_SHORT &&
3393 littleEndian && !swapBytes;
3394 case MESA_FORMAT_I_SNORM16:
3395 return format == GL_INTENSITY && type == GL_SHORT && littleEndian &&
3396 !swapBytes;
3397
3398 case MESA_FORMAT_B10G10R10A2_UINT:
3399 return (format == GL_BGRA_INTEGER_EXT &&
3400 type == GL_UNSIGNED_INT_2_10_10_10_REV &&
3401 !swapBytes);
3402
3403 case MESA_FORMAT_R10G10B10A2_UINT:
3404 return (format == GL_RGBA_INTEGER_EXT &&
3405 type == GL_UNSIGNED_INT_2_10_10_10_REV &&
3406 !swapBytes);
3407
3408 case MESA_FORMAT_R9G9B9E5_FLOAT:
3409 return format == GL_RGB && type == GL_UNSIGNED_INT_5_9_9_9_REV &&
3410 !swapBytes;
3411
3412 case MESA_FORMAT_R11G11B10_FLOAT:
3413 return format == GL_RGB && type == GL_UNSIGNED_INT_10F_11F_11F_REV &&
3414 !swapBytes;
3415
3416 case MESA_FORMAT_Z_FLOAT32:
3417 return format == GL_DEPTH_COMPONENT && type == GL_FLOAT && !swapBytes;
3418
3419 case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
3420 return format == GL_DEPTH_STENCIL &&
3421 type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV && !swapBytes;
3422
3423 case MESA_FORMAT_B4G4R4X4_UNORM:
3424 case MESA_FORMAT_B5G5R5X1_UNORM:
3425 case MESA_FORMAT_R8G8B8X8_SNORM:
3426 case MESA_FORMAT_R8G8B8X8_SRGB:
3427 case MESA_FORMAT_RGBX_UINT8:
3428 case MESA_FORMAT_RGBX_SINT8:
3429 case MESA_FORMAT_B10G10R10X2_UNORM:
3430 case MESA_FORMAT_RGBX_UNORM16:
3431 case MESA_FORMAT_RGBX_SNORM16:
3432 case MESA_FORMAT_RGBX_FLOAT16:
3433 case MESA_FORMAT_RGBX_UINT16:
3434 case MESA_FORMAT_RGBX_SINT16:
3435 case MESA_FORMAT_RGBX_FLOAT32:
3436 case MESA_FORMAT_RGBX_UINT32:
3437 case MESA_FORMAT_RGBX_SINT32:
3438 return GL_FALSE;
3439
3440 case MESA_FORMAT_R10G10B10A2_UNORM:
3441 return format == GL_RGBA && type == GL_UNSIGNED_INT_2_10_10_10_REV &&
3442 !swapBytes;
3443
3444 case MESA_FORMAT_G8R8_SNORM:
3445 return format == GL_RG && type == GL_BYTE && !littleEndian &&
3446 !swapBytes;
3447
3448 case MESA_FORMAT_G16R16_SNORM:
3449 return format == GL_RG && type == GL_SHORT && !littleEndian &&
3450 !swapBytes;
3451 }
3452
3453 return GL_FALSE;
3454 }
3455