1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009-2010 Vmware, Inc.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef U_FORMAT_H
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define U_FORMAT_H
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_format.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" {
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Describe how to pack/unpack pixels into/from the prescribed format.
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX: This could be renamed to something like util_format_pack, or broke down
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in flags inside util_format_block that said exactly what we want.
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum util_format_layout {
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Formats with util_format_block::width == util_format_block::height == 1
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * that can be described as an ordinary data structure.
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_LAYOUT_PLAIN = 0,
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Formats with sub-sampled channels.
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * This is for formats like YVYU where there is less than one sample per
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * pixel.
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_LAYOUT_SUBSAMPLED = 3,
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * S3 Texture Compression formats.
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_LAYOUT_S3TC = 4,
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Red-Green Texture Compression formats.
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_LAYOUT_RGTC = 5,
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Ericsson Texture Compression
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_LAYOUT_ETC = 6,
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Everything else that doesn't fit in any of the above layouts.
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_LAYOUT_OTHER = 7
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct util_format_block
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Block width in pixels */
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned width;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Block height in pixels */
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned height;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Block size in bits */
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned bits;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum util_format_type {
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_TYPE_VOID = 0,
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_TYPE_UNSIGNED = 1,
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_TYPE_SIGNED = 2,
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_TYPE_FIXED = 3,
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_TYPE_FLOAT = 4
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum util_format_swizzle {
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_SWIZZLE_X = 0,
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_SWIZZLE_Y = 1,
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_SWIZZLE_Z = 2,
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_SWIZZLE_W = 3,
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_SWIZZLE_0 = 4,
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_SWIZZLE_1 = 5,
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_SWIZZLE_NONE = 6,
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_SWIZZLE_MAX = 7  /**< Number of enums counter (must be last) */
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum util_format_colorspace {
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_COLORSPACE_RGB = 0,
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_COLORSPACE_SRGB = 1,
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_COLORSPACE_YUV = 2,
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UTIL_FORMAT_COLORSPACE_ZS = 3
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct util_format_channel_description
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned type:5;        /**< UTIL_FORMAT_TYPE_x */
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned normalized:1;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned pure_integer:1;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned size:9;        /**< bits per channel */
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct util_format_description
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_format format;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *name;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Short name, striped of the prefix, lower case.
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *short_name;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Pixel block dimensions.
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct util_format_block block;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum util_format_layout layout;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * The number of channels.
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned nr_channels:3;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Whether all channels have the same number of (whole) bytes.
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned is_array:1;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Whether the pixel format can be described as a bitfield structure.
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * In particular:
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * - pixel depth must be 8, 16, or 32 bits;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * - all channels must be unsigned, signed, or void
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned is_bitmask:1;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Whether channels have mixed types (ignoring UTIL_FORMAT_TYPE_VOID).
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned is_mixed:1;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Input channel description.
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only valid for UTIL_FORMAT_LAYOUT_PLAIN formats.
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct util_format_channel_description channel[4];
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Output channel swizzle.
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * The order is either:
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * - RGBA
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * - YUV(A)
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * - ZS
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * depending on the colorspace.
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned char swizzle[4];
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Colorspace transformation.
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum util_format_colorspace colorspace;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Unpack pixel blocks to R8G8B8A8_UNORM.
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: strides are in bytes.
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for non-depth-stencil formats.
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*unpack_rgba_8unorm)(uint8_t *dst, unsigned dst_stride,
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         const uint8_t *src, unsigned src_stride,
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned width, unsigned height);
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Pack pixel blocks from R8G8B8A8_UNORM.
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: strides are in bytes.
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for non-depth-stencil formats.
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*pack_rgba_8unorm)(uint8_t *dst, unsigned dst_stride,
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const uint8_t *src, unsigned src_stride,
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       unsigned width, unsigned height);
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Fetch a single pixel (i, j) from a block.
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * XXX: Only defined for a very few select formats.
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*fetch_rgba_8unorm)(uint8_t *dst,
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const uint8_t *src,
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        unsigned i, unsigned j);
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Unpack pixel blocks to R32G32B32A32_FLOAT.
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: strides are in bytes.
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for non-depth-stencil formats.
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*unpack_rgba_float)(float *dst, unsigned dst_stride,
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const uint8_t *src, unsigned src_stride,
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        unsigned width, unsigned height);
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Pack pixel blocks from R32G32B32A32_FLOAT.
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: strides are in bytes.
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for non-depth-stencil formats.
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*pack_rgba_float)(uint8_t *dst, unsigned dst_stride,
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const float *src, unsigned src_stride,
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned width, unsigned height);
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Fetch a single pixel (i, j) from a block.
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for non-depth-stencil and non-integer formats.
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*fetch_rgba_float)(float *dst,
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const uint8_t *src,
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       unsigned i, unsigned j);
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Unpack pixels to Z32_UNORM.
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: strides are in bytes.
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for depth formats.
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*unpack_z_32unorm)(uint32_t *dst, unsigned dst_stride,
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const uint8_t *src, unsigned src_stride,
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       unsigned width, unsigned height);
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Pack pixels from Z32_FLOAT.
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: strides are in bytes.
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for depth formats.
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*pack_z_32unorm)(uint8_t *dst, unsigned dst_stride,
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const uint32_t *src, unsigned src_stride,
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     unsigned width, unsigned height);
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Unpack pixels to Z32_FLOAT.
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: strides are in bytes.
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for depth formats.
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*unpack_z_float)(float *dst, unsigned dst_stride,
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const uint8_t *src, unsigned src_stride,
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     unsigned width, unsigned height);
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Pack pixels from Z32_FLOAT.
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: strides are in bytes.
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for depth formats.
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*pack_z_float)(uint8_t *dst, unsigned dst_stride,
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   const float *src, unsigned src_stride,
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   unsigned width, unsigned height);
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Unpack pixels to S8_UINT.
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: strides are in bytes.
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for stencil formats.
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*unpack_s_8uint)(uint8_t *dst, unsigned dst_stride,
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const uint8_t *src, unsigned src_stride,
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     unsigned width, unsigned height);
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Pack pixels from S8_UINT.
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: strides are in bytes.
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for stencil formats.
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*pack_s_8uint)(uint8_t *dst, unsigned dst_stride,
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   const uint8_t *src, unsigned src_stride,
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   unsigned width, unsigned height);
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /**
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Unpack pixel blocks to R32G32B32A32_UINT.
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: strides are in bytes.
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for INT formats.
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*unpack_rgba_uint)(unsigned *dst, unsigned dst_stride,
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const uint8_t *src, unsigned src_stride,
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       unsigned width, unsigned height);
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*pack_rgba_uint)(uint8_t *dst, unsigned dst_stride,
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const unsigned *src, unsigned src_stride,
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     unsigned width, unsigned height);
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  /**
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Unpack pixel blocks to R32G32B32A32_SINT.
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Note: strides are in bytes.
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for INT formats.
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*unpack_rgba_sint)(signed *dst, unsigned dst_stride,
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const uint8_t *src, unsigned src_stride,
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       unsigned width, unsigned height);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*pack_rgba_sint)(uint8_t *dst, unsigned dst_stride,
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const int *src, unsigned src_stride,
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     unsigned width, unsigned height);
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Fetch a single pixel (i, j) from a block.
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for unsigned (pure) integer formats.
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*fetch_rgba_uint)(uint32_t *dst,
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const uint8_t *src,
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned i, unsigned j);
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /**
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Fetch a single pixel (i, j) from a block.
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Only defined for signed (pure) integer formats.
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (*fetch_rgba_sint)(int32_t *dst,
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const uint8_t *src,
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned i, unsigned j);
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern const struct util_format_description
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_description_table[];
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct util_format_description *
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_description(enum pipe_format format);
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Format query functions.
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE const char *
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_name(enum pipe_format format)
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(desc);
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!desc) {
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return "PIPE_FORMAT_???";
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return desc->name;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE const char *
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_short_name(enum pipe_format format)
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(desc);
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!desc) {
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return "???";
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return desc->short_name;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whether this format is plain, see UTIL_FORMAT_LAYOUT_PLAIN for more info.
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_plain(enum pipe_format format)
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!format) {
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return desc->layout == UTIL_FORMAT_LAYOUT_PLAIN ? TRUE : FALSE;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_compressed(enum pipe_format format)
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(desc);
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!desc) {
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (desc->layout) {
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_LAYOUT_S3TC:
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_LAYOUT_RGTC:
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* XXX add other formats in the future */
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TRUE;
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_s3tc(enum pipe_format format)
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(desc);
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!desc) {
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return desc->layout == UTIL_FORMAT_LAYOUT_S3TC ? TRUE : FALSE;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_srgb(enum pipe_format format)
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB;
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_has_depth(const struct util_format_description *desc)
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS &&
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE;
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_has_stencil(const struct util_format_description *desc)
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS &&
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE;
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_depth_or_stencil(enum pipe_format format)
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(desc);
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!desc) {
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return util_format_has_depth(desc) ||
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          util_format_has_stencil(desc);
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_depth_and_stencil(enum pipe_format format)
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(desc);
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!desc) {
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return util_format_has_depth(desc) &&
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          util_format_has_stencil(desc);
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Give the RGBA colormask of the channels that can be represented in this
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * format.
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * That is, the channels whose values are preserved.
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_colormask(const struct util_format_description *desc)
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned colormask;
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned chan;
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (desc->colorspace) {
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_COLORSPACE_RGB:
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_COLORSPACE_SRGB:
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_COLORSPACE_YUV:
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      colormask = 0;
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (chan = 0; chan < 4; ++chan) {
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (desc->swizzle[chan] < 4) {
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            colormask |= (1 << chan);
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return colormask;
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_COLORSPACE_ZS:
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Checks if color mask covers every channel for the specified format
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @param desc       a format description to check colormask with
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @param colormask  a bit mask for channels, matches format of PIPE_MASK_RGBA
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_colormask_full(const struct util_format_description *desc, unsigned colormask)
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (~colormask & util_format_colormask(desc)) == 0;
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_float(enum pipe_format format);
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_rgb_no_alpha(enum pipe_format format);
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_luminance(enum pipe_format format);
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_luminance_alpha(enum pipe_format format);
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_intensity(enum pipe_format format);
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_pure_integer(enum pipe_format format);
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_pure_sint(enum pipe_format format);
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_pure_uint(enum pipe_format format);
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whether the format is a simple array format where all channels
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are of the same type and can be loaded from memory as a vector
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_array(const struct util_format_description *desc);
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if the src format can be blitted to the destination format with
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a simple memcpy.  For example, blitting from RGBA to RGBx is OK, but not
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the reverse.
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_is_format_compatible(const struct util_format_description *src_desc,
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          const struct util_format_description *dst_desc);
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whether the format is supported by Gallium for the given bindings.
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This covers S3TC textures and floating-point render targets.
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_supported(enum pipe_format format, unsigned bind);
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whether this format is a rgab8 variant.
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * That is, any format that matches the
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *   PIPE_FORMAT_?8?8?8?8_UNORM
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_rgba8_variant(const struct util_format_description *desc)
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned chan;
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(desc->block.width != 1 ||
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      desc->block.height != 1 ||
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      desc->block.bits != 32)
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for(chan = 0; chan < 4; ++chan) {
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(desc->channel[chan].type != UTIL_FORMAT_TYPE_UNSIGNED &&
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         desc->channel[chan].type != UTIL_FORMAT_TYPE_VOID)
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if(desc->channel[chan].size != 8)
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return total bits needed for the pixel format per block.
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_blocksizebits(enum pipe_format format)
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(desc);
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!desc) {
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return desc->block.bits;
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return bytes per block (not pixel) for the given format.
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_blocksize(enum pipe_format format)
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint bits = util_format_get_blocksizebits(format);
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(bits % 8 == 0);
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return bits / 8;
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_blockwidth(enum pipe_format format)
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(desc);
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!desc) {
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 1;
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return desc->block.width;
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_blockheight(enum pipe_format format)
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(desc);
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!desc) {
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 1;
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return desc->block.height;
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_nblocksx(enum pipe_format format,
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned x)
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned blockwidth = util_format_get_blockwidth(format);
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (x + blockwidth - 1) / blockwidth;
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_nblocksy(enum pipe_format format,
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         unsigned y)
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned blockheight = util_format_get_blockheight(format);
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (y + blockheight - 1) / blockheight;
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_nblocks(enum pipe_format format,
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        unsigned width,
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        unsigned height)
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return util_format_get_nblocksx(format, width) * util_format_get_nblocksy(format, height);
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE size_t
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_stride(enum pipe_format format,
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       unsigned width)
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return util_format_get_nblocksx(format, width) * util_format_get_blocksize(format);
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE size_t
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_2d_size(enum pipe_format format,
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        size_t stride,
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        unsigned height)
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return util_format_get_nblocksy(format, height) * stride;
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_component_bits(enum pipe_format format,
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               enum util_format_colorspace colorspace,
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               uint component)
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum util_format_colorspace desc_colorspace;
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(format);
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!format) {
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(component < 4);
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Treat RGB and SRGB as equivalent. */
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      colorspace = UTIL_FORMAT_COLORSPACE_RGB;
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB;
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      desc_colorspace = desc->colorspace;
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (desc_colorspace != colorspace) {
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (desc->swizzle[component]) {
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_SWIZZLE_X:
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return desc->channel[0].size;
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_SWIZZLE_Y:
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return desc->channel[1].size;
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_SWIZZLE_Z:
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return desc->channel[2].size;
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_SWIZZLE_W:
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return desc->channel[3].size;
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_has_alpha(enum pipe_format format)
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(format);
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!format) {
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (desc->colorspace) {
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_COLORSPACE_RGB:
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_COLORSPACE_SRGB:
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return desc->swizzle[3] != UTIL_FORMAT_SWIZZLE_1;
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_COLORSPACE_YUV:
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case UTIL_FORMAT_COLORSPACE_ZS:
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given a linear RGB colorspace format, return the corresponding SRGB
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * format, or PIPE_FORMAT_NONE if none.
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE enum pipe_format
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_srgb(enum pipe_format format)
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_L8_UNORM:
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_L8_SRGB;
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_L8A8_UNORM:
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_L8A8_SRGB;
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_R8G8B8_UNORM:
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_R8G8B8_SRGB;
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_A8B8G8R8_UNORM:
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_A8B8G8R8_SRGB;
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_X8B8G8R8_UNORM:
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_X8B8G8R8_SRGB;
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_B8G8R8A8_UNORM:
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_B8G8R8A8_SRGB;
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_B8G8R8X8_UNORM:
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_B8G8R8X8_SRGB;
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_A8R8G8B8_UNORM:
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_A8R8G8B8_SRGB;
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_X8R8G8B8_UNORM:
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_X8R8G8B8_SRGB;
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_DXT1_RGB:
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_DXT1_SRGB;
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_DXT1_RGBA:
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_DXT1_SRGBA;
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_DXT3_RGBA:
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_DXT3_SRGBA;
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_DXT5_RGBA:
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_DXT5_SRGBA;
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_NONE;
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given an sRGB format, return the corresponding linear colorspace format.
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For non sRGB formats, return the format unchanged.
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE enum pipe_format
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_linear(enum pipe_format format)
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_L8_SRGB:
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_L8_UNORM;
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_L8A8_SRGB:
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_L8A8_UNORM;
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_R8G8B8_SRGB:
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_R8G8B8_UNORM;
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_A8B8G8R8_SRGB:
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_A8B8G8R8_UNORM;
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_X8B8G8R8_SRGB:
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_X8B8G8R8_UNORM;
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_B8G8R8A8_SRGB:
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_B8G8R8A8_UNORM;
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_B8G8R8X8_SRGB:
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_B8G8R8X8_UNORM;
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_A8R8G8B8_SRGB:
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_A8R8G8B8_UNORM;
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_X8R8G8B8_SRGB:
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_X8R8G8B8_UNORM;
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_DXT1_SRGB:
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_DXT1_RGB;
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_DXT1_SRGBA:
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_DXT1_RGBA;
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_DXT3_SRGBA:
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_DXT3_RGBA;
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_DXT5_SRGBA:
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_DXT5_RGBA;
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return format;
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given a depth-stencil format, return the corresponding stencil-only format.
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For stencil-only formats, return the format unchanged.
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE enum pipe_format
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_stencil_only(enum pipe_format format)
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* mask out the depth component */
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_Z24_UNORM_S8_UINT:
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_X24S8_UINT;
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_S8_UINT_Z24_UNORM:
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_S8X24_UINT;
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_X32_S8X24_UINT;
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* stencil only formats */
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_X24S8_UINT:
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_S8X24_UINT:
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_X32_S8X24_UINT:
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case PIPE_FORMAT_S8_UINT:
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return format;
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PIPE_FORMAT_NONE;
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the number of components stored.
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Formats with block size != 1x1 will always have 1 component (the block).
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_nr_components(enum pipe_format format)
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return desc->nr_channels;
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the index of the first non-void channel
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * -1 if no non-void channels
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_first_non_void_channel(enum pipe_format format)
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct util_format_description *desc = util_format_description(format);
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 4; i++)
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID)
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i == 4)
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       return -1;
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return i;
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Format access functions.
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_read_4f(enum pipe_format format,
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    float *dst, unsigned dst_stride,
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    const void *src, unsigned src_stride,
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    unsigned x, unsigned y, unsigned w, unsigned h);
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_write_4f(enum pipe_format format,
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const float *src, unsigned src_stride,
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     void *dst, unsigned dst_stride,
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     unsigned x, unsigned y, unsigned w, unsigned h);
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_read_4ub(enum pipe_format format,
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     uint8_t *dst, unsigned dst_stride,
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const void *src, unsigned src_stride,
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     unsigned x, unsigned y, unsigned w, unsigned h);
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_write_4ub(enum pipe_format format,
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const uint8_t *src, unsigned src_stride,
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      void *dst, unsigned dst_stride,
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned x, unsigned y, unsigned w, unsigned h);
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_read_4ui(enum pipe_format format,
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     unsigned *dst, unsigned dst_stride,
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const void *src, unsigned src_stride,
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     unsigned x, unsigned y, unsigned w, unsigned h);
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_write_4ui(enum pipe_format format,
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const unsigned int *src, unsigned src_stride,
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      void *dst, unsigned dst_stride,
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned x, unsigned y, unsigned w, unsigned h);
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_read_4i(enum pipe_format format,
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    int *dst, unsigned dst_stride,
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    const void *src, unsigned src_stride,
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    unsigned x, unsigned y, unsigned w, unsigned h);
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_write_4i(enum pipe_format format,
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const int *src, unsigned src_stride,
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     void *dst, unsigned dst_stride,
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     unsigned x, unsigned y, unsigned w, unsigned h);
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Generic format conversion;
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_fits_8unorm(const struct util_format_description *format_desc);
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_translate(enum pipe_format dst_format,
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      void *dst, unsigned dst_stride,
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned dst_x, unsigned dst_y,
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      enum pipe_format src_format,
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const void *src, unsigned src_stride,
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned src_x, unsigned src_y,
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      unsigned width, unsigned height);
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Swizzle operations.
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Compose two sets of swizzles.
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If V is a 4D vector and the function parameters represent functions that
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * swizzle vector components, this holds:
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *     swz2(swz1(V)) = dst(V)
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_format_compose_swizzles(const unsigned char swz1[4],
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  const unsigned char swz2[4],
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  unsigned char dst[4]);
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_format_swizzle_4f(float *dst, const float *src,
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            const unsigned char swz[4]);
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_format_unswizzle_4f(float *dst, const float *src,
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              const unsigned char swz[4]);
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // extern "C" {
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* ! U_FORMAT_H */
1036