u_format.h revision ff6cf60cb80c3bc31d9a4307c32185f65054bc58
115422b2d99be074e1d6ac064b6f791245975da83José Fonseca/**************************************************************************
215422b2d99be074e1d6ac064b6f791245975da83José Fonseca *
3816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Copyright 2009-2010 Vmware, Inc.
415422b2d99be074e1d6ac064b6f791245975da83José Fonseca * All Rights Reserved.
515422b2d99be074e1d6ac064b6f791245975da83José Fonseca *
615422b2d99be074e1d6ac064b6f791245975da83José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
715422b2d99be074e1d6ac064b6f791245975da83José Fonseca * copy of this software and associated documentation files (the
815422b2d99be074e1d6ac064b6f791245975da83José Fonseca * "Software"), to deal in the Software without restriction, including
915422b2d99be074e1d6ac064b6f791245975da83José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
1015422b2d99be074e1d6ac064b6f791245975da83José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
1115422b2d99be074e1d6ac064b6f791245975da83José Fonseca * permit persons to whom the Software is furnished to do so, subject to
1215422b2d99be074e1d6ac064b6f791245975da83José Fonseca * the following conditions:
1315422b2d99be074e1d6ac064b6f791245975da83José Fonseca *
1415422b2d99be074e1d6ac064b6f791245975da83José Fonseca * The above copyright notice and this permission notice (including the
1515422b2d99be074e1d6ac064b6f791245975da83José Fonseca * next paragraph) shall be included in all copies or substantial portions
1615422b2d99be074e1d6ac064b6f791245975da83José Fonseca * of the Software.
1715422b2d99be074e1d6ac064b6f791245975da83José Fonseca *
1815422b2d99be074e1d6ac064b6f791245975da83José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1915422b2d99be074e1d6ac064b6f791245975da83José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2015422b2d99be074e1d6ac064b6f791245975da83José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2115422b2d99be074e1d6ac064b6f791245975da83José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
2215422b2d99be074e1d6ac064b6f791245975da83José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2315422b2d99be074e1d6ac064b6f791245975da83José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2415422b2d99be074e1d6ac064b6f791245975da83José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2515422b2d99be074e1d6ac064b6f791245975da83José Fonseca *
2615422b2d99be074e1d6ac064b6f791245975da83José Fonseca **************************************************************************/
2715422b2d99be074e1d6ac064b6f791245975da83José Fonseca
2815422b2d99be074e1d6ac064b6f791245975da83José Fonseca
2915422b2d99be074e1d6ac064b6f791245975da83José Fonseca#ifndef U_FORMAT_H
3015422b2d99be074e1d6ac064b6f791245975da83José Fonseca#define U_FORMAT_H
3115422b2d99be074e1d6ac064b6f791245975da83José Fonseca
3215422b2d99be074e1d6ac064b6f791245975da83José Fonseca
3315422b2d99be074e1d6ac064b6f791245975da83José Fonseca#include "pipe/p_format.h"
34ad9cc55bed64af71f16b0be89af7d0a76b73ef91José Fonseca#include "util/u_debug.h"
3515422b2d99be074e1d6ac064b6f791245975da83José Fonseca
36c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus
37c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolextern "C" {
38c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif
39c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
4015422b2d99be074e1d6ac064b6f791245975da83José Fonseca
4159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca/**
42816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Describe how to pack/unpack pixels into/from the prescribed format.
4359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca *
44816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * XXX: This could be renamed to something like util_format_pack, or broke down
45816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * in flags inside util_format_block that said exactly what we want.
4659f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */
4715422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_layout {
4859f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca   /**
49816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Formats with util_format_block::width == util_format_block::height == 1
50816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * that can be described as an ordinary data structure.
5159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca    */
52816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   UTIL_FORMAT_LAYOUT_PLAIN = 0,
5359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca
5459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca   /**
55816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Formats with sub-sampled channels.
56816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    *
57816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * This is for formats like YV12 where there is less than one sample per
58816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * pixel.
5959f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca    */
60816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   UTIL_FORMAT_LAYOUT_SUBSAMPLED = 3,
6159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca
6259f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca   /**
63b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca    * S3 Texture Compression formats.
64b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca    */
65b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca   UTIL_FORMAT_LAYOUT_S3TC = 4,
66b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca
67b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca   /**
68b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca    * Red-Green Texture Compression formats.
69b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca    */
70b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca   UTIL_FORMAT_LAYOUT_RGTC = 5,
71b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca
72b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca   /**
73b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca    * Everything else that doesn't fit in any of the above layouts.
7459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca    */
75b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca   UTIL_FORMAT_LAYOUT_OTHER = 6
7615422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
7715422b2d99be074e1d6ac064b6f791245975da83José Fonseca
7815422b2d99be074e1d6ac064b6f791245975da83José Fonseca
7915422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_block
8015422b2d99be074e1d6ac064b6f791245975da83José Fonseca{
8115422b2d99be074e1d6ac064b6f791245975da83José Fonseca   /** Block width in pixels */
8215422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned width;
8315422b2d99be074e1d6ac064b6f791245975da83José Fonseca
8415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   /** Block height in pixels */
8515422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned height;
8615422b2d99be074e1d6ac064b6f791245975da83José Fonseca
876df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol   /** Block size in bits */
8815422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned bits;
8915422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
9015422b2d99be074e1d6ac064b6f791245975da83José Fonseca
9115422b2d99be074e1d6ac064b6f791245975da83José Fonseca
9215422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_type {
9315422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_VOID = 0,
9415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_UNSIGNED = 1,
9515422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_SIGNED = 2,
9615422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_FIXED = 3,
9715422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_FLOAT = 4
9815422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
9915422b2d99be074e1d6ac064b6f791245975da83José Fonseca
10015422b2d99be074e1d6ac064b6f791245975da83José Fonseca
10115422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_swizzle {
10215422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_X = 0,
10315422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_Y = 1,
10415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_Z = 2,
10515422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_W = 3,
10615422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_0 = 4,
10715422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_1 = 5,
108ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul   UTIL_FORMAT_SWIZZLE_NONE = 6,
109ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul   UTIL_FORMAT_SWIZZLE_MAX = 7  /**< Number of enums counter (must be last) */
11015422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
11115422b2d99be074e1d6ac064b6f791245975da83José Fonseca
11215422b2d99be074e1d6ac064b6f791245975da83José Fonseca
11315422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_colorspace {
11415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_COLORSPACE_RGB = 0,
11542b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca   UTIL_FORMAT_COLORSPACE_SRGB = 1,
11642b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca   UTIL_FORMAT_COLORSPACE_YUV = 2,
117e4069d07ddd8c2afa5378e54710e19e7517d43d6Keith Whitwell   UTIL_FORMAT_COLORSPACE_ZS = 3
11815422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
11915422b2d99be074e1d6ac064b6f791245975da83José Fonseca
12015422b2d99be074e1d6ac064b6f791245975da83José Fonseca
12115422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_channel_description
12215422b2d99be074e1d6ac064b6f791245975da83José Fonseca{
12352b9ec727bfeca0cf13078dc352962b58293b2d4Brian Paul   unsigned type:6;        /**< UTIL_FORMAT_TYPE_x */
12415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned normalized:1;
12552b9ec727bfeca0cf13078dc352962b58293b2d4Brian Paul   unsigned size:9;        /**< bits per channel */
12615422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
12715422b2d99be074e1d6ac064b6f791245975da83José Fonseca
12815422b2d99be074e1d6ac064b6f791245975da83José Fonseca
12915422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_description
13015422b2d99be074e1d6ac064b6f791245975da83José Fonseca{
13115422b2d99be074e1d6ac064b6f791245975da83José Fonseca   enum pipe_format format;
1324afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca
13315422b2d99be074e1d6ac064b6f791245975da83José Fonseca   const char *name;
134816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca
135816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
1364afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca    * Short name, striped of the prefix, lower case.
1374afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca    */
1384afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca   const char *short_name;
1394afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca
1404afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca   /**
141816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Pixel block dimensions.
142816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
14315422b2d99be074e1d6ac064b6f791245975da83José Fonseca   struct util_format_block block;
144816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca
14515422b2d99be074e1d6ac064b6f791245975da83José Fonseca   enum util_format_layout layout;
1465dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
1475dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   /**
1485dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    * The number of channels.
1495dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    */
1505dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   unsigned nr_channels:3;
1515dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
1525dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   /**
153816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Whether all channels have the same number of (whole) bytes.
1545dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    */
1555dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   unsigned is_array:1;
1565dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
1575dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   /**
158cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    * Whether the pixel format can be described as a bitfield structure.
159cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    *
160cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    * In particular:
161cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    * - pixel depth must be 8, 16, or 32 bits;
162cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    * - all channels must be unsigned, signed, or void
163cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    */
164cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca   unsigned is_bitmask:1;
165cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca
166cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca   /**
1675dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    * Whether channels have mixed types (ignoring UTIL_FORMAT_TYPE_VOID).
1685dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    */
1695dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   unsigned is_mixed:1;
1705dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
171816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
172816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Input channel description.
173816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    *
174816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Only valid for UTIL_FORMAT_LAYOUT_PLAIN formats.
175816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
17615422b2d99be074e1d6ac064b6f791245975da83José Fonseca   struct util_format_channel_description channel[4];
1775dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
178816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
179816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Output channel swizzle.
180816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    *
181816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * The order is either:
182816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * - RGBA
183816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * - YUV(A)
184816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * - ZS
185816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * depending on the colorspace.
186816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
18715422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned char swizzle[4];
1885dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
189816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
190816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Colorspace transformation.
191816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
19215422b2d99be074e1d6ac064b6f791245975da83José Fonseca   enum util_format_colorspace colorspace;
19396bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
19496bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   /**
195018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Unpack pixel blocks to R8G8B8A8_UNORM.
196b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
197d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
198d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
19996bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca    */
20096bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
201d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_rgba_8unorm)(uint8_t *dst, unsigned dst_stride,
202d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                         const uint8_t *src, unsigned src_stride,
203d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                         unsigned width, unsigned height);
20496bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
20569895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
206018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Pack pixel blocks from R8G8B8A8_UNORM.
207b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
208d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
209d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
21069895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
21196bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
212d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_rgba_8unorm)(uint8_t *dst, unsigned dst_stride,
213d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       const uint8_t *src, unsigned src_stride,
214d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       unsigned width, unsigned height);
21596bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
21669895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
217a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca    * Fetch a single pixel (i, j) from a block.
218a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca    *
219a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca    * XXX: Only defined for a very few select formats.
220a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca    */
221a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca   void
222a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca   (*fetch_rgba_8unorm)(uint8_t *dst,
223a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca                        const uint8_t *src,
224a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca                        unsigned i, unsigned j);
225a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca
226a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca   /**
227018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Unpack pixel blocks to R32G32B32A32_FLOAT.
228b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
229d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
230d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
23169895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
23296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
233d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_rgba_float)(float *dst, unsigned dst_stride,
234d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                        const uint8_t *src, unsigned src_stride,
235d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                        unsigned width, unsigned height);
23696bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
23769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
238018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Pack pixel blocks from R32G32B32A32_FLOAT.
239b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
240d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
241d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
24269895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
24396bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
244d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_rgba_float)(uint8_t *dst, unsigned dst_stride,
245d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                      const float *src, unsigned src_stride,
246d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                      unsigned width, unsigned height);
24796bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
24869895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
24969895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    * Fetch a single pixel (i, j) from a block.
250d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
251d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
252d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
253d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
254d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*fetch_rgba_float)(float *dst,
255d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       const uint8_t *src,
256d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       unsigned i, unsigned j);
257d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
258d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
259d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Unpack pixels to Z32_UNORM.
260b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
261d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
262d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for depth formats.
263d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
264d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
265d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_z_32unorm)(uint32_t *dst, unsigned dst_stride,
266d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       const uint8_t *src, unsigned src_stride,
267d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       unsigned width, unsigned height);
268d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
269d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
270d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Pack pixels from Z32_FLOAT.
271b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
272d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
273d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for depth formats.
274d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
275d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
276d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_z_32unorm)(uint8_t *dst, unsigned dst_stride,
277d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                     const uint32_t *src, unsigned src_stride,
278d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                     unsigned width, unsigned height);
279d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
280d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
281d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Unpack pixels to Z32_FLOAT.
282b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
283d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
284d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for depth formats.
285d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
286d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
287d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_z_float)(float *dst, unsigned dst_stride,
288d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                     const uint8_t *src, unsigned src_stride,
289d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                     unsigned width, unsigned height);
290d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
291d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
292d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Pack pixels from Z32_FLOAT.
293b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
294d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
295d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for depth formats.
29669895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
29769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   void
298d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_z_float)(uint8_t *dst, unsigned dst_stride,
299d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                   const float *src, unsigned src_stride,
300d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                   unsigned width, unsigned height);
301d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
302d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
303d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Unpack pixels to S8_USCALED.
304b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
305d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
306d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for stencil formats.
307d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
308d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
309866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca   (*unpack_s_8uscaled)(uint8_t *dst, unsigned dst_stride,
310866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                        const uint8_t *src, unsigned src_stride,
311866d22ccce93fa507aca06aaa25217d18b1cdd0fJosé Fonseca                        unsigned width, unsigned height);
312d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
313d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
314d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Pack pixels from S8_USCALED.
315b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
316d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
317d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for stencil formats.
318d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
319d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
320d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_s_8uscaled)(uint8_t *dst, unsigned dst_stride,
321d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                      const uint8_t *src, unsigned src_stride,
322d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                      unsigned width, unsigned height);
323d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
32415422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
32515422b2d99be074e1d6ac064b6f791245975da83José Fonseca
32615422b2d99be074e1d6ac064b6f791245975da83José Fonseca
32715422b2d99be074e1d6ac064b6f791245975da83José Fonsecaextern const struct util_format_description
32815422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description_table[];
32915422b2d99be074e1d6ac064b6f791245975da83José Fonseca
33015422b2d99be074e1d6ac064b6f791245975da83José Fonseca
33115422b2d99be074e1d6ac064b6f791245975da83José Fonsecaconst struct util_format_description *
33215422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description(enum pipe_format format);
33315422b2d99be074e1d6ac064b6f791245975da83José Fonseca
33415422b2d99be074e1d6ac064b6f791245975da83José Fonseca
3353400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/*
3363400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format query functions.
3373400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */
3383400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
3395784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecastatic INLINE const char *
3405784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecautil_format_name(enum pipe_format format)
3415784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca{
3425784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   const struct util_format_description *desc = util_format_description(format);
3435784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
344329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
345329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
3463865e3abd429132be647bb7c9575dbf20e1ab11dJakob Bornecrantz      return "PIPE_FORMAT_???";
3475784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   }
3485784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
3495784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   return desc->name;
3505784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca}
3515784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
3525a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšákstatic INLINE const char *
3535a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšákutil_format_short_name(enum pipe_format format)
3545a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák{
3555a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák   const struct util_format_description *desc = util_format_description(format);
3565a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák
3575a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák   assert(desc);
3585a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák   if (!desc) {
3595a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák      return "???";
3605a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák   }
3615a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák
3625a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák   return desc->short_name;
3635a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák}
3645a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák
365bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák/**
366bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák * Whether this format is plain, see UTIL_FORMAT_LAYOUT_PLAIN for more info.
367bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák */
368bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšákstatic INLINE boolean
369bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšákutil_format_is_plain(enum pipe_format format)
370bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák{
371bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák   const struct util_format_description *desc = util_format_description(format);
372bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák
373bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák   if (!format) {
374bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák      return FALSE;
375bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák   }
376bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák
377bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák   return desc->layout == UTIL_FORMAT_LAYOUT_PLAIN ? TRUE : FALSE;
378bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák}
379bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák
3803400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolstatic INLINE boolean
3810f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paulutil_format_is_compressed(enum pipe_format format)
3820f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul{
3830f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   const struct util_format_description *desc = util_format_description(format);
3840f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul
3850f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   assert(desc);
3860f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   if (!desc) {
3870f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul      return FALSE;
3880f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   }
3890f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul
3900f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   switch (desc->layout) {
3910f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   case UTIL_FORMAT_LAYOUT_S3TC:
3920f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   case UTIL_FORMAT_LAYOUT_RGTC:
3930f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul      /* XXX add other formats in the future */
3940f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul      return TRUE;
3950f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   default:
3960f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul      return FALSE;
3970f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   }
3980f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul}
3990f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul
4000f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paulstatic INLINE boolean
401b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonsecautil_format_is_s3tc(enum pipe_format format)
4023400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol{
4033400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol   const struct util_format_description *desc = util_format_description(format);
4043400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
405329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
406329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
4073400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol      return FALSE;
4083400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol   }
4093400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
410b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca   return desc->layout == UTIL_FORMAT_LAYOUT_S3TC ? TRUE : FALSE;
411d28740c298968303500a8c43047ded2679e727acMichal Krol}
412d28740c298968303500a8c43047ded2679e727acMichal Krol
413ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paulstatic INLINE boolean
414ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paulutil_format_is_srgb(enum pipe_format format)
415ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paul{
416ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paul   const struct util_format_description *desc = util_format_description(format);
417ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paul   return desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB;
418ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paul}
419ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paul
420ffb1996f614679553ef1d029306d0194b3161113José Fonsecastatic INLINE boolean
421ffb1996f614679553ef1d029306d0194b3161113José Fonsecautil_format_has_depth(const struct util_format_description *desc)
422ffb1996f614679553ef1d029306d0194b3161113José Fonseca{
423ffb1996f614679553ef1d029306d0194b3161113José Fonseca   return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS &&
424ffb1996f614679553ef1d029306d0194b3161113José Fonseca          desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE;
425ffb1996f614679553ef1d029306d0194b3161113José Fonseca}
426ffb1996f614679553ef1d029306d0194b3161113José Fonseca
427ffb1996f614679553ef1d029306d0194b3161113José Fonsecastatic INLINE boolean
428ffb1996f614679553ef1d029306d0194b3161113José Fonsecautil_format_has_stencil(const struct util_format_description *desc)
429ffb1996f614679553ef1d029306d0194b3161113José Fonseca{
430ffb1996f614679553ef1d029306d0194b3161113José Fonseca   return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS &&
431ffb1996f614679553ef1d029306d0194b3161113José Fonseca          desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE;
432ffb1996f614679553ef1d029306d0194b3161113José Fonseca}
433ffb1996f614679553ef1d029306d0194b3161113José Fonseca
434ffb1996f614679553ef1d029306d0194b3161113José Fonsecastatic INLINE boolean
435d28740c298968303500a8c43047ded2679e727acMichal Krolutil_format_is_depth_or_stencil(enum pipe_format format)
436d28740c298968303500a8c43047ded2679e727acMichal Krol{
437d28740c298968303500a8c43047ded2679e727acMichal Krol   const struct util_format_description *desc = util_format_description(format);
438d28740c298968303500a8c43047ded2679e727acMichal Krol
439329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
440329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
441d28740c298968303500a8c43047ded2679e727acMichal Krol      return FALSE;
442d28740c298968303500a8c43047ded2679e727acMichal Krol   }
443d28740c298968303500a8c43047ded2679e727acMichal Krol
444ffb1996f614679553ef1d029306d0194b3161113José Fonseca   return util_format_has_depth(desc) ||
445ffb1996f614679553ef1d029306d0194b3161113José Fonseca          util_format_has_stencil(desc);
4460bed834be4a174d20b31a6cbcf066774bf749929Michal Krol}
4470bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
448ffb1996f614679553ef1d029306d0194b3161113José Fonsecastatic INLINE boolean
4490bed834be4a174d20b31a6cbcf066774bf749929Michal Krolutil_format_is_depth_and_stencil(enum pipe_format format)
4500bed834be4a174d20b31a6cbcf066774bf749929Michal Krol{
4510bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   const struct util_format_description *desc = util_format_description(format);
4520bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
453329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
454329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
4550bed834be4a174d20b31a6cbcf066774bf749929Michal Krol      return FALSE;
4560bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   }
4570bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
458ffb1996f614679553ef1d029306d0194b3161113José Fonseca   return util_format_has_depth(desc) &&
459ffb1996f614679553ef1d029306d0194b3161113José Fonseca          util_format_has_stencil(desc);
4603400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol}
4613400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
462f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca
463f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca/**
464f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca * Give the RGBA colormask of the channels that can be represented in this
465f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca * format.
466f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca *
467f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca * That is, the channels whose values are preserved.
468f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca */
469f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonsecastatic INLINE unsigned
470f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonsecautil_format_colormask(const struct util_format_description *desc)
471f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca{
472f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   unsigned colormask;
473f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   unsigned chan;
474f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca
475f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   switch (desc->colorspace) {
476f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   case UTIL_FORMAT_COLORSPACE_RGB:
477f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   case UTIL_FORMAT_COLORSPACE_SRGB:
478f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   case UTIL_FORMAT_COLORSPACE_YUV:
479f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      colormask = 0;
480f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      for (chan = 0; chan < 4; ++chan) {
481f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca         if (desc->swizzle[chan] < 4) {
482f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca            colormask |= (1 << chan);
483f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca         }
484f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      }
485f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      return colormask;
486f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   case UTIL_FORMAT_COLORSPACE_ZS:
487f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      return 0;
488f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   default:
489f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      assert(0);
490f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      return 0;
491f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   }
492f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca}
493f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca
494f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca
49575fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšákboolean
49675fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšákutil_format_is_float(enum pipe_format format);
49775fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšák
49875fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšák
499ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulboolean
500ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulutil_format_is_rgb_no_alpha(enum pipe_format format);
501ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
502ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
503ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulboolean
504ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulutil_format_is_luminance(enum pipe_format format);
505ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
506ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
507ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulboolean
508ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulutil_format_is_luminance_alpha(enum pipe_format format);
509ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
510ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
511ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulboolean
512ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulutil_format_is_intensity(enum pipe_format format);
513ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
514ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
5157a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca/**
516b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonseca * Whether the src format can be blitted to destation format with a simple
517b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonseca * memcpy.
518b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonseca */
519b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonsecaboolean
520b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonsecautil_is_format_compatible(const struct util_format_description *src_desc,
521b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonseca                          const struct util_format_description *dst_desc);
522b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonseca
52375fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšák/**
52475fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšák * Whether the format is supported by Gallium for the given bindings.
52575fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšák * This covers S3TC textures and floating-point render targets.
52675fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšák */
52775fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšákboolean
52875fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšákutil_format_is_supported(enum pipe_format format, unsigned bind);
529b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonseca
530b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonseca/**
5317a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * Whether this format is a rgab8 variant.
5327a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca *
5337a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * That is, any format that matches the
5347a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca *
5357a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca *   PIPE_FORMAT_?8?8?8?8_UNORM
5367a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca */
5377a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonsecastatic INLINE boolean
5387a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonsecautil_format_is_rgba8_variant(const struct util_format_description *desc)
5397a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca{
5407a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   unsigned chan;
5417a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
5427a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   if(desc->block.width != 1 ||
5437a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      desc->block.height != 1 ||
5447a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      desc->block.bits != 32)
5457a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      return FALSE;
5467a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
5477a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   for(chan = 0; chan < 4; ++chan) {
5487a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      if(desc->channel[chan].type != UTIL_FORMAT_TYPE_UNSIGNED &&
5497a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca         desc->channel[chan].type != UTIL_FORMAT_TYPE_VOID)
5507a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca         return FALSE;
5517a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      if(desc->channel[chan].size != 8)
5527a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca         return FALSE;
5537a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   }
5547a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
5557a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   return TRUE;
5567a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca}
5577a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
5586df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol
559cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/**
560a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return total bits needed for the pixel format per block.
561cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */
562cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint
563b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksizebits(enum pipe_format format)
564cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{
565cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   const struct util_format_description *desc = util_format_description(format);
566cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
567329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
568329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
569cceeab39ea541b1be1521114316d660a77769c2aMichal Krol      return 0;
570cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   }
571cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
572a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller   return desc->block.bits;
573cceeab39ea541b1be1521114316d660a77769c2aMichal Krol}
574cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
575cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/**
576a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return bytes per block (not pixel) for the given format.
577cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */
578cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint
579b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksize(enum pipe_format format)
580cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{
581b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   uint bits = util_format_get_blocksizebits(format);
582cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
583cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   assert(bits % 8 == 0);
584cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
585cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   return bits / 8;
586cceeab39ea541b1be1521114316d660a77769c2aMichal Krol}
587cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
588f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolstatic INLINE uint
589b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockwidth(enum pipe_format format)
590b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
591b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   const struct util_format_description *desc = util_format_description(format);
592b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
593329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
594329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
595b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol      return 1;
596b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   }
597b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
598816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   return desc->block.width;
599b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
600b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
601b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint
602b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockheight(enum pipe_format format)
603b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
604b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   const struct util_format_description *desc = util_format_description(format);
605b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
606329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
607329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
608b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol      return 1;
609b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   }
610b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
611816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   return desc->block.height;
612b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
613b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
614b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
615b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksx(enum pipe_format format,
616b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                         unsigned x)
617b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
618b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   unsigned blockwidth = util_format_get_blockwidth(format);
619b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return (x + blockwidth - 1) / blockwidth;
620b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
621b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
622b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
623b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksy(enum pipe_format format,
624b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                         unsigned y)
625b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
626b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   unsigned blockheight = util_format_get_blockheight(format);
627b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return (y + blockheight - 1) / blockheight;
628b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
629b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
630b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
631b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocks(enum pipe_format format,
632b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned width,
633b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned height)
634b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
635b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksx(format, width) * util_format_get_nblocksy(format, height);
636b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
637b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
638b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t
639b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_stride(enum pipe_format format,
640b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                       unsigned width)
641b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
642b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksx(format, width) * util_format_get_blocksize(format);
643b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
644b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
645b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t
646b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_2d_size(enum pipe_format format,
647b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        size_t stride,
648b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned height)
649b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
650b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksy(format, height) * stride;
651b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
652b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
653b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint
654f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolutil_format_get_component_bits(enum pipe_format format,
655f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol                               enum util_format_colorspace colorspace,
656f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol                               uint component)
657f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol{
658f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   const struct util_format_description *desc = util_format_description(format);
659f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   enum util_format_colorspace desc_colorspace;
660f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
661f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   assert(format);
662f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (!format) {
663f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
664f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
665f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
666440fc5bf788201a265892ff2e12bf102e63a2896Michal Krol   assert(component < 4);
667f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
668f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   /* Treat RGB and SRGB as equivalent. */
669f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
670f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      colorspace = UTIL_FORMAT_COLORSPACE_RGB;
671f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
672f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
673f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB;
674f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   } else {
675f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      desc_colorspace = desc->colorspace;
676f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
677f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
678f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (desc_colorspace != colorspace) {
679f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
680f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
681f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
682f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   switch (desc->swizzle[component]) {
683f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_X:
684f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[0].size;
685f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_Y:
686f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[1].size;
687f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_Z:
688f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[2].size;
689f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_W:
690f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[3].size;
691f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   default:
692f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
693f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
694f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol}
695f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
696c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolstatic INLINE boolean
697c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolutil_format_has_alpha(enum pipe_format format)
698c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol{
699c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   const struct util_format_description *desc = util_format_description(format);
700c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
701c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   assert(format);
702c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   if (!format) {
703c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
704c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   }
705c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
706816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   switch (desc->colorspace) {
707816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_RGB:
708816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_SRGB:
709816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca      return desc->swizzle[3] != UTIL_FORMAT_SWIZZLE_1;
710816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_YUV:
711816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca      return FALSE;
712816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_ZS:
713c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
714c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   default:
715c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      assert(0);
716c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
717c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   }
718c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol}
719c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
720c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger/**
72111fbdf726da9fbb2864fad68f23ef51634487560Brian Paul * Given a linear RGB colorspace format, return the corresponding SRGB
72211fbdf726da9fbb2864fad68f23ef51634487560Brian Paul * format, or PIPE_FORMAT_NONE if none.
723247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca */
724247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonsecastatic INLINE enum pipe_format
725247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonsecautil_format_srgb(enum pipe_format format)
726247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca{
727247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   switch (format) {
728247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_L8_UNORM:
729247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_L8_SRGB;
730247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_L8A8_UNORM:
731247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_L8A8_SRGB;
732247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_R8G8B8_UNORM:
733247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_R8G8B8_SRGB;
734247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_A8B8G8R8_UNORM:
735247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_A8B8G8R8_SRGB;
736247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_X8B8G8R8_UNORM:
737247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_X8B8G8R8_SRGB;
738247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_B8G8R8A8_UNORM:
739247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_B8G8R8A8_SRGB;
740247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_B8G8R8X8_UNORM:
741247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_B8G8R8X8_SRGB;
742247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_A8R8G8B8_UNORM:
743247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_A8R8G8B8_SRGB;
744247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_X8R8G8B8_UNORM:
745247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_X8R8G8B8_SRGB;
746247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_DXT1_RGB:
747247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_DXT1_SRGB;
748247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_DXT1_RGBA:
749247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_DXT1_SRGBA;
750247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_DXT3_RGBA:
751247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_DXT3_SRGBA;
752247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_DXT5_RGBA:
753247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_DXT5_SRGBA;
754247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   default:
755247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_NONE;
756247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   }
757247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca}
758247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca
759247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca/**
76011fbdf726da9fbb2864fad68f23ef51634487560Brian Paul * Given an sRGB format, return the corresponding linear colorspace format.
76111fbdf726da9fbb2864fad68f23ef51634487560Brian Paul * For non sRGB formats, return the format unchanged.
76211fbdf726da9fbb2864fad68f23ef51634487560Brian Paul */
76311fbdf726da9fbb2864fad68f23ef51634487560Brian Paulstatic INLINE enum pipe_format
76411fbdf726da9fbb2864fad68f23ef51634487560Brian Paulutil_format_linear(enum pipe_format format)
76511fbdf726da9fbb2864fad68f23ef51634487560Brian Paul{
76611fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   switch (format) {
76711fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_L8_SRGB:
76811fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_L8_UNORM;
76911fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_L8A8_SRGB:
77011fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_L8A8_UNORM;
77111fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_R8G8B8_SRGB:
77211fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_R8G8B8_UNORM;
77311fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_A8B8G8R8_SRGB:
77411fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_A8B8G8R8_UNORM;
77511fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_X8B8G8R8_SRGB:
77611fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_X8B8G8R8_UNORM;
77711fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_B8G8R8A8_SRGB:
77811fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_B8G8R8A8_UNORM;
77911fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_B8G8R8X8_SRGB:
78011fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_B8G8R8X8_UNORM;
78111fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_A8R8G8B8_SRGB:
78211fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_A8R8G8B8_UNORM;
78311fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_X8R8G8B8_SRGB:
78411fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_X8R8G8B8_UNORM;
78511fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_DXT1_SRGB:
78611fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_DXT1_RGB;
78711fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_DXT1_SRGBA:
78811fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_DXT1_RGBA;
78911fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_DXT3_SRGBA:
79011fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_DXT3_RGBA;
79111fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_DXT5_SRGBA:
79211fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_DXT5_RGBA;
79311fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   default:
79411fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return format;
79511fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   }
79611fbdf726da9fbb2864fad68f23ef51634487560Brian Paul}
79711fbdf726da9fbb2864fad68f23ef51634487560Brian Paul
79811fbdf726da9fbb2864fad68f23ef51634487560Brian Paul/**
799c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger * Return the number of components stored.
800c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger * Formats with block size != 1x1 will always have 1 component (the block).
801c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger */
802c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheideggerstatic INLINE unsigned
803c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheideggerutil_format_get_nr_components(enum pipe_format format)
804c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger{
805c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger   const struct util_format_description *desc = util_format_description(format);
806e0f10a6fca34619f61c3533b68d89dcb1ff2627cRoland Scheidegger   return desc->nr_channels;
807c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger}
8083400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
8093400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/*
8103400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format access functions.
8113400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */
8123400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
8133d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
8143d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4f(enum pipe_format format,
8153d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    float *dst, unsigned dst_stride,
8163d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    const void *src, unsigned src_stride,
8173d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    unsigned x, unsigned y, unsigned w, unsigned h);
8183d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
8193d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
8203d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4f(enum pipe_format format,
8213d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     const float *src, unsigned src_stride,
8223d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     void *dst, unsigned dst_stride,
8233d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     unsigned x, unsigned y, unsigned w, unsigned h);
8243d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
8253d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
8263d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4ub(enum pipe_format format,
8273d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     uint8_t *dst, unsigned dst_stride,
8283d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     const void *src, unsigned src_stride,
8293d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     unsigned x, unsigned y, unsigned w, unsigned h);
8303d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
8313d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
8323d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4ub(enum pipe_format format,
8333d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      const uint8_t *src, unsigned src_stride,
8343d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      void *dst, unsigned dst_stride,
8353d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      unsigned x, unsigned y, unsigned w, unsigned h);
8363d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
83789ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca/*
83889ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca * Generic format conversion;
83989ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca */
84089ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca
8419b69545c42ce2722c21419f04794914abc455889José Fonsecaboolean
8429b69545c42ce2722c21419f04794914abc455889José Fonsecautil_format_fits_8unorm(const struct util_format_description *format_desc);
8439b69545c42ce2722c21419f04794914abc455889José Fonseca
84489ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonsecavoid
84589ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonsecautil_format_translate(enum pipe_format dst_format,
84689ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      void *dst, unsigned dst_stride,
84789ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      unsigned dst_x, unsigned dst_y,
84889ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      enum pipe_format src_format,
84989ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      const void *src, unsigned src_stride,
85089ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      unsigned src_x, unsigned src_y,
85189ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      unsigned width, unsigned height);
85289ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca
853be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák/*
854be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák * Swizzle operations.
855be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák */
856be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák
857be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák/* Compose two sets of swizzles.
858be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák * If V is a 4D vector and the function parameters represent functions that
859be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák * swizzle vector components, this holds:
860be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák *     swz2(swz1(V)) = dst(V)
861be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák */
862be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšákvoid util_format_compose_swizzles(const unsigned char swz1[4],
863be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák                                  const unsigned char swz2[4],
864be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák                                  unsigned char dst[4]);
865be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák
866be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšákvoid util_format_swizzle_4f(float *dst, const float *src,
867be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák                            const unsigned char swz[4]);
868be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák
869be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšákvoid util_format_unswizzle_4f(float *dst, const float *src,
870be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák                              const unsigned char swz[4]);
871be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák
872c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus
873c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} // extern "C" {
874c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif
875c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
87615422b2d99be074e1d6ac064b6f791245975da83José Fonseca#endif /* ! U_FORMAT_H */
877