blob: aac4dd184852e08c86847dd982575074fa8f6cc7 [file] [log] [blame]
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06001/*
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06002 *
Courtney Goeltzenleuchterfcbe16f2015-10-29 13:50:34 -06003 * Copyright (C) 2015 Valve Corporation
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -06004 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included
13 * in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 *
23 */
24
25#include <string.h>
26#include "vulkan.h"
27#include "vk_layer_utils.h"
28
29typedef struct _VULKAN_FORMAT_INFO {
30 size_t size;
31 uint32_t channel_count;
32} VULKAN_FORMAT_INFO;
33
34
35// Set up data structure with number of bytes and number of channels
36// for each Vulkan format.
Chia-I Wu3432a0c2015-10-27 18:04:07 +080037static const VULKAN_FORMAT_INFO vk_format_table[VK_FORMAT_RANGE_SIZE] = {
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060038 { 0, 0 }, // [VK_FORMAT_UNDEFINED]
39 { 1, 2 }, // [VK_FORMAT_R4G4_UNORM]
40 { 1, 2 }, // [VK_FORMAT_R4G4_USCALED]
41 { 2, 4 }, // [VK_FORMAT_R4G4B4A4_UNORM]
42 { 2, 4 }, // [VK_FORMAT_R4G4B4A4_USCALED]
43 { 2, 3 }, // [VK_FORMAT_R5G6B5_UNORM]
44 { 2, 3 }, // [VK_FORMAT_R5G6B5_USCALED]
45 { 2, 4 }, // [VK_FORMAT_R5G5B5A1_UNORM]
46 { 2, 4 }, // [VK_FORMAT_R5G5B5A1_USCALED]
47 { 1, 1 }, // [VK_FORMAT_R8_UNORM]
48 { 1, 1 }, // [VK_FORMAT_R8_SNORM]
49 { 1, 1 }, // [VK_FORMAT_R8_USCALED]
50 { 1, 1 }, // [VK_FORMAT_R8_SSCALED]
51 { 1, 1 }, // [VK_FORMAT_R8_UINT]
52 { 1, 1 }, // [VK_FORMAT_R8_SINT]
53 { 1, 1 }, // [VK_FORMAT_R8_SRGB]
54 { 2, 2 }, // [VK_FORMAT_R8G8_UNORM]
55 { 2, 2 }, // [VK_FORMAT_R8G8_SNORM]
56 { 2, 2 }, // [VK_FORMAT_R8G8_USCALED]
57 { 2, 2 }, // [VK_FORMAT_R8G8_SSCALED]
58 { 2, 2 }, // [VK_FORMAT_R8G8_UINT]
59 { 2, 2 }, // [VK_FORMAT_R8G8_SINT]
60 { 2, 2 }, // [VK_FORMAT_R8G8_SRGB]
61 { 3, 3 }, // [VK_FORMAT_R8G8B8_UNORM]
62 { 3, 3 }, // [VK_FORMAT_R8G8B8_SNORM]
63 { 3, 3 }, // [VK_FORMAT_R8G8B8_USCALED]
64 { 3, 3 }, // [VK_FORMAT_R8G8B8_SSCALED]
65 { 3, 3 }, // [VK_FORMAT_R8G8B8_UINT]
66 { 3, 3 }, // [VK_FORMAT_R8G8B8_SINT]
67 { 3, 3 }, // [VK_FORMAT_R8G8B8_SRGB]
68 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_UNORM]
69 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_SNORM]
70 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_USCALED]
71 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_SSCALED]
72 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_UINT]
73 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_SINT]
74 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_SRGB]
75 { 4, 4 }, // [VK_FORMAT_R10G10B10A2_UNORM]
76 { 4, 4 }, // [VK_FORMAT_R10G10B10A2_SNORM]
77 { 4, 4 }, // [VK_FORMAT_R10G10B10A2_USCALED]
78 { 4, 4 }, // [VK_FORMAT_R10G10B10A2_SSCALED]
79 { 4, 4 }, // [VK_FORMAT_R10G10B10A2_UINT]
80 { 4, 4 }, // [VK_FORMAT_R10G10B10A2_SINT]
81 { 2, 1 }, // [VK_FORMAT_R16_UNORM]
82 { 2, 1 }, // [VK_FORMAT_R16_SNORM]
83 { 2, 1 }, // [VK_FORMAT_R16_USCALED]
84 { 2, 1 }, // [VK_FORMAT_R16_SSCALED]
85 { 2, 1 }, // [VK_FORMAT_R16_UINT]
86 { 2, 1 }, // [VK_FORMAT_R16_SINT]
87 { 2, 1 }, // [VK_FORMAT_R16_SFLOAT]
88 { 4, 2 }, // [VK_FORMAT_R16G16_UNORM]
89 { 4, 2 }, // [VK_FORMAT_R16G16_SNORM]
90 { 4, 2 }, // [VK_FORMAT_R16G16_USCALED]
91 { 4, 2 }, // [VK_FORMAT_R16G16_SSCALED]
92 { 4, 2 }, // [VK_FORMAT_R16G16_UINT]
93 { 4, 2 }, // [VK_FORMAT_R16G16_SINT]
94 { 4, 2 }, // [VK_FORMAT_R16G16_SFLOAT]
95 { 6, 3 }, // [VK_FORMAT_R16G16B16_UNORM]
96 { 6, 3 }, // [VK_FORMAT_R16G16B16_SNORM]
97 { 6, 3 }, // [VK_FORMAT_R16G16B16_USCALED]
98 { 6, 3 }, // [VK_FORMAT_R16G16B16_SSCALED]
99 { 6, 3 }, // [VK_FORMAT_R16G16B16_UINT]
100 { 6, 3 }, // [VK_FORMAT_R16G16B16_SINT]
101 { 6, 3 }, // [VK_FORMAT_R16G16B16_SFLOAT]
102 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_UNORM]
103 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_SNORM]
104 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_USCALED]
105 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_SSCALED]
106 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_UINT]
107 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_SINT]
108 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_SFLOAT]
109 { 4, 1 }, // [VK_FORMAT_R32_UINT]
110 { 4, 1 }, // [VK_FORMAT_R32_SINT]
111 { 4, 1 }, // [VK_FORMAT_R32_SFLOAT]
112 { 8, 2 }, // [VK_FORMAT_R32G32_UINT]
113 { 8, 2 }, // [VK_FORMAT_R32G32_SINT]
114 { 8, 2 }, // [VK_FORMAT_R32G32_SFLOAT]
115 { 12, 3 }, // [VK_FORMAT_R32G32B32_UINT]
116 { 12, 3 }, // [VK_FORMAT_R32G32B32_SINT]
117 { 12, 3 }, // [VK_FORMAT_R32G32B32_SFLOAT]
118 { 16, 4 }, // [VK_FORMAT_R32G32B32A32_UINT]
119 { 16, 4 }, // [VK_FORMAT_R32G32B32A32_SINT]
120 { 16, 4 }, // [VK_FORMAT_R32G32B32A32_SFLOAT]
121 { 8, 1 }, // [VK_FORMAT_R64_SFLOAT]
122 { 16, 2 }, // [VK_FORMAT_R64G64_SFLOAT]
123 { 24, 3 }, // [VK_FORMAT_R64G64B64_SFLOAT]
124 { 32, 4 }, // [VK_FORMAT_R64G64B64A64_SFLOAT]
125 { 4, 3 }, // [VK_FORMAT_R11G11B10_UFLOAT]
126 { 4, 3 }, // [VK_FORMAT_R9G9B9E5_UFLOAT]
127 { 2, 1 }, // [VK_FORMAT_D16_UNORM]
128 { 3, 1 }, // [VK_FORMAT_D24_UNORM_X8]
129 { 4, 1 }, // [VK_FORMAT_D32_SFLOAT]
130 { 1, 1 }, // [VK_FORMAT_S8_UINT]
131 { 3, 2 }, // [VK_FORMAT_D16_UNORM_S8_UINT]
132 { 4, 2 }, // [VK_FORMAT_D24_UNORM_S8_UINT]
133 { 4, 2 }, // [VK_FORMAT_D32_SFLOAT_S8_UINT]
134 { 8, 4 }, // [VK_FORMAT_BC1_RGB_UNORM]
135 { 8, 4 }, // [VK_FORMAT_BC1_RGB_SRGB]
136 { 8, 4 }, // [VK_FORMAT_BC1_RGBA_UNORM]
137 { 8, 4 }, // [VK_FORMAT_BC1_RGBA_SRGB]
138 { 16, 4 }, // [VK_FORMAT_BC2_UNORM]
139 { 16, 4 }, // [VK_FORMAT_BC2_SRGB]
140 { 16, 4 }, // [VK_FORMAT_BC3_UNORM]
141 { 16, 4 }, // [VK_FORMAT_BC3_SRGB]
142 { 8, 4 }, // [VK_FORMAT_BC4_UNORM]
143 { 8, 4 }, // [VK_FORMAT_BC4_SNORM]
144 { 16, 4 }, // [VK_FORMAT_BC5_UNORM]
145 { 16, 4 }, // [VK_FORMAT_BC5_SNORM]
146 { 16, 4 }, // [VK_FORMAT_BC6H_UFLOAT]
147 { 16, 4 }, // [VK_FORMAT_BC6H_SFLOAT]
148 { 16, 4 }, // [VK_FORMAT_BC7_UNORM]
149 { 16, 4 }, // [VK_FORMAT_BC7_SRGB]
150 { 8, 3 }, // [VK_FORMAT_ETC2_R8G8B8_UNORM]
151 { 8, 3 }, // [VK_FORMAT_ETC2_R8G8B8_SRGB]
152 { 8, 4 }, // [VK_FORMAT_ETC2_R8G8B8A1_UNORM]
153 { 8, 4 }, // [VK_FORMAT_ETC2_R8G8B8A1_SRGB]
154 { 8, 4 }, // [VK_FORMAT_ETC2_R8G8B8A8_UNORM]
155 { 8, 4 }, // [VK_FORMAT_ETC2_R8G8B8A8_SRGB]
156 { 8, 1 }, // [VK_FORMAT_EAC_R11_UNORM]
157 { 8, 1 }, // [VK_FORMAT_EAC_R11_SNORM]
158 { 16, 2 }, // [VK_FORMAT_EAC_R11G11_UNORM]
159 { 16, 2 }, // [VK_FORMAT_EAC_R11G11_SNORM]
160 { 16, 4 }, // [VK_FORMAT_ASTC_4x4_UNORM]
161 { 16, 4 }, // [VK_FORMAT_ASTC_4x4_SRGB]
162 { 16, 4 }, // [VK_FORMAT_ASTC_5x4_UNORM]
163 { 16, 4 }, // [VK_FORMAT_ASTC_5x4_SRGB]
164 { 16, 4 }, // [VK_FORMAT_ASTC_5x5_UNORM]
165 { 16, 4 }, // [VK_FORMAT_ASTC_5x5_SRGB]
166 { 16, 4 }, // [VK_FORMAT_ASTC_6x5_UNORM]
167 { 16, 4 }, // [VK_FORMAT_ASTC_6x5_SRGB]
168 { 16, 4 }, // [VK_FORMAT_ASTC_6x6_UNORM]
169 { 16, 4 }, // [VK_FORMAT_ASTC_6x6_SRGB]
170 { 16, 4 }, // [VK_FORMAT_ASTC_8x5_UNORM]
171 { 16, 4 }, // [VK_FORMAT_ASTC_8x5_SRGB]
172 { 16, 4 }, // [VK_FORMAT_ASTC_8x6_UNORM]
173 { 16, 4 }, // [VK_FORMAT_ASTC_8x6_SRGB]
174 { 16, 4 }, // [VK_FORMAT_ASTC_8x8_UNORM]
175 { 16, 4 }, // [VK_FORMAT_ASTC_8x8_SRGB]
176 { 16, 4 }, // [VK_FORMAT_ASTC_10x5_UNORM]
177 { 16, 4 }, // [VK_FORMAT_ASTC_10x5_SRGB]
178 { 16, 4 }, // [VK_FORMAT_ASTC_10x6_UNORM]
179 { 16, 4 }, // [VK_FORMAT_ASTC_10x6_SRGB]
180 { 16, 4 }, // [VK_FORMAT_ASTC_10x8_UNORM]
181 { 16, 4 }, // [VK_FORMAT_ASTC_10x8_SRGB]
182 { 16, 4 }, // [VK_FORMAT_ASTC_10x10_UNORM]
183 { 16, 4 }, // [VK_FORMAT_ASTC_10x10_SRGB]
184 { 16, 4 }, // [VK_FORMAT_ASTC_12x10_UNORM]
185 { 16, 4 }, // [VK_FORMAT_ASTC_12x10_SRGB]
186 { 16, 4 }, // [VK_FORMAT_ASTC_12x12_UNORM]
187 { 16, 4 }, // [VK_FORMAT_ASTC_12x12_SRGB]
188 { 2, 3 }, // [VK_FORMAT_B5G6R5_UNORM]
189 { 2, 3 }, // [VK_FORMAT_B5G6R5_USCALED]
190 { 3, 3 }, // [VK_FORMAT_B8G8R8_UNORM]
191 { 3, 3 }, // [VK_FORMAT_B8G8R8_SNORM]
192 { 3, 3 }, // [VK_FORMAT_B8G8R8_USCALED]
193 { 3, 3 }, // [VK_FORMAT_B8G8R8_SSCALED]
194 { 3, 3 }, // [VK_FORMAT_B8G8R8_UINT]
195 { 3, 3 }, // [VK_FORMAT_B8G8R8_SINT]
196 { 3, 3 }, // [VK_FORMAT_B8G8R8_SRGB]
197 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_UNORM]
198 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_SNORM]
199 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_USCALED]
200 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_SSCALED]
201 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_UINT]
202 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_SINT]
203 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_SRGB]
204 { 4, 4 }, // [VK_FORMAT_B10G10R10A2_UNORM]
205 { 4, 4 }, // [VK_FORMAT_B10G10R10A2_SNORM]
206 { 4, 4 }, // [VK_FORMAT_B10G10R10A2_USCALED]
207 { 4, 4 }, // [VK_FORMAT_B10G10R10A2_SSCALED]
208 { 4, 4 }, // [VK_FORMAT_B10G10R10A2_UINT]
209 { 4, 4 }, // [VK_FORMAT_B10G10R10A2_SINT]
210};
211
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600212// Return true if format is a depth or stencil format
213bool vk_format_is_depth_or_stencil(VkFormat format)
214{
215 return (vk_format_is_depth_and_stencil(format) ||
216 vk_format_is_depth_only(format) ||
217 vk_format_is_stencil_only(format));
218}
219
220// Return true if format contains depth and stencil information
221bool vk_format_is_depth_and_stencil(VkFormat format)
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600222{
223 bool is_ds = false;
224
225 switch (format) {
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600226 case VK_FORMAT_D16_UNORM_S8_UINT:
227 case VK_FORMAT_D24_UNORM_S8_UINT:
228 case VK_FORMAT_D32_SFLOAT_S8_UINT:
229 is_ds = true;
230 break;
231 default:
232 break;
233 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600234 return is_ds;
235}
236
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600237// Return true if format is a stencil-only format
238bool vk_format_is_stencil_only(VkFormat format)
239{
240 return (format == VK_FORMAT_S8_UINT);
241}
242
243// Return true if format is a depth-only format
244bool vk_format_is_depth_only(VkFormat format)
245{
246 bool is_depth = false;
247
248 switch (format) {
249 case VK_FORMAT_D16_UNORM:
250 case VK_FORMAT_D24_UNORM_X8:
251 case VK_FORMAT_D32_SFLOAT:
252 is_depth = true;
253 break;
254 default:
255 break;
256 }
257
258 return is_depth;
259}
260
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600261// Return true if format is of time UNORM
262bool vk_format_is_norm(VkFormat format)
263{
264 bool is_norm = false;
265
266 switch (format) {
267 case VK_FORMAT_R4G4_UNORM:
268 case VK_FORMAT_R4G4B4A4_UNORM:
269 case VK_FORMAT_R5G6B5_UNORM:
270 case VK_FORMAT_R5G5B5A1_UNORM:
271 case VK_FORMAT_R8_UNORM:
272 case VK_FORMAT_R8_SNORM:
273 case VK_FORMAT_R8G8_UNORM:
274 case VK_FORMAT_R8G8_SNORM:
275 case VK_FORMAT_R8G8B8_UNORM:
276 case VK_FORMAT_R8G8B8_SNORM:
277 case VK_FORMAT_R8G8B8A8_UNORM:
278 case VK_FORMAT_R8G8B8A8_SNORM:
279 case VK_FORMAT_R10G10B10A2_UNORM:
280 case VK_FORMAT_R10G10B10A2_SNORM:
281 case VK_FORMAT_R16_UNORM:
282 case VK_FORMAT_R16_SNORM:
283 case VK_FORMAT_R16G16_UNORM:
284 case VK_FORMAT_R16G16_SNORM:
285 case VK_FORMAT_R16G16B16_UNORM:
286 case VK_FORMAT_R16G16B16_SNORM:
287 case VK_FORMAT_R16G16B16A16_UNORM:
288 case VK_FORMAT_R16G16B16A16_SNORM:
289 case VK_FORMAT_BC1_RGB_UNORM:
290 case VK_FORMAT_BC2_UNORM:
291 case VK_FORMAT_BC3_UNORM:
292 case VK_FORMAT_BC4_UNORM:
293 case VK_FORMAT_BC4_SNORM:
294 case VK_FORMAT_BC5_UNORM:
295 case VK_FORMAT_BC5_SNORM:
296 case VK_FORMAT_BC7_UNORM:
297 case VK_FORMAT_ETC2_R8G8B8_UNORM:
298 case VK_FORMAT_ETC2_R8G8B8A1_UNORM:
299 case VK_FORMAT_ETC2_R8G8B8A8_UNORM:
300 case VK_FORMAT_EAC_R11_UNORM:
301 case VK_FORMAT_EAC_R11_SNORM:
302 case VK_FORMAT_EAC_R11G11_UNORM:
303 case VK_FORMAT_EAC_R11G11_SNORM:
304 case VK_FORMAT_ASTC_4x4_UNORM:
305 case VK_FORMAT_ASTC_5x4_UNORM:
306 case VK_FORMAT_ASTC_5x5_UNORM:
307 case VK_FORMAT_ASTC_6x5_UNORM:
308 case VK_FORMAT_ASTC_6x6_UNORM:
309 case VK_FORMAT_ASTC_8x5_UNORM:
310 case VK_FORMAT_ASTC_8x6_UNORM:
311 case VK_FORMAT_ASTC_8x8_UNORM:
312 case VK_FORMAT_ASTC_10x5_UNORM:
313 case VK_FORMAT_ASTC_10x6_UNORM:
314 case VK_FORMAT_ASTC_10x8_UNORM:
315 case VK_FORMAT_ASTC_10x10_UNORM:
316 case VK_FORMAT_ASTC_12x10_UNORM:
317 case VK_FORMAT_ASTC_12x12_UNORM:
318 case VK_FORMAT_B5G6R5_UNORM:
319 case VK_FORMAT_B8G8R8_UNORM:
320 case VK_FORMAT_B8G8R8_SNORM:
321 case VK_FORMAT_B8G8R8A8_UNORM:
322 case VK_FORMAT_B8G8R8A8_SNORM:
323 case VK_FORMAT_B10G10R10A2_UNORM:
324 case VK_FORMAT_B10G10R10A2_SNORM:
325 is_norm = true;
326 break;
327 default:
328 break;
329 }
330
331 return is_norm;
332};
333
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600334
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600335// Return true if format is an integer format
336bool vk_format_is_int(VkFormat format)
337{
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600338 return (vk_format_is_sint(format) || vk_format_is_uint(format));
339}
340
341// Return true if format is an unsigned integer format
342bool vk_format_is_uint(VkFormat format)
343{
344 bool is_uint = false;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600345
346 switch (format) {
347 case VK_FORMAT_R8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600348 case VK_FORMAT_R8G8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600349 case VK_FORMAT_R8G8B8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600350 case VK_FORMAT_R8G8B8A8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600351 case VK_FORMAT_R10G10B10A2_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600352 case VK_FORMAT_R16_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600353 case VK_FORMAT_R16G16_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600354 case VK_FORMAT_R16G16B16_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600355 case VK_FORMAT_R16G16B16A16_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600356 case VK_FORMAT_R32_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600357 case VK_FORMAT_R32G32_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600358 case VK_FORMAT_R32G32B32_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600359 case VK_FORMAT_R32G32B32A32_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600360 case VK_FORMAT_B8G8R8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600361 case VK_FORMAT_B8G8R8A8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600362 case VK_FORMAT_B10G10R10A2_UINT:
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600363 is_uint = true;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600364 break;
365 default:
366 break;
367 }
368
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600369 return is_uint;
370}
371
372// Return true if format is a signed integer format
373bool vk_format_is_sint(VkFormat format)
374{
375 bool is_sint = false;
376
377 switch (format) {
378 case VK_FORMAT_R8_SINT:
379 case VK_FORMAT_R8G8_SINT:
380 case VK_FORMAT_R8G8B8_SINT:
381 case VK_FORMAT_R8G8B8A8_SINT:
382 case VK_FORMAT_R10G10B10A2_SINT:
383 case VK_FORMAT_R16_SINT:
384 case VK_FORMAT_R16G16_SINT:
385 case VK_FORMAT_R16G16B16_SINT:
386 case VK_FORMAT_R16G16B16A16_SINT:
387 case VK_FORMAT_R32_SINT:
388 case VK_FORMAT_R32G32_SINT:
389 case VK_FORMAT_R32G32B32_SINT:
390 case VK_FORMAT_R32G32B32A32_SINT:
391 case VK_FORMAT_B8G8R8_SINT:
392 case VK_FORMAT_B8G8R8A8_SINT:
393 case VK_FORMAT_B10G10R10A2_SINT:
394 is_sint = true;
395 break;
396 default:
397 break;
398 }
399
400 return is_sint;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600401}
402
403// Return true if format is a floating-point format
404bool vk_format_is_float(VkFormat format)
405{
406 bool is_float = false;
407
408 switch (format) {
409 case VK_FORMAT_R16_SFLOAT:
410 case VK_FORMAT_R16G16_SFLOAT:
411 case VK_FORMAT_R16G16B16_SFLOAT:
412 case VK_FORMAT_R16G16B16A16_SFLOAT:
413 case VK_FORMAT_R32_SFLOAT:
414 case VK_FORMAT_R32G32_SFLOAT:
415 case VK_FORMAT_R32G32B32_SFLOAT:
416 case VK_FORMAT_R32G32B32A32_SFLOAT:
417 case VK_FORMAT_R64_SFLOAT:
418 case VK_FORMAT_R64G64_SFLOAT:
419 case VK_FORMAT_R64G64B64_SFLOAT:
420 case VK_FORMAT_R64G64B64A64_SFLOAT:
421 case VK_FORMAT_R11G11B10_UFLOAT:
422 case VK_FORMAT_R9G9B9E5_UFLOAT:
423 case VK_FORMAT_BC6H_UFLOAT:
424 case VK_FORMAT_BC6H_SFLOAT:
425 is_float = true;
426 break;
427 default:
428 break;
429 }
430
431 return is_float;
432}
433
434// Return true if format is in the SRGB colorspace
435bool vk_format_is_srgb(VkFormat format)
436{
437 bool is_srgb = false;
438
439 switch (format) {
440 case VK_FORMAT_R8_SRGB:
441 case VK_FORMAT_R8G8_SRGB:
442 case VK_FORMAT_R8G8B8_SRGB:
443 case VK_FORMAT_R8G8B8A8_SRGB:
444 case VK_FORMAT_BC1_RGB_SRGB:
445 case VK_FORMAT_BC2_SRGB:
446 case VK_FORMAT_BC3_SRGB:
447 case VK_FORMAT_BC7_SRGB:
448 case VK_FORMAT_ETC2_R8G8B8_SRGB:
449 case VK_FORMAT_ETC2_R8G8B8A1_SRGB:
450 case VK_FORMAT_ETC2_R8G8B8A8_SRGB:
451 case VK_FORMAT_ASTC_4x4_SRGB:
452 case VK_FORMAT_ASTC_5x4_SRGB:
453 case VK_FORMAT_ASTC_5x5_SRGB:
454 case VK_FORMAT_ASTC_6x5_SRGB:
455 case VK_FORMAT_ASTC_6x6_SRGB:
456 case VK_FORMAT_ASTC_8x5_SRGB:
457 case VK_FORMAT_ASTC_8x6_SRGB:
458 case VK_FORMAT_ASTC_8x8_SRGB:
459 case VK_FORMAT_ASTC_10x5_SRGB:
460 case VK_FORMAT_ASTC_10x6_SRGB:
461 case VK_FORMAT_ASTC_10x8_SRGB:
462 case VK_FORMAT_ASTC_10x10_SRGB:
463 case VK_FORMAT_ASTC_12x10_SRGB:
464 case VK_FORMAT_ASTC_12x12_SRGB:
465 case VK_FORMAT_B8G8R8_SRGB:
466 case VK_FORMAT_B8G8R8A8_SRGB:
467 is_srgb = true;
468 break;
469 default:
470 break;
471 }
472
473 return is_srgb;
474}
475
476// Return true if format is compressed
477bool vk_format_is_compressed(VkFormat format)
478{
479 switch (format) {
480 case VK_FORMAT_BC1_RGB_UNORM:
481 case VK_FORMAT_BC1_RGB_SRGB:
482 case VK_FORMAT_BC2_UNORM:
483 case VK_FORMAT_BC2_SRGB:
484 case VK_FORMAT_BC3_UNORM:
485 case VK_FORMAT_BC3_SRGB:
486 case VK_FORMAT_BC4_UNORM:
487 case VK_FORMAT_BC4_SNORM:
488 case VK_FORMAT_BC5_UNORM:
489 case VK_FORMAT_BC5_SNORM:
490 case VK_FORMAT_BC6H_UFLOAT:
491 case VK_FORMAT_BC6H_SFLOAT:
492 case VK_FORMAT_BC7_UNORM:
493 case VK_FORMAT_BC7_SRGB:
494 case VK_FORMAT_ETC2_R8G8B8_UNORM:
495 case VK_FORMAT_ETC2_R8G8B8_SRGB:
496 case VK_FORMAT_ETC2_R8G8B8A1_UNORM:
497 case VK_FORMAT_ETC2_R8G8B8A1_SRGB:
498 case VK_FORMAT_ETC2_R8G8B8A8_UNORM:
499 case VK_FORMAT_ETC2_R8G8B8A8_SRGB:
500 case VK_FORMAT_EAC_R11_UNORM:
501 case VK_FORMAT_EAC_R11_SNORM:
502 case VK_FORMAT_EAC_R11G11_UNORM:
503 case VK_FORMAT_EAC_R11G11_SNORM:
504 case VK_FORMAT_ASTC_4x4_UNORM:
505 case VK_FORMAT_ASTC_4x4_SRGB:
506 case VK_FORMAT_ASTC_5x4_UNORM:
507 case VK_FORMAT_ASTC_5x4_SRGB:
508 case VK_FORMAT_ASTC_5x5_UNORM:
509 case VK_FORMAT_ASTC_5x5_SRGB:
510 case VK_FORMAT_ASTC_6x5_UNORM:
511 case VK_FORMAT_ASTC_6x5_SRGB:
512 case VK_FORMAT_ASTC_6x6_UNORM:
513 case VK_FORMAT_ASTC_6x6_SRGB:
514 case VK_FORMAT_ASTC_8x5_UNORM:
515 case VK_FORMAT_ASTC_8x5_SRGB:
516 case VK_FORMAT_ASTC_8x6_UNORM:
517 case VK_FORMAT_ASTC_8x6_SRGB:
518 case VK_FORMAT_ASTC_8x8_UNORM:
519 case VK_FORMAT_ASTC_8x8_SRGB:
520 case VK_FORMAT_ASTC_10x5_UNORM:
521 case VK_FORMAT_ASTC_10x5_SRGB:
522 case VK_FORMAT_ASTC_10x6_UNORM:
523 case VK_FORMAT_ASTC_10x6_SRGB:
524 case VK_FORMAT_ASTC_10x8_UNORM:
525 case VK_FORMAT_ASTC_10x8_SRGB:
526 case VK_FORMAT_ASTC_10x10_UNORM:
527 case VK_FORMAT_ASTC_10x10_SRGB:
528 case VK_FORMAT_ASTC_12x10_UNORM:
529 case VK_FORMAT_ASTC_12x10_SRGB:
530 case VK_FORMAT_ASTC_12x12_UNORM:
531 case VK_FORMAT_ASTC_12x12_SRGB:
532 return true;
533 default:
534 return false;
535 }
536}
537
538// Return size, in bytes, of a pixel of the specified format
539size_t vk_format_get_size(VkFormat format)
540{
541 return vk_format_table[format].size;
542}
543
544// Return the number of channels for a given format
545unsigned int vk_format_get_channel_count(VkFormat format)
546{
547 return vk_format_table[format].channel_count;
548}