u_format.h revision 018aae950df449a18d7d69de54d51af587be94c6
115422b2d99be074e1d6ac064b6f791245975da83José Fonseca/************************************************************************** 215422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 3816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Copyright 2009-2010 Vmware, Inc. 415422b2d99be074e1d6ac064b6f791245975da83José Fonseca * All Rights Reserved. 515422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 615422b2d99be074e1d6ac064b6f791245975da83José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 715422b2d99be074e1d6ac064b6f791245975da83José Fonseca * copy of this software and associated documentation files (the 815422b2d99be074e1d6ac064b6f791245975da83José Fonseca * "Software"), to deal in the Software without restriction, including 915422b2d99be074e1d6ac064b6f791245975da83José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 1015422b2d99be074e1d6ac064b6f791245975da83José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 1115422b2d99be074e1d6ac064b6f791245975da83José Fonseca * permit persons to whom the Software is furnished to do so, subject to 1215422b2d99be074e1d6ac064b6f791245975da83José Fonseca * the following conditions: 1315422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 1415422b2d99be074e1d6ac064b6f791245975da83José Fonseca * The above copyright notice and this permission notice (including the 1515422b2d99be074e1d6ac064b6f791245975da83José Fonseca * next paragraph) shall be included in all copies or substantial portions 1615422b2d99be074e1d6ac064b6f791245975da83José Fonseca * of the Software. 1715422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 1815422b2d99be074e1d6ac064b6f791245975da83José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1915422b2d99be074e1d6ac064b6f791245975da83José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2015422b2d99be074e1d6ac064b6f791245975da83José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2115422b2d99be074e1d6ac064b6f791245975da83José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 2215422b2d99be074e1d6ac064b6f791245975da83José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2315422b2d99be074e1d6ac064b6f791245975da83José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2415422b2d99be074e1d6ac064b6f791245975da83José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2515422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 2615422b2d99be074e1d6ac064b6f791245975da83José Fonseca **************************************************************************/ 2715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 2815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 2915422b2d99be074e1d6ac064b6f791245975da83José Fonseca#ifndef U_FORMAT_H 3015422b2d99be074e1d6ac064b6f791245975da83José Fonseca#define U_FORMAT_H 3115422b2d99be074e1d6ac064b6f791245975da83José Fonseca 3215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 3315422b2d99be074e1d6ac064b6f791245975da83José Fonseca#include "pipe/p_format.h" 34ad9cc55bed64af71f16b0be89af7d0a76b73ef91José Fonseca#include "util/u_debug.h" 3515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 36c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus 37c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolextern "C" { 38c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif 39c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 4015422b2d99be074e1d6ac064b6f791245975da83José Fonseca 4159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca/** 42816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Describe how to pack/unpack pixels into/from the prescribed format. 4359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * 44816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * XXX: This could be renamed to something like util_format_pack, or broke down 45816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * in flags inside util_format_block that said exactly what we want. 4659f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 4715422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_layout { 4859f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 49816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Formats with util_format_block::width == util_format_block::height == 1 50816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * that can be described as an ordinary data structure. 5159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 52816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca UTIL_FORMAT_LAYOUT_PLAIN = 0, 5359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca 5459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 55816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Formats with sub-sampled channels. 56816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * 57816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * This is for formats like YV12 where there is less than one sample per 58816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * pixel. 5959f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 60816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca UTIL_FORMAT_LAYOUT_SUBSAMPLED = 3, 6159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca 6259f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 63b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca * S3 Texture Compression formats. 64b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca */ 65b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca UTIL_FORMAT_LAYOUT_S3TC = 4, 66b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca 67b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca /** 68b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca * Red-Green Texture Compression formats. 69b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca */ 70b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca UTIL_FORMAT_LAYOUT_RGTC = 5, 71b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca 72b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca /** 73b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca * Everything else that doesn't fit in any of the above layouts. 7459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 75b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca UTIL_FORMAT_LAYOUT_OTHER = 6 7615422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 7715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 7815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 7915422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_block 8015422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 8115422b2d99be074e1d6ac064b6f791245975da83José Fonseca /** Block width in pixels */ 8215422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned width; 8315422b2d99be074e1d6ac064b6f791245975da83José Fonseca 8415422b2d99be074e1d6ac064b6f791245975da83José Fonseca /** Block height in pixels */ 8515422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned height; 8615422b2d99be074e1d6ac064b6f791245975da83José Fonseca 876df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol /** Block size in bits */ 8815422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned bits; 8915422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 9015422b2d99be074e1d6ac064b6f791245975da83José Fonseca 9115422b2d99be074e1d6ac064b6f791245975da83José Fonseca 9215422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_type { 9315422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_VOID = 0, 9415422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_UNSIGNED = 1, 9515422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_SIGNED = 2, 9615422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_FIXED = 3, 9715422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_FLOAT = 4 9815422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 9915422b2d99be074e1d6ac064b6f791245975da83José Fonseca 10015422b2d99be074e1d6ac064b6f791245975da83José Fonseca 10115422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_swizzle { 10215422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_X = 0, 10315422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_Y = 1, 10415422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_Z = 2, 10515422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_W = 3, 10615422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_0 = 4, 10715422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_1 = 5, 10815422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_NONE = 6 10915422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 11015422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11115422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11215422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_colorspace { 11315422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_COLORSPACE_RGB = 0, 11442b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_COLORSPACE_SRGB = 1, 11542b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_COLORSPACE_YUV = 2, 116e4069d07ddd8c2afa5378e54710e19e7517d43d6Keith Whitwell UTIL_FORMAT_COLORSPACE_ZS = 3 11715422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 11815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11915422b2d99be074e1d6ac064b6f791245975da83José Fonseca 12015422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_channel_description 12115422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 12215422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned type:6; 12315422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned normalized:1; 12415422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned size:9; 12515422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 12615422b2d99be074e1d6ac064b6f791245975da83José Fonseca 12715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 12815422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_description 12915422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 13015422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum pipe_format format; 1314afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca 13215422b2d99be074e1d6ac064b6f791245975da83José Fonseca const char *name; 133816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca 134816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca /** 1354afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca * Short name, striped of the prefix, lower case. 1364afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca */ 1374afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca const char *short_name; 1384afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca 1394afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca /** 140816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Pixel block dimensions. 141816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca */ 14215422b2d99be074e1d6ac064b6f791245975da83José Fonseca struct util_format_block block; 143816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca 14415422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum util_format_layout layout; 1455dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 1465dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca /** 1475dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca * The number of channels. 1485dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca */ 1495dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca unsigned nr_channels:3; 1505dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 1515dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca /** 152816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Whether all channels have the same number of (whole) bytes. 1535dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca */ 1545dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca unsigned is_array:1; 1555dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 1565dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca /** 157cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca * Whether the pixel format can be described as a bitfield structure. 158cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca * 159cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca * In particular: 160cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca * - pixel depth must be 8, 16, or 32 bits; 161cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca * - all channels must be unsigned, signed, or void 162cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca */ 163cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca unsigned is_bitmask:1; 164cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca 165cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca /** 1665dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca * Whether channels have mixed types (ignoring UTIL_FORMAT_TYPE_VOID). 1675dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca */ 1685dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca unsigned is_mixed:1; 1695dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 170816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca /** 171816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Input channel description. 172816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * 173816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Only valid for UTIL_FORMAT_LAYOUT_PLAIN formats. 174816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca */ 17515422b2d99be074e1d6ac064b6f791245975da83José Fonseca struct util_format_channel_description channel[4]; 1765dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 177816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca /** 178816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Output channel swizzle. 179816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * 180816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * The order is either: 181816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * - RGBA 182816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * - YUV(A) 183816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * - ZS 184816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * depending on the colorspace. 185816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca */ 18615422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned char swizzle[4]; 1875dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 188816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca /** 189816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Colorspace transformation. 190816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca */ 19115422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum util_format_colorspace colorspace; 19296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca 19396bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca /** 194018aae950df449a18d7d69de54d51af587be94c6José Fonseca * Unpack pixel blocks to R8G8B8A8_UNORM. 19596bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca */ 19696bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca void 197018aae950df449a18d7d69de54d51af587be94c6José Fonseca (*unpack_8unorm)(uint8_t *dst, unsigned dst_stride, 198018aae950df449a18d7d69de54d51af587be94c6José Fonseca const uint8_t *src, unsigned src_stride, 199018aae950df449a18d7d69de54d51af587be94c6José Fonseca unsigned width, unsigned height); 20096bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca 20169895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca /** 202018aae950df449a18d7d69de54d51af587be94c6José Fonseca * Pack pixel blocks from R8G8B8A8_UNORM. 20369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca */ 20496bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca void 205018aae950df449a18d7d69de54d51af587be94c6José Fonseca (*pack_8unorm)(uint8_t *dst, unsigned dst_stride, 206018aae950df449a18d7d69de54d51af587be94c6José Fonseca const uint8_t *src, unsigned src_stride, 207018aae950df449a18d7d69de54d51af587be94c6José Fonseca unsigned width, unsigned height); 20896bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca 20969895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca /** 210018aae950df449a18d7d69de54d51af587be94c6José Fonseca * Unpack pixel blocks to R32G32B32A32_FLOAT. 21169895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca */ 21296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca void 213018aae950df449a18d7d69de54d51af587be94c6José Fonseca (*unpack_float)(float *dst, unsigned dst_stride, 214018aae950df449a18d7d69de54d51af587be94c6José Fonseca const uint8_t *src, unsigned src_stride, 215018aae950df449a18d7d69de54d51af587be94c6José Fonseca unsigned width, unsigned height); 21696bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca 21769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca /** 218018aae950df449a18d7d69de54d51af587be94c6José Fonseca * Pack pixel blocks from R32G32B32A32_FLOAT. 21969895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca */ 22096bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca void 221018aae950df449a18d7d69de54d51af587be94c6José Fonseca (*pack_float)(uint8_t *dst, unsigned dst_stride, 222018aae950df449a18d7d69de54d51af587be94c6José Fonseca const float *src, unsigned src_stride, 223018aae950df449a18d7d69de54d51af587be94c6José Fonseca unsigned width, unsigned height); 22496bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca 22569895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca /** 22669895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca * Fetch a single pixel (i, j) from a block. 22769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca */ 22869895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca void 229018aae950df449a18d7d69de54d51af587be94c6José Fonseca (*fetch_float)(float *dst, 230018aae950df449a18d7d69de54d51af587be94c6José Fonseca const uint8_t *src, 231018aae950df449a18d7d69de54d51af587be94c6José Fonseca unsigned i, unsigned j); 23215422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 23315422b2d99be074e1d6ac064b6f791245975da83José Fonseca 23415422b2d99be074e1d6ac064b6f791245975da83José Fonseca 23515422b2d99be074e1d6ac064b6f791245975da83José Fonsecaextern const struct util_format_description 23615422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description_table[]; 23715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 23815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 23915422b2d99be074e1d6ac064b6f791245975da83José Fonsecaconst struct util_format_description * 24015422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description(enum pipe_format format); 24115422b2d99be074e1d6ac064b6f791245975da83José Fonseca 24215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 2433400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/* 2443400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format query functions. 2453400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */ 2463400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 2475784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecastatic INLINE const char * 2485784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecautil_format_name(enum pipe_format format) 2495784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca{ 2505784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca const struct util_format_description *desc = util_format_description(format); 2515784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca 252329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 253329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 2545784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca return "???"; 2555784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca } 2565784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca 2575784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca return desc->name; 2585784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca} 2595784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca 2603400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolstatic INLINE boolean 261b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonsecautil_format_is_s3tc(enum pipe_format format) 2623400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol{ 2633400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol const struct util_format_description *desc = util_format_description(format); 2643400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 265329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 266329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 2673400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol return FALSE; 2683400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol } 2693400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 270b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca return desc->layout == UTIL_FORMAT_LAYOUT_S3TC ? TRUE : FALSE; 271d28740c298968303500a8c43047ded2679e727acMichal Krol} 272d28740c298968303500a8c43047ded2679e727acMichal Krol 273d28740c298968303500a8c43047ded2679e727acMichal Krolstatic INLINE boolean 274d28740c298968303500a8c43047ded2679e727acMichal Krolutil_format_is_depth_or_stencil(enum pipe_format format) 275d28740c298968303500a8c43047ded2679e727acMichal Krol{ 276d28740c298968303500a8c43047ded2679e727acMichal Krol const struct util_format_description *desc = util_format_description(format); 277d28740c298968303500a8c43047ded2679e727acMichal Krol 278329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 279329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 280d28740c298968303500a8c43047ded2679e727acMichal Krol return FALSE; 281d28740c298968303500a8c43047ded2679e727acMichal Krol } 282d28740c298968303500a8c43047ded2679e727acMichal Krol 283d28740c298968303500a8c43047ded2679e727acMichal Krol return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS ? TRUE : FALSE; 2840bed834be4a174d20b31a6cbcf066774bf749929Michal Krol} 2850bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 2860bed834be4a174d20b31a6cbcf066774bf749929Michal Krolstatic INLINE boolean 2870bed834be4a174d20b31a6cbcf066774bf749929Michal Krolutil_format_is_depth_and_stencil(enum pipe_format format) 2880bed834be4a174d20b31a6cbcf066774bf749929Michal Krol{ 2890bed834be4a174d20b31a6cbcf066774bf749929Michal Krol const struct util_format_description *desc = util_format_description(format); 2900bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 291329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 292329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 2930bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return FALSE; 2940bed834be4a174d20b31a6cbcf066774bf749929Michal Krol } 2950bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 2960bed834be4a174d20b31a6cbcf066774bf749929Michal Krol if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) { 2970bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return FALSE; 2980bed834be4a174d20b31a6cbcf066774bf749929Michal Krol } 2990bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 3000bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return (desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE && 3010bed834be4a174d20b31a6cbcf066774bf749929Michal Krol desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE) ? TRUE : FALSE; 3023400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol} 3033400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 3047a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca/** 3057a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * Whether this format is a rgab8 variant. 3067a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * 3077a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * That is, any format that matches the 3087a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * 3097a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * PIPE_FORMAT_?8?8?8?8_UNORM 3107a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca */ 3117a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonsecastatic INLINE boolean 3127a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonsecautil_format_is_rgba8_variant(const struct util_format_description *desc) 3137a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca{ 3147a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca unsigned chan; 3157a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca 3167a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca if(desc->block.width != 1 || 3177a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca desc->block.height != 1 || 3187a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca desc->block.bits != 32) 3197a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca return FALSE; 3207a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca 3217a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca for(chan = 0; chan < 4; ++chan) { 3227a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca if(desc->channel[chan].type != UTIL_FORMAT_TYPE_UNSIGNED && 3237a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca desc->channel[chan].type != UTIL_FORMAT_TYPE_VOID) 3247a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca return FALSE; 3257a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca if(desc->channel[chan].size != 8) 3267a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca return FALSE; 3277a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca } 3287a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca 3297a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca return TRUE; 3307a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca} 3317a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca 3326df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol 333cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/** 334a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return total bits needed for the pixel format per block. 335cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */ 336cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint 337b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksizebits(enum pipe_format format) 338cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{ 339cceeab39ea541b1be1521114316d660a77769c2aMichal Krol const struct util_format_description *desc = util_format_description(format); 340cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 341329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 342329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 343cceeab39ea541b1be1521114316d660a77769c2aMichal Krol return 0; 344cceeab39ea541b1be1521114316d660a77769c2aMichal Krol } 345cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 346a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller return desc->block.bits; 347cceeab39ea541b1be1521114316d660a77769c2aMichal Krol} 348cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 349cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/** 350a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return bytes per block (not pixel) for the given format. 351cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */ 352cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint 353b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksize(enum pipe_format format) 354cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{ 355b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol uint bits = util_format_get_blocksizebits(format); 356cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 357cceeab39ea541b1be1521114316d660a77769c2aMichal Krol assert(bits % 8 == 0); 358cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 359cceeab39ea541b1be1521114316d660a77769c2aMichal Krol return bits / 8; 360cceeab39ea541b1be1521114316d660a77769c2aMichal Krol} 361cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 362f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolstatic INLINE uint 363b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockwidth(enum pipe_format format) 364b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 365b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const struct util_format_description *desc = util_format_description(format); 366b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 367329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 368329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 369b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 1; 370b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol } 371b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 372816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return desc->block.width; 373b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 374b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 375b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint 376b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockheight(enum pipe_format format) 377b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 378b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const struct util_format_description *desc = util_format_description(format); 379b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 380329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 381329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 382b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 1; 383b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol } 384b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 385816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return desc->block.height; 386b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 387b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 388b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned 389b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksx(enum pipe_format format, 390b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned x) 391b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 392b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned blockwidth = util_format_get_blockwidth(format); 393b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return (x + blockwidth - 1) / blockwidth; 394b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 395b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 396b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned 397b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksy(enum pipe_format format, 398b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned y) 399b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 400b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned blockheight = util_format_get_blockheight(format); 401b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return (y + blockheight - 1) / blockheight; 402b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 403b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 404b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned 405b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocks(enum pipe_format format, 406b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned width, 407b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned height) 408b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 409b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return util_format_get_nblocksx(format, width) * util_format_get_nblocksy(format, height); 410b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 411b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 412b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t 413b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_stride(enum pipe_format format, 414b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned width) 415b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 416b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return util_format_get_nblocksx(format, width) * util_format_get_blocksize(format); 417b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 418b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 419b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t 420b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_2d_size(enum pipe_format format, 421b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol size_t stride, 422b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned height) 423b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 424b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return util_format_get_nblocksy(format, height) * stride; 425b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 426b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 427b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint 428f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolutil_format_get_component_bits(enum pipe_format format, 429f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol enum util_format_colorspace colorspace, 430f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol uint component) 431f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol{ 432f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol const struct util_format_description *desc = util_format_description(format); 433f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol enum util_format_colorspace desc_colorspace; 434f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 435f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol assert(format); 436f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (!format) { 437f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return 0; 438f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 439f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 440440fc5bf788201a265892ff2e12bf102e63a2896Michal Krol assert(component < 4); 441f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 442f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol /* Treat RGB and SRGB as equivalent. */ 443f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 444f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol colorspace = UTIL_FORMAT_COLORSPACE_RGB; 445f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 446f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 447f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB; 448f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } else { 449f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol desc_colorspace = desc->colorspace; 450f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 451f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 452f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (desc_colorspace != colorspace) { 453f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return 0; 454f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 455f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 456f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol switch (desc->swizzle[component]) { 457f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_X: 458f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[0].size; 459f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_Y: 460f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[1].size; 461f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_Z: 462f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[2].size; 463f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_W: 464f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[3].size; 465f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol default: 466f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return 0; 467f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 468f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol} 469f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 470c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolstatic INLINE boolean 471c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolutil_format_has_alpha(enum pipe_format format) 472c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol{ 473c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol const struct util_format_description *desc = util_format_description(format); 474c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 475c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol assert(format); 476c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol if (!format) { 477c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 478c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol } 479c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 480816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca switch (desc->colorspace) { 481816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca case UTIL_FORMAT_COLORSPACE_RGB: 482816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca case UTIL_FORMAT_COLORSPACE_SRGB: 483816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return desc->swizzle[3] != UTIL_FORMAT_SWIZZLE_1; 484816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca case UTIL_FORMAT_COLORSPACE_YUV: 485816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return FALSE; 486816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca case UTIL_FORMAT_COLORSPACE_ZS: 487c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 488c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol default: 489c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol assert(0); 490c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 491c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol } 492c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} 493c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 494c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger/** 495c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger * Return the number of components stored. 496c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger * Formats with block size != 1x1 will always have 1 component (the block). 497c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger */ 498c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheideggerstatic INLINE unsigned 499c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheideggerutil_format_get_nr_components(enum pipe_format format) 500c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger{ 501c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger const struct util_format_description *desc = util_format_description(format); 502e0f10a6fca34619f61c3533b68d89dcb1ff2627cRoland Scheidegger return desc->nr_channels; 503c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger} 5043400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 5053400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/* 5063400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format access functions. 5073400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */ 5083400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 5093d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 5103d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4f(enum pipe_format format, 5113d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca float *dst, unsigned dst_stride, 5123d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const void *src, unsigned src_stride, 5133d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 5143d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 5153d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 5163d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4f(enum pipe_format format, 5173d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const float *src, unsigned src_stride, 5183d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca void *dst, unsigned dst_stride, 5193d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 5203d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 5213d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 5223d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4ub(enum pipe_format format, 5233d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca uint8_t *dst, unsigned dst_stride, 5243d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const void *src, unsigned src_stride, 5253d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 5263d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 5273d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 5283d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4ub(enum pipe_format format, 5293d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const uint8_t *src, unsigned src_stride, 5303d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca void *dst, unsigned dst_stride, 5313d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 5323d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 533c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus 534c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} // extern "C" { 535c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif 536c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 53715422b2d99be074e1d6ac064b6f791245975da83José Fonseca#endif /* ! U_FORMAT_H */ 538