u_format.h revision d3808b1b1f34dbb826b99102786d94e1baf9d667
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.
195d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
196d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
19796bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca    */
19896bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
199d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_rgba_8unorm)(uint8_t *dst, unsigned dst_stride,
200d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                         const uint8_t *src, unsigned src_stride,
201d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                         unsigned width, unsigned height);
20296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
20369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
204018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Pack pixel blocks from R8G8B8A8_UNORM.
205d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
206d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
20769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
20896bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
209d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_rgba_8unorm)(uint8_t *dst, unsigned dst_stride,
210d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       const uint8_t *src, unsigned src_stride,
211d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       unsigned width, unsigned height);
21296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
21369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
214018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Unpack pixel blocks to R32G32B32A32_FLOAT.
215d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
216d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
21769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
21896bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
219d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_rgba_float)(float *dst, unsigned dst_stride,
220d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                        const uint8_t *src, unsigned src_stride,
221d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                        unsigned width, unsigned height);
22296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
22369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
224018aae950df449a18d7d69de54d51af587be94c6José Fonseca    * Pack pixel blocks from R32G32B32A32_FLOAT.
225d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
226d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
22769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
22896bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca   void
229d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_rgba_float)(uint8_t *dst, unsigned dst_stride,
230d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                      const float *src, unsigned src_stride,
231d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                      unsigned width, unsigned height);
23296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca
23369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   /**
23469895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    * Fetch a single pixel (i, j) from a block.
235d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
236d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for non-depth-stencil formats.
237d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
238d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
239d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*fetch_rgba_float)(float *dst,
240d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       const uint8_t *src,
241d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       unsigned i, unsigned j);
242d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
243d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
244d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Unpack pixels to Z32_UNORM.
245d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
246d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for depth formats.
247d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
248d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
249d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_z_32unorm)(uint32_t *dst, unsigned dst_stride,
250d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       const uint8_t *src, unsigned src_stride,
251d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       unsigned width, unsigned height);
252d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
253d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
254d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Pack pixels from Z32_FLOAT.
255d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
256d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for depth formats.
257d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
258d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
259d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_z_32unorm)(uint8_t *dst, unsigned dst_stride,
260d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                     const uint32_t *src, unsigned src_stride,
261d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                     unsigned width, unsigned height);
262d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
263d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
264d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Unpack pixels to Z32_FLOAT.
265d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
266d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for depth formats.
267d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
268d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
269d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_z_float)(float *dst, unsigned dst_stride,
270d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                     const uint8_t *src, unsigned src_stride,
271d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                     unsigned width, unsigned height);
272d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
273d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
274d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Pack pixels from Z32_FLOAT.
275d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
276d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for depth formats.
27769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca    */
27869895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca   void
279d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_z_float)(uint8_t *dst, unsigned dst_stride,
280d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                   const float *src, unsigned src_stride,
281d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                   unsigned width, unsigned height);
282d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
283d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
284d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Unpack pixels to S8_USCALED.
285d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
286d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for stencil formats.
287d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
288d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
289d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*unpack_s_32unorm)(uint8_t *dst, unsigned dst_stride,
290d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       const uint8_t *src, unsigned src_stride,
291d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                       unsigned width, unsigned height);
292d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
293d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   /**
294d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Pack pixels from S8_USCALED.
295d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    *
296d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    * Only defined for stencil formats.
297d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca    */
298d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   void
299d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca   (*pack_s_8uscaled)(uint8_t *dst, unsigned dst_stride,
300d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                      const uint8_t *src, unsigned src_stride,
301d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca                      unsigned width, unsigned height);
302d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca
30315422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
30415422b2d99be074e1d6ac064b6f791245975da83José Fonseca
30515422b2d99be074e1d6ac064b6f791245975da83José Fonseca
30615422b2d99be074e1d6ac064b6f791245975da83José Fonsecaextern const struct util_format_description
30715422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description_table[];
30815422b2d99be074e1d6ac064b6f791245975da83José Fonseca
30915422b2d99be074e1d6ac064b6f791245975da83José Fonseca
31015422b2d99be074e1d6ac064b6f791245975da83José Fonsecaconst struct util_format_description *
31115422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description(enum pipe_format format);
31215422b2d99be074e1d6ac064b6f791245975da83José Fonseca
31315422b2d99be074e1d6ac064b6f791245975da83José Fonseca
3143400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/*
3153400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format query functions.
3163400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */
3173400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
3185784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecastatic INLINE const char *
3195784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecautil_format_name(enum pipe_format format)
3205784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca{
3215784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   const struct util_format_description *desc = util_format_description(format);
3225784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
323329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
324329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
3255784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca      return "???";
3265784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   }
3275784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
3285784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   return desc->name;
3295784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca}
3305784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
3313400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolstatic INLINE boolean
332b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonsecautil_format_is_s3tc(enum pipe_format format)
3333400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol{
3343400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol   const struct util_format_description *desc = util_format_description(format);
3353400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
336329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
337329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
3383400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol      return FALSE;
3393400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol   }
3403400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
341b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca   return desc->layout == UTIL_FORMAT_LAYOUT_S3TC ? TRUE : FALSE;
342d28740c298968303500a8c43047ded2679e727acMichal Krol}
343d28740c298968303500a8c43047ded2679e727acMichal Krol
344d28740c298968303500a8c43047ded2679e727acMichal Krolstatic INLINE boolean
345d28740c298968303500a8c43047ded2679e727acMichal Krolutil_format_is_depth_or_stencil(enum pipe_format format)
346d28740c298968303500a8c43047ded2679e727acMichal Krol{
347d28740c298968303500a8c43047ded2679e727acMichal Krol   const struct util_format_description *desc = util_format_description(format);
348d28740c298968303500a8c43047ded2679e727acMichal Krol
349329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
350329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
351d28740c298968303500a8c43047ded2679e727acMichal Krol      return FALSE;
352d28740c298968303500a8c43047ded2679e727acMichal Krol   }
353d28740c298968303500a8c43047ded2679e727acMichal Krol
354d28740c298968303500a8c43047ded2679e727acMichal Krol   return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS ? TRUE : FALSE;
3550bed834be4a174d20b31a6cbcf066774bf749929Michal Krol}
3560bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
3570bed834be4a174d20b31a6cbcf066774bf749929Michal Krolstatic INLINE boolean
3580bed834be4a174d20b31a6cbcf066774bf749929Michal Krolutil_format_is_depth_and_stencil(enum pipe_format format)
3590bed834be4a174d20b31a6cbcf066774bf749929Michal Krol{
3600bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   const struct util_format_description *desc = util_format_description(format);
3610bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
362329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
363329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
3640bed834be4a174d20b31a6cbcf066774bf749929Michal Krol      return FALSE;
3650bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   }
3660bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
3670bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) {
3680bed834be4a174d20b31a6cbcf066774bf749929Michal Krol      return FALSE;
3690bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   }
3700bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
3710bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   return (desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE &&
3720bed834be4a174d20b31a6cbcf066774bf749929Michal Krol           desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE) ? TRUE : FALSE;
3733400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol}
3743400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
3757a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca/**
3767a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * Whether this format is a rgab8 variant.
3777a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca *
3787a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * That is, any format that matches the
3797a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca *
3807a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca *   PIPE_FORMAT_?8?8?8?8_UNORM
3817a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca */
3827a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonsecastatic INLINE boolean
3837a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonsecautil_format_is_rgba8_variant(const struct util_format_description *desc)
3847a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca{
3857a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   unsigned chan;
3867a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
3877a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   if(desc->block.width != 1 ||
3887a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      desc->block.height != 1 ||
3897a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      desc->block.bits != 32)
3907a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      return FALSE;
3917a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
3927a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   for(chan = 0; chan < 4; ++chan) {
3937a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      if(desc->channel[chan].type != UTIL_FORMAT_TYPE_UNSIGNED &&
3947a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca         desc->channel[chan].type != UTIL_FORMAT_TYPE_VOID)
3957a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca         return FALSE;
3967a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca      if(desc->channel[chan].size != 8)
3977a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca         return FALSE;
3987a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   }
3997a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
4007a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca   return TRUE;
4017a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca}
4027a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca
4036df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol
404cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/**
405a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return total bits needed for the pixel format per block.
406cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */
407cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint
408b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksizebits(enum pipe_format format)
409cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{
410cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   const struct util_format_description *desc = util_format_description(format);
411cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
412329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
413329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
414cceeab39ea541b1be1521114316d660a77769c2aMichal Krol      return 0;
415cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   }
416cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
417a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller   return desc->block.bits;
418cceeab39ea541b1be1521114316d660a77769c2aMichal Krol}
419cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
420cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/**
421a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return bytes per block (not pixel) for the given format.
422cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */
423cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint
424b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksize(enum pipe_format format)
425cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{
426b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   uint bits = util_format_get_blocksizebits(format);
427cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
428cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   assert(bits % 8 == 0);
429cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
430cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   return bits / 8;
431cceeab39ea541b1be1521114316d660a77769c2aMichal Krol}
432cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
433f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolstatic INLINE uint
434b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockwidth(enum pipe_format format)
435b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
436b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   const struct util_format_description *desc = util_format_description(format);
437b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
438329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
439329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
440b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol      return 1;
441b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   }
442b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
443816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   return desc->block.width;
444b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
445b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
446b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint
447b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockheight(enum pipe_format format)
448b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
449b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   const struct util_format_description *desc = util_format_description(format);
450b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
451329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   assert(desc);
452329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca   if (!desc) {
453b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol      return 1;
454b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   }
455b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
456816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   return desc->block.height;
457b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
458b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
459b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
460b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksx(enum pipe_format format,
461b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                         unsigned x)
462b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
463b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   unsigned blockwidth = util_format_get_blockwidth(format);
464b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return (x + blockwidth - 1) / blockwidth;
465b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
466b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
467b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
468b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksy(enum pipe_format format,
469b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                         unsigned y)
470b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
471b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   unsigned blockheight = util_format_get_blockheight(format);
472b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return (y + blockheight - 1) / blockheight;
473b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
474b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
475b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
476b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocks(enum pipe_format format,
477b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned width,
478b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned height)
479b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
480b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksx(format, width) * util_format_get_nblocksy(format, height);
481b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
482b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
483b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t
484b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_stride(enum pipe_format format,
485b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                       unsigned width)
486b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
487b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksx(format, width) * util_format_get_blocksize(format);
488b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
489b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
490b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t
491b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_2d_size(enum pipe_format format,
492b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        size_t stride,
493b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned height)
494b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
495b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksy(format, height) * stride;
496b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
497b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
498b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint
499f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolutil_format_get_component_bits(enum pipe_format format,
500f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol                               enum util_format_colorspace colorspace,
501f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol                               uint component)
502f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol{
503f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   const struct util_format_description *desc = util_format_description(format);
504f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   enum util_format_colorspace desc_colorspace;
505f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
506f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   assert(format);
507f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (!format) {
508f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
509f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
510f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
511440fc5bf788201a265892ff2e12bf102e63a2896Michal Krol   assert(component < 4);
512f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
513f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   /* Treat RGB and SRGB as equivalent. */
514f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
515f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      colorspace = UTIL_FORMAT_COLORSPACE_RGB;
516f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
517f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
518f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB;
519f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   } else {
520f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      desc_colorspace = desc->colorspace;
521f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
522f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
523f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (desc_colorspace != colorspace) {
524f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
525f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
526f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
527f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   switch (desc->swizzle[component]) {
528f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_X:
529f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[0].size;
530f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_Y:
531f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[1].size;
532f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_Z:
533f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[2].size;
534f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_W:
535f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[3].size;
536f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   default:
537f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
538f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
539f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol}
540f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
541c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolstatic INLINE boolean
542c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolutil_format_has_alpha(enum pipe_format format)
543c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol{
544c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   const struct util_format_description *desc = util_format_description(format);
545c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
546c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   assert(format);
547c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   if (!format) {
548c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
549c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   }
550c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
551816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   switch (desc->colorspace) {
552816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_RGB:
553816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_SRGB:
554816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca      return desc->swizzle[3] != UTIL_FORMAT_SWIZZLE_1;
555816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_YUV:
556816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca      return FALSE;
557816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_ZS:
558c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
559c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   default:
560c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      assert(0);
561c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
562c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   }
563c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol}
564c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
565c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger/**
566c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger * Return the number of components stored.
567c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger * Formats with block size != 1x1 will always have 1 component (the block).
568c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger */
569c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheideggerstatic INLINE unsigned
570c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheideggerutil_format_get_nr_components(enum pipe_format format)
571c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger{
572c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger   const struct util_format_description *desc = util_format_description(format);
573e0f10a6fca34619f61c3533b68d89dcb1ff2627cRoland Scheidegger   return desc->nr_channels;
574c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger}
5753400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
5763400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/*
5773400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format access functions.
5783400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */
5793400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
5803d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
5813d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4f(enum pipe_format format,
5823d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    float *dst, unsigned dst_stride,
5833d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    const void *src, unsigned src_stride,
5843d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    unsigned x, unsigned y, unsigned w, unsigned h);
5853d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
5863d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
5873d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4f(enum pipe_format format,
5883d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     const float *src, unsigned src_stride,
5893d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     void *dst, unsigned dst_stride,
5903d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     unsigned x, unsigned y, unsigned w, unsigned h);
5913d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
5923d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
5933d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4ub(enum pipe_format format,
5943d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     uint8_t *dst, unsigned dst_stride,
5953d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     const void *src, unsigned src_stride,
5963d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     unsigned x, unsigned y, unsigned w, unsigned h);
5973d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
5983d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
5993d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4ub(enum pipe_format format,
6003d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      const uint8_t *src, unsigned src_stride,
6013d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      void *dst, unsigned dst_stride,
6023d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      unsigned x, unsigned y, unsigned w, unsigned h);
6033d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
60489ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca/*
60589ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca * Generic format conversion;
60689ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca */
60789ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca
60889ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonsecavoid
60989ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonsecautil_format_translate(enum pipe_format dst_format,
61089ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      void *dst, unsigned dst_stride,
61189ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      unsigned dst_x, unsigned dst_y,
61289ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      enum pipe_format src_format,
61389ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      const void *src, unsigned src_stride,
61489ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      unsigned src_x, unsigned src_y,
61589ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca                      unsigned width, unsigned height);
61689ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca
617c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus
618c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} // extern "C" {
619c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif
620c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
62115422b2d99be074e1d6ac064b6f791245975da83José Fonseca#endif /* ! U_FORMAT_H */
622