u_format.h revision a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2
115422b2d99be074e1d6ac064b6f791245975da83José Fonseca/************************************************************************** 215422b2d99be074e1d6ac064b6f791245975da83José Fonseca * 315422b2d99be074e1d6ac064b6f791245975da83José Fonseca * Copyright 2009 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" 3415422b2d99be074e1d6ac064b6f791245975da83José Fonseca 35c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus 36c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolextern "C" { 37c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif 38c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 3915422b2d99be074e1d6ac064b6f791245975da83José Fonseca 4059f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca/** 4159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * Describe how to best pack/unpack pixels into/from the prescribed format. 4259f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * 4359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * These are used for automatic code generation of pixel packing and unpacking 4459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * routines (in compile time, e.g., u_format_access.py, or in runtime, like 4559f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * llvmpipe does). 4659f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * 4759f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * Thumb rule is: if you're not code generating pixel packing/unpacking then 4859f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * these are irrelevant for you. 4959f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * 5059f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * Note that this can be deduced from other values in util_format_description 5159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * structure. This is by design, to make code generation of pixel 5259f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * packing/unpacking/sampling routines simple and efficient. 5359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * 5459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * XXX: This should be renamed to something like util_format_pack. 5559f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 5615422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_layout { 5759f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 5859f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * Single scalar component. 5959f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 60dfdf83d714c0d32d9182eb3001cf642aa6cb5c87Michal Krol UTIL_FORMAT_LAYOUT_SCALAR = 0, 6159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca 6259f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 6359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * One or more components of mixed integer formats, arithmetically encoded 6459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * in a word up to 32bits. 6559f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 66dfdf83d714c0d32d9182eb3001cf642aa6cb5c87Michal Krol UTIL_FORMAT_LAYOUT_ARITH = 1, 6759f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca 6859f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 6959f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * One or more components, no mixed formats, each with equal power of two 7059f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * number of bytes. 7159f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 72dfdf83d714c0d32d9182eb3001cf642aa6cb5c87Michal Krol UTIL_FORMAT_LAYOUT_ARRAY = 2, 7359f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca 7459f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca /** 7559f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * XXX: Not used yet. These might go away and be replaced by a single entry, 7659f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * for formats where multiple pixels have to be 7759f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * read in order to determine a single pixel value (i.e., block.width > 1 7859f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca * || block.height > 1) 7959f6af51b858340139fe2139e2698fef8a5ad62fJosé Fonseca */ 80dfdf83d714c0d32d9182eb3001cf642aa6cb5c87Michal Krol UTIL_FORMAT_LAYOUT_YUV = 3, 81dfdf83d714c0d32d9182eb3001cf642aa6cb5c87Michal Krol UTIL_FORMAT_LAYOUT_DXT = 4 8215422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 8315422b2d99be074e1d6ac064b6f791245975da83José Fonseca 8415422b2d99be074e1d6ac064b6f791245975da83José Fonseca 8515422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_block 8615422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 8715422b2d99be074e1d6ac064b6f791245975da83José Fonseca /** Block width in pixels */ 8815422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned width; 8915422b2d99be074e1d6ac064b6f791245975da83José Fonseca 9015422b2d99be074e1d6ac064b6f791245975da83José Fonseca /** Block height in pixels */ 9115422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned height; 9215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 936df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol /** Block size in bits */ 9415422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned bits; 9515422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 9615422b2d99be074e1d6ac064b6f791245975da83José Fonseca 9715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 9815422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_type { 9915422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_VOID = 0, 10015422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_UNSIGNED = 1, 10115422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_SIGNED = 2, 10215422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_FIXED = 3, 10315422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_FLOAT = 4 10415422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 10515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 10615422b2d99be074e1d6ac064b6f791245975da83José Fonseca 10715422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_swizzle { 10815422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_X = 0, 10915422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_Y = 1, 11015422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_Z = 2, 11115422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_W = 3, 11215422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_0 = 4, 11315422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_1 = 5, 11415422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_NONE = 6 11515422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 11615422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11815422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_colorspace { 11915422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_COLORSPACE_RGB = 0, 12042b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_COLORSPACE_SRGB = 1, 12142b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_COLORSPACE_YUV = 2, 12242b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_COLORSPACE_ZS = 3, 12315422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 12415422b2d99be074e1d6ac064b6f791245975da83José Fonseca 12515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 12615422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_channel_description 12715422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 12815422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned type:6; 12915422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned normalized:1; 13015422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned size:9; 13115422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 13215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 13315422b2d99be074e1d6ac064b6f791245975da83José Fonseca 13415422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_description 13515422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 13615422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum pipe_format format; 13715422b2d99be074e1d6ac064b6f791245975da83José Fonseca const char *name; 13815422b2d99be074e1d6ac064b6f791245975da83José Fonseca struct util_format_block block; 13915422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum util_format_layout layout; 14015422b2d99be074e1d6ac064b6f791245975da83José Fonseca struct util_format_channel_description channel[4]; 14115422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned char swizzle[4]; 14215422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum util_format_colorspace colorspace; 14315422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 14415422b2d99be074e1d6ac064b6f791245975da83José Fonseca 14515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 14615422b2d99be074e1d6ac064b6f791245975da83José Fonsecaextern const struct util_format_description 14715422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description_table[]; 14815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 14915422b2d99be074e1d6ac064b6f791245975da83José Fonseca 15015422b2d99be074e1d6ac064b6f791245975da83José Fonsecaconst struct util_format_description * 15115422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description(enum pipe_format format); 15215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 15315422b2d99be074e1d6ac064b6f791245975da83José Fonseca 1543400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/* 1553400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format query functions. 1563400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */ 1573400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 1583400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolstatic INLINE boolean 1593400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolutil_format_is_compressed(enum pipe_format format) 1603400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol{ 1613400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol const struct util_format_description *desc = util_format_description(format); 1623400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 1633400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol assert(format); 1643400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol if (!format) { 1653400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol return FALSE; 1663400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol } 1673400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 1683400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol return desc->layout == UTIL_FORMAT_LAYOUT_DXT ? TRUE : FALSE; 169d28740c298968303500a8c43047ded2679e727acMichal Krol} 170d28740c298968303500a8c43047ded2679e727acMichal Krol 171d28740c298968303500a8c43047ded2679e727acMichal Krolstatic INLINE boolean 172d28740c298968303500a8c43047ded2679e727acMichal Krolutil_format_is_depth_or_stencil(enum pipe_format format) 173d28740c298968303500a8c43047ded2679e727acMichal Krol{ 174d28740c298968303500a8c43047ded2679e727acMichal Krol const struct util_format_description *desc = util_format_description(format); 175d28740c298968303500a8c43047ded2679e727acMichal Krol 176d28740c298968303500a8c43047ded2679e727acMichal Krol assert(format); 177d28740c298968303500a8c43047ded2679e727acMichal Krol if (!format) { 178d28740c298968303500a8c43047ded2679e727acMichal Krol return FALSE; 179d28740c298968303500a8c43047ded2679e727acMichal Krol } 180d28740c298968303500a8c43047ded2679e727acMichal Krol 181d28740c298968303500a8c43047ded2679e727acMichal Krol return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS ? TRUE : FALSE; 1820bed834be4a174d20b31a6cbcf066774bf749929Michal Krol} 1830bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 1840bed834be4a174d20b31a6cbcf066774bf749929Michal Krolstatic INLINE boolean 1850bed834be4a174d20b31a6cbcf066774bf749929Michal Krolutil_format_is_depth_and_stencil(enum pipe_format format) 1860bed834be4a174d20b31a6cbcf066774bf749929Michal Krol{ 1870bed834be4a174d20b31a6cbcf066774bf749929Michal Krol const struct util_format_description *desc = util_format_description(format); 1880bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 1890bed834be4a174d20b31a6cbcf066774bf749929Michal Krol assert(format); 1900bed834be4a174d20b31a6cbcf066774bf749929Michal Krol if (!format) { 1910bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return FALSE; 1920bed834be4a174d20b31a6cbcf066774bf749929Michal Krol } 1930bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 1940bed834be4a174d20b31a6cbcf066774bf749929Michal Krol if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) { 1950bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return FALSE; 1960bed834be4a174d20b31a6cbcf066774bf749929Michal Krol } 1970bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 1980bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return (desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE && 1990bed834be4a174d20b31a6cbcf066774bf749929Michal Krol desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE) ? TRUE : FALSE; 2003400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol} 2013400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 2026df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol 203cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/** 204a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return total bits needed for the pixel format per block. 205cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */ 206cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint 207b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksizebits(enum pipe_format format) 208cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{ 209cceeab39ea541b1be1521114316d660a77769c2aMichal Krol const struct util_format_description *desc = util_format_description(format); 210cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 211cceeab39ea541b1be1521114316d660a77769c2aMichal Krol assert(format); 212cceeab39ea541b1be1521114316d660a77769c2aMichal Krol if (!format) { 213cceeab39ea541b1be1521114316d660a77769c2aMichal Krol return 0; 214cceeab39ea541b1be1521114316d660a77769c2aMichal Krol } 215cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 216a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller return desc->block.bits; 217cceeab39ea541b1be1521114316d660a77769c2aMichal Krol} 218cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 219cceeab39ea541b1be1521114316d660a77769c2aMichal Krol/** 220a6e663def416f73ea8c0c65e8ee6a4dfaaeffae2Christoph Bumiller * Return bytes per block (not pixel) for the given format. 221cceeab39ea541b1be1521114316d660a77769c2aMichal Krol */ 222cceeab39ea541b1be1521114316d660a77769c2aMichal Krolstatic INLINE uint 223b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blocksize(enum pipe_format format) 224cceeab39ea541b1be1521114316d660a77769c2aMichal Krol{ 225b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol uint bits = util_format_get_blocksizebits(format); 226cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 227cceeab39ea541b1be1521114316d660a77769c2aMichal Krol assert(bits % 8 == 0); 228cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 229cceeab39ea541b1be1521114316d660a77769c2aMichal Krol return bits / 8; 230cceeab39ea541b1be1521114316d660a77769c2aMichal Krol} 231cceeab39ea541b1be1521114316d660a77769c2aMichal Krol 232f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolstatic INLINE uint 233b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockwidth(enum pipe_format format) 234b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 235b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const struct util_format_description *desc = util_format_description(format); 236b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 237b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(format); 238b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol if (!format) { 239b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 1; 240b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol } 241b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 242b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol switch (desc->layout) { 243b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol case UTIL_FORMAT_LAYOUT_YUV: 244b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 2; 245b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol case UTIL_FORMAT_LAYOUT_DXT: 246b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 4; 247b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol default: 248b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 1; 249b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol } 250b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 251b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 252b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint 253b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_blockheight(enum pipe_format format) 254b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 255b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol const struct util_format_description *desc = util_format_description(format); 256b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 257b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol assert(format); 258b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol if (!format) { 259b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 1; 260b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol } 261b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 262b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol switch (desc->layout) { 263b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol case UTIL_FORMAT_LAYOUT_DXT: 264b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 4; 265b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol default: 266b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return 1; 267b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol } 268b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 269b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 270b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned 271b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksx(enum pipe_format format, 272b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned x) 273b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 274b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned blockwidth = util_format_get_blockwidth(format); 275b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return (x + blockwidth - 1) / blockwidth; 276b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 277b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 278b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned 279b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocksy(enum pipe_format format, 280b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned y) 281b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 282b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned blockheight = util_format_get_blockheight(format); 283b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return (y + blockheight - 1) / blockheight; 284b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 285b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 286b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE unsigned 287b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_nblocks(enum pipe_format format, 288b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned width, 289b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned height) 290b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 291b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return util_format_get_nblocksx(format, width) * util_format_get_nblocksy(format, height); 292b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 293b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 294b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t 295b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_stride(enum pipe_format format, 296b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned width) 297b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 298b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return util_format_get_nblocksx(format, width) * util_format_get_blocksize(format); 299b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 300b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 301b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE size_t 302b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolutil_format_get_2d_size(enum pipe_format format, 303b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol size_t stride, 304b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol unsigned height) 305b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol{ 306b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol return util_format_get_nblocksy(format, height) * stride; 307b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol} 308b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krol 309b1ed72ebe2599ec178f51d86fd42f26486b9a19bMichal Krolstatic INLINE uint 310f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krolutil_format_get_component_bits(enum pipe_format format, 311f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol enum util_format_colorspace colorspace, 312f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol uint component) 313f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol{ 314f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol const struct util_format_description *desc = util_format_description(format); 315f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol enum util_format_colorspace desc_colorspace; 316f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 317f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol assert(format); 318f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (!format) { 319f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return 0; 320f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 321f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 322440fc5bf788201a265892ff2e12bf102e63a2896Michal Krol assert(component < 4); 323f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 324f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol /* Treat RGB and SRGB as equivalent. */ 325f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 326f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol colorspace = UTIL_FORMAT_COLORSPACE_RGB; 327f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 328f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 329f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB; 330f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } else { 331f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol desc_colorspace = desc->colorspace; 332f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 333f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 334f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol if (desc_colorspace != colorspace) { 335f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return 0; 336f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 337f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 338f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol switch (desc->swizzle[component]) { 339f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_X: 340f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[0].size; 341f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_Y: 342f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[1].size; 343f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_Z: 344f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[2].size; 345f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol case UTIL_FORMAT_SWIZZLE_W: 346f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return desc->channel[3].size; 347f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol default: 348f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol return 0; 349f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol } 350f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol} 351f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol 352c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolstatic INLINE boolean 353c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krolutil_format_has_alpha(enum pipe_format format) 354c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol{ 355c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol const struct util_format_description *desc = util_format_description(format); 356c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 357c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol assert(format); 358c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol if (!format) { 359c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 360c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol } 361c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 362c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol switch (desc->layout) { 363c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol case UTIL_FORMAT_LAYOUT_SCALAR: 364c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol case UTIL_FORMAT_LAYOUT_ARITH: 365c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol case UTIL_FORMAT_LAYOUT_ARRAY: 366c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol /* FIXME: pf_get_component_bits( PIPE_FORMAT_A8L8_UNORM, PIPE_FORMAT_COMP_A ) should not return 0 right? */ 367c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol if (format == PIPE_FORMAT_A8_UNORM || 368c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol format == PIPE_FORMAT_A8L8_UNORM || 369c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol format == PIPE_FORMAT_A8L8_SRGB) { 370c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return TRUE; 371c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol } 372c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 3) != 0; 373c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol case UTIL_FORMAT_LAYOUT_YUV: 374c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 375c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol case UTIL_FORMAT_LAYOUT_DXT: 376c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol switch (format) { 377c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol case PIPE_FORMAT_DXT1_RGBA: 378c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol case PIPE_FORMAT_DXT3_RGBA: 379c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol case PIPE_FORMAT_DXT5_RGBA: 380c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol case PIPE_FORMAT_DXT1_SRGBA: 381c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol case PIPE_FORMAT_DXT3_SRGBA: 382c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol case PIPE_FORMAT_DXT5_SRGBA: 383c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return TRUE; 384c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol default: 385c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 386c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol } 387c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol default: 388c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol assert(0); 389c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol return FALSE; 390c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol } 391c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} 392c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 3933400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 3943400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/* 3953400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format access functions. 3963400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */ 3973400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 3983d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 3993d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4f(enum pipe_format format, 4003d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca float *dst, unsigned dst_stride, 4013d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const void *src, unsigned src_stride, 4023d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 4033d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 4043d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 4053d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4f(enum pipe_format format, 4063d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const float *src, unsigned src_stride, 4073d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca void *dst, unsigned dst_stride, 4083d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 4093d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 4103d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 4113d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4ub(enum pipe_format format, 4123d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca uint8_t *dst, unsigned dst_stride, 4133d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const void *src, unsigned src_stride, 4143d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 4153d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 4163d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 4173d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4ub(enum pipe_format format, 4183d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const uint8_t *src, unsigned src_stride, 4193d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca void *dst, unsigned dst_stride, 4203d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 4213d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 422c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#ifdef __cplusplus 423c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol} // extern "C" { 424c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol#endif 425c35e5c19e789329b506273de7f3cdcf28e28e112Michal Krol 42615422b2d99be074e1d6ac064b6f791245975da83José Fonseca#endif /* ! U_FORMAT_H */ 427