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