blob: c4d10f669a4e298cfbd3c2d205c127a51d2eb761 [file] [log] [blame]
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06001/*
2 * Vulkan
3 *
4 * Copyright (C) 2015 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 */
25
26#include <string.h>
27#include "vulkan.h"
28#include "vk_layer_utils.h"
29
30typedef struct _VULKAN_FORMAT_INFO {
31 size_t size;
32 uint32_t channel_count;
33} VULKAN_FORMAT_INFO;
34
35
36// Set up data structure with number of bytes and number of channels
37// for each Vulkan format.
38static const VULKAN_FORMAT_INFO vk_format_table[VK_FORMAT_NUM] = {
39 { 0, 0 }, // [VK_FORMAT_UNDEFINED]
40 { 1, 2 }, // [VK_FORMAT_R4G4_UNORM]
41 { 1, 2 }, // [VK_FORMAT_R4G4_USCALED]
42 { 2, 4 }, // [VK_FORMAT_R4G4B4A4_UNORM]
43 { 2, 4 }, // [VK_FORMAT_R4G4B4A4_USCALED]
44 { 2, 3 }, // [VK_FORMAT_R5G6B5_UNORM]
45 { 2, 3 }, // [VK_FORMAT_R5G6B5_USCALED]
46 { 2, 4 }, // [VK_FORMAT_R5G5B5A1_UNORM]
47 { 2, 4 }, // [VK_FORMAT_R5G5B5A1_USCALED]
48 { 1, 1 }, // [VK_FORMAT_R8_UNORM]
49 { 1, 1 }, // [VK_FORMAT_R8_SNORM]
50 { 1, 1 }, // [VK_FORMAT_R8_USCALED]
51 { 1, 1 }, // [VK_FORMAT_R8_SSCALED]
52 { 1, 1 }, // [VK_FORMAT_R8_UINT]
53 { 1, 1 }, // [VK_FORMAT_R8_SINT]
54 { 1, 1 }, // [VK_FORMAT_R8_SRGB]
55 { 2, 2 }, // [VK_FORMAT_R8G8_UNORM]
56 { 2, 2 }, // [VK_FORMAT_R8G8_SNORM]
57 { 2, 2 }, // [VK_FORMAT_R8G8_USCALED]
58 { 2, 2 }, // [VK_FORMAT_R8G8_SSCALED]
59 { 2, 2 }, // [VK_FORMAT_R8G8_UINT]
60 { 2, 2 }, // [VK_FORMAT_R8G8_SINT]
61 { 2, 2 }, // [VK_FORMAT_R8G8_SRGB]
62 { 3, 3 }, // [VK_FORMAT_R8G8B8_UNORM]
63 { 3, 3 }, // [VK_FORMAT_R8G8B8_SNORM]
64 { 3, 3 }, // [VK_FORMAT_R8G8B8_USCALED]
65 { 3, 3 }, // [VK_FORMAT_R8G8B8_SSCALED]
66 { 3, 3 }, // [VK_FORMAT_R8G8B8_UINT]
67 { 3, 3 }, // [VK_FORMAT_R8G8B8_SINT]
68 { 3, 3 }, // [VK_FORMAT_R8G8B8_SRGB]
69 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_UNORM]
70 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_SNORM]
71 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_USCALED]
72 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_SSCALED]
73 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_UINT]
74 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_SINT]
75 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_SRGB]
76 { 4, 4 }, // [VK_FORMAT_R10G10B10A2_UNORM]
77 { 4, 4 }, // [VK_FORMAT_R10G10B10A2_SNORM]
78 { 4, 4 }, // [VK_FORMAT_R10G10B10A2_USCALED]
79 { 4, 4 }, // [VK_FORMAT_R10G10B10A2_SSCALED]
80 { 4, 4 }, // [VK_FORMAT_R10G10B10A2_UINT]
81 { 4, 4 }, // [VK_FORMAT_R10G10B10A2_SINT]
82 { 2, 1 }, // [VK_FORMAT_R16_UNORM]
83 { 2, 1 }, // [VK_FORMAT_R16_SNORM]
84 { 2, 1 }, // [VK_FORMAT_R16_USCALED]
85 { 2, 1 }, // [VK_FORMAT_R16_SSCALED]
86 { 2, 1 }, // [VK_FORMAT_R16_UINT]
87 { 2, 1 }, // [VK_FORMAT_R16_SINT]
88 { 2, 1 }, // [VK_FORMAT_R16_SFLOAT]
89 { 4, 2 }, // [VK_FORMAT_R16G16_UNORM]
90 { 4, 2 }, // [VK_FORMAT_R16G16_SNORM]
91 { 4, 2 }, // [VK_FORMAT_R16G16_USCALED]
92 { 4, 2 }, // [VK_FORMAT_R16G16_SSCALED]
93 { 4, 2 }, // [VK_FORMAT_R16G16_UINT]
94 { 4, 2 }, // [VK_FORMAT_R16G16_SINT]
95 { 4, 2 }, // [VK_FORMAT_R16G16_SFLOAT]
96 { 6, 3 }, // [VK_FORMAT_R16G16B16_UNORM]
97 { 6, 3 }, // [VK_FORMAT_R16G16B16_SNORM]
98 { 6, 3 }, // [VK_FORMAT_R16G16B16_USCALED]
99 { 6, 3 }, // [VK_FORMAT_R16G16B16_SSCALED]
100 { 6, 3 }, // [VK_FORMAT_R16G16B16_UINT]
101 { 6, 3 }, // [VK_FORMAT_R16G16B16_SINT]
102 { 6, 3 }, // [VK_FORMAT_R16G16B16_SFLOAT]
103 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_UNORM]
104 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_SNORM]
105 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_USCALED]
106 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_SSCALED]
107 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_UINT]
108 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_SINT]
109 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_SFLOAT]
110 { 4, 1 }, // [VK_FORMAT_R32_UINT]
111 { 4, 1 }, // [VK_FORMAT_R32_SINT]
112 { 4, 1 }, // [VK_FORMAT_R32_SFLOAT]
113 { 8, 2 }, // [VK_FORMAT_R32G32_UINT]
114 { 8, 2 }, // [VK_FORMAT_R32G32_SINT]
115 { 8, 2 }, // [VK_FORMAT_R32G32_SFLOAT]
116 { 12, 3 }, // [VK_FORMAT_R32G32B32_UINT]
117 { 12, 3 }, // [VK_FORMAT_R32G32B32_SINT]
118 { 12, 3 }, // [VK_FORMAT_R32G32B32_SFLOAT]
119 { 16, 4 }, // [VK_FORMAT_R32G32B32A32_UINT]
120 { 16, 4 }, // [VK_FORMAT_R32G32B32A32_SINT]
121 { 16, 4 }, // [VK_FORMAT_R32G32B32A32_SFLOAT]
122 { 8, 1 }, // [VK_FORMAT_R64_SFLOAT]
123 { 16, 2 }, // [VK_FORMAT_R64G64_SFLOAT]
124 { 24, 3 }, // [VK_FORMAT_R64G64B64_SFLOAT]
125 { 32, 4 }, // [VK_FORMAT_R64G64B64A64_SFLOAT]
126 { 4, 3 }, // [VK_FORMAT_R11G11B10_UFLOAT]
127 { 4, 3 }, // [VK_FORMAT_R9G9B9E5_UFLOAT]
128 { 2, 1 }, // [VK_FORMAT_D16_UNORM]
129 { 3, 1 }, // [VK_FORMAT_D24_UNORM_X8]
130 { 4, 1 }, // [VK_FORMAT_D32_SFLOAT]
131 { 1, 1 }, // [VK_FORMAT_S8_UINT]
132 { 3, 2 }, // [VK_FORMAT_D16_UNORM_S8_UINT]
133 { 4, 2 }, // [VK_FORMAT_D24_UNORM_S8_UINT]
134 { 4, 2 }, // [VK_FORMAT_D32_SFLOAT_S8_UINT]
135 { 8, 4 }, // [VK_FORMAT_BC1_RGB_UNORM]
136 { 8, 4 }, // [VK_FORMAT_BC1_RGB_SRGB]
137 { 8, 4 }, // [VK_FORMAT_BC1_RGBA_UNORM]
138 { 8, 4 }, // [VK_FORMAT_BC1_RGBA_SRGB]
139 { 16, 4 }, // [VK_FORMAT_BC2_UNORM]
140 { 16, 4 }, // [VK_FORMAT_BC2_SRGB]
141 { 16, 4 }, // [VK_FORMAT_BC3_UNORM]
142 { 16, 4 }, // [VK_FORMAT_BC3_SRGB]
143 { 8, 4 }, // [VK_FORMAT_BC4_UNORM]
144 { 8, 4 }, // [VK_FORMAT_BC4_SNORM]
145 { 16, 4 }, // [VK_FORMAT_BC5_UNORM]
146 { 16, 4 }, // [VK_FORMAT_BC5_SNORM]
147 { 16, 4 }, // [VK_FORMAT_BC6H_UFLOAT]
148 { 16, 4 }, // [VK_FORMAT_BC6H_SFLOAT]
149 { 16, 4 }, // [VK_FORMAT_BC7_UNORM]
150 { 16, 4 }, // [VK_FORMAT_BC7_SRGB]
151 { 8, 3 }, // [VK_FORMAT_ETC2_R8G8B8_UNORM]
152 { 8, 3 }, // [VK_FORMAT_ETC2_R8G8B8_SRGB]
153 { 8, 4 }, // [VK_FORMAT_ETC2_R8G8B8A1_UNORM]
154 { 8, 4 }, // [VK_FORMAT_ETC2_R8G8B8A1_SRGB]
155 { 8, 4 }, // [VK_FORMAT_ETC2_R8G8B8A8_UNORM]
156 { 8, 4 }, // [VK_FORMAT_ETC2_R8G8B8A8_SRGB]
157 { 8, 1 }, // [VK_FORMAT_EAC_R11_UNORM]
158 { 8, 1 }, // [VK_FORMAT_EAC_R11_SNORM]
159 { 16, 2 }, // [VK_FORMAT_EAC_R11G11_UNORM]
160 { 16, 2 }, // [VK_FORMAT_EAC_R11G11_SNORM]
161 { 16, 4 }, // [VK_FORMAT_ASTC_4x4_UNORM]
162 { 16, 4 }, // [VK_FORMAT_ASTC_4x4_SRGB]
163 { 16, 4 }, // [VK_FORMAT_ASTC_5x4_UNORM]
164 { 16, 4 }, // [VK_FORMAT_ASTC_5x4_SRGB]
165 { 16, 4 }, // [VK_FORMAT_ASTC_5x5_UNORM]
166 { 16, 4 }, // [VK_FORMAT_ASTC_5x5_SRGB]
167 { 16, 4 }, // [VK_FORMAT_ASTC_6x5_UNORM]
168 { 16, 4 }, // [VK_FORMAT_ASTC_6x5_SRGB]
169 { 16, 4 }, // [VK_FORMAT_ASTC_6x6_UNORM]
170 { 16, 4 }, // [VK_FORMAT_ASTC_6x6_SRGB]
171 { 16, 4 }, // [VK_FORMAT_ASTC_8x5_UNORM]
172 { 16, 4 }, // [VK_FORMAT_ASTC_8x5_SRGB]
173 { 16, 4 }, // [VK_FORMAT_ASTC_8x6_UNORM]
174 { 16, 4 }, // [VK_FORMAT_ASTC_8x6_SRGB]
175 { 16, 4 }, // [VK_FORMAT_ASTC_8x8_UNORM]
176 { 16, 4 }, // [VK_FORMAT_ASTC_8x8_SRGB]
177 { 16, 4 }, // [VK_FORMAT_ASTC_10x5_UNORM]
178 { 16, 4 }, // [VK_FORMAT_ASTC_10x5_SRGB]
179 { 16, 4 }, // [VK_FORMAT_ASTC_10x6_UNORM]
180 { 16, 4 }, // [VK_FORMAT_ASTC_10x6_SRGB]
181 { 16, 4 }, // [VK_FORMAT_ASTC_10x8_UNORM]
182 { 16, 4 }, // [VK_FORMAT_ASTC_10x8_SRGB]
183 { 16, 4 }, // [VK_FORMAT_ASTC_10x10_UNORM]
184 { 16, 4 }, // [VK_FORMAT_ASTC_10x10_SRGB]
185 { 16, 4 }, // [VK_FORMAT_ASTC_12x10_UNORM]
186 { 16, 4 }, // [VK_FORMAT_ASTC_12x10_SRGB]
187 { 16, 4 }, // [VK_FORMAT_ASTC_12x12_UNORM]
188 { 16, 4 }, // [VK_FORMAT_ASTC_12x12_SRGB]
189 { 2, 3 }, // [VK_FORMAT_B5G6R5_UNORM]
190 { 2, 3 }, // [VK_FORMAT_B5G6R5_USCALED]
191 { 3, 3 }, // [VK_FORMAT_B8G8R8_UNORM]
192 { 3, 3 }, // [VK_FORMAT_B8G8R8_SNORM]
193 { 3, 3 }, // [VK_FORMAT_B8G8R8_USCALED]
194 { 3, 3 }, // [VK_FORMAT_B8G8R8_SSCALED]
195 { 3, 3 }, // [VK_FORMAT_B8G8R8_UINT]
196 { 3, 3 }, // [VK_FORMAT_B8G8R8_SINT]
197 { 3, 3 }, // [VK_FORMAT_B8G8R8_SRGB]
198 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_UNORM]
199 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_SNORM]
200 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_USCALED]
201 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_SSCALED]
202 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_UINT]
203 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_SINT]
204 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_SRGB]
205 { 4, 4 }, // [VK_FORMAT_B10G10R10A2_UNORM]
206 { 4, 4 }, // [VK_FORMAT_B10G10R10A2_SNORM]
207 { 4, 4 }, // [VK_FORMAT_B10G10R10A2_USCALED]
208 { 4, 4 }, // [VK_FORMAT_B10G10R10A2_SSCALED]
209 { 4, 4 }, // [VK_FORMAT_B10G10R10A2_UINT]
210 { 4, 4 }, // [VK_FORMAT_B10G10R10A2_SINT]
211};
212
213// Return true if format is a depth-stencil format
214bool vk_format_is_ds(VkFormat format)
215{
216 bool is_ds = false;
217
218 switch (format) {
219 case VK_FORMAT_D16_UNORM:
220 case VK_FORMAT_D24_UNORM_X8:
221 case VK_FORMAT_D32_SFLOAT:
222 case VK_FORMAT_S8_UINT:
223 case VK_FORMAT_D16_UNORM_S8_UINT:
224 case VK_FORMAT_D24_UNORM_S8_UINT:
225 case VK_FORMAT_D32_SFLOAT_S8_UINT:
226 is_ds = true;
227 break;
228 default:
229 break;
230 }
231
232 return is_ds;
233}
234
235// Return true if format is of time UNORM
236bool vk_format_is_norm(VkFormat format)
237{
238 bool is_norm = false;
239
240 switch (format) {
241 case VK_FORMAT_R4G4_UNORM:
242 case VK_FORMAT_R4G4B4A4_UNORM:
243 case VK_FORMAT_R5G6B5_UNORM:
244 case VK_FORMAT_R5G5B5A1_UNORM:
245 case VK_FORMAT_R8_UNORM:
246 case VK_FORMAT_R8_SNORM:
247 case VK_FORMAT_R8G8_UNORM:
248 case VK_FORMAT_R8G8_SNORM:
249 case VK_FORMAT_R8G8B8_UNORM:
250 case VK_FORMAT_R8G8B8_SNORM:
251 case VK_FORMAT_R8G8B8A8_UNORM:
252 case VK_FORMAT_R8G8B8A8_SNORM:
253 case VK_FORMAT_R10G10B10A2_UNORM:
254 case VK_FORMAT_R10G10B10A2_SNORM:
255 case VK_FORMAT_R16_UNORM:
256 case VK_FORMAT_R16_SNORM:
257 case VK_FORMAT_R16G16_UNORM:
258 case VK_FORMAT_R16G16_SNORM:
259 case VK_FORMAT_R16G16B16_UNORM:
260 case VK_FORMAT_R16G16B16_SNORM:
261 case VK_FORMAT_R16G16B16A16_UNORM:
262 case VK_FORMAT_R16G16B16A16_SNORM:
263 case VK_FORMAT_BC1_RGB_UNORM:
264 case VK_FORMAT_BC2_UNORM:
265 case VK_FORMAT_BC3_UNORM:
266 case VK_FORMAT_BC4_UNORM:
267 case VK_FORMAT_BC4_SNORM:
268 case VK_FORMAT_BC5_UNORM:
269 case VK_FORMAT_BC5_SNORM:
270 case VK_FORMAT_BC7_UNORM:
271 case VK_FORMAT_ETC2_R8G8B8_UNORM:
272 case VK_FORMAT_ETC2_R8G8B8A1_UNORM:
273 case VK_FORMAT_ETC2_R8G8B8A8_UNORM:
274 case VK_FORMAT_EAC_R11_UNORM:
275 case VK_FORMAT_EAC_R11_SNORM:
276 case VK_FORMAT_EAC_R11G11_UNORM:
277 case VK_FORMAT_EAC_R11G11_SNORM:
278 case VK_FORMAT_ASTC_4x4_UNORM:
279 case VK_FORMAT_ASTC_5x4_UNORM:
280 case VK_FORMAT_ASTC_5x5_UNORM:
281 case VK_FORMAT_ASTC_6x5_UNORM:
282 case VK_FORMAT_ASTC_6x6_UNORM:
283 case VK_FORMAT_ASTC_8x5_UNORM:
284 case VK_FORMAT_ASTC_8x6_UNORM:
285 case VK_FORMAT_ASTC_8x8_UNORM:
286 case VK_FORMAT_ASTC_10x5_UNORM:
287 case VK_FORMAT_ASTC_10x6_UNORM:
288 case VK_FORMAT_ASTC_10x8_UNORM:
289 case VK_FORMAT_ASTC_10x10_UNORM:
290 case VK_FORMAT_ASTC_12x10_UNORM:
291 case VK_FORMAT_ASTC_12x12_UNORM:
292 case VK_FORMAT_B5G6R5_UNORM:
293 case VK_FORMAT_B8G8R8_UNORM:
294 case VK_FORMAT_B8G8R8_SNORM:
295 case VK_FORMAT_B8G8R8A8_UNORM:
296 case VK_FORMAT_B8G8R8A8_SNORM:
297 case VK_FORMAT_B10G10R10A2_UNORM:
298 case VK_FORMAT_B10G10R10A2_SNORM:
299 is_norm = true;
300 break;
301 default:
302 break;
303 }
304
305 return is_norm;
306};
307
308// Return true if format is an integer format
309bool vk_format_is_int(VkFormat format)
310{
311 bool is_int = false;
312
313 switch (format) {
314 case VK_FORMAT_R8_UINT:
315 case VK_FORMAT_R8_SINT:
316 case VK_FORMAT_R8G8_UINT:
317 case VK_FORMAT_R8G8_SINT:
318 case VK_FORMAT_R8G8B8_UINT:
319 case VK_FORMAT_R8G8B8_SINT:
320 case VK_FORMAT_R8G8B8A8_UINT:
321 case VK_FORMAT_R8G8B8A8_SINT:
322 case VK_FORMAT_R10G10B10A2_UINT:
323 case VK_FORMAT_R10G10B10A2_SINT:
324 case VK_FORMAT_R16_UINT:
325 case VK_FORMAT_R16_SINT:
326 case VK_FORMAT_R16G16_UINT:
327 case VK_FORMAT_R16G16_SINT:
328 case VK_FORMAT_R16G16B16_UINT:
329 case VK_FORMAT_R16G16B16_SINT:
330 case VK_FORMAT_R16G16B16A16_UINT:
331 case VK_FORMAT_R16G16B16A16_SINT:
332 case VK_FORMAT_R32_UINT:
333 case VK_FORMAT_R32_SINT:
334 case VK_FORMAT_R32G32_UINT:
335 case VK_FORMAT_R32G32_SINT:
336 case VK_FORMAT_R32G32B32_UINT:
337 case VK_FORMAT_R32G32B32_SINT:
338 case VK_FORMAT_R32G32B32A32_UINT:
339 case VK_FORMAT_R32G32B32A32_SINT:
340 case VK_FORMAT_B8G8R8_UINT:
341 case VK_FORMAT_B8G8R8_SINT:
342 case VK_FORMAT_B8G8R8A8_UINT:
343 case VK_FORMAT_B8G8R8A8_SINT:
344 case VK_FORMAT_B10G10R10A2_UINT:
345 case VK_FORMAT_B10G10R10A2_SINT:
346 is_int = true;
347 break;
348 default:
349 break;
350 }
351
352 return is_int;
353}
354
355// Return true if format is a floating-point format
356bool vk_format_is_float(VkFormat format)
357{
358 bool is_float = false;
359
360 switch (format) {
361 case VK_FORMAT_R16_SFLOAT:
362 case VK_FORMAT_R16G16_SFLOAT:
363 case VK_FORMAT_R16G16B16_SFLOAT:
364 case VK_FORMAT_R16G16B16A16_SFLOAT:
365 case VK_FORMAT_R32_SFLOAT:
366 case VK_FORMAT_R32G32_SFLOAT:
367 case VK_FORMAT_R32G32B32_SFLOAT:
368 case VK_FORMAT_R32G32B32A32_SFLOAT:
369 case VK_FORMAT_R64_SFLOAT:
370 case VK_FORMAT_R64G64_SFLOAT:
371 case VK_FORMAT_R64G64B64_SFLOAT:
372 case VK_FORMAT_R64G64B64A64_SFLOAT:
373 case VK_FORMAT_R11G11B10_UFLOAT:
374 case VK_FORMAT_R9G9B9E5_UFLOAT:
375 case VK_FORMAT_BC6H_UFLOAT:
376 case VK_FORMAT_BC6H_SFLOAT:
377 is_float = true;
378 break;
379 default:
380 break;
381 }
382
383 return is_float;
384}
385
386// Return true if format is in the SRGB colorspace
387bool vk_format_is_srgb(VkFormat format)
388{
389 bool is_srgb = false;
390
391 switch (format) {
392 case VK_FORMAT_R8_SRGB:
393 case VK_FORMAT_R8G8_SRGB:
394 case VK_FORMAT_R8G8B8_SRGB:
395 case VK_FORMAT_R8G8B8A8_SRGB:
396 case VK_FORMAT_BC1_RGB_SRGB:
397 case VK_FORMAT_BC2_SRGB:
398 case VK_FORMAT_BC3_SRGB:
399 case VK_FORMAT_BC7_SRGB:
400 case VK_FORMAT_ETC2_R8G8B8_SRGB:
401 case VK_FORMAT_ETC2_R8G8B8A1_SRGB:
402 case VK_FORMAT_ETC2_R8G8B8A8_SRGB:
403 case VK_FORMAT_ASTC_4x4_SRGB:
404 case VK_FORMAT_ASTC_5x4_SRGB:
405 case VK_FORMAT_ASTC_5x5_SRGB:
406 case VK_FORMAT_ASTC_6x5_SRGB:
407 case VK_FORMAT_ASTC_6x6_SRGB:
408 case VK_FORMAT_ASTC_8x5_SRGB:
409 case VK_FORMAT_ASTC_8x6_SRGB:
410 case VK_FORMAT_ASTC_8x8_SRGB:
411 case VK_FORMAT_ASTC_10x5_SRGB:
412 case VK_FORMAT_ASTC_10x6_SRGB:
413 case VK_FORMAT_ASTC_10x8_SRGB:
414 case VK_FORMAT_ASTC_10x10_SRGB:
415 case VK_FORMAT_ASTC_12x10_SRGB:
416 case VK_FORMAT_ASTC_12x12_SRGB:
417 case VK_FORMAT_B8G8R8_SRGB:
418 case VK_FORMAT_B8G8R8A8_SRGB:
419 is_srgb = true;
420 break;
421 default:
422 break;
423 }
424
425 return is_srgb;
426}
427
428// Return true if format is compressed
429bool vk_format_is_compressed(VkFormat format)
430{
431 switch (format) {
432 case VK_FORMAT_BC1_RGB_UNORM:
433 case VK_FORMAT_BC1_RGB_SRGB:
434 case VK_FORMAT_BC2_UNORM:
435 case VK_FORMAT_BC2_SRGB:
436 case VK_FORMAT_BC3_UNORM:
437 case VK_FORMAT_BC3_SRGB:
438 case VK_FORMAT_BC4_UNORM:
439 case VK_FORMAT_BC4_SNORM:
440 case VK_FORMAT_BC5_UNORM:
441 case VK_FORMAT_BC5_SNORM:
442 case VK_FORMAT_BC6H_UFLOAT:
443 case VK_FORMAT_BC6H_SFLOAT:
444 case VK_FORMAT_BC7_UNORM:
445 case VK_FORMAT_BC7_SRGB:
446 case VK_FORMAT_ETC2_R8G8B8_UNORM:
447 case VK_FORMAT_ETC2_R8G8B8_SRGB:
448 case VK_FORMAT_ETC2_R8G8B8A1_UNORM:
449 case VK_FORMAT_ETC2_R8G8B8A1_SRGB:
450 case VK_FORMAT_ETC2_R8G8B8A8_UNORM:
451 case VK_FORMAT_ETC2_R8G8B8A8_SRGB:
452 case VK_FORMAT_EAC_R11_UNORM:
453 case VK_FORMAT_EAC_R11_SNORM:
454 case VK_FORMAT_EAC_R11G11_UNORM:
455 case VK_FORMAT_EAC_R11G11_SNORM:
456 case VK_FORMAT_ASTC_4x4_UNORM:
457 case VK_FORMAT_ASTC_4x4_SRGB:
458 case VK_FORMAT_ASTC_5x4_UNORM:
459 case VK_FORMAT_ASTC_5x4_SRGB:
460 case VK_FORMAT_ASTC_5x5_UNORM:
461 case VK_FORMAT_ASTC_5x5_SRGB:
462 case VK_FORMAT_ASTC_6x5_UNORM:
463 case VK_FORMAT_ASTC_6x5_SRGB:
464 case VK_FORMAT_ASTC_6x6_UNORM:
465 case VK_FORMAT_ASTC_6x6_SRGB:
466 case VK_FORMAT_ASTC_8x5_UNORM:
467 case VK_FORMAT_ASTC_8x5_SRGB:
468 case VK_FORMAT_ASTC_8x6_UNORM:
469 case VK_FORMAT_ASTC_8x6_SRGB:
470 case VK_FORMAT_ASTC_8x8_UNORM:
471 case VK_FORMAT_ASTC_8x8_SRGB:
472 case VK_FORMAT_ASTC_10x5_UNORM:
473 case VK_FORMAT_ASTC_10x5_SRGB:
474 case VK_FORMAT_ASTC_10x6_UNORM:
475 case VK_FORMAT_ASTC_10x6_SRGB:
476 case VK_FORMAT_ASTC_10x8_UNORM:
477 case VK_FORMAT_ASTC_10x8_SRGB:
478 case VK_FORMAT_ASTC_10x10_UNORM:
479 case VK_FORMAT_ASTC_10x10_SRGB:
480 case VK_FORMAT_ASTC_12x10_UNORM:
481 case VK_FORMAT_ASTC_12x10_SRGB:
482 case VK_FORMAT_ASTC_12x12_UNORM:
483 case VK_FORMAT_ASTC_12x12_SRGB:
484 return true;
485 default:
486 return false;
487 }
488}
489
490// Return size, in bytes, of a pixel of the specified format
491size_t vk_format_get_size(VkFormat format)
492{
493 return vk_format_table[format].size;
494}
495
496// Return the number of channels for a given format
497unsigned int vk_format_get_channel_count(VkFormat format)
498{
499 return vk_format_table[format].channel_count;
500}