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    *
575c8040aee621735ab845f343c8dcc9fa03a1151fChristian König    * This is for formats like YVYU 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   /**
735c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu    * Ericsson Texture Compression
745c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu    */
755c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   UTIL_FORMAT_LAYOUT_ETC = 6,
765c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu
775c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   /**
78b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca    * Everything else that doesn't fit in any of the above layouts.
7959f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca    */
805c31eb78e5fa4c4cfcc82df3c9a2c34fcd4b402cChia-I Wu   UTIL_FORMAT_LAYOUT_OTHER = 7
8115422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
8215422b2d99be074e1d6ac064b6f791245975da83José Fonseca
8315422b2d99be074e1d6ac064b6f791245975da83José Fonseca
8415422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_block
8515422b2d99be074e1d6ac064b6f791245975da83José Fonseca{
8615422b2d99be074e1d6ac064b6f791245975da83José Fonseca   /** Block width in pixels */
8715422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned width;
8815422b2d99be074e1d6ac064b6f791245975da83José Fonseca
8915422b2d99be074e1d6ac064b6f791245975da83José Fonseca   /** Block height in pixels */
9015422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned height;
9115422b2d99be074e1d6ac064b6f791245975da83José Fonseca
926df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol   /** Block size in bits */
9315422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned bits;
9415422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
9515422b2d99be074e1d6ac064b6f791245975da83José Fonseca
9615422b2d99be074e1d6ac064b6f791245975da83José Fonseca
9715422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_type {
9815422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_VOID = 0,
9915422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_UNSIGNED = 1,
10015422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_SIGNED = 2,
10115422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_FIXED = 3,
10215422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_FLOAT = 4
10315422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
10415422b2d99be074e1d6ac064b6f791245975da83José Fonseca
10515422b2d99be074e1d6ac064b6f791245975da83José Fonseca
10615422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_swizzle {
10715422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_X = 0,
10815422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_Y = 1,
10915422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_Z = 2,
11015422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_W = 3,
11115422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_0 = 4,
11215422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_1 = 5,
113ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul   UTIL_FORMAT_SWIZZLE_NONE = 6,
114ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul   UTIL_FORMAT_SWIZZLE_MAX = 7  /**< Number of enums counter (must be last) */
11515422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
11615422b2d99be074e1d6ac064b6f791245975da83José Fonseca
11715422b2d99be074e1d6ac064b6f791245975da83José Fonseca
11815422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_colorspace {
11915422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_COLORSPACE_RGB = 0,
12042b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca   UTIL_FORMAT_COLORSPACE_SRGB = 1,
12142b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca   UTIL_FORMAT_COLORSPACE_YUV = 2,
122e4069d07ddd8c2afa5378e54710e19e7517d43d6Keith Whitwell   UTIL_FORMAT_COLORSPACE_ZS = 3
12315422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
12415422b2d99be074e1d6ac064b6f791245975da83José Fonseca
12515422b2d99be074e1d6ac064b6f791245975da83José Fonseca
12615422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_channel_description
12715422b2d99be074e1d6ac064b6f791245975da83José Fonseca{
128a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie   unsigned type:5;        /**< UTIL_FORMAT_TYPE_x */
12915422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned normalized:1;
130a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie   unsigned pure_integer:1;
13152b9ec727bfeca0cf13078dc352962b58293b2d4Brian Paul   unsigned size:9;        /**< bits per channel */
13215422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
13315422b2d99be074e1d6ac064b6f791245975da83José Fonseca
13415422b2d99be074e1d6ac064b6f791245975da83José Fonseca
13515422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_description
13615422b2d99be074e1d6ac064b6f791245975da83José Fonseca{
13715422b2d99be074e1d6ac064b6f791245975da83José Fonseca   enum pipe_format format;
1384afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca
13915422b2d99be074e1d6ac064b6f791245975da83José Fonseca   const char *name;
140816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca
141816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
1424afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca    * Short name, striped of the prefix, lower case.
1434afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca    */
1444afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca   const char *short_name;
1454afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca
1464afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca   /**
147816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Pixel block dimensions.
148816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
14915422b2d99be074e1d6ac064b6f791245975da83José Fonseca   struct util_format_block block;
150816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca
15115422b2d99be074e1d6ac064b6f791245975da83José Fonseca   enum util_format_layout layout;
1525dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
1535dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   /**
1545dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    * The number of channels.
1555dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    */
1565dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   unsigned nr_channels:3;
1575dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
1585dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   /**
159816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Whether all channels have the same number of (whole) bytes.
1605dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    */
1615dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   unsigned is_array:1;
1625dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
1635dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   /**
164cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    * Whether the pixel format can be described as a bitfield structure.
165cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    *
166cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    * In particular:
167cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    * - pixel depth must be 8, 16, or 32 bits;
168cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    * - all channels must be unsigned, signed, or void
169cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca    */
170cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca   unsigned is_bitmask:1;
171cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca
172cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca   /**
1735dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    * Whether channels have mixed types (ignoring UTIL_FORMAT_TYPE_VOID).
1745dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    */
1755dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   unsigned is_mixed:1;
1765dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
177816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
178816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Input channel description.
179816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    *
180816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Only valid for UTIL_FORMAT_LAYOUT_PLAIN formats.
181816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
18215422b2d99be074e1d6ac064b6f791245975da83José Fonseca   struct util_format_channel_description channel[4];
1835dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
184816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
185816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Output channel swizzle.
186816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    *
187816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * The order is either:
188816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * - RGBA
189816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * - YUV(A)
190816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * - ZS
191816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * depending on the colorspace.
192816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
19315422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned char swizzle[4];
1945dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
195816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
196816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Colorspace transformation.
197816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
19815422b2d99be074e1d6ac064b6f791245975da83José Fonseca   enum util_format_colorspace colorspace;
19996bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
20096bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   /**
201018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Unpack pixel blocks to R8G8B8A8_UNORM.
202b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
203d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
204d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
20596bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca    */
20696bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
207d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_rgba_8unorm)(uint8_t *dst, unsigned dst_stride,
208d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                         const uint8_t *src, unsigned src_stride,
209d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                         unsigned width, unsigned height);
21096bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
21169895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
212018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Pack pixel blocks from R8G8B8A8_UNORM.
213b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
214d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
215d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
21669895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
21796bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
218d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_rgba_8unorm)(uint8_t *dst, unsigned dst_stride,
219d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       const uint8_t *src, unsigned src_stride,
220d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       unsigned width, unsigned height);
22196bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
22269895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
223a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca    * Fetch a single pixel (i, j) from a block.
224a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca    *
225a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca    * XXX: Only defined for a very few select formats.
226a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca    */
227a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca   void
228a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca   (*fetch_rgba_8unorm)(uint8_t *dst,
229a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca                        const uint8_t *src,
230a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca                        unsigned i, unsigned j);
231a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca
232a2d360b91545ad00abec518e8449df5d8d838b13José Fonseca   /**
233018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Unpack pixel blocks to R32G32B32A32_FLOAT.
234b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
235d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
236d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
23769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
23896bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
239d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_rgba_float)(float *dst, unsigned dst_stride,
240d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                        const uint8_t *src, unsigned src_stride,
241d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                        unsigned width, unsigned height);
24296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
24369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
244018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Pack pixel blocks from R32G32B32A32_FLOAT.
245b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
246d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
247d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
24869895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
24996bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
250d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_rgba_float)(uint8_t *dst, unsigned dst_stride,
251d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                      const float *src, unsigned src_stride,
252d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                      unsigned width, unsigned height);
25396bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
25469895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
25569895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    * Fetch a single pixel (i, j) from a block.
256d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
2571ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák    * Only defined for non-depth-stencil and non-integer formats.
258d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
259d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
260d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*fetch_rgba_float)(float *dst,
261d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       const uint8_t *src,
262d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       unsigned i, unsigned j);
263d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
264d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
265d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Unpack pixels to Z32_UNORM.
266b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
267d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
268d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for depth formats.
269d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
270d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
271d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_z_32unorm)(uint32_t *dst, unsigned dst_stride,
272d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       const uint8_t *src, unsigned src_stride,
273d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       unsigned width, unsigned height);
274d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
275d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
276d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Pack pixels from Z32_FLOAT.
277b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
278d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
279d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for depth formats.
280d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
281d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
282d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_z_32unorm)(uint8_t *dst, unsigned dst_stride,
283d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                     const uint32_t *src, unsigned src_stride,
284d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                     unsigned width, unsigned height);
285d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
286d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
287d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Unpack pixels to Z32_FLOAT.
288b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
289d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
290d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for depth formats.
291d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
292d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
293d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_z_float)(float *dst, unsigned dst_stride,
294d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                     const uint8_t *src, unsigned src_stride,
295d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                     unsigned width, unsigned height);
296d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
297d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
298d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Pack pixels from Z32_FLOAT.
299b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
300d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
301d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for depth formats.
30269895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
30369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   void
304d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_z_float)(uint8_t *dst, unsigned dst_stride,
305d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                   const float *src, unsigned src_stride,
306d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                   unsigned width, unsigned height);
307d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
308d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
309866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie    * Unpack pixels to S8_UINT.
310b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
311d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
312d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for stencil formats.
313d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
314d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
315866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie   (*unpack_s_8uint)(uint8_t *dst, unsigned dst_stride,
316866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie                     const uint8_t *src, unsigned src_stride,
317866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie                     unsigned width, unsigned height);
318d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
319d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
320866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie    * Pack pixels from S8_UINT.
321b806f2a2397bb0b76f804bb0af4e0eb299b15907Brian Paul    * Note: strides are in bytes.
322d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
323d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for stencil formats.
324d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
325d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
326866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie   (*pack_s_8uint)(uint8_t *dst, unsigned dst_stride,
327866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie                   const uint8_t *src, unsigned src_stride,
328866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie                   unsigned width, unsigned height);
329d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
330a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie  /**
331a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie    * Unpack pixel blocks to R32G32B32A32_UINT.
332a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie    * Note: strides are in bytes.
333a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie    *
334a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie    * Only defined for INT formats.
335a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie    */
336a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie   void
337a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie   (*unpack_rgba_uint)(unsigned *dst, unsigned dst_stride,
338a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                       const uint8_t *src, unsigned src_stride,
339a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                       unsigned width, unsigned height);
340a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie
341a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie   void
342a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie   (*pack_rgba_uint)(uint8_t *dst, unsigned dst_stride,
343a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                     const unsigned *src, unsigned src_stride,
344a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                     unsigned width, unsigned height);
345a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie
346a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie  /**
347a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie    * Unpack pixel blocks to R32G32B32A32_SINT.
348a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie    * Note: strides are in bytes.
349a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie    *
350a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie    * Only defined for INT formats.
351a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie    */
352a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie   void
353a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie   (*unpack_rgba_sint)(signed *dst, unsigned dst_stride,
354a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                       const uint8_t *src, unsigned src_stride,
355a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                       unsigned width, unsigned height);
356a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie
357a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie   void
358a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie   (*pack_rgba_sint)(uint8_t *dst, unsigned dst_stride,
359a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                     const int *src, unsigned src_stride,
360a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                     unsigned width, unsigned height);
3611ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák
3621ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák   /**
3631ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák    * Fetch a single pixel (i, j) from a block.
3641ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák    *
3651ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák    * Only defined for unsigned (pure) integer formats.
3661ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák    */
3671ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák   void
3681ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák   (*fetch_rgba_uint)(uint32_t *dst,
3691ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák                      const uint8_t *src,
3701ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák                      unsigned i, unsigned j);
3711ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák
3721ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák   /**
3731ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák    * Fetch a single pixel (i, j) from a block.
3741ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák    *
3751ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák    * Only defined for signed (pure) integer formats.
3761ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák    */
3771ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák   void
3781ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák   (*fetch_rgba_sint)(int32_t *dst,
3791ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák                      const uint8_t *src,
3801ba3240b281fcbbf03372a6e2db68292cb8a8907Marek Olšák                      unsigned i, unsigned j);
38115422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
38215422b2d99be074e1d6ac064b6f791245975da83José Fonseca
38315422b2d99be074e1d6ac064b6f791245975da83José Fonseca
38415422b2d99be074e1d6ac064b6f791245975da83José Fonsecaextern const struct util_format_description
38515422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description_table[];
38615422b2d99be074e1d6ac064b6f791245975da83José Fonseca
38715422b2d99be074e1d6ac064b6f791245975da83José Fonseca
38815422b2d99be074e1d6ac064b6f791245975da83José Fonsecaconst struct util_format_description *
38915422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description(enum pipe_format format);
39015422b2d99be074e1d6ac064b6f791245975da83José Fonseca
39115422b2d99be074e1d6ac064b6f791245975da83José Fonseca
3923400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/*
3933400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format query functions.
3943400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */
3953400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
3965784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecastatic INLINE const char *
3975784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecautil_format_name(enum pipe_format format)
3985784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca{
3995784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   const struct util_format_description *desc = util_format_description(format);
4005784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
401329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
402329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
4033865e3abd429132be647bb7c9575dbf20e1ab11dJakob Bornecrantz      return "PIPE_FORMAT_???";
4045784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   }
4055784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
4065784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   return desc->name;
4075784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca}
4085784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
4095a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšákstatic INLINE const char *
4105a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšákutil_format_short_name(enum pipe_format format)
4115a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák{
4125a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák   const struct util_format_description *desc = util_format_description(format);
4135a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák
4145a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák   assert(desc);
4155a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák   if (!desc) {
4165a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák      return "???";
4175a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák   }
4185a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák
4195a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák   return desc->short_name;
4205a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák}
4215a6b9f3855e7ba179626f7b30467e62fc3ae0ffbMarek Olšák
422bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák/**
423bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák * Whether this format is plain, see UTIL_FORMAT_LAYOUT_PLAIN for more info.
424bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák */
425bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšákstatic INLINE boolean
426bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšákutil_format_is_plain(enum pipe_format format)
427bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák{
428bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák   const struct util_format_description *desc = util_format_description(format);
429bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák
430bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák   if (!format) {
431bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák      return FALSE;
432bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák   }
433bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák
434bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák   return desc->layout == UTIL_FORMAT_LAYOUT_PLAIN ? TRUE : FALSE;
435bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák}
436bc3d9a8b187eb0756f4666a13dbc2dc1c01b0299Marek Olšák
4373400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolstatic INLINE boolean
4380f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paulutil_format_is_compressed(enum pipe_format format)
4390f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul{
4400f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   const struct util_format_description *desc = util_format_description(format);
4410f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul
4420f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   assert(desc);
4430f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   if (!desc) {
4440f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul      return FALSE;
4450f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   }
4460f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul
4470f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   switch (desc->layout) {
4480f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   case UTIL_FORMAT_LAYOUT_S3TC:
4490f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   case UTIL_FORMAT_LAYOUT_RGTC:
4500f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul      /* XXX add other formats in the future */
4510f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul      return TRUE;
4520f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   default:
4530f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul      return FALSE;
4540f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul   }
4550f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul}
4560f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paul
4570f0c0368faf38d73b0bbbb6e0a147bc94564d3a1Brian Paulstatic INLINE boolean
458b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonsecautil_format_is_s3tc(enum pipe_format format)
4593400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol{
4603400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol   const struct util_format_description *desc = util_format_description(format);
4613400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
462329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
463329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
4643400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol      return FALSE;
4653400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol   }
4663400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
467b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca   return desc->layout == UTIL_FORMAT_LAYOUT_S3TC ? TRUE : FALSE;
468d28740c298968303500a8c43047ded2679e727acMichal Krol}
469d28740c298968303500a8c43047ded2679e727acMichal Krol
470ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paulstatic INLINE boolean
471ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paulutil_format_is_srgb(enum pipe_format format)
472ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paul{
473ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paul   const struct util_format_description *desc = util_format_description(format);
474ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paul   return desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB;
475ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paul}
476ff6cf60cb80c3bc31d9a4307c32185f65054bc58Brian Paul
477ffb1996f614679553ef1d029306d0194b3161113José Fonsecastatic INLINE boolean
478ffb1996f614679553ef1d029306d0194b3161113José Fonsecautil_format_has_depth(const struct util_format_description *desc)
479ffb1996f614679553ef1d029306d0194b3161113José Fonseca{
480ffb1996f614679553ef1d029306d0194b3161113José Fonseca   return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS &&
481ffb1996f614679553ef1d029306d0194b3161113José Fonseca          desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE;
482ffb1996f614679553ef1d029306d0194b3161113José Fonseca}
483ffb1996f614679553ef1d029306d0194b3161113José Fonseca
484ffb1996f614679553ef1d029306d0194b3161113José Fonsecastatic INLINE boolean
485ffb1996f614679553ef1d029306d0194b3161113José Fonsecautil_format_has_stencil(const struct util_format_description *desc)
486ffb1996f614679553ef1d029306d0194b3161113José Fonseca{
487ffb1996f614679553ef1d029306d0194b3161113José Fonseca   return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS &&
488ffb1996f614679553ef1d029306d0194b3161113José Fonseca          desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE;
489ffb1996f614679553ef1d029306d0194b3161113José Fonseca}
490ffb1996f614679553ef1d029306d0194b3161113José Fonseca
491ffb1996f614679553ef1d029306d0194b3161113José Fonsecastatic INLINE boolean
492d28740c298968303500a8c43047ded2679e727acMichal Krolutil_format_is_depth_or_stencil(enum pipe_format format)
493d28740c298968303500a8c43047ded2679e727acMichal Krol{
494d28740c298968303500a8c43047ded2679e727acMichal Krol   const struct util_format_description *desc = util_format_description(format);
495d28740c298968303500a8c43047ded2679e727acMichal Krol
496329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
497329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
498d28740c298968303500a8c43047ded2679e727acMichal Krol      return FALSE;
499d28740c298968303500a8c43047ded2679e727acMichal Krol   }
500d28740c298968303500a8c43047ded2679e727acMichal Krol
501ffb1996f614679553ef1d029306d0194b3161113José Fonseca   return util_format_has_depth(desc) ||
502ffb1996f614679553ef1d029306d0194b3161113José Fonseca          util_format_has_stencil(desc);
5030bed834be4a174d20b31a6cbcf066774bf749929Michal Krol}
5040bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
505ffb1996f614679553ef1d029306d0194b3161113José Fonsecastatic INLINE boolean
5060bed834be4a174d20b31a6cbcf066774bf749929Michal Krolutil_format_is_depth_and_stencil(enum pipe_format format)
5070bed834be4a174d20b31a6cbcf066774bf749929Michal Krol{
5080bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   const struct util_format_description *desc = util_format_description(format);
5090bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
510329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
511329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
5120bed834be4a174d20b31a6cbcf066774bf749929Michal Krol      return FALSE;
5130bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   }
5140bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
515ffb1996f614679553ef1d029306d0194b3161113José Fonseca   return util_format_has_depth(desc) &&
516ffb1996f614679553ef1d029306d0194b3161113José Fonseca          util_format_has_stencil(desc);
5173400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol}
5183400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
519f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca
520f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca/**
521f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca * Give the RGBA colormask of the channels that can be represented in this
522f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca * format.
523f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca *
524f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca * That is, the channels whose values are preserved.
525f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca */
526f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonsecastatic INLINE unsigned
527f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonsecautil_format_colormask(const struct util_format_description *desc)
528f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca{
529f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   unsigned colormask;
530f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   unsigned chan;
531f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca
532f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   switch (desc->colorspace) {
533f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   case UTIL_FORMAT_COLORSPACE_RGB:
534f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   case UTIL_FORMAT_COLORSPACE_SRGB:
535f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   case UTIL_FORMAT_COLORSPACE_YUV:
536f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      colormask = 0;
537f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      for (chan = 0; chan < 4; ++chan) {
538f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca         if (desc->swizzle[chan] < 4) {
539f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca            colormask |= (1 << chan);
540f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca         }
541f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      }
542f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      return colormask;
543f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   case UTIL_FORMAT_COLORSPACE_ZS:
544f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      return 0;
545f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   default:
546f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      assert(0);
547f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca      return 0;
548f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca   }
549f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca}
550f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca
551f25b6e546e66955d70a1aa72135a5054c4f0ed3eJosé Fonseca
5520b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton/**
5530b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton * Checks if color mask covers every channel for the specified format
5540b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton *
5550b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton * @param desc       a format description to check colormask with
5560b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton * @param colormask  a bit mask for channels, matches format of PIPE_MASK_RGBA
5570b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton */
5580b0f4628d6fb8276a9f1c336a785a838b602bca8James Bentonstatic INLINE boolean
5590b0f4628d6fb8276a9f1c336a785a838b602bca8James Bentonutil_format_colormask_full(const struct util_format_description *desc, unsigned colormask)
5600b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton{
5610b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton   return (~colormask & util_format_colormask(desc)) == 0;
5620b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton}
5630b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton
5640b0f4628d6fb8276a9f1c336a785a838b602bca8James Benton
56575fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšákboolean
56675fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšákutil_format_is_float(enum pipe_format format);
56775fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšák
56875fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšák
569ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulboolean
570ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulutil_format_is_rgb_no_alpha(enum pipe_format format);
571ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
572ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
573ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulboolean
574ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulutil_format_is_luminance(enum pipe_format format);
575ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
576ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
577ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulboolean
578ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulutil_format_is_luminance_alpha(enum pipe_format format);
579ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
580ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
581ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulboolean
582ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paulutil_format_is_intensity(enum pipe_format format);
583ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
584a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlieboolean
585a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlieutil_format_is_pure_integer(enum pipe_format format);
586a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie
587a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlieboolean
588a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlieutil_format_is_pure_sint(enum pipe_format format);
589a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie
590a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlieboolean
591a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlieutil_format_is_pure_uint(enum pipe_format format);
592ba6f1f2c29c148e33acc9d2b411c19c7c9a9d04fBrian Paul
5937a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca/**
59434075d4133f83e6fec31a62ee4b1b3c565abda56James Benton * Whether the format is a simple array format where all channels
59534075d4133f83e6fec31a62ee4b1b3c565abda56James Benton * are of the same type and can be loaded from memory as a vector
59634075d4133f83e6fec31a62ee4b1b3c565abda56James Benton */
59734075d4133f83e6fec31a62ee4b1b3c565abda56James Bentonboolean
59834075d4133f83e6fec31a62ee4b1b3c565abda56James Bentonutil_format_is_array(const struct util_format_description *desc);
59934075d4133f83e6fec31a62ee4b1b3c565abda56James Benton
60034075d4133f83e6fec31a62ee4b1b3c565abda56James Benton/**
601ce671c7aceca33a2f29dddfaa555a25218524146Brian Paul * Check if the src format can be blitted to the destination format with
602ce671c7aceca33a2f29dddfaa555a25218524146Brian Paul * a simple memcpy.  For example, blitting from RGBA to RGBx is OK, but not
603ce671c7aceca33a2f29dddfaa555a25218524146Brian Paul * the reverse.
604b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonseca */
605b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonsecaboolean
606b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonsecautil_is_format_compatible(const struct util_format_description *src_desc,
607b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonseca                          const struct util_format_description *dst_desc);
608b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonseca
60975fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšák/**
61075fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšák * Whether the format is supported by Gallium for the given bindings.
61175fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšák * This covers S3TC textures and floating-point render targets.
61275fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšák */
61375fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšákboolean
61475fa5c99a86c1ae0f8a4fecc016a5f82da9ae80aMarek Olšákutil_format_is_supported(enum pipe_format format, unsigned bind);
615b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonseca
616b8684b2458bc9bdcfd6b43dc7c2b8c2d485105fdJosé Fonseca/**
6177a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * Whether this format is a rgab8 variant.
6187a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca *
6197a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * That is, any format that matches the
6207a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca *
6217a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca *   PIPE_FORMAT_?8?8?8?8_UNORM
6227a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca */
6237a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonsecastatic INLINE boolean
6247a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonsecautil_format_is_rgba8_variant(const struct util_format_description *desc)
6257a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca{
6267a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   unsigned chan;
6277a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
6287a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   if(desc->block.width != 1 ||
6297a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      desc->block.height != 1 ||
6307a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      desc->block.bits != 32)
6317a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      return FALSE;
6327a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
6337a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   for(chan = 0; chan < 4; ++chan) {
6347a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      if(desc->channel[chan].type != UTIL_FORMAT_TYPE_UNSIGNED &&
6357a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca         desc->channel[chan].type != UTIL_FORMAT_TYPE_VOID)
6367a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca         return FALSE;
6377a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      if(desc->channel[chan].size != 8)
6387a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca         return FALSE;
6397a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   }
6407a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
6417a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   return TRUE;
6427a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca}
6437a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
6446df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol
645cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/**
646a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return total bits needed for the pixel format per block.
647cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */
648cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint
649b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksizebits(enum pipe_format format)
650cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{
651cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   const struct util_format_description *desc = util_format_description(format);
652cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
653329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
654329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
655cceeab39ea541b1be1521114316d660a77769c2aMichal Krol      return 0;
656cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   }
657cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
658a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller   return desc->block.bits;
659cceeab39ea541b1be1521114316d660a77769c2aMichal Krol}
660cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
661cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/**
662a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return bytes per block (not pixel) for the given format.
663cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */
664cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint
665b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksize(enum pipe_format format)
666cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{
667b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   uint bits = util_format_get_blocksizebits(format);
668cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
669cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   assert(bits % 8 == 0);
670cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
671cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   return bits / 8;
672cceeab39ea541b1be1521114316d660a77769c2aMichal Krol}
673cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
674f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolstatic INLINE uint
675b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockwidth(enum pipe_format format)
676b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
677b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   const struct util_format_description *desc = util_format_description(format);
678b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
679329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
680329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
681b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol      return 1;
682b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   }
683b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
684816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   return desc->block.width;
685b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
686b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
687b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint
688b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockheight(enum pipe_format format)
689b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
690b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   const struct util_format_description *desc = util_format_description(format);
691b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
692329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
693329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
694b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol      return 1;
695b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   }
696b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
697816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   return desc->block.height;
698b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
699b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
700b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
701b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksx(enum pipe_format format,
702b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                         unsigned x)
703b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
704b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   unsigned blockwidth = util_format_get_blockwidth(format);
705b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return (x + blockwidth - 1) / blockwidth;
706b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
707b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
708b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
709b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksy(enum pipe_format format,
710b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                         unsigned y)
711b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
712b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   unsigned blockheight = util_format_get_blockheight(format);
713b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return (y + blockheight - 1) / blockheight;
714b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
715b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
716b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
717b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocks(enum pipe_format format,
718b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned width,
719b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned height)
720b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
721b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksx(format, width) * util_format_get_nblocksy(format, height);
722b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
723b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
724b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t
725b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_stride(enum pipe_format format,
726b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                       unsigned width)
727b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
728b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksx(format, width) * util_format_get_blocksize(format);
729b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
730b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
731b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t
732b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_2d_size(enum pipe_format format,
733b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        size_t stride,
734b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned height)
735b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
736b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksy(format, height) * stride;
737b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
738b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
739b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint
740f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolutil_format_get_component_bits(enum pipe_format format,
741f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol                               enum util_format_colorspace colorspace,
742f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol                               uint component)
743f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol{
744f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   const struct util_format_description *desc = util_format_description(format);
745f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   enum util_format_colorspace desc_colorspace;
746f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
747f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   assert(format);
748f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (!format) {
749f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
750f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
751f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
752440fc5bf788201a265892ff2e12bf102e63a2896Michal Krol   assert(component < 4);
753f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
754f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   /* Treat RGB and SRGB as equivalent. */
755f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
756f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      colorspace = UTIL_FORMAT_COLORSPACE_RGB;
757f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
758f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
759f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB;
760f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   } else {
761f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      desc_colorspace = desc->colorspace;
762f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
763f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
764f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (desc_colorspace != colorspace) {
765f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
766f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
767f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
768f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   switch (desc->swizzle[component]) {
769f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_X:
770f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[0].size;
771f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_Y:
772f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[1].size;
773f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_Z:
774f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[2].size;
775f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_W:
776f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[3].size;
777f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   default:
778f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
779f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
780f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol}
781f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
782c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolstatic INLINE boolean
783c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolutil_format_has_alpha(enum pipe_format format)
784c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol{
785c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   const struct util_format_description *desc = util_format_description(format);
786c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
787c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   assert(format);
788c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   if (!format) {
789c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
790c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   }
791c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
792816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   switch (desc->colorspace) {
793816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_RGB:
794816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_SRGB:
795816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca      return desc->swizzle[3] != UTIL_FORMAT_SWIZZLE_1;
796816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_YUV:
797816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca      return FALSE;
798816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_ZS:
799c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
800c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   default:
801c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      assert(0);
802c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
803c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   }
804c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol}
805c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
806c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger/**
80711fbdf726da9fbb2864fad68f23ef51634487560Brian Paul * Given a linear RGB colorspace format, return the corresponding SRGB
80811fbdf726da9fbb2864fad68f23ef51634487560Brian Paul * format, or PIPE_FORMAT_NONE if none.
809247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca */
810247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonsecastatic INLINE enum pipe_format
811247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonsecautil_format_srgb(enum pipe_format format)
812247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca{
813247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   switch (format) {
814247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_L8_UNORM:
815247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_L8_SRGB;
816247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_L8A8_UNORM:
817247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_L8A8_SRGB;
818247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_R8G8B8_UNORM:
819247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_R8G8B8_SRGB;
820247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_A8B8G8R8_UNORM:
821247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_A8B8G8R8_SRGB;
822247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_X8B8G8R8_UNORM:
823247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_X8B8G8R8_SRGB;
824247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_B8G8R8A8_UNORM:
825247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_B8G8R8A8_SRGB;
826247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_B8G8R8X8_UNORM:
827247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_B8G8R8X8_SRGB;
828247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_A8R8G8B8_UNORM:
829247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_A8R8G8B8_SRGB;
830247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_X8R8G8B8_UNORM:
831247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_X8R8G8B8_SRGB;
832247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_DXT1_RGB:
833247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_DXT1_SRGB;
834247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_DXT1_RGBA:
835247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_DXT1_SRGBA;
836247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_DXT3_RGBA:
837247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_DXT3_SRGBA;
838247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   case PIPE_FORMAT_DXT5_RGBA:
839247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_DXT5_SRGBA;
840247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   default:
841247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca      return PIPE_FORMAT_NONE;
842247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca   }
843247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca}
844247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca
845247b253d326819e9c62801d741b3740a27aeaf8aJosé Fonseca/**
84611fbdf726da9fbb2864fad68f23ef51634487560Brian Paul * Given an sRGB format, return the corresponding linear colorspace format.
84711fbdf726da9fbb2864fad68f23ef51634487560Brian Paul * For non sRGB formats, return the format unchanged.
84811fbdf726da9fbb2864fad68f23ef51634487560Brian Paul */
84911fbdf726da9fbb2864fad68f23ef51634487560Brian Paulstatic INLINE enum pipe_format
85011fbdf726da9fbb2864fad68f23ef51634487560Brian Paulutil_format_linear(enum pipe_format format)
85111fbdf726da9fbb2864fad68f23ef51634487560Brian Paul{
85211fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   switch (format) {
85311fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_L8_SRGB:
85411fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_L8_UNORM;
85511fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_L8A8_SRGB:
85611fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_L8A8_UNORM;
85711fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_R8G8B8_SRGB:
85811fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_R8G8B8_UNORM;
85911fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_A8B8G8R8_SRGB:
86011fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_A8B8G8R8_UNORM;
86111fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_X8B8G8R8_SRGB:
86211fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_X8B8G8R8_UNORM;
86311fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_B8G8R8A8_SRGB:
86411fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_B8G8R8A8_UNORM;
86511fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_B8G8R8X8_SRGB:
86611fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_B8G8R8X8_UNORM;
86711fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_A8R8G8B8_SRGB:
86811fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_A8R8G8B8_UNORM;
86911fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_X8R8G8B8_SRGB:
87011fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_X8R8G8B8_UNORM;
87111fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_DXT1_SRGB:
87211fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_DXT1_RGB;
87311fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_DXT1_SRGBA:
87411fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_DXT1_RGBA;
87511fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_DXT3_SRGBA:
87611fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_DXT3_RGBA;
87711fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   case PIPE_FORMAT_DXT5_SRGBA:
87811fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return PIPE_FORMAT_DXT5_RGBA;
87911fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   default:
88011fbdf726da9fbb2864fad68f23ef51634487560Brian Paul      return format;
88111fbdf726da9fbb2864fad68f23ef51634487560Brian Paul   }
88211fbdf726da9fbb2864fad68f23ef51634487560Brian Paul}
88311fbdf726da9fbb2864fad68f23ef51634487560Brian Paul
88411fbdf726da9fbb2864fad68f23ef51634487560Brian Paul/**
88576db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák * Given a depth-stencil format, return the corresponding stencil-only format.
88676db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák * For stencil-only formats, return the format unchanged.
88776db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák */
88876db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšákstatic INLINE enum pipe_format
88976db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšákutil_format_stencil_only(enum pipe_format format)
89076db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák{
89176db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák   switch (format) {
89276db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák   /* mask out the depth component */
89376db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák   case PIPE_FORMAT_Z24_UNORM_S8_UINT:
89476db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák      return PIPE_FORMAT_X24S8_UINT;
89576db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák   case PIPE_FORMAT_S8_UINT_Z24_UNORM:
89676db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák      return PIPE_FORMAT_S8X24_UINT;
89776db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák   case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
89876db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák      return PIPE_FORMAT_X32_S8X24_UINT;
89976db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák
90076db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák   /* stencil only formats */
90176db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák   case PIPE_FORMAT_X24S8_UINT:
90276db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák   case PIPE_FORMAT_S8X24_UINT:
90376db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák   case PIPE_FORMAT_X32_S8X24_UINT:
90476db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák   case PIPE_FORMAT_S8_UINT:
90576db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák      return format;
90676db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák
90776db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák   default:
90876db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák      assert(0);
90976db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák      return PIPE_FORMAT_NONE;
91076db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák   }
91176db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák}
91276db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák
91376db2c121c5436dc37a66d398fcaa9b26478c5ecMarek Olšák/**
914c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger * Return the number of components stored.
915c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger * Formats with block size != 1x1 will always have 1 component (the block).
916c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger */
917c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheideggerstatic INLINE unsigned
918c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheideggerutil_format_get_nr_components(enum pipe_format format)
919c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger{
920c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger   const struct util_format_description *desc = util_format_description(format);
921e0f10a6fca34619f61c3533b68d89dcb1ff2627cRoland Scheidegger   return desc->nr_channels;
922c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger}
9233400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
92461285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie/**
92561285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie * Return the index of the first non-void channel
92661285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie * -1 if no non-void channels
92761285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie */
92861285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airliestatic INLINE int
92961285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlieutil_format_get_first_non_void_channel(enum pipe_format format)
93061285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie{
93161285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie   const struct util_format_description *desc = util_format_description(format);
93261285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie   int i;
93361285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie
93461285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie   for (i = 0; i < 4; i++)
93561285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie      if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID)
93661285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie         break;
93761285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie
93861285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie   if (i == 4)
93961285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie       return -1;
94061285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie
94161285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie   return i;
94261285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie}
94361285c6cfa9ce6086d62fa08bc9e3813f0b30d3dDave Airlie
9443400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/*
9453400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format access functions.
9463400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */
9473400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
9483d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
9493d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4f(enum pipe_format format,
9503d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    float *dst, unsigned dst_stride,
9513d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    const void *src, unsigned src_stride,
9523d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    unsigned x, unsigned y, unsigned w, unsigned h);
9533d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
9543d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
9553d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4f(enum pipe_format format,
9563d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     const float *src, unsigned src_stride,
9573d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     void *dst, unsigned dst_stride,
9583d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     unsigned x, unsigned y, unsigned w, unsigned h);
9593d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
9603d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
9613d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4ub(enum pipe_format format,
9623d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     uint8_t *dst, unsigned dst_stride,
9633d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     const void *src, unsigned src_stride,
9643d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     unsigned x, unsigned y, unsigned w, unsigned h);
9653d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
9663d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
9673d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4ub(enum pipe_format format,
9683d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      const uint8_t *src, unsigned src_stride,
9693d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      void *dst, unsigned dst_stride,
9703d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      unsigned x, unsigned y, unsigned w, unsigned h);
9713d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
972a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlievoid
973a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlieutil_format_read_4ui(enum pipe_format format,
974a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                     unsigned *dst, unsigned dst_stride,
975a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                     const void *src, unsigned src_stride,
976a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                     unsigned x, unsigned y, unsigned w, unsigned h);
977a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie
978a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlievoid
979a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlieutil_format_write_4ui(enum pipe_format format,
980a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                      const unsigned int *src, unsigned src_stride,
981a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                      void *dst, unsigned dst_stride,
982a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                      unsigned x, unsigned y, unsigned w, unsigned h);
983a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie
984a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlievoid
985a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlieutil_format_read_4i(enum pipe_format format,
986a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                    int *dst, unsigned dst_stride,
987a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                    const void *src, unsigned src_stride,
988a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                    unsigned x, unsigned y, unsigned w, unsigned h);
989a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie
990a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlievoid
991a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlieutil_format_write_4i(enum pipe_format format,
992a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                     const int *src, unsigned src_stride,
993a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                     void *dst, unsigned dst_stride,
994a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie                     unsigned x, unsigned y, unsigned w, unsigned h);
995a441feb757b1be4845ba378f0207dcdc5cc1a407Dave Airlie
99689ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca/*
99789ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca * Generic format conversion;
99889ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca */
99989ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca
10009b69545c42ce2722c21419f04794914abc455889José Fonsecaboolean
10019b69545c42ce2722c21419f04794914abc455889José Fonsecautil_format_fits_8unorm(const struct util_format_description *format_desc);
10029b69545c42ce2722c21419f04794914abc455889José Fonseca
100389ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonsecavoid
100489ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonsecautil_format_translate(enum pipe_format dst_format,
100589ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      void *dst, unsigned dst_stride,
100689ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      unsigned dst_x, unsigned dst_y,
100789ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      enum pipe_format src_format,
100889ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      const void *src, unsigned src_stride,
100989ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      unsigned src_x, unsigned src_y,
101089ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      unsigned width, unsigned height);
101189ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca
1012be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák/*
1013be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák * Swizzle operations.
1014be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák */
1015be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák
1016be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák/* Compose two sets of swizzles.
1017be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák * If V is a 4D vector and the function parameters represent functions that
1018be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák * swizzle vector components, this holds:
1019be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák *     swz2(swz1(V)) = dst(V)
1020be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák */
1021be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšákvoid util_format_compose_swizzles(const unsigned char swz1[4],
1022be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák                                  const unsigned char swz2[4],
1023be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák                                  unsigned char dst[4]);
1024be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák
1025be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšákvoid util_format_swizzle_4f(float *dst, const float *src,
1026be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák                            const unsigned char swz[4]);
1027be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák
1028be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšákvoid util_format_unswizzle_4f(float *dst, const float *src,
1029be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák                              const unsigned char swz[4]);
1030be7407b75b12c70e1925c10117937ae2b9e6711fMarek Olšák
1031c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus
1032c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} // extern "C" {
1033c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif
1034c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
103515422b2d99be074e1d6ac064b6f791245975da83José Fonseca#endif /* ! U_FORMAT_H */
1036