u_format.h revision 018aae950df449a18d7d69de54d51af587be94c6
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,
10815422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_NONE = 6
10915422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
11015422b2d99be074e1d6ac064b6f791245975da83José Fonseca
11115422b2d99be074e1d6ac064b6f791245975da83José Fonseca
11215422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_colorspace {
11315422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_COLORSPACE_RGB = 0,
11442b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca   UTIL_FORMAT_COLORSPACE_SRGB = 1,
11542b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca   UTIL_FORMAT_COLORSPACE_YUV = 2,
116e4069d07ddd8c2afa5378e54710e19e7517d43d6Keith Whitwell   UTIL_FORMAT_COLORSPACE_ZS = 3
11715422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
11815422b2d99be074e1d6ac064b6f791245975da83José Fonseca
11915422b2d99be074e1d6ac064b6f791245975da83José Fonseca
12015422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_channel_description
12115422b2d99be074e1d6ac064b6f791245975da83José Fonseca{
12215422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned type:6;
12315422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned normalized:1;
12415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned size:9;
12515422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
12615422b2d99be074e1d6ac064b6f791245975da83José Fonseca
12715422b2d99be074e1d6ac064b6f791245975da83José Fonseca
12815422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_description
12915422b2d99be074e1d6ac064b6f791245975da83José Fonseca{
13015422b2d99be074e1d6ac064b6f791245975da83José Fonseca   enum pipe_format format;
1314afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca
13215422b2d99be074e1d6ac064b6f791245975da83José Fonseca   const char *name;
133816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca
134816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
1354afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca    * Short name, striped of the prefix, lower case.
1364afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca    */
1374afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca   const char *short_name;
1384afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca
1394afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca   /**
140816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Pixel block dimensions.
141816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
14215422b2d99be074e1d6ac064b6f791245975da83José Fonseca   struct util_format_block block;
143816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca
14415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   enum util_format_layout layout;
1455dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
1465dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   /**
1475dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    * The number of channels.
1485dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    */
1495dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   unsigned nr_channels:3;
1505dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
1515dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   /**
152816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Whether all channels have the same number of (whole) bytes.
1535dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    */
1545dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   unsigned is_array:1;
1555dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
1565dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   /**
157cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    * Whether the pixel format can be described as a bitfield structure.
158cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    *
159cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    * In particular:
160cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    * - pixel depth must be 8, 16, or 32 bits;
161cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    * - all channels must be unsigned, signed, or void
162cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    */
163cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca   unsigned is_bitmask:1;
164cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca
165cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca   /**
1665dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    * Whether channels have mixed types (ignoring UTIL_FORMAT_TYPE_VOID).
1675dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    */
1685dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   unsigned is_mixed:1;
1695dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
170816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
171816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Input channel description.
172816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    *
173816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Only valid for UTIL_FORMAT_LAYOUT_PLAIN formats.
174816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
17515422b2d99be074e1d6ac064b6f791245975da83José Fonseca   struct util_format_channel_description channel[4];
1765dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
177816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
178816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Output channel swizzle.
179816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    *
180816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * The order is either:
181816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * - RGBA
182816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * - YUV(A)
183816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * - ZS
184816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * depending on the colorspace.
185816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
18615422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned char swizzle[4];
1875dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
188816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
189816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Colorspace transformation.
190816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
19115422b2d99be074e1d6ac064b6f791245975da83José Fonseca   enum util_format_colorspace colorspace;
19296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
19396bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   /**
194018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Unpack pixel blocks to R8G8B8A8_UNORM.
19596bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca    */
19696bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
197018aae950df449a18d7d69de54d51af587be94c6José Fonseca   (*unpack_8unorm)(uint8_t *dst, unsigned dst_stride,
198018aae950df449a18d7d69de54d51af587be94c6José Fonseca                    const uint8_t *src, unsigned src_stride,
199018aae950df449a18d7d69de54d51af587be94c6José Fonseca                    unsigned width, unsigned height);
20096bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
20169895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
202018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Pack pixel blocks from R8G8B8A8_UNORM.
20369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
20496bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
205018aae950df449a18d7d69de54d51af587be94c6José Fonseca   (*pack_8unorm)(uint8_t *dst, unsigned dst_stride,
206018aae950df449a18d7d69de54d51af587be94c6José Fonseca                  const uint8_t *src, unsigned src_stride,
207018aae950df449a18d7d69de54d51af587be94c6José Fonseca                  unsigned width, unsigned height);
20896bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
20969895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
210018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Unpack pixel blocks to R32G32B32A32_FLOAT.
21169895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
21296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
213018aae950df449a18d7d69de54d51af587be94c6José Fonseca   (*unpack_float)(float *dst, unsigned dst_stride,
214018aae950df449a18d7d69de54d51af587be94c6José Fonseca                   const uint8_t *src, unsigned src_stride,
215018aae950df449a18d7d69de54d51af587be94c6José Fonseca                   unsigned width, unsigned height);
21696bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
21769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
218018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Pack pixel blocks from R32G32B32A32_FLOAT.
21969895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
22096bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
221018aae950df449a18d7d69de54d51af587be94c6José Fonseca   (*pack_float)(uint8_t *dst, unsigned dst_stride,
222018aae950df449a18d7d69de54d51af587be94c6José Fonseca                 const float *src, unsigned src_stride,
223018aae950df449a18d7d69de54d51af587be94c6José Fonseca                 unsigned width, unsigned height);
22496bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
22569895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
22669895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    * Fetch a single pixel (i, j) from a block.
22769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
22869895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   void
229018aae950df449a18d7d69de54d51af587be94c6José Fonseca   (*fetch_float)(float *dst,
230018aae950df449a18d7d69de54d51af587be94c6José Fonseca                  const uint8_t *src,
231018aae950df449a18d7d69de54d51af587be94c6José Fonseca                  unsigned i, unsigned j);
23215422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
23315422b2d99be074e1d6ac064b6f791245975da83José Fonseca
23415422b2d99be074e1d6ac064b6f791245975da83José Fonseca
23515422b2d99be074e1d6ac064b6f791245975da83José Fonsecaextern const struct util_format_description
23615422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description_table[];
23715422b2d99be074e1d6ac064b6f791245975da83José Fonseca
23815422b2d99be074e1d6ac064b6f791245975da83José Fonseca
23915422b2d99be074e1d6ac064b6f791245975da83José Fonsecaconst struct util_format_description *
24015422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description(enum pipe_format format);
24115422b2d99be074e1d6ac064b6f791245975da83José Fonseca
24215422b2d99be074e1d6ac064b6f791245975da83José Fonseca
2433400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/*
2443400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format query functions.
2453400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */
2463400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
2475784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecastatic INLINE const char *
2485784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecautil_format_name(enum pipe_format format)
2495784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca{
2505784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   const struct util_format_description *desc = util_format_description(format);
2515784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
252329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
253329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
2545784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca      return "???";
2555784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   }
2565784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
2575784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   return desc->name;
2585784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca}
2595784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
2603400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolstatic INLINE boolean
261b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonsecautil_format_is_s3tc(enum pipe_format format)
2623400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol{
2633400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol   const struct util_format_description *desc = util_format_description(format);
2643400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
265329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
266329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
2673400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol      return FALSE;
2683400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol   }
2693400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
270b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca   return desc->layout == UTIL_FORMAT_LAYOUT_S3TC ? TRUE : FALSE;
271d28740c298968303500a8c43047ded2679e727acMichal Krol}
272d28740c298968303500a8c43047ded2679e727acMichal Krol
273d28740c298968303500a8c43047ded2679e727acMichal Krolstatic INLINE boolean
274d28740c298968303500a8c43047ded2679e727acMichal Krolutil_format_is_depth_or_stencil(enum pipe_format format)
275d28740c298968303500a8c43047ded2679e727acMichal Krol{
276d28740c298968303500a8c43047ded2679e727acMichal Krol   const struct util_format_description *desc = util_format_description(format);
277d28740c298968303500a8c43047ded2679e727acMichal Krol
278329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
279329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
280d28740c298968303500a8c43047ded2679e727acMichal Krol      return FALSE;
281d28740c298968303500a8c43047ded2679e727acMichal Krol   }
282d28740c298968303500a8c43047ded2679e727acMichal Krol
283d28740c298968303500a8c43047ded2679e727acMichal Krol   return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS ? TRUE : FALSE;
2840bed834be4a174d20b31a6cbcf066774bf749929Michal Krol}
2850bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
2860bed834be4a174d20b31a6cbcf066774bf749929Michal Krolstatic INLINE boolean
2870bed834be4a174d20b31a6cbcf066774bf749929Michal Krolutil_format_is_depth_and_stencil(enum pipe_format format)
2880bed834be4a174d20b31a6cbcf066774bf749929Michal Krol{
2890bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   const struct util_format_description *desc = util_format_description(format);
2900bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
291329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
292329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
2930bed834be4a174d20b31a6cbcf066774bf749929Michal Krol      return FALSE;
2940bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   }
2950bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
2960bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) {
2970bed834be4a174d20b31a6cbcf066774bf749929Michal Krol      return FALSE;
2980bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   }
2990bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
3000bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   return (desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE &&
3010bed834be4a174d20b31a6cbcf066774bf749929Michal Krol           desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE) ? TRUE : FALSE;
3023400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol}
3033400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
3047a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca/**
3057a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * Whether this format is a rgab8 variant.
3067a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca *
3077a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * That is, any format that matches the
3087a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca *
3097a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca *   PIPE_FORMAT_?8?8?8?8_UNORM
3107a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca */
3117a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonsecastatic INLINE boolean
3127a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonsecautil_format_is_rgba8_variant(const struct util_format_description *desc)
3137a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca{
3147a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   unsigned chan;
3157a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
3167a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   if(desc->block.width != 1 ||
3177a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      desc->block.height != 1 ||
3187a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      desc->block.bits != 32)
3197a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      return FALSE;
3207a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
3217a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   for(chan = 0; chan < 4; ++chan) {
3227a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      if(desc->channel[chan].type != UTIL_FORMAT_TYPE_UNSIGNED &&
3237a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca         desc->channel[chan].type != UTIL_FORMAT_TYPE_VOID)
3247a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca         return FALSE;
3257a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      if(desc->channel[chan].size != 8)
3267a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca         return FALSE;
3277a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   }
3287a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
3297a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   return TRUE;
3307a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca}
3317a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
3326df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol
333cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/**
334a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return total bits needed for the pixel format per block.
335cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */
336cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint
337b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksizebits(enum pipe_format format)
338cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{
339cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   const struct util_format_description *desc = util_format_description(format);
340cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
341329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
342329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
343cceeab39ea541b1be1521114316d660a77769c2aMichal Krol      return 0;
344cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   }
345cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
346a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller   return desc->block.bits;
347cceeab39ea541b1be1521114316d660a77769c2aMichal Krol}
348cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
349cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/**
350a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return bytes per block (not pixel) for the given format.
351cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */
352cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint
353b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksize(enum pipe_format format)
354cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{
355b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   uint bits = util_format_get_blocksizebits(format);
356cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
357cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   assert(bits % 8 == 0);
358cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
359cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   return bits / 8;
360cceeab39ea541b1be1521114316d660a77769c2aMichal Krol}
361cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
362f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolstatic INLINE uint
363b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockwidth(enum pipe_format format)
364b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
365b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   const struct util_format_description *desc = util_format_description(format);
366b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
367329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
368329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
369b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol      return 1;
370b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   }
371b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
372816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   return desc->block.width;
373b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
374b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
375b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint
376b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockheight(enum pipe_format format)
377b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
378b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   const struct util_format_description *desc = util_format_description(format);
379b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
380329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
381329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
382b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol      return 1;
383b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   }
384b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
385816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   return desc->block.height;
386b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
387b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
388b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
389b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksx(enum pipe_format format,
390b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                         unsigned x)
391b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
392b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   unsigned blockwidth = util_format_get_blockwidth(format);
393b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return (x + blockwidth - 1) / blockwidth;
394b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
395b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
396b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
397b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksy(enum pipe_format format,
398b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                         unsigned y)
399b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
400b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   unsigned blockheight = util_format_get_blockheight(format);
401b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return (y + blockheight - 1) / blockheight;
402b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
403b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
404b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
405b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocks(enum pipe_format format,
406b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned width,
407b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned height)
408b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
409b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksx(format, width) * util_format_get_nblocksy(format, height);
410b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
411b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
412b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t
413b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_stride(enum pipe_format format,
414b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                       unsigned width)
415b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
416b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksx(format, width) * util_format_get_blocksize(format);
417b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
418b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
419b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t
420b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_2d_size(enum pipe_format format,
421b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        size_t stride,
422b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned height)
423b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
424b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksy(format, height) * stride;
425b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
426b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
427b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint
428f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolutil_format_get_component_bits(enum pipe_format format,
429f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol                               enum util_format_colorspace colorspace,
430f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol                               uint component)
431f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol{
432f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   const struct util_format_description *desc = util_format_description(format);
433f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   enum util_format_colorspace desc_colorspace;
434f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
435f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   assert(format);
436f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (!format) {
437f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
438f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
439f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
440440fc5bf788201a265892ff2e12bf102e63a2896Michal Krol   assert(component < 4);
441f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
442f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   /* Treat RGB and SRGB as equivalent. */
443f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
444f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      colorspace = UTIL_FORMAT_COLORSPACE_RGB;
445f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
446f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
447f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB;
448f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   } else {
449f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      desc_colorspace = desc->colorspace;
450f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
451f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
452f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (desc_colorspace != colorspace) {
453f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
454f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
455f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
456f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   switch (desc->swizzle[component]) {
457f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_X:
458f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[0].size;
459f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_Y:
460f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[1].size;
461f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_Z:
462f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[2].size;
463f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_W:
464f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[3].size;
465f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   default:
466f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
467f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
468f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol}
469f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
470c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolstatic INLINE boolean
471c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolutil_format_has_alpha(enum pipe_format format)
472c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol{
473c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   const struct util_format_description *desc = util_format_description(format);
474c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
475c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   assert(format);
476c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   if (!format) {
477c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
478c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   }
479c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
480816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   switch (desc->colorspace) {
481816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_RGB:
482816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_SRGB:
483816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca      return desc->swizzle[3] != UTIL_FORMAT_SWIZZLE_1;
484816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_YUV:
485816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca      return FALSE;
486816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_ZS:
487c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
488c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   default:
489c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      assert(0);
490c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
491c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   }
492c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol}
493c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
494c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger/**
495c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger * Return the number of components stored.
496c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger * Formats with block size != 1x1 will always have 1 component (the block).
497c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger */
498c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheideggerstatic INLINE unsigned
499c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheideggerutil_format_get_nr_components(enum pipe_format format)
500c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger{
501c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger   const struct util_format_description *desc = util_format_description(format);
502e0f10a6fca34619f61c3533b68d89dcb1ff2627cRoland Scheidegger   return desc->nr_channels;
503c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger}
5043400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
5053400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/*
5063400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format access functions.
5073400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */
5083400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
5093d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
5103d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4f(enum pipe_format format,
5113d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    float *dst, unsigned dst_stride,
5123d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    const void *src, unsigned src_stride,
5133d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    unsigned x, unsigned y, unsigned w, unsigned h);
5143d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
5153d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
5163d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4f(enum pipe_format format,
5173d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     const float *src, unsigned src_stride,
5183d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     void *dst, unsigned dst_stride,
5193d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     unsigned x, unsigned y, unsigned w, unsigned h);
5203d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
5213d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
5223d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4ub(enum pipe_format format,
5233d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     uint8_t *dst, unsigned dst_stride,
5243d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     const void *src, unsigned src_stride,
5253d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     unsigned x, unsigned y, unsigned w, unsigned h);
5263d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
5273d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
5283d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4ub(enum pipe_format format,
5293d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      const uint8_t *src, unsigned src_stride,
5303d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      void *dst, unsigned dst_stride,
5313d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      unsigned x, unsigned y, unsigned w, unsigned h);
5323d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
533c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus
534c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} // extern "C" {
535c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif
536c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
53715422b2d99be074e1d6ac064b6f791245975da83José Fonseca#endif /* ! U_FORMAT_H */
538