blob: ffdd59243846409b59954077c1d0d409c0148122 [file] [log] [blame]
Chia-I Wub5a1add2014-08-16 12:46:32 +08001/*
Chia-I Wu44e42362014-09-02 08:32:09 +08002 * XGL
Chia-I Wub5a1add2014-08-16 12:46:32 +08003 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
26 */
27
Chia-I Wu92096a92014-12-21 23:07:08 +080028#include <string.h> /* for memcpy */
29#include "icd-utils.h"
Chia-I Wub5a1add2014-08-16 12:46:32 +080030#include "icd-format.h"
31
32static const struct icd_format_info {
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -060033 size_t size;
34 uint32_t channel_count;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -070035} icd_format_table[XGL_NUM_FMT] = {
36 [XGL_FMT_UNDEFINED] = { 0, 0 },
37 [XGL_FMT_R4G4_UNORM] = { 1, 2 },
38 [XGL_FMT_R4G4_USCALED] = { 1, 2 },
39 [XGL_FMT_R4G4B4A4_UNORM] = { 2, 4 },
40 [XGL_FMT_R4G4B4A4_USCALED] = { 2, 4 },
41 [XGL_FMT_R5G6B5_UNORM] = { 2, 3 },
42 [XGL_FMT_R5G6B5_USCALED] = { 2, 3 },
43 [XGL_FMT_R5G5B5A1_UNORM] = { 2, 4 },
44 [XGL_FMT_R5G5B5A1_USCALED] = { 2, 4 },
45 [XGL_FMT_R8_UNORM] = { 1, 1 },
46 [XGL_FMT_R8_SNORM] = { 1, 1 },
47 [XGL_FMT_R8_USCALED] = { 1, 1 },
48 [XGL_FMT_R8_SSCALED] = { 1, 1 },
49 [XGL_FMT_R8_UINT] = { 1, 1 },
50 [XGL_FMT_R8_SINT] = { 1, 1 },
51 [XGL_FMT_R8_SRGB] = { 1, 1 },
52 [XGL_FMT_R8G8_UNORM] = { 2, 2 },
53 [XGL_FMT_R8G8_SNORM] = { 2, 2 },
54 [XGL_FMT_R8G8_USCALED] = { 2, 2 },
55 [XGL_FMT_R8G8_SSCALED] = { 2, 2 },
56 [XGL_FMT_R8G8_UINT] = { 2, 2 },
57 [XGL_FMT_R8G8_SINT] = { 2, 2 },
58 [XGL_FMT_R8G8_SRGB] = { 2, 2 },
59 [XGL_FMT_R8G8B8_UNORM] = { 3, 3 },
60 [XGL_FMT_R8G8B8_SNORM] = { 3, 3 },
61 [XGL_FMT_R8G8B8_USCALED] = { 3, 3 },
62 [XGL_FMT_R8G8B8_SSCALED] = { 3, 3 },
63 [XGL_FMT_R8G8B8_UINT] = { 3, 3 },
64 [XGL_FMT_R8G8B8_SINT] = { 3, 3 },
65 [XGL_FMT_R8G8B8_SRGB] = { 3, 3 },
66 [XGL_FMT_R8G8B8A8_UNORM] = { 4, 4 },
67 [XGL_FMT_R8G8B8A8_SNORM] = { 4, 4 },
68 [XGL_FMT_R8G8B8A8_USCALED] = { 4, 4 },
69 [XGL_FMT_R8G8B8A8_SSCALED] = { 4, 4 },
70 [XGL_FMT_R8G8B8A8_UINT] = { 4, 4 },
71 [XGL_FMT_R8G8B8A8_SINT] = { 4, 4 },
72 [XGL_FMT_R8G8B8A8_SRGB] = { 4, 4 },
73 [XGL_FMT_R10G10B10A2_UNORM] = { 4, 4 },
74 [XGL_FMT_R10G10B10A2_SNORM] = { 4, 4 },
75 [XGL_FMT_R10G10B10A2_USCALED] = { 4, 4 },
76 [XGL_FMT_R10G10B10A2_SSCALED] = { 4, 4 },
77 [XGL_FMT_R10G10B10A2_UINT] = { 4, 4 },
78 [XGL_FMT_R10G10B10A2_SINT] = { 4, 4 },
79 [XGL_FMT_R16_UNORM] = { 2, 1 },
80 [XGL_FMT_R16_SNORM] = { 2, 1 },
81 [XGL_FMT_R16_USCALED] = { 2, 1 },
82 [XGL_FMT_R16_SSCALED] = { 2, 1 },
83 [XGL_FMT_R16_UINT] = { 2, 1 },
84 [XGL_FMT_R16_SINT] = { 2, 1 },
85 [XGL_FMT_R16_SFLOAT] = { 2, 1 },
86 [XGL_FMT_R16G16_UNORM] = { 4, 2 },
87 [XGL_FMT_R16G16_SNORM] = { 4, 2 },
88 [XGL_FMT_R16G16_USCALED] = { 4, 2 },
89 [XGL_FMT_R16G16_SSCALED] = { 4, 2 },
90 [XGL_FMT_R16G16_UINT] = { 4, 2 },
91 [XGL_FMT_R16G16_SINT] = { 4, 2 },
92 [XGL_FMT_R16G16_SFLOAT] = { 4, 2 },
93 [XGL_FMT_R16G16B16_UNORM] = { 6, 3 },
94 [XGL_FMT_R16G16B16_SNORM] = { 6, 3 },
95 [XGL_FMT_R16G16B16_USCALED] = { 6, 3 },
96 [XGL_FMT_R16G16B16_SSCALED] = { 6, 3 },
97 [XGL_FMT_R16G16B16_UINT] = { 6, 3 },
98 [XGL_FMT_R16G16B16_SINT] = { 6, 3 },
99 [XGL_FMT_R16G16B16_SFLOAT] = { 6, 3 },
100 [XGL_FMT_R16G16B16A16_UNORM] = { 8, 4 },
101 [XGL_FMT_R16G16B16A16_SNORM] = { 8, 4 },
102 [XGL_FMT_R16G16B16A16_USCALED] = { 8, 4 },
103 [XGL_FMT_R16G16B16A16_SSCALED] = { 8, 4 },
104 [XGL_FMT_R16G16B16A16_UINT] = { 8, 4 },
105 [XGL_FMT_R16G16B16A16_SINT] = { 8, 4 },
106 [XGL_FMT_R16G16B16A16_SFLOAT] = { 8, 4 },
107 [XGL_FMT_R32_UINT] = { 4, 1 },
108 [XGL_FMT_R32_SINT] = { 4, 1 },
109 [XGL_FMT_R32_SFLOAT] = { 4, 1 },
110 [XGL_FMT_R32G32_UINT] = { 8, 2 },
111 [XGL_FMT_R32G32_SINT] = { 8, 2 },
112 [XGL_FMT_R32G32_SFLOAT] = { 8, 2 },
113 [XGL_FMT_R32G32B32_UINT] = { 12, 3 },
114 [XGL_FMT_R32G32B32_SINT] = { 12, 3 },
115 [XGL_FMT_R32G32B32_SFLOAT] = { 12, 3 },
116 [XGL_FMT_R32G32B32A32_UINT] = { 16, 4 },
117 [XGL_FMT_R32G32B32A32_SINT] = { 16, 4 },
118 [XGL_FMT_R32G32B32A32_SFLOAT] = { 16, 4 },
119 [XGL_FMT_R64_SFLOAT] = { 8, 1 },
120 [XGL_FMT_R64G64_SFLOAT] = { 16, 2 },
121 [XGL_FMT_R64G64B64_SFLOAT] = { 24, 3 },
122 [XGL_FMT_R64G64B64A64_SFLOAT] = { 32, 4 },
123 [XGL_FMT_R11G11B10_UFLOAT] = { 4, 3 },
124 [XGL_FMT_R9G9B9E5_UFLOAT] = { 4, 3 },
125 [XGL_FMT_D16_UNORM] = { 2, 1 },
126 [XGL_FMT_D24_UNORM] = { 3, 1 },
127 [XGL_FMT_D32_SFLOAT] = { 4, 1 },
128 [XGL_FMT_S8_UINT] = { 1, 1 },
129 [XGL_FMT_D16_UNORM_S8_UINT] = { 3, 2 },
130 [XGL_FMT_D24_UNORM_S8_UINT] = { 4, 2 },
131 [XGL_FMT_D32_SFLOAT_S8_UINT] = { 4, 2 },
132 [XGL_FMT_BC1_UNORM] = { 8, 4 },
133 [XGL_FMT_BC1_SRGB] = { 8, 4 },
134 [XGL_FMT_BC2_UNORM] = { 16, 4 },
135 [XGL_FMT_BC2_SRGB] = { 16, 4 },
136 [XGL_FMT_BC3_UNORM] = { 16, 4 },
137 [XGL_FMT_BC3_SRGB] = { 16, 4 },
138 [XGL_FMT_BC4_UNORM] = { 8, 4 },
139 [XGL_FMT_BC4_SNORM] = { 8, 4 },
140 [XGL_FMT_BC5_UNORM] = { 16, 4 },
141 [XGL_FMT_BC5_SNORM] = { 16, 4 },
142 [XGL_FMT_BC6H_UFLOAT] = { 16, 4 },
143 [XGL_FMT_BC6H_SFLOAT] = { 16, 4 },
144 [XGL_FMT_BC7_UNORM] = { 16, 4 },
145 [XGL_FMT_BC7_SRGB] = { 16, 4 },
146 /* TODO: Initialize remaining compressed formats. */
147 [XGL_FMT_ETC2_R8G8B8_UNORM] = { 0, 0 },
148 [XGL_FMT_ETC2_R8G8B8A1_UNORM] = { 0, 0 },
149 [XGL_FMT_ETC2_R8G8B8A8_UNORM] = { 0, 0 },
150 [XGL_FMT_EAC_R11_UNORM] = { 0, 0 },
151 [XGL_FMT_EAC_R11_SNORM] = { 0, 0 },
152 [XGL_FMT_EAC_R11G11_UNORM] = { 0, 0 },
153 [XGL_FMT_EAC_R11G11_SNORM] = { 0, 0 },
154 [XGL_FMT_ASTC_4x4_UNORM] = { 0, 0 },
155 [XGL_FMT_ASTC_4x4_SRGB] = { 0, 0 },
156 [XGL_FMT_ASTC_4x5_UNORM] = { 0, 0 },
157 [XGL_FMT_ASTC_4x5_SRGB] = { 0, 0 },
158 [XGL_FMT_ASTC_5x5_UNORM] = { 0, 0 },
159 [XGL_FMT_ASTC_5x5_SRGB] = { 0, 0 },
160 [XGL_FMT_ASTC_6x5_UNORM] = { 0, 0 },
161 [XGL_FMT_ASTC_6x5_SRGB] = { 0, 0 },
162 [XGL_FMT_ASTC_6x6_UNORM] = { 0, 0 },
163 [XGL_FMT_ASTC_6x6_SRGB] = { 0, 0 },
164 [XGL_FMT_ASTC_8x5_UNORM] = { 0, 0 },
165 [XGL_FMT_ASTC_8x5_SRGB] = { 0, 0 },
166 [XGL_FMT_ASTC_8x6_UNORM] = { 0, 0 },
167 [XGL_FMT_ASTC_8x6_SRGB] = { 0, 0 },
168 [XGL_FMT_ASTC_8x8_UNORM] = { 0, 0 },
169 [XGL_FMT_ASTC_8x8_SRGB] = { 0, 0 },
170 [XGL_FMT_ASTC_10x5_UNORM] = { 0, 0 },
171 [XGL_FMT_ASTC_10x5_SRGB] = { 0, 0 },
172 [XGL_FMT_ASTC_10x6_UNORM] = { 0, 0 },
173 [XGL_FMT_ASTC_10x6_SRGB] = { 0, 0 },
174 [XGL_FMT_ASTC_10x8_UNORM] = { 0, 0 },
175 [XGL_FMT_ASTC_10x8_SRGB] = { 0, 0 },
176 [XGL_FMT_ASTC_10x10_UNORM] = { 0, 0 },
177 [XGL_FMT_ASTC_10x10_SRGB] = { 0, 0 },
178 [XGL_FMT_ASTC_12x10_UNORM] = { 0, 0 },
179 [XGL_FMT_ASTC_12x10_SRGB] = { 0, 0 },
180 [XGL_FMT_ASTC_12x12_UNORM] = { 0, 0 },
181 [XGL_FMT_ASTC_12x12_SRGB] = { 0, 0 },
182 [XGL_FMT_B5G6R5_UNORM] = { 2, 3 },
183 [XGL_FMT_B5G6R5_USCALED] = { 2, 3 },
184 [XGL_FMT_B8G8R8_UNORM] = { 3, 3 },
185 [XGL_FMT_B8G8R8_SNORM] = { 3, 3 },
186 [XGL_FMT_B8G8R8_USCALED] = { 3, 3 },
187 [XGL_FMT_B8G8R8_SSCALED] = { 3, 3 },
188 [XGL_FMT_B8G8R8_UINT] = { 3, 3 },
189 [XGL_FMT_B8G8R8_SINT] = { 3, 3 },
190 [XGL_FMT_B8G8R8_SRGB] = { 3, 3 },
191 [XGL_FMT_B8G8R8A8_UNORM] = { 4, 4 },
192 [XGL_FMT_B8G8R8A8_SNORM] = { 4, 4 },
193 [XGL_FMT_B8G8R8A8_USCALED] = { 4, 4 },
194 [XGL_FMT_B8G8R8A8_SSCALED] = { 4, 4 },
195 [XGL_FMT_B8G8R8A8_UINT] = { 4, 4 },
196 [XGL_FMT_B8G8R8A8_SINT] = { 4, 4 },
197 [XGL_FMT_B8G8R8A8_SRGB] = { 4, 4 },
198 [XGL_FMT_B10G10R10A2_UNORM] = { 4, 4 },
199 [XGL_FMT_B10G10R10A2_SNORM] = { 4, 4 },
200 [XGL_FMT_B10G10R10A2_USCALED] = { 4, 4 },
201 [XGL_FMT_B10G10R10A2_SSCALED] = { 4, 4 },
202 [XGL_FMT_B10G10R10A2_UINT] = { 4, 4 },
203 [XGL_FMT_B10G10R10A2_SINT] = { 4, 4 },
Chia-I Wub5a1add2014-08-16 12:46:32 +0800204};
205
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700206bool icd_format_is_ds(XGL_FORMAT format)
207{
208 bool is_ds = false;
209
210 switch (format) {
211 case XGL_FMT_D16_UNORM:
212 case XGL_FMT_D24_UNORM:
213 case XGL_FMT_D32_SFLOAT:
214 case XGL_FMT_S8_UINT:
215 case XGL_FMT_D16_UNORM_S8_UINT:
216 case XGL_FMT_D24_UNORM_S8_UINT:
217 case XGL_FMT_D32_SFLOAT_S8_UINT:
218 is_ds = true;
219 break;
220 default:
221 break;
222 }
223
224 return is_ds;
225}
226
227bool icd_format_is_norm(XGL_FORMAT format)
228{
229 bool is_norm = false;
230
231 switch (format) {
232 case XGL_FMT_R4G4_UNORM:
233 case XGL_FMT_R4G4B4A4_UNORM:
234 case XGL_FMT_R5G6B5_UNORM:
235 case XGL_FMT_R5G5B5A1_UNORM:
236 case XGL_FMT_R8_UNORM:
237 case XGL_FMT_R8_SNORM:
238 case XGL_FMT_R8G8_UNORM:
239 case XGL_FMT_R8G8_SNORM:
240 case XGL_FMT_R8G8B8_UNORM:
241 case XGL_FMT_R8G8B8_SNORM:
242 case XGL_FMT_R8G8B8A8_UNORM:
243 case XGL_FMT_R8G8B8A8_SNORM:
244 case XGL_FMT_R10G10B10A2_UNORM:
245 case XGL_FMT_R10G10B10A2_SNORM:
246 case XGL_FMT_R16_UNORM:
247 case XGL_FMT_R16_SNORM:
248 case XGL_FMT_R16G16_UNORM:
249 case XGL_FMT_R16G16_SNORM:
250 case XGL_FMT_R16G16B16_UNORM:
251 case XGL_FMT_R16G16B16_SNORM:
252 case XGL_FMT_R16G16B16A16_UNORM:
253 case XGL_FMT_R16G16B16A16_SNORM:
254 case XGL_FMT_BC1_UNORM:
255 case XGL_FMT_BC2_UNORM:
256 case XGL_FMT_BC3_UNORM:
257 case XGL_FMT_BC4_UNORM:
258 case XGL_FMT_BC4_SNORM:
259 case XGL_FMT_BC5_UNORM:
260 case XGL_FMT_BC5_SNORM:
261 case XGL_FMT_BC7_UNORM:
262 case XGL_FMT_ETC2_R8G8B8_UNORM:
263 case XGL_FMT_ETC2_R8G8B8A1_UNORM:
264 case XGL_FMT_ETC2_R8G8B8A8_UNORM:
265 case XGL_FMT_EAC_R11_UNORM:
266 case XGL_FMT_EAC_R11_SNORM:
267 case XGL_FMT_EAC_R11G11_UNORM:
268 case XGL_FMT_EAC_R11G11_SNORM:
269 case XGL_FMT_ASTC_4x4_UNORM:
270 case XGL_FMT_ASTC_4x5_UNORM:
271 case XGL_FMT_ASTC_5x5_UNORM:
272 case XGL_FMT_ASTC_6x5_UNORM:
273 case XGL_FMT_ASTC_6x6_UNORM:
274 case XGL_FMT_ASTC_8x5_UNORM:
275 case XGL_FMT_ASTC_8x6_UNORM:
276 case XGL_FMT_ASTC_8x8_UNORM:
277 case XGL_FMT_ASTC_10x5_UNORM:
278 case XGL_FMT_ASTC_10x6_UNORM:
279 case XGL_FMT_ASTC_10x8_UNORM:
280 case XGL_FMT_ASTC_10x10_UNORM:
281 case XGL_FMT_ASTC_12x10_UNORM:
282 case XGL_FMT_ASTC_12x12_UNORM:
283 case XGL_FMT_B5G6R5_UNORM:
284 case XGL_FMT_B8G8R8_UNORM:
285 case XGL_FMT_B8G8R8_SNORM:
286 case XGL_FMT_B8G8R8A8_UNORM:
287 case XGL_FMT_B8G8R8A8_SNORM:
288 case XGL_FMT_B10G10R10A2_UNORM:
289 case XGL_FMT_B10G10R10A2_SNORM:
290 is_norm = true;
291 break;
292 default:
293 break;
294 }
295
296 return is_norm;
297};
298
299bool icd_format_is_int(XGL_FORMAT format)
300{
301 bool is_int = false;
302
303 switch (format) {
304 case XGL_FMT_R8_UINT:
305 case XGL_FMT_R8_SINT:
306 case XGL_FMT_R8G8_UINT:
307 case XGL_FMT_R8G8_SINT:
308 case XGL_FMT_R8G8B8_UINT:
309 case XGL_FMT_R8G8B8_SINT:
310 case XGL_FMT_R8G8B8A8_UINT:
311 case XGL_FMT_R8G8B8A8_SINT:
312 case XGL_FMT_R10G10B10A2_UINT:
313 case XGL_FMT_R10G10B10A2_SINT:
314 case XGL_FMT_R16_UINT:
315 case XGL_FMT_R16_SINT:
316 case XGL_FMT_R16G16_UINT:
317 case XGL_FMT_R16G16_SINT:
318 case XGL_FMT_R16G16B16_UINT:
319 case XGL_FMT_R16G16B16_SINT:
320 case XGL_FMT_R16G16B16A16_UINT:
321 case XGL_FMT_R16G16B16A16_SINT:
322 case XGL_FMT_R32_UINT:
323 case XGL_FMT_R32_SINT:
324 case XGL_FMT_R32G32_UINT:
325 case XGL_FMT_R32G32_SINT:
326 case XGL_FMT_R32G32B32_UINT:
327 case XGL_FMT_R32G32B32_SINT:
328 case XGL_FMT_R32G32B32A32_UINT:
329 case XGL_FMT_R32G32B32A32_SINT:
330 case XGL_FMT_B8G8R8_UINT:
331 case XGL_FMT_B8G8R8_SINT:
332 case XGL_FMT_B8G8R8A8_UINT:
333 case XGL_FMT_B8G8R8A8_SINT:
334 case XGL_FMT_B10G10R10A2_UINT:
335 case XGL_FMT_B10G10R10A2_SINT:
336 is_int = true;
337 break;
338 default:
339 break;
340 }
341
342 return is_int;
343}
344
345bool icd_format_is_float(XGL_FORMAT format)
346{
347 bool is_float = false;
348
349 switch (format) {
350 case XGL_FMT_R16_SFLOAT:
351 case XGL_FMT_R16G16_SFLOAT:
352 case XGL_FMT_R16G16B16_SFLOAT:
353 case XGL_FMT_R16G16B16A16_SFLOAT:
354 case XGL_FMT_R32_SFLOAT:
355 case XGL_FMT_R32G32_SFLOAT:
356 case XGL_FMT_R32G32B32_SFLOAT:
357 case XGL_FMT_R32G32B32A32_SFLOAT:
358 case XGL_FMT_R64_SFLOAT:
359 case XGL_FMT_R64G64_SFLOAT:
360 case XGL_FMT_R64G64B64_SFLOAT:
361 case XGL_FMT_R64G64B64A64_SFLOAT:
362 case XGL_FMT_R11G11B10_UFLOAT:
363 case XGL_FMT_R9G9B9E5_UFLOAT:
364 case XGL_FMT_BC6H_UFLOAT:
365 case XGL_FMT_BC6H_SFLOAT:
366 is_float = true;
367 break;
368 default:
369 break;
370 }
371
372 return is_float;
373}
374
375bool icd_format_is_srgb(XGL_FORMAT format)
376{
377 bool is_srgb = false;
378
379 switch (format) {
380 case XGL_FMT_R8_SRGB:
381 case XGL_FMT_R8G8_SRGB:
382 case XGL_FMT_R8G8B8_SRGB:
383 case XGL_FMT_R8G8B8A8_SRGB:
384 case XGL_FMT_BC1_SRGB:
385 case XGL_FMT_BC2_SRGB:
386 case XGL_FMT_BC3_SRGB:
387 case XGL_FMT_BC7_SRGB:
388 case XGL_FMT_ASTC_4x4_SRGB:
389 case XGL_FMT_ASTC_4x5_SRGB:
390 case XGL_FMT_ASTC_5x5_SRGB:
391 case XGL_FMT_ASTC_6x5_SRGB:
392 case XGL_FMT_ASTC_6x6_SRGB:
393 case XGL_FMT_ASTC_8x5_SRGB:
394 case XGL_FMT_ASTC_8x6_SRGB:
395 case XGL_FMT_ASTC_8x8_SRGB:
396 case XGL_FMT_ASTC_10x5_SRGB:
397 case XGL_FMT_ASTC_10x6_SRGB:
398 case XGL_FMT_ASTC_10x8_SRGB:
399 case XGL_FMT_ASTC_10x10_SRGB:
400 case XGL_FMT_ASTC_12x10_SRGB:
401 case XGL_FMT_ASTC_12x12_SRGB:
402 case XGL_FMT_B8G8R8_SRGB:
403 case XGL_FMT_B8G8R8A8_SRGB:
404 is_srgb = true;
405 break;
406 default:
407 break;
408 }
409
410 return is_srgb;
411}
412
413bool icd_format_is_compressed(XGL_FORMAT format)
414{
415 switch (format) {
416 case XGL_FMT_BC1_UNORM:
417 case XGL_FMT_BC1_SRGB:
418 case XGL_FMT_BC2_UNORM:
419 case XGL_FMT_BC2_SRGB:
420 case XGL_FMT_BC3_UNORM:
421 case XGL_FMT_BC3_SRGB:
422 case XGL_FMT_BC4_UNORM:
423 case XGL_FMT_BC4_SNORM:
424 case XGL_FMT_BC5_UNORM:
425 case XGL_FMT_BC5_SNORM:
426 case XGL_FMT_BC6H_UFLOAT:
427 case XGL_FMT_BC6H_SFLOAT:
428 case XGL_FMT_BC7_UNORM:
429 case XGL_FMT_BC7_SRGB:
430 case XGL_FMT_ETC2_R8G8B8_UNORM:
431 case XGL_FMT_ETC2_R8G8B8A1_UNORM:
432 case XGL_FMT_ETC2_R8G8B8A8_UNORM:
433 case XGL_FMT_EAC_R11_UNORM:
434 case XGL_FMT_EAC_R11_SNORM:
435 case XGL_FMT_EAC_R11G11_UNORM:
436 case XGL_FMT_EAC_R11G11_SNORM:
437 case XGL_FMT_ASTC_4x4_UNORM:
438 case XGL_FMT_ASTC_4x4_SRGB:
439 case XGL_FMT_ASTC_4x5_UNORM:
440 case XGL_FMT_ASTC_4x5_SRGB:
441 case XGL_FMT_ASTC_5x5_UNORM:
442 case XGL_FMT_ASTC_5x5_SRGB:
443 case XGL_FMT_ASTC_6x5_UNORM:
444 case XGL_FMT_ASTC_6x5_SRGB:
445 case XGL_FMT_ASTC_6x6_UNORM:
446 case XGL_FMT_ASTC_6x6_SRGB:
447 case XGL_FMT_ASTC_8x5_UNORM:
448 case XGL_FMT_ASTC_8x5_SRGB:
449 case XGL_FMT_ASTC_8x6_UNORM:
450 case XGL_FMT_ASTC_8x6_SRGB:
451 case XGL_FMT_ASTC_8x8_UNORM:
452 case XGL_FMT_ASTC_8x8_SRGB:
453 case XGL_FMT_ASTC_10x5_UNORM:
454 case XGL_FMT_ASTC_10x5_SRGB:
455 case XGL_FMT_ASTC_10x6_UNORM:
456 case XGL_FMT_ASTC_10x6_SRGB:
457 case XGL_FMT_ASTC_10x8_UNORM:
458 case XGL_FMT_ASTC_10x8_SRGB:
459 case XGL_FMT_ASTC_10x10_UNORM:
460 case XGL_FMT_ASTC_10x10_SRGB:
461 case XGL_FMT_ASTC_12x10_UNORM:
462 case XGL_FMT_ASTC_12x10_SRGB:
463 case XGL_FMT_ASTC_12x12_UNORM:
464 case XGL_FMT_ASTC_12x12_SRGB:
465 return true;
466 default:
467 return false;
468 }
469}
470
Chia-I Wu54ed0792014-12-27 14:14:50 +0800471size_t icd_format_get_size(XGL_FORMAT format)
Chia-I Wub5a1add2014-08-16 12:46:32 +0800472{
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700473 return icd_format_table[format].size;
Chia-I Wub5a1add2014-08-16 12:46:32 +0800474}
Chia-I Wu40ee55b2014-10-08 09:12:58 +0800475
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700476XGL_IMAGE_FORMAT_CLASS icd_format_get_class(XGL_FORMAT format)
477{
478 if (icd_format_is_undef(format))
479 assert(!"undefined format");
480 if (icd_format_is_compressed(format)) {
481 switch (icd_format_get_size(format)) {
482 case 8:
483 return XGL_IMAGE_FORMAT_CLASS_64_BIT_BLOCK;
484 case 16:
485 return XGL_IMAGE_FORMAT_CLASS_128_BIT_BLOCK;
486 default:
487 assert(!"illegal compressed format");
488 }
489 } else if (icd_format_is_ds(format)) {
490 switch (icd_format_get_size(format)) {
491 case 1:
492 return XGL_IMAGE_FORMAT_CLASS_S8;
493 case 2:
494 return XGL_IMAGE_FORMAT_CLASS_D16;
495 case 3:
496 switch (icd_format_get_channel_count(format)) {
497 case 1:
498 return XGL_IMAGE_FORMAT_CLASS_D24;
499 case 2:
500 return XGL_IMAGE_FORMAT_CLASS_D16S8;
501 default:
502 assert(!"illegal depth stencil format channels");
503 }
504 case 4:
505 switch (icd_format_get_channel_count(format)) {
506 case 1:
507 return XGL_IMAGE_FORMAT_CLASS_D32;
508 case 2:
509 return XGL_IMAGE_FORMAT_CLASS_D24S8;
510 default:
511 assert(!"illegal depth stencil format channels");
512 }
513 case 5:
514 return XGL_IMAGE_FORMAT_CLASS_D32S8;
515 default:
516 assert(!"illegal depth stencil format");
517 }
518 } else { /* uncompressed color format */
519 switch (icd_format_get_size(format)) {
520 case 1:
521 return XGL_IMAGE_FORMAT_CLASS_8_BITS;
522 case 2:
523 return XGL_IMAGE_FORMAT_CLASS_16_BITS;
524 case 3:
525 return XGL_IMAGE_FORMAT_CLASS_24_BITS;
526 case 4:
527 return XGL_IMAGE_FORMAT_CLASS_32_BITS;
528 case 6:
529 return XGL_IMAGE_FORMAT_CLASS_48_BITS;
530 case 8:
531 return XGL_IMAGE_FORMAT_CLASS_64_BITS;
532 case 12:
533 return XGL_IMAGE_FORMAT_CLASS_96_BITS;
534 case 16:
535 return XGL_IMAGE_FORMAT_CLASS_128_BITS;
536 default:
537 assert(!"illegal uncompressed color format");
538 }
539 }
540}
541
Chia-I Wu40ee55b2014-10-08 09:12:58 +0800542unsigned int icd_format_get_channel_count(XGL_FORMAT format)
543{
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700544 return icd_format_table[format].channel_count;
Chia-I Wu40ee55b2014-10-08 09:12:58 +0800545}
Chia-I Wu92096a92014-12-21 23:07:08 +0800546
547/**
548 * Convert a raw RGBA color to a raw value. \p value must have at least
549 * icd_format_get_size(format) bytes.
550 */
551void icd_format_get_raw_value(XGL_FORMAT format,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600552 const uint32_t color[4],
Chia-I Wu92096a92014-12-21 23:07:08 +0800553 void *value)
554{
555 /* assume little-endian */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700556 switch (format) {
557 case XGL_FMT_UNDEFINED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800558 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700559 case XGL_FMT_R4G4_UNORM:
560 case XGL_FMT_R4G4_USCALED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800561 ((uint8_t *) value)[0] = (color[0] & 0xf) << 0 |
562 (color[1] & 0xf) << 4;
563 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700564 case XGL_FMT_R4G4B4A4_UNORM:
565 case XGL_FMT_R4G4B4A4_USCALED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800566 ((uint16_t *) value)[0] = (color[0] & 0xf) << 0 |
567 (color[1] & 0xf) << 4 |
568 (color[2] & 0xf) << 8 |
569 (color[3] & 0xf) << 12;
570 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700571 case XGL_FMT_R5G6B5_UNORM:
572 case XGL_FMT_R5G6B5_USCALED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800573 ((uint16_t *) value)[0] = (color[0] & 0x1f) << 0 |
574 (color[1] & 0x3f) << 5 |
575 (color[2] & 0x1f) << 11;
576 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700577 case XGL_FMT_B5G6R5_UNORM:
Chia-I Wu92096a92014-12-21 23:07:08 +0800578 ((uint16_t *) value)[0] = (color[2] & 0x1f) << 0 |
579 (color[1] & 0x3f) << 5 |
580 (color[0] & 0x1f) << 11;
581 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700582 case XGL_FMT_R5G5B5A1_UNORM:
583 case XGL_FMT_R5G5B5A1_USCALED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800584 ((uint16_t *) value)[0] = (color[0] & 0x1f) << 0 |
585 (color[1] & 0x1f) << 5 |
586 (color[2] & 0x1f) << 10 |
587 (color[3] & 0x1) << 15;
588 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700589 case XGL_FMT_R8_UNORM:
590 case XGL_FMT_R8_SNORM:
591 case XGL_FMT_R8_USCALED:
592 case XGL_FMT_R8_SSCALED:
593 case XGL_FMT_R8_UINT:
594 case XGL_FMT_R8_SINT:
595 case XGL_FMT_R8_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800596 ((uint8_t *) value)[0] = (uint8_t) color[0];
597 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700598 case XGL_FMT_R8G8_UNORM:
599 case XGL_FMT_R8G8_SNORM:
600 case XGL_FMT_R8G8_USCALED:
601 case XGL_FMT_R8G8_SSCALED:
602 case XGL_FMT_R8G8_UINT:
603 case XGL_FMT_R8G8_SINT:
604 case XGL_FMT_R8G8_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800605 ((uint8_t *) value)[0] = (uint8_t) color[0];
606 ((uint8_t *) value)[1] = (uint8_t) color[1];
607 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700608 case XGL_FMT_R8G8B8A8_UNORM:
609 case XGL_FMT_R8G8B8A8_SNORM:
610 case XGL_FMT_R8G8B8A8_USCALED:
611 case XGL_FMT_R8G8B8A8_SSCALED:
612 case XGL_FMT_R8G8B8A8_UINT:
613 case XGL_FMT_R8G8B8A8_SINT:
614 case XGL_FMT_R8G8B8A8_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800615 ((uint8_t *) value)[0] = (uint8_t) color[0];
616 ((uint8_t *) value)[1] = (uint8_t) color[1];
617 ((uint8_t *) value)[2] = (uint8_t) color[2];
618 ((uint8_t *) value)[3] = (uint8_t) color[3];
619 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700620 case XGL_FMT_B8G8R8A8_UNORM:
621 case XGL_FMT_B8G8R8A8_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800622 ((uint8_t *) value)[0] = (uint8_t) color[2];
623 ((uint8_t *) value)[1] = (uint8_t) color[1];
624 ((uint8_t *) value)[2] = (uint8_t) color[0];
625 ((uint8_t *) value)[3] = (uint8_t) color[3];
626 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700627 case XGL_FMT_R11G11B10_UFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800628 ((uint32_t *) value)[0] = (color[0] & 0x7ff) << 0 |
629 (color[1] & 0x7ff) << 11 |
630 (color[2] & 0x3ff) << 22;
631 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700632 case XGL_FMT_R10G10B10A2_UNORM:
633 case XGL_FMT_R10G10B10A2_SNORM:
634 case XGL_FMT_R10G10B10A2_USCALED:
635 case XGL_FMT_R10G10B10A2_SSCALED:
636 case XGL_FMT_R10G10B10A2_UINT:
637 case XGL_FMT_R10G10B10A2_SINT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800638 ((uint32_t *) value)[0] = (color[0] & 0x3ff) << 0 |
639 (color[1] & 0x3ff) << 10 |
640 (color[2] & 0x3ff) << 20 |
641 (color[3] & 0x3) << 30;
642 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700643 case XGL_FMT_R16_UNORM:
644 case XGL_FMT_R16_SNORM:
645 case XGL_FMT_R16_USCALED:
646 case XGL_FMT_R16_SSCALED:
647 case XGL_FMT_R16_UINT:
648 case XGL_FMT_R16_SINT:
649 case XGL_FMT_R16_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800650 ((uint16_t *) value)[0] = (uint16_t) color[0];
651 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700652 case XGL_FMT_R16G16_UNORM:
653 case XGL_FMT_R16G16_SNORM:
654 case XGL_FMT_R16G16_USCALED:
655 case XGL_FMT_R16G16_SSCALED:
656 case XGL_FMT_R16G16_UINT:
657 case XGL_FMT_R16G16_SINT:
658 case XGL_FMT_R16G16_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800659 ((uint16_t *) value)[0] = (uint16_t) color[0];
660 ((uint16_t *) value)[1] = (uint16_t) color[1];
661 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700662 case XGL_FMT_R16G16B16A16_UNORM:
663 case XGL_FMT_R16G16B16A16_SNORM:
664 case XGL_FMT_R16G16B16A16_USCALED:
665 case XGL_FMT_R16G16B16A16_SSCALED:
666 case XGL_FMT_R16G16B16A16_UINT:
667 case XGL_FMT_R16G16B16A16_SINT:
668 case XGL_FMT_R16G16B16A16_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800669 ((uint16_t *) value)[0] = (uint16_t) color[0];
670 ((uint16_t *) value)[1] = (uint16_t) color[1];
671 ((uint16_t *) value)[2] = (uint16_t) color[2];
672 ((uint16_t *) value)[3] = (uint16_t) color[3];
673 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700674 case XGL_FMT_R32_UINT:
675 case XGL_FMT_R32_SINT:
676 case XGL_FMT_R32_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800677 ((uint32_t *) value)[0] = color[0];
678 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700679 case XGL_FMT_R32G32_UINT:
680 case XGL_FMT_R32G32_SINT:
681 case XGL_FMT_R32G32_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800682 ((uint32_t *) value)[0] = color[0];
683 ((uint32_t *) value)[1] = color[1];
684 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700685 case XGL_FMT_R32G32B32_UINT:
686 case XGL_FMT_R32G32B32_SINT:
687 case XGL_FMT_R32G32B32_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800688 ((uint32_t *) value)[0] = color[0];
689 ((uint32_t *) value)[1] = color[1];
690 ((uint32_t *) value)[2] = color[2];
691 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700692 case XGL_FMT_R32G32B32A32_UINT:
693 case XGL_FMT_R32G32B32A32_SINT:
694 case XGL_FMT_R32G32B32A32_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800695 ((uint32_t *) value)[0] = color[0];
696 ((uint32_t *) value)[1] = color[1];
697 ((uint32_t *) value)[2] = color[2];
698 ((uint32_t *) value)[3] = color[3];
699 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700700 case XGL_FMT_D16_UNORM_S8_UINT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800701 ((uint16_t *) value)[0] = (uint16_t) color[0];
702 ((char *) value)[2] = (uint8_t) color[1];
703 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700704 case XGL_FMT_D32_SFLOAT_S8_UINT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800705 ((uint32_t *) value)[0] = (uint32_t) color[0];
706 ((char *) value)[4] = (uint8_t) color[1];
707 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700708 case XGL_FMT_R9G9B9E5_UFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800709 ((uint32_t *) value)[0] = (color[0] & 0x1ff) << 0 |
710 (color[1] & 0x1ff) << 9 |
711 (color[2] & 0x1ff) << 18 |
712 (color[3] & 0x1f) << 27;
713 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700714 case XGL_FMT_BC1_UNORM:
715 case XGL_FMT_BC1_SRGB:
716 case XGL_FMT_BC4_UNORM:
717 case XGL_FMT_BC4_SNORM:
Chia-I Wu92096a92014-12-21 23:07:08 +0800718 memcpy(value, color, 8);
719 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700720 case XGL_FMT_BC2_UNORM:
721 case XGL_FMT_BC2_SRGB:
722 case XGL_FMT_BC3_UNORM:
723 case XGL_FMT_BC3_SRGB:
724 case XGL_FMT_BC5_UNORM:
725 case XGL_FMT_BC5_SNORM:
726 case XGL_FMT_BC6H_UFLOAT:
727 case XGL_FMT_BC6H_SFLOAT:
728 case XGL_FMT_BC7_UNORM:
729 case XGL_FMT_BC7_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800730 memcpy(value, color, 16);
731 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700732 case XGL_FMT_R8G8B8_UNORM:
733 case XGL_FMT_R8G8B8_SNORM:
734 case XGL_FMT_R8G8B8_USCALED:
735 case XGL_FMT_R8G8B8_SSCALED:
736 case XGL_FMT_R8G8B8_UINT:
737 case XGL_FMT_R8G8B8_SINT:
738 case XGL_FMT_R8G8B8_SRGB:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800739 ((uint8_t *) value)[0] = (uint8_t) color[0];
740 ((uint8_t *) value)[1] = (uint8_t) color[1];
741 ((uint8_t *) value)[2] = (uint8_t) color[2];
742 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700743 case XGL_FMT_R16G16B16_UNORM:
744 case XGL_FMT_R16G16B16_SNORM:
745 case XGL_FMT_R16G16B16_USCALED:
746 case XGL_FMT_R16G16B16_SSCALED:
747 case XGL_FMT_R16G16B16_UINT:
748 case XGL_FMT_R16G16B16_SINT:
749 case XGL_FMT_R16G16B16_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800750 ((uint16_t *) value)[0] = (uint16_t) color[0];
751 ((uint16_t *) value)[1] = (uint16_t) color[1];
752 ((uint16_t *) value)[2] = (uint16_t) color[2];
753 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700754 case XGL_FMT_B10G10R10A2_UNORM:
755 case XGL_FMT_B10G10R10A2_SNORM:
756 case XGL_FMT_B10G10R10A2_USCALED:
757 case XGL_FMT_B10G10R10A2_SSCALED:
758 case XGL_FMT_B10G10R10A2_UINT:
759 case XGL_FMT_B10G10R10A2_SINT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800760 ((uint32_t *) value)[0] = (color[2] & 0x3ff) << 0 |
761 (color[1] & 0x3ff) << 10 |
762 (color[0] & 0x3ff) << 20 |
763 (color[3] & 0x3) << 30;
764 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700765 case XGL_FMT_R64_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800766 /* higher 32 bits always 0 */
767 ((uint64_t *) value)[0] = color[0];
768 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700769 case XGL_FMT_R64G64_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800770 ((uint64_t *) value)[0] = color[0];
771 ((uint64_t *) value)[1] = color[1];
772 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700773 case XGL_FMT_R64G64B64_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800774 ((uint64_t *) value)[0] = color[0];
775 ((uint64_t *) value)[1] = color[1];
776 ((uint64_t *) value)[2] = color[2];
777 break;
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700778 case XGL_FMT_R64G64B64A64_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800779 ((uint64_t *) value)[0] = color[0];
780 ((uint64_t *) value)[1] = color[1];
781 ((uint64_t *) value)[2] = color[2];
782 ((uint64_t *) value)[3] = color[3];
783 break;
Chia-I Wu92096a92014-12-21 23:07:08 +0800784 default:
785 assert(!"unknown format");
786 break;
787 }
788}