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