blob: dff3638cc34104656e2ae141140f0ff39d105bd0 [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;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -060035} icd_format_table[VK_NUM_FMT] = {
36 [VK_FMT_UNDEFINED] = { 0, 0 },
37 [VK_FMT_R4G4_UNORM] = { 1, 2 },
38 [VK_FMT_R4G4_USCALED] = { 1, 2 },
39 [VK_FMT_R4G4B4A4_UNORM] = { 2, 4 },
40 [VK_FMT_R4G4B4A4_USCALED] = { 2, 4 },
41 [VK_FMT_R5G6B5_UNORM] = { 2, 3 },
42 [VK_FMT_R5G6B5_USCALED] = { 2, 3 },
43 [VK_FMT_R5G5B5A1_UNORM] = { 2, 4 },
44 [VK_FMT_R5G5B5A1_USCALED] = { 2, 4 },
45 [VK_FMT_R8_UNORM] = { 1, 1 },
46 [VK_FMT_R8_SNORM] = { 1, 1 },
47 [VK_FMT_R8_USCALED] = { 1, 1 },
48 [VK_FMT_R8_SSCALED] = { 1, 1 },
49 [VK_FMT_R8_UINT] = { 1, 1 },
50 [VK_FMT_R8_SINT] = { 1, 1 },
51 [VK_FMT_R8_SRGB] = { 1, 1 },
52 [VK_FMT_R8G8_UNORM] = { 2, 2 },
53 [VK_FMT_R8G8_SNORM] = { 2, 2 },
54 [VK_FMT_R8G8_USCALED] = { 2, 2 },
55 [VK_FMT_R8G8_SSCALED] = { 2, 2 },
56 [VK_FMT_R8G8_UINT] = { 2, 2 },
57 [VK_FMT_R8G8_SINT] = { 2, 2 },
58 [VK_FMT_R8G8_SRGB] = { 2, 2 },
59 [VK_FMT_R8G8B8_UNORM] = { 3, 3 },
60 [VK_FMT_R8G8B8_SNORM] = { 3, 3 },
61 [VK_FMT_R8G8B8_USCALED] = { 3, 3 },
62 [VK_FMT_R8G8B8_SSCALED] = { 3, 3 },
63 [VK_FMT_R8G8B8_UINT] = { 3, 3 },
64 [VK_FMT_R8G8B8_SINT] = { 3, 3 },
65 [VK_FMT_R8G8B8_SRGB] = { 3, 3 },
66 [VK_FMT_R8G8B8A8_UNORM] = { 4, 4 },
67 [VK_FMT_R8G8B8A8_SNORM] = { 4, 4 },
68 [VK_FMT_R8G8B8A8_USCALED] = { 4, 4 },
69 [VK_FMT_R8G8B8A8_SSCALED] = { 4, 4 },
70 [VK_FMT_R8G8B8A8_UINT] = { 4, 4 },
71 [VK_FMT_R8G8B8A8_SINT] = { 4, 4 },
72 [VK_FMT_R8G8B8A8_SRGB] = { 4, 4 },
73 [VK_FMT_R10G10B10A2_UNORM] = { 4, 4 },
74 [VK_FMT_R10G10B10A2_SNORM] = { 4, 4 },
75 [VK_FMT_R10G10B10A2_USCALED] = { 4, 4 },
76 [VK_FMT_R10G10B10A2_SSCALED] = { 4, 4 },
77 [VK_FMT_R10G10B10A2_UINT] = { 4, 4 },
78 [VK_FMT_R10G10B10A2_SINT] = { 4, 4 },
79 [VK_FMT_R16_UNORM] = { 2, 1 },
80 [VK_FMT_R16_SNORM] = { 2, 1 },
81 [VK_FMT_R16_USCALED] = { 2, 1 },
82 [VK_FMT_R16_SSCALED] = { 2, 1 },
83 [VK_FMT_R16_UINT] = { 2, 1 },
84 [VK_FMT_R16_SINT] = { 2, 1 },
85 [VK_FMT_R16_SFLOAT] = { 2, 1 },
86 [VK_FMT_R16G16_UNORM] = { 4, 2 },
87 [VK_FMT_R16G16_SNORM] = { 4, 2 },
88 [VK_FMT_R16G16_USCALED] = { 4, 2 },
89 [VK_FMT_R16G16_SSCALED] = { 4, 2 },
90 [VK_FMT_R16G16_UINT] = { 4, 2 },
91 [VK_FMT_R16G16_SINT] = { 4, 2 },
92 [VK_FMT_R16G16_SFLOAT] = { 4, 2 },
93 [VK_FMT_R16G16B16_UNORM] = { 6, 3 },
94 [VK_FMT_R16G16B16_SNORM] = { 6, 3 },
95 [VK_FMT_R16G16B16_USCALED] = { 6, 3 },
96 [VK_FMT_R16G16B16_SSCALED] = { 6, 3 },
97 [VK_FMT_R16G16B16_UINT] = { 6, 3 },
98 [VK_FMT_R16G16B16_SINT] = { 6, 3 },
99 [VK_FMT_R16G16B16_SFLOAT] = { 6, 3 },
100 [VK_FMT_R16G16B16A16_UNORM] = { 8, 4 },
101 [VK_FMT_R16G16B16A16_SNORM] = { 8, 4 },
102 [VK_FMT_R16G16B16A16_USCALED] = { 8, 4 },
103 [VK_FMT_R16G16B16A16_SSCALED] = { 8, 4 },
104 [VK_FMT_R16G16B16A16_UINT] = { 8, 4 },
105 [VK_FMT_R16G16B16A16_SINT] = { 8, 4 },
106 [VK_FMT_R16G16B16A16_SFLOAT] = { 8, 4 },
107 [VK_FMT_R32_UINT] = { 4, 1 },
108 [VK_FMT_R32_SINT] = { 4, 1 },
109 [VK_FMT_R32_SFLOAT] = { 4, 1 },
110 [VK_FMT_R32G32_UINT] = { 8, 2 },
111 [VK_FMT_R32G32_SINT] = { 8, 2 },
112 [VK_FMT_R32G32_SFLOAT] = { 8, 2 },
113 [VK_FMT_R32G32B32_UINT] = { 12, 3 },
114 [VK_FMT_R32G32B32_SINT] = { 12, 3 },
115 [VK_FMT_R32G32B32_SFLOAT] = { 12, 3 },
116 [VK_FMT_R32G32B32A32_UINT] = { 16, 4 },
117 [VK_FMT_R32G32B32A32_SINT] = { 16, 4 },
118 [VK_FMT_R32G32B32A32_SFLOAT] = { 16, 4 },
119 [VK_FMT_R64_SFLOAT] = { 8, 1 },
120 [VK_FMT_R64G64_SFLOAT] = { 16, 2 },
121 [VK_FMT_R64G64B64_SFLOAT] = { 24, 3 },
122 [VK_FMT_R64G64B64A64_SFLOAT] = { 32, 4 },
123 [VK_FMT_R11G11B10_UFLOAT] = { 4, 3 },
124 [VK_FMT_R9G9B9E5_UFLOAT] = { 4, 3 },
125 [VK_FMT_D16_UNORM] = { 2, 1 },
126 [VK_FMT_D24_UNORM] = { 3, 1 },
127 [VK_FMT_D32_SFLOAT] = { 4, 1 },
128 [VK_FMT_S8_UINT] = { 1, 1 },
129 [VK_FMT_D16_UNORM_S8_UINT] = { 3, 2 },
130 [VK_FMT_D24_UNORM_S8_UINT] = { 4, 2 },
131 [VK_FMT_D32_SFLOAT_S8_UINT] = { 4, 2 },
132 [VK_FMT_BC1_RGB_UNORM] = { 8, 4 },
133 [VK_FMT_BC1_RGB_SRGB] = { 8, 4 },
134 [VK_FMT_BC1_RGBA_UNORM] = { 8, 4 },
135 [VK_FMT_BC1_RGBA_SRGB] = { 8, 4 },
136 [VK_FMT_BC2_UNORM] = { 16, 4 },
137 [VK_FMT_BC2_SRGB] = { 16, 4 },
138 [VK_FMT_BC3_UNORM] = { 16, 4 },
139 [VK_FMT_BC3_SRGB] = { 16, 4 },
140 [VK_FMT_BC4_UNORM] = { 8, 4 },
141 [VK_FMT_BC4_SNORM] = { 8, 4 },
142 [VK_FMT_BC5_UNORM] = { 16, 4 },
143 [VK_FMT_BC5_SNORM] = { 16, 4 },
144 [VK_FMT_BC6H_UFLOAT] = { 16, 4 },
145 [VK_FMT_BC6H_SFLOAT] = { 16, 4 },
146 [VK_FMT_BC7_UNORM] = { 16, 4 },
147 [VK_FMT_BC7_SRGB] = { 16, 4 },
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700148 /* TODO: Initialize remaining compressed formats. */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600149 [VK_FMT_ETC2_R8G8B8_UNORM] = { 0, 0 },
150 [VK_FMT_ETC2_R8G8B8A1_UNORM] = { 0, 0 },
151 [VK_FMT_ETC2_R8G8B8A8_UNORM] = { 0, 0 },
152 [VK_FMT_EAC_R11_UNORM] = { 0, 0 },
153 [VK_FMT_EAC_R11_SNORM] = { 0, 0 },
154 [VK_FMT_EAC_R11G11_UNORM] = { 0, 0 },
155 [VK_FMT_EAC_R11G11_SNORM] = { 0, 0 },
156 [VK_FMT_ASTC_4x4_UNORM] = { 0, 0 },
157 [VK_FMT_ASTC_4x4_SRGB] = { 0, 0 },
158 [VK_FMT_ASTC_5x4_UNORM] = { 0, 0 },
159 [VK_FMT_ASTC_5x4_SRGB] = { 0, 0 },
160 [VK_FMT_ASTC_5x5_UNORM] = { 0, 0 },
161 [VK_FMT_ASTC_5x5_SRGB] = { 0, 0 },
162 [VK_FMT_ASTC_6x5_UNORM] = { 0, 0 },
163 [VK_FMT_ASTC_6x5_SRGB] = { 0, 0 },
164 [VK_FMT_ASTC_6x6_UNORM] = { 0, 0 },
165 [VK_FMT_ASTC_6x6_SRGB] = { 0, 0 },
166 [VK_FMT_ASTC_8x5_UNORM] = { 0, 0 },
167 [VK_FMT_ASTC_8x5_SRGB] = { 0, 0 },
168 [VK_FMT_ASTC_8x6_UNORM] = { 0, 0 },
169 [VK_FMT_ASTC_8x6_SRGB] = { 0, 0 },
170 [VK_FMT_ASTC_8x8_UNORM] = { 0, 0 },
171 [VK_FMT_ASTC_8x8_SRGB] = { 0, 0 },
172 [VK_FMT_ASTC_10x5_UNORM] = { 0, 0 },
173 [VK_FMT_ASTC_10x5_SRGB] = { 0, 0 },
174 [VK_FMT_ASTC_10x6_UNORM] = { 0, 0 },
175 [VK_FMT_ASTC_10x6_SRGB] = { 0, 0 },
176 [VK_FMT_ASTC_10x8_UNORM] = { 0, 0 },
177 [VK_FMT_ASTC_10x8_SRGB] = { 0, 0 },
178 [VK_FMT_ASTC_10x10_UNORM] = { 0, 0 },
179 [VK_FMT_ASTC_10x10_SRGB] = { 0, 0 },
180 [VK_FMT_ASTC_12x10_UNORM] = { 0, 0 },
181 [VK_FMT_ASTC_12x10_SRGB] = { 0, 0 },
182 [VK_FMT_ASTC_12x12_UNORM] = { 0, 0 },
183 [VK_FMT_ASTC_12x12_SRGB] = { 0, 0 },
184 [VK_FMT_B5G6R5_UNORM] = { 2, 3 },
185 [VK_FMT_B5G6R5_USCALED] = { 2, 3 },
186 [VK_FMT_B8G8R8_UNORM] = { 3, 3 },
187 [VK_FMT_B8G8R8_SNORM] = { 3, 3 },
188 [VK_FMT_B8G8R8_USCALED] = { 3, 3 },
189 [VK_FMT_B8G8R8_SSCALED] = { 3, 3 },
190 [VK_FMT_B8G8R8_UINT] = { 3, 3 },
191 [VK_FMT_B8G8R8_SINT] = { 3, 3 },
192 [VK_FMT_B8G8R8_SRGB] = { 3, 3 },
193 [VK_FMT_B8G8R8A8_UNORM] = { 4, 4 },
194 [VK_FMT_B8G8R8A8_SNORM] = { 4, 4 },
195 [VK_FMT_B8G8R8A8_USCALED] = { 4, 4 },
196 [VK_FMT_B8G8R8A8_SSCALED] = { 4, 4 },
197 [VK_FMT_B8G8R8A8_UINT] = { 4, 4 },
198 [VK_FMT_B8G8R8A8_SINT] = { 4, 4 },
199 [VK_FMT_B8G8R8A8_SRGB] = { 4, 4 },
200 [VK_FMT_B10G10R10A2_UNORM] = { 4, 4 },
201 [VK_FMT_B10G10R10A2_SNORM] = { 4, 4 },
202 [VK_FMT_B10G10R10A2_USCALED] = { 4, 4 },
203 [VK_FMT_B10G10R10A2_SSCALED] = { 4, 4 },
204 [VK_FMT_B10G10R10A2_UINT] = { 4, 4 },
205 [VK_FMT_B10G10R10A2_SINT] = { 4, 4 },
Chia-I Wub5a1add2014-08-16 12:46:32 +0800206};
207
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600208bool icd_format_is_ds(VK_FORMAT format)
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700209{
210 bool is_ds = false;
211
212 switch (format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600213 case VK_FMT_D16_UNORM:
214 case VK_FMT_D24_UNORM:
215 case VK_FMT_D32_SFLOAT:
216 case VK_FMT_S8_UINT:
217 case VK_FMT_D16_UNORM_S8_UINT:
218 case VK_FMT_D24_UNORM_S8_UINT:
219 case VK_FMT_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 Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600229bool icd_format_is_norm(VK_FORMAT format)
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700230{
231 bool is_norm = false;
232
233 switch (format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600234 case VK_FMT_R4G4_UNORM:
235 case VK_FMT_R4G4B4A4_UNORM:
236 case VK_FMT_R5G6B5_UNORM:
237 case VK_FMT_R5G5B5A1_UNORM:
238 case VK_FMT_R8_UNORM:
239 case VK_FMT_R8_SNORM:
240 case VK_FMT_R8G8_UNORM:
241 case VK_FMT_R8G8_SNORM:
242 case VK_FMT_R8G8B8_UNORM:
243 case VK_FMT_R8G8B8_SNORM:
244 case VK_FMT_R8G8B8A8_UNORM:
245 case VK_FMT_R8G8B8A8_SNORM:
246 case VK_FMT_R10G10B10A2_UNORM:
247 case VK_FMT_R10G10B10A2_SNORM:
248 case VK_FMT_R16_UNORM:
249 case VK_FMT_R16_SNORM:
250 case VK_FMT_R16G16_UNORM:
251 case VK_FMT_R16G16_SNORM:
252 case VK_FMT_R16G16B16_UNORM:
253 case VK_FMT_R16G16B16_SNORM:
254 case VK_FMT_R16G16B16A16_UNORM:
255 case VK_FMT_R16G16B16A16_SNORM:
256 case VK_FMT_BC1_RGB_UNORM:
257 case VK_FMT_BC2_UNORM:
258 case VK_FMT_BC3_UNORM:
259 case VK_FMT_BC4_UNORM:
260 case VK_FMT_BC4_SNORM:
261 case VK_FMT_BC5_UNORM:
262 case VK_FMT_BC5_SNORM:
263 case VK_FMT_BC7_UNORM:
264 case VK_FMT_ETC2_R8G8B8_UNORM:
265 case VK_FMT_ETC2_R8G8B8A1_UNORM:
266 case VK_FMT_ETC2_R8G8B8A8_UNORM:
267 case VK_FMT_EAC_R11_UNORM:
268 case VK_FMT_EAC_R11_SNORM:
269 case VK_FMT_EAC_R11G11_UNORM:
270 case VK_FMT_EAC_R11G11_SNORM:
271 case VK_FMT_ASTC_4x4_UNORM:
272 case VK_FMT_ASTC_5x4_UNORM:
273 case VK_FMT_ASTC_5x5_UNORM:
274 case VK_FMT_ASTC_6x5_UNORM:
275 case VK_FMT_ASTC_6x6_UNORM:
276 case VK_FMT_ASTC_8x5_UNORM:
277 case VK_FMT_ASTC_8x6_UNORM:
278 case VK_FMT_ASTC_8x8_UNORM:
279 case VK_FMT_ASTC_10x5_UNORM:
280 case VK_FMT_ASTC_10x6_UNORM:
281 case VK_FMT_ASTC_10x8_UNORM:
282 case VK_FMT_ASTC_10x10_UNORM:
283 case VK_FMT_ASTC_12x10_UNORM:
284 case VK_FMT_ASTC_12x12_UNORM:
285 case VK_FMT_B5G6R5_UNORM:
286 case VK_FMT_B8G8R8_UNORM:
287 case VK_FMT_B8G8R8_SNORM:
288 case VK_FMT_B8G8R8A8_UNORM:
289 case VK_FMT_B8G8R8A8_SNORM:
290 case VK_FMT_B10G10R10A2_UNORM:
291 case VK_FMT_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 Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600301bool icd_format_is_int(VK_FORMAT format)
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700302{
303 bool is_int = false;
304
305 switch (format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600306 case VK_FMT_R8_UINT:
307 case VK_FMT_R8_SINT:
308 case VK_FMT_R8G8_UINT:
309 case VK_FMT_R8G8_SINT:
310 case VK_FMT_R8G8B8_UINT:
311 case VK_FMT_R8G8B8_SINT:
312 case VK_FMT_R8G8B8A8_UINT:
313 case VK_FMT_R8G8B8A8_SINT:
314 case VK_FMT_R10G10B10A2_UINT:
315 case VK_FMT_R10G10B10A2_SINT:
316 case VK_FMT_R16_UINT:
317 case VK_FMT_R16_SINT:
318 case VK_FMT_R16G16_UINT:
319 case VK_FMT_R16G16_SINT:
320 case VK_FMT_R16G16B16_UINT:
321 case VK_FMT_R16G16B16_SINT:
322 case VK_FMT_R16G16B16A16_UINT:
323 case VK_FMT_R16G16B16A16_SINT:
324 case VK_FMT_R32_UINT:
325 case VK_FMT_R32_SINT:
326 case VK_FMT_R32G32_UINT:
327 case VK_FMT_R32G32_SINT:
328 case VK_FMT_R32G32B32_UINT:
329 case VK_FMT_R32G32B32_SINT:
330 case VK_FMT_R32G32B32A32_UINT:
331 case VK_FMT_R32G32B32A32_SINT:
332 case VK_FMT_B8G8R8_UINT:
333 case VK_FMT_B8G8R8_SINT:
334 case VK_FMT_B8G8R8A8_UINT:
335 case VK_FMT_B8G8R8A8_SINT:
336 case VK_FMT_B10G10R10A2_UINT:
337 case VK_FMT_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 Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600347bool icd_format_is_float(VK_FORMAT format)
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700348{
349 bool is_float = false;
350
351 switch (format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600352 case VK_FMT_R16_SFLOAT:
353 case VK_FMT_R16G16_SFLOAT:
354 case VK_FMT_R16G16B16_SFLOAT:
355 case VK_FMT_R16G16B16A16_SFLOAT:
356 case VK_FMT_R32_SFLOAT:
357 case VK_FMT_R32G32_SFLOAT:
358 case VK_FMT_R32G32B32_SFLOAT:
359 case VK_FMT_R32G32B32A32_SFLOAT:
360 case VK_FMT_R64_SFLOAT:
361 case VK_FMT_R64G64_SFLOAT:
362 case VK_FMT_R64G64B64_SFLOAT:
363 case VK_FMT_R64G64B64A64_SFLOAT:
364 case VK_FMT_R11G11B10_UFLOAT:
365 case VK_FMT_R9G9B9E5_UFLOAT:
366 case VK_FMT_BC6H_UFLOAT:
367 case VK_FMT_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 Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600377bool icd_format_is_srgb(VK_FORMAT format)
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700378{
379 bool is_srgb = false;
380
381 switch (format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600382 case VK_FMT_R8_SRGB:
383 case VK_FMT_R8G8_SRGB:
384 case VK_FMT_R8G8B8_SRGB:
385 case VK_FMT_R8G8B8A8_SRGB:
386 case VK_FMT_BC1_RGB_SRGB:
387 case VK_FMT_BC2_SRGB:
388 case VK_FMT_BC3_SRGB:
389 case VK_FMT_BC7_SRGB:
390 case VK_FMT_ASTC_4x4_SRGB:
391 case VK_FMT_ASTC_5x4_SRGB:
392 case VK_FMT_ASTC_5x5_SRGB:
393 case VK_FMT_ASTC_6x5_SRGB:
394 case VK_FMT_ASTC_6x6_SRGB:
395 case VK_FMT_ASTC_8x5_SRGB:
396 case VK_FMT_ASTC_8x6_SRGB:
397 case VK_FMT_ASTC_8x8_SRGB:
398 case VK_FMT_ASTC_10x5_SRGB:
399 case VK_FMT_ASTC_10x6_SRGB:
400 case VK_FMT_ASTC_10x8_SRGB:
401 case VK_FMT_ASTC_10x10_SRGB:
402 case VK_FMT_ASTC_12x10_SRGB:
403 case VK_FMT_ASTC_12x12_SRGB:
404 case VK_FMT_B8G8R8_SRGB:
405 case VK_FMT_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 Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600415bool icd_format_is_compressed(VK_FORMAT format)
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700416{
417 switch (format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600418 case VK_FMT_BC1_RGB_UNORM:
419 case VK_FMT_BC1_RGB_SRGB:
420 case VK_FMT_BC2_UNORM:
421 case VK_FMT_BC2_SRGB:
422 case VK_FMT_BC3_UNORM:
423 case VK_FMT_BC3_SRGB:
424 case VK_FMT_BC4_UNORM:
425 case VK_FMT_BC4_SNORM:
426 case VK_FMT_BC5_UNORM:
427 case VK_FMT_BC5_SNORM:
428 case VK_FMT_BC6H_UFLOAT:
429 case VK_FMT_BC6H_SFLOAT:
430 case VK_FMT_BC7_UNORM:
431 case VK_FMT_BC7_SRGB:
432 case VK_FMT_ETC2_R8G8B8_UNORM:
433 case VK_FMT_ETC2_R8G8B8A1_UNORM:
434 case VK_FMT_ETC2_R8G8B8A8_UNORM:
435 case VK_FMT_EAC_R11_UNORM:
436 case VK_FMT_EAC_R11_SNORM:
437 case VK_FMT_EAC_R11G11_UNORM:
438 case VK_FMT_EAC_R11G11_SNORM:
439 case VK_FMT_ASTC_4x4_UNORM:
440 case VK_FMT_ASTC_4x4_SRGB:
441 case VK_FMT_ASTC_5x4_UNORM:
442 case VK_FMT_ASTC_5x4_SRGB:
443 case VK_FMT_ASTC_5x5_UNORM:
444 case VK_FMT_ASTC_5x5_SRGB:
445 case VK_FMT_ASTC_6x5_UNORM:
446 case VK_FMT_ASTC_6x5_SRGB:
447 case VK_FMT_ASTC_6x6_UNORM:
448 case VK_FMT_ASTC_6x6_SRGB:
449 case VK_FMT_ASTC_8x5_UNORM:
450 case VK_FMT_ASTC_8x5_SRGB:
451 case VK_FMT_ASTC_8x6_UNORM:
452 case VK_FMT_ASTC_8x6_SRGB:
453 case VK_FMT_ASTC_8x8_UNORM:
454 case VK_FMT_ASTC_8x8_SRGB:
455 case VK_FMT_ASTC_10x5_UNORM:
456 case VK_FMT_ASTC_10x5_SRGB:
457 case VK_FMT_ASTC_10x6_UNORM:
458 case VK_FMT_ASTC_10x6_SRGB:
459 case VK_FMT_ASTC_10x8_UNORM:
460 case VK_FMT_ASTC_10x8_SRGB:
461 case VK_FMT_ASTC_10x10_UNORM:
462 case VK_FMT_ASTC_10x10_SRGB:
463 case VK_FMT_ASTC_12x10_UNORM:
464 case VK_FMT_ASTC_12x10_SRGB:
465 case VK_FMT_ASTC_12x12_UNORM:
466 case VK_FMT_ASTC_12x12_SRGB:
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700467 return true;
468 default:
469 return false;
470 }
471}
472
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600473size_t icd_format_get_size(VK_FORMAT 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 Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600478VK_IMAGE_FORMAT_CLASS icd_format_get_class(VK_FORMAT format)
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700479{
480 if (icd_format_is_undef(format))
481 assert(!"undefined format");
482 if (icd_format_is_compressed(format)) {
483 switch (icd_format_get_size(format)) {
484 case 8:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600485 return VK_IMAGE_FORMAT_CLASS_64_BIT_BLOCK;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700486 case 16:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600487 return VK_IMAGE_FORMAT_CLASS_128_BIT_BLOCK;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700488 default:
489 assert(!"illegal compressed format");
490 }
491 } else if (icd_format_is_ds(format)) {
492 switch (icd_format_get_size(format)) {
493 case 1:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600494 return VK_IMAGE_FORMAT_CLASS_S8;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700495 case 2:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600496 return VK_IMAGE_FORMAT_CLASS_D16;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700497 case 3:
498 switch (icd_format_get_channel_count(format)) {
499 case 1:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600500 return VK_IMAGE_FORMAT_CLASS_D24;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700501 case 2:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600502 return VK_IMAGE_FORMAT_CLASS_D16S8;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700503 default:
504 assert(!"illegal depth stencil format channels");
505 }
506 case 4:
507 switch (icd_format_get_channel_count(format)) {
508 case 1:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600509 return VK_IMAGE_FORMAT_CLASS_D32;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700510 case 2:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600511 return VK_IMAGE_FORMAT_CLASS_D24S8;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700512 default:
513 assert(!"illegal depth stencil format channels");
514 }
515 case 5:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600516 return VK_IMAGE_FORMAT_CLASS_D32S8;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700517 default:
518 assert(!"illegal depth stencil format");
519 }
520 } else { /* uncompressed color format */
521 switch (icd_format_get_size(format)) {
522 case 1:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600523 return VK_IMAGE_FORMAT_CLASS_8_BITS;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700524 case 2:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600525 return VK_IMAGE_FORMAT_CLASS_16_BITS;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700526 case 3:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600527 return VK_IMAGE_FORMAT_CLASS_24_BITS;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700528 case 4:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600529 return VK_IMAGE_FORMAT_CLASS_32_BITS;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700530 case 6:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600531 return VK_IMAGE_FORMAT_CLASS_48_BITS;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700532 case 8:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600533 return VK_IMAGE_FORMAT_CLASS_64_BITS;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700534 case 12:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600535 return VK_IMAGE_FORMAT_CLASS_96_BITS;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700536 case 16:
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600537 return VK_IMAGE_FORMAT_CLASS_128_BITS;
Jon Ashburnc6ae13d2015-01-19 15:00:26 -0700538 default:
539 assert(!"illegal uncompressed color format");
540 }
541 }
542}
543
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600544unsigned int icd_format_get_channel_count(VK_FORMAT format)
Chia-I Wu40ee55b2014-10-08 09:12:58 +0800545{
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700546 return icd_format_table[format].channel_count;
Chia-I Wu40ee55b2014-10-08 09:12:58 +0800547}
Chia-I Wu92096a92014-12-21 23:07:08 +0800548
549/**
550 * Convert a raw RGBA color to a raw value. \p value must have at least
551 * icd_format_get_size(format) bytes.
552 */
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600553void icd_format_get_raw_value(VK_FORMAT format,
Mark Lobodzinskie2d07a52015-01-29 08:55:56 -0600554 const uint32_t color[4],
Chia-I Wu92096a92014-12-21 23:07:08 +0800555 void *value)
556{
557 /* assume little-endian */
Jeremy Hayes2b7e88a2015-01-23 08:51:43 -0700558 switch (format) {
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600559 case VK_FMT_UNDEFINED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800560 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600561 case VK_FMT_R4G4_UNORM:
562 case VK_FMT_R4G4_USCALED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800563 ((uint8_t *) value)[0] = (color[0] & 0xf) << 0 |
564 (color[1] & 0xf) << 4;
565 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600566 case VK_FMT_R4G4B4A4_UNORM:
567 case VK_FMT_R4G4B4A4_USCALED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800568 ((uint16_t *) value)[0] = (color[0] & 0xf) << 0 |
569 (color[1] & 0xf) << 4 |
570 (color[2] & 0xf) << 8 |
571 (color[3] & 0xf) << 12;
572 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600573 case VK_FMT_R5G6B5_UNORM:
574 case VK_FMT_R5G6B5_USCALED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800575 ((uint16_t *) value)[0] = (color[0] & 0x1f) << 0 |
576 (color[1] & 0x3f) << 5 |
577 (color[2] & 0x1f) << 11;
578 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600579 case VK_FMT_B5G6R5_UNORM:
Chia-I Wu92096a92014-12-21 23:07:08 +0800580 ((uint16_t *) value)[0] = (color[2] & 0x1f) << 0 |
581 (color[1] & 0x3f) << 5 |
582 (color[0] & 0x1f) << 11;
583 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600584 case VK_FMT_R5G5B5A1_UNORM:
585 case VK_FMT_R5G5B5A1_USCALED:
Chia-I Wu92096a92014-12-21 23:07:08 +0800586 ((uint16_t *) value)[0] = (color[0] & 0x1f) << 0 |
587 (color[1] & 0x1f) << 5 |
588 (color[2] & 0x1f) << 10 |
589 (color[3] & 0x1) << 15;
590 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600591 case VK_FMT_R8_UNORM:
592 case VK_FMT_R8_SNORM:
593 case VK_FMT_R8_USCALED:
594 case VK_FMT_R8_SSCALED:
595 case VK_FMT_R8_UINT:
596 case VK_FMT_R8_SINT:
597 case VK_FMT_R8_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800598 ((uint8_t *) value)[0] = (uint8_t) color[0];
599 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600600 case VK_FMT_R8G8_UNORM:
601 case VK_FMT_R8G8_SNORM:
602 case VK_FMT_R8G8_USCALED:
603 case VK_FMT_R8G8_SSCALED:
604 case VK_FMT_R8G8_UINT:
605 case VK_FMT_R8G8_SINT:
606 case VK_FMT_R8G8_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800607 ((uint8_t *) value)[0] = (uint8_t) color[0];
608 ((uint8_t *) value)[1] = (uint8_t) color[1];
609 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600610 case VK_FMT_R8G8B8A8_UNORM:
611 case VK_FMT_R8G8B8A8_SNORM:
612 case VK_FMT_R8G8B8A8_USCALED:
613 case VK_FMT_R8G8B8A8_SSCALED:
614 case VK_FMT_R8G8B8A8_UINT:
615 case VK_FMT_R8G8B8A8_SINT:
616 case VK_FMT_R8G8B8A8_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800617 ((uint8_t *) value)[0] = (uint8_t) color[0];
618 ((uint8_t *) value)[1] = (uint8_t) color[1];
619 ((uint8_t *) value)[2] = (uint8_t) color[2];
620 ((uint8_t *) value)[3] = (uint8_t) color[3];
621 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600622 case VK_FMT_B8G8R8A8_UNORM:
623 case VK_FMT_B8G8R8A8_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800624 ((uint8_t *) value)[0] = (uint8_t) color[2];
625 ((uint8_t *) value)[1] = (uint8_t) color[1];
626 ((uint8_t *) value)[2] = (uint8_t) color[0];
627 ((uint8_t *) value)[3] = (uint8_t) color[3];
628 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600629 case VK_FMT_R11G11B10_UFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800630 ((uint32_t *) value)[0] = (color[0] & 0x7ff) << 0 |
631 (color[1] & 0x7ff) << 11 |
632 (color[2] & 0x3ff) << 22;
633 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600634 case VK_FMT_R10G10B10A2_UNORM:
635 case VK_FMT_R10G10B10A2_SNORM:
636 case VK_FMT_R10G10B10A2_USCALED:
637 case VK_FMT_R10G10B10A2_SSCALED:
638 case VK_FMT_R10G10B10A2_UINT:
639 case VK_FMT_R10G10B10A2_SINT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800640 ((uint32_t *) value)[0] = (color[0] & 0x3ff) << 0 |
641 (color[1] & 0x3ff) << 10 |
642 (color[2] & 0x3ff) << 20 |
643 (color[3] & 0x3) << 30;
644 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600645 case VK_FMT_R16_UNORM:
646 case VK_FMT_R16_SNORM:
647 case VK_FMT_R16_USCALED:
648 case VK_FMT_R16_SSCALED:
649 case VK_FMT_R16_UINT:
650 case VK_FMT_R16_SINT:
651 case VK_FMT_R16_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800652 ((uint16_t *) value)[0] = (uint16_t) color[0];
653 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600654 case VK_FMT_R16G16_UNORM:
655 case VK_FMT_R16G16_SNORM:
656 case VK_FMT_R16G16_USCALED:
657 case VK_FMT_R16G16_SSCALED:
658 case VK_FMT_R16G16_UINT:
659 case VK_FMT_R16G16_SINT:
660 case VK_FMT_R16G16_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800661 ((uint16_t *) value)[0] = (uint16_t) color[0];
662 ((uint16_t *) value)[1] = (uint16_t) color[1];
663 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600664 case VK_FMT_R16G16B16A16_UNORM:
665 case VK_FMT_R16G16B16A16_SNORM:
666 case VK_FMT_R16G16B16A16_USCALED:
667 case VK_FMT_R16G16B16A16_SSCALED:
668 case VK_FMT_R16G16B16A16_UINT:
669 case VK_FMT_R16G16B16A16_SINT:
670 case VK_FMT_R16G16B16A16_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800671 ((uint16_t *) value)[0] = (uint16_t) color[0];
672 ((uint16_t *) value)[1] = (uint16_t) color[1];
673 ((uint16_t *) value)[2] = (uint16_t) color[2];
674 ((uint16_t *) value)[3] = (uint16_t) color[3];
675 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600676 case VK_FMT_R32_UINT:
677 case VK_FMT_R32_SINT:
678 case VK_FMT_R32_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800679 ((uint32_t *) value)[0] = color[0];
680 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600681 case VK_FMT_R32G32_UINT:
682 case VK_FMT_R32G32_SINT:
683 case VK_FMT_R32G32_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800684 ((uint32_t *) value)[0] = color[0];
685 ((uint32_t *) value)[1] = color[1];
686 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600687 case VK_FMT_R32G32B32_UINT:
688 case VK_FMT_R32G32B32_SINT:
689 case VK_FMT_R32G32B32_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800690 ((uint32_t *) value)[0] = color[0];
691 ((uint32_t *) value)[1] = color[1];
692 ((uint32_t *) value)[2] = color[2];
693 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600694 case VK_FMT_R32G32B32A32_UINT:
695 case VK_FMT_R32G32B32A32_SINT:
696 case VK_FMT_R32G32B32A32_SFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800697 ((uint32_t *) value)[0] = color[0];
698 ((uint32_t *) value)[1] = color[1];
699 ((uint32_t *) value)[2] = color[2];
700 ((uint32_t *) value)[3] = color[3];
701 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600702 case VK_FMT_D16_UNORM_S8_UINT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800703 ((uint16_t *) value)[0] = (uint16_t) color[0];
704 ((char *) value)[2] = (uint8_t) color[1];
705 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600706 case VK_FMT_D32_SFLOAT_S8_UINT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800707 ((uint32_t *) value)[0] = (uint32_t) color[0];
708 ((char *) value)[4] = (uint8_t) color[1];
709 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600710 case VK_FMT_R9G9B9E5_UFLOAT:
Chia-I Wu92096a92014-12-21 23:07:08 +0800711 ((uint32_t *) value)[0] = (color[0] & 0x1ff) << 0 |
712 (color[1] & 0x1ff) << 9 |
713 (color[2] & 0x1ff) << 18 |
714 (color[3] & 0x1f) << 27;
715 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600716 case VK_FMT_BC1_RGB_UNORM:
717 case VK_FMT_BC1_RGB_SRGB:
718 case VK_FMT_BC4_UNORM:
719 case VK_FMT_BC4_SNORM:
Chia-I Wu92096a92014-12-21 23:07:08 +0800720 memcpy(value, color, 8);
721 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600722 case VK_FMT_BC2_UNORM:
723 case VK_FMT_BC2_SRGB:
724 case VK_FMT_BC3_UNORM:
725 case VK_FMT_BC3_SRGB:
726 case VK_FMT_BC5_UNORM:
727 case VK_FMT_BC5_SNORM:
728 case VK_FMT_BC6H_UFLOAT:
729 case VK_FMT_BC6H_SFLOAT:
730 case VK_FMT_BC7_UNORM:
731 case VK_FMT_BC7_SRGB:
Chia-I Wu92096a92014-12-21 23:07:08 +0800732 memcpy(value, color, 16);
733 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600734 case VK_FMT_R8G8B8_UNORM:
735 case VK_FMT_R8G8B8_SNORM:
736 case VK_FMT_R8G8B8_USCALED:
737 case VK_FMT_R8G8B8_SSCALED:
738 case VK_FMT_R8G8B8_UINT:
739 case VK_FMT_R8G8B8_SINT:
740 case VK_FMT_R8G8B8_SRGB:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800741 ((uint8_t *) value)[0] = (uint8_t) color[0];
742 ((uint8_t *) value)[1] = (uint8_t) color[1];
743 ((uint8_t *) value)[2] = (uint8_t) color[2];
744 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600745 case VK_FMT_R16G16B16_UNORM:
746 case VK_FMT_R16G16B16_SNORM:
747 case VK_FMT_R16G16B16_USCALED:
748 case VK_FMT_R16G16B16_SSCALED:
749 case VK_FMT_R16G16B16_UINT:
750 case VK_FMT_R16G16B16_SINT:
751 case VK_FMT_R16G16B16_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800752 ((uint16_t *) value)[0] = (uint16_t) color[0];
753 ((uint16_t *) value)[1] = (uint16_t) color[1];
754 ((uint16_t *) value)[2] = (uint16_t) color[2];
755 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600756 case VK_FMT_B10G10R10A2_UNORM:
757 case VK_FMT_B10G10R10A2_SNORM:
758 case VK_FMT_B10G10R10A2_USCALED:
759 case VK_FMT_B10G10R10A2_SSCALED:
760 case VK_FMT_B10G10R10A2_UINT:
761 case VK_FMT_B10G10R10A2_SINT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800762 ((uint32_t *) value)[0] = (color[2] & 0x3ff) << 0 |
763 (color[1] & 0x3ff) << 10 |
764 (color[0] & 0x3ff) << 20 |
765 (color[3] & 0x3) << 30;
766 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600767 case VK_FMT_R64_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800768 /* higher 32 bits always 0 */
769 ((uint64_t *) value)[0] = color[0];
770 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600771 case VK_FMT_R64G64_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800772 ((uint64_t *) value)[0] = color[0];
773 ((uint64_t *) value)[1] = color[1];
774 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600775 case VK_FMT_R64G64B64_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800776 ((uint64_t *) value)[0] = color[0];
777 ((uint64_t *) value)[1] = color[1];
778 ((uint64_t *) value)[2] = color[2];
779 break;
Courtney Goeltzenleuchter9cc421e2015-04-08 15:36:08 -0600780 case VK_FMT_R64G64B64A64_SFLOAT:
Chia-I Wuc581bd52015-01-18 14:51:02 +0800781 ((uint64_t *) value)[0] = color[0];
782 ((uint64_t *) value)[1] = color[1];
783 ((uint64_t *) value)[2] = color[2];
784 ((uint64_t *) value)[3] = color[3];
785 break;
Chia-I Wu92096a92014-12-21 23:07:08 +0800786 default:
787 assert(!"unknown format");
788 break;
789 }
790}