blob: 33226a1f3acdac4845aa508f127609d763f40e10 [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 *
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060023 * Author: Mark Lobodzinski <mark@lunarg.com>
24 *
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060025 */
26
27#include <string.h>
David Pinedo9316d3b2015-11-06 12:54:48 -070028#include "vulkan/vulkan.h"
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060029#include "vk_layer_utils.h"
30
31typedef struct _VULKAN_FORMAT_INFO {
32 size_t size;
33 uint32_t channel_count;
34} VULKAN_FORMAT_INFO;
35
36
37// Set up data structure with number of bytes and number of channels
38// for each Vulkan format.
Chia-I Wu3432a0c2015-10-27 18:04:07 +080039static const VULKAN_FORMAT_INFO vk_format_table[VK_FORMAT_RANGE_SIZE] = {
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060040 { 0, 0 }, // [VK_FORMAT_UNDEFINED]
Chia-I Wucaa5aaa2015-11-10 17:01:22 +080041 { 1, 2 }, // [VK_FORMAT_R4G4_UNORM_PACK8]
Chia-I Wucaa5aaa2015-11-10 17:01:22 +080042 { 2, 4 }, // [VK_FORMAT_R4G4B4A4_UNORM_PACK16]
Chia-I Wu08bee5e2015-11-10 17:01:22 +080043 { 2, 4 }, // [VK_FORMAT_B4G4R4A4_UNORM_PACK16]
Chia-I Wucaa5aaa2015-11-10 17:01:22 +080044 { 2, 3 }, // [VK_FORMAT_R5G6B5_UNORM_PACK16]
Chia-I Wu08bee5e2015-11-10 17:01:22 +080045 { 2, 3 }, // [VK_FORMAT_B5G6R5_UNORM_PACK16]
Chia-I Wucaa5aaa2015-11-10 17:01:22 +080046 { 2, 4 }, // [VK_FORMAT_R5G5B5A1_UNORM_PACK16]
Chia-I Wu08bee5e2015-11-10 17:01:22 +080047 { 2, 4 }, // [VK_FORMAT_B5G5R5A1_UNORM_PACK16]
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060048 { 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]
Chia-I Wu08bee5e2015-11-10 17:01:22 +080069 { 3, 3 }, // [VK_FORMAT_B8G8R8_UNORM]
70 { 3, 3 }, // [VK_FORMAT_B8G8R8_SNORM]
71 { 3, 3 }, // [VK_FORMAT_B8G8R8_USCALED]
72 { 3, 3 }, // [VK_FORMAT_B8G8R8_SSCALED]
73 { 3, 3 }, // [VK_FORMAT_B8G8R8_UINT]
74 { 3, 3 }, // [VK_FORMAT_B8G8R8_SINT]
75 { 3, 3 }, // [VK_FORMAT_B8G8R8_SRGB]
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060076 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_UNORM]
77 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_SNORM]
78 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_USCALED]
79 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_SSCALED]
80 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_UINT]
81 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_SINT]
82 { 4, 4 }, // [VK_FORMAT_R8G8B8A8_SRGB]
Chia-I Wu08bee5e2015-11-10 17:01:22 +080083 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_UNORM]
84 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_SNORM]
85 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_USCALED]
86 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_SSCALED]
87 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_UINT]
88 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_SINT]
89 { 4, 4 }, // [VK_FORMAT_B8G8R8A8_SRGB]
90 { 4, 4 }, // [VK_FORMAT_A2R10G10B10_UNORM_PACK32]
91 { 4, 4 }, // [VK_FORMAT_A2R10G10B10_SNORM_PACK32]
92 { 4, 4 }, // [VK_FORMAT_A2R10G10B10_USCALED_PACK32]
93 { 4, 4 }, // [VK_FORMAT_A2R10G10B10_SSCALED_PACK32]
94 { 4, 4 }, // [VK_FORMAT_A2R10G10B10_UINT_PACK32]
95 { 4, 4 }, // [VK_FORMAT_A2R10G10B10_SINT_PACK32]
Chia-I Wu935f2ed2015-11-10 17:01:22 +080096 { 4, 4 }, // [VK_FORMAT_A2B10G10R10_UNORM_PACK32]
97 { 4, 4 }, // [VK_FORMAT_A2B10G10R10_SNORM_PACK32]
98 { 4, 4 }, // [VK_FORMAT_A2B10G10R10_USCALED_PACK32]
99 { 4, 4 }, // [VK_FORMAT_A2B10G10R10_SSCALED_PACK32]
100 { 4, 4 }, // [VK_FORMAT_A2B10G10R10_UINT_PACK32]
101 { 4, 4 }, // [VK_FORMAT_A2B10G10R10_SINT_PACK32]
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600102 { 2, 1 }, // [VK_FORMAT_R16_UNORM]
103 { 2, 1 }, // [VK_FORMAT_R16_SNORM]
104 { 2, 1 }, // [VK_FORMAT_R16_USCALED]
105 { 2, 1 }, // [VK_FORMAT_R16_SSCALED]
106 { 2, 1 }, // [VK_FORMAT_R16_UINT]
107 { 2, 1 }, // [VK_FORMAT_R16_SINT]
108 { 2, 1 }, // [VK_FORMAT_R16_SFLOAT]
109 { 4, 2 }, // [VK_FORMAT_R16G16_UNORM]
110 { 4, 2 }, // [VK_FORMAT_R16G16_SNORM]
111 { 4, 2 }, // [VK_FORMAT_R16G16_USCALED]
112 { 4, 2 }, // [VK_FORMAT_R16G16_SSCALED]
113 { 4, 2 }, // [VK_FORMAT_R16G16_UINT]
114 { 4, 2 }, // [VK_FORMAT_R16G16_SINT]
115 { 4, 2 }, // [VK_FORMAT_R16G16_SFLOAT]
116 { 6, 3 }, // [VK_FORMAT_R16G16B16_UNORM]
117 { 6, 3 }, // [VK_FORMAT_R16G16B16_SNORM]
118 { 6, 3 }, // [VK_FORMAT_R16G16B16_USCALED]
119 { 6, 3 }, // [VK_FORMAT_R16G16B16_SSCALED]
120 { 6, 3 }, // [VK_FORMAT_R16G16B16_UINT]
121 { 6, 3 }, // [VK_FORMAT_R16G16B16_SINT]
122 { 6, 3 }, // [VK_FORMAT_R16G16B16_SFLOAT]
123 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_UNORM]
124 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_SNORM]
125 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_USCALED]
126 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_SSCALED]
127 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_UINT]
128 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_SINT]
129 { 8, 4 }, // [VK_FORMAT_R16G16B16A16_SFLOAT]
130 { 4, 1 }, // [VK_FORMAT_R32_UINT]
131 { 4, 1 }, // [VK_FORMAT_R32_SINT]
132 { 4, 1 }, // [VK_FORMAT_R32_SFLOAT]
133 { 8, 2 }, // [VK_FORMAT_R32G32_UINT]
134 { 8, 2 }, // [VK_FORMAT_R32G32_SINT]
135 { 8, 2 }, // [VK_FORMAT_R32G32_SFLOAT]
136 { 12, 3 }, // [VK_FORMAT_R32G32B32_UINT]
137 { 12, 3 }, // [VK_FORMAT_R32G32B32_SINT]
138 { 12, 3 }, // [VK_FORMAT_R32G32B32_SFLOAT]
139 { 16, 4 }, // [VK_FORMAT_R32G32B32A32_UINT]
140 { 16, 4 }, // [VK_FORMAT_R32G32B32A32_SINT]
141 { 16, 4 }, // [VK_FORMAT_R32G32B32A32_SFLOAT]
142 { 8, 1 }, // [VK_FORMAT_R64_SFLOAT]
143 { 16, 2 }, // [VK_FORMAT_R64G64_SFLOAT]
144 { 24, 3 }, // [VK_FORMAT_R64G64B64_SFLOAT]
145 { 32, 4 }, // [VK_FORMAT_R64G64B64A64_SFLOAT]
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800146 { 4, 3 }, // [VK_FORMAT_B10G11R11_UFLOAT_PACK32]
147 { 4, 3 }, // [VK_FORMAT_E5B9G9R9_UFLOAT_PACK32]
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600148 { 2, 1 }, // [VK_FORMAT_D16_UNORM]
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800149 { 3, 1 }, // [VK_FORMAT_X8_D24_UNORM_PACK32]
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600150 { 4, 1 }, // [VK_FORMAT_D32_SFLOAT]
151 { 1, 1 }, // [VK_FORMAT_S8_UINT]
152 { 3, 2 }, // [VK_FORMAT_D16_UNORM_S8_UINT]
153 { 4, 2 }, // [VK_FORMAT_D24_UNORM_S8_UINT]
154 { 4, 2 }, // [VK_FORMAT_D32_SFLOAT_S8_UINT]
Chia-I Wu53638c12015-11-10 16:44:23 +0800155 { 8, 4 }, // [VK_FORMAT_BC1_RGB_UNORM_BLOCK]
156 { 8, 4 }, // [VK_FORMAT_BC1_RGB_SRGB_BLOCK]
157 { 8, 4 }, // [VK_FORMAT_BC1_RGBA_UNORM_BLOCK]
158 { 8, 4 }, // [VK_FORMAT_BC1_RGBA_SRGB_BLOCK]
159 { 16, 4 }, // [VK_FORMAT_BC2_UNORM_BLOCK]
160 { 16, 4 }, // [VK_FORMAT_BC2_SRGB_BLOCK]
161 { 16, 4 }, // [VK_FORMAT_BC3_UNORM_BLOCK]
162 { 16, 4 }, // [VK_FORMAT_BC3_SRGB_BLOCK]
163 { 8, 4 }, // [VK_FORMAT_BC4_UNORM_BLOCK]
164 { 8, 4 }, // [VK_FORMAT_BC4_SNORM_BLOCK]
165 { 16, 4 }, // [VK_FORMAT_BC5_UNORM_BLOCK]
166 { 16, 4 }, // [VK_FORMAT_BC5_SNORM_BLOCK]
167 { 16, 4 }, // [VK_FORMAT_BC6H_UFLOAT_BLOCK]
168 { 16, 4 }, // [VK_FORMAT_BC6H_SFLOAT_BLOCK]
169 { 16, 4 }, // [VK_FORMAT_BC7_UNORM_BLOCK]
170 { 16, 4 }, // [VK_FORMAT_BC7_SRGB_BLOCK]
171 { 8, 3 }, // [VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK]
172 { 8, 3 }, // [VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK]
173 { 8, 4 }, // [VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK]
174 { 8, 4 }, // [VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK]
175 { 8, 4 }, // [VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK]
176 { 8, 4 }, // [VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK]
177 { 8, 1 }, // [VK_FORMAT_EAC_R11_UNORM_BLOCK]
178 { 8, 1 }, // [VK_FORMAT_EAC_R11_SNORM_BLOCK]
179 { 16, 2 }, // [VK_FORMAT_EAC_R11G11_UNORM_BLOCK]
180 { 16, 2 }, // [VK_FORMAT_EAC_R11G11_SNORM_BLOCK]
181 { 16, 4 }, // [VK_FORMAT_ASTC_4x4_UNORM_BLOCK]
182 { 16, 4 }, // [VK_FORMAT_ASTC_4x4_SRGB_BLOCK]
183 { 16, 4 }, // [VK_FORMAT_ASTC_5x4_UNORM_BLOCK]
184 { 16, 4 }, // [VK_FORMAT_ASTC_5x4_SRGB_BLOCK]
185 { 16, 4 }, // [VK_FORMAT_ASTC_5x5_UNORM_BLOCK]
186 { 16, 4 }, // [VK_FORMAT_ASTC_5x5_SRGB_BLOCK]
187 { 16, 4 }, // [VK_FORMAT_ASTC_6x5_UNORM_BLOCK]
188 { 16, 4 }, // [VK_FORMAT_ASTC_6x5_SRGB_BLOCK]
189 { 16, 4 }, // [VK_FORMAT_ASTC_6x6_UNORM_BLOCK]
190 { 16, 4 }, // [VK_FORMAT_ASTC_6x6_SRGB_BLOCK]
191 { 16, 4 }, // [VK_FORMAT_ASTC_8x5_UNORM_BLOCK]
192 { 16, 4 }, // [VK_FORMAT_ASTC_8x5_SRGB_BLOCK]
193 { 16, 4 }, // [VK_FORMAT_ASTC_8x6_UNORM_BLOCK]
194 { 16, 4 }, // [VK_FORMAT_ASTC_8x6_SRGB_BLOCK]
195 { 16, 4 }, // [VK_FORMAT_ASTC_8x8_UNORM_BLOCK]
196 { 16, 4 }, // [VK_FORMAT_ASTC_8x8_SRGB_BLOCK]
197 { 16, 4 }, // [VK_FORMAT_ASTC_10x5_UNORM_BLOCK]
198 { 16, 4 }, // [VK_FORMAT_ASTC_10x5_SRGB_BLOCK]
199 { 16, 4 }, // [VK_FORMAT_ASTC_10x6_UNORM_BLOCK]
200 { 16, 4 }, // [VK_FORMAT_ASTC_10x6_SRGB_BLOCK]
201 { 16, 4 }, // [VK_FORMAT_ASTC_10x8_UNORM_BLOCK]
202 { 16, 4 }, // [VK_FORMAT_ASTC_10x8_SRGB_BLOCK]
203 { 16, 4 }, // [VK_FORMAT_ASTC_10x10_UNORM_BLOCK]
204 { 16, 4 }, // [VK_FORMAT_ASTC_10x10_SRGB_BLOCK]
205 { 16, 4 }, // [VK_FORMAT_ASTC_12x10_UNORM_BLOCK]
206 { 16, 4 }, // [VK_FORMAT_ASTC_12x10_SRGB_BLOCK]
207 { 16, 4 }, // [VK_FORMAT_ASTC_12x12_UNORM_BLOCK]
208 { 16, 4 }, // [VK_FORMAT_ASTC_12x12_SRGB_BLOCK]
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600209};
210
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600211// Return true if format is a depth or stencil format
212bool vk_format_is_depth_or_stencil(VkFormat format)
213{
214 return (vk_format_is_depth_and_stencil(format) ||
215 vk_format_is_depth_only(format) ||
216 vk_format_is_stencil_only(format));
217}
218
219// Return true if format contains depth and stencil information
220bool vk_format_is_depth_and_stencil(VkFormat format)
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600221{
222 bool is_ds = false;
223
224 switch (format) {
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600225 case VK_FORMAT_D16_UNORM_S8_UINT:
226 case VK_FORMAT_D24_UNORM_S8_UINT:
227 case VK_FORMAT_D32_SFLOAT_S8_UINT:
228 is_ds = true;
229 break;
230 default:
231 break;
232 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600233 return is_ds;
234}
235
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600236// Return true if format is a stencil-only format
237bool vk_format_is_stencil_only(VkFormat format)
238{
239 return (format == VK_FORMAT_S8_UINT);
240}
241
242// Return true if format is a depth-only format
243bool vk_format_is_depth_only(VkFormat format)
244{
245 bool is_depth = false;
246
247 switch (format) {
248 case VK_FORMAT_D16_UNORM:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800249 case VK_FORMAT_X8_D24_UNORM_PACK32:
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600250 case VK_FORMAT_D32_SFLOAT:
251 is_depth = true;
252 break;
253 default:
254 break;
255 }
256
257 return is_depth;
258}
259
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600260// Return true if format is of time UNORM
261bool vk_format_is_norm(VkFormat format)
262{
263 bool is_norm = false;
264
265 switch (format) {
Chia-I Wucaa5aaa2015-11-10 17:01:22 +0800266 case VK_FORMAT_R4G4_UNORM_PACK8:
267 case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
268 case VK_FORMAT_R5G6B5_UNORM_PACK16:
269 case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600270 case VK_FORMAT_R8_UNORM:
271 case VK_FORMAT_R8_SNORM:
272 case VK_FORMAT_R8G8_UNORM:
273 case VK_FORMAT_R8G8_SNORM:
274 case VK_FORMAT_R8G8B8_UNORM:
275 case VK_FORMAT_R8G8B8_SNORM:
276 case VK_FORMAT_R8G8B8A8_UNORM:
277 case VK_FORMAT_R8G8B8A8_SNORM:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800278 case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
279 case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600280 case VK_FORMAT_R16_UNORM:
281 case VK_FORMAT_R16_SNORM:
282 case VK_FORMAT_R16G16_UNORM:
283 case VK_FORMAT_R16G16_SNORM:
284 case VK_FORMAT_R16G16B16_UNORM:
285 case VK_FORMAT_R16G16B16_SNORM:
286 case VK_FORMAT_R16G16B16A16_UNORM:
287 case VK_FORMAT_R16G16B16A16_SNORM:
Chia-I Wu53638c12015-11-10 16:44:23 +0800288 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
289 case VK_FORMAT_BC2_UNORM_BLOCK:
290 case VK_FORMAT_BC3_UNORM_BLOCK:
291 case VK_FORMAT_BC4_UNORM_BLOCK:
292 case VK_FORMAT_BC4_SNORM_BLOCK:
293 case VK_FORMAT_BC5_UNORM_BLOCK:
294 case VK_FORMAT_BC5_SNORM_BLOCK:
295 case VK_FORMAT_BC7_UNORM_BLOCK:
296 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
297 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
298 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
299 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
300 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
301 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
302 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
303 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
304 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
305 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
306 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
307 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
308 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
309 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
310 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
311 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
312 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
313 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
314 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
315 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
316 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
Chia-I Wucaa5aaa2015-11-10 17:01:22 +0800317 case VK_FORMAT_B5G6R5_UNORM_PACK16:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600318 case VK_FORMAT_B8G8R8_UNORM:
319 case VK_FORMAT_B8G8R8_SNORM:
320 case VK_FORMAT_B8G8R8A8_UNORM:
321 case VK_FORMAT_B8G8R8A8_SNORM:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800322 case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
323 case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600324 is_norm = true;
325 break;
326 default:
327 break;
328 }
329
330 return is_norm;
331};
332
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600333
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600334// Return true if format is an integer format
335bool vk_format_is_int(VkFormat format)
336{
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600337 return (vk_format_is_sint(format) || vk_format_is_uint(format));
338}
339
340// Return true if format is an unsigned integer format
341bool vk_format_is_uint(VkFormat format)
342{
343 bool is_uint = false;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600344
345 switch (format) {
346 case VK_FORMAT_R8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600347 case VK_FORMAT_R8G8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600348 case VK_FORMAT_R8G8B8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600349 case VK_FORMAT_R8G8B8A8_UINT:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800350 case VK_FORMAT_A2B10G10R10_UINT_PACK32:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600351 case VK_FORMAT_R16_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600352 case VK_FORMAT_R16G16_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600353 case VK_FORMAT_R16G16B16_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600354 case VK_FORMAT_R16G16B16A16_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600355 case VK_FORMAT_R32_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600356 case VK_FORMAT_R32G32_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600357 case VK_FORMAT_R32G32B32_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600358 case VK_FORMAT_R32G32B32A32_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600359 case VK_FORMAT_B8G8R8_UINT:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600360 case VK_FORMAT_B8G8R8A8_UINT:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800361 case VK_FORMAT_A2R10G10B10_UINT_PACK32:
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600362 is_uint = true;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600363 break;
364 default:
365 break;
366 }
367
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600368 return is_uint;
369}
370
371// Return true if format is a signed integer format
372bool vk_format_is_sint(VkFormat format)
373{
374 bool is_sint = false;
375
376 switch (format) {
377 case VK_FORMAT_R8_SINT:
378 case VK_FORMAT_R8G8_SINT:
379 case VK_FORMAT_R8G8B8_SINT:
380 case VK_FORMAT_R8G8B8A8_SINT:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800381 case VK_FORMAT_A2B10G10R10_SINT_PACK32:
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600382 case VK_FORMAT_R16_SINT:
383 case VK_FORMAT_R16G16_SINT:
384 case VK_FORMAT_R16G16B16_SINT:
385 case VK_FORMAT_R16G16B16A16_SINT:
386 case VK_FORMAT_R32_SINT:
387 case VK_FORMAT_R32G32_SINT:
388 case VK_FORMAT_R32G32B32_SINT:
389 case VK_FORMAT_R32G32B32A32_SINT:
390 case VK_FORMAT_B8G8R8_SINT:
391 case VK_FORMAT_B8G8R8A8_SINT:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800392 case VK_FORMAT_A2R10G10B10_SINT_PACK32:
Mark Lobodzinskidc86b852015-10-23 14:20:31 -0600393 is_sint = true;
394 break;
395 default:
396 break;
397 }
398
399 return is_sint;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600400}
401
402// Return true if format is a floating-point format
403bool vk_format_is_float(VkFormat format)
404{
405 bool is_float = false;
406
407 switch (format) {
408 case VK_FORMAT_R16_SFLOAT:
409 case VK_FORMAT_R16G16_SFLOAT:
410 case VK_FORMAT_R16G16B16_SFLOAT:
411 case VK_FORMAT_R16G16B16A16_SFLOAT:
412 case VK_FORMAT_R32_SFLOAT:
413 case VK_FORMAT_R32G32_SFLOAT:
414 case VK_FORMAT_R32G32B32_SFLOAT:
415 case VK_FORMAT_R32G32B32A32_SFLOAT:
416 case VK_FORMAT_R64_SFLOAT:
417 case VK_FORMAT_R64G64_SFLOAT:
418 case VK_FORMAT_R64G64B64_SFLOAT:
419 case VK_FORMAT_R64G64B64A64_SFLOAT:
Chia-I Wu935f2ed2015-11-10 17:01:22 +0800420 case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
421 case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
Chia-I Wu53638c12015-11-10 16:44:23 +0800422 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
423 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600424 is_float = true;
425 break;
426 default:
427 break;
428 }
429
430 return is_float;
431}
432
433// Return true if format is in the SRGB colorspace
434bool vk_format_is_srgb(VkFormat format)
435{
436 bool is_srgb = false;
437
438 switch (format) {
439 case VK_FORMAT_R8_SRGB:
440 case VK_FORMAT_R8G8_SRGB:
441 case VK_FORMAT_R8G8B8_SRGB:
442 case VK_FORMAT_R8G8B8A8_SRGB:
Chia-I Wu53638c12015-11-10 16:44:23 +0800443 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
444 case VK_FORMAT_BC2_SRGB_BLOCK:
445 case VK_FORMAT_BC3_SRGB_BLOCK:
446 case VK_FORMAT_BC7_SRGB_BLOCK:
447 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
448 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
449 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
450 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
451 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
452 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
453 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
454 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
455 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
456 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
457 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
458 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
459 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
460 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
461 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
462 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
463 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600464 case VK_FORMAT_B8G8R8_SRGB:
465 case VK_FORMAT_B8G8R8A8_SRGB:
466 is_srgb = true;
467 break;
468 default:
469 break;
470 }
471
472 return is_srgb;
473}
474
475// Return true if format is compressed
476bool vk_format_is_compressed(VkFormat format)
477{
478 switch (format) {
Chia-I Wu53638c12015-11-10 16:44:23 +0800479 case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
480 case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
481 case VK_FORMAT_BC2_UNORM_BLOCK:
482 case VK_FORMAT_BC2_SRGB_BLOCK:
483 case VK_FORMAT_BC3_UNORM_BLOCK:
484 case VK_FORMAT_BC3_SRGB_BLOCK:
485 case VK_FORMAT_BC4_UNORM_BLOCK:
486 case VK_FORMAT_BC4_SNORM_BLOCK:
487 case VK_FORMAT_BC5_UNORM_BLOCK:
488 case VK_FORMAT_BC5_SNORM_BLOCK:
489 case VK_FORMAT_BC6H_UFLOAT_BLOCK:
490 case VK_FORMAT_BC6H_SFLOAT_BLOCK:
491 case VK_FORMAT_BC7_UNORM_BLOCK:
492 case VK_FORMAT_BC7_SRGB_BLOCK:
493 case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
494 case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
495 case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
496 case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
497 case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
498 case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
499 case VK_FORMAT_EAC_R11_UNORM_BLOCK:
500 case VK_FORMAT_EAC_R11_SNORM_BLOCK:
501 case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
502 case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
503 case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
504 case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
505 case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
506 case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
507 case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
508 case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
509 case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
510 case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
511 case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
512 case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
513 case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
514 case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
515 case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
516 case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
517 case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
518 case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
519 case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
520 case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
521 case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
522 case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
523 case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
524 case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
525 case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
526 case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
527 case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
528 case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
529 case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
530 case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -0600531 return true;
532 default:
533 return false;
534 }
535}
536
537// Return size, in bytes, of a pixel of the specified format
538size_t vk_format_get_size(VkFormat format)
539{
540 return vk_format_table[format].size;
541}
542
543// Return the number of channels for a given format
544unsigned int vk_format_get_channel_count(VkFormat format)
545{
546 return vk_format_table[format].channel_count;
547}