• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2015-2016 The Khronos Group Inc.
4 // Copyright (c) 2015-2016 Valve Corporation
5 // Copyright (c) 2015-2016 LunarG, Inc.
6 // Copyright (c) 2015-2016 Google, Inc.
7 //
8 // Licensed under the Apache License, Version 2.0 (the "License");
9 // you may not use this file except in compliance with the License.
10 // You may obtain a copy of the License at
11 //
12 //     http://www.apache.org/licenses/LICENSE-2.0
13 //
14 // Unless required by applicable law or agreed to in writing, software
15 // distributed under the License is distributed on an "AS IS" BASIS,
16 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 // See the License for the specific language governing permissions and
18 // limitations under the License.
19 ///////////////////////////////////////////////////////////////////////////////
20 
21 #include "vkjson.h"
22 
23 #include <assert.h>
24 #include <stdlib.h>
25 #include <string.h>
26 
27 #include <json/json.h>
28 
29 #include <algorithm>
30 #include <cinttypes>
31 #include <cmath>
32 #include <cstdio>
33 #include <limits>
34 #include <memory>
35 #include <sstream>
36 #include <type_traits>
37 #include <utility>
38 
39 /*
40  * This file is autogenerated by vkjson_generator.py. Do not edit directly.
41  */
42 namespace {
43 
44 /*
45  * Annotation to tell clang that we intend to fall through from one case to
46  * another in a switch. Sourced from android-base/macros.h.
47  */
48 #define FALLTHROUGH_INTENDED [[clang::fallthrough]]
49 
IsIntegral(double value)50 inline bool IsIntegral(double value) {
51 #if defined(ANDROID)
52   // Android NDK doesn't provide std::trunc yet
53   return trunc(value) == value;
54 #else
55   return std::trunc(value) == value;
56 #endif
57 }
58 
59 // Floating point fields of Vulkan structure use single precision. The string
60 // output of max double value in c++ will be larger than Java double's infinity
61 // value. Below fake double max/min values are only to serve the safe json text
62 // parsing in between C++ and Java, because Java json library simply cannot
63 // handle infinity.
64 static const double SAFE_DOUBLE_MAX = 0.99 * std::numeric_limits<double>::max();
65 static const double SAFE_DOUBLE_MIN = -SAFE_DOUBLE_MAX;
66 
67 template <typename T>
68 struct EnumTraits;
69 template <>
70 struct EnumTraits<VkPhysicalDeviceType> {
exist__anon678960f40111::EnumTraits71   static bool exist(uint32_t e) {
72     switch (e) {
73       case VK_PHYSICAL_DEVICE_TYPE_OTHER:
74       case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU:
75       case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU:
76       case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU:
77       case VK_PHYSICAL_DEVICE_TYPE_CPU:
78         return true;
79     }
80     return false;
81   }
82 };
83 
84 template <>
85 struct EnumTraits<VkFormat> {
exist__anon678960f40111::EnumTraits86   static bool exist(uint32_t e) {
87     switch (e) {
88       case VK_FORMAT_UNDEFINED:
89       case VK_FORMAT_R4G4_UNORM_PACK8:
90       case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
91       case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
92       case VK_FORMAT_R5G6B5_UNORM_PACK16:
93       case VK_FORMAT_B5G6R5_UNORM_PACK16:
94       case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
95       case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
96       case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
97       case VK_FORMAT_R8_UNORM:
98       case VK_FORMAT_R8_SNORM:
99       case VK_FORMAT_R8_USCALED:
100       case VK_FORMAT_R8_SSCALED:
101       case VK_FORMAT_R8_UINT:
102       case VK_FORMAT_R8_SINT:
103       case VK_FORMAT_R8_SRGB:
104       case VK_FORMAT_R8G8_UNORM:
105       case VK_FORMAT_R8G8_SNORM:
106       case VK_FORMAT_R8G8_USCALED:
107       case VK_FORMAT_R8G8_SSCALED:
108       case VK_FORMAT_R8G8_UINT:
109       case VK_FORMAT_R8G8_SINT:
110       case VK_FORMAT_R8G8_SRGB:
111       case VK_FORMAT_R8G8B8_UNORM:
112       case VK_FORMAT_R8G8B8_SNORM:
113       case VK_FORMAT_R8G8B8_USCALED:
114       case VK_FORMAT_R8G8B8_SSCALED:
115       case VK_FORMAT_R8G8B8_UINT:
116       case VK_FORMAT_R8G8B8_SINT:
117       case VK_FORMAT_R8G8B8_SRGB:
118       case VK_FORMAT_B8G8R8_UNORM:
119       case VK_FORMAT_B8G8R8_SNORM:
120       case VK_FORMAT_B8G8R8_USCALED:
121       case VK_FORMAT_B8G8R8_SSCALED:
122       case VK_FORMAT_B8G8R8_UINT:
123       case VK_FORMAT_B8G8R8_SINT:
124       case VK_FORMAT_B8G8R8_SRGB:
125       case VK_FORMAT_R8G8B8A8_UNORM:
126       case VK_FORMAT_R8G8B8A8_SNORM:
127       case VK_FORMAT_R8G8B8A8_USCALED:
128       case VK_FORMAT_R8G8B8A8_SSCALED:
129       case VK_FORMAT_R8G8B8A8_UINT:
130       case VK_FORMAT_R8G8B8A8_SINT:
131       case VK_FORMAT_R8G8B8A8_SRGB:
132       case VK_FORMAT_B8G8R8A8_UNORM:
133       case VK_FORMAT_B8G8R8A8_SNORM:
134       case VK_FORMAT_B8G8R8A8_USCALED:
135       case VK_FORMAT_B8G8R8A8_SSCALED:
136       case VK_FORMAT_B8G8R8A8_UINT:
137       case VK_FORMAT_B8G8R8A8_SINT:
138       case VK_FORMAT_B8G8R8A8_SRGB:
139       case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
140       case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
141       case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
142       case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
143       case VK_FORMAT_A8B8G8R8_UINT_PACK32:
144       case VK_FORMAT_A8B8G8R8_SINT_PACK32:
145       case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
146       case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
147       case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
148       case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
149       case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
150       case VK_FORMAT_A2R10G10B10_UINT_PACK32:
151       case VK_FORMAT_A2R10G10B10_SINT_PACK32:
152       case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
153       case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
154       case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
155       case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
156       case VK_FORMAT_A2B10G10R10_UINT_PACK32:
157       case VK_FORMAT_A2B10G10R10_SINT_PACK32:
158       case VK_FORMAT_R16_UNORM:
159       case VK_FORMAT_R16_SNORM:
160       case VK_FORMAT_R16_USCALED:
161       case VK_FORMAT_R16_SSCALED:
162       case VK_FORMAT_R16_UINT:
163       case VK_FORMAT_R16_SINT:
164       case VK_FORMAT_R16_SFLOAT:
165       case VK_FORMAT_R16G16_UNORM:
166       case VK_FORMAT_R16G16_SNORM:
167       case VK_FORMAT_R16G16_USCALED:
168       case VK_FORMAT_R16G16_SSCALED:
169       case VK_FORMAT_R16G16_UINT:
170       case VK_FORMAT_R16G16_SINT:
171       case VK_FORMAT_R16G16_SFLOAT:
172       case VK_FORMAT_R16G16B16_UNORM:
173       case VK_FORMAT_R16G16B16_SNORM:
174       case VK_FORMAT_R16G16B16_USCALED:
175       case VK_FORMAT_R16G16B16_SSCALED:
176       case VK_FORMAT_R16G16B16_UINT:
177       case VK_FORMAT_R16G16B16_SINT:
178       case VK_FORMAT_R16G16B16_SFLOAT:
179       case VK_FORMAT_R16G16B16A16_UNORM:
180       case VK_FORMAT_R16G16B16A16_SNORM:
181       case VK_FORMAT_R16G16B16A16_USCALED:
182       case VK_FORMAT_R16G16B16A16_SSCALED:
183       case VK_FORMAT_R16G16B16A16_UINT:
184       case VK_FORMAT_R16G16B16A16_SINT:
185       case VK_FORMAT_R16G16B16A16_SFLOAT:
186       case VK_FORMAT_R32_UINT:
187       case VK_FORMAT_R32_SINT:
188       case VK_FORMAT_R32_SFLOAT:
189       case VK_FORMAT_R32G32_UINT:
190       case VK_FORMAT_R32G32_SINT:
191       case VK_FORMAT_R32G32_SFLOAT:
192       case VK_FORMAT_R32G32B32_UINT:
193       case VK_FORMAT_R32G32B32_SINT:
194       case VK_FORMAT_R32G32B32_SFLOAT:
195       case VK_FORMAT_R32G32B32A32_UINT:
196       case VK_FORMAT_R32G32B32A32_SINT:
197       case VK_FORMAT_R32G32B32A32_SFLOAT:
198       case VK_FORMAT_R64_UINT:
199       case VK_FORMAT_R64_SINT:
200       case VK_FORMAT_R64_SFLOAT:
201       case VK_FORMAT_R64G64_UINT:
202       case VK_FORMAT_R64G64_SINT:
203       case VK_FORMAT_R64G64_SFLOAT:
204       case VK_FORMAT_R64G64B64_UINT:
205       case VK_FORMAT_R64G64B64_SINT:
206       case VK_FORMAT_R64G64B64_SFLOAT:
207       case VK_FORMAT_R64G64B64A64_UINT:
208       case VK_FORMAT_R64G64B64A64_SINT:
209       case VK_FORMAT_R64G64B64A64_SFLOAT:
210       case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
211       case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
212       case VK_FORMAT_D16_UNORM:
213       case VK_FORMAT_X8_D24_UNORM_PACK32:
214       case VK_FORMAT_D32_SFLOAT:
215       case VK_FORMAT_S8_UINT:
216       case VK_FORMAT_D16_UNORM_S8_UINT:
217       case VK_FORMAT_D24_UNORM_S8_UINT:
218       case VK_FORMAT_D32_SFLOAT_S8_UINT:
219       case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
220       case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
221       case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
222       case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
223       case VK_FORMAT_BC2_UNORM_BLOCK:
224       case VK_FORMAT_BC2_SRGB_BLOCK:
225       case VK_FORMAT_BC3_UNORM_BLOCK:
226       case VK_FORMAT_BC3_SRGB_BLOCK:
227       case VK_FORMAT_BC4_UNORM_BLOCK:
228       case VK_FORMAT_BC4_SNORM_BLOCK:
229       case VK_FORMAT_BC5_UNORM_BLOCK:
230       case VK_FORMAT_BC5_SNORM_BLOCK:
231       case VK_FORMAT_BC6H_UFLOAT_BLOCK:
232       case VK_FORMAT_BC6H_SFLOAT_BLOCK:
233       case VK_FORMAT_BC7_UNORM_BLOCK:
234       case VK_FORMAT_BC7_SRGB_BLOCK:
235       case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
236       case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
237       case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
238       case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
239       case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
240       case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
241       case VK_FORMAT_EAC_R11_UNORM_BLOCK:
242       case VK_FORMAT_EAC_R11_SNORM_BLOCK:
243       case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
244       case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
245       case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
246       case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
247       case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
248       case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
249       case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
250       case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
251       case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
252       case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
253       case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
254       case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
255       case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
256       case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
257       case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
258       case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
259       case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
260       case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
261       case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
262       case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
263       case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
264       case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
265       case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
266       case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
267       case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
268       case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
269       case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
270       case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
271       case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
272       case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
273       case VK_FORMAT_G8B8G8R8_422_UNORM:
274       case VK_FORMAT_B8G8R8G8_422_UNORM:
275       case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
276       case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
277       case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
278       case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
279       case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
280       case VK_FORMAT_R10X6_UNORM_PACK16:
281       case VK_FORMAT_R10X6G10X6_UNORM_2PACK16:
282       case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16:
283       case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
284       case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:
285       case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
286       case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
287       case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
288       case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
289       case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
290       case VK_FORMAT_R12X4_UNORM_PACK16:
291       case VK_FORMAT_R12X4G12X4_UNORM_2PACK16:
292       case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16:
293       case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
294       case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:
295       case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
296       case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
297       case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
298       case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
299       case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
300       case VK_FORMAT_G16B16G16R16_422_UNORM:
301       case VK_FORMAT_B16G16R16G16_422_UNORM:
302       case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
303       case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
304       case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
305       case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
306       case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
307       case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
308       case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
309       case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
310       case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
311       case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
312       case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
313       case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
314       case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
315       case VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT:
316       case VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT:
317       case VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT:
318       case VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT:
319       case VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT:
320       case VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT:
321       case VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT:
322       case VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT:
323       case VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT:
324       case VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT:
325       case VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT:
326       case VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT:
327       case VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT:
328       case VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT:
329       case VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT:
330       case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT:
331         return true;
332     }
333     return false;
334   }
335 };
336 
337 template <>
338 struct EnumTraits<VkPointClippingBehavior> {
exist__anon678960f40111::EnumTraits339   static bool exist(uint32_t e) {
340     switch (e) {
341       case VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES:
342       case VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY:
343         return true;
344     }
345     return false;
346   }
347 };
348 
349 template <>
350 struct EnumTraits<VkExternalFenceHandleTypeFlagBits> {
exist__anon678960f40111::EnumTraits351   static bool exist(uint32_t e) {
352     switch (e) {
353       case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT:
354       case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
355       case VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
356       case VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT:
357         return true;
358     }
359     return false;
360   }
361 };
362 
363 template <>
364 struct EnumTraits<VkExternalSemaphoreHandleTypeFlagBits> {
exist__anon678960f40111::EnumTraits365   static bool exist(uint32_t e) {
366     switch (e) {
367       case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT:
368       case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT:
369       case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT:
370       case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT:
371       case VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT:
372         return true;
373     }
374     return false;
375   }
376 };
377 
378 template <>
379 struct EnumTraits<VkDriverIdKHR> {
exist__anon678960f40111::EnumTraits380   static bool exist(uint32_t e) {
381     switch (e) {
382       case VK_DRIVER_ID_AMD_PROPRIETARY:
383       case VK_DRIVER_ID_AMD_OPEN_SOURCE:
384       case VK_DRIVER_ID_MESA_RADV:
385       case VK_DRIVER_ID_NVIDIA_PROPRIETARY:
386       case VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS:
387       case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA:
388       case VK_DRIVER_ID_IMAGINATION_PROPRIETARY:
389       case VK_DRIVER_ID_QUALCOMM_PROPRIETARY:
390       case VK_DRIVER_ID_ARM_PROPRIETARY:
391       case VK_DRIVER_ID_GOOGLE_SWIFTSHADER:
392       case VK_DRIVER_ID_GGP_PROPRIETARY:
393       case VK_DRIVER_ID_BROADCOM_PROPRIETARY:
394       case VK_DRIVER_ID_MESA_LLVMPIPE:
395       case VK_DRIVER_ID_MOLTENVK:
396         return true;
397     }
398     return false;
399   }
400 };
401 
402 template <>
403 struct EnumTraits<VkShaderFloatControlsIndependence> {
exist__anon678960f40111::EnumTraits404   static bool exist(uint32_t e) {
405     switch (e) {
406       case VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY:
407       case VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL:
408       case VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE:
409         return true;
410     }
411     return false;
412   }
413 };
414 
415 template <>
416 struct EnumTraits<VkPipelineRobustnessBufferBehavior> {
exist__anon678960f40111::EnumTraits417   static bool exist(uint32_t e) {
418     switch (e) {
419       case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT:
420       case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED:
421       case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS:
422       case VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2:
423         return true;
424     }
425     return false;
426   }
427 };
428 
429 template <>
430 struct EnumTraits<VkPipelineRobustnessImageBehavior> {
exist__anon678960f40111::EnumTraits431   static bool exist(uint32_t e) {
432     switch (e) {
433       case VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT:
434       case VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED:
435       case VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS:
436       case VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2:
437         return true;
438     }
439     return false;
440   }
441 };
442 
443 template <>
444 struct EnumTraits<VkImageLayout> {
exist__anon678960f40111::EnumTraits445   static bool exist(uint32_t e) {
446     switch (e) {
447       case VK_IMAGE_LAYOUT_UNDEFINED:
448       case VK_IMAGE_LAYOUT_GENERAL:
449       case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
450       case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
451       case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
452       case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
453       case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
454       case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
455       case VK_IMAGE_LAYOUT_PREINITIALIZED:
456       case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL:
457       case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL:
458       case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL:
459       case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL:
460       case VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL:
461       case VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL:
462       case VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL:
463       case VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL:
464       case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
465       case VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR:
466       case VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR:
467       case VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR:
468       case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR:
469       case VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT:
470       case VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR:
471 #ifdef VK_ENABLE_BETA_EXTENSIONS
472       case VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR:
473 #endif
474 #ifdef VK_ENABLE_BETA_EXTENSIONS
475       case VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR:
476 #endif
477 #ifdef VK_ENABLE_BETA_EXTENSIONS
478       case VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR:
479 #endif
480       case VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT:
481         return true;
482     }
483     return false;
484   }
485 };
486 
487 // VkSparseImageFormatProperties
488 
489 template <typename Visitor>
Iterate(Visitor * visitor,VkExtent3D * extents)490 inline bool Iterate(Visitor* visitor, VkExtent3D* extents) {
491   return visitor->Visit("width", &extents->width) &&
492          visitor->Visit("height", &extents->height) &&
493          visitor->Visit("depth", &extents->depth);
494 }
495 
496 template <typename Visitor>
Iterate(Visitor * visitor,VkConformanceVersionKHR * version)497 inline bool Iterate(Visitor* visitor, VkConformanceVersionKHR* version) {
498   return visitor->Visit("major", &version->major) &&
499          visitor->Visit("minor", &version->minor) &&
500          visitor->Visit("subminor", &version->subminor) &&
501          visitor->Visit("patch", &version->patch);
502 }
503 
504 template <typename Visitor>
Iterate(Visitor * visitor,VkMemoryType * type)505 inline bool Iterate(Visitor* visitor, VkMemoryType* type) {
506   return visitor->Visit("propertyFlags", &type->propertyFlags) &&
507          visitor->Visit("heapIndex", &type->heapIndex);
508 }
509 
510 template <typename Visitor>
Iterate(Visitor * visitor,VkMemoryHeap * heap)511 inline bool Iterate(Visitor* visitor, VkMemoryHeap* heap) {
512   return visitor->Visit("size", &heap->size) &&
513          visitor->Visit("flags", &heap->flags);
514 }
515 
516 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonCore11 * core)517 inline bool Iterate(Visitor* visitor, VkJsonCore11* core) {
518   return visitor->Visit("properties", &core->properties) &&
519          visitor->Visit("features", &core->features);
520 }
521 
522 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonCore12 * core)523 inline bool Iterate(Visitor* visitor, VkJsonCore12* core) {
524   return visitor->Visit("properties", &core->properties) &&
525          visitor->Visit("features", &core->features);
526 }
527 
528 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonCore13 * core)529 inline bool Iterate(Visitor* visitor, VkJsonCore13* core) {
530   return visitor->Visit("properties", &core->properties) &&
531          visitor->Visit("features", &core->features);
532 }
533 
534 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonCore14 * core)535 inline bool Iterate(Visitor* visitor, VkJsonCore14* core) {
536   return visitor->Visit("properties", &core->properties) &&
537          visitor->Visit("features", &core->features);
538 }
539 
540 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonKHRVariablePointers * structs)541 inline bool Iterate(Visitor* visitor, VkJsonKHRVariablePointers* structs) {
542   return visitor->Visit("variablePointerFeaturesKHR",
543                         &structs->variable_pointer_features_khr) &&
544          visitor->Visit("variablePointersFeaturesKHR",
545                         &structs->variable_pointers_features_khr);
546 }
547 
548 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonKHRShaderFloat16Int8 * structs)549 inline bool Iterate(Visitor* visitor, VkJsonKHRShaderFloat16Int8* structs) {
550   return visitor->Visit("shaderFloat16Int8FeaturesKHR",
551                         &structs->shader_float16_int8_features_khr) &&
552          visitor->Visit("float16Int8FeaturesKHR",
553                         &structs->float16_int8_features_khr);
554 }
555 
556 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonExtImage2dViewOf3d * structs)557 inline bool Iterate(Visitor* visitor, VkJsonExtImage2dViewOf3d* structs) {
558   return visitor->Visit("image2DViewOf3DFeaturesEXT",
559                         &structs->image_2d_view_of_3d_features_ext);
560 }
561 
562 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonExtCustomBorderColor * structs)563 inline bool Iterate(Visitor* visitor, VkJsonExtCustomBorderColor* structs) {
564   return visitor->Visit("customBorderColorFeaturesEXT",
565                         &structs->custom_border_color_features_ext);
566 }
567 
568 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonExtPrimitiveTopologyListRestart * structs)569 inline bool Iterate(Visitor* visitor,
570                     VkJsonExtPrimitiveTopologyListRestart* structs) {
571   return visitor->Visit("primitiveTopologyListRestartFeaturesEXT",
572                         &structs->primitive_topology_list_restart_features_ext);
573 }
574 
575 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonExtProvokingVertex * structs)576 inline bool Iterate(Visitor* visitor, VkJsonExtProvokingVertex* structs) {
577   return visitor->Visit("provokingVertexFeaturesEXT",
578                         &structs->provoking_vertex_features_ext);
579 }
580 
581 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonKHRIndexTypeUint8 * structs)582 inline bool Iterate(Visitor* visitor, VkJsonKHRIndexTypeUint8* structs) {
583   return visitor->Visit("indexTypeUint8FeaturesKHR",
584                         &structs->index_type_uint8_features_khr);
585 }
586 
587 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonExtIndexTypeUint8 * structs)588 inline bool Iterate(Visitor* visitor, VkJsonExtIndexTypeUint8* structs) {
589   return visitor->Visit("indexTypeUint8FeaturesEXT",
590                         &structs->index_type_uint8_features_ext);
591 }
592 
593 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonKHRVertexAttributeDivisor * structs)594 inline bool Iterate(Visitor* visitor,
595                     VkJsonKHRVertexAttributeDivisor* structs) {
596   return visitor->Visit("vertexAttributeDivisorFeaturesKHR",
597                         &structs->vertex_attribute_divisor_features_khr);
598 }
599 
600 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonExtVertexAttributeDivisor * structs)601 inline bool Iterate(Visitor* visitor,
602                     VkJsonExtVertexAttributeDivisor* structs) {
603   return visitor->Visit("vertexAttributeDivisorFeaturesEXT",
604                         &structs->vertex_attribute_divisor_features_ext);
605 }
606 
607 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonExtTransformFeedback * structs)608 inline bool Iterate(Visitor* visitor, VkJsonExtTransformFeedback* structs) {
609   return visitor->Visit("transformFeedbackFeaturesEXT",
610                         &structs->transform_feedback_features_ext);
611 }
612 
613 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonKHRShaderSubgroupUniformControlFlow * structs)614 inline bool Iterate(Visitor* visitor,
615                     VkJsonKHRShaderSubgroupUniformControlFlow* structs) {
616   return visitor->Visit(
617       "shaderSubgroupUniformControlFlowFeaturesKHR",
618       &structs->shader_subgroup_uniform_control_flow_features_khr);
619 }
620 
621 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonKHRShaderSubgroupExtendedTypes * structs)622 inline bool Iterate(Visitor* visitor,
623                     VkJsonKHRShaderSubgroupExtendedTypes* structs) {
624   return visitor->Visit("shaderSubgroupExtendedTypesFeaturesKHR",
625                         &structs->shader_subgroup_extended_types_features_khr);
626 }
627 
628 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonKHR8bitStorage * structs)629 inline bool Iterate(Visitor* visitor, VkJsonKHR8bitStorage* structs) {
630   return visitor->Visit("bit8StorageFeaturesKHR",
631                         &structs->bit8_storage_features_khr);
632 }
633 
634 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonKHRShaderIntegerDotProduct * structs)635 inline bool Iterate(Visitor* visitor,
636                     VkJsonKHRShaderIntegerDotProduct* structs) {
637   return visitor->Visit("shaderIntegerDotProductFeaturesKHR",
638                         &structs->shader_integer_dot_product_features_khr);
639 }
640 
641 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonIMGRelaxedLineRasterization * structs)642 inline bool Iterate(Visitor* visitor,
643                     VkJsonIMGRelaxedLineRasterization* structs) {
644   return visitor->Visit("relaxedLineRasterizationFeaturesIMG",
645                         &structs->relaxed_line_rasterization_features_img);
646 }
647 
648 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonKHRLineRasterization * structs)649 inline bool Iterate(Visitor* visitor, VkJsonKHRLineRasterization* structs) {
650   return visitor->Visit("lineRasterizationFeaturesKHR",
651                         &structs->line_rasterization_features_khr);
652 }
653 
654 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonExtLineRasterization * structs)655 inline bool Iterate(Visitor* visitor, VkJsonExtLineRasterization* structs) {
656   return visitor->Visit("lineRasterizationFeaturesEXT",
657                         &structs->line_rasterization_features_ext);
658 }
659 
660 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonExtPrimitivesGeneratedQuery * structs)661 inline bool Iterate(Visitor* visitor,
662                     VkJsonExtPrimitivesGeneratedQuery* structs) {
663   return visitor->Visit("primitivesGeneratedQueryFeaturesEXT",
664                         &structs->primitives_generated_query_features_ext);
665 }
666 
667 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonKHRShaderFloatControls * structs)668 inline bool Iterate(Visitor* visitor, VkJsonKHRShaderFloatControls* structs) {
669   return visitor->Visit("floatControlsPropertiesKHR",
670                         &structs->float_controls_properties_khr);
671 }
672 
673 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonKHRDriverProperties * structs)674 inline bool Iterate(Visitor* visitor, VkJsonKHRDriverProperties* structs) {
675   return visitor->Visit("driverPropertiesKHR", &structs->driver_properties_khr);
676 }
677 
678 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceFloatControlsProperties * properties)679 inline bool Iterate(Visitor* visitor,
680                     VkPhysicalDeviceFloatControlsProperties* properties) {
681   return
682 
683       visitor->Visit("denormBehaviorIndependence",
684                      &properties->denormBehaviorIndependence) &&
685       visitor->Visit("roundingModeIndependence",
686                      &properties->roundingModeIndependence) &&
687       visitor->Visit("shaderSignedZeroInfNanPreserveFloat16",
688                      &properties->shaderSignedZeroInfNanPreserveFloat16) &&
689       visitor->Visit("shaderSignedZeroInfNanPreserveFloat32",
690                      &properties->shaderSignedZeroInfNanPreserveFloat32) &&
691       visitor->Visit("shaderSignedZeroInfNanPreserveFloat64",
692                      &properties->shaderSignedZeroInfNanPreserveFloat64) &&
693       visitor->Visit("shaderDenormPreserveFloat16",
694                      &properties->shaderDenormPreserveFloat16) &&
695       visitor->Visit("shaderDenormPreserveFloat32",
696                      &properties->shaderDenormPreserveFloat32) &&
697       visitor->Visit("shaderDenormPreserveFloat64",
698                      &properties->shaderDenormPreserveFloat64) &&
699       visitor->Visit("shaderDenormFlushToZeroFloat16",
700                      &properties->shaderDenormFlushToZeroFloat16) &&
701       visitor->Visit("shaderDenormFlushToZeroFloat32",
702                      &properties->shaderDenormFlushToZeroFloat32) &&
703       visitor->Visit("shaderDenormFlushToZeroFloat64",
704                      &properties->shaderDenormFlushToZeroFloat64) &&
705       visitor->Visit("shaderRoundingModeRTEFloat16",
706                      &properties->shaderRoundingModeRTEFloat16) &&
707       visitor->Visit("shaderRoundingModeRTEFloat32",
708                      &properties->shaderRoundingModeRTEFloat32) &&
709       visitor->Visit("shaderRoundingModeRTEFloat64",
710                      &properties->shaderRoundingModeRTEFloat64) &&
711       visitor->Visit("shaderRoundingModeRTZFloat16",
712                      &properties->shaderRoundingModeRTZFloat16) &&
713       visitor->Visit("shaderRoundingModeRTZFloat32",
714                      &properties->shaderRoundingModeRTZFloat32) &&
715       visitor->Visit("shaderRoundingModeRTZFloat64",
716                      &properties->shaderRoundingModeRTZFloat64);
717 }
718 
719 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceProperties * properties)720 inline bool Iterate(Visitor* visitor, VkPhysicalDeviceProperties* properties) {
721   return
722 
723       visitor->Visit("apiVersion", &properties->apiVersion) &&
724       visitor->Visit("driverVersion", &properties->driverVersion) &&
725       visitor->Visit("vendorID", &properties->vendorID) &&
726       visitor->Visit("deviceID", &properties->deviceID) &&
727       visitor->Visit("deviceType", &properties->deviceType) &&
728       visitor->Visit("deviceName", &properties->deviceName) &&
729       visitor->Visit("pipelineCacheUUID", &properties->pipelineCacheUUID) &&
730       visitor->Visit("limits", &properties->limits) &&
731       visitor->Visit("sparseProperties", &properties->sparseProperties);
732 }
733 
734 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceMemoryProperties * properties)735 inline bool Iterate(Visitor* visitor,
736                     VkPhysicalDeviceMemoryProperties* properties) {
737   return
738 
739       visitor->Visit("memoryTypeCount", &properties->memoryTypeCount) &&
740       visitor->VisitArray("memoryTypes", properties->memoryTypeCount,
741                           &properties->memoryTypes) &&
742       visitor->Visit("memoryHeapCount", &properties->memoryHeapCount) &&
743       visitor->VisitArray("memoryHeaps", properties->memoryHeapCount,
744                           &properties->memoryHeaps);
745 }
746 
747 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceSubgroupProperties * properties)748 inline bool Iterate(Visitor* visitor,
749                     VkPhysicalDeviceSubgroupProperties* properties) {
750   return
751 
752       visitor->Visit("subgroupSize", &properties->subgroupSize) &&
753       visitor->Visit("supportedStages", &properties->supportedStages) &&
754       visitor->Visit("supportedOperations", &properties->supportedOperations) &&
755       visitor->Visit("quadOperationsInAllStages",
756                      &properties->quadOperationsInAllStages);
757 }
758 
759 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDevicePointClippingProperties * properties)760 inline bool Iterate(Visitor* visitor,
761                     VkPhysicalDevicePointClippingProperties* properties) {
762   return
763 
764       visitor->Visit("pointClippingBehavior",
765                      &properties->pointClippingBehavior);
766 }
767 
768 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceMultiviewProperties * properties)769 inline bool Iterate(Visitor* visitor,
770                     VkPhysicalDeviceMultiviewProperties* properties) {
771   return
772 
773       visitor->Visit("maxMultiviewViewCount",
774                      &properties->maxMultiviewViewCount) &&
775       visitor->Visit("maxMultiviewInstanceIndex",
776                      &properties->maxMultiviewInstanceIndex);
777 }
778 
779 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceIDProperties * properties)780 inline bool Iterate(Visitor* visitor,
781                     VkPhysicalDeviceIDProperties* properties) {
782   return
783 
784       visitor->Visit("deviceUUID", &properties->deviceUUID) &&
785       visitor->Visit("driverUUID", &properties->driverUUID) &&
786       visitor->Visit("deviceLUID", &properties->deviceLUID) &&
787       visitor->Visit("deviceNodeMask", &properties->deviceNodeMask) &&
788       visitor->Visit("deviceLUIDValid", &properties->deviceLUIDValid);
789 }
790 
791 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceMaintenance3Properties * properties)792 inline bool Iterate(Visitor* visitor,
793                     VkPhysicalDeviceMaintenance3Properties* properties) {
794   return
795 
796       visitor->Visit("maxPerSetDescriptors",
797                      &properties->maxPerSetDescriptors) &&
798       visitor->Visit("maxMemoryAllocationSize",
799                      &properties->maxMemoryAllocationSize);
800 }
801 
802 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceSparseProperties * properties)803 inline bool Iterate(Visitor* visitor,
804                     VkPhysicalDeviceSparseProperties* properties) {
805   return
806 
807       visitor->Visit("residencyStandard2DBlockShape",
808                      &properties->residencyStandard2DBlockShape) &&
809       visitor->Visit("residencyStandard2DMultisampleBlockShape",
810                      &properties->residencyStandard2DMultisampleBlockShape) &&
811       visitor->Visit("residencyStandard3DBlockShape",
812                      &properties->residencyStandard3DBlockShape) &&
813       visitor->Visit("residencyAlignedMipSize",
814                      &properties->residencyAlignedMipSize) &&
815       visitor->Visit("residencyNonResidentStrict",
816                      &properties->residencyNonResidentStrict);
817 }
818 
819 template <typename Visitor>
Iterate(Visitor * visitor,VkImageFormatProperties * properties)820 inline bool Iterate(Visitor* visitor, VkImageFormatProperties* properties) {
821   return
822 
823       visitor->Visit("maxExtent", &properties->maxExtent) &&
824       visitor->Visit("maxMipLevels", &properties->maxMipLevels) &&
825       visitor->Visit("maxArrayLayers", &properties->maxArrayLayers) &&
826       visitor->Visit("sampleCounts", &properties->sampleCounts) &&
827       visitor->Visit("maxResourceSize", &properties->maxResourceSize);
828 }
829 
830 template <typename Visitor>
Iterate(Visitor * visitor,VkQueueFamilyProperties * properties)831 inline bool Iterate(Visitor* visitor, VkQueueFamilyProperties* properties) {
832   return
833 
834       visitor->Visit("queueFlags", &properties->queueFlags) &&
835       visitor->Visit("queueCount", &properties->queueCount) &&
836       visitor->Visit("timestampValidBits", &properties->timestampValidBits) &&
837       visitor->Visit("minImageTransferGranularity",
838                      &properties->minImageTransferGranularity);
839 }
840 
841 template <typename Visitor>
Iterate(Visitor * visitor,VkExtensionProperties * properties)842 inline bool Iterate(Visitor* visitor, VkExtensionProperties* properties) {
843   return
844 
845       visitor->Visit("extensionName", &properties->extensionName) &&
846       visitor->Visit("specVersion", &properties->specVersion);
847 }
848 
849 template <typename Visitor>
Iterate(Visitor * visitor,VkLayerProperties * properties)850 inline bool Iterate(Visitor* visitor, VkLayerProperties* properties) {
851   return
852 
853       visitor->Visit("layerName", &properties->layerName) &&
854       visitor->Visit("specVersion", &properties->specVersion) &&
855       visitor->Visit("implementationVersion",
856                      &properties->implementationVersion) &&
857       visitor->Visit("description", &properties->description);
858 }
859 
860 template <typename Visitor>
Iterate(Visitor * visitor,VkFormatProperties * properties)861 inline bool Iterate(Visitor* visitor, VkFormatProperties* properties) {
862   return
863 
864       visitor->Visit("linearTilingFeatures",
865                      &properties->linearTilingFeatures) &&
866       visitor->Visit("optimalTilingFeatures",
867                      &properties->optimalTilingFeatures) &&
868       visitor->Visit("bufferFeatures", &properties->bufferFeatures);
869 }
870 
871 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceVariablePointersFeatures * features)872 inline bool Iterate(Visitor* visitor,
873                     VkPhysicalDeviceVariablePointersFeatures* features) {
874   return
875 
876       visitor->Visit("variablePointersStorageBuffer",
877                      &features->variablePointersStorageBuffer) &&
878       visitor->Visit("variablePointers", &features->variablePointers);
879 }
880 
881 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceShaderFloat16Int8Features * features)882 inline bool Iterate(Visitor* visitor,
883                     VkPhysicalDeviceShaderFloat16Int8Features* features) {
884   return
885 
886       visitor->Visit("shaderFloat16", &features->shaderFloat16) &&
887       visitor->Visit("shaderInt8", &features->shaderInt8);
888 }
889 
890 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceImage2DViewOf3DFeaturesEXT * features)891 inline bool Iterate(Visitor* visitor,
892                     VkPhysicalDeviceImage2DViewOf3DFeaturesEXT* features) {
893   return
894 
895       visitor->Visit("image2DViewOf3D", &features->image2DViewOf3D) &&
896       visitor->Visit("sampler2DViewOf3D", &features->sampler2DViewOf3D);
897 }
898 
899 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceCustomBorderColorFeaturesEXT * features)900 inline bool Iterate(Visitor* visitor,
901                     VkPhysicalDeviceCustomBorderColorFeaturesEXT* features) {
902   return
903 
904       visitor->Visit("customBorderColors", &features->customBorderColors) &&
905       visitor->Visit("customBorderColorWithoutFormat",
906                      &features->customBorderColorWithoutFormat);
907 }
908 
909 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT * features)910 inline bool Iterate(
911     Visitor* visitor,
912     VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* features) {
913   return
914 
915       visitor->Visit("primitiveTopologyListRestart",
916                      &features->primitiveTopologyListRestart) &&
917       visitor->Visit("primitiveTopologyPatchListRestart",
918                      &features->primitiveTopologyPatchListRestart);
919 }
920 
921 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceProvokingVertexFeaturesEXT * features)922 inline bool Iterate(Visitor* visitor,
923                     VkPhysicalDeviceProvokingVertexFeaturesEXT* features) {
924   return
925 
926       visitor->Visit("provokingVertexLast", &features->provokingVertexLast) &&
927       visitor->Visit("transformFeedbackPreservesProvokingVertex",
928                      &features->transformFeedbackPreservesProvokingVertex);
929 }
930 
931 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceIndexTypeUint8Features * features)932 inline bool Iterate(Visitor* visitor,
933                     VkPhysicalDeviceIndexTypeUint8Features* features) {
934   return
935 
936       visitor->Visit("indexTypeUint8", &features->indexTypeUint8);
937 }
938 
939 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceVertexAttributeDivisorFeatures * features)940 inline bool Iterate(Visitor* visitor,
941                     VkPhysicalDeviceVertexAttributeDivisorFeatures* features) {
942   return
943 
944       visitor->Visit("vertexAttributeInstanceRateDivisor",
945                      &features->vertexAttributeInstanceRateDivisor) &&
946       visitor->Visit("vertexAttributeInstanceRateZeroDivisor",
947                      &features->vertexAttributeInstanceRateZeroDivisor);
948 }
949 
950 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceTransformFeedbackFeaturesEXT * features)951 inline bool Iterate(Visitor* visitor,
952                     VkPhysicalDeviceTransformFeedbackFeaturesEXT* features) {
953   return
954 
955       visitor->Visit("transformFeedback", &features->transformFeedback) &&
956       visitor->Visit("geometryStreams", &features->geometryStreams);
957 }
958 
959 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR * features)960 inline bool Iterate(
961     Visitor* visitor,
962     VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* features) {
963   return
964 
965       visitor->Visit("shaderSubgroupUniformControlFlow",
966                      &features->shaderSubgroupUniformControlFlow);
967 }
968 
969 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures * features)970 inline bool Iterate(
971     Visitor* visitor,
972     VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* features) {
973   return
974 
975       visitor->Visit("shaderSubgroupExtendedTypes",
976                      &features->shaderSubgroupExtendedTypes);
977 }
978 
979 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDevice8BitStorageFeatures * features)980 inline bool Iterate(Visitor* visitor,
981                     VkPhysicalDevice8BitStorageFeatures* features) {
982   return
983 
984       visitor->Visit("storageBuffer8BitAccess",
985                      &features->storageBuffer8BitAccess) &&
986       visitor->Visit("uniformAndStorageBuffer8BitAccess",
987                      &features->uniformAndStorageBuffer8BitAccess) &&
988       visitor->Visit("storagePushConstant8", &features->storagePushConstant8);
989 }
990 
991 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceShaderIntegerDotProductFeatures * features)992 inline bool Iterate(Visitor* visitor,
993                     VkPhysicalDeviceShaderIntegerDotProductFeatures* features) {
994   return
995 
996       visitor->Visit("shaderIntegerDotProduct",
997                      &features->shaderIntegerDotProduct);
998 }
999 
1000 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG * features)1001 inline bool Iterate(
1002     Visitor* visitor,
1003     VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG* features) {
1004   return
1005 
1006       visitor->Visit("relaxedLineRasterization",
1007                      &features->relaxedLineRasterization);
1008 }
1009 
1010 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceLineRasterizationFeatures * features)1011 inline bool Iterate(Visitor* visitor,
1012                     VkPhysicalDeviceLineRasterizationFeatures* features) {
1013   return
1014 
1015       visitor->Visit("rectangularLines", &features->rectangularLines) &&
1016       visitor->Visit("bresenhamLines", &features->bresenhamLines) &&
1017       visitor->Visit("smoothLines", &features->smoothLines) &&
1018       visitor->Visit("stippledRectangularLines",
1019                      &features->stippledRectangularLines) &&
1020       visitor->Visit("stippledBresenhamLines",
1021                      &features->stippledBresenhamLines) &&
1022       visitor->Visit("stippledSmoothLines", &features->stippledSmoothLines);
1023 }
1024 
1025 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT * features)1026 inline bool Iterate(
1027     Visitor* visitor,
1028     VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT* features) {
1029   return
1030 
1031       visitor->Visit("primitivesGeneratedQuery",
1032                      &features->primitivesGeneratedQuery) &&
1033       visitor->Visit(
1034           "primitivesGeneratedQueryWithRasterizerDiscard",
1035           &features->primitivesGeneratedQueryWithRasterizerDiscard) &&
1036       visitor->Visit("primitivesGeneratedQueryWithNonZeroStreams",
1037                      &features->primitivesGeneratedQueryWithNonZeroStreams);
1038 }
1039 
1040 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDevice16BitStorageFeatures * features)1041 inline bool Iterate(Visitor* visitor,
1042                     VkPhysicalDevice16BitStorageFeatures* features) {
1043   return
1044 
1045       visitor->Visit("storageBuffer16BitAccess",
1046                      &features->storageBuffer16BitAccess) &&
1047       visitor->Visit("uniformAndStorageBuffer16BitAccess",
1048                      &features->uniformAndStorageBuffer16BitAccess) &&
1049       visitor->Visit("storagePushConstant16",
1050                      &features->storagePushConstant16) &&
1051       visitor->Visit("storageInputOutput16", &features->storageInputOutput16);
1052 }
1053 
1054 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceMultiviewFeatures * features)1055 inline bool Iterate(Visitor* visitor,
1056                     VkPhysicalDeviceMultiviewFeatures* features) {
1057   return
1058 
1059       visitor->Visit("multiview", &features->multiview) &&
1060       visitor->Visit("multiviewGeometryShader",
1061                      &features->multiviewGeometryShader) &&
1062       visitor->Visit("multiviewTessellationShader",
1063                      &features->multiviewTessellationShader);
1064 }
1065 
1066 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceProtectedMemoryFeatures * features)1067 inline bool Iterate(Visitor* visitor,
1068                     VkPhysicalDeviceProtectedMemoryFeatures* features) {
1069   return
1070 
1071       visitor->Visit("protectedMemory", &features->protectedMemory);
1072 }
1073 
1074 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceSamplerYcbcrConversionFeatures * features)1075 inline bool Iterate(Visitor* visitor,
1076                     VkPhysicalDeviceSamplerYcbcrConversionFeatures* features) {
1077   return
1078 
1079       visitor->Visit("samplerYcbcrConversion",
1080                      &features->samplerYcbcrConversion);
1081 }
1082 
1083 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceShaderDrawParameterFeatures * features)1084 inline bool Iterate(Visitor* visitor,
1085                     VkPhysicalDeviceShaderDrawParameterFeatures* features) {
1086   return
1087 
1088       visitor->Visit("shaderDrawParameters", &features->shaderDrawParameters);
1089 }
1090 
1091 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceLimits * limits)1092 inline bool Iterate(Visitor* visitor, VkPhysicalDeviceLimits* limits) {
1093   return
1094 
1095       visitor->Visit("maxImageDimension1D", &limits->maxImageDimension1D) &&
1096       visitor->Visit("maxImageDimension2D", &limits->maxImageDimension2D) &&
1097       visitor->Visit("maxImageDimension3D", &limits->maxImageDimension3D) &&
1098       visitor->Visit("maxImageDimensionCube", &limits->maxImageDimensionCube) &&
1099       visitor->Visit("maxImageArrayLayers", &limits->maxImageArrayLayers) &&
1100       visitor->Visit("maxTexelBufferElements",
1101                      &limits->maxTexelBufferElements) &&
1102       visitor->Visit("maxUniformBufferRange", &limits->maxUniformBufferRange) &&
1103       visitor->Visit("maxStorageBufferRange", &limits->maxStorageBufferRange) &&
1104       visitor->Visit("maxPushConstantsSize", &limits->maxPushConstantsSize) &&
1105       visitor->Visit("maxMemoryAllocationCount",
1106                      &limits->maxMemoryAllocationCount) &&
1107       visitor->Visit("maxSamplerAllocationCount",
1108                      &limits->maxSamplerAllocationCount) &&
1109       visitor->Visit("bufferImageGranularity",
1110                      &limits->bufferImageGranularity) &&
1111       visitor->Visit("sparseAddressSpaceSize",
1112                      &limits->sparseAddressSpaceSize) &&
1113       visitor->Visit("maxBoundDescriptorSets",
1114                      &limits->maxBoundDescriptorSets) &&
1115       visitor->Visit("maxPerStageDescriptorSamplers",
1116                      &limits->maxPerStageDescriptorSamplers) &&
1117       visitor->Visit("maxPerStageDescriptorUniformBuffers",
1118                      &limits->maxPerStageDescriptorUniformBuffers) &&
1119       visitor->Visit("maxPerStageDescriptorStorageBuffers",
1120                      &limits->maxPerStageDescriptorStorageBuffers) &&
1121       visitor->Visit("maxPerStageDescriptorSampledImages",
1122                      &limits->maxPerStageDescriptorSampledImages) &&
1123       visitor->Visit("maxPerStageDescriptorStorageImages",
1124                      &limits->maxPerStageDescriptorStorageImages) &&
1125       visitor->Visit("maxPerStageDescriptorInputAttachments",
1126                      &limits->maxPerStageDescriptorInputAttachments) &&
1127       visitor->Visit("maxPerStageResources", &limits->maxPerStageResources) &&
1128       visitor->Visit("maxDescriptorSetSamplers",
1129                      &limits->maxDescriptorSetSamplers) &&
1130       visitor->Visit("maxDescriptorSetUniformBuffers",
1131                      &limits->maxDescriptorSetUniformBuffers) &&
1132       visitor->Visit("maxDescriptorSetUniformBuffersDynamic",
1133                      &limits->maxDescriptorSetUniformBuffersDynamic) &&
1134       visitor->Visit("maxDescriptorSetStorageBuffers",
1135                      &limits->maxDescriptorSetStorageBuffers) &&
1136       visitor->Visit("maxDescriptorSetStorageBuffersDynamic",
1137                      &limits->maxDescriptorSetStorageBuffersDynamic) &&
1138       visitor->Visit("maxDescriptorSetSampledImages",
1139                      &limits->maxDescriptorSetSampledImages) &&
1140       visitor->Visit("maxDescriptorSetStorageImages",
1141                      &limits->maxDescriptorSetStorageImages) &&
1142       visitor->Visit("maxDescriptorSetInputAttachments",
1143                      &limits->maxDescriptorSetInputAttachments) &&
1144       visitor->Visit("maxVertexInputAttributes",
1145                      &limits->maxVertexInputAttributes) &&
1146       visitor->Visit("maxVertexInputBindings",
1147                      &limits->maxVertexInputBindings) &&
1148       visitor->Visit("maxVertexInputAttributeOffset",
1149                      &limits->maxVertexInputAttributeOffset) &&
1150       visitor->Visit("maxVertexInputBindingStride",
1151                      &limits->maxVertexInputBindingStride) &&
1152       visitor->Visit("maxVertexOutputComponents",
1153                      &limits->maxVertexOutputComponents) &&
1154       visitor->Visit("maxTessellationGenerationLevel",
1155                      &limits->maxTessellationGenerationLevel) &&
1156       visitor->Visit("maxTessellationPatchSize",
1157                      &limits->maxTessellationPatchSize) &&
1158       visitor->Visit("maxTessellationControlPerVertexInputComponents",
1159                      &limits->maxTessellationControlPerVertexInputComponents) &&
1160       visitor->Visit(
1161           "maxTessellationControlPerVertexOutputComponents",
1162           &limits->maxTessellationControlPerVertexOutputComponents) &&
1163       visitor->Visit("maxTessellationControlPerPatchOutputComponents",
1164                      &limits->maxTessellationControlPerPatchOutputComponents) &&
1165       visitor->Visit("maxTessellationControlTotalOutputComponents",
1166                      &limits->maxTessellationControlTotalOutputComponents) &&
1167       visitor->Visit("maxTessellationEvaluationInputComponents",
1168                      &limits->maxTessellationEvaluationInputComponents) &&
1169       visitor->Visit("maxTessellationEvaluationOutputComponents",
1170                      &limits->maxTessellationEvaluationOutputComponents) &&
1171       visitor->Visit("maxGeometryShaderInvocations",
1172                      &limits->maxGeometryShaderInvocations) &&
1173       visitor->Visit("maxGeometryInputComponents",
1174                      &limits->maxGeometryInputComponents) &&
1175       visitor->Visit("maxGeometryOutputComponents",
1176                      &limits->maxGeometryOutputComponents) &&
1177       visitor->Visit("maxGeometryOutputVertices",
1178                      &limits->maxGeometryOutputVertices) &&
1179       visitor->Visit("maxGeometryTotalOutputComponents",
1180                      &limits->maxGeometryTotalOutputComponents) &&
1181       visitor->Visit("maxFragmentInputComponents",
1182                      &limits->maxFragmentInputComponents) &&
1183       visitor->Visit("maxFragmentOutputAttachments",
1184                      &limits->maxFragmentOutputAttachments) &&
1185       visitor->Visit("maxFragmentDualSrcAttachments",
1186                      &limits->maxFragmentDualSrcAttachments) &&
1187       visitor->Visit("maxFragmentCombinedOutputResources",
1188                      &limits->maxFragmentCombinedOutputResources) &&
1189       visitor->Visit("maxComputeSharedMemorySize",
1190                      &limits->maxComputeSharedMemorySize) &&
1191       visitor->Visit("maxComputeWorkGroupCount",
1192                      &limits->maxComputeWorkGroupCount) &&
1193       visitor->Visit("maxComputeWorkGroupInvocations",
1194                      &limits->maxComputeWorkGroupInvocations) &&
1195       visitor->Visit("maxComputeWorkGroupSize",
1196                      &limits->maxComputeWorkGroupSize) &&
1197       visitor->Visit("subPixelPrecisionBits", &limits->subPixelPrecisionBits) &&
1198       visitor->Visit("subTexelPrecisionBits", &limits->subTexelPrecisionBits) &&
1199       visitor->Visit("mipmapPrecisionBits", &limits->mipmapPrecisionBits) &&
1200       visitor->Visit("maxDrawIndexedIndexValue",
1201                      &limits->maxDrawIndexedIndexValue) &&
1202       visitor->Visit("maxDrawIndirectCount", &limits->maxDrawIndirectCount) &&
1203       visitor->Visit("maxSamplerLodBias", &limits->maxSamplerLodBias) &&
1204       visitor->Visit("maxSamplerAnisotropy", &limits->maxSamplerAnisotropy) &&
1205       visitor->Visit("maxViewports", &limits->maxViewports) &&
1206       visitor->Visit("maxViewportDimensions", &limits->maxViewportDimensions) &&
1207       visitor->Visit("viewportBoundsRange", &limits->viewportBoundsRange) &&
1208       visitor->Visit("viewportSubPixelBits", &limits->viewportSubPixelBits) &&
1209       visitor->Visit("minMemoryMapAlignment", &limits->minMemoryMapAlignment) &&
1210       visitor->Visit("minTexelBufferOffsetAlignment",
1211                      &limits->minTexelBufferOffsetAlignment) &&
1212       visitor->Visit("minUniformBufferOffsetAlignment",
1213                      &limits->minUniformBufferOffsetAlignment) &&
1214       visitor->Visit("minStorageBufferOffsetAlignment",
1215                      &limits->minStorageBufferOffsetAlignment) &&
1216       visitor->Visit("minTexelOffset", &limits->minTexelOffset) &&
1217       visitor->Visit("maxTexelOffset", &limits->maxTexelOffset) &&
1218       visitor->Visit("minTexelGatherOffset", &limits->minTexelGatherOffset) &&
1219       visitor->Visit("maxTexelGatherOffset", &limits->maxTexelGatherOffset) &&
1220       visitor->Visit("minInterpolationOffset",
1221                      &limits->minInterpolationOffset) &&
1222       visitor->Visit("maxInterpolationOffset",
1223                      &limits->maxInterpolationOffset) &&
1224       visitor->Visit("subPixelInterpolationOffsetBits",
1225                      &limits->subPixelInterpolationOffsetBits) &&
1226       visitor->Visit("maxFramebufferWidth", &limits->maxFramebufferWidth) &&
1227       visitor->Visit("maxFramebufferHeight", &limits->maxFramebufferHeight) &&
1228       visitor->Visit("maxFramebufferLayers", &limits->maxFramebufferLayers) &&
1229       visitor->Visit("framebufferColorSampleCounts",
1230                      &limits->framebufferColorSampleCounts) &&
1231       visitor->Visit("framebufferDepthSampleCounts",
1232                      &limits->framebufferDepthSampleCounts) &&
1233       visitor->Visit("framebufferStencilSampleCounts",
1234                      &limits->framebufferStencilSampleCounts) &&
1235       visitor->Visit("framebufferNoAttachmentsSampleCounts",
1236                      &limits->framebufferNoAttachmentsSampleCounts) &&
1237       visitor->Visit("maxColorAttachments", &limits->maxColorAttachments) &&
1238       visitor->Visit("sampledImageColorSampleCounts",
1239                      &limits->sampledImageColorSampleCounts) &&
1240       visitor->Visit("sampledImageIntegerSampleCounts",
1241                      &limits->sampledImageIntegerSampleCounts) &&
1242       visitor->Visit("sampledImageDepthSampleCounts",
1243                      &limits->sampledImageDepthSampleCounts) &&
1244       visitor->Visit("sampledImageStencilSampleCounts",
1245                      &limits->sampledImageStencilSampleCounts) &&
1246       visitor->Visit("storageImageSampleCounts",
1247                      &limits->storageImageSampleCounts) &&
1248       visitor->Visit("maxSampleMaskWords", &limits->maxSampleMaskWords) &&
1249       visitor->Visit("timestampComputeAndGraphics",
1250                      &limits->timestampComputeAndGraphics) &&
1251       visitor->Visit("timestampPeriod", &limits->timestampPeriod) &&
1252       visitor->Visit("maxClipDistances", &limits->maxClipDistances) &&
1253       visitor->Visit("maxCullDistances", &limits->maxCullDistances) &&
1254       visitor->Visit("maxCombinedClipAndCullDistances",
1255                      &limits->maxCombinedClipAndCullDistances) &&
1256       visitor->Visit("discreteQueuePriorities",
1257                      &limits->discreteQueuePriorities) &&
1258       visitor->Visit("pointSizeRange", &limits->pointSizeRange) &&
1259       visitor->Visit("lineWidthRange", &limits->lineWidthRange) &&
1260       visitor->Visit("pointSizeGranularity", &limits->pointSizeGranularity) &&
1261       visitor->Visit("lineWidthGranularity", &limits->lineWidthGranularity) &&
1262       visitor->Visit("strictLines", &limits->strictLines) &&
1263       visitor->Visit("standardSampleLocations",
1264                      &limits->standardSampleLocations) &&
1265       visitor->Visit("optimalBufferCopyOffsetAlignment",
1266                      &limits->optimalBufferCopyOffsetAlignment) &&
1267       visitor->Visit("optimalBufferCopyRowPitchAlignment",
1268                      &limits->optimalBufferCopyRowPitchAlignment) &&
1269       visitor->Visit("nonCoherentAtomSize", &limits->nonCoherentAtomSize);
1270 }
1271 
1272 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceFeatures * features)1273 inline bool Iterate(Visitor* visitor, VkPhysicalDeviceFeatures* features) {
1274   return
1275 
1276       visitor->Visit("robustBufferAccess", &features->robustBufferAccess) &&
1277       visitor->Visit("fullDrawIndexUint32", &features->fullDrawIndexUint32) &&
1278       visitor->Visit("imageCubeArray", &features->imageCubeArray) &&
1279       visitor->Visit("independentBlend", &features->independentBlend) &&
1280       visitor->Visit("geometryShader", &features->geometryShader) &&
1281       visitor->Visit("tessellationShader", &features->tessellationShader) &&
1282       visitor->Visit("sampleRateShading", &features->sampleRateShading) &&
1283       visitor->Visit("dualSrcBlend", &features->dualSrcBlend) &&
1284       visitor->Visit("logicOp", &features->logicOp) &&
1285       visitor->Visit("multiDrawIndirect", &features->multiDrawIndirect) &&
1286       visitor->Visit("drawIndirectFirstInstance",
1287                      &features->drawIndirectFirstInstance) &&
1288       visitor->Visit("depthClamp", &features->depthClamp) &&
1289       visitor->Visit("depthBiasClamp", &features->depthBiasClamp) &&
1290       visitor->Visit("fillModeNonSolid", &features->fillModeNonSolid) &&
1291       visitor->Visit("depthBounds", &features->depthBounds) &&
1292       visitor->Visit("wideLines", &features->wideLines) &&
1293       visitor->Visit("largePoints", &features->largePoints) &&
1294       visitor->Visit("alphaToOne", &features->alphaToOne) &&
1295       visitor->Visit("multiViewport", &features->multiViewport) &&
1296       visitor->Visit("samplerAnisotropy", &features->samplerAnisotropy) &&
1297       visitor->Visit("textureCompressionETC2",
1298                      &features->textureCompressionETC2) &&
1299       visitor->Visit("textureCompressionASTC_LDR",
1300                      &features->textureCompressionASTC_LDR) &&
1301       visitor->Visit("textureCompressionBC", &features->textureCompressionBC) &&
1302       visitor->Visit("occlusionQueryPrecise",
1303                      &features->occlusionQueryPrecise) &&
1304       visitor->Visit("pipelineStatisticsQuery",
1305                      &features->pipelineStatisticsQuery) &&
1306       visitor->Visit("vertexPipelineStoresAndAtomics",
1307                      &features->vertexPipelineStoresAndAtomics) &&
1308       visitor->Visit("fragmentStoresAndAtomics",
1309                      &features->fragmentStoresAndAtomics) &&
1310       visitor->Visit("shaderTessellationAndGeometryPointSize",
1311                      &features->shaderTessellationAndGeometryPointSize) &&
1312       visitor->Visit("shaderImageGatherExtended",
1313                      &features->shaderImageGatherExtended) &&
1314       visitor->Visit("shaderStorageImageExtendedFormats",
1315                      &features->shaderStorageImageExtendedFormats) &&
1316       visitor->Visit("shaderStorageImageMultisample",
1317                      &features->shaderStorageImageMultisample) &&
1318       visitor->Visit("shaderStorageImageReadWithoutFormat",
1319                      &features->shaderStorageImageReadWithoutFormat) &&
1320       visitor->Visit("shaderStorageImageWriteWithoutFormat",
1321                      &features->shaderStorageImageWriteWithoutFormat) &&
1322       visitor->Visit("shaderUniformBufferArrayDynamicIndexing",
1323                      &features->shaderUniformBufferArrayDynamicIndexing) &&
1324       visitor->Visit("shaderSampledImageArrayDynamicIndexing",
1325                      &features->shaderSampledImageArrayDynamicIndexing) &&
1326       visitor->Visit("shaderStorageBufferArrayDynamicIndexing",
1327                      &features->shaderStorageBufferArrayDynamicIndexing) &&
1328       visitor->Visit("shaderStorageImageArrayDynamicIndexing",
1329                      &features->shaderStorageImageArrayDynamicIndexing) &&
1330       visitor->Visit("shaderClipDistance", &features->shaderClipDistance) &&
1331       visitor->Visit("shaderCullDistance", &features->shaderCullDistance) &&
1332       visitor->Visit("shaderFloat64", &features->shaderFloat64) &&
1333       visitor->Visit("shaderInt64", &features->shaderInt64) &&
1334       visitor->Visit("shaderInt16", &features->shaderInt16) &&
1335       visitor->Visit("shaderResourceResidency",
1336                      &features->shaderResourceResidency) &&
1337       visitor->Visit("shaderResourceMinLod", &features->shaderResourceMinLod) &&
1338       visitor->Visit("sparseBinding", &features->sparseBinding) &&
1339       visitor->Visit("sparseResidencyBuffer",
1340                      &features->sparseResidencyBuffer) &&
1341       visitor->Visit("sparseResidencyImage2D",
1342                      &features->sparseResidencyImage2D) &&
1343       visitor->Visit("sparseResidencyImage3D",
1344                      &features->sparseResidencyImage3D) &&
1345       visitor->Visit("sparseResidency2Samples",
1346                      &features->sparseResidency2Samples) &&
1347       visitor->Visit("sparseResidency4Samples",
1348                      &features->sparseResidency4Samples) &&
1349       visitor->Visit("sparseResidency8Samples",
1350                      &features->sparseResidency8Samples) &&
1351       visitor->Visit("sparseResidency16Samples",
1352                      &features->sparseResidency16Samples) &&
1353       visitor->Visit("sparseResidencyAliased",
1354                      &features->sparseResidencyAliased) &&
1355       visitor->Visit("variableMultisampleRate",
1356                      &features->variableMultisampleRate) &&
1357       visitor->Visit("inheritedQueries", &features->inheritedQueries);
1358 }
1359 
1360 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceVulkan11Properties * properties)1361 inline bool Iterate(Visitor* visitor,
1362                     VkPhysicalDeviceVulkan11Properties* properties) {
1363   return
1364 
1365       visitor->Visit("deviceUUID", &properties->deviceUUID) &&
1366       visitor->Visit("driverUUID", &properties->driverUUID) &&
1367       visitor->Visit("deviceLUID", &properties->deviceLUID) &&
1368       visitor->Visit("deviceNodeMask", &properties->deviceNodeMask) &&
1369       visitor->Visit("deviceLUIDValid", &properties->deviceLUIDValid) &&
1370       visitor->Visit("subgroupSize", &properties->subgroupSize) &&
1371       visitor->Visit("subgroupSupportedStages",
1372                      &properties->subgroupSupportedStages) &&
1373       visitor->Visit("subgroupSupportedOperations",
1374                      &properties->subgroupSupportedOperations) &&
1375       visitor->Visit("subgroupQuadOperationsInAllStages",
1376                      &properties->subgroupQuadOperationsInAllStages) &&
1377       visitor->Visit("pointClippingBehavior",
1378                      &properties->pointClippingBehavior) &&
1379       visitor->Visit("maxMultiviewViewCount",
1380                      &properties->maxMultiviewViewCount) &&
1381       visitor->Visit("maxMultiviewInstanceIndex",
1382                      &properties->maxMultiviewInstanceIndex) &&
1383       visitor->Visit("protectedNoFault", &properties->protectedNoFault) &&
1384       visitor->Visit("maxPerSetDescriptors",
1385                      &properties->maxPerSetDescriptors) &&
1386       visitor->Visit("maxMemoryAllocationSize",
1387                      &properties->maxMemoryAllocationSize);
1388 }
1389 
1390 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceVulkan11Features * features)1391 inline bool Iterate(Visitor* visitor,
1392                     VkPhysicalDeviceVulkan11Features* features) {
1393   return
1394 
1395       visitor->Visit("storageBuffer16BitAccess",
1396                      &features->storageBuffer16BitAccess) &&
1397       visitor->Visit("uniformAndStorageBuffer16BitAccess",
1398                      &features->uniformAndStorageBuffer16BitAccess) &&
1399       visitor->Visit("storagePushConstant16",
1400                      &features->storagePushConstant16) &&
1401       visitor->Visit("storageInputOutput16", &features->storageInputOutput16) &&
1402       visitor->Visit("multiview", &features->multiview) &&
1403       visitor->Visit("multiviewGeometryShader",
1404                      &features->multiviewGeometryShader) &&
1405       visitor->Visit("multiviewTessellationShader",
1406                      &features->multiviewTessellationShader) &&
1407       visitor->Visit("variablePointersStorageBuffer",
1408                      &features->variablePointersStorageBuffer) &&
1409       visitor->Visit("variablePointers", &features->variablePointers) &&
1410       visitor->Visit("protectedMemory", &features->protectedMemory) &&
1411       visitor->Visit("samplerYcbcrConversion",
1412                      &features->samplerYcbcrConversion) &&
1413       visitor->Visit("shaderDrawParameters", &features->shaderDrawParameters);
1414 }
1415 
1416 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceVulkan12Properties * properties)1417 inline bool Iterate(Visitor* visitor,
1418                     VkPhysicalDeviceVulkan12Properties* properties) {
1419   return
1420 
1421       visitor->Visit("driverID", &properties->driverID) &&
1422       visitor->Visit("driverName", &properties->driverName) &&
1423       visitor->Visit("driverInfo", &properties->driverInfo) &&
1424       visitor->Visit("conformanceVersion", &properties->conformanceVersion) &&
1425       visitor->Visit("denormBehaviorIndependence",
1426                      &properties->denormBehaviorIndependence) &&
1427       visitor->Visit("roundingModeIndependence",
1428                      &properties->roundingModeIndependence) &&
1429       visitor->Visit("shaderSignedZeroInfNanPreserveFloat16",
1430                      &properties->shaderSignedZeroInfNanPreserveFloat16) &&
1431       visitor->Visit("shaderSignedZeroInfNanPreserveFloat32",
1432                      &properties->shaderSignedZeroInfNanPreserveFloat32) &&
1433       visitor->Visit("shaderSignedZeroInfNanPreserveFloat64",
1434                      &properties->shaderSignedZeroInfNanPreserveFloat64) &&
1435       visitor->Visit("shaderDenormPreserveFloat16",
1436                      &properties->shaderDenormPreserveFloat16) &&
1437       visitor->Visit("shaderDenormPreserveFloat32",
1438                      &properties->shaderDenormPreserveFloat32) &&
1439       visitor->Visit("shaderDenormPreserveFloat64",
1440                      &properties->shaderDenormPreserveFloat64) &&
1441       visitor->Visit("shaderDenormFlushToZeroFloat16",
1442                      &properties->shaderDenormFlushToZeroFloat16) &&
1443       visitor->Visit("shaderDenormFlushToZeroFloat32",
1444                      &properties->shaderDenormFlushToZeroFloat32) &&
1445       visitor->Visit("shaderDenormFlushToZeroFloat64",
1446                      &properties->shaderDenormFlushToZeroFloat64) &&
1447       visitor->Visit("shaderRoundingModeRTEFloat16",
1448                      &properties->shaderRoundingModeRTEFloat16) &&
1449       visitor->Visit("shaderRoundingModeRTEFloat32",
1450                      &properties->shaderRoundingModeRTEFloat32) &&
1451       visitor->Visit("shaderRoundingModeRTEFloat64",
1452                      &properties->shaderRoundingModeRTEFloat64) &&
1453       visitor->Visit("shaderRoundingModeRTZFloat16",
1454                      &properties->shaderRoundingModeRTZFloat16) &&
1455       visitor->Visit("shaderRoundingModeRTZFloat32",
1456                      &properties->shaderRoundingModeRTZFloat32) &&
1457       visitor->Visit("shaderRoundingModeRTZFloat64",
1458                      &properties->shaderRoundingModeRTZFloat64) &&
1459       visitor->Visit("maxUpdateAfterBindDescriptorsInAllPools",
1460                      &properties->maxUpdateAfterBindDescriptorsInAllPools) &&
1461       visitor->Visit(
1462           "shaderUniformBufferArrayNonUniformIndexingNative",
1463           &properties->shaderUniformBufferArrayNonUniformIndexingNative) &&
1464       visitor->Visit(
1465           "shaderSampledImageArrayNonUniformIndexingNative",
1466           &properties->shaderSampledImageArrayNonUniformIndexingNative) &&
1467       visitor->Visit(
1468           "shaderStorageBufferArrayNonUniformIndexingNative",
1469           &properties->shaderStorageBufferArrayNonUniformIndexingNative) &&
1470       visitor->Visit(
1471           "shaderStorageImageArrayNonUniformIndexingNative",
1472           &properties->shaderStorageImageArrayNonUniformIndexingNative) &&
1473       visitor->Visit(
1474           "shaderInputAttachmentArrayNonUniformIndexingNative",
1475           &properties->shaderInputAttachmentArrayNonUniformIndexingNative) &&
1476       visitor->Visit("robustBufferAccessUpdateAfterBind",
1477                      &properties->robustBufferAccessUpdateAfterBind) &&
1478       visitor->Visit("quadDivergentImplicitLod",
1479                      &properties->quadDivergentImplicitLod) &&
1480       visitor->Visit(
1481           "maxPerStageDescriptorUpdateAfterBindSamplers",
1482           &properties->maxPerStageDescriptorUpdateAfterBindSamplers) &&
1483       visitor->Visit(
1484           "maxPerStageDescriptorUpdateAfterBindUniformBuffers",
1485           &properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers) &&
1486       visitor->Visit(
1487           "maxPerStageDescriptorUpdateAfterBindStorageBuffers",
1488           &properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers) &&
1489       visitor->Visit(
1490           "maxPerStageDescriptorUpdateAfterBindSampledImages",
1491           &properties->maxPerStageDescriptorUpdateAfterBindSampledImages) &&
1492       visitor->Visit(
1493           "maxPerStageDescriptorUpdateAfterBindStorageImages",
1494           &properties->maxPerStageDescriptorUpdateAfterBindStorageImages) &&
1495       visitor->Visit(
1496           "maxPerStageDescriptorUpdateAfterBindInputAttachments",
1497           &properties->maxPerStageDescriptorUpdateAfterBindInputAttachments) &&
1498       visitor->Visit("maxPerStageUpdateAfterBindResources",
1499                      &properties->maxPerStageUpdateAfterBindResources) &&
1500       visitor->Visit("maxDescriptorSetUpdateAfterBindSamplers",
1501                      &properties->maxDescriptorSetUpdateAfterBindSamplers) &&
1502       visitor->Visit(
1503           "maxDescriptorSetUpdateAfterBindUniformBuffers",
1504           &properties->maxDescriptorSetUpdateAfterBindUniformBuffers) &&
1505       visitor->Visit(
1506           "maxDescriptorSetUpdateAfterBindUniformBuffersDynamic",
1507           &properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic) &&
1508       visitor->Visit(
1509           "maxDescriptorSetUpdateAfterBindStorageBuffers",
1510           &properties->maxDescriptorSetUpdateAfterBindStorageBuffers) &&
1511       visitor->Visit(
1512           "maxDescriptorSetUpdateAfterBindStorageBuffersDynamic",
1513           &properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic) &&
1514       visitor->Visit(
1515           "maxDescriptorSetUpdateAfterBindSampledImages",
1516           &properties->maxDescriptorSetUpdateAfterBindSampledImages) &&
1517       visitor->Visit(
1518           "maxDescriptorSetUpdateAfterBindStorageImages",
1519           &properties->maxDescriptorSetUpdateAfterBindStorageImages) &&
1520       visitor->Visit(
1521           "maxDescriptorSetUpdateAfterBindInputAttachments",
1522           &properties->maxDescriptorSetUpdateAfterBindInputAttachments) &&
1523       visitor->Visit("supportedDepthResolveModes",
1524                      &properties->supportedDepthResolveModes) &&
1525       visitor->Visit("supportedStencilResolveModes",
1526                      &properties->supportedStencilResolveModes) &&
1527       visitor->Visit("independentResolveNone",
1528                      &properties->independentResolveNone) &&
1529       visitor->Visit("independentResolve", &properties->independentResolve) &&
1530       visitor->Visit("filterMinmaxSingleComponentFormats",
1531                      &properties->filterMinmaxSingleComponentFormats) &&
1532       visitor->Visit("filterMinmaxImageComponentMapping",
1533                      &properties->filterMinmaxImageComponentMapping) &&
1534       visitor->Visit("maxTimelineSemaphoreValueDifference",
1535                      &properties->maxTimelineSemaphoreValueDifference) &&
1536       visitor->Visit("framebufferIntegerColorSampleCounts",
1537                      &properties->framebufferIntegerColorSampleCounts);
1538 }
1539 
1540 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceVulkan12Features * features)1541 inline bool Iterate(Visitor* visitor,
1542                     VkPhysicalDeviceVulkan12Features* features) {
1543   return
1544 
1545       visitor->Visit("samplerMirrorClampToEdge",
1546                      &features->samplerMirrorClampToEdge) &&
1547       visitor->Visit("drawIndirectCount", &features->drawIndirectCount) &&
1548       visitor->Visit("storageBuffer8BitAccess",
1549                      &features->storageBuffer8BitAccess) &&
1550       visitor->Visit("uniformAndStorageBuffer8BitAccess",
1551                      &features->uniformAndStorageBuffer8BitAccess) &&
1552       visitor->Visit("storagePushConstant8", &features->storagePushConstant8) &&
1553       visitor->Visit("shaderBufferInt64Atomics",
1554                      &features->shaderBufferInt64Atomics) &&
1555       visitor->Visit("shaderSharedInt64Atomics",
1556                      &features->shaderSharedInt64Atomics) &&
1557       visitor->Visit("shaderFloat16", &features->shaderFloat16) &&
1558       visitor->Visit("shaderInt8", &features->shaderInt8) &&
1559       visitor->Visit("descriptorIndexing", &features->descriptorIndexing) &&
1560       visitor->Visit("shaderInputAttachmentArrayDynamicIndexing",
1561                      &features->shaderInputAttachmentArrayDynamicIndexing) &&
1562       visitor->Visit("shaderUniformTexelBufferArrayDynamicIndexing",
1563                      &features->shaderUniformTexelBufferArrayDynamicIndexing) &&
1564       visitor->Visit("shaderStorageTexelBufferArrayDynamicIndexing",
1565                      &features->shaderStorageTexelBufferArrayDynamicIndexing) &&
1566       visitor->Visit("shaderUniformBufferArrayNonUniformIndexing",
1567                      &features->shaderUniformBufferArrayNonUniformIndexing) &&
1568       visitor->Visit("shaderSampledImageArrayNonUniformIndexing",
1569                      &features->shaderSampledImageArrayNonUniformIndexing) &&
1570       visitor->Visit("shaderStorageBufferArrayNonUniformIndexing",
1571                      &features->shaderStorageBufferArrayNonUniformIndexing) &&
1572       visitor->Visit("shaderStorageImageArrayNonUniformIndexing",
1573                      &features->shaderStorageImageArrayNonUniformIndexing) &&
1574       visitor->Visit("shaderInputAttachmentArrayNonUniformIndexing",
1575                      &features->shaderInputAttachmentArrayNonUniformIndexing) &&
1576       visitor->Visit(
1577           "shaderUniformTexelBufferArrayNonUniformIndexing",
1578           &features->shaderUniformTexelBufferArrayNonUniformIndexing) &&
1579       visitor->Visit(
1580           "shaderStorageTexelBufferArrayNonUniformIndexing",
1581           &features->shaderStorageTexelBufferArrayNonUniformIndexing) &&
1582       visitor->Visit(
1583           "descriptorBindingUniformBufferUpdateAfterBind",
1584           &features->descriptorBindingUniformBufferUpdateAfterBind) &&
1585       visitor->Visit("descriptorBindingSampledImageUpdateAfterBind",
1586                      &features->descriptorBindingSampledImageUpdateAfterBind) &&
1587       visitor->Visit("descriptorBindingStorageImageUpdateAfterBind",
1588                      &features->descriptorBindingStorageImageUpdateAfterBind) &&
1589       visitor->Visit(
1590           "descriptorBindingStorageBufferUpdateAfterBind",
1591           &features->descriptorBindingStorageBufferUpdateAfterBind) &&
1592       visitor->Visit(
1593           "descriptorBindingUniformTexelBufferUpdateAfterBind",
1594           &features->descriptorBindingUniformTexelBufferUpdateAfterBind) &&
1595       visitor->Visit(
1596           "descriptorBindingStorageTexelBufferUpdateAfterBind",
1597           &features->descriptorBindingStorageTexelBufferUpdateAfterBind) &&
1598       visitor->Visit("descriptorBindingUpdateUnusedWhilePending",
1599                      &features->descriptorBindingUpdateUnusedWhilePending) &&
1600       visitor->Visit("descriptorBindingPartiallyBound",
1601                      &features->descriptorBindingPartiallyBound) &&
1602       visitor->Visit("descriptorBindingVariableDescriptorCount",
1603                      &features->descriptorBindingVariableDescriptorCount) &&
1604       visitor->Visit("runtimeDescriptorArray",
1605                      &features->runtimeDescriptorArray) &&
1606       visitor->Visit("samplerFilterMinmax", &features->samplerFilterMinmax) &&
1607       visitor->Visit("scalarBlockLayout", &features->scalarBlockLayout) &&
1608       visitor->Visit("imagelessFramebuffer", &features->imagelessFramebuffer) &&
1609       visitor->Visit("uniformBufferStandardLayout",
1610                      &features->uniformBufferStandardLayout) &&
1611       visitor->Visit("shaderSubgroupExtendedTypes",
1612                      &features->shaderSubgroupExtendedTypes) &&
1613       visitor->Visit("separateDepthStencilLayouts",
1614                      &features->separateDepthStencilLayouts) &&
1615       visitor->Visit("hostQueryReset", &features->hostQueryReset) &&
1616       visitor->Visit("timelineSemaphore", &features->timelineSemaphore) &&
1617       visitor->Visit("bufferDeviceAddress", &features->bufferDeviceAddress) &&
1618       visitor->Visit("bufferDeviceAddressCaptureReplay",
1619                      &features->bufferDeviceAddressCaptureReplay) &&
1620       visitor->Visit("bufferDeviceAddressMultiDevice",
1621                      &features->bufferDeviceAddressMultiDevice) &&
1622       visitor->Visit("vulkanMemoryModel", &features->vulkanMemoryModel) &&
1623       visitor->Visit("vulkanMemoryModelDeviceScope",
1624                      &features->vulkanMemoryModelDeviceScope) &&
1625       visitor->Visit(
1626           "vulkanMemoryModelAvailabilityVisibilityChains",
1627           &features->vulkanMemoryModelAvailabilityVisibilityChains) &&
1628       visitor->Visit("shaderOutputViewportIndex",
1629                      &features->shaderOutputViewportIndex) &&
1630       visitor->Visit("shaderOutputLayer", &features->shaderOutputLayer) &&
1631       visitor->Visit("subgroupBroadcastDynamicId",
1632                      &features->subgroupBroadcastDynamicId);
1633 }
1634 
1635 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceVulkan13Properties * properties)1636 inline bool Iterate(Visitor* visitor,
1637                     VkPhysicalDeviceVulkan13Properties* properties) {
1638   return
1639 
1640       visitor->Visit("minSubgroupSize", &properties->minSubgroupSize) &&
1641       visitor->Visit("maxSubgroupSize", &properties->maxSubgroupSize) &&
1642       visitor->Visit("maxComputeWorkgroupSubgroups",
1643                      &properties->maxComputeWorkgroupSubgroups) &&
1644       visitor->Visit("requiredSubgroupSizeStages",
1645                      &properties->requiredSubgroupSizeStages) &&
1646       visitor->Visit("maxInlineUniformBlockSize",
1647                      &properties->maxInlineUniformBlockSize) &&
1648       visitor->Visit("maxPerStageDescriptorInlineUniformBlocks",
1649                      &properties->maxPerStageDescriptorInlineUniformBlocks) &&
1650       visitor->Visit(
1651           "maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks",
1652           &properties
1653                ->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks) &&
1654       visitor->Visit("maxDescriptorSetInlineUniformBlocks",
1655                      &properties->maxDescriptorSetInlineUniformBlocks) &&
1656       visitor->Visit(
1657           "maxDescriptorSetUpdateAfterBindInlineUniformBlocks",
1658           &properties->maxDescriptorSetUpdateAfterBindInlineUniformBlocks) &&
1659       visitor->Visit("maxInlineUniformTotalSize",
1660                      &properties->maxInlineUniformTotalSize) &&
1661       visitor->Visit("integerDotProduct8BitUnsignedAccelerated",
1662                      &properties->integerDotProduct8BitUnsignedAccelerated) &&
1663       visitor->Visit("integerDotProduct8BitSignedAccelerated",
1664                      &properties->integerDotProduct8BitSignedAccelerated) &&
1665       visitor->Visit(
1666           "integerDotProduct8BitMixedSignednessAccelerated",
1667           &properties->integerDotProduct8BitMixedSignednessAccelerated) &&
1668       visitor->Visit(
1669           "integerDotProduct4x8BitPackedUnsignedAccelerated",
1670           &properties->integerDotProduct4x8BitPackedUnsignedAccelerated) &&
1671       visitor->Visit(
1672           "integerDotProduct4x8BitPackedSignedAccelerated",
1673           &properties->integerDotProduct4x8BitPackedSignedAccelerated) &&
1674       visitor->Visit(
1675           "integerDotProduct4x8BitPackedMixedSignednessAccelerated",
1676           &properties
1677                ->integerDotProduct4x8BitPackedMixedSignednessAccelerated) &&
1678       visitor->Visit("integerDotProduct16BitUnsignedAccelerated",
1679                      &properties->integerDotProduct16BitUnsignedAccelerated) &&
1680       visitor->Visit("integerDotProduct16BitSignedAccelerated",
1681                      &properties->integerDotProduct16BitSignedAccelerated) &&
1682       visitor->Visit(
1683           "integerDotProduct16BitMixedSignednessAccelerated",
1684           &properties->integerDotProduct16BitMixedSignednessAccelerated) &&
1685       visitor->Visit("integerDotProduct32BitUnsignedAccelerated",
1686                      &properties->integerDotProduct32BitUnsignedAccelerated) &&
1687       visitor->Visit("integerDotProduct32BitSignedAccelerated",
1688                      &properties->integerDotProduct32BitSignedAccelerated) &&
1689       visitor->Visit(
1690           "integerDotProduct32BitMixedSignednessAccelerated",
1691           &properties->integerDotProduct32BitMixedSignednessAccelerated) &&
1692       visitor->Visit("integerDotProduct64BitUnsignedAccelerated",
1693                      &properties->integerDotProduct64BitUnsignedAccelerated) &&
1694       visitor->Visit("integerDotProduct64BitSignedAccelerated",
1695                      &properties->integerDotProduct64BitSignedAccelerated) &&
1696       visitor->Visit(
1697           "integerDotProduct64BitMixedSignednessAccelerated",
1698           &properties->integerDotProduct64BitMixedSignednessAccelerated) &&
1699       visitor->Visit(
1700           "integerDotProductAccumulatingSaturating8BitUnsignedAccelerated",
1701           &properties
1702                ->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated) &&
1703       visitor->Visit(
1704           "integerDotProductAccumulatingSaturating8BitSignedAccelerated",
1705           &properties
1706                ->integerDotProductAccumulatingSaturating8BitSignedAccelerated) &&
1707       visitor->Visit(
1708           "integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerate"
1709           "d",
1710           &properties
1711                ->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated) &&
1712       visitor->Visit(
1713           "integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerat"
1714           "ed",
1715           &properties
1716                ->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated) &&
1717       visitor->Visit(
1718           "integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerate"
1719           "d",
1720           &properties
1721                ->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated) &&
1722       visitor->Visit(
1723           "integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAc"
1724           "celerated",
1725           &properties
1726                ->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated) &&
1727       visitor->Visit(
1728           "integerDotProductAccumulatingSaturating16BitUnsignedAccelerated",
1729           &properties
1730                ->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated) &&
1731       visitor->Visit(
1732           "integerDotProductAccumulatingSaturating16BitSignedAccelerated",
1733           &properties
1734                ->integerDotProductAccumulatingSaturating16BitSignedAccelerated) &&
1735       visitor->Visit(
1736           "integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerat"
1737           "ed",
1738           &properties
1739                ->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated) &&
1740       visitor->Visit(
1741           "integerDotProductAccumulatingSaturating32BitUnsignedAccelerated",
1742           &properties
1743                ->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated) &&
1744       visitor->Visit(
1745           "integerDotProductAccumulatingSaturating32BitSignedAccelerated",
1746           &properties
1747                ->integerDotProductAccumulatingSaturating32BitSignedAccelerated) &&
1748       visitor->Visit(
1749           "integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerat"
1750           "ed",
1751           &properties
1752                ->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated) &&
1753       visitor->Visit(
1754           "integerDotProductAccumulatingSaturating64BitUnsignedAccelerated",
1755           &properties
1756                ->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated) &&
1757       visitor->Visit(
1758           "integerDotProductAccumulatingSaturating64BitSignedAccelerated",
1759           &properties
1760                ->integerDotProductAccumulatingSaturating64BitSignedAccelerated) &&
1761       visitor->Visit(
1762           "integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerat"
1763           "ed",
1764           &properties
1765                ->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated) &&
1766       visitor->Visit("storageTexelBufferOffsetAlignmentBytes",
1767                      &properties->storageTexelBufferOffsetAlignmentBytes) &&
1768       visitor->Visit(
1769           "storageTexelBufferOffsetSingleTexelAlignment",
1770           &properties->storageTexelBufferOffsetSingleTexelAlignment) &&
1771       visitor->Visit("uniformTexelBufferOffsetAlignmentBytes",
1772                      &properties->uniformTexelBufferOffsetAlignmentBytes) &&
1773       visitor->Visit(
1774           "uniformTexelBufferOffsetSingleTexelAlignment",
1775           &properties->uniformTexelBufferOffsetSingleTexelAlignment) &&
1776       visitor->Visit("maxBufferSize", &properties->maxBufferSize);
1777 }
1778 
1779 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceVulkan13Features * features)1780 inline bool Iterate(Visitor* visitor,
1781                     VkPhysicalDeviceVulkan13Features* features) {
1782   return
1783 
1784       visitor->Visit("robustImageAccess", &features->robustImageAccess) &&
1785       visitor->Visit("inlineUniformBlock", &features->inlineUniformBlock) &&
1786       visitor->Visit(
1787           "descriptorBindingInlineUniformBlockUpdateAfterBind",
1788           &features->descriptorBindingInlineUniformBlockUpdateAfterBind) &&
1789       visitor->Visit("pipelineCreationCacheControl",
1790                      &features->pipelineCreationCacheControl) &&
1791       visitor->Visit("privateData", &features->privateData) &&
1792       visitor->Visit("shaderDemoteToHelperInvocation",
1793                      &features->shaderDemoteToHelperInvocation) &&
1794       visitor->Visit("shaderTerminateInvocation",
1795                      &features->shaderTerminateInvocation) &&
1796       visitor->Visit("subgroupSizeControl", &features->subgroupSizeControl) &&
1797       visitor->Visit("computeFullSubgroups", &features->computeFullSubgroups) &&
1798       visitor->Visit("synchronization2", &features->synchronization2) &&
1799       visitor->Visit("textureCompressionASTC_HDR",
1800                      &features->textureCompressionASTC_HDR) &&
1801       visitor->Visit("shaderZeroInitializeWorkgroupMemory",
1802                      &features->shaderZeroInitializeWorkgroupMemory) &&
1803       visitor->Visit("dynamicRendering", &features->dynamicRendering) &&
1804       visitor->Visit("shaderIntegerDotProduct",
1805                      &features->shaderIntegerDotProduct) &&
1806       visitor->Visit("maintenance4", &features->maintenance4);
1807 }
1808 
1809 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceVulkan14Properties * properties)1810 inline bool Iterate(Visitor* visitor,
1811                     VkPhysicalDeviceVulkan14Properties* properties) {
1812   return
1813 
1814       visitor->Visit("lineSubPixelPrecisionBits",
1815                      &properties->lineSubPixelPrecisionBits) &&
1816       visitor->Visit("maxVertexAttribDivisor",
1817                      &properties->maxVertexAttribDivisor) &&
1818       visitor->Visit("supportsNonZeroFirstInstance",
1819                      &properties->supportsNonZeroFirstInstance) &&
1820       visitor->Visit("maxPushDescriptors", &properties->maxPushDescriptors) &&
1821       visitor->Visit(
1822           "dynamicRenderingLocalReadDepthStencilAttachments",
1823           &properties->dynamicRenderingLocalReadDepthStencilAttachments) &&
1824       visitor->Visit(
1825           "dynamicRenderingLocalReadMultisampledAttachments",
1826           &properties->dynamicRenderingLocalReadMultisampledAttachments) &&
1827       visitor->Visit(
1828           "earlyFragmentMultisampleCoverageAfterSampleCounting",
1829           &properties->earlyFragmentMultisampleCoverageAfterSampleCounting) &&
1830       visitor->Visit(
1831           "earlyFragmentSampleMaskTestBeforeSampleCounting",
1832           &properties->earlyFragmentSampleMaskTestBeforeSampleCounting) &&
1833       visitor->Visit("depthStencilSwizzleOneSupport",
1834                      &properties->depthStencilSwizzleOneSupport) &&
1835       visitor->Visit("polygonModePointSize",
1836                      &properties->polygonModePointSize) &&
1837       visitor->Visit(
1838           "nonStrictSinglePixelWideLinesUseParallelogram",
1839           &properties->nonStrictSinglePixelWideLinesUseParallelogram) &&
1840       visitor->Visit("nonStrictWideLinesUseParallelogram",
1841                      &properties->nonStrictWideLinesUseParallelogram) &&
1842       visitor->Visit("blockTexelViewCompatibleMultipleLayers",
1843                      &properties->blockTexelViewCompatibleMultipleLayers) &&
1844       visitor->Visit("maxCombinedImageSamplerDescriptorCount",
1845                      &properties->maxCombinedImageSamplerDescriptorCount) &&
1846       visitor->Visit("fragmentShadingRateClampCombinerInputs",
1847                      &properties->fragmentShadingRateClampCombinerInputs) &&
1848       visitor->Visit("defaultRobustnessStorageBuffers",
1849                      &properties->defaultRobustnessStorageBuffers) &&
1850       visitor->Visit("defaultRobustnessUniformBuffers",
1851                      &properties->defaultRobustnessUniformBuffers) &&
1852       visitor->Visit("defaultRobustnessVertexInputs",
1853                      &properties->defaultRobustnessVertexInputs) &&
1854       visitor->Visit("defaultRobustnessImages",
1855                      &properties->defaultRobustnessImages) &&
1856       visitor->Visit("copySrcLayoutCount", &properties->copySrcLayoutCount) &&
1857       visitor->VisitArray("pCopySrcLayouts", properties->copySrcLayoutCount,
1858                           &properties->pCopySrcLayouts) &&
1859       visitor->Visit("copyDstLayoutCount", &properties->copyDstLayoutCount) &&
1860       visitor->VisitArray("pCopyDstLayouts", properties->copyDstLayoutCount,
1861                           &properties->pCopyDstLayouts) &&
1862       visitor->Visit("optimalTilingLayoutUUID",
1863                      &properties->optimalTilingLayoutUUID) &&
1864       visitor->Visit("identicalMemoryTypeRequirements",
1865                      &properties->identicalMemoryTypeRequirements);
1866 }
1867 
1868 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceVulkan14Features * features)1869 inline bool Iterate(Visitor* visitor,
1870                     VkPhysicalDeviceVulkan14Features* features) {
1871   return
1872 
1873       visitor->Visit("globalPriorityQuery", &features->globalPriorityQuery) &&
1874       visitor->Visit("shaderSubgroupRotate", &features->shaderSubgroupRotate) &&
1875       visitor->Visit("shaderSubgroupRotateClustered",
1876                      &features->shaderSubgroupRotateClustered) &&
1877       visitor->Visit("shaderFloatControls2", &features->shaderFloatControls2) &&
1878       visitor->Visit("shaderExpectAssume", &features->shaderExpectAssume) &&
1879       visitor->Visit("rectangularLines", &features->rectangularLines) &&
1880       visitor->Visit("bresenhamLines", &features->bresenhamLines) &&
1881       visitor->Visit("smoothLines", &features->smoothLines) &&
1882       visitor->Visit("stippledRectangularLines",
1883                      &features->stippledRectangularLines) &&
1884       visitor->Visit("stippledBresenhamLines",
1885                      &features->stippledBresenhamLines) &&
1886       visitor->Visit("stippledSmoothLines", &features->stippledSmoothLines) &&
1887       visitor->Visit("vertexAttributeInstanceRateDivisor",
1888                      &features->vertexAttributeInstanceRateDivisor) &&
1889       visitor->Visit("vertexAttributeInstanceRateZeroDivisor",
1890                      &features->vertexAttributeInstanceRateZeroDivisor) &&
1891       visitor->Visit("indexTypeUint8", &features->indexTypeUint8) &&
1892       visitor->Visit("dynamicRenderingLocalRead",
1893                      &features->dynamicRenderingLocalRead) &&
1894       visitor->Visit("maintenance5", &features->maintenance5) &&
1895       visitor->Visit("maintenance6", &features->maintenance6) &&
1896       visitor->Visit("pipelineProtectedAccess",
1897                      &features->pipelineProtectedAccess) &&
1898       visitor->Visit("pipelineRobustness", &features->pipelineRobustness) &&
1899       visitor->Visit("hostImageCopy", &features->hostImageCopy) &&
1900       visitor->Visit("pushDescriptor", &features->pushDescriptor);
1901 }
1902 
1903 template <typename Visitor>
Iterate(Visitor * visitor,VkPhysicalDeviceDriverProperties * properties)1904 inline bool Iterate(Visitor* visitor,
1905                     VkPhysicalDeviceDriverProperties* properties) {
1906   return
1907 
1908       visitor->Visit("driverID", &properties->driverID) &&
1909       visitor->Visit("driverName", &properties->driverName) &&
1910       visitor->Visit("driverInfo", &properties->driverInfo) &&
1911       visitor->Visit("conformanceVersion", &properties->conformanceVersion);
1912 }
1913 
1914 template <typename Visitor>
Iterate(Visitor * visitor,VkExternalFenceProperties * properties)1915 inline bool Iterate(Visitor* visitor, VkExternalFenceProperties* properties) {
1916   return visitor->Visit("exportFromImportedHandleTypes",
1917                         &properties->exportFromImportedHandleTypes) &&
1918          visitor->Visit("compatibleHandleTypes",
1919                         &properties->compatibleHandleTypes) &&
1920          visitor->Visit("externalFenceFeatures",
1921                         &properties->externalFenceFeatures);
1922 }
1923 
1924 template <typename Visitor>
Iterate(Visitor * visitor,VkExternalSemaphoreProperties * properties)1925 inline bool Iterate(Visitor* visitor,
1926                     VkExternalSemaphoreProperties* properties) {
1927   return visitor->Visit("exportFromImportedHandleTypes",
1928                         &properties->exportFromImportedHandleTypes) &&
1929          visitor->Visit("compatibleHandleTypes",
1930                         &properties->compatibleHandleTypes) &&
1931          visitor->Visit("externalSemaphoreFeatures",
1932                         &properties->externalSemaphoreFeatures);
1933 }
1934 
1935 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonLayer * layer)1936 inline bool Iterate(Visitor* visitor, VkJsonLayer* layer) {
1937   return visitor->Visit("properties", &layer->properties) &&
1938          visitor->Visit("extensions", &layer->extensions);
1939 }
1940 
1941 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonDeviceGroup * device_group)1942 inline bool Iterate(Visitor* visitor, VkJsonDeviceGroup* device_group) {
1943   return visitor->Visit("devices", &device_group->device_inds) &&
1944          visitor->Visit("subsetAllocation",
1945                         &device_group->properties.subsetAllocation);
1946 }
1947 
1948 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonDevice * device)1949 inline bool Iterate(Visitor* visitor, VkJsonDevice* device) {
1950   bool ret = true;
1951   switch (device->properties.apiVersion ^
1952           VK_API_VERSION_PATCH(device->properties.apiVersion)) {
1953     case VK_API_VERSION_1_4:
1954       ret &= visitor->Visit("core14", &device->core14);
1955       FALLTHROUGH_INTENDED;
1956     case VK_API_VERSION_1_3:
1957       ret &= visitor->Visit("core13", &device->core13);
1958       FALLTHROUGH_INTENDED;
1959     case VK_API_VERSION_1_2:
1960       ret &= visitor->Visit("core11", &device->core11);
1961       ret &= visitor->Visit("core12", &device->core12);
1962       FALLTHROUGH_INTENDED;
1963     case VK_API_VERSION_1_1:
1964       ret &=
1965           visitor->Visit("subgroupProperties", &device->subgroup_properties) &&
1966           visitor->Visit("pointClippingProperties",
1967                          &device->point_clipping_properties) &&
1968           visitor->Visit("multiviewProperties",
1969                          &device->multiview_properties) &&
1970           visitor->Visit("idProperties", &device->id_properties) &&
1971           visitor->Visit("maintenance3Properties",
1972                          &device->maintenance3_properties) &&
1973           visitor->Visit("multiviewFeatures", &device->multiview_features) &&
1974           visitor->Visit("variablePointersFeatures",
1975                          &device->variable_pointers_features) &&
1976           visitor->Visit("protectedMemoryFeatures",
1977                          &device->protected_memory_features) &&
1978           visitor->Visit("samplerYcbcrConversionFeatures",
1979                          &device->sampler_ycbcr_conversion_features) &&
1980           visitor->Visit("shaderDrawParameterFeatures",
1981                          &device->shader_draw_parameter_features) &&
1982           visitor->Visit("bit16StorageFeatures",
1983                          &device->bit16_storage_features) &&
1984           visitor->Visit("externalFenceProperties",
1985                          &device->external_fence_properties) &&
1986           visitor->Visit("externalSemaphoreProperties",
1987                          &device->external_semaphore_properties);
1988       FALLTHROUGH_INTENDED;
1989     case VK_API_VERSION_1_0:
1990       ret &= visitor->Visit("properties", &device->properties) &&
1991              visitor->Visit("features", &device->features) &&
1992              visitor->Visit("memory", &device->memory) &&
1993              visitor->Visit("queues", &device->queues) &&
1994              visitor->Visit("extensions", &device->extensions) &&
1995              visitor->Visit("layers", &device->layers) &&
1996              visitor->Visit("formats", &device->formats);
1997 
1998       if (device->khr_variable_pointers.reported) {
1999         ret &= visitor->Visit("VK_KHR_variable_pointers",
2000                               &device->khr_variable_pointers);
2001       }
2002       if (device->khr_shader_float16_int8.reported) {
2003         ret &= visitor->Visit("VK_KHR_shader_float16_int8",
2004                               &device->khr_shader_float16_int8);
2005       }
2006       if (device->ext_image_2d_view_of_3d.reported) {
2007         ret &= visitor->Visit("VK_EXT_image_2d_view_of_3d",
2008                               &device->ext_image_2d_view_of_3d);
2009       }
2010       if (device->ext_custom_border_color.reported) {
2011         ret &= visitor->Visit("VK_EXT_custom_border_color",
2012                               &device->ext_custom_border_color);
2013       }
2014       if (device->ext_primitive_topology_list_restart.reported) {
2015         ret &= visitor->Visit("VK_EXT_primitive_topology_list_restart",
2016                               &device->ext_primitive_topology_list_restart);
2017       }
2018       if (device->ext_provoking_vertex.reported) {
2019         ret &= visitor->Visit("VK_EXT_provoking_vertex",
2020                               &device->ext_provoking_vertex);
2021       }
2022       if (device->khr_index_type_uint8.reported) {
2023         ret &= visitor->Visit("VK_KHR_index_type_uint8",
2024                               &device->khr_index_type_uint8);
2025       }
2026       if (device->ext_index_type_uint8.reported) {
2027         ret &= visitor->Visit("VK_EXT_index_type_uint8",
2028                               &device->ext_index_type_uint8);
2029       }
2030       if (device->khr_vertex_attribute_divisor.reported) {
2031         ret &= visitor->Visit("VK_KHR_vertex_attribute_divisor",
2032                               &device->khr_vertex_attribute_divisor);
2033       }
2034       if (device->ext_vertex_attribute_divisor.reported) {
2035         ret &= visitor->Visit("VK_EXT_vertex_attribute_divisor",
2036                               &device->ext_vertex_attribute_divisor);
2037       }
2038       if (device->ext_transform_feedback.reported) {
2039         ret &= visitor->Visit("VK_EXT_transform_feedback",
2040                               &device->ext_transform_feedback);
2041       }
2042       if (device->khr_shader_subgroup_uniform_control_flow.reported) {
2043         ret &=
2044             visitor->Visit("VK_KHR_shader_subgroup_uniform_control_flow",
2045                            &device->khr_shader_subgroup_uniform_control_flow);
2046       }
2047       if (device->khr_shader_subgroup_extended_types.reported) {
2048         ret &= visitor->Visit("VK_KHR_shader_subgroup_extended_types",
2049                               &device->khr_shader_subgroup_extended_types);
2050       }
2051       if (device->khr_8bit_storage.reported) {
2052         ret &= visitor->Visit("VK_KHR_8bit_storage", &device->khr_8bit_storage);
2053       }
2054       if (device->khr_shader_integer_dot_product.reported) {
2055         ret &= visitor->Visit("VK_KHR_shader_integer_dot_product",
2056                               &device->khr_shader_integer_dot_product);
2057       }
2058       if (device->img_relaxed_line_rasterization.reported) {
2059         ret &= visitor->Visit("VK_IMG_relaxed_line_rasterization",
2060                               &device->img_relaxed_line_rasterization);
2061       }
2062       if (device->khr_line_rasterization.reported) {
2063         ret &= visitor->Visit("VK_KHR_line_rasterization",
2064                               &device->khr_line_rasterization);
2065       }
2066       if (device->ext_line_rasterization.reported) {
2067         ret &= visitor->Visit("VK_EXT_line_rasterization",
2068                               &device->ext_line_rasterization);
2069       }
2070       if (device->ext_primitives_generated_query.reported) {
2071         ret &= visitor->Visit("VK_EXT_primitives_generated_query",
2072                               &device->ext_primitives_generated_query);
2073       }
2074       if (device->khr_shader_float_controls.reported) {
2075         ret &= visitor->Visit("VK_KHR_shader_float_controls",
2076                               &device->khr_shader_float_controls);
2077       }
2078       if (device->khr_driver_properties.reported) {
2079         ret &= visitor->Visit("VK_KHR_driver_properties",
2080                               &device->khr_driver_properties);
2081       }
2082   }
2083   return ret;
2084 }
2085 
2086 template <typename Visitor>
Iterate(Visitor * visitor,VkJsonInstance * instance)2087 inline bool Iterate(Visitor* visitor, VkJsonInstance* instance) {
2088   bool ret = true;
2089   switch (instance->api_version ^ VK_API_VERSION_PATCH(instance->api_version)) {
2090     case VK_API_VERSION_1_4:
2091       FALLTHROUGH_INTENDED;
2092     case VK_API_VERSION_1_3:
2093       FALLTHROUGH_INTENDED;
2094     case VK_API_VERSION_1_2:
2095       ret &= visitor->Visit("apiVersion", &instance->api_version);
2096       FALLTHROUGH_INTENDED;
2097     case VK_API_VERSION_1_1:
2098       ret &= visitor->Visit("deviceGroups", &instance->device_groups);
2099       FALLTHROUGH_INTENDED;
2100     case VK_API_VERSION_1_0:
2101       char depString[] =
2102           "vkjson is deprecated, and will be replaced in a future release";
2103       ret &= visitor->Visit("layers", &instance->layers) &&
2104              visitor->Visit("extensions", &instance->extensions) &&
2105              visitor->Visit("devices", &instance->devices) &&
2106              visitor->Visit("_comment", &depString);
2107   }
2108   return ret;
2109 }
2110 
2111 template <typename T>
2112 using EnableForArithmetic =
2113     typename std::enable_if<std::is_arithmetic<T>::value, void>::type;
2114 
2115 template <typename T>
2116 using EnableForStruct =
2117     typename std::enable_if<std::is_class<T>::value, void>::type;
2118 
2119 template <typename T>
2120 using EnableForEnum =
2121     typename std::enable_if<std::is_enum<T>::value, void>::type;
2122 
2123 template <typename T, typename = EnableForStruct<T>, typename = void>
2124 Json::Value ToJsonValue(const T& value);
2125 
2126 template <typename T, typename = EnableForArithmetic<T>>
ToJsonValue(const T & value)2127 inline Json::Value ToJsonValue(const T& value) {
2128   return Json::Value(
2129       std::clamp(static_cast<double>(value), SAFE_DOUBLE_MIN, SAFE_DOUBLE_MAX));
2130 }
2131 
ToJsonValue(const uint64_t & value)2132 inline Json::Value ToJsonValue(const uint64_t& value) {
2133   char string[19] = {0};  // "0x" + 16 digits + terminal \0
2134   snprintf(string, sizeof(string), "0x%016" PRIx64, value);
2135   return Json::Value(string);
2136 }
2137 
2138 template <typename T,
2139           typename = EnableForEnum<T>,
2140           typename = void,
2141           typename = void>
ToJsonValue(const T & value)2142 inline Json::Value ToJsonValue(const T& value) {
2143   return Json::Value(static_cast<double>(value));
2144 }
2145 
2146 template <typename T>
ArrayToJsonValue(uint32_t count,const T * values)2147 inline Json::Value ArrayToJsonValue(uint32_t count, const T* values) {
2148   Json::Value array(Json::arrayValue);
2149   for (unsigned int i = 0; i < count; ++i)
2150     array.append(ToJsonValue(values[i]));
2151   return array;
2152 }
2153 
2154 template <typename T, size_t N>
ToJsonValue(const T (& value)[N])2155 inline Json::Value ToJsonValue(const T (&value)[N]) {
2156   return ArrayToJsonValue(N, value);
2157 }
2158 
2159 template <size_t N>
ToJsonValue(const char (& value)[N])2160 inline Json::Value ToJsonValue(const char (&value)[N]) {
2161   assert(strlen(value) < N);
2162   return Json::Value(value);
2163 }
2164 
2165 template <typename T>
ToJsonValue(const std::vector<T> & value)2166 inline Json::Value ToJsonValue(const std::vector<T>& value) {
2167   assert(value.size() <= std::numeric_limits<uint32_t>::max());
2168   return ArrayToJsonValue(static_cast<uint32_t>(value.size()), value.data());
2169 }
2170 
2171 template <typename F, typename S>
ToJsonValue(const std::pair<F,S> & value)2172 inline Json::Value ToJsonValue(const std::pair<F, S>& value) {
2173   Json::Value array(Json::arrayValue);
2174   array.append(ToJsonValue(value.first));
2175   array.append(ToJsonValue(value.second));
2176   return array;
2177 }
2178 
2179 template <typename F, typename S>
ToJsonValue(const std::map<F,S> & value)2180 inline Json::Value ToJsonValue(const std::map<F, S>& value) {
2181   Json::Value array(Json::arrayValue);
2182   for (auto& kv : value)
2183     array.append(ToJsonValue(kv));
2184   return array;
2185 }
2186 
2187 class JsonWriterVisitor {
2188  public:
JsonWriterVisitor()2189   JsonWriterVisitor() : object_(Json::objectValue) {}
2190 
~JsonWriterVisitor()2191   ~JsonWriterVisitor() {}
2192 
2193   template <typename T>
Visit(const char * key,const T * value)2194   bool Visit(const char* key, const T* value) {
2195     object_[key] = ToJsonValue(*value);
2196     return true;
2197   }
2198 
2199   template <typename T, uint32_t N>
VisitArray(const char * key,uint32_t count,const T (* value)[N])2200   bool VisitArray(const char* key, uint32_t count, const T (*value)[N]) {
2201     assert(count <= N);
2202     object_[key] = ArrayToJsonValue(count, *value);
2203     return true;
2204   }
2205 
2206   template <typename T>
VisitArray(const char * key,uint32_t count,const T * value)2207   bool VisitArray(const char* key, uint32_t count, const T* value) {
2208     object_[key] = ArrayToJsonValue(count, *value);
2209     return true;
2210   }
2211 
get_object() const2212   Json::Value get_object() const { return object_; }
2213 
2214  private:
2215   Json::Value object_;
2216 };
2217 
2218 template <typename Visitor, typename T>
VisitForWrite(Visitor * visitor,const T & t)2219 inline void VisitForWrite(Visitor* visitor, const T& t) {
2220   Iterate(visitor, const_cast<T*>(&t));
2221 }
2222 
2223 template <typename T, typename /*= EnableForStruct<T>*/, typename /*= void*/>
ToJsonValue(const T & value)2224 Json::Value ToJsonValue(const T& value) {
2225   JsonWriterVisitor visitor;
2226   VisitForWrite(&visitor, value);
2227   return visitor.get_object();
2228 }
2229 
2230 template <typename T, typename = EnableForStruct<T>>
2231 bool AsValue(Json::Value* json_value, T* t);
2232 
AsValue(Json::Value * json_value,int32_t * value)2233 inline bool AsValue(Json::Value* json_value, int32_t* value) {
2234   if (json_value->type() != Json::realValue)
2235     return false;
2236   double d = json_value->asDouble();
2237   if (!IsIntegral(d) ||
2238       d < static_cast<double>(std::numeric_limits<int32_t>::min()) ||
2239       d > static_cast<double>(std::numeric_limits<int32_t>::max()))
2240     return false;
2241   *value = static_cast<int32_t>(d);
2242   return true;
2243 }
2244 
AsValue(Json::Value * json_value,uint64_t * value)2245 inline bool AsValue(Json::Value* json_value, uint64_t* value) {
2246   if (json_value->type() != Json::stringValue)
2247     return false;
2248   int result =
2249       std::sscanf(json_value->asString().c_str(), "0x%016" PRIx64, value);
2250   return result == 1;
2251 }
2252 
AsValue(Json::Value * json_value,uint32_t * value)2253 inline bool AsValue(Json::Value* json_value, uint32_t* value) {
2254   if (json_value->type() != Json::realValue)
2255     return false;
2256   double d = json_value->asDouble();
2257   if (!IsIntegral(d) || d < 0.0 ||
2258       d > static_cast<double>(std::numeric_limits<uint32_t>::max()))
2259     return false;
2260   *value = static_cast<uint32_t>(d);
2261   return true;
2262 }
2263 
AsValue(Json::Value * json_value,uint8_t * value)2264 inline bool AsValue(Json::Value* json_value, uint8_t* value) {
2265   uint32_t value32 = 0;
2266   AsValue(json_value, &value32);
2267   if (value32 > std::numeric_limits<uint8_t>::max())
2268     return false;
2269   *value = static_cast<uint8_t>(value32);
2270   return true;
2271 }
2272 
AsValue(Json::Value * json_value,float * value)2273 inline bool AsValue(Json::Value* json_value, float* value) {
2274   if (json_value->type() != Json::realValue)
2275     return false;
2276   *value = static_cast<float>(json_value->asDouble());
2277   return true;
2278 }
2279 
AsValue(Json::Value * json_value,VkImageLayout * t)2280 inline bool AsValue(Json::Value* json_value, VkImageLayout* t) {
2281   uint32_t value = 0;
2282   if (!AsValue(json_value, &value))
2283     return false;
2284   if (!EnumTraits<VkImageLayout>::exist(value))
2285     return false;
2286   *t = static_cast<VkImageLayout>(value);
2287   return true;
2288 }
2289 
2290 template <typename T>
AsArray(Json::Value * json_value,uint32_t count,T * values)2291 inline bool AsArray(Json::Value* json_value, uint32_t count, T* values) {
2292   if (json_value->type() != Json::arrayValue || json_value->size() != count)
2293     return false;
2294   for (uint32_t i = 0; i < count; ++i) {
2295     if (!AsValue(&(*json_value)[i], values + i))
2296       return false;
2297   }
2298   return true;
2299 }
2300 
2301 template <typename T, size_t N>
AsValue(Json::Value * json_value,T (* value)[N])2302 inline bool AsValue(Json::Value* json_value, T (*value)[N]) {
2303   return AsArray(json_value, N, *value);
2304 }
2305 
2306 template <size_t N>
AsValue(Json::Value * json_value,char (* value)[N])2307 inline bool AsValue(Json::Value* json_value, char (*value)[N]) {
2308   if (json_value->type() != Json::stringValue)
2309     return false;
2310   size_t len = json_value->asString().length();
2311   if (len >= N)
2312     return false;
2313   memcpy(*value, json_value->asString().c_str(), len);
2314   memset(*value + len, 0, N - len);
2315   return true;
2316 }
2317 
2318 template <typename T, typename = EnableForEnum<T>, typename = void>
AsValue(Json::Value * json_value,T * t)2319 inline bool AsValue(Json::Value* json_value, T* t) {
2320   uint32_t value = 0;
2321   if (!AsValue(json_value, &value))
2322     return false;
2323   if (!EnumTraits<T>::exist(value))
2324     return false;
2325   *t = static_cast<T>(value);
2326   return true;
2327 }
2328 
2329 template <typename T>
AsValue(Json::Value * json_value,std::vector<T> * value)2330 inline bool AsValue(Json::Value* json_value, std::vector<T>* value) {
2331   if (json_value->type() != Json::arrayValue)
2332     return false;
2333   int size = json_value->size();
2334   value->resize(size);
2335   return AsArray(json_value, size, value->data());
2336 }
2337 
2338 template <typename F, typename S>
AsValue(Json::Value * json_value,std::pair<F,S> * value)2339 inline bool AsValue(Json::Value* json_value, std::pair<F, S>* value) {
2340   if (json_value->type() != Json::arrayValue || json_value->size() != 2)
2341     return false;
2342   return AsValue(&(*json_value)[0], &value->first) &&
2343          AsValue(&(*json_value)[1], &value->second);
2344 }
2345 
2346 template <typename F, typename S>
AsValue(Json::Value * json_value,std::map<F,S> * value)2347 inline bool AsValue(Json::Value* json_value, std::map<F, S>* value) {
2348   if (json_value->type() != Json::arrayValue)
2349     return false;
2350   int size = json_value->size();
2351   for (int i = 0; i < size; ++i) {
2352     std::pair<F, S> elem;
2353     if (!AsValue(&(*json_value)[i], &elem))
2354       return false;
2355     if (!value->insert(elem).second)
2356       return false;
2357   }
2358   return true;
2359 }
2360 
2361 template <typename T>
ReadValue(Json::Value * object,const char * key,T * value,std::string * errors)2362 bool ReadValue(Json::Value* object,
2363                const char* key,
2364                T* value,
2365                std::string* errors) {
2366   Json::Value json_value = (*object)[key];
2367   if (!json_value) {
2368     if (errors)
2369       *errors = std::string(key) + " missing.";
2370     return false;
2371   }
2372   if (AsValue(&json_value, value))
2373     return true;
2374   if (errors)
2375     *errors = std::string("Wrong type for ") + std::string(key) + ".";
2376   return false;
2377 }
2378 
2379 template <typename Visitor, typename T>
VisitForRead(Visitor * visitor,T * t)2380 inline bool VisitForRead(Visitor* visitor, T* t) {
2381   return Iterate(visitor, t);
2382 }
2383 
2384 class JsonReaderVisitor {
2385  public:
JsonReaderVisitor(Json::Value * object,std::string * errors)2386   JsonReaderVisitor(Json::Value* object, std::string* errors)
2387       : object_(object), errors_(errors) {}
2388 
2389   template <typename T>
Visit(const char * key,T * value) const2390   bool Visit(const char* key, T* value) const {
2391     return ReadValue(object_, key, value, errors_);
2392   }
2393 
2394   template <typename T, uint32_t N>
VisitArray(const char * key,uint32_t count,T (* value)[N])2395   bool VisitArray(const char* key, uint32_t count, T (*value)[N]) {
2396     if (count > N)
2397       return false;
2398     Json::Value json_value = (*object_)[key];
2399     if (!json_value) {
2400       if (errors_)
2401         *errors_ = std::string(key) + " missing.";
2402       return false;
2403     }
2404     if (AsArray(&json_value, count, *value))
2405       return true;
2406     if (errors_)
2407       *errors_ = std::string("Wrong type for ") + std::string(key) + ".";
2408     return false;
2409   }
2410 
2411   template <typename T>
VisitArray(const char * key,uint32_t count,T * value)2412   bool VisitArray(const char* key, uint32_t count, T* value) {
2413     Json::Value json_value = (*object_)[key];
2414     if (!json_value) {
2415       if (errors_)
2416         *errors_ = std::string(key) + " missing.";
2417       return false;
2418     }
2419     if (AsArray(&json_value, count, *value))
2420       return true;
2421     if (errors_)
2422       *errors_ = std::string("Wrong type for ") + std::string(key) + ".";
2423     return false;
2424   }
2425 
2426  private:
2427   Json::Value* object_;
2428   std::string* errors_;
2429 };
2430 
2431 template <typename T, typename /*= EnableForStruct<T>*/>
AsValue(Json::Value * json_value,T * t)2432 bool AsValue(Json::Value* json_value, T* t) {
2433   if (json_value->type() != Json::objectValue)
2434     return false;
2435   JsonReaderVisitor visitor(json_value, nullptr);
2436   return VisitForRead(&visitor, t);
2437 }
2438 
2439 template <typename T>
VkTypeToJson(const T & t)2440 std::string VkTypeToJson(const T& t) {
2441   JsonWriterVisitor visitor;
2442   VisitForWrite(&visitor, t);
2443   return visitor.get_object().toStyledString();
2444 }
2445 
2446 template <typename T>
VkTypeFromJson(const std::string & json,T * t,std::string * errors)2447 bool VkTypeFromJson(const std::string& json, T* t, std::string* errors) {
2448   *t = T();
2449   Json::Value object(Json::objectValue);
2450   Json::CharReaderBuilder builder;
2451   builder["collectComments"] = false;
2452   std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
2453   if (!reader->parse(json.data(), json.data() + json.size(), &object, errors)) {
2454     return false;
2455   }
2456   return AsValue(&object, t);
2457 }
2458 
2459 }  // anonymous namespace
2460 
VkJsonInstanceToJson(const VkJsonInstance & instance)2461 std::string VkJsonInstanceToJson(const VkJsonInstance& instance) {
2462   return VkTypeToJson(instance);
2463 }
2464 
VkJsonInstanceFromJson(const std::string & json,VkJsonInstance * instance,std::string * errors)2465 bool VkJsonInstanceFromJson(const std::string& json,
2466                             VkJsonInstance* instance,
2467                             std::string* errors) {
2468   return VkTypeFromJson(json, instance, errors);
2469 }
2470 
VkJsonDeviceToJson(const VkJsonDevice & device)2471 std::string VkJsonDeviceToJson(const VkJsonDevice& device) {
2472   return VkTypeToJson(device);
2473 }
2474 
VkJsonDeviceFromJson(const std::string & json,VkJsonDevice * device,std::string * errors)2475 bool VkJsonDeviceFromJson(const std::string& json,
2476                           VkJsonDevice* device,
2477                           std::string* errors) {
2478   return VkTypeFromJson(json, device, errors);
2479 };
2480 
VkJsonImageFormatPropertiesToJson(const VkImageFormatProperties & properties)2481 std::string VkJsonImageFormatPropertiesToJson(
2482     const VkImageFormatProperties& properties) {
2483   return VkTypeToJson(properties);
2484 }
2485 
VkJsonImageFormatPropertiesFromJson(const std::string & json,VkImageFormatProperties * properties,std::string * errors)2486 bool VkJsonImageFormatPropertiesFromJson(const std::string& json,
2487                                          VkImageFormatProperties* properties,
2488                                          std::string* errors) {
2489   return VkTypeFromJson(json, properties, errors);
2490 };
2491