2 * Mesa 3-D graphics library
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (c) 2008-2009 VMware, Inc.
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:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
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.
44 /* OpenGL doesn't have GL_UNSIGNED_BYTE_4_4, so we must define our own type
45 * for GL_LUMINANCE4_ALPHA4. */
46 #define MESA_UNSIGNED_BYTE_4_4 (GL_UNSIGNED_BYTE<<1)
50 * Max number of bytes for any non-compressed pixel format below, or for
51 * intermediate pixel storage in Mesa. This should never be less than
52 * 16. Maybe 32 someday?
54 #define MAX_PIXEL_BYTES 16
58 * Mesa texture/renderbuffer image formats.
65 * \name Basic hardware formats
67 * The mesa format name specification is as follows:
69 * There shall be 3 naming format base types: those for component array
70 * formats (type A); those for compressed formats (type C); and those for packed
71 * component formats (type P). With type A formats, color component order does not
72 * change with endianess. Each format name shall begin with MESA_FORMAT_,
73 * followed by a component label (from the Component Label list below) for each
74 * component in the order that the component(s) occur in the format, except for
75 * non-linear color formats where the first letter shall be 'S'. For type P formats,
76 * each component label is followed by the number of bits that represent it in the
77 * fundamental data type used by the format.
79 * Following the listing of the component labels shall be an underscore; a compression
80 * type followed by an underscore for Type C formats only; a storage type from the list
81 * below; and a bit with for type A formats, which is the bit width for each array element.
84 * ---------- Format Base Type A: Array ----------
85 * MESA_FORMAT_[component list]_[storage type][array element bit width]
88 * MESA_FORMAT_A_SNORM8 - uchar[i] = A
89 * MESA_FORMAT_RGBA_16 - ushort[i * 4 + 0] = R, ushort[i * 4 + 1] = G,
90 * ushort[i * 4 + 2] = B, ushort[i * 4 + 3] = A
91 * MESA_FORMAT_Z_UNORM32 - float[i] = Z
95 * ---------- Format Base Type C: Compressed ----------
96 * MESA_FORMAT_[component list*][_*][compression type][storage type*]
100 * MESA_FORMAT_RGB_ETC1
101 * MESA_FORMAT_RGBA_ETC2
102 * MESA_FORMAT_LATC1_UNORM
103 * MESA_FORMAT_RGBA_FXT1
107 * ---------- Format Base Type P: Packed ----------
108 * MESA_FORMAT_[[component list,bit width][storage type*][_]][_][storage type**]
109 * * when type differs between component
110 * ** when type applies to all components
112 * examples: msb <------ TEXEL BITS -----------> lsb
113 * MESA_FORMAT_A8B8G8R8_UNORM, AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR
114 * MESA_FORMAT_R5G6B5_UNORM RRRR RGGG GGGB BBBB
115 * MESA_FORMAT_B4G4R4X4_UNORM BBBB GGGG RRRR XXXX
116 * MESA_FORMAT_Z32_FLOAT_S8X24_UINT
117 * MESA_FORMAT_R10G10B10A2_UINT
118 * MESA_FORMAT_R9G9B9E5_FLOAT
122 * ---------- Component Labels: ----------
127 * E - Shared Exponent
132 * S - Stencil (when not followed by RGB or RGBA)
141 * ---------- Type C Compression Types: ----------
142 * DXT1 - Color component labels shall be given
143 * DXT3 - Color component labels shall be given
144 * DXT5 - Color component labels shall be given
145 * ETC1 - No other information required
146 * ETC2 - No other information required
147 * FXT1 - Color component labels shall be given
148 * FXT3 - Color component labels shall be given
149 * LATC1 - Fundamental data type shall be given
150 * LATC2 - Fundamental data type shall be given
151 * RGTC1 - Color component labels and data type shall be given
152 * RGTC2 - Color component labels and data type shall be given
156 * ---------- Storage Types: ----------
162 * SRGB - RGB components, or L are UNORMs in sRGB color space. Alpha, if present is linear.
165 * ---------- Type A Format List (based on format_unpack.c):
275 * ---------- Type P Format List (based on format_unpack.c):
310 * Z32_FLOAT_S8X24_UINT
335 /* Type P formats */ /* msb <------ TEXEL BITS -----------> lsb */
336 /* ---- ---- ---- ---- ---- ---- ---- ---- */
337 MESA_FORMAT_A8B8G8R8_UNORM
, /* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
338 MESA_FORMAT_R8G8B8A8_UNORM
, /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
339 MESA_FORMAT_B8G8R8A8_UNORM
, /* BBBB BBBB GGGG GGGG RRRR RRRR AAAA AAAA */
340 MESA_FORMAT_A8R8G8B8_UNORM
, /* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */
341 MESA_FORMAT_X8B8G8R8_UNORM
, /* xxxx xxxx BBBB BBBB GGGG GGGG RRRR RRRR */
342 MESA_FORMAT_R8G8B8X8_UNORM
, /* RRRR RRRR GGGG GGGG BBBB BBBB xxxx xxxx */
343 MESA_FORMAT_B8G8R8X8_UNORM
, /* BBBB BBBB GGGG GGGG RRRR RRRR xxxx xxxx */
344 MESA_FORMAT_X8R8G8B8_UNORM
, /* xxxx xxxx RRRR RRRR GGGG GGGG BBBB BBBB */
347 MESA_FORMAT_BGR_UNORM8
, /* uchar[i * 3] = B, [i * 3 + 1] = G, [i *3 + 2] = R */
348 MESA_FORMAT_RGB_UNORM8
, /* uchar[i * 3] = R, [i * 3 + 1] = G, [i *3 + 2] = B */
351 MESA_FORMAT_RGB565
, /* RRRR RGGG GGGB BBBB */
352 MESA_FORMAT_RGB565_REV
, /* GGGB BBBB RRRR RGGG */
353 MESA_FORMAT_ARGB4444
, /* AAAA RRRR GGGG BBBB */
354 MESA_FORMAT_ARGB4444_REV
, /* GGGG BBBB AAAA RRRR */
355 MESA_FORMAT_RGBA5551
, /* RRRR RGGG GGBB BBBA */
356 MESA_FORMAT_ARGB1555
, /* ARRR RRGG GGGB BBBB */
357 MESA_FORMAT_ARGB1555_REV
, /* GGGB BBBB ARRR RRGG */
358 MESA_FORMAT_AL44
, /* AAAA LLLL */
359 MESA_FORMAT_AL88
, /* AAAA AAAA LLLL LLLL */
360 MESA_FORMAT_AL88_REV
, /* LLLL LLLL AAAA AAAA */
361 MESA_FORMAT_AL1616
, /* AAAA AAAA AAAA AAAA LLLL LLLL LLLL LLLL */
362 MESA_FORMAT_AL1616_REV
, /* LLLL LLLL LLLL LLLL AAAA AAAA AAAA AAAA */
363 MESA_FORMAT_RGB332
, /* RRRG GGBB */
366 MESA_FORMAT_A_UNORM8
, /* uchar[i] = A */
367 MESA_FORMAT_A_UNORM16
, /* ushort[i] = A */
368 MESA_FORMAT_L_UNORM8
, /* uchar[i] = L */
369 MESA_FORMAT_L_UNORM16
, /* ushort[i] = L */
370 MESA_FORMAT_I_UNORM8
, /* uchar[i] = I */
371 MESA_FORMAT_I_UNORM16
, /* ushort[i] = I */
374 MESA_FORMAT_YCBCR
, /* YYYY YYYY UorV UorV */
375 MESA_FORMAT_YCBCR_REV
, /* UorV UorV YYYY YYYY */
377 /* Type A format(s) */
378 MESA_FORMAT_R_UNORM8
, /* uchar[i] = R */
381 MESA_FORMAT_GR88
, /* GGGG GGGG RRRR RRRR */
382 MESA_FORMAT_RG88
, /* RRRR RRRR GGGG GGGG */
384 /* Type A format(s) */
385 MESA_FORMAT_R_UNORM16
, /* ushort[i] = R */
388 MESA_FORMAT_GR1616
, /* GGGG GGGG GGGG GGGG RRRR RRRR RRRR RRRR */
389 MESA_FORMAT_RG1616
, /* RRRR RRRR RRRR RRRR GGGG GGGG GGGG GGGG */
390 MESA_FORMAT_ARGB2101010
, /* AARR RRRR RRRR GGGG GGGG GGBB BBBB BBBB */
391 MESA_FORMAT_Z24_S8
, /* ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ SSSS SSSS */
392 MESA_FORMAT_S8_Z24
, /* SSSS SSSS ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */
394 /* Type A format(s) */
395 MESA_FORMAT_Z_UNORM16
, /* ushort[i] = Z */
398 MESA_FORMAT_X8_Z24
, /* xxxx xxxx ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */
399 MESA_FORMAT_Z24_X8
, /* ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ xxxx xxxx */
402 MESA_FORMAT_Z_UNORM32
, /* uint[i] = Z */
403 MESA_FORMAT_S_UINT8
, /* uchar[i] = S */
407 * \name 8-bit/channel sRGB formats
410 /* Type A format(s) */
411 MESA_FORMAT_BGR_SRGB8
, /* uchar[i * 3] = B, [i * 3 + 1] = G, [i *3 + 2] = R */
414 MESA_FORMAT_SRGBA8
, /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
415 MESA_FORMAT_SARGB8
, /* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */
417 /* Type A format(s) */
418 MESA_FORMAT_L_SRGB8
, /* uchar[i] = L */
421 MESA_FORMAT_SLA8
, /* AAAA AAAA LLLL LLLL */
424 MESA_FORMAT_SRGB_DXT1
,
425 MESA_FORMAT_SRGBA_DXT1
,
426 MESA_FORMAT_SRGBA_DXT3
,
427 MESA_FORMAT_SRGBA_DXT5
,
431 * \name Compressed texture formats.
435 MESA_FORMAT_RGB_FXT1
,
436 MESA_FORMAT_RGBA_FXT1
,
437 MESA_FORMAT_RGB_DXT1
,
438 MESA_FORMAT_RGBA_DXT1
,
439 MESA_FORMAT_RGBA_DXT3
,
440 MESA_FORMAT_RGBA_DXT5
,
444 * \name Floating point texture formats.
449 MESA_FORMAT_RGBA_FLOAT32
, /* float[i * 4] = R, [i * 4 + 1] = G, [i * 4 + 2] = B, [i * 4 + 3] = A */
450 MESA_FORMAT_RGBA_FLOAT16
,
451 MESA_FORMAT_RGB_FLOAT32
,
452 MESA_FORMAT_RGB_FLOAT16
,
453 MESA_FORMAT_ALPHA_FLOAT32
,
454 MESA_FORMAT_ALPHA_FLOAT16
,
455 MESA_FORMAT_LUMINANCE_FLOAT32
,
456 MESA_FORMAT_LUMINANCE_FLOAT16
,
457 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32
,
458 MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16
,
459 MESA_FORMAT_INTENSITY_FLOAT32
,
460 MESA_FORMAT_INTENSITY_FLOAT16
,
461 MESA_FORMAT_R_FLOAT32
,
462 MESA_FORMAT_R_FLOAT16
,
463 MESA_FORMAT_RG_FLOAT32
,
464 MESA_FORMAT_RG_FLOAT16
,
468 * \name Non-normalized signed integer formats.
469 * XXX Note: these are just stand-ins for some better hardware
470 * formats TBD such as BGRA or ARGB.
474 MESA_FORMAT_ALPHA_UINT8
,
475 MESA_FORMAT_ALPHA_UINT16
,
476 MESA_FORMAT_ALPHA_UINT32
,
477 MESA_FORMAT_ALPHA_INT8
,
478 MESA_FORMAT_ALPHA_INT16
,
479 MESA_FORMAT_ALPHA_INT32
,
481 MESA_FORMAT_INTENSITY_UINT8
,
482 MESA_FORMAT_INTENSITY_UINT16
,
483 MESA_FORMAT_INTENSITY_UINT32
,
484 MESA_FORMAT_INTENSITY_INT8
,
485 MESA_FORMAT_INTENSITY_INT16
,
486 MESA_FORMAT_INTENSITY_INT32
,
488 MESA_FORMAT_LUMINANCE_UINT8
,
489 MESA_FORMAT_LUMINANCE_UINT16
,
490 MESA_FORMAT_LUMINANCE_UINT32
,
491 MESA_FORMAT_LUMINANCE_INT8
,
492 MESA_FORMAT_LUMINANCE_INT16
,
493 MESA_FORMAT_LUMINANCE_INT32
,
494 MESA_FORMAT_LUMINANCE_ALPHA_UINT8
,
495 MESA_FORMAT_LUMINANCE_ALPHA_UINT16
,
496 MESA_FORMAT_LUMINANCE_ALPHA_UINT32
,
497 MESA_FORMAT_LUMINANCE_ALPHA_INT8
,
498 MESA_FORMAT_LUMINANCE_ALPHA_INT16
,
499 MESA_FORMAT_LUMINANCE_ALPHA_INT32
,
503 MESA_FORMAT_RGB_INT8
,
504 MESA_FORMAT_RGBA_INT8
,
506 MESA_FORMAT_RG_INT16
,
507 MESA_FORMAT_RGB_INT16
,
508 MESA_FORMAT_RGBA_INT16
,
511 MESA_FORMAT_RG_INT32
,
512 MESA_FORMAT_RGB_INT32
,
513 MESA_FORMAT_RGBA_INT32
,
516 * \name Non-normalized unsigned integer formats.
518 /* Type A format(s) */
520 MESA_FORMAT_RG_UINT8
,
521 MESA_FORMAT_RGB_UINT8
,
522 MESA_FORMAT_RGBA_UINT8
,
524 MESA_FORMAT_R_UINT16
,
525 MESA_FORMAT_RG_UINT16
,
526 MESA_FORMAT_RGB_UINT16
,
527 MESA_FORMAT_RGBA_UINT16
,
529 MESA_FORMAT_R_UINT32
,
530 MESA_FORMAT_RG_UINT32
,
531 MESA_FORMAT_RGB_UINT32
,
532 MESA_FORMAT_RGBA_UINT32
,
534 /* msb <------ TEXEL BITS -----------> lsb */
535 /* ---- ---- ---- ---- ---- ---- ---- ---- */
537 * \name Signed fixed point texture formats.
540 MESA_FORMAT_DUDV8
, /* DUDU DUDU DVDV DVDV */
542 /* Type A format(s) */
543 MESA_FORMAT_SIGNED_R8
, /* RRRR RRRR */
546 MESA_FORMAT_SIGNED_RG88_REV
, /* GGGG GGGG RRRR RRRR */
547 MESA_FORMAT_SIGNED_RGBX8888
, /* RRRR RRRR GGGG GGGG BBBB BBBB xxxx xxxx */
548 MESA_FORMAT_SIGNED_RGBA8888
, /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
549 MESA_FORMAT_SIGNED_RGBA8888_REV
,/*AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
551 /* Type A format(s) */
552 MESA_FORMAT_SIGNED_R16
, /* RRRR RRRR RRRR RRRR */
554 /* Type P format(s) */
555 MESA_FORMAT_SIGNED_GR1616
, /* GGGG GGGG GGGG GGGG RRRR RRRR RRRR RRRR */
557 /* Type A format(s) */
558 MESA_FORMAT_SIGNED_RGB_16
, /* ushort[0]=R, ushort[1]=G, ushort[2]=B */
559 MESA_FORMAT_SIGNED_RGBA_16
, /* ... */
560 MESA_FORMAT_RGBA_UNORM16
, /* ... */
565 MESA_FORMAT_RED_RGTC1
,
566 MESA_FORMAT_SIGNED_RED_RGTC1
,
567 MESA_FORMAT_RG_RGTC2
,
568 MESA_FORMAT_SIGNED_RG_RGTC2
,
573 MESA_FORMAT_SIGNED_L_LATC1
,
574 MESA_FORMAT_LA_LATC2
,
575 MESA_FORMAT_SIGNED_LA_LATC2
,
578 MESA_FORMAT_ETC1_RGB8
,
579 MESA_FORMAT_ETC2_RGB8
,
580 MESA_FORMAT_ETC2_SRGB8
,
581 MESA_FORMAT_ETC2_RGBA8_EAC
,
582 MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC
,
583 MESA_FORMAT_ETC2_R11_EAC
,
584 MESA_FORMAT_ETC2_RG11_EAC
,
585 MESA_FORMAT_ETC2_SIGNED_R11_EAC
,
586 MESA_FORMAT_ETC2_SIGNED_RG11_EAC
,
587 MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1
,
588 MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1
,
590 /* Type A format(s) */
591 MESA_FORMAT_SIGNED_A8
, /* AAAA AAAA */
592 MESA_FORMAT_SIGNED_L8
, /* LLLL LLLL */
594 /* Type P format(s) */
595 MESA_FORMAT_SIGNED_AL88
, /* AAAA AAAA LLLL LLLL */
597 /* Type A format(s) */
598 MESA_FORMAT_SIGNED_I8
, /* IIII IIII */
599 MESA_FORMAT_SIGNED_A16
, /* AAAA AAAA AAAA AAAA */
600 MESA_FORMAT_SIGNED_L16
, /* LLLL LLLL LLLL LLLL */
601 MESA_FORMAT_SIGNED_AL1616
, /* AAAA AAAA AAAA AAAA LLLL LLLL LLLL LLLL */
602 MESA_FORMAT_SIGNED_I16
, /* IIII IIII IIII IIII */
604 /* Type P format(s) */
605 MESA_FORMAT_RGB9_E5_FLOAT
,
606 MESA_FORMAT_R11_G11_B10_FLOAT
,
608 /* Type A format(s) */
609 MESA_FORMAT_Z_FLOAT32
,
612 MESA_FORMAT_Z32_FLOAT_X24S8
,
614 MESA_FORMAT_ARGB2101010_UINT
,
615 MESA_FORMAT_ABGR2101010_UINT
,
617 MESA_FORMAT_XRGB4444_UNORM
, /* xxxx RRRR GGGG BBBB */
618 MESA_FORMAT_XRGB1555_UNORM
, /* xRRR RRGG GGGB BBBB */
619 MESA_FORMAT_XBGR8888_SNORM
, /* xxxx xxxx BBBB BBBB GGGG GGGG RRRR RRRR */
620 MESA_FORMAT_XBGR8888_SRGB
, /* xxxx xxxx BBBB BBBB GGGG GGGG RRRR RRRR */
623 MESA_FORMAT_RGBX_UINT8
, /* uchar[i * 4] = R, [i * 4 + 1] = G, [i * 4 + 2] = B, [i * 4 + 3] = x */
624 MESA_FORMAT_RGBX_SINT8
, /* char[i * 4] = R, [i * 4 + 1] = G, [i * 4 + 2] = B, [i * 4 + 3] = x */
626 /* Type P format(s) */
627 MESA_FORMAT_XRGB2101010_UNORM
, /* xxRR RRRR RRRR GGGG GGGG GGBB BBBB BBBB */
629 /* Type A format(s) */
630 MESA_FORMAT_RGBX_UNORM16
, /* ushort[i * 4] = R, [i * 4 + 1] = G, [i * 4 + 2] = B, [i * 4 + 3] = x */
631 MESA_FORMAT_RGBX_SNORM16
, /* ... */
632 MESA_FORMAT_RGBX_FLOAT16
, /* ... */
633 MESA_FORMAT_RGBX_UINT16
, /* ... */
634 MESA_FORMAT_RGBX_SINT16
, /* ... */
636 MESA_FORMAT_RGBX_FLOAT32
, /* float[i * 4] = R, [i * 4 + 1] = G, [i * 4 + 2] = B, [i * 4 + 3] = x */
637 MESA_FORMAT_RGBX_UINT32
, /* ... */
638 MESA_FORMAT_RGBX_SINT32
, /* ... */
641 MESA_FORMAT_ABGR2101010
,
642 MESA_FORMAT_SIGNED_RG88
,
643 MESA_FORMAT_SIGNED_RG1616
,
650 _mesa_get_format_name(mesa_format format
);
653 _mesa_get_format_bytes(mesa_format format
);
656 _mesa_get_format_bits(mesa_format format
, GLenum pname
);
659 _mesa_get_format_max_bits(mesa_format format
);
662 _mesa_get_format_datatype(mesa_format format
);
665 _mesa_get_format_base_format(mesa_format format
);
668 _mesa_get_format_block_size(mesa_format format
, GLuint
*bw
, GLuint
*bh
);
671 _mesa_is_format_compressed(mesa_format format
);
674 _mesa_is_format_packed_depth_stencil(mesa_format format
);
677 _mesa_is_format_integer_color(mesa_format format
);
680 _mesa_is_format_unsigned(mesa_format format
);
683 _mesa_is_format_signed(mesa_format format
);
686 _mesa_get_format_color_encoding(mesa_format format
);
689 _mesa_format_image_size(mesa_format format
, GLsizei width
,
690 GLsizei height
, GLsizei depth
);
693 _mesa_format_image_size64(mesa_format format
, GLsizei width
,
694 GLsizei height
, GLsizei depth
);
697 _mesa_format_row_stride(mesa_format format
, GLsizei width
);
700 _mesa_format_to_type_and_comps(mesa_format format
,
701 GLenum
*datatype
, GLuint
*comps
);
704 _mesa_test_formats(void);
707 _mesa_get_srgb_format_linear(mesa_format format
);
710 _mesa_get_uncompressed_format(mesa_format format
);
713 _mesa_format_num_components(mesa_format format
);
716 _mesa_format_matches_format_and_type(mesa_format mesa_format
,
717 GLenum format
, GLenum type
,
718 GLboolean swapBytes
);
724 #endif /* FORMATS_H */