u_format.h revision d3808b1b1f34dbb826b99102786d94e1baf9d667
115422b2d99be074e1d6ac064b6f791245975da83José Fonseca/************************************************************************** 215422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 3816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Copyright 2009-2010 Vmware, Inc. 415422b2d99be074e1d6ac064b6f791245975da83José Fonseca * All Rights Reserved. 515422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 615422b2d99be074e1d6ac064b6f791245975da83José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 715422b2d99be074e1d6ac064b6f791245975da83José Fonseca * copy of this software and associated documentation files (the 815422b2d99be074e1d6ac064b6f791245975da83José Fonseca * "Software"), to deal in the Software without restriction, including 915422b2d99be074e1d6ac064b6f791245975da83José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 1015422b2d99be074e1d6ac064b6f791245975da83José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 1115422b2d99be074e1d6ac064b6f791245975da83José Fonseca * permit persons to whom the Software is furnished to do so, subject to 1215422b2d99be074e1d6ac064b6f791245975da83José Fonseca * the following conditions: 1315422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 1415422b2d99be074e1d6ac064b6f791245975da83José Fonseca * The above copyright notice and this permission notice (including the 1515422b2d99be074e1d6ac064b6f791245975da83José Fonseca * next paragraph) shall be included in all copies or substantial portions 1615422b2d99be074e1d6ac064b6f791245975da83José Fonseca * of the Software. 1715422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 1815422b2d99be074e1d6ac064b6f791245975da83José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1915422b2d99be074e1d6ac064b6f791245975da83José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2015422b2d99be074e1d6ac064b6f791245975da83José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2115422b2d99be074e1d6ac064b6f791245975da83José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 2215422b2d99be074e1d6ac064b6f791245975da83José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2315422b2d99be074e1d6ac064b6f791245975da83José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2415422b2d99be074e1d6ac064b6f791245975da83José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2515422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 2615422b2d99be074e1d6ac064b6f791245975da83José Fonseca **************************************************************************/ 2715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 2815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 2915422b2d99be074e1d6ac064b6f791245975da83José Fonseca#ifndef U_FORMAT_H 3015422b2d99be074e1d6ac064b6f791245975da83José Fonseca#define U_FORMAT_H 3115422b2d99be074e1d6ac064b6f791245975da83José Fonseca 3215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 3315422b2d99be074e1d6ac064b6f791245975da83José Fonseca#include "pipe/p_format.h" 34ad9cc55bed64af71f16b0be89af7d0a76b73ef91José Fonseca#include "util/u_debug.h" 3515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 36c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus 37c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolextern "C" { 38c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif 39c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 4015422b2d99be074e1d6ac064b6f791245975da83José Fonseca 4159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca/** 42816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Describe how to pack/unpack pixels into/from the prescribed format. 4359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * 44816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * XXX: This could be renamed to something like util_format_pack, or broke down 45816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * in flags inside util_format_block that said exactly what we want. 4659f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 4715422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_layout { 4859f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 49816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Formats with util_format_block::width == util_format_block::height == 1 50816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * that can be described as an ordinary data structure. 5159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 52816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca UTIL_FORMAT_LAYOUT_PLAIN = 0, 5359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca 5459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 55816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Formats with sub-sampled channels. 56816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * 57816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * This is for formats like YV12 where there is less than one sample per 58816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * pixel. 5959f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 60816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca UTIL_FORMAT_LAYOUT_SUBSAMPLED = 3, 6159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca 6259f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 63b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca * S3 Texture Compression formats. 64b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca */ 65b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca UTIL_FORMAT_LAYOUT_S3TC = 4, 66b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca 67b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca /** 68b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca * Red-Green Texture Compression formats. 69b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca */ 70b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca UTIL_FORMAT_LAYOUT_RGTC = 5, 71b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca 72b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca /** 73b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca * Everything else that doesn't fit in any of the above layouts. 7459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 75b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca UTIL_FORMAT_LAYOUT_OTHER = 6 7615422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 7715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 7815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 7915422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_block 8015422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 8115422b2d99be074e1d6ac064b6f791245975da83José Fonseca /** Block width in pixels */ 8215422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned width; 8315422b2d99be074e1d6ac064b6f791245975da83José Fonseca 8415422b2d99be074e1d6ac064b6f791245975da83José Fonseca /** Block height in pixels */ 8515422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned height; 8615422b2d99be074e1d6ac064b6f791245975da83José Fonseca 876df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol /** Block size in bits */ 8815422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned bits; 8915422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 9015422b2d99be074e1d6ac064b6f791245975da83José Fonseca 9115422b2d99be074e1d6ac064b6f791245975da83José Fonseca 9215422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_type { 9315422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_VOID = 0, 9415422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_UNSIGNED = 1, 9515422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_SIGNED = 2, 9615422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_FIXED = 3, 9715422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_FLOAT = 4 9815422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 9915422b2d99be074e1d6ac064b6f791245975da83José Fonseca 10015422b2d99be074e1d6ac064b6f791245975da83José Fonseca 10115422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_swizzle { 10215422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_X = 0, 10315422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_Y = 1, 10415422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_Z = 2, 10515422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_W = 3, 10615422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_0 = 4, 10715422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_1 = 5, 10815422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_NONE = 6 10915422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 11015422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11115422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11215422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_colorspace { 11315422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_COLORSPACE_RGB = 0, 11442b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_COLORSPACE_SRGB = 1, 11542b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_COLORSPACE_YUV = 2, 116e4069d07ddd8c2afa5378e54710e19e7517d43d6Keith Whitwell UTIL_FORMAT_COLORSPACE_ZS = 3 11715422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 11815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11915422b2d99be074e1d6ac064b6f791245975da83José Fonseca 12015422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_channel_description 12115422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 12215422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned type:6; 12315422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned normalized:1; 12415422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned size:9; 12515422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 12615422b2d99be074e1d6ac064b6f791245975da83José Fonseca 12715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 12815422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_description 12915422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 13015422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum pipe_format format; 1314afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca 13215422b2d99be074e1d6ac064b6f791245975da83José Fonseca const char *name; 133816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca 134816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca /** 1354afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca * Short name, striped of the prefix, lower case. 1364afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca */ 1374afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca const char *short_name; 1384afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca 1394afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca /** 140816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Pixel block dimensions. 141816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca */ 14215422b2d99be074e1d6ac064b6f791245975da83José Fonseca struct util_format_block block; 143816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca 14415422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum util_format_layout layout; 1455dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 1465dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca /** 1475dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca * The number of channels. 1485dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca */ 1495dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca unsigned nr_channels:3; 1505dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 1515dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca /** 152816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Whether all channels have the same number of (whole) bytes. 1535dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca */ 1545dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca unsigned is_array:1; 1555dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 1565dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca /** 157cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca * Whether the pixel format can be described as a bitfield structure. 158cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca * 159cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca * In particular: 160cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca * - pixel depth must be 8, 16, or 32 bits; 161cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca * - all channels must be unsigned, signed, or void 162cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca */ 163cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca unsigned is_bitmask:1; 164cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca 165cfde6c50ae6c3ce7912a3d1231c459d020d77f13José Fonseca /** 1665dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca * Whether channels have mixed types (ignoring UTIL_FORMAT_TYPE_VOID). 1675dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca */ 1685dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca unsigned is_mixed:1; 1695dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 170816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca /** 171816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Input channel description. 172816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * 173816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Only valid for UTIL_FORMAT_LAYOUT_PLAIN formats. 174816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca */ 17515422b2d99be074e1d6ac064b6f791245975da83José Fonseca struct util_format_channel_description channel[4]; 1765dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 177816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca /** 178816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Output channel swizzle. 179816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * 180816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * The order is either: 181816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * - RGBA 182816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * - YUV(A) 183816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * - ZS 184816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * depending on the colorspace. 185816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca */ 18615422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned char swizzle[4]; 1875dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 188816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca /** 189816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Colorspace transformation. 190816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca */ 19115422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum util_format_colorspace colorspace; 19296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca 19396bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca /** 194018aae950df449a18d7d69de54d51af587be94c6José Fonseca * Unpack pixel blocks to R8G8B8A8_UNORM. 195d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * 196d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Only defined for non-depth-stencil formats. 19796bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca */ 19896bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca void 199d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca (*unpack_rgba_8unorm)(uint8_t *dst, unsigned dst_stride, 200d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const uint8_t *src, unsigned src_stride, 201d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca unsigned width, unsigned height); 20296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca 20369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca /** 204018aae950df449a18d7d69de54d51af587be94c6José Fonseca * Pack pixel blocks from R8G8B8A8_UNORM. 205d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * 206d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Only defined for non-depth-stencil formats. 20769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca */ 20896bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca void 209d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca (*pack_rgba_8unorm)(uint8_t *dst, unsigned dst_stride, 210d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const uint8_t *src, unsigned src_stride, 211d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca unsigned width, unsigned height); 21296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca 21369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca /** 214018aae950df449a18d7d69de54d51af587be94c6José Fonseca * Unpack pixel blocks to R32G32B32A32_FLOAT. 215d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * 216d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Only defined for non-depth-stencil formats. 21769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca */ 21896bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca void 219d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca (*unpack_rgba_float)(float *dst, unsigned dst_stride, 220d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const uint8_t *src, unsigned src_stride, 221d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca unsigned width, unsigned height); 22296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca 22369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca /** 224018aae950df449a18d7d69de54d51af587be94c6José Fonseca * Pack pixel blocks from R32G32B32A32_FLOAT. 225d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * 226d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Only defined for non-depth-stencil formats. 22769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca */ 22896bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca void 229d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca (*pack_rgba_float)(uint8_t *dst, unsigned dst_stride, 230d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const float *src, unsigned src_stride, 231d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca unsigned width, unsigned height); 23296bf4aff5bd674bba5d83ab32c46024a686c1a1dJosé Fonseca 23369895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca /** 23469895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca * Fetch a single pixel (i, j) from a block. 235d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * 236d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Only defined for non-depth-stencil formats. 237d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca */ 238d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca void 239d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca (*fetch_rgba_float)(float *dst, 240d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const uint8_t *src, 241d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca unsigned i, unsigned j); 242d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca 243d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca /** 244d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Unpack pixels to Z32_UNORM. 245d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * 246d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Only defined for depth formats. 247d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca */ 248d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca void 249d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca (*unpack_z_32unorm)(uint32_t *dst, unsigned dst_stride, 250d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const uint8_t *src, unsigned src_stride, 251d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca unsigned width, unsigned height); 252d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca 253d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca /** 254d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Pack pixels from Z32_FLOAT. 255d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * 256d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Only defined for depth formats. 257d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca */ 258d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca void 259d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca (*pack_z_32unorm)(uint8_t *dst, unsigned dst_stride, 260d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const uint32_t *src, unsigned src_stride, 261d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca unsigned width, unsigned height); 262d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca 263d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca /** 264d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Unpack pixels to Z32_FLOAT. 265d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * 266d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Only defined for depth formats. 267d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca */ 268d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca void 269d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca (*unpack_z_float)(float *dst, unsigned dst_stride, 270d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const uint8_t *src, unsigned src_stride, 271d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca unsigned width, unsigned height); 272d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca 273d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca /** 274d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Pack pixels from Z32_FLOAT. 275d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * 276d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Only defined for depth formats. 27769895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca */ 27869895725cfe9d4dc917ff6e643af9e6e3a6e093fJosé Fonseca void 279d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca (*pack_z_float)(uint8_t *dst, unsigned dst_stride, 280d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const float *src, unsigned src_stride, 281d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca unsigned width, unsigned height); 282d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca 283d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca /** 284d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Unpack pixels to S8_USCALED. 285d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * 286d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Only defined for stencil formats. 287d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca */ 288d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca void 289d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca (*unpack_s_32unorm)(uint8_t *dst, unsigned dst_stride, 290d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const uint8_t *src, unsigned src_stride, 291d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca unsigned width, unsigned height); 292d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca 293d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca /** 294d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Pack pixels from S8_USCALED. 295d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * 296d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca * Only defined for stencil formats. 297d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca */ 298d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca void 299d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca (*pack_s_8uscaled)(uint8_t *dst, unsigned dst_stride, 300d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca const uint8_t *src, unsigned src_stride, 301d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca unsigned width, unsigned height); 302d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonseca 30315422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 30415422b2d99be074e1d6ac064b6f791245975da83José Fonseca 30515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 30615422b2d99be074e1d6ac064b6f791245975da83José Fonsecaextern const struct util_format_description 30715422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description_table[]; 30815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 30915422b2d99be074e1d6ac064b6f791245975da83José Fonseca 31015422b2d99be074e1d6ac064b6f791245975da83José Fonsecaconst struct util_format_description * 31115422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description(enum pipe_format format); 31215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 31315422b2d99be074e1d6ac064b6f791245975da83José Fonseca 3143400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/* 3153400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format query functions. 3163400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */ 3173400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 3185784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecastatic INLINE const char * 3195784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecautil_format_name(enum pipe_format format) 3205784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca{ 3215784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca const struct util_format_description *desc = util_format_description(format); 3225784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca 323329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 324329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 3255784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca return "???"; 3265784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca } 3275784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca 3285784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca return desc->name; 3295784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca} 3305784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca 3313400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolstatic INLINE boolean 332b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonsecautil_format_is_s3tc(enum pipe_format format) 3333400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol{ 3343400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol const struct util_format_description *desc = util_format_description(format); 3353400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 336329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 337329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 3383400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol return FALSE; 3393400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol } 3403400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 341b9ad95d3ee9178dce9320d28b20d23d97370f7bdJosé Fonseca return desc->layout == UTIL_FORMAT_LAYOUT_S3TC ? TRUE : FALSE; 342d28740c298968303500a8c43047ded2679e727acMichal Krol} 343d28740c298968303500a8c43047ded2679e727acMichal Krol 344d28740c298968303500a8c43047ded2679e727acMichal Krolstatic INLINE boolean 345d28740c298968303500a8c43047ded2679e727acMichal Krolutil_format_is_depth_or_stencil(enum pipe_format format) 346d28740c298968303500a8c43047ded2679e727acMichal Krol{ 347d28740c298968303500a8c43047ded2679e727acMichal Krol const struct util_format_description *desc = util_format_description(format); 348d28740c298968303500a8c43047ded2679e727acMichal Krol 349329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 350329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 351d28740c298968303500a8c43047ded2679e727acMichal Krol return FALSE; 352d28740c298968303500a8c43047ded2679e727acMichal Krol } 353d28740c298968303500a8c43047ded2679e727acMichal Krol 354d28740c298968303500a8c43047ded2679e727acMichal Krol return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS ? TRUE : FALSE; 3550bed834be4a174d20b31a6cbcf066774bf749929Michal Krol} 3560bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 3570bed834be4a174d20b31a6cbcf066774bf749929Michal Krolstatic INLINE boolean 3580bed834be4a174d20b31a6cbcf066774bf749929Michal Krolutil_format_is_depth_and_stencil(enum pipe_format format) 3590bed834be4a174d20b31a6cbcf066774bf749929Michal Krol{ 3600bed834be4a174d20b31a6cbcf066774bf749929Michal Krol const struct util_format_description *desc = util_format_description(format); 3610bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 362329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 363329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 3640bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return FALSE; 3650bed834be4a174d20b31a6cbcf066774bf749929Michal Krol } 3660bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 3670bed834be4a174d20b31a6cbcf066774bf749929Michal Krol if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) { 3680bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return FALSE; 3690bed834be4a174d20b31a6cbcf066774bf749929Michal Krol } 3700bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 3710bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return (desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE && 3720bed834be4a174d20b31a6cbcf066774bf749929Michal Krol desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE) ? TRUE : FALSE; 3733400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol} 3743400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 3757a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca/** 3767a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * Whether this format is a rgab8 variant. 3777a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * 3787a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * That is, any format that matches the 3797a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * 3807a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca * PIPE_FORMAT_?8?8?8?8_UNORM 3817a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca */ 3827a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonsecastatic INLINE boolean 3837a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonsecautil_format_is_rgba8_variant(const struct util_format_description *desc) 3847a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca{ 3857a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca unsigned chan; 3867a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca 3877a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca if(desc->block.width != 1 || 3887a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca desc->block.height != 1 || 3897a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca desc->block.bits != 32) 3907a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca return FALSE; 3917a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca 3927a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca for(chan = 0; chan < 4; ++chan) { 3937a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca if(desc->channel[chan].type != UTIL_FORMAT_TYPE_UNSIGNED && 3947a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca desc->channel[chan].type != UTIL_FORMAT_TYPE_VOID) 3957a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca return FALSE; 3967a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca if(desc->channel[chan].size != 8) 3977a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca return FALSE; 3987a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca } 3997a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca 4007a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca return TRUE; 4017a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca} 4027a26c875a9195587c408188ddc7d02a42dfde2bbJosé Fonseca 4036df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol 404cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/** 405a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return total bits needed for the pixel format per block. 406cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */ 407cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint 408b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksizebits(enum pipe_format format) 409cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{ 410cceeab39ea541b1be1521114316d660a77769c2aMichal Krol const struct util_format_description *desc = util_format_description(format); 411cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 412329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 413329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 414cceeab39ea541b1be1521114316d660a77769c2aMichal Krol return 0; 415cceeab39ea541b1be1521114316d660a77769c2aMichal Krol } 416cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 417a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller return desc->block.bits; 418cceeab39ea541b1be1521114316d660a77769c2aMichal Krol} 419cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 420cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/** 421a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return bytes per block (not pixel) for the given format. 422cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */ 423cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint 424b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksize(enum pipe_format format) 425cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{ 426b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol uint bits = util_format_get_blocksizebits(format); 427cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 428cceeab39ea541b1be1521114316d660a77769c2aMichal Krol assert(bits % 8 == 0); 429cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 430cceeab39ea541b1be1521114316d660a77769c2aMichal Krol return bits / 8; 431cceeab39ea541b1be1521114316d660a77769c2aMichal Krol} 432cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 433f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolstatic INLINE uint 434b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockwidth(enum pipe_format format) 435b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 436b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const struct util_format_description *desc = util_format_description(format); 437b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 438329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 439329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 440b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 1; 441b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol } 442b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 443816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return desc->block.width; 444b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 445b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 446b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint 447b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockheight(enum pipe_format format) 448b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 449b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const struct util_format_description *desc = util_format_description(format); 450b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 451329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca assert(desc); 452329814c6ee8a87d67a55ecf197af9d6e6fb7ade0José Fonseca if (!desc) { 453b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 1; 454b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol } 455b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 456816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return desc->block.height; 457b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 458b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 459b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned 460b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksx(enum pipe_format format, 461b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned x) 462b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 463b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned blockwidth = util_format_get_blockwidth(format); 464b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return (x + blockwidth - 1) / blockwidth; 465b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 466b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 467b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned 468b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksy(enum pipe_format format, 469b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned y) 470b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 471b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned blockheight = util_format_get_blockheight(format); 472b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return (y + blockheight - 1) / blockheight; 473b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 474b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 475b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned 476b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocks(enum pipe_format format, 477b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned width, 478b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned height) 479b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 480b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return util_format_get_nblocksx(format, width) * util_format_get_nblocksy(format, height); 481b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 482b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 483b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t 484b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_stride(enum pipe_format format, 485b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned width) 486b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 487b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return util_format_get_nblocksx(format, width) * util_format_get_blocksize(format); 488b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 489b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 490b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t 491b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_2d_size(enum pipe_format format, 492b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol size_t stride, 493b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned height) 494b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 495b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return util_format_get_nblocksy(format, height) * stride; 496b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 497b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 498b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint 499f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolutil_format_get_component_bits(enum pipe_format format, 500f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol enum util_format_colorspace colorspace, 501f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol uint component) 502f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol{ 503f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol const struct util_format_description *desc = util_format_description(format); 504f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol enum util_format_colorspace desc_colorspace; 505f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 506f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol assert(format); 507f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (!format) { 508f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return 0; 509f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 510f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 511440fc5bf788201a265892ff2e12bf102e63a2896Michal Krol assert(component < 4); 512f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 513f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol /* Treat RGB and SRGB as equivalent. */ 514f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 515f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol colorspace = UTIL_FORMAT_COLORSPACE_RGB; 516f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 517f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 518f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB; 519f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } else { 520f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol desc_colorspace = desc->colorspace; 521f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 522f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 523f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (desc_colorspace != colorspace) { 524f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return 0; 525f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 526f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 527f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol switch (desc->swizzle[component]) { 528f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_X: 529f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[0].size; 530f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_Y: 531f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[1].size; 532f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_Z: 533f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[2].size; 534f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_W: 535f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[3].size; 536f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol default: 537f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return 0; 538f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 539f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol} 540f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 541c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolstatic INLINE boolean 542c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolutil_format_has_alpha(enum pipe_format format) 543c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol{ 544c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol const struct util_format_description *desc = util_format_description(format); 545c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 546c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol assert(format); 547c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol if (!format) { 548c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 549c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol } 550c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 551816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca switch (desc->colorspace) { 552816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca case UTIL_FORMAT_COLORSPACE_RGB: 553816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca case UTIL_FORMAT_COLORSPACE_SRGB: 554816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return desc->swizzle[3] != UTIL_FORMAT_SWIZZLE_1; 555816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca case UTIL_FORMAT_COLORSPACE_YUV: 556816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return FALSE; 557816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca case UTIL_FORMAT_COLORSPACE_ZS: 558c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 559c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol default: 560c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol assert(0); 561c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 562c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol } 563c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} 564c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 565c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger/** 566c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger * Return the number of components stored. 567c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger * Formats with block size != 1x1 will always have 1 component (the block). 568c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger */ 569c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheideggerstatic INLINE unsigned 570c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheideggerutil_format_get_nr_components(enum pipe_format format) 571c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger{ 572c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger const struct util_format_description *desc = util_format_description(format); 573e0f10a6fca34619f61c3533b68d89dcb1ff2627cRoland Scheidegger return desc->nr_channels; 574c2ad9e380121d43f8ac066b590f9929a56bd1b0fRoland Scheidegger} 5753400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 5763400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/* 5773400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format access functions. 5783400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */ 5793400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 5803d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 5813d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4f(enum pipe_format format, 5823d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca float *dst, unsigned dst_stride, 5833d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const void *src, unsigned src_stride, 5843d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 5853d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 5863d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 5873d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4f(enum pipe_format format, 5883d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const float *src, unsigned src_stride, 5893d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca void *dst, unsigned dst_stride, 5903d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 5913d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 5923d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 5933d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4ub(enum pipe_format format, 5943d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca uint8_t *dst, unsigned dst_stride, 5953d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const void *src, unsigned src_stride, 5963d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 5973d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 5983d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 5993d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4ub(enum pipe_format format, 6003d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const uint8_t *src, unsigned src_stride, 6013d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca void *dst, unsigned dst_stride, 6023d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 6033d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 60489ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca/* 60589ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca * Generic format conversion; 60689ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca */ 60789ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca 60889ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonsecavoid 60989ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonsecautil_format_translate(enum pipe_format dst_format, 61089ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca void *dst, unsigned dst_stride, 61189ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca unsigned dst_x, unsigned dst_y, 61289ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca enum pipe_format src_format, 61389ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca const void *src, unsigned src_stride, 61489ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca unsigned src_x, unsigned src_y, 61589ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca unsigned width, unsigned height); 61689ceb2f3c761d7287f5e2dca84d43dc16f400da0José Fonseca 617c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus 618c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} // extern "C" { 619c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif 620c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 62115422b2d99be074e1d6ac064b6f791245975da83José Fonseca#endif /* ! U_FORMAT_H */ 622