u_format.h revision 4afae877e6914e311340e0b1d3490ec2fed9422f
115422b2d99be074e1d6ac064b6f791245975da83José Fonseca/************************************************************************** 215422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 3816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Copyright 2009-2010 Vmware, Inc. 415422b2d99be074e1d6ac064b6f791245975da83José Fonseca * All Rights Reserved. 515422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 615422b2d99be074e1d6ac064b6f791245975da83José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 715422b2d99be074e1d6ac064b6f791245975da83José Fonseca * copy of this software and associated documentation files (the 815422b2d99be074e1d6ac064b6f791245975da83José Fonseca * "Software"), to deal in the Software without restriction, including 915422b2d99be074e1d6ac064b6f791245975da83José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 1015422b2d99be074e1d6ac064b6f791245975da83José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 1115422b2d99be074e1d6ac064b6f791245975da83José Fonseca * permit persons to whom the Software is furnished to do so, subject to 1215422b2d99be074e1d6ac064b6f791245975da83José Fonseca * the following conditions: 1315422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 1415422b2d99be074e1d6ac064b6f791245975da83José Fonseca * The above copyright notice and this permission notice (including the 1515422b2d99be074e1d6ac064b6f791245975da83José Fonseca * next paragraph) shall be included in all copies or substantial portions 1615422b2d99be074e1d6ac064b6f791245975da83José Fonseca * of the Software. 1715422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 1815422b2d99be074e1d6ac064b6f791245975da83José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1915422b2d99be074e1d6ac064b6f791245975da83José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2015422b2d99be074e1d6ac064b6f791245975da83José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2115422b2d99be074e1d6ac064b6f791245975da83José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 2215422b2d99be074e1d6ac064b6f791245975da83José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2315422b2d99be074e1d6ac064b6f791245975da83José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2415422b2d99be074e1d6ac064b6f791245975da83José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2515422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 2615422b2d99be074e1d6ac064b6f791245975da83José Fonseca **************************************************************************/ 2715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 2815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 2915422b2d99be074e1d6ac064b6f791245975da83José Fonseca#ifndef U_FORMAT_H 3015422b2d99be074e1d6ac064b6f791245975da83José Fonseca#define U_FORMAT_H 3115422b2d99be074e1d6ac064b6f791245975da83José Fonseca 3215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 3315422b2d99be074e1d6ac064b6f791245975da83José Fonseca#include "pipe/p_format.h" 34ad9cc55bed64af71f16b0be89af7d0a76b73ef91José Fonseca#include "util/u_debug.h" 3515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 36c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus 37c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolextern "C" { 38c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif 39c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 4015422b2d99be074e1d6ac064b6f791245975da83José Fonseca 4159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca/** 42816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Describe how to pack/unpack pixels into/from the prescribed format. 4359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * 44816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * XXX: This could be renamed to something like util_format_pack, or broke down 45816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * in flags inside util_format_block that said exactly what we want. 4659f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 4715422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_layout { 4859f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 49816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Formats with util_format_block::width == util_format_block::height == 1 50816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * that can be described as an ordinary data structure. 5159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 52816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca UTIL_FORMAT_LAYOUT_PLAIN = 0, 5359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca 5459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 55816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Formats with sub-sampled channels. 56816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * 57816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * This is for formats like YV12 where there is less than one sample per 58816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * pixel. 59816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * 60816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * XXX: This could actually b 6159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 62816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca UTIL_FORMAT_LAYOUT_SUBSAMPLED = 3, 6359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca 6459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 65816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * An unspecified compression algorithm. 6659f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 67816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca UTIL_FORMAT_LAYOUT_COMPRESSED = 4 6815422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 6915422b2d99be074e1d6ac064b6f791245975da83José Fonseca 7015422b2d99be074e1d6ac064b6f791245975da83José Fonseca 7115422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_block 7215422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 7315422b2d99be074e1d6ac064b6f791245975da83José Fonseca /** Block width in pixels */ 7415422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned width; 7515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 7615422b2d99be074e1d6ac064b6f791245975da83José Fonseca /** Block height in pixels */ 7715422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned height; 7815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 796df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol /** Block size in bits */ 8015422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned bits; 8115422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 8215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 8315422b2d99be074e1d6ac064b6f791245975da83José Fonseca 8415422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_type { 8515422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_VOID = 0, 8615422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_UNSIGNED = 1, 8715422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_SIGNED = 2, 8815422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_FIXED = 3, 8915422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_FLOAT = 4 9015422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 9115422b2d99be074e1d6ac064b6f791245975da83José Fonseca 9215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 9315422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_swizzle { 9415422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_X = 0, 9515422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_Y = 1, 9615422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_Z = 2, 9715422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_W = 3, 9815422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_0 = 4, 9915422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_1 = 5, 10015422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_NONE = 6 10115422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 10215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 10315422b2d99be074e1d6ac064b6f791245975da83José Fonseca 10415422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_colorspace { 10515422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_COLORSPACE_RGB = 0, 10642b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_COLORSPACE_SRGB = 1, 10742b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_COLORSPACE_YUV = 2, 108e4069d07ddd8c2afa5378e54710e19e7517d43d6Keith Whitwell UTIL_FORMAT_COLORSPACE_ZS = 3 10915422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 11015422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11115422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11215422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_channel_description 11315422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 11415422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned type:6; 11515422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned normalized:1; 11615422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned size:9; 11715422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 11815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11915422b2d99be074e1d6ac064b6f791245975da83José Fonseca 12015422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_description 12115422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 12215422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum pipe_format format; 1234afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca 12415422b2d99be074e1d6ac064b6f791245975da83José Fonseca const char *name; 125816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca 126816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca /** 1274afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca * Short name, striped of the prefix, lower case. 1284afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca */ 1294afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca const char *short_name; 1304afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca 1314afae877e6914e311340e0b1d3490ec2fed9422fJosé Fonseca /** 132816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Pixel block dimensions. 133816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca */ 13415422b2d99be074e1d6ac064b6f791245975da83José Fonseca struct util_format_block block; 135816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca 13615422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum util_format_layout layout; 1375dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 1385dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca /** 1395dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca * The number of channels. 1405dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca */ 1415dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca unsigned nr_channels:3; 1425dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 1435dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca /** 144816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Whether all channels have the same number of (whole) bytes. 1455dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca */ 1465dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca unsigned is_array:1; 1475dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 1485dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca /** 1495dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca * Whether channels have mixed types (ignoring UTIL_FORMAT_TYPE_VOID). 1505dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca */ 1515dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca unsigned is_mixed:1; 1525dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 153816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca /** 154816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Input channel description. 155816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * 156816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Only valid for UTIL_FORMAT_LAYOUT_PLAIN formats. 157816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca */ 15815422b2d99be074e1d6ac064b6f791245975da83José Fonseca struct util_format_channel_description channel[4]; 1595dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 160816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca /** 161816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Output channel swizzle. 162816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * 163816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * The order is either: 164816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * - RGBA 165816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * - YUV(A) 166816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * - ZS 167816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * depending on the colorspace. 168816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca */ 16915422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned char swizzle[4]; 1705dce9b252b65102ed69956fdd47862d5cb1c4af1José Fonseca 171816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca /** 172816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca * Colorspace transformation. 173816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca */ 17415422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum util_format_colorspace colorspace; 17515422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 17615422b2d99be074e1d6ac064b6f791245975da83José Fonseca 17715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 17815422b2d99be074e1d6ac064b6f791245975da83José Fonsecaextern const struct util_format_description 17915422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description_table[]; 18015422b2d99be074e1d6ac064b6f791245975da83José Fonseca 18115422b2d99be074e1d6ac064b6f791245975da83José Fonseca 18215422b2d99be074e1d6ac064b6f791245975da83José Fonsecaconst struct util_format_description * 18315422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description(enum pipe_format format); 18415422b2d99be074e1d6ac064b6f791245975da83José Fonseca 18515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 1863400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/* 1873400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format query functions. 1883400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */ 1893400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 1905784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecastatic INLINE const char * 1915784381b1e8a7f7535bbd5cc1672770026662bb0José Fonsecautil_format_name(enum pipe_format format) 1925784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca{ 1935784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca const struct util_format_description *desc = util_format_description(format); 1945784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca 1955784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca assert(format); 1965784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca if (!format) { 1975784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca return "???"; 1985784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca } 1995784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca 2005784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca return desc->name; 2015784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca} 2025784381b1e8a7f7535bbd5cc1672770026662bb0José Fonseca 2033400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolstatic INLINE boolean 2043400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolutil_format_is_compressed(enum pipe_format format) 2053400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol{ 2063400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol const struct util_format_description *desc = util_format_description(format); 2073400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 2083400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol assert(format); 2093400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol if (!format) { 2103400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol return FALSE; 2113400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol } 2123400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 213816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return desc->layout == UTIL_FORMAT_LAYOUT_COMPRESSED ? TRUE : FALSE; 214d28740c298968303500a8c43047ded2679e727acMichal Krol} 215d28740c298968303500a8c43047ded2679e727acMichal Krol 216d28740c298968303500a8c43047ded2679e727acMichal Krolstatic INLINE boolean 217d28740c298968303500a8c43047ded2679e727acMichal Krolutil_format_is_depth_or_stencil(enum pipe_format format) 218d28740c298968303500a8c43047ded2679e727acMichal Krol{ 219d28740c298968303500a8c43047ded2679e727acMichal Krol const struct util_format_description *desc = util_format_description(format); 220d28740c298968303500a8c43047ded2679e727acMichal Krol 221d28740c298968303500a8c43047ded2679e727acMichal Krol assert(format); 222d28740c298968303500a8c43047ded2679e727acMichal Krol if (!format) { 223d28740c298968303500a8c43047ded2679e727acMichal Krol return FALSE; 224d28740c298968303500a8c43047ded2679e727acMichal Krol } 225d28740c298968303500a8c43047ded2679e727acMichal Krol 226d28740c298968303500a8c43047ded2679e727acMichal Krol return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS ? TRUE : FALSE; 2270bed834be4a174d20b31a6cbcf066774bf749929Michal Krol} 2280bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 2290bed834be4a174d20b31a6cbcf066774bf749929Michal Krolstatic INLINE boolean 2300bed834be4a174d20b31a6cbcf066774bf749929Michal Krolutil_format_is_depth_and_stencil(enum pipe_format format) 2310bed834be4a174d20b31a6cbcf066774bf749929Michal Krol{ 2320bed834be4a174d20b31a6cbcf066774bf749929Michal Krol const struct util_format_description *desc = util_format_description(format); 2330bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 2340bed834be4a174d20b31a6cbcf066774bf749929Michal Krol assert(format); 2350bed834be4a174d20b31a6cbcf066774bf749929Michal Krol if (!format) { 2360bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return FALSE; 2370bed834be4a174d20b31a6cbcf066774bf749929Michal Krol } 2380bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 2390bed834be4a174d20b31a6cbcf066774bf749929Michal Krol if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) { 2400bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return FALSE; 2410bed834be4a174d20b31a6cbcf066774bf749929Michal Krol } 2420bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 2430bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return (desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE && 2440bed834be4a174d20b31a6cbcf066774bf749929Michal Krol desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE) ? TRUE : FALSE; 2453400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol} 2463400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 2476df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol 248cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/** 249a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return total bits needed for the pixel format per block. 250cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */ 251cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint 252b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksizebits(enum pipe_format format) 253cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{ 254cceeab39ea541b1be1521114316d660a77769c2aMichal Krol const struct util_format_description *desc = util_format_description(format); 255cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 256cceeab39ea541b1be1521114316d660a77769c2aMichal Krol assert(format); 257cceeab39ea541b1be1521114316d660a77769c2aMichal Krol if (!format) { 258cceeab39ea541b1be1521114316d660a77769c2aMichal Krol return 0; 259cceeab39ea541b1be1521114316d660a77769c2aMichal Krol } 260cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 261a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller return desc->block.bits; 262cceeab39ea541b1be1521114316d660a77769c2aMichal Krol} 263cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 264cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/** 265a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return bytes per block (not pixel) for the given format. 266cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */ 267cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint 268b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksize(enum pipe_format format) 269cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{ 270b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol uint bits = util_format_get_blocksizebits(format); 271cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 272cceeab39ea541b1be1521114316d660a77769c2aMichal Krol assert(bits % 8 == 0); 273cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 274cceeab39ea541b1be1521114316d660a77769c2aMichal Krol return bits / 8; 275cceeab39ea541b1be1521114316d660a77769c2aMichal Krol} 276cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 277f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolstatic INLINE uint 278b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockwidth(enum pipe_format format) 279b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 280b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const struct util_format_description *desc = util_format_description(format); 281b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 282b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(format); 283b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol if (!format) { 284b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 1; 285b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol } 286b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 287816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return desc->block.width; 288b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 289b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 290b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint 291b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockheight(enum pipe_format format) 292b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 293b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const struct util_format_description *desc = util_format_description(format); 294b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 295b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(format); 296b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol if (!format) { 297b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 1; 298b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol } 299b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 300816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return desc->block.height; 301b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 302b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 303b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned 304b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksx(enum pipe_format format, 305b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned x) 306b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 307b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned blockwidth = util_format_get_blockwidth(format); 308b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return (x + blockwidth - 1) / blockwidth; 309b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 310b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 311b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned 312b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksy(enum pipe_format format, 313b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned y) 314b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 315b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned blockheight = util_format_get_blockheight(format); 316b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return (y + blockheight - 1) / blockheight; 317b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 318b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 319b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned 320b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocks(enum pipe_format format, 321b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned width, 322b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned height) 323b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 324b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return util_format_get_nblocksx(format, width) * util_format_get_nblocksy(format, height); 325b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 326b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 327b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t 328b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_stride(enum pipe_format format, 329b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned width) 330b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 331b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return util_format_get_nblocksx(format, width) * util_format_get_blocksize(format); 332b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 333b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 334b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t 335b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_2d_size(enum pipe_format format, 336b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol size_t stride, 337b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned height) 338b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 339b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return util_format_get_nblocksy(format, height) * stride; 340b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 341b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 342b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint 343f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolutil_format_get_component_bits(enum pipe_format format, 344f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol enum util_format_colorspace colorspace, 345f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol uint component) 346f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol{ 347f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol const struct util_format_description *desc = util_format_description(format); 348f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol enum util_format_colorspace desc_colorspace; 349f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 350f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol assert(format); 351f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (!format) { 352f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return 0; 353f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 354f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 355440fc5bf788201a265892ff2e12bf102e63a2896Michal Krol assert(component < 4); 356f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 357f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol /* Treat RGB and SRGB as equivalent. */ 358f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 359f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol colorspace = UTIL_FORMAT_COLORSPACE_RGB; 360f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 361f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 362f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB; 363f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } else { 364f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol desc_colorspace = desc->colorspace; 365f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 366f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 367f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (desc_colorspace != colorspace) { 368f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return 0; 369f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 370f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 371f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol switch (desc->swizzle[component]) { 372f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_X: 373f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[0].size; 374f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_Y: 375f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[1].size; 376f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_Z: 377f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[2].size; 378f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_W: 379f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[3].size; 380f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol default: 381f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return 0; 382f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 383f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol} 384f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 385c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolstatic INLINE boolean 386c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolutil_format_has_alpha(enum pipe_format format) 387c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol{ 388c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol const struct util_format_description *desc = util_format_description(format); 389c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 390c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol assert(format); 391c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol if (!format) { 392c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 393c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol } 394c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 395816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca switch (desc->colorspace) { 396816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca case UTIL_FORMAT_COLORSPACE_RGB: 397816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca case UTIL_FORMAT_COLORSPACE_SRGB: 398816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return desc->swizzle[3] != UTIL_FORMAT_SWIZZLE_1; 399816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca case UTIL_FORMAT_COLORSPACE_YUV: 400816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca return FALSE; 401816d23505abbcd789e7390c515178bc0df8e49c4José Fonseca case UTIL_FORMAT_COLORSPACE_ZS: 402c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 403c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol default: 404c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol assert(0); 405c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 406c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol } 407c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} 408c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 4093400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 4103400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/* 4113400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format access functions. 4123400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */ 4133400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 4143d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 4153d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4f(enum pipe_format format, 4163d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca float *dst, unsigned dst_stride, 4173d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const void *src, unsigned src_stride, 4183d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 4193d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 4203d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 4213d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4f(enum pipe_format format, 4223d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const float *src, unsigned src_stride, 4233d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca void *dst, unsigned dst_stride, 4243d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 4253d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 4263d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 4273d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4ub(enum pipe_format format, 4283d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca uint8_t *dst, unsigned dst_stride, 4293d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const void *src, unsigned src_stride, 4303d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 4313d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 4323d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 4333d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4ub(enum pipe_format format, 4343d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const uint8_t *src, unsigned src_stride, 4353d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca void *dst, unsigned dst_stride, 4363d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 4373d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 438c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus 439c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} // extern "C" { 440c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif 441c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 44215422b2d99be074e1d6ac064b6f791245975da83José Fonseca#endif /* ! U_FORMAT_H */ 443