u_format.h revision 6df42d80234d13676fc3207cf44f0e371e3372b5
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 3515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 3615422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_layout { 3742b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_LAYOUT_SCALAR = 0, 3842b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_LAYOUT_ARITH = 1, 3942b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_LAYOUT_ARRAY = 2, 4042b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_LAYOUT_YUV = 3, 4142b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_LAYOUT_DXT = 4 4215422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 4315422b2d99be074e1d6ac064b6f791245975da83José Fonseca 4415422b2d99be074e1d6ac064b6f791245975da83José Fonseca 4515422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_block 4615422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 4715422b2d99be074e1d6ac064b6f791245975da83José Fonseca /** Block width in pixels */ 4815422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned width; 4915422b2d99be074e1d6ac064b6f791245975da83José Fonseca 5015422b2d99be074e1d6ac064b6f791245975da83José Fonseca /** Block height in pixels */ 5115422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned height; 5215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 536df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol /** Block size in bits */ 5415422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned bits; 5515422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 5615422b2d99be074e1d6ac064b6f791245975da83José Fonseca 5715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 5815422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_type { 5915422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_VOID = 0, 6015422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_UNSIGNED = 1, 6115422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_SIGNED = 2, 6215422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_FIXED = 3, 6315422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_TYPE_FLOAT = 4 6415422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 6515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 6615422b2d99be074e1d6ac064b6f791245975da83José Fonseca 6715422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_swizzle { 6815422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_X = 0, 6915422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_Y = 1, 7015422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_Z = 2, 7115422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_W = 3, 7215422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_0 = 4, 7315422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_1 = 5, 7415422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_SWIZZLE_NONE = 6 7515422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 7615422b2d99be074e1d6ac064b6f791245975da83José Fonseca 7715422b2d99be074e1d6ac064b6f791245975da83José Fonseca 7815422b2d99be074e1d6ac064b6f791245975da83José Fonsecaenum util_format_colorspace { 7915422b2d99be074e1d6ac064b6f791245975da83José Fonseca UTIL_FORMAT_COLORSPACE_RGB = 0, 8042b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_COLORSPACE_SRGB = 1, 8142b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_COLORSPACE_YUV = 2, 8242b15b26fd946c9511bd4bd5f23ec7e76e15507cJosé Fonseca UTIL_FORMAT_COLORSPACE_ZS = 3, 8315422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 8415422b2d99be074e1d6ac064b6f791245975da83José Fonseca 8515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 8615422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_channel_description 8715422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 8815422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned type:6; 8915422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned normalized:1; 9015422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned size:9; 9115422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 9215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 9315422b2d99be074e1d6ac064b6f791245975da83José Fonseca 9415422b2d99be074e1d6ac064b6f791245975da83José Fonsecastruct util_format_description 9515422b2d99be074e1d6ac064b6f791245975da83José Fonseca{ 9615422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum pipe_format format; 9715422b2d99be074e1d6ac064b6f791245975da83José Fonseca const char *name; 9815422b2d99be074e1d6ac064b6f791245975da83José Fonseca struct util_format_block block; 9915422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum util_format_layout layout; 10015422b2d99be074e1d6ac064b6f791245975da83José Fonseca struct util_format_channel_description channel[4]; 10115422b2d99be074e1d6ac064b6f791245975da83José Fonseca unsigned char swizzle[4]; 10215422b2d99be074e1d6ac064b6f791245975da83José Fonseca enum util_format_colorspace colorspace; 10315422b2d99be074e1d6ac064b6f791245975da83José Fonseca}; 10415422b2d99be074e1d6ac064b6f791245975da83José Fonseca 10515422b2d99be074e1d6ac064b6f791245975da83José Fonseca 10615422b2d99be074e1d6ac064b6f791245975da83José Fonsecaextern const struct util_format_description 10715422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description_table[]; 10815422b2d99be074e1d6ac064b6f791245975da83José Fonseca 10915422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11015422b2d99be074e1d6ac064b6f791245975da83José Fonsecaconst struct util_format_description * 11115422b2d99be074e1d6ac064b6f791245975da83José Fonsecautil_format_description(enum pipe_format format); 11215422b2d99be074e1d6ac064b6f791245975da83José Fonseca 11315422b2d99be074e1d6ac064b6f791245975da83José Fonseca 1143400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/* 1153400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format query functions. 1163400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */ 1173400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 1183400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolstatic INLINE boolean 1193400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krolutil_format_is_compressed(enum pipe_format format) 1203400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol{ 1213400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol const struct util_format_description *desc = util_format_description(format); 1223400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 1233400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol assert(format); 1243400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol if (!format) { 1253400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol return FALSE; 1263400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol } 1273400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 1283400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol return desc->layout == UTIL_FORMAT_LAYOUT_DXT ? TRUE : FALSE; 129d28740c298968303500a8c43047ded2679e727acMichal Krol} 130d28740c298968303500a8c43047ded2679e727acMichal Krol 131d28740c298968303500a8c43047ded2679e727acMichal Krolstatic INLINE boolean 132d28740c298968303500a8c43047ded2679e727acMichal Krolutil_format_is_depth_or_stencil(enum pipe_format format) 133d28740c298968303500a8c43047ded2679e727acMichal Krol{ 134d28740c298968303500a8c43047ded2679e727acMichal Krol const struct util_format_description *desc = util_format_description(format); 135d28740c298968303500a8c43047ded2679e727acMichal Krol 136d28740c298968303500a8c43047ded2679e727acMichal Krol assert(format); 137d28740c298968303500a8c43047ded2679e727acMichal Krol if (!format) { 138d28740c298968303500a8c43047ded2679e727acMichal Krol return FALSE; 139d28740c298968303500a8c43047ded2679e727acMichal Krol } 140d28740c298968303500a8c43047ded2679e727acMichal Krol 141d28740c298968303500a8c43047ded2679e727acMichal Krol return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS ? TRUE : FALSE; 1420bed834be4a174d20b31a6cbcf066774bf749929Michal Krol} 1430bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 1440bed834be4a174d20b31a6cbcf066774bf749929Michal Krolstatic INLINE boolean 1450bed834be4a174d20b31a6cbcf066774bf749929Michal Krolutil_format_is_depth_and_stencil(enum pipe_format format) 1460bed834be4a174d20b31a6cbcf066774bf749929Michal Krol{ 1470bed834be4a174d20b31a6cbcf066774bf749929Michal Krol const struct util_format_description *desc = util_format_description(format); 1480bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 1490bed834be4a174d20b31a6cbcf066774bf749929Michal Krol assert(format); 1500bed834be4a174d20b31a6cbcf066774bf749929Michal Krol if (!format) { 1510bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return FALSE; 1520bed834be4a174d20b31a6cbcf066774bf749929Michal Krol } 1530bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 1540bed834be4a174d20b31a6cbcf066774bf749929Michal Krol if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) { 1550bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return FALSE; 1560bed834be4a174d20b31a6cbcf066774bf749929Michal Krol } 1570bed834be4a174d20b31a6cbcf066774bf749929Michal Krol 1580bed834be4a174d20b31a6cbcf066774bf749929Michal Krol return (desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE && 1590bed834be4a174d20b31a6cbcf066774bf749929Michal Krol desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE) ? TRUE : FALSE; 1603400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol} 1613400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 1626df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol/** 1636df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol * Describe pixel format's block. 1646df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol * 1656df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol * @sa http://msdn2.microsoft.com/en-us/library/ms796147.aspx 1666df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol */ 1676df42d80234d13676fc3207cf44f0e371e3372b5Michal Krolstatic INLINE void 1686df42d80234d13676fc3207cf44f0e371e3372b5Michal Krolutil_format_get_block(enum pipe_format format, 1696df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol struct pipe_format_block *block) 1706df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol{ 1716df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol const struct util_format_description *desc = util_format_description(format); 1726df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol 1736df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol assert(format); 1746df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol if (!format) { 1756df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol block->size = 0; 1766df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol block->width = 1; 1776df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol block->height = 1; 1786df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol return; 1796df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol } 1806df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol 1816df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol block->size = desc->block.bits / 8; 1826df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol block->width = desc->block.width; 1836df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol block->height = desc->block.height; 1846df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol} 1856df42d80234d13676fc3207cf44f0e371e3372b5Michal Krol 1863400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 1873400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol/* 1883400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol * Format access functions. 1893400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol */ 1903400b668e35469d5dbba515e3a8b9d775fd2eff5Michal Krol 1913d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 1923d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4f(enum pipe_format format, 1933d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca float *dst, unsigned dst_stride, 1943d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const void *src, unsigned src_stride, 1953d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 1963d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 1973d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 1983d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4f(enum pipe_format format, 1993d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const float *src, unsigned src_stride, 2003d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca void *dst, unsigned dst_stride, 2013d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 2023d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 2033d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 2043d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_read_4ub(enum pipe_format format, 2053d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca uint8_t *dst, unsigned dst_stride, 2063d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const void *src, unsigned src_stride, 2073d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 2083d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 2093d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecavoid 2103d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonsecautil_format_write_4ub(enum pipe_format format, 2113d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca const uint8_t *src, unsigned src_stride, 2123d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca void *dst, unsigned dst_stride, 2133d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca unsigned x, unsigned y, unsigned w, unsigned h); 2143d305243938980af520c6d3e0ce02f4ee3a6126cJosé Fonseca 21515422b2d99be074e1d6ac064b6f791245975da83José Fonseca#endif /* ! U_FORMAT_H */ 216