u_format.h revision 4afae877e6914e311340e0b1d3490ec2fed9422f
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.
59816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    *
60816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * XXX: This could actually b
6159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca    */
62816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   UTIL_FORMAT_LAYOUT_SUBSAMPLED = 3,
6359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca
6459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca   /**
65816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * An unspecified compression algorithm.
6659f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca    */
67816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   UTIL_FORMAT_LAYOUT_COMPRESSED = 4
6815422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
6915422b2d99be074e1d6ac064b6f791245975da83José Fonseca
7015422b2d99be074e1d6ac064b6f791245975da83José Fonseca
7115422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_block
7215422b2d99be074e1d6ac064b6f791245975da83José Fonseca{
7315422b2d99be074e1d6ac064b6f791245975da83José Fonseca   /** Block width in pixels */
7415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned width;
7515422b2d99be074e1d6ac064b6f791245975da83José Fonseca
7615422b2d99be074e1d6ac064b6f791245975da83José Fonseca   /** Block height in pixels */
7715422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned height;
7815422b2d99be074e1d6ac064b6f791245975da83José Fonseca
796df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol   /** Block size in bits */
8015422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned bits;
8115422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
8215422b2d99be074e1d6ac064b6f791245975da83José Fonseca
8315422b2d99be074e1d6ac064b6f791245975da83José Fonseca
8415422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_type {
8515422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_VOID = 0,
8615422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_UNSIGNED = 1,
8715422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_SIGNED = 2,
8815422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_FIXED = 3,
8915422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_TYPE_FLOAT = 4
9015422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
9115422b2d99be074e1d6ac064b6f791245975da83José Fonseca
9215422b2d99be074e1d6ac064b6f791245975da83José Fonseca
9315422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_swizzle {
9415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_X = 0,
9515422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_Y = 1,
9615422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_Z = 2,
9715422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_W = 3,
9815422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_0 = 4,
9915422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_1 = 5,
10015422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_SWIZZLE_NONE = 6
10115422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
10215422b2d99be074e1d6ac064b6f791245975da83José Fonseca
10315422b2d99be074e1d6ac064b6f791245975da83José Fonseca
10415422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_colorspace {
10515422b2d99be074e1d6ac064b6f791245975da83José Fonseca   UTIL_FORMAT_COLORSPACE_RGB = 0,
10642b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca   UTIL_FORMAT_COLORSPACE_SRGB = 1,
10742b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca   UTIL_FORMAT_COLORSPACE_YUV = 2,
108e4069d07ddd8c2afa5378e54710e19e7517d43d6Keith Whitwell   UTIL_FORMAT_COLORSPACE_ZS = 3
10915422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
11015422b2d99be074e1d6ac064b6f791245975da83José Fonseca
11115422b2d99be074e1d6ac064b6f791245975da83José Fonseca
11215422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_channel_description
11315422b2d99be074e1d6ac064b6f791245975da83José Fonseca{
11415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned type:6;
11515422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned normalized:1;
11615422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned size:9;
11715422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
11815422b2d99be074e1d6ac064b6f791245975da83José Fonseca
11915422b2d99be074e1d6ac064b6f791245975da83José Fonseca
12015422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_description
12115422b2d99be074e1d6ac064b6f791245975da83José Fonseca{
12215422b2d99be074e1d6ac064b6f791245975da83José Fonseca   enum pipe_format format;
1234afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca
12415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   const char *name;
125816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca
126816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
1274afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca    * Short name, striped of the prefix, lower case.
1284afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca    */
1294afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca   const char *short_name;
1304afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca
1314afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca   /**
132816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Pixel block dimensions.
133816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
13415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   struct util_format_block block;
135816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca
13615422b2d99be074e1d6ac064b6f791245975da83José Fonseca   enum util_format_layout layout;
1375dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
1385dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   /**
1395dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    * The number of channels.
1405dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    */
1415dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   unsigned nr_channels:3;
1425dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
1435dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   /**
144816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Whether all channels have the same number of (whole) bytes.
1455dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    */
1465dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   unsigned is_array:1;
1475dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
1485dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   /**
1495dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    * Whether channels have mixed types (ignoring UTIL_FORMAT_TYPE_VOID).
1505dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca    */
1515dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca   unsigned is_mixed:1;
1525dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
153816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
154816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Input channel description.
155816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    *
156816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Only valid for UTIL_FORMAT_LAYOUT_PLAIN formats.
157816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
15815422b2d99be074e1d6ac064b6f791245975da83José Fonseca   struct util_format_channel_description channel[4];
1595dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
160816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
161816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Output channel swizzle.
162816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    *
163816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * The order is either:
164816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * - RGBA
165816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * - YUV(A)
166816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * - ZS
167816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * depending on the colorspace.
168816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
16915422b2d99be074e1d6ac064b6f791245975da83José Fonseca   unsigned char swizzle[4];
1705dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca
171816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   /**
172816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    * Colorspace transformation.
173816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca    */
17415422b2d99be074e1d6ac064b6f791245975da83José Fonseca   enum util_format_colorspace colorspace;
17515422b2d99be074e1d6ac064b6f791245975da83José Fonseca};
17615422b2d99be074e1d6ac064b6f791245975da83José Fonseca
17715422b2d99be074e1d6ac064b6f791245975da83José Fonseca
17815422b2d99be074e1d6ac064b6f791245975da83José Fonsecaextern const struct util_format_description
17915422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description_table[];
18015422b2d99be074e1d6ac064b6f791245975da83José Fonseca
18115422b2d99be074e1d6ac064b6f791245975da83José Fonseca
18215422b2d99be074e1d6ac064b6f791245975da83José Fonsecaconst struct util_format_description *
18315422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description(enum pipe_format format);
18415422b2d99be074e1d6ac064b6f791245975da83José Fonseca
18515422b2d99be074e1d6ac064b6f791245975da83José Fonseca
1863400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/*
1873400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format query functions.
1883400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */
1893400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
1905784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecastatic INLINE const char *
1915784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecautil_format_name(enum pipe_format format)
1925784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca{
1935784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   const struct util_format_description *desc = util_format_description(format);
1945784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
1955784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   assert(format);
1965784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   if (!format) {
1975784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca      return "???";
1985784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   }
1995784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
2005784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca   return desc->name;
2015784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca}
2025784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca
2033400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolstatic INLINE boolean
2043400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolutil_format_is_compressed(enum pipe_format format)
2053400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol{
2063400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol   const struct util_format_description *desc = util_format_description(format);
2073400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
2083400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol   assert(format);
2093400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol   if (!format) {
2103400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol      return FALSE;
2113400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol   }
2123400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
213816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   return desc->layout == UTIL_FORMAT_LAYOUT_COMPRESSED ? TRUE : FALSE;
214d28740c298968303500a8c43047ded2679e727acMichal Krol}
215d28740c298968303500a8c43047ded2679e727acMichal Krol
216d28740c298968303500a8c43047ded2679e727acMichal Krolstatic INLINE boolean
217d28740c298968303500a8c43047ded2679e727acMichal Krolutil_format_is_depth_or_stencil(enum pipe_format format)
218d28740c298968303500a8c43047ded2679e727acMichal Krol{
219d28740c298968303500a8c43047ded2679e727acMichal Krol   const struct util_format_description *desc = util_format_description(format);
220d28740c298968303500a8c43047ded2679e727acMichal Krol
221d28740c298968303500a8c43047ded2679e727acMichal Krol   assert(format);
222d28740c298968303500a8c43047ded2679e727acMichal Krol   if (!format) {
223d28740c298968303500a8c43047ded2679e727acMichal Krol      return FALSE;
224d28740c298968303500a8c43047ded2679e727acMichal Krol   }
225d28740c298968303500a8c43047ded2679e727acMichal Krol
226d28740c298968303500a8c43047ded2679e727acMichal Krol   return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS ? TRUE : FALSE;
2270bed834be4a174d20b31a6cbcf066774bf749929Michal Krol}
2280bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
2290bed834be4a174d20b31a6cbcf066774bf749929Michal Krolstatic INLINE boolean
2300bed834be4a174d20b31a6cbcf066774bf749929Michal Krolutil_format_is_depth_and_stencil(enum pipe_format format)
2310bed834be4a174d20b31a6cbcf066774bf749929Michal Krol{
2320bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   const struct util_format_description *desc = util_format_description(format);
2330bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
2340bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   assert(format);
2350bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   if (!format) {
2360bed834be4a174d20b31a6cbcf066774bf749929Michal Krol      return FALSE;
2370bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   }
2380bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
2390bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) {
2400bed834be4a174d20b31a6cbcf066774bf749929Michal Krol      return FALSE;
2410bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   }
2420bed834be4a174d20b31a6cbcf066774bf749929Michal Krol
2430bed834be4a174d20b31a6cbcf066774bf749929Michal Krol   return (desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE &&
2440bed834be4a174d20b31a6cbcf066774bf749929Michal Krol           desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE) ? TRUE : FALSE;
2453400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol}
2463400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
2476df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol
248cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/**
249a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return total bits needed for the pixel format per block.
250cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */
251cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint
252b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksizebits(enum pipe_format format)
253cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{
254cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   const struct util_format_description *desc = util_format_description(format);
255cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
256cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   assert(format);
257cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   if (!format) {
258cceeab39ea541b1be1521114316d660a77769c2aMichal Krol      return 0;
259cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   }
260cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
261a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller   return desc->block.bits;
262cceeab39ea541b1be1521114316d660a77769c2aMichal Krol}
263cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
264cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/**
265a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return bytes per block (not pixel) for the given format.
266cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */
267cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint
268b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksize(enum pipe_format format)
269cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{
270b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   uint bits = util_format_get_blocksizebits(format);
271cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
272cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   assert(bits % 8 == 0);
273cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
274cceeab39ea541b1be1521114316d660a77769c2aMichal Krol   return bits / 8;
275cceeab39ea541b1be1521114316d660a77769c2aMichal Krol}
276cceeab39ea541b1be1521114316d660a77769c2aMichal Krol
277f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolstatic INLINE uint
278b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockwidth(enum pipe_format format)
279b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
280b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   const struct util_format_description *desc = util_format_description(format);
281b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
282b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   assert(format);
283b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   if (!format) {
284b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol      return 1;
285b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   }
286b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
287816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   return desc->block.width;
288b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
289b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
290b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint
291b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockheight(enum pipe_format format)
292b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
293b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   const struct util_format_description *desc = util_format_description(format);
294b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
295b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   assert(format);
296b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   if (!format) {
297b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol      return 1;
298b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   }
299b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
300816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   return desc->block.height;
301b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
302b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
303b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
304b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksx(enum pipe_format format,
305b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                         unsigned x)
306b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
307b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   unsigned blockwidth = util_format_get_blockwidth(format);
308b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return (x + blockwidth - 1) / blockwidth;
309b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
310b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
311b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
312b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksy(enum pipe_format format,
313b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                         unsigned y)
314b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
315b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   unsigned blockheight = util_format_get_blockheight(format);
316b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return (y + blockheight - 1) / blockheight;
317b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
318b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
319b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned
320b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocks(enum pipe_format format,
321b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned width,
322b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned height)
323b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
324b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksx(format, width) * util_format_get_nblocksy(format, height);
325b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
326b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
327b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t
328b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_stride(enum pipe_format format,
329b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                       unsigned width)
330b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
331b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksx(format, width) * util_format_get_blocksize(format);
332b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
333b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
334b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t
335b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_2d_size(enum pipe_format format,
336b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        size_t stride,
337b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol                        unsigned height)
338b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{
339b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol   return util_format_get_nblocksy(format, height) * stride;
340b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol}
341b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol
342b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint
343f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolutil_format_get_component_bits(enum pipe_format format,
344f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol                               enum util_format_colorspace colorspace,
345f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol                               uint component)
346f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol{
347f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   const struct util_format_description *desc = util_format_description(format);
348f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   enum util_format_colorspace desc_colorspace;
349f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
350f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   assert(format);
351f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (!format) {
352f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
353f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
354f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
355440fc5bf788201a265892ff2e12bf102e63a2896Michal Krol   assert(component < 4);
356f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
357f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   /* Treat RGB and SRGB as equivalent. */
358f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
359f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      colorspace = UTIL_FORMAT_COLORSPACE_RGB;
360f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
361f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
362f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB;
363f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   } else {
364f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      desc_colorspace = desc->colorspace;
365f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
366f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
367f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   if (desc_colorspace != colorspace) {
368f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
369f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
370f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
371f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   switch (desc->swizzle[component]) {
372f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_X:
373f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[0].size;
374f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_Y:
375f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[1].size;
376f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_Z:
377f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[2].size;
378f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   case UTIL_FORMAT_SWIZZLE_W:
379f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return desc->channel[3].size;
380f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   default:
381f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol      return 0;
382f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   }
383f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol}
384f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol
385c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolstatic INLINE boolean
386c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolutil_format_has_alpha(enum pipe_format format)
387c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol{
388c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   const struct util_format_description *desc = util_format_description(format);
389c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
390c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   assert(format);
391c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   if (!format) {
392c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
393c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   }
394c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
395816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   switch (desc->colorspace) {
396816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_RGB:
397816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_SRGB:
398816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca      return desc->swizzle[3] != UTIL_FORMAT_SWIZZLE_1;
399816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_YUV:
400816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca      return FALSE;
401816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca   case UTIL_FORMAT_COLORSPACE_ZS:
402c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
403c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   default:
404c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      assert(0);
405c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol      return FALSE;
406c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol   }
407c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol}
408c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
4093400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
4103400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/*
4113400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format access functions.
4123400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */
4133400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol
4143d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
4153d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4f(enum pipe_format format,
4163d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    float *dst, unsigned dst_stride,
4173d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    const void *src, unsigned src_stride,
4183d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                    unsigned x, unsigned y, unsigned w, unsigned h);
4193d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
4203d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
4213d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4f(enum pipe_format format,
4223d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     const float *src, unsigned src_stride,
4233d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     void *dst, unsigned dst_stride,
4243d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     unsigned x, unsigned y, unsigned w, unsigned h);
4253d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
4263d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
4273d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4ub(enum pipe_format format,
4283d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     uint8_t *dst, unsigned dst_stride,
4293d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     const void *src, unsigned src_stride,
4303d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                     unsigned x, unsigned y, unsigned w, unsigned h);
4313d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
4323d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid
4333d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4ub(enum pipe_format format,
4343d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      const uint8_t *src, unsigned src_stride,
4353d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      void *dst, unsigned dst_stride,
4363d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca                      unsigned x, unsigned y, unsigned w, unsigned h);
4373d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca
438c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus
439c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} // extern "C" {
440c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif
441c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol
44215422b2d99be074e1d6ac064b6f791245975da83José Fonseca#endif /* ! U_FORMAT_H */
443