blob: e2c2ada56ae58c37fd151064f9021d82e2bcfb46 [file] [log] [blame]
Chia-I Wub5a1add2014-08-16 12:46:32 +08001/*
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -06002 * Vulkan
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;
Tony Barbour8205d902015-04-16 15:59:00 -060035} icd_format_table[VK_NUM_FORMAT] = {
36 [VK_FORMAT_UNDEFINED] = { 0, 0 },
37 [VK_FORMAT_R4G4_UNORM] = { 1, 2 },
38 [VK_FORMAT_R4G4_USCALED] = { 1, 2 },
39 [VK_FORMAT_R4G4B4A4_UNORM] = { 2, 4 },
40 [VK_FORMAT_R4G4B4A4_USCALED] = { 2, 4 },
41 [VK_FORMAT_R5G6B5_UNORM] = { 2, 3 },
42 [VK_FORMAT_R5G6B5_USCALED] = { 2, 3 },
43 [VK_FORMAT_R5G5B5A1_UNORM] = { 2, 4 },
44 [VK_FORMAT_R5G5B5A1_USCALED] = { 2, 4 },
45 [VK_FORMAT_R8_UNORM] = { 1, 1 },
46 [VK_FORMAT_R8_SNORM] = { 1, 1 },
47 [VK_FORMAT_R8_USCALED] = { 1, 1 },
48 [VK_FORMAT_R8_SSCALED] = { 1, 1 },
49 [VK_FORMAT_R8_UINT] = { 1, 1 },
50 [VK_FORMAT_R8_SINT] = { 1, 1 },
51 [VK_FORMAT_R8_SRGB] = { 1, 1 },
52 [VK_FORMAT_R8G8_UNORM] = { 2, 2 },
53 [VK_FORMAT_R8G8_SNORM] = { 2, 2 },
54 [VK_FORMAT_R8G8_USCALED] = { 2, 2 },
55 [VK_FORMAT_R8G8_SSCALED] = { 2, 2 },
56 [VK_FORMAT_R8G8_UINT] = { 2, 2 },
57 [VK_FORMAT_R8G8_SINT] = { 2, 2 },
58 [VK_FORMAT_R8G8_SRGB] = { 2, 2 },
59 [VK_FORMAT_R8G8B8_UNORM] = { 3, 3 },
60 [VK_FORMAT_R8G8B8_SNORM] = { 3, 3 },
61 [VK_FORMAT_R8G8B8_USCALED] = { 3, 3 },
62 [VK_FORMAT_R8G8B8_SSCALED] = { 3, 3 },
63 [VK_FORMAT_R8G8B8_UINT] = { 3, 3 },
64 [VK_FORMAT_R8G8B8_SINT] = { 3, 3 },
65 [VK_FORMAT_R8G8B8_SRGB] = { 3, 3 },
66 [VK_FORMAT_R8G8B8A8_UNORM] = { 4, 4 },
67 [VK_FORMAT_R8G8B8A8_SNORM] = { 4, 4 },
68 [VK_FORMAT_R8G8B8A8_USCALED] = { 4, 4 },
69 [VK_FORMAT_R8G8B8A8_SSCALED] = { 4, 4 },
70 [VK_FORMAT_R8G8B8A8_UINT] = { 4, 4 },
71 [VK_FORMAT_R8G8B8A8_SINT] = { 4, 4 },
72 [VK_FORMAT_R8G8B8A8_SRGB] = { 4, 4 },
73 [VK_FORMAT_R10G10B10A2_UNORM] = { 4, 4 },
74 [VK_FORMAT_R10G10B10A2_SNORM] = { 4, 4 },
75 [VK_FORMAT_R10G10B10A2_USCALED] = { 4, 4 },
76 [VK_FORMAT_R10G10B10A2_SSCALED] = { 4, 4 },
77 [VK_FORMAT_R10G10B10A2_UINT] = { 4, 4 },
78 [VK_FORMAT_R10G10B10A2_SINT] = { 4, 4 },
79 [VK_FORMAT_R16_UNORM] = { 2, 1 },
80 [VK_FORMAT_R16_SNORM] = { 2, 1 },
81 [VK_FORMAT_R16_USCALED] = { 2, 1 },
82 [VK_FORMAT_R16_SSCALED] = { 2, 1 },
83 [VK_FORMAT_R16_UINT] = { 2, 1 },
84 [VK_FORMAT_R16_SINT] = { 2, 1 },
85 [VK_FORMAT_R16_SFLOAT] = { 2, 1 },
86 [VK_FORMAT_R16G16_UNORM] = { 4, 2 },
87 [VK_FORMAT_R16G16_SNORM] = { 4, 2 },
88 [VK_FORMAT_R16G16_USCALED] = { 4, 2 },
89 [VK_FORMAT_R16G16_SSCALED] = { 4, 2 },
90 [VK_FORMAT_R16G16_UINT] = { 4, 2 },
91 [VK_FORMAT_R16G16_SINT] = { 4, 2 },
92 [VK_FORMAT_R16G16_SFLOAT] = { 4, 2 },
93 [VK_FORMAT_R16G16B16_UNORM] = { 6, 3 },
94 [VK_FORMAT_R16G16B16_SNORM] = { 6, 3 },
95 [VK_FORMAT_R16G16B16_USCALED] = { 6, 3 },
96 [VK_FORMAT_R16G16B16_SSCALED] = { 6, 3 },
97 [VK_FORMAT_R16G16B16_UINT] = { 6, 3 },
98 [VK_FORMAT_R16G16B16_SINT] = { 6, 3 },
99 [VK_FORMAT_R16G16B16_SFLOAT] = { 6, 3 },
100 [VK_FORMAT_R16G16B16A16_UNORM] = { 8, 4 },
101 [VK_FORMAT_R16G16B16A16_SNORM] = { 8, 4 },
102 [VK_FORMAT_R16G16B16A16_USCALED] = { 8, 4 },
103 [VK_FORMAT_R16G16B16A16_SSCALED] = { 8, 4 },
104 [VK_FORMAT_R16G16B16A16_UINT] = { 8, 4 },
105 [VK_FORMAT_R16G16B16A16_SINT] = { 8, 4 },
106 [VK_FORMAT_R16G16B16A16_SFLOAT] = { 8, 4 },
107 [VK_FORMAT_R32_UINT] = { 4, 1 },
108 [VK_FORMAT_R32_SINT] = { 4, 1 },
109 [VK_FORMAT_R32_SFLOAT] = { 4, 1 },
110 [VK_FORMAT_R32G32_UINT] = { 8, 2 },
111 [VK_FORMAT_R32G32_SINT] = { 8, 2 },
112 [VK_FORMAT_R32G32_SFLOAT] = { 8, 2 },
113 [VK_FORMAT_R32G32B32_UINT] = { 12, 3 },
114 [VK_FORMAT_R32G32B32_SINT] = { 12, 3 },
115 [VK_FORMAT_R32G32B32_SFLOAT] = { 12, 3 },
116 [VK_FORMAT_R32G32B32A32_UINT] = { 16, 4 },
117 [VK_FORMAT_R32G32B32A32_SINT] = { 16, 4 },
118 [VK_FORMAT_R32G32B32A32_SFLOAT] = { 16, 4 },
119 [VK_FORMAT_R64_SFLOAT] = { 8, 1 },
120 [VK_FORMAT_R64G64_SFLOAT] = { 16, 2 },
121 [VK_FORMAT_R64G64B64_SFLOAT] = { 24, 3 },
122 [VK_FORMAT_R64G64B64A64_SFLOAT] = { 32, 4 },
123 [VK_FORMAT_R11G11B10_UFLOAT] = { 4, 3 },
124 [VK_FORMAT_R9G9B9E5_UFLOAT] = { 4, 3 },
125 [VK_FORMAT_D16_UNORM] = { 2, 1 },
126 [VK_FORMAT_D24_UNORM] = { 3, 1 },
127 [VK_FORMAT_D32_SFLOAT] = { 4, 1 },
128 [VK_FORMAT_S8_UINT] = { 1, 1 },
129 [VK_FORMAT_D16_UNORM_S8_UINT] = { 3, 2 },
130 [VK_FORMAT_D24_UNORM_S8_UINT] = { 4, 2 },
131 [VK_FORMAT_D32_SFLOAT_S8_UINT] = { 4, 2 },
132 [VK_FORMAT_BC1_RGB_UNORM] = { 8, 4 },
133 [VK_FORMAT_BC1_RGB_SRGB] = { 8, 4 },
134 [VK_FORMAT_BC1_RGBA_UNORM] = { 8, 4 },
135 [VK_FORMAT_BC1_RGBA_SRGB] = { 8, 4 },
136 [VK_FORMAT_BC2_UNORM] = { 16, 4 },
137 [VK_FORMAT_BC2_SRGB] = { 16, 4 },
138 [VK_FORMAT_BC3_UNORM] = { 16, 4 },
139 [VK_FORMAT_BC3_SRGB] = { 16, 4 },
140 [VK_FORMAT_BC4_UNORM] = { 8, 4 },
141 [VK_FORMAT_BC4_SNORM] = { 8, 4 },
142 [VK_FORMAT_BC5_UNORM] = { 16, 4 },
143 [VK_FORMAT_BC5_SNORM] = { 16, 4 },
144 [VK_FORMAT_BC6H_UFLOAT] = { 16, 4 },
145 [VK_FORMAT_BC6H_SFLOAT] = { 16, 4 },
146 [VK_FORMAT_BC7_UNORM] = { 16, 4 },
147 [VK_FORMAT_BC7_SRGB] = { 16, 4 },
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700148 /* TODO: Initialize remaining compressed formats. */
Tony Barbour8205d902015-04-16 15:59:00 -0600149 [VK_FORMAT_ETC2_R8G8B8_UNORM] = { 0, 0 },
150 [VK_FORMAT_ETC2_R8G8B8A1_UNORM] = { 0, 0 },
151 [VK_FORMAT_ETC2_R8G8B8A8_UNORM] = { 0, 0 },
152 [VK_FORMAT_EAC_R11_UNORM] = { 0, 0 },
153 [VK_FORMAT_EAC_R11_SNORM] = { 0, 0 },
154 [VK_FORMAT_EAC_R11G11_UNORM] = { 0, 0 },
155 [VK_FORMAT_EAC_R11G11_SNORM] = { 0, 0 },
156 [VK_FORMAT_ASTC_4x4_UNORM] = { 0, 0 },
157 [VK_FORMAT_ASTC_4x4_SRGB] = { 0, 0 },
158 [VK_FORMAT_ASTC_5x4_UNORM] = { 0, 0 },
159 [VK_FORMAT_ASTC_5x4_SRGB] = { 0, 0 },
160 [VK_FORMAT_ASTC_5x5_UNORM] = { 0, 0 },
161 [VK_FORMAT_ASTC_5x5_SRGB] = { 0, 0 },
162 [VK_FORMAT_ASTC_6x5_UNORM] = { 0, 0 },
163 [VK_FORMAT_ASTC_6x5_SRGB] = { 0, 0 },
164 [VK_FORMAT_ASTC_6x6_UNORM] = { 0, 0 },
165 [VK_FORMAT_ASTC_6x6_SRGB] = { 0, 0 },
166 [VK_FORMAT_ASTC_8x5_UNORM] = { 0, 0 },
167 [VK_FORMAT_ASTC_8x5_SRGB] = { 0, 0 },
168 [VK_FORMAT_ASTC_8x6_UNORM] = { 0, 0 },
169 [VK_FORMAT_ASTC_8x6_SRGB] = { 0, 0 },
170 [VK_FORMAT_ASTC_8x8_UNORM] = { 0, 0 },
171 [VK_FORMAT_ASTC_8x8_SRGB] = { 0, 0 },
172 [VK_FORMAT_ASTC_10x5_UNORM] = { 0, 0 },
173 [VK_FORMAT_ASTC_10x5_SRGB] = { 0, 0 },
174 [VK_FORMAT_ASTC_10x6_UNORM] = { 0, 0 },
175 [VK_FORMAT_ASTC_10x6_SRGB] = { 0, 0 },
176 [VK_FORMAT_ASTC_10x8_UNORM] = { 0, 0 },
177 [VK_FORMAT_ASTC_10x8_SRGB] = { 0, 0 },
178 [VK_FORMAT_ASTC_10x10_UNORM] = { 0, 0 },
179 [VK_FORMAT_ASTC_10x10_SRGB] = { 0, 0 },
180 [VK_FORMAT_ASTC_12x10_UNORM] = { 0, 0 },
181 [VK_FORMAT_ASTC_12x10_SRGB] = { 0, 0 },
182 [VK_FORMAT_ASTC_12x12_UNORM] = { 0, 0 },
183 [VK_FORMAT_ASTC_12x12_SRGB] = { 0, 0 },
184 [VK_FORMAT_B5G6R5_UNORM] = { 2, 3 },
185 [VK_FORMAT_B5G6R5_USCALED] = { 2, 3 },
186 [VK_FORMAT_B8G8R8_UNORM] = { 3, 3 },
187 [VK_FORMAT_B8G8R8_SNORM] = { 3, 3 },
188 [VK_FORMAT_B8G8R8_USCALED] = { 3, 3 },
189 [VK_FORMAT_B8G8R8_SSCALED] = { 3, 3 },
190 [VK_FORMAT_B8G8R8_UINT] = { 3, 3 },
191 [VK_FORMAT_B8G8R8_SINT] = { 3, 3 },
192 [VK_FORMAT_B8G8R8_SRGB] = { 3, 3 },
193 [VK_FORMAT_B8G8R8A8_UNORM] = { 4, 4 },
194 [VK_FORMAT_B8G8R8A8_SNORM] = { 4, 4 },
195 [VK_FORMAT_B8G8R8A8_USCALED] = { 4, 4 },
196 [VK_FORMAT_B8G8R8A8_SSCALED] = { 4, 4 },
197 [VK_FORMAT_B8G8R8A8_UINT] = { 4, 4 },
198 [VK_FORMAT_B8G8R8A8_SINT] = { 4, 4 },
199 [VK_FORMAT_B8G8R8A8_SRGB] = { 4, 4 },
200 [VK_FORMAT_B10G10R10A2_UNORM] = { 4, 4 },
201 [VK_FORMAT_B10G10R10A2_SNORM] = { 4, 4 },
202 [VK_FORMAT_B10G10R10A2_USCALED] = { 4, 4 },
203 [VK_FORMAT_B10G10R10A2_SSCALED] = { 4, 4 },
204 [VK_FORMAT_B10G10R10A2_UINT] = { 4, 4 },
205 [VK_FORMAT_B10G10R10A2_SINT] = { 4, 4 },
Chia-I Wub5a1add2014-08-16 12:46:32 +0800206};
207
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600208bool icd_format_is_ds(VkFormat format)
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700209{
210 bool is_ds = false;
211
212 switch (format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600213 case VK_FORMAT_D16_UNORM:
214 case VK_FORMAT_D24_UNORM:
215 case VK_FORMAT_D32_SFLOAT:
216 case VK_FORMAT_S8_UINT:
217 case VK_FORMAT_D16_UNORM_S8_UINT:
218 case VK_FORMAT_D24_UNORM_S8_UINT:
219 case VK_FORMAT_D32_SFLOAT_S8_UINT:
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700220 is_ds = true;
221 break;
222 default:
223 break;
224 }
225
226 return is_ds;
227}
228
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600229bool icd_format_is_norm(VkFormat format)
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700230{
231 bool is_norm = false;
232
233 switch (format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600234 case VK_FORMAT_R4G4_UNORM:
235 case VK_FORMAT_R4G4B4A4_UNORM:
236 case VK_FORMAT_R5G6B5_UNORM:
237 case VK_FORMAT_R5G5B5A1_UNORM:
238 case VK_FORMAT_R8_UNORM:
239 case VK_FORMAT_R8_SNORM:
240 case VK_FORMAT_R8G8_UNORM:
241 case VK_FORMAT_R8G8_SNORM:
242 case VK_FORMAT_R8G8B8_UNORM:
243 case VK_FORMAT_R8G8B8_SNORM:
244 case VK_FORMAT_R8G8B8A8_UNORM:
245 case VK_FORMAT_R8G8B8A8_SNORM:
246 case VK_FORMAT_R10G10B10A2_UNORM:
247 case VK_FORMAT_R10G10B10A2_SNORM:
248 case VK_FORMAT_R16_UNORM:
249 case VK_FORMAT_R16_SNORM:
250 case VK_FORMAT_R16G16_UNORM:
251 case VK_FORMAT_R16G16_SNORM:
252 case VK_FORMAT_R16G16B16_UNORM:
253 case VK_FORMAT_R16G16B16_SNORM:
254 case VK_FORMAT_R16G16B16A16_UNORM:
255 case VK_FORMAT_R16G16B16A16_SNORM:
256 case VK_FORMAT_BC1_RGB_UNORM:
257 case VK_FORMAT_BC2_UNORM:
258 case VK_FORMAT_BC3_UNORM:
259 case VK_FORMAT_BC4_UNORM:
260 case VK_FORMAT_BC4_SNORM:
261 case VK_FORMAT_BC5_UNORM:
262 case VK_FORMAT_BC5_SNORM:
263 case VK_FORMAT_BC7_UNORM:
264 case VK_FORMAT_ETC2_R8G8B8_UNORM:
265 case VK_FORMAT_ETC2_R8G8B8A1_UNORM:
266 case VK_FORMAT_ETC2_R8G8B8A8_UNORM:
267 case VK_FORMAT_EAC_R11_UNORM:
268 case VK_FORMAT_EAC_R11_SNORM:
269 case VK_FORMAT_EAC_R11G11_UNORM:
270 case VK_FORMAT_EAC_R11G11_SNORM:
271 case VK_FORMAT_ASTC_4x4_UNORM:
272 case VK_FORMAT_ASTC_5x4_UNORM:
273 case VK_FORMAT_ASTC_5x5_UNORM:
274 case VK_FORMAT_ASTC_6x5_UNORM:
275 case VK_FORMAT_ASTC_6x6_UNORM:
276 case VK_FORMAT_ASTC_8x5_UNORM:
277 case VK_FORMAT_ASTC_8x6_UNORM:
278 case VK_FORMAT_ASTC_8x8_UNORM:
279 case VK_FORMAT_ASTC_10x5_UNORM:
280 case VK_FORMAT_ASTC_10x6_UNORM:
281 case VK_FORMAT_ASTC_10x8_UNORM:
282 case VK_FORMAT_ASTC_10x10_UNORM:
283 case VK_FORMAT_ASTC_12x10_UNORM:
284 case VK_FORMAT_ASTC_12x12_UNORM:
285 case VK_FORMAT_B5G6R5_UNORM:
286 case VK_FORMAT_B8G8R8_UNORM:
287 case VK_FORMAT_B8G8R8_SNORM:
288 case VK_FORMAT_B8G8R8A8_UNORM:
289 case VK_FORMAT_B8G8R8A8_SNORM:
290 case VK_FORMAT_B10G10R10A2_UNORM:
291 case VK_FORMAT_B10G10R10A2_SNORM:
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700292 is_norm = true;
293 break;
294 default:
295 break;
296 }
297
298 return is_norm;
299};
300
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600301bool icd_format_is_int(VkFormat format)
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700302{
303 bool is_int = false;
304
305 switch (format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600306 case VK_FORMAT_R8_UINT:
307 case VK_FORMAT_R8_SINT:
308 case VK_FORMAT_R8G8_UINT:
309 case VK_FORMAT_R8G8_SINT:
310 case VK_FORMAT_R8G8B8_UINT:
311 case VK_FORMAT_R8G8B8_SINT:
312 case VK_FORMAT_R8G8B8A8_UINT:
313 case VK_FORMAT_R8G8B8A8_SINT:
314 case VK_FORMAT_R10G10B10A2_UINT:
315 case VK_FORMAT_R10G10B10A2_SINT:
316 case VK_FORMAT_R16_UINT:
317 case VK_FORMAT_R16_SINT:
318 case VK_FORMAT_R16G16_UINT:
319 case VK_FORMAT_R16G16_SINT:
320 case VK_FORMAT_R16G16B16_UINT:
321 case VK_FORMAT_R16G16B16_SINT:
322 case VK_FORMAT_R16G16B16A16_UINT:
323 case VK_FORMAT_R16G16B16A16_SINT:
324 case VK_FORMAT_R32_UINT:
325 case VK_FORMAT_R32_SINT:
326 case VK_FORMAT_R32G32_UINT:
327 case VK_FORMAT_R32G32_SINT:
328 case VK_FORMAT_R32G32B32_UINT:
329 case VK_FORMAT_R32G32B32_SINT:
330 case VK_FORMAT_R32G32B32A32_UINT:
331 case VK_FORMAT_R32G32B32A32_SINT:
332 case VK_FORMAT_B8G8R8_UINT:
333 case VK_FORMAT_B8G8R8_SINT:
334 case VK_FORMAT_B8G8R8A8_UINT:
335 case VK_FORMAT_B8G8R8A8_SINT:
336 case VK_FORMAT_B10G10R10A2_UINT:
337 case VK_FORMAT_B10G10R10A2_SINT:
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700338 is_int = true;
339 break;
340 default:
341 break;
342 }
343
344 return is_int;
345}
346
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600347bool icd_format_is_float(VkFormat format)
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700348{
349 bool is_float = false;
350
351 switch (format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600352 case VK_FORMAT_R16_SFLOAT:
353 case VK_FORMAT_R16G16_SFLOAT:
354 case VK_FORMAT_R16G16B16_SFLOAT:
355 case VK_FORMAT_R16G16B16A16_SFLOAT:
356 case VK_FORMAT_R32_SFLOAT:
357 case VK_FORMAT_R32G32_SFLOAT:
358 case VK_FORMAT_R32G32B32_SFLOAT:
359 case VK_FORMAT_R32G32B32A32_SFLOAT:
360 case VK_FORMAT_R64_SFLOAT:
361 case VK_FORMAT_R64G64_SFLOAT:
362 case VK_FORMAT_R64G64B64_SFLOAT:
363 case VK_FORMAT_R64G64B64A64_SFLOAT:
364 case VK_FORMAT_R11G11B10_UFLOAT:
365 case VK_FORMAT_R9G9B9E5_UFLOAT:
366 case VK_FORMAT_BC6H_UFLOAT:
367 case VK_FORMAT_BC6H_SFLOAT:
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700368 is_float = true;
369 break;
370 default:
371 break;
372 }
373
374 return is_float;
375}
376
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600377bool icd_format_is_srgb(VkFormat format)
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700378{
379 bool is_srgb = false;
380
381 switch (format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600382 case VK_FORMAT_R8_SRGB:
383 case VK_FORMAT_R8G8_SRGB:
384 case VK_FORMAT_R8G8B8_SRGB:
385 case VK_FORMAT_R8G8B8A8_SRGB:
386 case VK_FORMAT_BC1_RGB_SRGB:
387 case VK_FORMAT_BC2_SRGB:
388 case VK_FORMAT_BC3_SRGB:
389 case VK_FORMAT_BC7_SRGB:
390 case VK_FORMAT_ASTC_4x4_SRGB:
391 case VK_FORMAT_ASTC_5x4_SRGB:
392 case VK_FORMAT_ASTC_5x5_SRGB:
393 case VK_FORMAT_ASTC_6x5_SRGB:
394 case VK_FORMAT_ASTC_6x6_SRGB:
395 case VK_FORMAT_ASTC_8x5_SRGB:
396 case VK_FORMAT_ASTC_8x6_SRGB:
397 case VK_FORMAT_ASTC_8x8_SRGB:
398 case VK_FORMAT_ASTC_10x5_SRGB:
399 case VK_FORMAT_ASTC_10x6_SRGB:
400 case VK_FORMAT_ASTC_10x8_SRGB:
401 case VK_FORMAT_ASTC_10x10_SRGB:
402 case VK_FORMAT_ASTC_12x10_SRGB:
403 case VK_FORMAT_ASTC_12x12_SRGB:
404 case VK_FORMAT_B8G8R8_SRGB:
405 case VK_FORMAT_B8G8R8A8_SRGB:
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700406 is_srgb = true;
407 break;
408 default:
409 break;
410 }
411
412 return is_srgb;
413}
414
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600415bool icd_format_is_compressed(VkFormat format)
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700416{
417 switch (format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600418 case VK_FORMAT_BC1_RGB_UNORM:
419 case VK_FORMAT_BC1_RGB_SRGB:
420 case VK_FORMAT_BC2_UNORM:
421 case VK_FORMAT_BC2_SRGB:
422 case VK_FORMAT_BC3_UNORM:
423 case VK_FORMAT_BC3_SRGB:
424 case VK_FORMAT_BC4_UNORM:
425 case VK_FORMAT_BC4_SNORM:
426 case VK_FORMAT_BC5_UNORM:
427 case VK_FORMAT_BC5_SNORM:
428 case VK_FORMAT_BC6H_UFLOAT:
429 case VK_FORMAT_BC6H_SFLOAT:
430 case VK_FORMAT_BC7_UNORM:
431 case VK_FORMAT_BC7_SRGB:
432 case VK_FORMAT_ETC2_R8G8B8_UNORM:
433 case VK_FORMAT_ETC2_R8G8B8A1_UNORM:
434 case VK_FORMAT_ETC2_R8G8B8A8_UNORM:
435 case VK_FORMAT_EAC_R11_UNORM:
436 case VK_FORMAT_EAC_R11_SNORM:
437 case VK_FORMAT_EAC_R11G11_UNORM:
438 case VK_FORMAT_EAC_R11G11_SNORM:
439 case VK_FORMAT_ASTC_4x4_UNORM:
440 case VK_FORMAT_ASTC_4x4_SRGB:
441 case VK_FORMAT_ASTC_5x4_UNORM:
442 case VK_FORMAT_ASTC_5x4_SRGB:
443 case VK_FORMAT_ASTC_5x5_UNORM:
444 case VK_FORMAT_ASTC_5x5_SRGB:
445 case VK_FORMAT_ASTC_6x5_UNORM:
446 case VK_FORMAT_ASTC_6x5_SRGB:
447 case VK_FORMAT_ASTC_6x6_UNORM:
448 case VK_FORMAT_ASTC_6x6_SRGB:
449 case VK_FORMAT_ASTC_8x5_UNORM:
450 case VK_FORMAT_ASTC_8x5_SRGB:
451 case VK_FORMAT_ASTC_8x6_UNORM:
452 case VK_FORMAT_ASTC_8x6_SRGB:
453 case VK_FORMAT_ASTC_8x8_UNORM:
454 case VK_FORMAT_ASTC_8x8_SRGB:
455 case VK_FORMAT_ASTC_10x5_UNORM:
456 case VK_FORMAT_ASTC_10x5_SRGB:
457 case VK_FORMAT_ASTC_10x6_UNORM:
458 case VK_FORMAT_ASTC_10x6_SRGB:
459 case VK_FORMAT_ASTC_10x8_UNORM:
460 case VK_FORMAT_ASTC_10x8_SRGB:
461 case VK_FORMAT_ASTC_10x10_UNORM:
462 case VK_FORMAT_ASTC_10x10_SRGB:
463 case VK_FORMAT_ASTC_12x10_UNORM:
464 case VK_FORMAT_ASTC_12x10_SRGB:
465 case VK_FORMAT_ASTC_12x12_UNORM:
466 case VK_FORMAT_ASTC_12x12_SRGB:
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700467 return true;
468 default:
469 return false;
470 }
471}
472
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600473size_t icd_format_get_size(VkFormat format)
Chia-I Wub5a1add2014-08-16 12:46:32 +0800474{
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700475 return icd_format_table[format].size;
Chia-I Wub5a1add2014-08-16 12:46:32 +0800476}
Chia-I Wu40ee55b2014-10-08 09:12:58 +0800477
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600478unsigned int icd_format_get_channel_count(VkFormat format)
Chia-I Wu40ee55b2014-10-08 09:12:58 +0800479{
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700480 return icd_format_table[format].channel_count;
Chia-I Wu40ee55b2014-10-08 09:12:58 +0800481}
Chia-I Wu92096a92014-12-21 23:07:08 +0800482
483/**
484 * Convert a raw RGBA color to a raw value. \p value must have at least
485 * icd_format_get_size(format) bytes.
486 */
Courtney Goeltzenleuchter382489d2015-04-10 08:34:15 -0600487void icd_format_get_raw_value(VkFormat format,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600488 const uint32_t color[4],
Chia-I Wu92096a92014-12-21 23:07:08 +0800489 void *value)
490{
491 /* assume little-endian */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700492 switch (format) {
Tony Barbour8205d902015-04-16 15:59:00 -0600493 case VK_FORMAT_UNDEFINED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800494 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600495 case VK_FORMAT_R4G4_UNORM:
496 case VK_FORMAT_R4G4_USCALED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800497 ((uint8_t *) value)[0] = (color[0] & 0xf) << 0 |
498 (color[1] & 0xf) << 4;
499 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600500 case VK_FORMAT_R4G4B4A4_UNORM:
501 case VK_FORMAT_R4G4B4A4_USCALED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800502 ((uint16_t *) value)[0] = (color[0] & 0xf) << 0 |
503 (color[1] & 0xf) << 4 |
504 (color[2] & 0xf) << 8 |
505 (color[3] & 0xf) << 12;
506 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600507 case VK_FORMAT_R5G6B5_UNORM:
508 case VK_FORMAT_R5G6B5_USCALED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800509 ((uint16_t *) value)[0] = (color[0] & 0x1f) << 0 |
510 (color[1] & 0x3f) << 5 |
511 (color[2] & 0x1f) << 11;
512 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600513 case VK_FORMAT_B5G6R5_UNORM:
Chia-I Wu92096a92014-12-21 23:07:08 +0800514 ((uint16_t *) value)[0] = (color[2] & 0x1f) << 0 |
515 (color[1] & 0x3f) << 5 |
516 (color[0] & 0x1f) << 11;
517 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600518 case VK_FORMAT_R5G5B5A1_UNORM:
519 case VK_FORMAT_R5G5B5A1_USCALED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800520 ((uint16_t *) value)[0] = (color[0] & 0x1f) << 0 |
521 (color[1] & 0x1f) << 5 |
522 (color[2] & 0x1f) << 10 |
523 (color[3] & 0x1) << 15;
524 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600525 case VK_FORMAT_R8_UNORM:
526 case VK_FORMAT_R8_SNORM:
527 case VK_FORMAT_R8_USCALED:
528 case VK_FORMAT_R8_SSCALED:
529 case VK_FORMAT_R8_UINT:
530 case VK_FORMAT_R8_SINT:
531 case VK_FORMAT_R8_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800532 ((uint8_t *) value)[0] = (uint8_t) color[0];
533 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600534 case VK_FORMAT_R8G8_UNORM:
535 case VK_FORMAT_R8G8_SNORM:
536 case VK_FORMAT_R8G8_USCALED:
537 case VK_FORMAT_R8G8_SSCALED:
538 case VK_FORMAT_R8G8_UINT:
539 case VK_FORMAT_R8G8_SINT:
540 case VK_FORMAT_R8G8_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800541 ((uint8_t *) value)[0] = (uint8_t) color[0];
542 ((uint8_t *) value)[1] = (uint8_t) color[1];
543 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600544 case VK_FORMAT_R8G8B8A8_UNORM:
545 case VK_FORMAT_R8G8B8A8_SNORM:
546 case VK_FORMAT_R8G8B8A8_USCALED:
547 case VK_FORMAT_R8G8B8A8_SSCALED:
548 case VK_FORMAT_R8G8B8A8_UINT:
549 case VK_FORMAT_R8G8B8A8_SINT:
550 case VK_FORMAT_R8G8B8A8_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800551 ((uint8_t *) value)[0] = (uint8_t) color[0];
552 ((uint8_t *) value)[1] = (uint8_t) color[1];
553 ((uint8_t *) value)[2] = (uint8_t) color[2];
554 ((uint8_t *) value)[3] = (uint8_t) color[3];
555 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600556 case VK_FORMAT_B8G8R8A8_UNORM:
557 case VK_FORMAT_B8G8R8A8_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800558 ((uint8_t *) value)[0] = (uint8_t) color[2];
559 ((uint8_t *) value)[1] = (uint8_t) color[1];
560 ((uint8_t *) value)[2] = (uint8_t) color[0];
561 ((uint8_t *) value)[3] = (uint8_t) color[3];
562 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600563 case VK_FORMAT_R11G11B10_UFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800564 ((uint32_t *) value)[0] = (color[0] & 0x7ff) << 0 |
565 (color[1] & 0x7ff) << 11 |
566 (color[2] & 0x3ff) << 22;
567 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600568 case VK_FORMAT_R10G10B10A2_UNORM:
569 case VK_FORMAT_R10G10B10A2_SNORM:
570 case VK_FORMAT_R10G10B10A2_USCALED:
571 case VK_FORMAT_R10G10B10A2_SSCALED:
572 case VK_FORMAT_R10G10B10A2_UINT:
573 case VK_FORMAT_R10G10B10A2_SINT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800574 ((uint32_t *) value)[0] = (color[0] & 0x3ff) << 0 |
575 (color[1] & 0x3ff) << 10 |
576 (color[2] & 0x3ff) << 20 |
577 (color[3] & 0x3) << 30;
578 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600579 case VK_FORMAT_R16_UNORM:
580 case VK_FORMAT_R16_SNORM:
581 case VK_FORMAT_R16_USCALED:
582 case VK_FORMAT_R16_SSCALED:
583 case VK_FORMAT_R16_UINT:
584 case VK_FORMAT_R16_SINT:
585 case VK_FORMAT_R16_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800586 ((uint16_t *) value)[0] = (uint16_t) color[0];
587 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600588 case VK_FORMAT_R16G16_UNORM:
589 case VK_FORMAT_R16G16_SNORM:
590 case VK_FORMAT_R16G16_USCALED:
591 case VK_FORMAT_R16G16_SSCALED:
592 case VK_FORMAT_R16G16_UINT:
593 case VK_FORMAT_R16G16_SINT:
594 case VK_FORMAT_R16G16_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800595 ((uint16_t *) value)[0] = (uint16_t) color[0];
596 ((uint16_t *) value)[1] = (uint16_t) color[1];
597 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600598 case VK_FORMAT_R16G16B16A16_UNORM:
599 case VK_FORMAT_R16G16B16A16_SNORM:
600 case VK_FORMAT_R16G16B16A16_USCALED:
601 case VK_FORMAT_R16G16B16A16_SSCALED:
602 case VK_FORMAT_R16G16B16A16_UINT:
603 case VK_FORMAT_R16G16B16A16_SINT:
604 case VK_FORMAT_R16G16B16A16_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800605 ((uint16_t *) value)[0] = (uint16_t) color[0];
606 ((uint16_t *) value)[1] = (uint16_t) color[1];
607 ((uint16_t *) value)[2] = (uint16_t) color[2];
608 ((uint16_t *) value)[3] = (uint16_t) color[3];
609 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600610 case VK_FORMAT_R32_UINT:
611 case VK_FORMAT_R32_SINT:
612 case VK_FORMAT_R32_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800613 ((uint32_t *) value)[0] = color[0];
614 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600615 case VK_FORMAT_R32G32_UINT:
616 case VK_FORMAT_R32G32_SINT:
617 case VK_FORMAT_R32G32_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800618 ((uint32_t *) value)[0] = color[0];
619 ((uint32_t *) value)[1] = color[1];
620 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600621 case VK_FORMAT_R32G32B32_UINT:
622 case VK_FORMAT_R32G32B32_SINT:
623 case VK_FORMAT_R32G32B32_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800624 ((uint32_t *) value)[0] = color[0];
625 ((uint32_t *) value)[1] = color[1];
626 ((uint32_t *) value)[2] = color[2];
627 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600628 case VK_FORMAT_R32G32B32A32_UINT:
629 case VK_FORMAT_R32G32B32A32_SINT:
630 case VK_FORMAT_R32G32B32A32_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800631 ((uint32_t *) value)[0] = color[0];
632 ((uint32_t *) value)[1] = color[1];
633 ((uint32_t *) value)[2] = color[2];
634 ((uint32_t *) value)[3] = color[3];
635 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600636 case VK_FORMAT_D16_UNORM_S8_UINT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800637 ((uint16_t *) value)[0] = (uint16_t) color[0];
638 ((char *) value)[2] = (uint8_t) color[1];
639 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600640 case VK_FORMAT_D32_SFLOAT_S8_UINT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800641 ((uint32_t *) value)[0] = (uint32_t) color[0];
642 ((char *) value)[4] = (uint8_t) color[1];
643 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600644 case VK_FORMAT_R9G9B9E5_UFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800645 ((uint32_t *) value)[0] = (color[0] & 0x1ff) << 0 |
646 (color[1] & 0x1ff) << 9 |
647 (color[2] & 0x1ff) << 18 |
648 (color[3] & 0x1f) << 27;
649 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600650 case VK_FORMAT_BC1_RGB_UNORM:
651 case VK_FORMAT_BC1_RGB_SRGB:
652 case VK_FORMAT_BC4_UNORM:
653 case VK_FORMAT_BC4_SNORM:
Chia-I Wu92096a92014-12-21 23:07:08 +0800654 memcpy(value, color, 8);
655 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600656 case VK_FORMAT_BC2_UNORM:
657 case VK_FORMAT_BC2_SRGB:
658 case VK_FORMAT_BC3_UNORM:
659 case VK_FORMAT_BC3_SRGB:
660 case VK_FORMAT_BC5_UNORM:
661 case VK_FORMAT_BC5_SNORM:
662 case VK_FORMAT_BC6H_UFLOAT:
663 case VK_FORMAT_BC6H_SFLOAT:
664 case VK_FORMAT_BC7_UNORM:
665 case VK_FORMAT_BC7_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800666 memcpy(value, color, 16);
667 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600668 case VK_FORMAT_R8G8B8_UNORM:
669 case VK_FORMAT_R8G8B8_SNORM:
670 case VK_FORMAT_R8G8B8_USCALED:
671 case VK_FORMAT_R8G8B8_SSCALED:
672 case VK_FORMAT_R8G8B8_UINT:
673 case VK_FORMAT_R8G8B8_SINT:
674 case VK_FORMAT_R8G8B8_SRGB:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800675 ((uint8_t *) value)[0] = (uint8_t) color[0];
676 ((uint8_t *) value)[1] = (uint8_t) color[1];
677 ((uint8_t *) value)[2] = (uint8_t) color[2];
678 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600679 case VK_FORMAT_R16G16B16_UNORM:
680 case VK_FORMAT_R16G16B16_SNORM:
681 case VK_FORMAT_R16G16B16_USCALED:
682 case VK_FORMAT_R16G16B16_SSCALED:
683 case VK_FORMAT_R16G16B16_UINT:
684 case VK_FORMAT_R16G16B16_SINT:
685 case VK_FORMAT_R16G16B16_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800686 ((uint16_t *) value)[0] = (uint16_t) color[0];
687 ((uint16_t *) value)[1] = (uint16_t) color[1];
688 ((uint16_t *) value)[2] = (uint16_t) color[2];
689 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600690 case VK_FORMAT_B10G10R10A2_UNORM:
691 case VK_FORMAT_B10G10R10A2_SNORM:
692 case VK_FORMAT_B10G10R10A2_USCALED:
693 case VK_FORMAT_B10G10R10A2_SSCALED:
694 case VK_FORMAT_B10G10R10A2_UINT:
695 case VK_FORMAT_B10G10R10A2_SINT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800696 ((uint32_t *) value)[0] = (color[2] & 0x3ff) << 0 |
697 (color[1] & 0x3ff) << 10 |
698 (color[0] & 0x3ff) << 20 |
699 (color[3] & 0x3) << 30;
700 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600701 case VK_FORMAT_R64_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800702 /* higher 32 bits always 0 */
703 ((uint64_t *) value)[0] = color[0];
704 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600705 case VK_FORMAT_R64G64_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800706 ((uint64_t *) value)[0] = color[0];
707 ((uint64_t *) value)[1] = color[1];
708 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600709 case VK_FORMAT_R64G64B64_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800710 ((uint64_t *) value)[0] = color[0];
711 ((uint64_t *) value)[1] = color[1];
712 ((uint64_t *) value)[2] = color[2];
713 break;
Tony Barbour8205d902015-04-16 15:59:00 -0600714 case VK_FORMAT_R64G64B64A64_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800715 ((uint64_t *) value)[0] = color[0];
716 ((uint64_t *) value)[1] = color[1];
717 ((uint64_t *) value)[2] = color[2];
718 ((uint64_t *) value)[3] = color[3];
719 break;
Chia-I Wu92096a92014-12-21 23:07:08 +0800720 default:
721 assert(!"unknown format");
722 break;
723 }
724}