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