03c32e0415c9975f56b680450356239ae4b6dadc
[platform/upstream/Vulkan-Tools.git] / vulkaninfo / generated / vulkaninfo.hpp
1
2 /*
3  * Copyright (c) 2019 The Khronos Group Inc.
4  * Copyright (c) 2019 Valve Corporation
5  * Copyright (c) 2019 LunarG, Inc.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  * Author: Charles Giessen <charles@lunarg.com>
20  *
21  */
22
23 /*
24  * This file is generated from the Khronos Vulkan XML API Registry.
25  */
26
27 #include "vulkaninfo.h"
28 #include "outputprinter.h"
29
30 void DumpVkConformanceVersion(Printer &p, std::string name, VkConformanceVersion &c, int width = 0) {
31     p.PrintKeyString("conformanceVersion", std::to_string(c.major)+ "." + std::to_string(c.minor) + "." + std::to_string(c.subminor) + "."
32              + std::to_string(c.patch), width);
33 }
34
35 template <typename T>
36 std::string to_hex_str(T i) {
37     std::stringstream stream;
38     stream << "0x" << std::setfill('0') << std::setw(sizeof(T)) << std::hex << i;
39     return stream.str();
40 }
41
42 template <typename T>
43 std::string to_hex_str(Printer &p, T i) {
44     if (p.Type() == OutputType::json)
45         return std::to_string(i);
46     else if (p.Type() == OutputType::vkconfig_output)
47         return std::string("\"") + to_hex_str(i) + std::string("\"");
48     else
49         return to_hex_str(i);
50 }
51 static const char *VkResultString(VkResult value) {
52     switch (value) {
53         case (0): return "SUCCESS";
54         case (1): return "NOT_READY";
55         case (2): return "TIMEOUT";
56         case (3): return "EVENT_SET";
57         case (4): return "EVENT_RESET";
58         case (5): return "INCOMPLETE";
59         case (-1): return "ERROR_OUT_OF_HOST_MEMORY";
60         case (-2): return "ERROR_OUT_OF_DEVICE_MEMORY";
61         case (-3): return "ERROR_INITIALIZATION_FAILED";
62         case (-4): return "ERROR_DEVICE_LOST";
63         case (-5): return "ERROR_MEMORY_MAP_FAILED";
64         case (-6): return "ERROR_LAYER_NOT_PRESENT";
65         case (-7): return "ERROR_EXTENSION_NOT_PRESENT";
66         case (-8): return "ERROR_FEATURE_NOT_PRESENT";
67         case (-9): return "ERROR_INCOMPATIBLE_DRIVER";
68         case (-10): return "ERROR_TOO_MANY_OBJECTS";
69         case (-11): return "ERROR_FORMAT_NOT_SUPPORTED";
70         case (-12): return "ERROR_FRAGMENTED_POOL";
71         case (-13): return "ERROR_UNKNOWN";
72         case (-1000069000): return "ERROR_OUT_OF_POOL_MEMORY";
73         case (-1000072003): return "ERROR_INVALID_EXTERNAL_HANDLE";
74         case (-1000161000): return "ERROR_FRAGMENTATION";
75         case (-1000257000): return "ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS";
76         case (-1000000000): return "ERROR_SURFACE_LOST_KHR";
77         case (-1000000001): return "ERROR_NATIVE_WINDOW_IN_USE_KHR";
78         case (1000001003): return "SUBOPTIMAL_KHR";
79         case (-1000001004): return "ERROR_OUT_OF_DATE_KHR";
80         case (-1000003001): return "ERROR_INCOMPATIBLE_DISPLAY_KHR";
81         case (-1000011001): return "ERROR_VALIDATION_FAILED_EXT";
82         case (-1000012000): return "ERROR_INVALID_SHADER_NV";
83         case (-1000150000): return "ERROR_INCOMPATIBLE_VERSION_KHR";
84         case (-1000158000): return "ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT";
85         case (-1000174001): return "ERROR_NOT_PERMITTED_EXT";
86         case (-1000255000): return "ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT";
87         case (1000268000): return "THREAD_IDLE_KHR";
88         case (1000268001): return "THREAD_DONE_KHR";
89         case (1000268002): return "OPERATION_DEFERRED_KHR";
90         case (1000268003): return "OPERATION_NOT_DEFERRED_KHR";
91         case (1000297000): return "PIPELINE_COMPILE_REQUIRED_EXT";
92         default: return "UNKNOWN_VkResult";
93     }
94 }
95 void DumpVkResult(Printer &p, std::string name, VkResult value, int width = 0) {
96     if (p.Type() == OutputType::json) {
97         p.PrintKeyValue(name, value, width);
98     } else {
99         p.PrintKeyString(name, VkResultString(value), width);
100     }
101 }
102 static const char *VkFormatString(VkFormat value) {
103     switch (value) {
104         case (0): return "FORMAT_UNDEFINED";
105         case (1): return "FORMAT_R4G4_UNORM_PACK8";
106         case (2): return "FORMAT_R4G4B4A4_UNORM_PACK16";
107         case (3): return "FORMAT_B4G4R4A4_UNORM_PACK16";
108         case (4): return "FORMAT_R5G6B5_UNORM_PACK16";
109         case (5): return "FORMAT_B5G6R5_UNORM_PACK16";
110         case (6): return "FORMAT_R5G5B5A1_UNORM_PACK16";
111         case (7): return "FORMAT_B5G5R5A1_UNORM_PACK16";
112         case (8): return "FORMAT_A1R5G5B5_UNORM_PACK16";
113         case (9): return "FORMAT_R8_UNORM";
114         case (10): return "FORMAT_R8_SNORM";
115         case (11): return "FORMAT_R8_USCALED";
116         case (12): return "FORMAT_R8_SSCALED";
117         case (13): return "FORMAT_R8_UINT";
118         case (14): return "FORMAT_R8_SINT";
119         case (15): return "FORMAT_R8_SRGB";
120         case (16): return "FORMAT_R8G8_UNORM";
121         case (17): return "FORMAT_R8G8_SNORM";
122         case (18): return "FORMAT_R8G8_USCALED";
123         case (19): return "FORMAT_R8G8_SSCALED";
124         case (20): return "FORMAT_R8G8_UINT";
125         case (21): return "FORMAT_R8G8_SINT";
126         case (22): return "FORMAT_R8G8_SRGB";
127         case (23): return "FORMAT_R8G8B8_UNORM";
128         case (24): return "FORMAT_R8G8B8_SNORM";
129         case (25): return "FORMAT_R8G8B8_USCALED";
130         case (26): return "FORMAT_R8G8B8_SSCALED";
131         case (27): return "FORMAT_R8G8B8_UINT";
132         case (28): return "FORMAT_R8G8B8_SINT";
133         case (29): return "FORMAT_R8G8B8_SRGB";
134         case (30): return "FORMAT_B8G8R8_UNORM";
135         case (31): return "FORMAT_B8G8R8_SNORM";
136         case (32): return "FORMAT_B8G8R8_USCALED";
137         case (33): return "FORMAT_B8G8R8_SSCALED";
138         case (34): return "FORMAT_B8G8R8_UINT";
139         case (35): return "FORMAT_B8G8R8_SINT";
140         case (36): return "FORMAT_B8G8R8_SRGB";
141         case (37): return "FORMAT_R8G8B8A8_UNORM";
142         case (38): return "FORMAT_R8G8B8A8_SNORM";
143         case (39): return "FORMAT_R8G8B8A8_USCALED";
144         case (40): return "FORMAT_R8G8B8A8_SSCALED";
145         case (41): return "FORMAT_R8G8B8A8_UINT";
146         case (42): return "FORMAT_R8G8B8A8_SINT";
147         case (43): return "FORMAT_R8G8B8A8_SRGB";
148         case (44): return "FORMAT_B8G8R8A8_UNORM";
149         case (45): return "FORMAT_B8G8R8A8_SNORM";
150         case (46): return "FORMAT_B8G8R8A8_USCALED";
151         case (47): return "FORMAT_B8G8R8A8_SSCALED";
152         case (48): return "FORMAT_B8G8R8A8_UINT";
153         case (49): return "FORMAT_B8G8R8A8_SINT";
154         case (50): return "FORMAT_B8G8R8A8_SRGB";
155         case (51): return "FORMAT_A8B8G8R8_UNORM_PACK32";
156         case (52): return "FORMAT_A8B8G8R8_SNORM_PACK32";
157         case (53): return "FORMAT_A8B8G8R8_USCALED_PACK32";
158         case (54): return "FORMAT_A8B8G8R8_SSCALED_PACK32";
159         case (55): return "FORMAT_A8B8G8R8_UINT_PACK32";
160         case (56): return "FORMAT_A8B8G8R8_SINT_PACK32";
161         case (57): return "FORMAT_A8B8G8R8_SRGB_PACK32";
162         case (58): return "FORMAT_A2R10G10B10_UNORM_PACK32";
163         case (59): return "FORMAT_A2R10G10B10_SNORM_PACK32";
164         case (60): return "FORMAT_A2R10G10B10_USCALED_PACK32";
165         case (61): return "FORMAT_A2R10G10B10_SSCALED_PACK32";
166         case (62): return "FORMAT_A2R10G10B10_UINT_PACK32";
167         case (63): return "FORMAT_A2R10G10B10_SINT_PACK32";
168         case (64): return "FORMAT_A2B10G10R10_UNORM_PACK32";
169         case (65): return "FORMAT_A2B10G10R10_SNORM_PACK32";
170         case (66): return "FORMAT_A2B10G10R10_USCALED_PACK32";
171         case (67): return "FORMAT_A2B10G10R10_SSCALED_PACK32";
172         case (68): return "FORMAT_A2B10G10R10_UINT_PACK32";
173         case (69): return "FORMAT_A2B10G10R10_SINT_PACK32";
174         case (70): return "FORMAT_R16_UNORM";
175         case (71): return "FORMAT_R16_SNORM";
176         case (72): return "FORMAT_R16_USCALED";
177         case (73): return "FORMAT_R16_SSCALED";
178         case (74): return "FORMAT_R16_UINT";
179         case (75): return "FORMAT_R16_SINT";
180         case (76): return "FORMAT_R16_SFLOAT";
181         case (77): return "FORMAT_R16G16_UNORM";
182         case (78): return "FORMAT_R16G16_SNORM";
183         case (79): return "FORMAT_R16G16_USCALED";
184         case (80): return "FORMAT_R16G16_SSCALED";
185         case (81): return "FORMAT_R16G16_UINT";
186         case (82): return "FORMAT_R16G16_SINT";
187         case (83): return "FORMAT_R16G16_SFLOAT";
188         case (84): return "FORMAT_R16G16B16_UNORM";
189         case (85): return "FORMAT_R16G16B16_SNORM";
190         case (86): return "FORMAT_R16G16B16_USCALED";
191         case (87): return "FORMAT_R16G16B16_SSCALED";
192         case (88): return "FORMAT_R16G16B16_UINT";
193         case (89): return "FORMAT_R16G16B16_SINT";
194         case (90): return "FORMAT_R16G16B16_SFLOAT";
195         case (91): return "FORMAT_R16G16B16A16_UNORM";
196         case (92): return "FORMAT_R16G16B16A16_SNORM";
197         case (93): return "FORMAT_R16G16B16A16_USCALED";
198         case (94): return "FORMAT_R16G16B16A16_SSCALED";
199         case (95): return "FORMAT_R16G16B16A16_UINT";
200         case (96): return "FORMAT_R16G16B16A16_SINT";
201         case (97): return "FORMAT_R16G16B16A16_SFLOAT";
202         case (98): return "FORMAT_R32_UINT";
203         case (99): return "FORMAT_R32_SINT";
204         case (100): return "FORMAT_R32_SFLOAT";
205         case (101): return "FORMAT_R32G32_UINT";
206         case (102): return "FORMAT_R32G32_SINT";
207         case (103): return "FORMAT_R32G32_SFLOAT";
208         case (104): return "FORMAT_R32G32B32_UINT";
209         case (105): return "FORMAT_R32G32B32_SINT";
210         case (106): return "FORMAT_R32G32B32_SFLOAT";
211         case (107): return "FORMAT_R32G32B32A32_UINT";
212         case (108): return "FORMAT_R32G32B32A32_SINT";
213         case (109): return "FORMAT_R32G32B32A32_SFLOAT";
214         case (110): return "FORMAT_R64_UINT";
215         case (111): return "FORMAT_R64_SINT";
216         case (112): return "FORMAT_R64_SFLOAT";
217         case (113): return "FORMAT_R64G64_UINT";
218         case (114): return "FORMAT_R64G64_SINT";
219         case (115): return "FORMAT_R64G64_SFLOAT";
220         case (116): return "FORMAT_R64G64B64_UINT";
221         case (117): return "FORMAT_R64G64B64_SINT";
222         case (118): return "FORMAT_R64G64B64_SFLOAT";
223         case (119): return "FORMAT_R64G64B64A64_UINT";
224         case (120): return "FORMAT_R64G64B64A64_SINT";
225         case (121): return "FORMAT_R64G64B64A64_SFLOAT";
226         case (122): return "FORMAT_B10G11R11_UFLOAT_PACK32";
227         case (123): return "FORMAT_E5B9G9R9_UFLOAT_PACK32";
228         case (124): return "FORMAT_D16_UNORM";
229         case (125): return "FORMAT_X8_D24_UNORM_PACK32";
230         case (126): return "FORMAT_D32_SFLOAT";
231         case (127): return "FORMAT_S8_UINT";
232         case (128): return "FORMAT_D16_UNORM_S8_UINT";
233         case (129): return "FORMAT_D24_UNORM_S8_UINT";
234         case (130): return "FORMAT_D32_SFLOAT_S8_UINT";
235         case (131): return "FORMAT_BC1_RGB_UNORM_BLOCK";
236         case (132): return "FORMAT_BC1_RGB_SRGB_BLOCK";
237         case (133): return "FORMAT_BC1_RGBA_UNORM_BLOCK";
238         case (134): return "FORMAT_BC1_RGBA_SRGB_BLOCK";
239         case (135): return "FORMAT_BC2_UNORM_BLOCK";
240         case (136): return "FORMAT_BC2_SRGB_BLOCK";
241         case (137): return "FORMAT_BC3_UNORM_BLOCK";
242         case (138): return "FORMAT_BC3_SRGB_BLOCK";
243         case (139): return "FORMAT_BC4_UNORM_BLOCK";
244         case (140): return "FORMAT_BC4_SNORM_BLOCK";
245         case (141): return "FORMAT_BC5_UNORM_BLOCK";
246         case (142): return "FORMAT_BC5_SNORM_BLOCK";
247         case (143): return "FORMAT_BC6H_UFLOAT_BLOCK";
248         case (144): return "FORMAT_BC6H_SFLOAT_BLOCK";
249         case (145): return "FORMAT_BC7_UNORM_BLOCK";
250         case (146): return "FORMAT_BC7_SRGB_BLOCK";
251         case (147): return "FORMAT_ETC2_R8G8B8_UNORM_BLOCK";
252         case (148): return "FORMAT_ETC2_R8G8B8_SRGB_BLOCK";
253         case (149): return "FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK";
254         case (150): return "FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK";
255         case (151): return "FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK";
256         case (152): return "FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK";
257         case (153): return "FORMAT_EAC_R11_UNORM_BLOCK";
258         case (154): return "FORMAT_EAC_R11_SNORM_BLOCK";
259         case (155): return "FORMAT_EAC_R11G11_UNORM_BLOCK";
260         case (156): return "FORMAT_EAC_R11G11_SNORM_BLOCK";
261         case (157): return "FORMAT_ASTC_4x4_UNORM_BLOCK";
262         case (158): return "FORMAT_ASTC_4x4_SRGB_BLOCK";
263         case (159): return "FORMAT_ASTC_5x4_UNORM_BLOCK";
264         case (160): return "FORMAT_ASTC_5x4_SRGB_BLOCK";
265         case (161): return "FORMAT_ASTC_5x5_UNORM_BLOCK";
266         case (162): return "FORMAT_ASTC_5x5_SRGB_BLOCK";
267         case (163): return "FORMAT_ASTC_6x5_UNORM_BLOCK";
268         case (164): return "FORMAT_ASTC_6x5_SRGB_BLOCK";
269         case (165): return "FORMAT_ASTC_6x6_UNORM_BLOCK";
270         case (166): return "FORMAT_ASTC_6x6_SRGB_BLOCK";
271         case (167): return "FORMAT_ASTC_8x5_UNORM_BLOCK";
272         case (168): return "FORMAT_ASTC_8x5_SRGB_BLOCK";
273         case (169): return "FORMAT_ASTC_8x6_UNORM_BLOCK";
274         case (170): return "FORMAT_ASTC_8x6_SRGB_BLOCK";
275         case (171): return "FORMAT_ASTC_8x8_UNORM_BLOCK";
276         case (172): return "FORMAT_ASTC_8x8_SRGB_BLOCK";
277         case (173): return "FORMAT_ASTC_10x5_UNORM_BLOCK";
278         case (174): return "FORMAT_ASTC_10x5_SRGB_BLOCK";
279         case (175): return "FORMAT_ASTC_10x6_UNORM_BLOCK";
280         case (176): return "FORMAT_ASTC_10x6_SRGB_BLOCK";
281         case (177): return "FORMAT_ASTC_10x8_UNORM_BLOCK";
282         case (178): return "FORMAT_ASTC_10x8_SRGB_BLOCK";
283         case (179): return "FORMAT_ASTC_10x10_UNORM_BLOCK";
284         case (180): return "FORMAT_ASTC_10x10_SRGB_BLOCK";
285         case (181): return "FORMAT_ASTC_12x10_UNORM_BLOCK";
286         case (182): return "FORMAT_ASTC_12x10_SRGB_BLOCK";
287         case (183): return "FORMAT_ASTC_12x12_UNORM_BLOCK";
288         case (184): return "FORMAT_ASTC_12x12_SRGB_BLOCK";
289         case (1000156000): return "FORMAT_G8B8G8R8_422_UNORM";
290         case (1000156001): return "FORMAT_B8G8R8G8_422_UNORM";
291         case (1000156002): return "FORMAT_G8_B8_R8_3PLANE_420_UNORM";
292         case (1000156003): return "FORMAT_G8_B8R8_2PLANE_420_UNORM";
293         case (1000156004): return "FORMAT_G8_B8_R8_3PLANE_422_UNORM";
294         case (1000156005): return "FORMAT_G8_B8R8_2PLANE_422_UNORM";
295         case (1000156006): return "FORMAT_G8_B8_R8_3PLANE_444_UNORM";
296         case (1000156007): return "FORMAT_R10X6_UNORM_PACK16";
297         case (1000156008): return "FORMAT_R10X6G10X6_UNORM_2PACK16";
298         case (1000156009): return "FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16";
299         case (1000156010): return "FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16";
300         case (1000156011): return "FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16";
301         case (1000156012): return "FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16";
302         case (1000156013): return "FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16";
303         case (1000156014): return "FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16";
304         case (1000156015): return "FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16";
305         case (1000156016): return "FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16";
306         case (1000156017): return "FORMAT_R12X4_UNORM_PACK16";
307         case (1000156018): return "FORMAT_R12X4G12X4_UNORM_2PACK16";
308         case (1000156019): return "FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16";
309         case (1000156020): return "FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16";
310         case (1000156021): return "FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16";
311         case (1000156022): return "FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16";
312         case (1000156023): return "FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16";
313         case (1000156024): return "FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16";
314         case (1000156025): return "FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16";
315         case (1000156026): return "FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16";
316         case (1000156027): return "FORMAT_G16B16G16R16_422_UNORM";
317         case (1000156028): return "FORMAT_B16G16R16G16_422_UNORM";
318         case (1000156029): return "FORMAT_G16_B16_R16_3PLANE_420_UNORM";
319         case (1000156030): return "FORMAT_G16_B16R16_2PLANE_420_UNORM";
320         case (1000156031): return "FORMAT_G16_B16_R16_3PLANE_422_UNORM";
321         case (1000156032): return "FORMAT_G16_B16R16_2PLANE_422_UNORM";
322         case (1000156033): return "FORMAT_G16_B16_R16_3PLANE_444_UNORM";
323         case (1000054000): return "FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG";
324         case (1000054001): return "FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG";
325         case (1000054002): return "FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG";
326         case (1000054003): return "FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG";
327         case (1000054004): return "FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG";
328         case (1000054005): return "FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG";
329         case (1000054006): return "FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG";
330         case (1000054007): return "FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG";
331         case (1000066000): return "FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT";
332         case (1000066001): return "FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT";
333         case (1000066002): return "FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT";
334         case (1000066003): return "FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT";
335         case (1000066004): return "FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT";
336         case (1000066005): return "FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT";
337         case (1000066006): return "FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT";
338         case (1000066007): return "FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT";
339         case (1000066008): return "FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT";
340         case (1000066009): return "FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT";
341         case (1000066010): return "FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT";
342         case (1000066011): return "FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT";
343         case (1000066012): return "FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT";
344         case (1000066013): return "FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT";
345         default: return "UNKNOWN_VkFormat";
346     }
347 }
348 void DumpVkFormat(Printer &p, std::string name, VkFormat value, int width = 0) {
349     if (p.Type() == OutputType::json) {
350         p.PrintKeyValue(name, value, width);
351     } else {
352         p.PrintKeyString(name, VkFormatString(value), width);
353     }
354 }
355 static const char *VkImageTilingString(VkImageTiling value) {
356     switch (value) {
357         case (0): return "IMAGE_TILING_OPTIMAL";
358         case (1): return "IMAGE_TILING_LINEAR";
359         case (1000158000): return "IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT";
360         default: return "UNKNOWN_VkImageTiling";
361     }
362 }
363 void DumpVkImageTiling(Printer &p, std::string name, VkImageTiling value, int width = 0) {
364     if (p.Type() == OutputType::json) {
365         p.PrintKeyValue(name, value, width);
366     } else {
367         p.PrintKeyString(name, VkImageTilingString(value), width);
368     }
369 }
370 static const char *VkPhysicalDeviceTypeString(VkPhysicalDeviceType value) {
371     switch (value) {
372         case (0): return "PHYSICAL_DEVICE_TYPE_OTHER";
373         case (1): return "PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU";
374         case (2): return "PHYSICAL_DEVICE_TYPE_DISCRETE_GPU";
375         case (3): return "PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU";
376         case (4): return "PHYSICAL_DEVICE_TYPE_CPU";
377         default: return "UNKNOWN_VkPhysicalDeviceType";
378     }
379 }
380 void DumpVkPhysicalDeviceType(Printer &p, std::string name, VkPhysicalDeviceType value, int width = 0) {
381     if (p.Type() == OutputType::json) {
382         p.PrintKeyValue(name, value, width);
383     } else {
384         p.PrintKeyString(name, VkPhysicalDeviceTypeString(value), width);
385     }
386 }
387 static const char *VkPointClippingBehaviorString(VkPointClippingBehavior value) {
388     switch (value) {
389         case (0): return "POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES";
390         case (1): return "POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY";
391         default: return "UNKNOWN_VkPointClippingBehavior";
392     }
393 }
394 void DumpVkPointClippingBehavior(Printer &p, std::string name, VkPointClippingBehavior value, int width = 0) {
395     if (p.Type() == OutputType::json) {
396         p.PrintKeyValue(name, value, width);
397     } else {
398         p.PrintKeyString(name, VkPointClippingBehaviorString(value), width);
399     }
400 }
401 static const char *VkDriverIdString(VkDriverId value) {
402     switch (value) {
403         case (1): return "DRIVER_ID_AMD_PROPRIETARY";
404         case (2): return "DRIVER_ID_AMD_OPEN_SOURCE";
405         case (3): return "DRIVER_ID_MESA_RADV";
406         case (4): return "DRIVER_ID_NVIDIA_PROPRIETARY";
407         case (5): return "DRIVER_ID_INTEL_PROPRIETARY_WINDOWS";
408         case (6): return "DRIVER_ID_INTEL_OPEN_SOURCE_MESA";
409         case (7): return "DRIVER_ID_IMAGINATION_PROPRIETARY";
410         case (8): return "DRIVER_ID_QUALCOMM_PROPRIETARY";
411         case (9): return "DRIVER_ID_ARM_PROPRIETARY";
412         case (10): return "DRIVER_ID_GOOGLE_SWIFTSHADER";
413         case (11): return "DRIVER_ID_GGP_PROPRIETARY";
414         case (12): return "DRIVER_ID_BROADCOM_PROPRIETARY";
415         default: return "UNKNOWN_VkDriverId";
416     }
417 }
418 void DumpVkDriverId(Printer &p, std::string name, VkDriverId value, int width = 0) {
419     if (p.Type() == OutputType::json) {
420         p.PrintKeyValue(name, value, width);
421     } else {
422         p.PrintKeyString(name, VkDriverIdString(value), width);
423     }
424 }
425 static const char *VkShaderFloatControlsIndependenceString(VkShaderFloatControlsIndependence value) {
426     switch (value) {
427         case (0): return "SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY";
428         case (1): return "SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL";
429         case (2): return "SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE";
430         default: return "UNKNOWN_VkShaderFloatControlsIndependence";
431     }
432 }
433 void DumpVkShaderFloatControlsIndependence(Printer &p, std::string name, VkShaderFloatControlsIndependence value, int width = 0) {
434     if (p.Type() == OutputType::json) {
435         p.PrintKeyValue(name, value, width);
436     } else {
437         p.PrintKeyString(name, VkShaderFloatControlsIndependenceString(value), width);
438     }
439 }
440 static const char *VkPresentModeKHRString(VkPresentModeKHR value) {
441     switch (value) {
442         case (0): return "PRESENT_MODE_IMMEDIATE_KHR";
443         case (1): return "PRESENT_MODE_MAILBOX_KHR";
444         case (2): return "PRESENT_MODE_FIFO_KHR";
445         case (3): return "PRESENT_MODE_FIFO_RELAXED_KHR";
446         case (1000111000): return "PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR";
447         case (1000111001): return "PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR";
448         default: return "UNKNOWN_VkPresentModeKHR";
449     }
450 }
451 void DumpVkPresentModeKHR(Printer &p, std::string name, VkPresentModeKHR value, int width = 0) {
452     if (p.Type() == OutputType::json) {
453         p.PrintKeyValue(name, value, width);
454     } else {
455         p.PrintKeyString(name, VkPresentModeKHRString(value), width);
456     }
457 }
458 static const char *VkColorSpaceKHRString(VkColorSpaceKHR value) {
459     switch (value) {
460         case (0): return "COLOR_SPACE_SRGB_NONLINEAR_KHR";
461         case (1000104001): return "COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT";
462         case (1000104002): return "COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT";
463         case (1000104003): return "COLOR_SPACE_DISPLAY_P3_LINEAR_EXT";
464         case (1000104004): return "COLOR_SPACE_DCI_P3_NONLINEAR_EXT";
465         case (1000104005): return "COLOR_SPACE_BT709_LINEAR_EXT";
466         case (1000104006): return "COLOR_SPACE_BT709_NONLINEAR_EXT";
467         case (1000104007): return "COLOR_SPACE_BT2020_LINEAR_EXT";
468         case (1000104008): return "COLOR_SPACE_HDR10_ST2084_EXT";
469         case (1000104009): return "COLOR_SPACE_DOLBYVISION_EXT";
470         case (1000104010): return "COLOR_SPACE_HDR10_HLG_EXT";
471         case (1000104011): return "COLOR_SPACE_ADOBERGB_LINEAR_EXT";
472         case (1000104012): return "COLOR_SPACE_ADOBERGB_NONLINEAR_EXT";
473         case (1000104013): return "COLOR_SPACE_PASS_THROUGH_EXT";
474         case (1000104014): return "COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT";
475         case (1000213000): return "COLOR_SPACE_DISPLAY_NATIVE_AMD";
476         default: return "UNKNOWN_VkColorSpaceKHR";
477     }
478 }
479 void DumpVkColorSpaceKHR(Printer &p, std::string name, VkColorSpaceKHR value, int width = 0) {
480     if (p.Type() == OutputType::json) {
481         p.PrintKeyValue(name, value, width);
482     } else {
483         p.PrintKeyString(name, VkColorSpaceKHRString(value), width);
484     }
485 }
486 std::vector<const char *>VkFormatFeatureFlagBitsGetStrings(VkFormatFeatureFlagBits value) {
487     std::vector<const char *> strings;
488     if (value == 0) strings.push_back("None");
489     if (0x1 & value) strings.push_back("FORMAT_FEATURE_SAMPLED_IMAGE_BIT");
490     if (0x2 & value) strings.push_back("FORMAT_FEATURE_STORAGE_IMAGE_BIT");
491     if (0x4 & value) strings.push_back("FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT");
492     if (0x8 & value) strings.push_back("FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT");
493     if (0x10 & value) strings.push_back("FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT");
494     if (0x20 & value) strings.push_back("FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT");
495     if (0x40 & value) strings.push_back("FORMAT_FEATURE_VERTEX_BUFFER_BIT");
496     if (0x80 & value) strings.push_back("FORMAT_FEATURE_COLOR_ATTACHMENT_BIT");
497     if (0x100 & value) strings.push_back("FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT");
498     if (0x200 & value) strings.push_back("FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT");
499     if (0x400 & value) strings.push_back("FORMAT_FEATURE_BLIT_SRC_BIT");
500     if (0x800 & value) strings.push_back("FORMAT_FEATURE_BLIT_DST_BIT");
501     if (0x1000 & value) strings.push_back("FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT");
502     if (0x4000 & value) strings.push_back("FORMAT_FEATURE_TRANSFER_SRC_BIT");
503     if (0x8000 & value) strings.push_back("FORMAT_FEATURE_TRANSFER_DST_BIT");
504     if (0x20000 & value) strings.push_back("FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT");
505     if (0x40000 & value) strings.push_back("FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT");
506     if (0x80000 & value) strings.push_back("FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT");
507     if (0x100000 & value) strings.push_back("FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT");
508     if (0x200000 & value) strings.push_back("FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT");
509     if (0x400000 & value) strings.push_back("FORMAT_FEATURE_DISJOINT_BIT");
510     if (0x800000 & value) strings.push_back("FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT");
511     if (0x10000 & value) strings.push_back("FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT");
512     if (0x2000 & value) strings.push_back("FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG");
513     if (0x20000000 & value) strings.push_back("FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR");
514     if (0x1000000 & value) strings.push_back("FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT");
515     return strings;
516 }
517 void DumpVkFormatFeatureFlags(Printer &p, std::string name, VkFormatFeatureFlags value, int width = 0) {
518     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
519     auto strings = VkFormatFeatureFlagBitsGetStrings(static_cast<VkFormatFeatureFlagBits>(value));
520     if (static_cast<VkFormatFeatureFlagBits>(value) == 0) {
521         ArrayWrapper arr(p, name, 0);
522         p.SetAsType().PrintString("None");
523         return;
524     }
525     ArrayWrapper arr(p, name, strings.size());
526     for(auto& str : strings){
527         p.SetAsType().PrintString(str);
528     }
529 }
530 void DumpVkFormatFeatureFlagBits(Printer &p, std::string name, VkFormatFeatureFlagBits value, int width = 0) {
531     auto strings = VkFormatFeatureFlagBitsGetStrings(value);
532     p.PrintKeyString(name, strings.at(0), width);
533 }
534
535 std::vector<const char *>VkImageUsageFlagBitsGetStrings(VkImageUsageFlagBits value) {
536     std::vector<const char *> strings;
537     if (value == 0) strings.push_back("None");
538     if (0x1 & value) strings.push_back("IMAGE_USAGE_TRANSFER_SRC_BIT");
539     if (0x2 & value) strings.push_back("IMAGE_USAGE_TRANSFER_DST_BIT");
540     if (0x4 & value) strings.push_back("IMAGE_USAGE_SAMPLED_BIT");
541     if (0x8 & value) strings.push_back("IMAGE_USAGE_STORAGE_BIT");
542     if (0x10 & value) strings.push_back("IMAGE_USAGE_COLOR_ATTACHMENT_BIT");
543     if (0x20 & value) strings.push_back("IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT");
544     if (0x40 & value) strings.push_back("IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT");
545     if (0x80 & value) strings.push_back("IMAGE_USAGE_INPUT_ATTACHMENT_BIT");
546     if (0x100 & value) strings.push_back("IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV");
547     if (0x200 & value) strings.push_back("IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT");
548     return strings;
549 }
550 void DumpVkImageUsageFlags(Printer &p, std::string name, VkImageUsageFlags value, int width = 0) {
551     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
552     auto strings = VkImageUsageFlagBitsGetStrings(static_cast<VkImageUsageFlagBits>(value));
553     if (static_cast<VkImageUsageFlagBits>(value) == 0) {
554         ArrayWrapper arr(p, name, 0);
555         p.SetAsType().PrintString("None");
556         return;
557     }
558     ArrayWrapper arr(p, name, strings.size());
559     for(auto& str : strings){
560         p.SetAsType().PrintString(str);
561     }
562 }
563 void DumpVkImageUsageFlagBits(Printer &p, std::string name, VkImageUsageFlagBits value, int width = 0) {
564     auto strings = VkImageUsageFlagBitsGetStrings(value);
565     p.PrintKeyString(name, strings.at(0), width);
566 }
567
568 std::vector<const char *>VkSampleCountFlagBitsGetStrings(VkSampleCountFlagBits value) {
569     std::vector<const char *> strings;
570     if (value == 0) strings.push_back("None");
571     if (0x1 & value) strings.push_back("SAMPLE_COUNT_1_BIT");
572     if (0x2 & value) strings.push_back("SAMPLE_COUNT_2_BIT");
573     if (0x4 & value) strings.push_back("SAMPLE_COUNT_4_BIT");
574     if (0x8 & value) strings.push_back("SAMPLE_COUNT_8_BIT");
575     if (0x10 & value) strings.push_back("SAMPLE_COUNT_16_BIT");
576     if (0x20 & value) strings.push_back("SAMPLE_COUNT_32_BIT");
577     if (0x40 & value) strings.push_back("SAMPLE_COUNT_64_BIT");
578     return strings;
579 }
580 void DumpVkSampleCountFlags(Printer &p, std::string name, VkSampleCountFlags value, int width = 0) {
581     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
582     auto strings = VkSampleCountFlagBitsGetStrings(static_cast<VkSampleCountFlagBits>(value));
583     if (static_cast<VkSampleCountFlagBits>(value) == 0) {
584         ArrayWrapper arr(p, name, 0);
585         p.SetAsType().PrintString("None");
586         return;
587     }
588     ArrayWrapper arr(p, name, strings.size());
589     for(auto& str : strings){
590         p.SetAsType().PrintString(str);
591     }
592 }
593 void DumpVkSampleCountFlagBits(Printer &p, std::string name, VkSampleCountFlagBits value, int width = 0) {
594     auto strings = VkSampleCountFlagBitsGetStrings(value);
595     p.PrintKeyString(name, strings.at(0), width);
596 }
597
598 std::string VkQueueFlagsString(VkQueueFlags value, int width = 0) {
599     std::string out;
600     bool is_first = true;
601     if (1 & value) {
602         if (is_first) { is_first = false; } else { out += " | "; }
603         out += "QUEUE_GRAPHICS";
604     }
605     if (2 & value) {
606         if (is_first) { is_first = false; } else { out += " | "; }
607         out += "QUEUE_COMPUTE";
608     }
609     if (4 & value) {
610         if (is_first) { is_first = false; } else { out += " | "; }
611         out += "QUEUE_TRANSFER";
612     }
613     if (8 & value) {
614         if (is_first) { is_first = false; } else { out += " | "; }
615         out += "QUEUE_SPARSE_BINDING";
616     }
617     if (16 & value) {
618         if (is_first) { is_first = false; } else { out += " | "; }
619         out += "QUEUE_PROTECTED";
620     }
621     return out;
622 }
623 std::vector<const char *>VkMemoryPropertyFlagBitsGetStrings(VkMemoryPropertyFlagBits value) {
624     std::vector<const char *> strings;
625     if (value == 0) strings.push_back("None");
626     if (0x1 & value) strings.push_back("MEMORY_PROPERTY_DEVICE_LOCAL_BIT");
627     if (0x2 & value) strings.push_back("MEMORY_PROPERTY_HOST_VISIBLE_BIT");
628     if (0x4 & value) strings.push_back("MEMORY_PROPERTY_HOST_COHERENT_BIT");
629     if (0x8 & value) strings.push_back("MEMORY_PROPERTY_HOST_CACHED_BIT");
630     if (0x10 & value) strings.push_back("MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT");
631     if (0x20 & value) strings.push_back("MEMORY_PROPERTY_PROTECTED_BIT");
632     if (0x40 & value) strings.push_back("MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD");
633     if (0x80 & value) strings.push_back("MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD");
634     return strings;
635 }
636 void DumpVkMemoryPropertyFlags(Printer &p, std::string name, VkMemoryPropertyFlags value, int width = 0) {
637     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
638     auto strings = VkMemoryPropertyFlagBitsGetStrings(static_cast<VkMemoryPropertyFlagBits>(value));
639     if (static_cast<VkMemoryPropertyFlagBits>(value) == 0) {
640         ArrayWrapper arr(p, name, 0);
641         p.SetAsType().PrintString("None");
642         return;
643     }
644     ArrayWrapper arr(p, name, strings.size());
645     for(auto& str : strings){
646         p.SetAsType().PrintString(str);
647     }
648 }
649 void DumpVkMemoryPropertyFlagBits(Printer &p, std::string name, VkMemoryPropertyFlagBits value, int width = 0) {
650     auto strings = VkMemoryPropertyFlagBitsGetStrings(value);
651     p.PrintKeyString(name, strings.at(0), width);
652 }
653
654 std::vector<const char *>VkMemoryHeapFlagBitsGetStrings(VkMemoryHeapFlagBits value) {
655     std::vector<const char *> strings;
656     if (value == 0) strings.push_back("None");
657     if (0x1 & value) strings.push_back("MEMORY_HEAP_DEVICE_LOCAL_BIT");
658     if (0x2 & value) strings.push_back("MEMORY_HEAP_MULTI_INSTANCE_BIT");
659     return strings;
660 }
661 void DumpVkMemoryHeapFlags(Printer &p, std::string name, VkMemoryHeapFlags value, int width = 0) {
662     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
663     auto strings = VkMemoryHeapFlagBitsGetStrings(static_cast<VkMemoryHeapFlagBits>(value));
664     if (static_cast<VkMemoryHeapFlagBits>(value) == 0) {
665         ArrayWrapper arr(p, name, 0);
666         p.SetAsType().PrintString("None");
667         return;
668     }
669     ArrayWrapper arr(p, name, strings.size());
670     for(auto& str : strings){
671         p.SetAsType().PrintString(str);
672     }
673 }
674 void DumpVkMemoryHeapFlagBits(Printer &p, std::string name, VkMemoryHeapFlagBits value, int width = 0) {
675     auto strings = VkMemoryHeapFlagBitsGetStrings(value);
676     p.PrintKeyString(name, strings.at(0), width);
677 }
678
679 std::vector<const char *>VkShaderStageFlagBitsGetStrings(VkShaderStageFlagBits value) {
680     std::vector<const char *> strings;
681     if (value == 0) strings.push_back("None");
682     if (0x1 & value) strings.push_back("SHADER_STAGE_VERTEX_BIT");
683     if (0x2 & value) strings.push_back("SHADER_STAGE_TESSELLATION_CONTROL_BIT");
684     if (0x4 & value) strings.push_back("SHADER_STAGE_TESSELLATION_EVALUATION_BIT");
685     if (0x8 & value) strings.push_back("SHADER_STAGE_GEOMETRY_BIT");
686     if (0x10 & value) strings.push_back("SHADER_STAGE_FRAGMENT_BIT");
687     if (0x20 & value) strings.push_back("SHADER_STAGE_COMPUTE_BIT");
688     if (0x0000001F & value) strings.push_back("SHADER_STAGE_ALL_GRAPHICS");
689     if (0x7FFFFFFF & value) strings.push_back("SHADER_STAGE_ALL");
690     if (0x100 & value) strings.push_back("SHADER_STAGE_RAYGEN_BIT_KHR");
691     if (0x200 & value) strings.push_back("SHADER_STAGE_ANY_HIT_BIT_KHR");
692     if (0x400 & value) strings.push_back("SHADER_STAGE_CLOSEST_HIT_BIT_KHR");
693     if (0x800 & value) strings.push_back("SHADER_STAGE_MISS_BIT_KHR");
694     if (0x1000 & value) strings.push_back("SHADER_STAGE_INTERSECTION_BIT_KHR");
695     if (0x2000 & value) strings.push_back("SHADER_STAGE_CALLABLE_BIT_KHR");
696     if (0x40 & value) strings.push_back("SHADER_STAGE_TASK_BIT_NV");
697     if (0x80 & value) strings.push_back("SHADER_STAGE_MESH_BIT_NV");
698     return strings;
699 }
700 void DumpVkShaderStageFlags(Printer &p, std::string name, VkShaderStageFlags value, int width = 0) {
701     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
702     auto strings = VkShaderStageFlagBitsGetStrings(static_cast<VkShaderStageFlagBits>(value));
703     if (static_cast<VkShaderStageFlagBits>(value) == 0) {
704         ArrayWrapper arr(p, name, 0);
705         p.SetAsType().PrintString("None");
706         return;
707     }
708     ArrayWrapper arr(p, name, strings.size());
709     for(auto& str : strings){
710         p.SetAsType().PrintString(str);
711     }
712 }
713 void DumpVkShaderStageFlagBits(Printer &p, std::string name, VkShaderStageFlagBits value, int width = 0) {
714     auto strings = VkShaderStageFlagBitsGetStrings(value);
715     p.PrintKeyString(name, strings.at(0), width);
716 }
717
718 std::vector<const char *>VkSubgroupFeatureFlagBitsGetStrings(VkSubgroupFeatureFlagBits value) {
719     std::vector<const char *> strings;
720     if (value == 0) strings.push_back("None");
721     if (0x1 & value) strings.push_back("SUBGROUP_FEATURE_BASIC_BIT");
722     if (0x2 & value) strings.push_back("SUBGROUP_FEATURE_VOTE_BIT");
723     if (0x4 & value) strings.push_back("SUBGROUP_FEATURE_ARITHMETIC_BIT");
724     if (0x8 & value) strings.push_back("SUBGROUP_FEATURE_BALLOT_BIT");
725     if (0x10 & value) strings.push_back("SUBGROUP_FEATURE_SHUFFLE_BIT");
726     if (0x20 & value) strings.push_back("SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT");
727     if (0x40 & value) strings.push_back("SUBGROUP_FEATURE_CLUSTERED_BIT");
728     if (0x80 & value) strings.push_back("SUBGROUP_FEATURE_QUAD_BIT");
729     if (0x100 & value) strings.push_back("SUBGROUP_FEATURE_PARTITIONED_BIT_NV");
730     return strings;
731 }
732 void DumpVkSubgroupFeatureFlags(Printer &p, std::string name, VkSubgroupFeatureFlags value, int width = 0) {
733     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
734     auto strings = VkSubgroupFeatureFlagBitsGetStrings(static_cast<VkSubgroupFeatureFlagBits>(value));
735     if (static_cast<VkSubgroupFeatureFlagBits>(value) == 0) {
736         ArrayWrapper arr(p, name, 0);
737         p.SetAsType().PrintString("None");
738         return;
739     }
740     ArrayWrapper arr(p, name, strings.size());
741     for(auto& str : strings){
742         p.SetAsType().PrintString(str);
743     }
744 }
745 void DumpVkSubgroupFeatureFlagBits(Printer &p, std::string name, VkSubgroupFeatureFlagBits value, int width = 0) {
746     auto strings = VkSubgroupFeatureFlagBitsGetStrings(value);
747     p.PrintKeyString(name, strings.at(0), width);
748 }
749
750 std::vector<const char *>VkResolveModeFlagBitsGetStrings(VkResolveModeFlagBits value) {
751     std::vector<const char *> strings;
752     if (value == 0) strings.push_back("None");
753     if (0 & value) strings.push_back("RESOLVE_MODE_NONE");
754     if (0x1 & value) strings.push_back("RESOLVE_MODE_SAMPLE_ZERO_BIT");
755     if (0x2 & value) strings.push_back("RESOLVE_MODE_AVERAGE_BIT");
756     if (0x4 & value) strings.push_back("RESOLVE_MODE_MIN_BIT");
757     if (0x8 & value) strings.push_back("RESOLVE_MODE_MAX_BIT");
758     return strings;
759 }
760 void DumpVkResolveModeFlags(Printer &p, std::string name, VkResolveModeFlags value, int width = 0) {
761     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
762     auto strings = VkResolveModeFlagBitsGetStrings(static_cast<VkResolveModeFlagBits>(value));
763     if (static_cast<VkResolveModeFlagBits>(value) == 0) {
764         ArrayWrapper arr(p, name, 0);
765         p.SetAsType().PrintString("None");
766         return;
767     }
768     ArrayWrapper arr(p, name, strings.size());
769     for(auto& str : strings){
770         p.SetAsType().PrintString(str);
771     }
772 }
773 void DumpVkResolveModeFlagBits(Printer &p, std::string name, VkResolveModeFlagBits value, int width = 0) {
774     auto strings = VkResolveModeFlagBitsGetStrings(value);
775     p.PrintKeyString(name, strings.at(0), width);
776 }
777
778 std::vector<const char *>VkSurfaceTransformFlagBitsKHRGetStrings(VkSurfaceTransformFlagBitsKHR value) {
779     std::vector<const char *> strings;
780     if (value == 0) strings.push_back("None");
781     if (0x1 & value) strings.push_back("SURFACE_TRANSFORM_IDENTITY_BIT_KHR");
782     if (0x2 & value) strings.push_back("SURFACE_TRANSFORM_ROTATE_90_BIT_KHR");
783     if (0x4 & value) strings.push_back("SURFACE_TRANSFORM_ROTATE_180_BIT_KHR");
784     if (0x8 & value) strings.push_back("SURFACE_TRANSFORM_ROTATE_270_BIT_KHR");
785     if (0x10 & value) strings.push_back("SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR");
786     if (0x20 & value) strings.push_back("SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR");
787     if (0x40 & value) strings.push_back("SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR");
788     if (0x80 & value) strings.push_back("SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR");
789     if (0x100 & value) strings.push_back("SURFACE_TRANSFORM_INHERIT_BIT_KHR");
790     return strings;
791 }
792 void DumpVkSurfaceTransformFlagsKHR(Printer &p, std::string name, VkSurfaceTransformFlagsKHR value, int width = 0) {
793     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
794     auto strings = VkSurfaceTransformFlagBitsKHRGetStrings(static_cast<VkSurfaceTransformFlagBitsKHR>(value));
795     if (static_cast<VkSurfaceTransformFlagBitsKHR>(value) == 0) {
796         ArrayWrapper arr(p, name, 0);
797         p.SetAsType().PrintString("None");
798         return;
799     }
800     ArrayWrapper arr(p, name, strings.size());
801     for(auto& str : strings){
802         p.SetAsType().PrintString(str);
803     }
804 }
805 void DumpVkSurfaceTransformFlagBitsKHR(Printer &p, std::string name, VkSurfaceTransformFlagBitsKHR value, int width = 0) {
806     auto strings = VkSurfaceTransformFlagBitsKHRGetStrings(value);
807     p.PrintKeyString(name, strings.at(0), width);
808 }
809
810 std::vector<const char *>VkCompositeAlphaFlagBitsKHRGetStrings(VkCompositeAlphaFlagBitsKHR value) {
811     std::vector<const char *> strings;
812     if (value == 0) strings.push_back("None");
813     if (0x1 & value) strings.push_back("COMPOSITE_ALPHA_OPAQUE_BIT_KHR");
814     if (0x2 & value) strings.push_back("COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR");
815     if (0x4 & value) strings.push_back("COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR");
816     if (0x8 & value) strings.push_back("COMPOSITE_ALPHA_INHERIT_BIT_KHR");
817     return strings;
818 }
819 void DumpVkCompositeAlphaFlagsKHR(Printer &p, std::string name, VkCompositeAlphaFlagsKHR value, int width = 0) {
820     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
821     auto strings = VkCompositeAlphaFlagBitsKHRGetStrings(static_cast<VkCompositeAlphaFlagBitsKHR>(value));
822     if (static_cast<VkCompositeAlphaFlagBitsKHR>(value) == 0) {
823         ArrayWrapper arr(p, name, 0);
824         p.SetAsType().PrintString("None");
825         return;
826     }
827     ArrayWrapper arr(p, name, strings.size());
828     for(auto& str : strings){
829         p.SetAsType().PrintString(str);
830     }
831 }
832 void DumpVkCompositeAlphaFlagBitsKHR(Printer &p, std::string name, VkCompositeAlphaFlagBitsKHR value, int width = 0) {
833     auto strings = VkCompositeAlphaFlagBitsKHRGetStrings(value);
834     p.PrintKeyString(name, strings.at(0), width);
835 }
836
837 std::vector<const char *>VkDeviceGroupPresentModeFlagBitsKHRGetStrings(VkDeviceGroupPresentModeFlagBitsKHR value) {
838     std::vector<const char *> strings;
839     if (value == 0) strings.push_back("None");
840     if (0x1 & value) strings.push_back("DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR");
841     if (0x2 & value) strings.push_back("DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR");
842     if (0x4 & value) strings.push_back("DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR");
843     if (0x8 & value) strings.push_back("DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR");
844     return strings;
845 }
846 void DumpVkDeviceGroupPresentModeFlagsKHR(Printer &p, std::string name, VkDeviceGroupPresentModeFlagsKHR value, int width = 0) {
847     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
848     auto strings = VkDeviceGroupPresentModeFlagBitsKHRGetStrings(static_cast<VkDeviceGroupPresentModeFlagBitsKHR>(value));
849     if (static_cast<VkDeviceGroupPresentModeFlagBitsKHR>(value) == 0) {
850         ArrayWrapper arr(p, name, 0);
851         p.SetAsType().PrintString("None");
852         return;
853     }
854     ArrayWrapper arr(p, name, strings.size());
855     for(auto& str : strings){
856         p.SetAsType().PrintString(str);
857     }
858 }
859 void DumpVkDeviceGroupPresentModeFlagBitsKHR(Printer &p, std::string name, VkDeviceGroupPresentModeFlagBitsKHR value, int width = 0) {
860     auto strings = VkDeviceGroupPresentModeFlagBitsKHRGetStrings(value);
861     p.PrintKeyString(name, strings.at(0), width);
862 }
863
864 std::vector<const char *>VkSurfaceCounterFlagBitsEXTGetStrings(VkSurfaceCounterFlagBitsEXT value) {
865     std::vector<const char *> strings;
866     if (value == 0) strings.push_back("None");
867     if (0x1 & value) strings.push_back("SURFACE_COUNTER_VBLANK_EXT");
868     return strings;
869 }
870 void DumpVkSurfaceCounterFlagsEXT(Printer &p, std::string name, VkSurfaceCounterFlagsEXT value, int width = 0) {
871     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
872     auto strings = VkSurfaceCounterFlagBitsEXTGetStrings(static_cast<VkSurfaceCounterFlagBitsEXT>(value));
873     if (static_cast<VkSurfaceCounterFlagBitsEXT>(value) == 0) {
874         ArrayWrapper arr(p, name, 0);
875         p.SetAsType().PrintString("None");
876         return;
877     }
878     ArrayWrapper arr(p, name, strings.size());
879     for(auto& str : strings){
880         p.SetAsType().PrintString(str);
881     }
882 }
883 void DumpVkSurfaceCounterFlagBitsEXT(Printer &p, std::string name, VkSurfaceCounterFlagBitsEXT value, int width = 0) {
884     auto strings = VkSurfaceCounterFlagBitsEXTGetStrings(value);
885     p.PrintKeyString(name, strings.at(0), width);
886 }
887
888 std::vector<const char *>VkToolPurposeFlagBitsEXTGetStrings(VkToolPurposeFlagBitsEXT value) {
889     std::vector<const char *> strings;
890     if (value == 0) strings.push_back("None");
891     if (0x1 & value) strings.push_back("TOOL_PURPOSE_VALIDATION_BIT_EXT");
892     if (0x2 & value) strings.push_back("TOOL_PURPOSE_PROFILING_BIT_EXT");
893     if (0x4 & value) strings.push_back("TOOL_PURPOSE_TRACING_BIT_EXT");
894     if (0x8 & value) strings.push_back("TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT_EXT");
895     if (0x10 & value) strings.push_back("TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT");
896     if (0x20 & value) strings.push_back("TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT");
897     if (0x40 & value) strings.push_back("TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT");
898     return strings;
899 }
900 void DumpVkToolPurposeFlagsEXT(Printer &p, std::string name, VkToolPurposeFlagsEXT value, int width = 0) {
901     if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }
902     auto strings = VkToolPurposeFlagBitsEXTGetStrings(static_cast<VkToolPurposeFlagBitsEXT>(value));
903     if (static_cast<VkToolPurposeFlagBitsEXT>(value) == 0) {
904         ArrayWrapper arr(p, name, 0);
905         p.SetAsType().PrintString("None");
906         return;
907     }
908     ArrayWrapper arr(p, name, strings.size());
909     for(auto& str : strings){
910         p.SetAsType().PrintString(str);
911     }
912 }
913 void DumpVkToolPurposeFlagBitsEXT(Printer &p, std::string name, VkToolPurposeFlagBitsEXT value, int width = 0) {
914     auto strings = VkToolPurposeFlagBitsEXTGetStrings(value);
915     p.PrintKeyString(name, strings.at(0), width);
916 }
917
918 void DumpVkPhysicalDeviceFeatures(Printer &p, std::string name, VkPhysicalDeviceFeatures &obj) {
919     ObjectWrapper object{p, name};
920     p.PrintKeyBool("robustBufferAccess", static_cast<bool>(obj.robustBufferAccess), 39);
921     p.PrintKeyBool("fullDrawIndexUint32", static_cast<bool>(obj.fullDrawIndexUint32), 39);
922     p.PrintKeyBool("imageCubeArray", static_cast<bool>(obj.imageCubeArray), 39);
923     p.PrintKeyBool("independentBlend", static_cast<bool>(obj.independentBlend), 39);
924     p.PrintKeyBool("geometryShader", static_cast<bool>(obj.geometryShader), 39);
925     p.PrintKeyBool("tessellationShader", static_cast<bool>(obj.tessellationShader), 39);
926     p.PrintKeyBool("sampleRateShading", static_cast<bool>(obj.sampleRateShading), 39);
927     p.PrintKeyBool("dualSrcBlend", static_cast<bool>(obj.dualSrcBlend), 39);
928     p.PrintKeyBool("logicOp", static_cast<bool>(obj.logicOp), 39);
929     p.PrintKeyBool("multiDrawIndirect", static_cast<bool>(obj.multiDrawIndirect), 39);
930     p.PrintKeyBool("drawIndirectFirstInstance", static_cast<bool>(obj.drawIndirectFirstInstance), 39);
931     p.PrintKeyBool("depthClamp", static_cast<bool>(obj.depthClamp), 39);
932     p.PrintKeyBool("depthBiasClamp", static_cast<bool>(obj.depthBiasClamp), 39);
933     p.PrintKeyBool("fillModeNonSolid", static_cast<bool>(obj.fillModeNonSolid), 39);
934     p.PrintKeyBool("depthBounds", static_cast<bool>(obj.depthBounds), 39);
935     p.PrintKeyBool("wideLines", static_cast<bool>(obj.wideLines), 39);
936     p.PrintKeyBool("largePoints", static_cast<bool>(obj.largePoints), 39);
937     p.PrintKeyBool("alphaToOne", static_cast<bool>(obj.alphaToOne), 39);
938     p.PrintKeyBool("multiViewport", static_cast<bool>(obj.multiViewport), 39);
939     p.PrintKeyBool("samplerAnisotropy", static_cast<bool>(obj.samplerAnisotropy), 39);
940     p.PrintKeyBool("textureCompressionETC2", static_cast<bool>(obj.textureCompressionETC2), 39);
941     p.PrintKeyBool("textureCompressionASTC_LDR", static_cast<bool>(obj.textureCompressionASTC_LDR), 39);
942     p.PrintKeyBool("textureCompressionBC", static_cast<bool>(obj.textureCompressionBC), 39);
943     p.PrintKeyBool("occlusionQueryPrecise", static_cast<bool>(obj.occlusionQueryPrecise), 39);
944     p.PrintKeyBool("pipelineStatisticsQuery", static_cast<bool>(obj.pipelineStatisticsQuery), 39);
945     p.PrintKeyBool("vertexPipelineStoresAndAtomics", static_cast<bool>(obj.vertexPipelineStoresAndAtomics), 39);
946     p.PrintKeyBool("fragmentStoresAndAtomics", static_cast<bool>(obj.fragmentStoresAndAtomics), 39);
947     p.PrintKeyBool("shaderTessellationAndGeometryPointSize", static_cast<bool>(obj.shaderTessellationAndGeometryPointSize), 39);
948     p.PrintKeyBool("shaderImageGatherExtended", static_cast<bool>(obj.shaderImageGatherExtended), 39);
949     p.PrintKeyBool("shaderStorageImageExtendedFormats", static_cast<bool>(obj.shaderStorageImageExtendedFormats), 39);
950     p.PrintKeyBool("shaderStorageImageMultisample", static_cast<bool>(obj.shaderStorageImageMultisample), 39);
951     p.PrintKeyBool("shaderStorageImageReadWithoutFormat", static_cast<bool>(obj.shaderStorageImageReadWithoutFormat), 39);
952     p.PrintKeyBool("shaderStorageImageWriteWithoutFormat", static_cast<bool>(obj.shaderStorageImageWriteWithoutFormat), 39);
953     p.PrintKeyBool("shaderUniformBufferArrayDynamicIndexing", static_cast<bool>(obj.shaderUniformBufferArrayDynamicIndexing), 39);
954     p.PrintKeyBool("shaderSampledImageArrayDynamicIndexing", static_cast<bool>(obj.shaderSampledImageArrayDynamicIndexing), 39);
955     p.PrintKeyBool("shaderStorageBufferArrayDynamicIndexing", static_cast<bool>(obj.shaderStorageBufferArrayDynamicIndexing), 39);
956     p.PrintKeyBool("shaderStorageImageArrayDynamicIndexing", static_cast<bool>(obj.shaderStorageImageArrayDynamicIndexing), 39);
957     p.PrintKeyBool("shaderClipDistance", static_cast<bool>(obj.shaderClipDistance), 39);
958     p.PrintKeyBool("shaderCullDistance", static_cast<bool>(obj.shaderCullDistance), 39);
959     p.PrintKeyBool("shaderFloat64", static_cast<bool>(obj.shaderFloat64), 39);
960     p.PrintKeyBool("shaderInt64", static_cast<bool>(obj.shaderInt64), 39);
961     p.PrintKeyBool("shaderInt16", static_cast<bool>(obj.shaderInt16), 39);
962     p.PrintKeyBool("shaderResourceResidency", static_cast<bool>(obj.shaderResourceResidency), 39);
963     p.PrintKeyBool("shaderResourceMinLod", static_cast<bool>(obj.shaderResourceMinLod), 39);
964     p.PrintKeyBool("sparseBinding", static_cast<bool>(obj.sparseBinding), 39);
965     p.PrintKeyBool("sparseResidencyBuffer", static_cast<bool>(obj.sparseResidencyBuffer), 39);
966     p.PrintKeyBool("sparseResidencyImage2D", static_cast<bool>(obj.sparseResidencyImage2D), 39);
967     p.PrintKeyBool("sparseResidencyImage3D", static_cast<bool>(obj.sparseResidencyImage3D), 39);
968     p.PrintKeyBool("sparseResidency2Samples", static_cast<bool>(obj.sparseResidency2Samples), 39);
969     p.PrintKeyBool("sparseResidency4Samples", static_cast<bool>(obj.sparseResidency4Samples), 39);
970     p.PrintKeyBool("sparseResidency8Samples", static_cast<bool>(obj.sparseResidency8Samples), 39);
971     p.PrintKeyBool("sparseResidency16Samples", static_cast<bool>(obj.sparseResidency16Samples), 39);
972     p.PrintKeyBool("sparseResidencyAliased", static_cast<bool>(obj.sparseResidencyAliased), 39);
973     p.PrintKeyBool("variableMultisampleRate", static_cast<bool>(obj.variableMultisampleRate), 39);
974     p.PrintKeyBool("inheritedQueries", static_cast<bool>(obj.inheritedQueries), 39);
975 }
976 void DumpVkExtent3D(Printer &p, std::string name, VkExtent3D &obj) {
977     ObjectWrapper object{p, name};
978     p.PrintKeyValue("width", obj.width, 6);
979     p.PrintKeyValue("height", obj.height, 6);
980     p.PrintKeyValue("depth", obj.depth, 6);
981 }
982 void DumpVkPhysicalDeviceLimits(Printer &p, std::string name, VkPhysicalDeviceLimits &obj) {
983     if (p.Type() == OutputType::json)
984         p.ObjectStart("limits");
985     else
986         p.SetSubHeader().ObjectStart(name);
987     p.PrintKeyValue("maxImageDimension1D", obj.maxImageDimension1D, 47);
988     p.PrintKeyValue("maxImageDimension2D", obj.maxImageDimension2D, 47);
989     p.PrintKeyValue("maxImageDimension3D", obj.maxImageDimension3D, 47);
990     p.PrintKeyValue("maxImageDimensionCube", obj.maxImageDimensionCube, 47);
991     p.PrintKeyValue("maxImageArrayLayers", obj.maxImageArrayLayers, 47);
992     p.PrintKeyValue("maxTexelBufferElements", obj.maxTexelBufferElements, 47);
993     p.PrintKeyValue("maxUniformBufferRange", obj.maxUniformBufferRange, 47);
994     p.PrintKeyValue("maxStorageBufferRange", obj.maxStorageBufferRange, 47);
995     p.PrintKeyValue("maxPushConstantsSize", obj.maxPushConstantsSize, 47);
996     p.PrintKeyValue("maxMemoryAllocationCount", obj.maxMemoryAllocationCount, 47);
997     p.PrintKeyValue("maxSamplerAllocationCount", obj.maxSamplerAllocationCount, 47);
998     p.PrintKeyValue("bufferImageGranularity", to_hex_str(p, obj.bufferImageGranularity), 47);
999     p.PrintKeyValue("sparseAddressSpaceSize", to_hex_str(p, obj.sparseAddressSpaceSize), 47);
1000     p.PrintKeyValue("maxBoundDescriptorSets", obj.maxBoundDescriptorSets, 47);
1001     p.PrintKeyValue("maxPerStageDescriptorSamplers", obj.maxPerStageDescriptorSamplers, 47);
1002     p.PrintKeyValue("maxPerStageDescriptorUniformBuffers", obj.maxPerStageDescriptorUniformBuffers, 47);
1003     p.PrintKeyValue("maxPerStageDescriptorStorageBuffers", obj.maxPerStageDescriptorStorageBuffers, 47);
1004     p.PrintKeyValue("maxPerStageDescriptorSampledImages", obj.maxPerStageDescriptorSampledImages, 47);
1005     p.PrintKeyValue("maxPerStageDescriptorStorageImages", obj.maxPerStageDescriptorStorageImages, 47);
1006     p.PrintKeyValue("maxPerStageDescriptorInputAttachments", obj.maxPerStageDescriptorInputAttachments, 47);
1007     p.PrintKeyValue("maxPerStageResources", obj.maxPerStageResources, 47);
1008     p.PrintKeyValue("maxDescriptorSetSamplers", obj.maxDescriptorSetSamplers, 47);
1009     p.PrintKeyValue("maxDescriptorSetUniformBuffers", obj.maxDescriptorSetUniformBuffers, 47);
1010     p.PrintKeyValue("maxDescriptorSetUniformBuffersDynamic", obj.maxDescriptorSetUniformBuffersDynamic, 47);
1011     p.PrintKeyValue("maxDescriptorSetStorageBuffers", obj.maxDescriptorSetStorageBuffers, 47);
1012     p.PrintKeyValue("maxDescriptorSetStorageBuffersDynamic", obj.maxDescriptorSetStorageBuffersDynamic, 47);
1013     p.PrintKeyValue("maxDescriptorSetSampledImages", obj.maxDescriptorSetSampledImages, 47);
1014     p.PrintKeyValue("maxDescriptorSetStorageImages", obj.maxDescriptorSetStorageImages, 47);
1015     p.PrintKeyValue("maxDescriptorSetInputAttachments", obj.maxDescriptorSetInputAttachments, 47);
1016     p.PrintKeyValue("maxVertexInputAttributes", obj.maxVertexInputAttributes, 47);
1017     p.PrintKeyValue("maxVertexInputBindings", obj.maxVertexInputBindings, 47);
1018     p.PrintKeyValue("maxVertexInputAttributeOffset", obj.maxVertexInputAttributeOffset, 47);
1019     p.PrintKeyValue("maxVertexInputBindingStride", obj.maxVertexInputBindingStride, 47);
1020     p.PrintKeyValue("maxVertexOutputComponents", obj.maxVertexOutputComponents, 47);
1021     p.PrintKeyValue("maxTessellationGenerationLevel", obj.maxTessellationGenerationLevel, 47);
1022     p.PrintKeyValue("maxTessellationPatchSize", obj.maxTessellationPatchSize, 47);
1023     p.PrintKeyValue("maxTessellationControlPerVertexInputComponents", obj.maxTessellationControlPerVertexInputComponents, 47);
1024     p.PrintKeyValue("maxTessellationControlPerVertexOutputComponents", obj.maxTessellationControlPerVertexOutputComponents, 47);
1025     p.PrintKeyValue("maxTessellationControlPerPatchOutputComponents", obj.maxTessellationControlPerPatchOutputComponents, 47);
1026     p.PrintKeyValue("maxTessellationControlTotalOutputComponents", obj.maxTessellationControlTotalOutputComponents, 47);
1027     p.PrintKeyValue("maxTessellationEvaluationInputComponents", obj.maxTessellationEvaluationInputComponents, 47);
1028     p.PrintKeyValue("maxTessellationEvaluationOutputComponents", obj.maxTessellationEvaluationOutputComponents, 47);
1029     p.PrintKeyValue("maxGeometryShaderInvocations", obj.maxGeometryShaderInvocations, 47);
1030     p.PrintKeyValue("maxGeometryInputComponents", obj.maxGeometryInputComponents, 47);
1031     p.PrintKeyValue("maxGeometryOutputComponents", obj.maxGeometryOutputComponents, 47);
1032     p.PrintKeyValue("maxGeometryOutputVertices", obj.maxGeometryOutputVertices, 47);
1033     p.PrintKeyValue("maxGeometryTotalOutputComponents", obj.maxGeometryTotalOutputComponents, 47);
1034     p.PrintKeyValue("maxFragmentInputComponents", obj.maxFragmentInputComponents, 47);
1035     p.PrintKeyValue("maxFragmentOutputAttachments", obj.maxFragmentOutputAttachments, 47);
1036     p.PrintKeyValue("maxFragmentDualSrcAttachments", obj.maxFragmentDualSrcAttachments, 47);
1037     p.PrintKeyValue("maxFragmentCombinedOutputResources", obj.maxFragmentCombinedOutputResources, 47);
1038     p.PrintKeyValue("maxComputeSharedMemorySize", obj.maxComputeSharedMemorySize, 47);
1039     {   ArrayWrapper arr(p,"maxComputeWorkGroupCount", 3);
1040         p.PrintElement(obj.maxComputeWorkGroupCount[0]);
1041         p.PrintElement(obj.maxComputeWorkGroupCount[1]);
1042         p.PrintElement(obj.maxComputeWorkGroupCount[2]);
1043     }
1044     p.PrintKeyValue("maxComputeWorkGroupInvocations", obj.maxComputeWorkGroupInvocations, 47);
1045     {   ArrayWrapper arr(p,"maxComputeWorkGroupSize", 3);
1046         p.PrintElement(obj.maxComputeWorkGroupSize[0]);
1047         p.PrintElement(obj.maxComputeWorkGroupSize[1]);
1048         p.PrintElement(obj.maxComputeWorkGroupSize[2]);
1049     }
1050     p.PrintKeyValue("subPixelPrecisionBits", obj.subPixelPrecisionBits, 47);
1051     p.PrintKeyValue("subTexelPrecisionBits", obj.subTexelPrecisionBits, 47);
1052     p.PrintKeyValue("mipmapPrecisionBits", obj.mipmapPrecisionBits, 47);
1053     p.PrintKeyValue("maxDrawIndexedIndexValue", obj.maxDrawIndexedIndexValue, 47);
1054     p.PrintKeyValue("maxDrawIndirectCount", obj.maxDrawIndirectCount, 47);
1055     p.PrintKeyValue("maxSamplerLodBias", obj.maxSamplerLodBias, 47);
1056     p.PrintKeyValue("maxSamplerAnisotropy", obj.maxSamplerAnisotropy, 47);
1057     p.PrintKeyValue("maxViewports", obj.maxViewports, 47);
1058     {   ArrayWrapper arr(p,"maxViewportDimensions", 2);
1059         p.PrintElement(obj.maxViewportDimensions[0]);
1060         p.PrintElement(obj.maxViewportDimensions[1]);
1061     }
1062     {   ArrayWrapper arr(p,"viewportBoundsRange", 2);
1063         p.PrintElement(obj.viewportBoundsRange[0]);
1064         p.PrintElement(obj.viewportBoundsRange[1]);
1065     }
1066     p.PrintKeyValue("viewportSubPixelBits", obj.viewportSubPixelBits, 47);
1067     p.PrintKeyValue("minMemoryMapAlignment", obj.minMemoryMapAlignment, 47);
1068     p.PrintKeyValue("minTexelBufferOffsetAlignment", to_hex_str(p, obj.minTexelBufferOffsetAlignment), 47);
1069     p.PrintKeyValue("minUniformBufferOffsetAlignment", to_hex_str(p, obj.minUniformBufferOffsetAlignment), 47);
1070     p.PrintKeyValue("minStorageBufferOffsetAlignment", to_hex_str(p, obj.minStorageBufferOffsetAlignment), 47);
1071     p.PrintKeyValue("minTexelOffset", obj.minTexelOffset, 47);
1072     p.PrintKeyValue("maxTexelOffset", obj.maxTexelOffset, 47);
1073     p.PrintKeyValue("minTexelGatherOffset", obj.minTexelGatherOffset, 47);
1074     p.PrintKeyValue("maxTexelGatherOffset", obj.maxTexelGatherOffset, 47);
1075     p.PrintKeyValue("minInterpolationOffset", obj.minInterpolationOffset, 47);
1076     p.PrintKeyValue("maxInterpolationOffset", obj.maxInterpolationOffset, 47);
1077     p.PrintKeyValue("subPixelInterpolationOffsetBits", obj.subPixelInterpolationOffsetBits, 47);
1078     p.PrintKeyValue("maxFramebufferWidth", obj.maxFramebufferWidth, 47);
1079     p.PrintKeyValue("maxFramebufferHeight", obj.maxFramebufferHeight, 47);
1080     p.PrintKeyValue("maxFramebufferLayers", obj.maxFramebufferLayers, 47);
1081     DumpVkSampleCountFlags(p, "framebufferColorSampleCounts", obj.framebufferColorSampleCounts, 47);
1082     DumpVkSampleCountFlags(p, "framebufferDepthSampleCounts", obj.framebufferDepthSampleCounts, 47);
1083     DumpVkSampleCountFlags(p, "framebufferStencilSampleCounts", obj.framebufferStencilSampleCounts, 47);
1084     DumpVkSampleCountFlags(p, "framebufferNoAttachmentsSampleCounts", obj.framebufferNoAttachmentsSampleCounts, 47);
1085     p.PrintKeyValue("maxColorAttachments", obj.maxColorAttachments, 47);
1086     DumpVkSampleCountFlags(p, "sampledImageColorSampleCounts", obj.sampledImageColorSampleCounts, 47);
1087     DumpVkSampleCountFlags(p, "sampledImageIntegerSampleCounts", obj.sampledImageIntegerSampleCounts, 47);
1088     DumpVkSampleCountFlags(p, "sampledImageDepthSampleCounts", obj.sampledImageDepthSampleCounts, 47);
1089     DumpVkSampleCountFlags(p, "sampledImageStencilSampleCounts", obj.sampledImageStencilSampleCounts, 47);
1090     DumpVkSampleCountFlags(p, "storageImageSampleCounts", obj.storageImageSampleCounts, 47);
1091     p.PrintKeyValue("maxSampleMaskWords", obj.maxSampleMaskWords, 47);
1092     p.PrintKeyBool("timestampComputeAndGraphics", static_cast<bool>(obj.timestampComputeAndGraphics), 47);
1093     p.PrintKeyValue("timestampPeriod", obj.timestampPeriod, 47);
1094     p.PrintKeyValue("maxClipDistances", obj.maxClipDistances, 47);
1095     p.PrintKeyValue("maxCullDistances", obj.maxCullDistances, 47);
1096     p.PrintKeyValue("maxCombinedClipAndCullDistances", obj.maxCombinedClipAndCullDistances, 47);
1097     p.PrintKeyValue("discreteQueuePriorities", obj.discreteQueuePriorities, 47);
1098     {   ArrayWrapper arr(p,"pointSizeRange", 2);
1099         p.PrintElement(obj.pointSizeRange[0]);
1100         p.PrintElement(obj.pointSizeRange[1]);
1101     }
1102     {   ArrayWrapper arr(p,"lineWidthRange", 2);
1103         p.PrintElement(obj.lineWidthRange[0]);
1104         p.PrintElement(obj.lineWidthRange[1]);
1105     }
1106     p.PrintKeyValue("pointSizeGranularity", obj.pointSizeGranularity, 47);
1107     p.PrintKeyValue("lineWidthGranularity", obj.lineWidthGranularity, 47);
1108     p.PrintKeyBool("strictLines", static_cast<bool>(obj.strictLines), 47);
1109     p.PrintKeyBool("standardSampleLocations", static_cast<bool>(obj.standardSampleLocations), 47);
1110     p.PrintKeyValue("optimalBufferCopyOffsetAlignment", to_hex_str(p, obj.optimalBufferCopyOffsetAlignment), 47);
1111     p.PrintKeyValue("optimalBufferCopyRowPitchAlignment", to_hex_str(p, obj.optimalBufferCopyRowPitchAlignment), 47);
1112     p.PrintKeyValue("nonCoherentAtomSize", to_hex_str(p, obj.nonCoherentAtomSize), 47);
1113     p.ObjectEnd();
1114 }
1115 void DumpVkPhysicalDeviceSparseProperties(Printer &p, std::string name, VkPhysicalDeviceSparseProperties &obj) {
1116     if (p.Type() == OutputType::json)
1117         p.ObjectStart("sparseProperties");
1118     else
1119         p.SetSubHeader().ObjectStart(name);
1120     p.PrintKeyBool("residencyStandard2DBlockShape", static_cast<bool>(obj.residencyStandard2DBlockShape), 40);
1121     p.PrintKeyBool("residencyStandard2DMultisampleBlockShape", static_cast<bool>(obj.residencyStandard2DMultisampleBlockShape), 40);
1122     p.PrintKeyBool("residencyStandard3DBlockShape", static_cast<bool>(obj.residencyStandard3DBlockShape), 40);
1123     p.PrintKeyBool("residencyAlignedMipSize", static_cast<bool>(obj.residencyAlignedMipSize), 40);
1124     p.PrintKeyBool("residencyNonResidentStrict", static_cast<bool>(obj.residencyNonResidentStrict), 40);
1125     p.ObjectEnd();
1126 }
1127 void DumpVkLayerProperties(Printer &p, std::string name, VkLayerProperties &obj) {
1128     ObjectWrapper object{p, name};
1129     p.PrintKeyString("layerName", obj.layerName, 21);
1130     p.PrintKeyValue("specVersion", obj.specVersion, 21);
1131     p.PrintKeyValue("implementationVersion", obj.implementationVersion, 21);
1132     p.PrintKeyString("description", obj.description, 21);
1133 }
1134 void DumpVkExtent2D(Printer &p, std::string name, VkExtent2D &obj) {
1135     ObjectWrapper object{p, name};
1136     p.PrintKeyValue("width", obj.width, 6);
1137     p.PrintKeyValue("height", obj.height, 6);
1138 }
1139 void DumpVkPhysicalDeviceSubgroupProperties(Printer &p, std::string name, VkPhysicalDeviceSubgroupProperties &obj) {
1140     ObjectWrapper object{p, name};
1141     p.PrintKeyValue("subgroupSize", obj.subgroupSize, 25);
1142     DumpVkShaderStageFlags(p, "supportedStages", obj.supportedStages, 25);
1143     DumpVkSubgroupFeatureFlags(p, "supportedOperations", obj.supportedOperations, 25);
1144     p.PrintKeyBool("quadOperationsInAllStages", static_cast<bool>(obj.quadOperationsInAllStages), 25);
1145 }
1146 void DumpVkPhysicalDevice16BitStorageFeatures(Printer &p, std::string name, VkPhysicalDevice16BitStorageFeatures &obj) {
1147     ObjectWrapper object{p, name};
1148     p.PrintKeyBool("storageBuffer16BitAccess", static_cast<bool>(obj.storageBuffer16BitAccess), 34);
1149     p.PrintKeyBool("uniformAndStorageBuffer16BitAccess", static_cast<bool>(obj.uniformAndStorageBuffer16BitAccess), 34);
1150     p.PrintKeyBool("storagePushConstant16", static_cast<bool>(obj.storagePushConstant16), 34);
1151     p.PrintKeyBool("storageInputOutput16", static_cast<bool>(obj.storageInputOutput16), 34);
1152 }
1153 void DumpVkPhysicalDevicePointClippingProperties(Printer &p, std::string name, VkPhysicalDevicePointClippingProperties &obj) {
1154     ObjectWrapper object{p, name};
1155     DumpVkPointClippingBehavior(p, "pointClippingBehavior", obj.pointClippingBehavior, 0);
1156 }
1157 void DumpVkPhysicalDeviceMultiviewFeatures(Printer &p, std::string name, VkPhysicalDeviceMultiviewFeatures &obj) {
1158     ObjectWrapper object{p, name};
1159     p.PrintKeyBool("multiview", static_cast<bool>(obj.multiview), 27);
1160     p.PrintKeyBool("multiviewGeometryShader", static_cast<bool>(obj.multiviewGeometryShader), 27);
1161     p.PrintKeyBool("multiviewTessellationShader", static_cast<bool>(obj.multiviewTessellationShader), 27);
1162 }
1163 void DumpVkPhysicalDeviceMultiviewProperties(Printer &p, std::string name, VkPhysicalDeviceMultiviewProperties &obj) {
1164     ObjectWrapper object{p, name};
1165     p.PrintKeyValue("maxMultiviewViewCount", obj.maxMultiviewViewCount, 25);
1166     p.PrintKeyValue("maxMultiviewInstanceIndex", obj.maxMultiviewInstanceIndex, 25);
1167 }
1168 void DumpVkPhysicalDeviceVariablePointersFeatures(Printer &p, std::string name, VkPhysicalDeviceVariablePointersFeatures &obj) {
1169     ObjectWrapper object{p, name};
1170     p.PrintKeyBool("variablePointersStorageBuffer", static_cast<bool>(obj.variablePointersStorageBuffer), 29);
1171     p.PrintKeyBool("variablePointers", static_cast<bool>(obj.variablePointers), 29);
1172 }
1173 void DumpVkPhysicalDeviceProtectedMemoryFeatures(Printer &p, std::string name, VkPhysicalDeviceProtectedMemoryFeatures &obj) {
1174     ObjectWrapper object{p, name};
1175     p.PrintKeyBool("protectedMemory", static_cast<bool>(obj.protectedMemory), 15);
1176 }
1177 void DumpVkPhysicalDeviceProtectedMemoryProperties(Printer &p, std::string name, VkPhysicalDeviceProtectedMemoryProperties &obj) {
1178     ObjectWrapper object{p, name};
1179     p.PrintKeyBool("protectedNoFault", static_cast<bool>(obj.protectedNoFault), 16);
1180 }
1181 void DumpVkPhysicalDeviceSamplerYcbcrConversionFeatures(Printer &p, std::string name, VkPhysicalDeviceSamplerYcbcrConversionFeatures &obj) {
1182     ObjectWrapper object{p, name};
1183     p.PrintKeyBool("samplerYcbcrConversion", static_cast<bool>(obj.samplerYcbcrConversion), 22);
1184 }
1185 void DumpVkPhysicalDeviceIDProperties(Printer &p, std::string name, VkPhysicalDeviceIDProperties &obj) {
1186     ObjectWrapper object{p, name};
1187     p.PrintKeyString("deviceUUID", to_string_16(obj.deviceUUID), 15);
1188     p.PrintKeyString("driverUUID", to_string_16(obj.driverUUID), 15);
1189     if (obj.deviceLUIDValid) p.PrintKeyString("deviceLUID", to_string_8(obj.deviceLUID), 15);
1190     p.PrintKeyValue("deviceNodeMask", obj.deviceNodeMask, 15);
1191     p.PrintKeyBool("deviceLUIDValid", static_cast<bool>(obj.deviceLUIDValid), 15);
1192 }
1193 void DumpVkPhysicalDeviceMaintenance3Properties(Printer &p, std::string name, VkPhysicalDeviceMaintenance3Properties &obj) {
1194     ObjectWrapper object{p, name};
1195     p.PrintKeyValue("maxPerSetDescriptors", obj.maxPerSetDescriptors, 23);
1196     p.PrintKeyValue("maxMemoryAllocationSize", to_hex_str(p, obj.maxMemoryAllocationSize), 23);
1197 }
1198 void DumpVkPhysicalDeviceShaderDrawParametersFeatures(Printer &p, std::string name, VkPhysicalDeviceShaderDrawParametersFeatures &obj) {
1199     ObjectWrapper object{p, name};
1200     p.PrintKeyBool("shaderDrawParameters", static_cast<bool>(obj.shaderDrawParameters), 20);
1201 }
1202 void DumpVkPhysicalDeviceVulkan11Features(Printer &p, std::string name, VkPhysicalDeviceVulkan11Features &obj) {
1203     ObjectWrapper object{p, name};
1204     p.PrintKeyBool("storageBuffer16BitAccess", static_cast<bool>(obj.storageBuffer16BitAccess), 34);
1205     p.PrintKeyBool("uniformAndStorageBuffer16BitAccess", static_cast<bool>(obj.uniformAndStorageBuffer16BitAccess), 34);
1206     p.PrintKeyBool("storagePushConstant16", static_cast<bool>(obj.storagePushConstant16), 34);
1207     p.PrintKeyBool("storageInputOutput16", static_cast<bool>(obj.storageInputOutput16), 34);
1208     p.PrintKeyBool("multiview", static_cast<bool>(obj.multiview), 34);
1209     p.PrintKeyBool("multiviewGeometryShader", static_cast<bool>(obj.multiviewGeometryShader), 34);
1210     p.PrintKeyBool("multiviewTessellationShader", static_cast<bool>(obj.multiviewTessellationShader), 34);
1211     p.PrintKeyBool("variablePointersStorageBuffer", static_cast<bool>(obj.variablePointersStorageBuffer), 34);
1212     p.PrintKeyBool("variablePointers", static_cast<bool>(obj.variablePointers), 34);
1213     p.PrintKeyBool("protectedMemory", static_cast<bool>(obj.protectedMemory), 34);
1214     p.PrintKeyBool("samplerYcbcrConversion", static_cast<bool>(obj.samplerYcbcrConversion), 34);
1215     p.PrintKeyBool("shaderDrawParameters", static_cast<bool>(obj.shaderDrawParameters), 34);
1216 }
1217 void DumpVkPhysicalDeviceVulkan11Properties(Printer &p, std::string name, VkPhysicalDeviceVulkan11Properties &obj) {
1218     ObjectWrapper object{p, name};
1219     p.PrintKeyString("deviceUUID", to_string_16(obj.deviceUUID), 33);
1220     p.PrintKeyString("driverUUID", to_string_16(obj.driverUUID), 33);
1221     if (obj.deviceLUIDValid) p.PrintKeyString("deviceLUID", to_string_8(obj.deviceLUID), 33);
1222     p.PrintKeyValue("deviceNodeMask", obj.deviceNodeMask, 33);
1223     p.PrintKeyBool("deviceLUIDValid", static_cast<bool>(obj.deviceLUIDValid), 33);
1224     p.PrintKeyValue("subgroupSize", obj.subgroupSize, 33);
1225     DumpVkShaderStageFlags(p, "subgroupSupportedStages", obj.subgroupSupportedStages, 33);
1226     DumpVkSubgroupFeatureFlags(p, "subgroupSupportedOperations", obj.subgroupSupportedOperations, 33);
1227     p.PrintKeyBool("subgroupQuadOperationsInAllStages", static_cast<bool>(obj.subgroupQuadOperationsInAllStages), 33);
1228     DumpVkPointClippingBehavior(p, "pointClippingBehavior", obj.pointClippingBehavior, 33);
1229     p.PrintKeyValue("maxMultiviewViewCount", obj.maxMultiviewViewCount, 33);
1230     p.PrintKeyValue("maxMultiviewInstanceIndex", obj.maxMultiviewInstanceIndex, 33);
1231     p.PrintKeyBool("protectedNoFault", static_cast<bool>(obj.protectedNoFault), 33);
1232     p.PrintKeyValue("maxPerSetDescriptors", obj.maxPerSetDescriptors, 33);
1233     p.PrintKeyValue("maxMemoryAllocationSize", to_hex_str(p, obj.maxMemoryAllocationSize), 33);
1234 }
1235 void DumpVkPhysicalDeviceVulkan12Features(Printer &p, std::string name, VkPhysicalDeviceVulkan12Features &obj) {
1236     ObjectWrapper object{p, name};
1237     p.PrintKeyBool("samplerMirrorClampToEdge", static_cast<bool>(obj.samplerMirrorClampToEdge), 50);
1238     p.PrintKeyBool("drawIndirectCount", static_cast<bool>(obj.drawIndirectCount), 50);
1239     p.PrintKeyBool("storageBuffer8BitAccess", static_cast<bool>(obj.storageBuffer8BitAccess), 50);
1240     p.PrintKeyBool("uniformAndStorageBuffer8BitAccess", static_cast<bool>(obj.uniformAndStorageBuffer8BitAccess), 50);
1241     p.PrintKeyBool("storagePushConstant8", static_cast<bool>(obj.storagePushConstant8), 50);
1242     p.PrintKeyBool("shaderBufferInt64Atomics", static_cast<bool>(obj.shaderBufferInt64Atomics), 50);
1243     p.PrintKeyBool("shaderSharedInt64Atomics", static_cast<bool>(obj.shaderSharedInt64Atomics), 50);
1244     p.PrintKeyBool("shaderFloat16", static_cast<bool>(obj.shaderFloat16), 50);
1245     p.PrintKeyBool("shaderInt8", static_cast<bool>(obj.shaderInt8), 50);
1246     p.PrintKeyBool("descriptorIndexing", static_cast<bool>(obj.descriptorIndexing), 50);
1247     p.PrintKeyBool("shaderInputAttachmentArrayDynamicIndexing", static_cast<bool>(obj.shaderInputAttachmentArrayDynamicIndexing), 50);
1248     p.PrintKeyBool("shaderUniformTexelBufferArrayDynamicIndexing", static_cast<bool>(obj.shaderUniformTexelBufferArrayDynamicIndexing), 50);
1249     p.PrintKeyBool("shaderStorageTexelBufferArrayDynamicIndexing", static_cast<bool>(obj.shaderStorageTexelBufferArrayDynamicIndexing), 50);
1250     p.PrintKeyBool("shaderUniformBufferArrayNonUniformIndexing", static_cast<bool>(obj.shaderUniformBufferArrayNonUniformIndexing), 50);
1251     p.PrintKeyBool("shaderSampledImageArrayNonUniformIndexing", static_cast<bool>(obj.shaderSampledImageArrayNonUniformIndexing), 50);
1252     p.PrintKeyBool("shaderStorageBufferArrayNonUniformIndexing", static_cast<bool>(obj.shaderStorageBufferArrayNonUniformIndexing), 50);
1253     p.PrintKeyBool("shaderStorageImageArrayNonUniformIndexing", static_cast<bool>(obj.shaderStorageImageArrayNonUniformIndexing), 50);
1254     p.PrintKeyBool("shaderInputAttachmentArrayNonUniformIndexing", static_cast<bool>(obj.shaderInputAttachmentArrayNonUniformIndexing), 50);
1255     p.PrintKeyBool("shaderUniformTexelBufferArrayNonUniformIndexing", static_cast<bool>(obj.shaderUniformTexelBufferArrayNonUniformIndexing), 50);
1256     p.PrintKeyBool("shaderStorageTexelBufferArrayNonUniformIndexing", static_cast<bool>(obj.shaderStorageTexelBufferArrayNonUniformIndexing), 50);
1257     p.PrintKeyBool("descriptorBindingUniformBufferUpdateAfterBind", static_cast<bool>(obj.descriptorBindingUniformBufferUpdateAfterBind), 50);
1258     p.PrintKeyBool("descriptorBindingSampledImageUpdateAfterBind", static_cast<bool>(obj.descriptorBindingSampledImageUpdateAfterBind), 50);
1259     p.PrintKeyBool("descriptorBindingStorageImageUpdateAfterBind", static_cast<bool>(obj.descriptorBindingStorageImageUpdateAfterBind), 50);
1260     p.PrintKeyBool("descriptorBindingStorageBufferUpdateAfterBind", static_cast<bool>(obj.descriptorBindingStorageBufferUpdateAfterBind), 50);
1261     p.PrintKeyBool("descriptorBindingUniformTexelBufferUpdateAfterBind", static_cast<bool>(obj.descriptorBindingUniformTexelBufferUpdateAfterBind), 50);
1262     p.PrintKeyBool("descriptorBindingStorageTexelBufferUpdateAfterBind", static_cast<bool>(obj.descriptorBindingStorageTexelBufferUpdateAfterBind), 50);
1263     p.PrintKeyBool("descriptorBindingUpdateUnusedWhilePending", static_cast<bool>(obj.descriptorBindingUpdateUnusedWhilePending), 50);
1264     p.PrintKeyBool("descriptorBindingPartiallyBound", static_cast<bool>(obj.descriptorBindingPartiallyBound), 50);
1265     p.PrintKeyBool("descriptorBindingVariableDescriptorCount", static_cast<bool>(obj.descriptorBindingVariableDescriptorCount), 50);
1266     p.PrintKeyBool("runtimeDescriptorArray", static_cast<bool>(obj.runtimeDescriptorArray), 50);
1267     p.PrintKeyBool("samplerFilterMinmax", static_cast<bool>(obj.samplerFilterMinmax), 50);
1268     p.PrintKeyBool("scalarBlockLayout", static_cast<bool>(obj.scalarBlockLayout), 50);
1269     p.PrintKeyBool("imagelessFramebuffer", static_cast<bool>(obj.imagelessFramebuffer), 50);
1270     p.PrintKeyBool("uniformBufferStandardLayout", static_cast<bool>(obj.uniformBufferStandardLayout), 50);
1271     p.PrintKeyBool("shaderSubgroupExtendedTypes", static_cast<bool>(obj.shaderSubgroupExtendedTypes), 50);
1272     p.PrintKeyBool("separateDepthStencilLayouts", static_cast<bool>(obj.separateDepthStencilLayouts), 50);
1273     p.PrintKeyBool("hostQueryReset", static_cast<bool>(obj.hostQueryReset), 50);
1274     p.PrintKeyBool("timelineSemaphore", static_cast<bool>(obj.timelineSemaphore), 50);
1275     p.PrintKeyBool("bufferDeviceAddress", static_cast<bool>(obj.bufferDeviceAddress), 50);
1276     p.PrintKeyBool("bufferDeviceAddressCaptureReplay", static_cast<bool>(obj.bufferDeviceAddressCaptureReplay), 50);
1277     p.PrintKeyBool("bufferDeviceAddressMultiDevice", static_cast<bool>(obj.bufferDeviceAddressMultiDevice), 50);
1278     p.PrintKeyBool("vulkanMemoryModel", static_cast<bool>(obj.vulkanMemoryModel), 50);
1279     p.PrintKeyBool("vulkanMemoryModelDeviceScope", static_cast<bool>(obj.vulkanMemoryModelDeviceScope), 50);
1280     p.PrintKeyBool("vulkanMemoryModelAvailabilityVisibilityChains", static_cast<bool>(obj.vulkanMemoryModelAvailabilityVisibilityChains), 50);
1281     p.PrintKeyBool("shaderOutputViewportIndex", static_cast<bool>(obj.shaderOutputViewportIndex), 50);
1282     p.PrintKeyBool("shaderOutputLayer", static_cast<bool>(obj.shaderOutputLayer), 50);
1283     p.PrintKeyBool("subgroupBroadcastDynamicId", static_cast<bool>(obj.subgroupBroadcastDynamicId), 50);
1284 }
1285 void DumpVkPhysicalDeviceVulkan12Properties(Printer &p, std::string name, VkPhysicalDeviceVulkan12Properties &obj) {
1286     ObjectWrapper object{p, name};
1287     DumpVkDriverId(p, "driverID", obj.driverID, 52);
1288     p.PrintKeyString("driverName", obj.driverName, 52);
1289     p.PrintKeyString("driverInfo", obj.driverInfo, 52);
1290     DumpVkConformanceVersion(p, "conformanceVersion", obj.conformanceVersion, 52);
1291     DumpVkShaderFloatControlsIndependence(p, "denormBehaviorIndependence", obj.denormBehaviorIndependence, 52);
1292     DumpVkShaderFloatControlsIndependence(p, "roundingModeIndependence", obj.roundingModeIndependence, 52);
1293     p.PrintKeyBool("shaderSignedZeroInfNanPreserveFloat16", static_cast<bool>(obj.shaderSignedZeroInfNanPreserveFloat16), 52);
1294     p.PrintKeyBool("shaderSignedZeroInfNanPreserveFloat32", static_cast<bool>(obj.shaderSignedZeroInfNanPreserveFloat32), 52);
1295     p.PrintKeyBool("shaderSignedZeroInfNanPreserveFloat64", static_cast<bool>(obj.shaderSignedZeroInfNanPreserveFloat64), 52);
1296     p.PrintKeyBool("shaderDenormPreserveFloat16", static_cast<bool>(obj.shaderDenormPreserveFloat16), 52);
1297     p.PrintKeyBool("shaderDenormPreserveFloat32", static_cast<bool>(obj.shaderDenormPreserveFloat32), 52);
1298     p.PrintKeyBool("shaderDenormPreserveFloat64", static_cast<bool>(obj.shaderDenormPreserveFloat64), 52);
1299     p.PrintKeyBool("shaderDenormFlushToZeroFloat16", static_cast<bool>(obj.shaderDenormFlushToZeroFloat16), 52);
1300     p.PrintKeyBool("shaderDenormFlushToZeroFloat32", static_cast<bool>(obj.shaderDenormFlushToZeroFloat32), 52);
1301     p.PrintKeyBool("shaderDenormFlushToZeroFloat64", static_cast<bool>(obj.shaderDenormFlushToZeroFloat64), 52);
1302     p.PrintKeyBool("shaderRoundingModeRTEFloat16", static_cast<bool>(obj.shaderRoundingModeRTEFloat16), 52);
1303     p.PrintKeyBool("shaderRoundingModeRTEFloat32", static_cast<bool>(obj.shaderRoundingModeRTEFloat32), 52);
1304     p.PrintKeyBool("shaderRoundingModeRTEFloat64", static_cast<bool>(obj.shaderRoundingModeRTEFloat64), 52);
1305     p.PrintKeyBool("shaderRoundingModeRTZFloat16", static_cast<bool>(obj.shaderRoundingModeRTZFloat16), 52);
1306     p.PrintKeyBool("shaderRoundingModeRTZFloat32", static_cast<bool>(obj.shaderRoundingModeRTZFloat32), 52);
1307     p.PrintKeyBool("shaderRoundingModeRTZFloat64", static_cast<bool>(obj.shaderRoundingModeRTZFloat64), 52);
1308     p.PrintKeyValue("maxUpdateAfterBindDescriptorsInAllPools", obj.maxUpdateAfterBindDescriptorsInAllPools, 52);
1309     p.PrintKeyBool("shaderUniformBufferArrayNonUniformIndexingNative", static_cast<bool>(obj.shaderUniformBufferArrayNonUniformIndexingNative), 52);
1310     p.PrintKeyBool("shaderSampledImageArrayNonUniformIndexingNative", static_cast<bool>(obj.shaderSampledImageArrayNonUniformIndexingNative), 52);
1311     p.PrintKeyBool("shaderStorageBufferArrayNonUniformIndexingNative", static_cast<bool>(obj.shaderStorageBufferArrayNonUniformIndexingNative), 52);
1312     p.PrintKeyBool("shaderStorageImageArrayNonUniformIndexingNative", static_cast<bool>(obj.shaderStorageImageArrayNonUniformIndexingNative), 52);
1313     p.PrintKeyBool("shaderInputAttachmentArrayNonUniformIndexingNative", static_cast<bool>(obj.shaderInputAttachmentArrayNonUniformIndexingNative), 52);
1314     p.PrintKeyBool("robustBufferAccessUpdateAfterBind", static_cast<bool>(obj.robustBufferAccessUpdateAfterBind), 52);
1315     p.PrintKeyBool("quadDivergentImplicitLod", static_cast<bool>(obj.quadDivergentImplicitLod), 52);
1316     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindSamplers", obj.maxPerStageDescriptorUpdateAfterBindSamplers, 52);
1317     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindUniformBuffers", obj.maxPerStageDescriptorUpdateAfterBindUniformBuffers, 52);
1318     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindStorageBuffers", obj.maxPerStageDescriptorUpdateAfterBindStorageBuffers, 52);
1319     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindSampledImages", obj.maxPerStageDescriptorUpdateAfterBindSampledImages, 52);
1320     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindStorageImages", obj.maxPerStageDescriptorUpdateAfterBindStorageImages, 52);
1321     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindInputAttachments", obj.maxPerStageDescriptorUpdateAfterBindInputAttachments, 52);
1322     p.PrintKeyValue("maxPerStageUpdateAfterBindResources", obj.maxPerStageUpdateAfterBindResources, 52);
1323     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindSamplers", obj.maxDescriptorSetUpdateAfterBindSamplers, 52);
1324     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindUniformBuffers", obj.maxDescriptorSetUpdateAfterBindUniformBuffers, 52);
1325     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindUniformBuffersDynamic", obj.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, 52);
1326     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindStorageBuffers", obj.maxDescriptorSetUpdateAfterBindStorageBuffers, 52);
1327     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindStorageBuffersDynamic", obj.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, 52);
1328     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindSampledImages", obj.maxDescriptorSetUpdateAfterBindSampledImages, 52);
1329     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindStorageImages", obj.maxDescriptorSetUpdateAfterBindStorageImages, 52);
1330     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindInputAttachments", obj.maxDescriptorSetUpdateAfterBindInputAttachments, 52);
1331     DumpVkResolveModeFlags(p, "supportedDepthResolveModes", obj.supportedDepthResolveModes, 52);
1332     DumpVkResolveModeFlags(p, "supportedStencilResolveModes", obj.supportedStencilResolveModes, 52);
1333     p.PrintKeyBool("independentResolveNone", static_cast<bool>(obj.independentResolveNone), 52);
1334     p.PrintKeyBool("independentResolve", static_cast<bool>(obj.independentResolve), 52);
1335     p.PrintKeyBool("filterMinmaxSingleComponentFormats", static_cast<bool>(obj.filterMinmaxSingleComponentFormats), 52);
1336     p.PrintKeyBool("filterMinmaxImageComponentMapping", static_cast<bool>(obj.filterMinmaxImageComponentMapping), 52);
1337     p.PrintKeyValue("maxTimelineSemaphoreValueDifference", obj.maxTimelineSemaphoreValueDifference, 52);
1338     DumpVkSampleCountFlags(p, "framebufferIntegerColorSampleCounts", obj.framebufferIntegerColorSampleCounts, 52);
1339 }
1340 void DumpVkPhysicalDevice8BitStorageFeatures(Printer &p, std::string name, VkPhysicalDevice8BitStorageFeatures &obj) {
1341     ObjectWrapper object{p, name};
1342     p.PrintKeyBool("storageBuffer8BitAccess", static_cast<bool>(obj.storageBuffer8BitAccess), 33);
1343     p.PrintKeyBool("uniformAndStorageBuffer8BitAccess", static_cast<bool>(obj.uniformAndStorageBuffer8BitAccess), 33);
1344     p.PrintKeyBool("storagePushConstant8", static_cast<bool>(obj.storagePushConstant8), 33);
1345 }
1346 void DumpVkPhysicalDeviceDriverProperties(Printer &p, std::string name, VkPhysicalDeviceDriverProperties &obj) {
1347     ObjectWrapper object{p, name};
1348     DumpVkDriverId(p, "driverID", obj.driverID, 18);
1349     p.PrintKeyString("driverName", obj.driverName, 18);
1350     p.PrintKeyString("driverInfo", obj.driverInfo, 18);
1351     DumpVkConformanceVersion(p, "conformanceVersion", obj.conformanceVersion, 18);
1352 }
1353 void DumpVkPhysicalDeviceShaderAtomicInt64Features(Printer &p, std::string name, VkPhysicalDeviceShaderAtomicInt64Features &obj) {
1354     ObjectWrapper object{p, name};
1355     p.PrintKeyBool("shaderBufferInt64Atomics", static_cast<bool>(obj.shaderBufferInt64Atomics), 24);
1356     p.PrintKeyBool("shaderSharedInt64Atomics", static_cast<bool>(obj.shaderSharedInt64Atomics), 24);
1357 }
1358 void DumpVkPhysicalDeviceShaderFloat16Int8Features(Printer &p, std::string name, VkPhysicalDeviceShaderFloat16Int8Features &obj) {
1359     ObjectWrapper object{p, name};
1360     p.PrintKeyBool("shaderFloat16", static_cast<bool>(obj.shaderFloat16), 13);
1361     p.PrintKeyBool("shaderInt8", static_cast<bool>(obj.shaderInt8), 13);
1362 }
1363 void DumpVkPhysicalDeviceFloatControlsProperties(Printer &p, std::string name, VkPhysicalDeviceFloatControlsProperties &obj) {
1364     ObjectWrapper object{p, name};
1365     DumpVkShaderFloatControlsIndependence(p, "denormBehaviorIndependence", obj.denormBehaviorIndependence, 37);
1366     DumpVkShaderFloatControlsIndependence(p, "roundingModeIndependence", obj.roundingModeIndependence, 37);
1367     p.PrintKeyBool("shaderSignedZeroInfNanPreserveFloat16", static_cast<bool>(obj.shaderSignedZeroInfNanPreserveFloat16), 37);
1368     p.PrintKeyBool("shaderSignedZeroInfNanPreserveFloat32", static_cast<bool>(obj.shaderSignedZeroInfNanPreserveFloat32), 37);
1369     p.PrintKeyBool("shaderSignedZeroInfNanPreserveFloat64", static_cast<bool>(obj.shaderSignedZeroInfNanPreserveFloat64), 37);
1370     p.PrintKeyBool("shaderDenormPreserveFloat16", static_cast<bool>(obj.shaderDenormPreserveFloat16), 37);
1371     p.PrintKeyBool("shaderDenormPreserveFloat32", static_cast<bool>(obj.shaderDenormPreserveFloat32), 37);
1372     p.PrintKeyBool("shaderDenormPreserveFloat64", static_cast<bool>(obj.shaderDenormPreserveFloat64), 37);
1373     p.PrintKeyBool("shaderDenormFlushToZeroFloat16", static_cast<bool>(obj.shaderDenormFlushToZeroFloat16), 37);
1374     p.PrintKeyBool("shaderDenormFlushToZeroFloat32", static_cast<bool>(obj.shaderDenormFlushToZeroFloat32), 37);
1375     p.PrintKeyBool("shaderDenormFlushToZeroFloat64", static_cast<bool>(obj.shaderDenormFlushToZeroFloat64), 37);
1376     p.PrintKeyBool("shaderRoundingModeRTEFloat16", static_cast<bool>(obj.shaderRoundingModeRTEFloat16), 37);
1377     p.PrintKeyBool("shaderRoundingModeRTEFloat32", static_cast<bool>(obj.shaderRoundingModeRTEFloat32), 37);
1378     p.PrintKeyBool("shaderRoundingModeRTEFloat64", static_cast<bool>(obj.shaderRoundingModeRTEFloat64), 37);
1379     p.PrintKeyBool("shaderRoundingModeRTZFloat16", static_cast<bool>(obj.shaderRoundingModeRTZFloat16), 37);
1380     p.PrintKeyBool("shaderRoundingModeRTZFloat32", static_cast<bool>(obj.shaderRoundingModeRTZFloat32), 37);
1381     p.PrintKeyBool("shaderRoundingModeRTZFloat64", static_cast<bool>(obj.shaderRoundingModeRTZFloat64), 37);
1382 }
1383 void DumpVkPhysicalDeviceDescriptorIndexingFeatures(Printer &p, std::string name, VkPhysicalDeviceDescriptorIndexingFeatures &obj) {
1384     ObjectWrapper object{p, name};
1385     p.PrintKeyBool("shaderInputAttachmentArrayDynamicIndexing", static_cast<bool>(obj.shaderInputAttachmentArrayDynamicIndexing), 50);
1386     p.PrintKeyBool("shaderUniformTexelBufferArrayDynamicIndexing", static_cast<bool>(obj.shaderUniformTexelBufferArrayDynamicIndexing), 50);
1387     p.PrintKeyBool("shaderStorageTexelBufferArrayDynamicIndexing", static_cast<bool>(obj.shaderStorageTexelBufferArrayDynamicIndexing), 50);
1388     p.PrintKeyBool("shaderUniformBufferArrayNonUniformIndexing", static_cast<bool>(obj.shaderUniformBufferArrayNonUniformIndexing), 50);
1389     p.PrintKeyBool("shaderSampledImageArrayNonUniformIndexing", static_cast<bool>(obj.shaderSampledImageArrayNonUniformIndexing), 50);
1390     p.PrintKeyBool("shaderStorageBufferArrayNonUniformIndexing", static_cast<bool>(obj.shaderStorageBufferArrayNonUniformIndexing), 50);
1391     p.PrintKeyBool("shaderStorageImageArrayNonUniformIndexing", static_cast<bool>(obj.shaderStorageImageArrayNonUniformIndexing), 50);
1392     p.PrintKeyBool("shaderInputAttachmentArrayNonUniformIndexing", static_cast<bool>(obj.shaderInputAttachmentArrayNonUniformIndexing), 50);
1393     p.PrintKeyBool("shaderUniformTexelBufferArrayNonUniformIndexing", static_cast<bool>(obj.shaderUniformTexelBufferArrayNonUniformIndexing), 50);
1394     p.PrintKeyBool("shaderStorageTexelBufferArrayNonUniformIndexing", static_cast<bool>(obj.shaderStorageTexelBufferArrayNonUniformIndexing), 50);
1395     p.PrintKeyBool("descriptorBindingUniformBufferUpdateAfterBind", static_cast<bool>(obj.descriptorBindingUniformBufferUpdateAfterBind), 50);
1396     p.PrintKeyBool("descriptorBindingSampledImageUpdateAfterBind", static_cast<bool>(obj.descriptorBindingSampledImageUpdateAfterBind), 50);
1397     p.PrintKeyBool("descriptorBindingStorageImageUpdateAfterBind", static_cast<bool>(obj.descriptorBindingStorageImageUpdateAfterBind), 50);
1398     p.PrintKeyBool("descriptorBindingStorageBufferUpdateAfterBind", static_cast<bool>(obj.descriptorBindingStorageBufferUpdateAfterBind), 50);
1399     p.PrintKeyBool("descriptorBindingUniformTexelBufferUpdateAfterBind", static_cast<bool>(obj.descriptorBindingUniformTexelBufferUpdateAfterBind), 50);
1400     p.PrintKeyBool("descriptorBindingStorageTexelBufferUpdateAfterBind", static_cast<bool>(obj.descriptorBindingStorageTexelBufferUpdateAfterBind), 50);
1401     p.PrintKeyBool("descriptorBindingUpdateUnusedWhilePending", static_cast<bool>(obj.descriptorBindingUpdateUnusedWhilePending), 50);
1402     p.PrintKeyBool("descriptorBindingPartiallyBound", static_cast<bool>(obj.descriptorBindingPartiallyBound), 50);
1403     p.PrintKeyBool("descriptorBindingVariableDescriptorCount", static_cast<bool>(obj.descriptorBindingVariableDescriptorCount), 50);
1404     p.PrintKeyBool("runtimeDescriptorArray", static_cast<bool>(obj.runtimeDescriptorArray), 50);
1405 }
1406 void DumpVkPhysicalDeviceDescriptorIndexingProperties(Printer &p, std::string name, VkPhysicalDeviceDescriptorIndexingProperties &obj) {
1407     ObjectWrapper object{p, name};
1408     p.PrintKeyValue("maxUpdateAfterBindDescriptorsInAllPools", obj.maxUpdateAfterBindDescriptorsInAllPools, 52);
1409     p.PrintKeyBool("shaderUniformBufferArrayNonUniformIndexingNative", static_cast<bool>(obj.shaderUniformBufferArrayNonUniformIndexingNative), 52);
1410     p.PrintKeyBool("shaderSampledImageArrayNonUniformIndexingNative", static_cast<bool>(obj.shaderSampledImageArrayNonUniformIndexingNative), 52);
1411     p.PrintKeyBool("shaderStorageBufferArrayNonUniformIndexingNative", static_cast<bool>(obj.shaderStorageBufferArrayNonUniformIndexingNative), 52);
1412     p.PrintKeyBool("shaderStorageImageArrayNonUniformIndexingNative", static_cast<bool>(obj.shaderStorageImageArrayNonUniformIndexingNative), 52);
1413     p.PrintKeyBool("shaderInputAttachmentArrayNonUniformIndexingNative", static_cast<bool>(obj.shaderInputAttachmentArrayNonUniformIndexingNative), 52);
1414     p.PrintKeyBool("robustBufferAccessUpdateAfterBind", static_cast<bool>(obj.robustBufferAccessUpdateAfterBind), 52);
1415     p.PrintKeyBool("quadDivergentImplicitLod", static_cast<bool>(obj.quadDivergentImplicitLod), 52);
1416     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindSamplers", obj.maxPerStageDescriptorUpdateAfterBindSamplers, 52);
1417     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindUniformBuffers", obj.maxPerStageDescriptorUpdateAfterBindUniformBuffers, 52);
1418     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindStorageBuffers", obj.maxPerStageDescriptorUpdateAfterBindStorageBuffers, 52);
1419     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindSampledImages", obj.maxPerStageDescriptorUpdateAfterBindSampledImages, 52);
1420     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindStorageImages", obj.maxPerStageDescriptorUpdateAfterBindStorageImages, 52);
1421     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindInputAttachments", obj.maxPerStageDescriptorUpdateAfterBindInputAttachments, 52);
1422     p.PrintKeyValue("maxPerStageUpdateAfterBindResources", obj.maxPerStageUpdateAfterBindResources, 52);
1423     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindSamplers", obj.maxDescriptorSetUpdateAfterBindSamplers, 52);
1424     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindUniformBuffers", obj.maxDescriptorSetUpdateAfterBindUniformBuffers, 52);
1425     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindUniformBuffersDynamic", obj.maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, 52);
1426     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindStorageBuffers", obj.maxDescriptorSetUpdateAfterBindStorageBuffers, 52);
1427     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindStorageBuffersDynamic", obj.maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, 52);
1428     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindSampledImages", obj.maxDescriptorSetUpdateAfterBindSampledImages, 52);
1429     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindStorageImages", obj.maxDescriptorSetUpdateAfterBindStorageImages, 52);
1430     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindInputAttachments", obj.maxDescriptorSetUpdateAfterBindInputAttachments, 52);
1431 }
1432 void DumpVkPhysicalDeviceDepthStencilResolveProperties(Printer &p, std::string name, VkPhysicalDeviceDepthStencilResolveProperties &obj) {
1433     ObjectWrapper object{p, name};
1434     DumpVkResolveModeFlags(p, "supportedDepthResolveModes", obj.supportedDepthResolveModes, 22);
1435     DumpVkResolveModeFlags(p, "supportedStencilResolveModes", obj.supportedStencilResolveModes, 22);
1436     p.PrintKeyBool("independentResolveNone", static_cast<bool>(obj.independentResolveNone), 22);
1437     p.PrintKeyBool("independentResolve", static_cast<bool>(obj.independentResolve), 22);
1438 }
1439 void DumpVkPhysicalDeviceScalarBlockLayoutFeatures(Printer &p, std::string name, VkPhysicalDeviceScalarBlockLayoutFeatures &obj) {
1440     ObjectWrapper object{p, name};
1441     p.PrintKeyBool("scalarBlockLayout", static_cast<bool>(obj.scalarBlockLayout), 17);
1442 }
1443 void DumpVkPhysicalDeviceSamplerFilterMinmaxProperties(Printer &p, std::string name, VkPhysicalDeviceSamplerFilterMinmaxProperties &obj) {
1444     ObjectWrapper object{p, name};
1445     p.PrintKeyBool("filterMinmaxSingleComponentFormats", static_cast<bool>(obj.filterMinmaxSingleComponentFormats), 34);
1446     p.PrintKeyBool("filterMinmaxImageComponentMapping", static_cast<bool>(obj.filterMinmaxImageComponentMapping), 34);
1447 }
1448 void DumpVkPhysicalDeviceVulkanMemoryModelFeatures(Printer &p, std::string name, VkPhysicalDeviceVulkanMemoryModelFeatures &obj) {
1449     ObjectWrapper object{p, name};
1450     p.PrintKeyBool("vulkanMemoryModel", static_cast<bool>(obj.vulkanMemoryModel), 45);
1451     p.PrintKeyBool("vulkanMemoryModelDeviceScope", static_cast<bool>(obj.vulkanMemoryModelDeviceScope), 45);
1452     p.PrintKeyBool("vulkanMemoryModelAvailabilityVisibilityChains", static_cast<bool>(obj.vulkanMemoryModelAvailabilityVisibilityChains), 45);
1453 }
1454 void DumpVkPhysicalDeviceImagelessFramebufferFeatures(Printer &p, std::string name, VkPhysicalDeviceImagelessFramebufferFeatures &obj) {
1455     ObjectWrapper object{p, name};
1456     p.PrintKeyBool("imagelessFramebuffer", static_cast<bool>(obj.imagelessFramebuffer), 20);
1457 }
1458 void DumpVkPhysicalDeviceUniformBufferStandardLayoutFeatures(Printer &p, std::string name, VkPhysicalDeviceUniformBufferStandardLayoutFeatures &obj) {
1459     ObjectWrapper object{p, name};
1460     p.PrintKeyBool("uniformBufferStandardLayout", static_cast<bool>(obj.uniformBufferStandardLayout), 27);
1461 }
1462 void DumpVkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(Printer &p, std::string name, VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures &obj) {
1463     ObjectWrapper object{p, name};
1464     p.PrintKeyBool("shaderSubgroupExtendedTypes", static_cast<bool>(obj.shaderSubgroupExtendedTypes), 27);
1465 }
1466 void DumpVkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(Printer &p, std::string name, VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures &obj) {
1467     ObjectWrapper object{p, name};
1468     p.PrintKeyBool("separateDepthStencilLayouts", static_cast<bool>(obj.separateDepthStencilLayouts), 27);
1469 }
1470 void DumpVkPhysicalDeviceHostQueryResetFeatures(Printer &p, std::string name, VkPhysicalDeviceHostQueryResetFeatures &obj) {
1471     ObjectWrapper object{p, name};
1472     p.PrintKeyBool("hostQueryReset", static_cast<bool>(obj.hostQueryReset), 14);
1473 }
1474 void DumpVkPhysicalDeviceTimelineSemaphoreFeatures(Printer &p, std::string name, VkPhysicalDeviceTimelineSemaphoreFeatures &obj) {
1475     ObjectWrapper object{p, name};
1476     p.PrintKeyBool("timelineSemaphore", static_cast<bool>(obj.timelineSemaphore), 17);
1477 }
1478 void DumpVkPhysicalDeviceTimelineSemaphoreProperties(Printer &p, std::string name, VkPhysicalDeviceTimelineSemaphoreProperties &obj) {
1479     ObjectWrapper object{p, name};
1480     p.PrintKeyValue("maxTimelineSemaphoreValueDifference", obj.maxTimelineSemaphoreValueDifference, 35);
1481 }
1482 void DumpVkPhysicalDeviceBufferDeviceAddressFeatures(Printer &p, std::string name, VkPhysicalDeviceBufferDeviceAddressFeatures &obj) {
1483     ObjectWrapper object{p, name};
1484     p.PrintKeyBool("bufferDeviceAddress", static_cast<bool>(obj.bufferDeviceAddress), 32);
1485     p.PrintKeyBool("bufferDeviceAddressCaptureReplay", static_cast<bool>(obj.bufferDeviceAddressCaptureReplay), 32);
1486     p.PrintKeyBool("bufferDeviceAddressMultiDevice", static_cast<bool>(obj.bufferDeviceAddressMultiDevice), 32);
1487 }
1488 void DumpVkSurfaceCapabilitiesKHR(Printer &p, std::string name, VkSurfaceCapabilitiesKHR &obj) {
1489     ObjectWrapper object{p, name};
1490     p.PrintKeyValue("minImageCount", obj.minImageCount, 19);
1491     p.PrintKeyValue("maxImageCount", obj.maxImageCount, 19);
1492     DumpVkExtent2D(p, "currentExtent", obj.currentExtent);
1493     DumpVkExtent2D(p, "minImageExtent", obj.minImageExtent);
1494     DumpVkExtent2D(p, "maxImageExtent", obj.maxImageExtent);
1495     p.PrintKeyValue("maxImageArrayLayers", obj.maxImageArrayLayers, 19);
1496     DumpVkSurfaceTransformFlagsKHR(p, "supportedTransforms", obj.supportedTransforms, 19);
1497     DumpVkSurfaceTransformFlagBitsKHR(p, "currentTransform", obj.currentTransform, 19);
1498     DumpVkCompositeAlphaFlagsKHR(p, "supportedCompositeAlpha", obj.supportedCompositeAlpha, 19);
1499     DumpVkImageUsageFlags(p, "supportedUsageFlags", obj.supportedUsageFlags, 19);
1500 }
1501 void DumpVkSurfaceFormatKHR(Printer &p, std::string name, VkSurfaceFormatKHR &obj) {
1502     ObjectWrapper object{p, name};
1503     DumpVkFormat(p, "format", obj.format, 0);
1504     DumpVkColorSpaceKHR(p, "colorSpace", obj.colorSpace, 0);
1505 }
1506 void DumpVkPhysicalDevicePushDescriptorPropertiesKHR(Printer &p, std::string name, VkPhysicalDevicePushDescriptorPropertiesKHR &obj) {
1507     ObjectWrapper object{p, name};
1508     p.PrintKeyValue("maxPushDescriptors", obj.maxPushDescriptors, 18);
1509 }
1510 void DumpVkSharedPresentSurfaceCapabilitiesKHR(Printer &p, std::string name, VkSharedPresentSurfaceCapabilitiesKHR &obj) {
1511     ObjectWrapper object{p, name};
1512     DumpVkImageUsageFlags(p, "sharedPresentSupportedUsageFlags", obj.sharedPresentSupportedUsageFlags, 0);
1513 }
1514 void DumpVkPhysicalDevicePerformanceQueryFeaturesKHR(Printer &p, std::string name, VkPhysicalDevicePerformanceQueryFeaturesKHR &obj) {
1515     ObjectWrapper object{p, name};
1516     p.PrintKeyBool("performanceCounterQueryPools", static_cast<bool>(obj.performanceCounterQueryPools), 36);
1517     p.PrintKeyBool("performanceCounterMultipleQueryPools", static_cast<bool>(obj.performanceCounterMultipleQueryPools), 36);
1518 }
1519 void DumpVkPhysicalDevicePerformanceQueryPropertiesKHR(Printer &p, std::string name, VkPhysicalDevicePerformanceQueryPropertiesKHR &obj) {
1520     ObjectWrapper object{p, name};
1521     p.PrintKeyBool("allowCommandBufferQueryCopies", static_cast<bool>(obj.allowCommandBufferQueryCopies), 29);
1522 }
1523 void DumpVkPhysicalDeviceShaderClockFeaturesKHR(Printer &p, std::string name, VkPhysicalDeviceShaderClockFeaturesKHR &obj) {
1524     ObjectWrapper object{p, name};
1525     p.PrintKeyBool("shaderSubgroupClock", static_cast<bool>(obj.shaderSubgroupClock), 19);
1526     p.PrintKeyBool("shaderDeviceClock", static_cast<bool>(obj.shaderDeviceClock), 19);
1527 }
1528 void DumpVkSurfaceProtectedCapabilitiesKHR(Printer &p, std::string name, VkSurfaceProtectedCapabilitiesKHR &obj) {
1529     ObjectWrapper object{p, name};
1530     p.PrintKeyBool("supportsProtected", static_cast<bool>(obj.supportsProtected), 17);
1531 }
1532 void DumpVkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(Printer &p, std::string name, VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR &obj) {
1533     ObjectWrapper object{p, name};
1534     p.PrintKeyBool("pipelineExecutableInfo", static_cast<bool>(obj.pipelineExecutableInfo), 22);
1535 }
1536 void DumpVkPhysicalDeviceTransformFeedbackFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceTransformFeedbackFeaturesEXT &obj) {
1537     ObjectWrapper object{p, name};
1538     p.PrintKeyBool("transformFeedback", static_cast<bool>(obj.transformFeedback), 17);
1539     p.PrintKeyBool("geometryStreams", static_cast<bool>(obj.geometryStreams), 17);
1540 }
1541 void DumpVkPhysicalDeviceTransformFeedbackPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceTransformFeedbackPropertiesEXT &obj) {
1542     ObjectWrapper object{p, name};
1543     p.PrintKeyValue("maxTransformFeedbackStreams", obj.maxTransformFeedbackStreams, 42);
1544     p.PrintKeyValue("maxTransformFeedbackBuffers", obj.maxTransformFeedbackBuffers, 42);
1545     p.PrintKeyValue("maxTransformFeedbackBufferSize", to_hex_str(p, obj.maxTransformFeedbackBufferSize), 42);
1546     p.PrintKeyValue("maxTransformFeedbackStreamDataSize", obj.maxTransformFeedbackStreamDataSize, 42);
1547     p.PrintKeyValue("maxTransformFeedbackBufferDataSize", obj.maxTransformFeedbackBufferDataSize, 42);
1548     p.PrintKeyValue("maxTransformFeedbackBufferDataStride", obj.maxTransformFeedbackBufferDataStride, 42);
1549     p.PrintKeyBool("transformFeedbackQueries", static_cast<bool>(obj.transformFeedbackQueries), 42);
1550     p.PrintKeyBool("transformFeedbackStreamsLinesTriangles", static_cast<bool>(obj.transformFeedbackStreamsLinesTriangles), 42);
1551     p.PrintKeyBool("transformFeedbackRasterizationStreamSelect", static_cast<bool>(obj.transformFeedbackRasterizationStreamSelect), 42);
1552     p.PrintKeyBool("transformFeedbackDraw", static_cast<bool>(obj.transformFeedbackDraw), 42);
1553 }
1554 void DumpVkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT &obj) {
1555     ObjectWrapper object{p, name};
1556     p.PrintKeyBool("textureCompressionASTC_HDR", static_cast<bool>(obj.textureCompressionASTC_HDR), 26);
1557 }
1558 void DumpVkPhysicalDeviceASTCDecodeFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceASTCDecodeFeaturesEXT &obj) {
1559     ObjectWrapper object{p, name};
1560     p.PrintKeyBool("decodeModeSharedExponent", static_cast<bool>(obj.decodeModeSharedExponent), 24);
1561 }
1562 void DumpVkPhysicalDeviceConditionalRenderingFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceConditionalRenderingFeaturesEXT &obj) {
1563     ObjectWrapper object{p, name};
1564     p.PrintKeyBool("conditionalRendering", static_cast<bool>(obj.conditionalRendering), 29);
1565     p.PrintKeyBool("inheritedConditionalRendering", static_cast<bool>(obj.inheritedConditionalRendering), 29);
1566 }
1567 void DumpVkPhysicalDeviceDiscardRectanglePropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceDiscardRectanglePropertiesEXT &obj) {
1568     ObjectWrapper object{p, name};
1569     p.PrintKeyValue("maxDiscardRectangles", obj.maxDiscardRectangles, 20);
1570 }
1571 void DumpVkPhysicalDeviceConservativeRasterizationPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceConservativeRasterizationPropertiesEXT &obj) {
1572     ObjectWrapper object{p, name};
1573     p.PrintKeyValue("primitiveOverestimationSize", obj.primitiveOverestimationSize, 43);
1574     p.PrintKeyValue("maxExtraPrimitiveOverestimationSize", obj.maxExtraPrimitiveOverestimationSize, 43);
1575     p.PrintKeyValue("extraPrimitiveOverestimationSizeGranularity", obj.extraPrimitiveOverestimationSizeGranularity, 43);
1576     p.PrintKeyBool("primitiveUnderestimation", static_cast<bool>(obj.primitiveUnderestimation), 43);
1577     p.PrintKeyBool("conservativePointAndLineRasterization", static_cast<bool>(obj.conservativePointAndLineRasterization), 43);
1578     p.PrintKeyBool("degenerateTrianglesRasterized", static_cast<bool>(obj.degenerateTrianglesRasterized), 43);
1579     p.PrintKeyBool("degenerateLinesRasterized", static_cast<bool>(obj.degenerateLinesRasterized), 43);
1580     p.PrintKeyBool("fullyCoveredFragmentShaderInputVariable", static_cast<bool>(obj.fullyCoveredFragmentShaderInputVariable), 43);
1581     p.PrintKeyBool("conservativeRasterizationPostDepthCoverage", static_cast<bool>(obj.conservativeRasterizationPostDepthCoverage), 43);
1582 }
1583 void DumpVkPhysicalDeviceDepthClipEnableFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceDepthClipEnableFeaturesEXT &obj) {
1584     ObjectWrapper object{p, name};
1585     p.PrintKeyBool("depthClipEnable", static_cast<bool>(obj.depthClipEnable), 15);
1586 }
1587 void DumpVkPhysicalDeviceInlineUniformBlockFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceInlineUniformBlockFeaturesEXT &obj) {
1588     ObjectWrapper object{p, name};
1589     p.PrintKeyBool("inlineUniformBlock", static_cast<bool>(obj.inlineUniformBlock), 50);
1590     p.PrintKeyBool("descriptorBindingInlineUniformBlockUpdateAfterBind", static_cast<bool>(obj.descriptorBindingInlineUniformBlockUpdateAfterBind), 50);
1591 }
1592 void DumpVkPhysicalDeviceInlineUniformBlockPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceInlineUniformBlockPropertiesEXT &obj) {
1593     ObjectWrapper object{p, name};
1594     p.PrintKeyValue("maxInlineUniformBlockSize", obj.maxInlineUniformBlockSize, 55);
1595     p.PrintKeyValue("maxPerStageDescriptorInlineUniformBlocks", obj.maxPerStageDescriptorInlineUniformBlocks, 55);
1596     p.PrintKeyValue("maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks", obj.maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks, 55);
1597     p.PrintKeyValue("maxDescriptorSetInlineUniformBlocks", obj.maxDescriptorSetInlineUniformBlocks, 55);
1598     p.PrintKeyValue("maxDescriptorSetUpdateAfterBindInlineUniformBlocks", obj.maxDescriptorSetUpdateAfterBindInlineUniformBlocks, 55);
1599 }
1600 void DumpVkPhysicalDeviceSampleLocationsPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceSampleLocationsPropertiesEXT &obj) {
1601     ObjectWrapper object{p, name};
1602     DumpVkSampleCountFlags(p, "sampleLocationSampleCounts", obj.sampleLocationSampleCounts, 32);
1603     DumpVkExtent2D(p, "maxSampleLocationGridSize", obj.maxSampleLocationGridSize);
1604     {   ArrayWrapper arr(p,"sampleLocationCoordinateRange", 2);
1605         p.PrintElement(obj.sampleLocationCoordinateRange[0]);
1606         p.PrintElement(obj.sampleLocationCoordinateRange[1]);
1607     }
1608     p.PrintKeyValue("sampleLocationSubPixelBits", obj.sampleLocationSubPixelBits, 32);
1609     p.PrintKeyBool("variableSampleLocations", static_cast<bool>(obj.variableSampleLocations), 32);
1610 }
1611 void DumpVkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT &obj) {
1612     ObjectWrapper object{p, name};
1613     p.PrintKeyBool("advancedBlendCoherentOperations", static_cast<bool>(obj.advancedBlendCoherentOperations), 31);
1614 }
1615 void DumpVkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT &obj) {
1616     ObjectWrapper object{p, name};
1617     p.PrintKeyValue("advancedBlendMaxColorAttachments", obj.advancedBlendMaxColorAttachments, 37);
1618     p.PrintKeyBool("advancedBlendIndependentBlend", static_cast<bool>(obj.advancedBlendIndependentBlend), 37);
1619     p.PrintKeyBool("advancedBlendNonPremultipliedSrcColor", static_cast<bool>(obj.advancedBlendNonPremultipliedSrcColor), 37);
1620     p.PrintKeyBool("advancedBlendNonPremultipliedDstColor", static_cast<bool>(obj.advancedBlendNonPremultipliedDstColor), 37);
1621     p.PrintKeyBool("advancedBlendCorrelatedOverlap", static_cast<bool>(obj.advancedBlendCorrelatedOverlap), 37);
1622     p.PrintKeyBool("advancedBlendAllOperations", static_cast<bool>(obj.advancedBlendAllOperations), 37);
1623 }
1624 void DumpVkDrmFormatModifierPropertiesEXT(Printer &p, std::string name, VkDrmFormatModifierPropertiesEXT &obj) {
1625     ObjectWrapper object{p, name};
1626     p.PrintKeyValue("drmFormatModifier", obj.drmFormatModifier, 27);
1627     p.PrintKeyValue("drmFormatModifierPlaneCount", obj.drmFormatModifierPlaneCount, 27);
1628     DumpVkFormatFeatureFlags(p, "drmFormatModifierTilingFeatures", obj.drmFormatModifierTilingFeatures, 27);
1629 }
1630 void DumpVkDrmFormatModifierPropertiesListEXT(Printer &p, std::string name, VkDrmFormatModifierPropertiesListEXT &obj) {
1631     ObjectWrapper object{p, name};
1632     p.PrintKeyValue("drmFormatModifierCount", obj.drmFormatModifierCount, 52);
1633     ArrayWrapper arr(p,"pDrmFormatModifierProperties", obj.drmFormatModifierCount);
1634     for (uint32_t i = 0; i < obj.drmFormatModifierCount; i++) {
1635         if (obj.pDrmFormatModifierProperties != nullptr) {
1636             p.SetElementIndex(i);
1637             DumpVkDrmFormatModifierPropertiesEXT(p, "pDrmFormatModifierProperties", obj.pDrmFormatModifierProperties[i]);
1638         }
1639     }
1640 }
1641 void DumpVkPhysicalDeviceExternalMemoryHostPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceExternalMemoryHostPropertiesEXT &obj) {
1642     ObjectWrapper object{p, name};
1643     p.PrintKeyValue("minImportedHostPointerAlignment", to_hex_str(p, obj.minImportedHostPointerAlignment), 31);
1644 }
1645 void DumpVkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT &obj) {
1646     ObjectWrapper object{p, name};
1647     p.PrintKeyValue("maxVertexAttribDivisor", obj.maxVertexAttribDivisor, 22);
1648 }
1649 void DumpVkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT &obj) {
1650     ObjectWrapper object{p, name};
1651     p.PrintKeyBool("vertexAttributeInstanceRateDivisor", static_cast<bool>(obj.vertexAttributeInstanceRateDivisor), 38);
1652     p.PrintKeyBool("vertexAttributeInstanceRateZeroDivisor", static_cast<bool>(obj.vertexAttributeInstanceRateZeroDivisor), 38);
1653 }
1654 void DumpVkPhysicalDevicePCIBusInfoPropertiesEXT(Printer &p, std::string name, VkPhysicalDevicePCIBusInfoPropertiesEXT &obj) {
1655     ObjectWrapper object{p, name};
1656     p.PrintKeyValue("pciDomain", obj.pciDomain, 11);
1657     p.PrintKeyValue("pciBus", obj.pciBus, 11);
1658     p.PrintKeyValue("pciDevice", obj.pciDevice, 11);
1659     p.PrintKeyValue("pciFunction", obj.pciFunction, 11);
1660 }
1661 void DumpVkPhysicalDeviceFragmentDensityMapFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceFragmentDensityMapFeaturesEXT &obj) {
1662     ObjectWrapper object{p, name};
1663     p.PrintKeyBool("fragmentDensityMap", static_cast<bool>(obj.fragmentDensityMap), 37);
1664     p.PrintKeyBool("fragmentDensityMapDynamic", static_cast<bool>(obj.fragmentDensityMapDynamic), 37);
1665     p.PrintKeyBool("fragmentDensityMapNonSubsampledImages", static_cast<bool>(obj.fragmentDensityMapNonSubsampledImages), 37);
1666 }
1667 void DumpVkPhysicalDeviceFragmentDensityMapPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceFragmentDensityMapPropertiesEXT &obj) {
1668     ObjectWrapper object{p, name};
1669     DumpVkExtent2D(p, "minFragmentDensityTexelSize", obj.minFragmentDensityTexelSize);
1670     DumpVkExtent2D(p, "maxFragmentDensityTexelSize", obj.maxFragmentDensityTexelSize);
1671     p.PrintKeyBool("fragmentDensityInvocations", static_cast<bool>(obj.fragmentDensityInvocations), 26);
1672 }
1673 void DumpVkPhysicalDeviceSubgroupSizeControlFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceSubgroupSizeControlFeaturesEXT &obj) {
1674     ObjectWrapper object{p, name};
1675     p.PrintKeyBool("subgroupSizeControl", static_cast<bool>(obj.subgroupSizeControl), 20);
1676     p.PrintKeyBool("computeFullSubgroups", static_cast<bool>(obj.computeFullSubgroups), 20);
1677 }
1678 void DumpVkPhysicalDeviceSubgroupSizeControlPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT &obj) {
1679     ObjectWrapper object{p, name};
1680     p.PrintKeyValue("minSubgroupSize", obj.minSubgroupSize, 28);
1681     p.PrintKeyValue("maxSubgroupSize", obj.maxSubgroupSize, 28);
1682     p.PrintKeyValue("maxComputeWorkgroupSubgroups", obj.maxComputeWorkgroupSubgroups, 28);
1683     DumpVkShaderStageFlags(p, "requiredSubgroupSizeStages", obj.requiredSubgroupSizeStages, 28);
1684 }
1685 void DumpVkPhysicalDeviceMemoryBudgetPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceMemoryBudgetPropertiesEXT &obj) {
1686     ObjectWrapper object{p, name};
1687     {   ArrayWrapper arr(p,"heapBudget", 16);
1688         p.PrintElement(obj.heapBudget[0]);
1689         p.PrintElement(obj.heapBudget[1]);
1690         p.PrintElement(obj.heapBudget[2]);
1691         p.PrintElement(obj.heapBudget[3]);
1692         p.PrintElement(obj.heapBudget[4]);
1693         p.PrintElement(obj.heapBudget[5]);
1694         p.PrintElement(obj.heapBudget[6]);
1695         p.PrintElement(obj.heapBudget[7]);
1696         p.PrintElement(obj.heapBudget[8]);
1697         p.PrintElement(obj.heapBudget[9]);
1698         p.PrintElement(obj.heapBudget[10]);
1699         p.PrintElement(obj.heapBudget[11]);
1700         p.PrintElement(obj.heapBudget[12]);
1701         p.PrintElement(obj.heapBudget[13]);
1702         p.PrintElement(obj.heapBudget[14]);
1703         p.PrintElement(obj.heapBudget[15]);
1704     }
1705     {   ArrayWrapper arr(p,"heapUsage", 16);
1706         p.PrintElement(obj.heapUsage[0]);
1707         p.PrintElement(obj.heapUsage[1]);
1708         p.PrintElement(obj.heapUsage[2]);
1709         p.PrintElement(obj.heapUsage[3]);
1710         p.PrintElement(obj.heapUsage[4]);
1711         p.PrintElement(obj.heapUsage[5]);
1712         p.PrintElement(obj.heapUsage[6]);
1713         p.PrintElement(obj.heapUsage[7]);
1714         p.PrintElement(obj.heapUsage[8]);
1715         p.PrintElement(obj.heapUsage[9]);
1716         p.PrintElement(obj.heapUsage[10]);
1717         p.PrintElement(obj.heapUsage[11]);
1718         p.PrintElement(obj.heapUsage[12]);
1719         p.PrintElement(obj.heapUsage[13]);
1720         p.PrintElement(obj.heapUsage[14]);
1721         p.PrintElement(obj.heapUsage[15]);
1722     }
1723 }
1724 void DumpVkPhysicalDeviceMemoryPriorityFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceMemoryPriorityFeaturesEXT &obj) {
1725     ObjectWrapper object{p, name};
1726     p.PrintKeyBool("memoryPriority", static_cast<bool>(obj.memoryPriority), 14);
1727 }
1728 void DumpVkPhysicalDeviceBufferDeviceAddressFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceBufferDeviceAddressFeaturesEXT &obj) {
1729     ObjectWrapper object{p, name};
1730     p.PrintKeyBool("bufferDeviceAddress", static_cast<bool>(obj.bufferDeviceAddress), 32);
1731     p.PrintKeyBool("bufferDeviceAddressCaptureReplay", static_cast<bool>(obj.bufferDeviceAddressCaptureReplay), 32);
1732     p.PrintKeyBool("bufferDeviceAddressMultiDevice", static_cast<bool>(obj.bufferDeviceAddressMultiDevice), 32);
1733 }
1734 void DumpVkPhysicalDeviceToolPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceToolPropertiesEXT &obj) {
1735     ObjectWrapper object{p, name};
1736     p.PrintKeyString("name", obj.name, 16);
1737     p.PrintKeyString("version", obj.version, 16);
1738     DumpVkToolPurposeFlagsEXT(p, "purposes", obj.purposes, 16);
1739     p.PrintKeyString("description", obj.description, 16);
1740     p.PrintKeyString("layer", obj.layer, 16);
1741 }
1742 void DumpVkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT &obj) {
1743     ObjectWrapper object{p, name};
1744     p.PrintKeyBool("fragmentShaderSampleInterlock", static_cast<bool>(obj.fragmentShaderSampleInterlock), 34);
1745     p.PrintKeyBool("fragmentShaderPixelInterlock", static_cast<bool>(obj.fragmentShaderPixelInterlock), 34);
1746     p.PrintKeyBool("fragmentShaderShadingRateInterlock", static_cast<bool>(obj.fragmentShaderShadingRateInterlock), 34);
1747 }
1748 void DumpVkPhysicalDeviceYcbcrImageArraysFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceYcbcrImageArraysFeaturesEXT &obj) {
1749     ObjectWrapper object{p, name};
1750     p.PrintKeyBool("ycbcrImageArrays", static_cast<bool>(obj.ycbcrImageArrays), 16);
1751 }
1752 #ifdef VK_USE_PLATFORM_WIN32_KHR
1753 void DumpVkSurfaceCapabilitiesFullScreenExclusiveEXT(Printer &p, std::string name, VkSurfaceCapabilitiesFullScreenExclusiveEXT &obj) {
1754     ObjectWrapper object{p, name};
1755     p.PrintKeyBool("fullScreenExclusiveSupported", static_cast<bool>(obj.fullScreenExclusiveSupported), 28);
1756 }
1757 #endif  // VK_USE_PLATFORM_WIN32_KHR
1758 void DumpVkPhysicalDeviceLineRasterizationFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceLineRasterizationFeaturesEXT &obj) {
1759     ObjectWrapper object{p, name};
1760     p.PrintKeyBool("rectangularLines", static_cast<bool>(obj.rectangularLines), 24);
1761     p.PrintKeyBool("bresenhamLines", static_cast<bool>(obj.bresenhamLines), 24);
1762     p.PrintKeyBool("smoothLines", static_cast<bool>(obj.smoothLines), 24);
1763     p.PrintKeyBool("stippledRectangularLines", static_cast<bool>(obj.stippledRectangularLines), 24);
1764     p.PrintKeyBool("stippledBresenhamLines", static_cast<bool>(obj.stippledBresenhamLines), 24);
1765     p.PrintKeyBool("stippledSmoothLines", static_cast<bool>(obj.stippledSmoothLines), 24);
1766 }
1767 void DumpVkPhysicalDeviceLineRasterizationPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceLineRasterizationPropertiesEXT &obj) {
1768     ObjectWrapper object{p, name};
1769     p.PrintKeyValue("lineSubPixelPrecisionBits", obj.lineSubPixelPrecisionBits, 25);
1770 }
1771 void DumpVkPhysicalDeviceIndexTypeUint8FeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceIndexTypeUint8FeaturesEXT &obj) {
1772     ObjectWrapper object{p, name};
1773     p.PrintKeyBool("indexTypeUint8", static_cast<bool>(obj.indexTypeUint8), 14);
1774 }
1775 void DumpVkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT &obj) {
1776     ObjectWrapper object{p, name};
1777     p.PrintKeyBool("shaderDemoteToHelperInvocation", static_cast<bool>(obj.shaderDemoteToHelperInvocation), 30);
1778 }
1779 void DumpVkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT &obj) {
1780     ObjectWrapper object{p, name};
1781     p.PrintKeyBool("texelBufferAlignment", static_cast<bool>(obj.texelBufferAlignment), 20);
1782 }
1783 void DumpVkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT &obj) {
1784     ObjectWrapper object{p, name};
1785     p.PrintKeyValue("storageTexelBufferOffsetAlignmentBytes", to_hex_str(p, obj.storageTexelBufferOffsetAlignmentBytes), 44);
1786     p.PrintKeyBool("storageTexelBufferOffsetSingleTexelAlignment", static_cast<bool>(obj.storageTexelBufferOffsetSingleTexelAlignment), 44);
1787     p.PrintKeyValue("uniformTexelBufferOffsetAlignmentBytes", to_hex_str(p, obj.uniformTexelBufferOffsetAlignmentBytes), 44);
1788     p.PrintKeyBool("uniformTexelBufferOffsetSingleTexelAlignment", static_cast<bool>(obj.uniformTexelBufferOffsetSingleTexelAlignment), 44);
1789 }
1790 void DumpVkPhysicalDeviceRobustness2FeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceRobustness2FeaturesEXT &obj) {
1791     ObjectWrapper object{p, name};
1792     p.PrintKeyBool("robustBufferAccess2", static_cast<bool>(obj.robustBufferAccess2), 19);
1793     p.PrintKeyBool("robustImageAccess2", static_cast<bool>(obj.robustImageAccess2), 19);
1794     p.PrintKeyBool("nullDescriptor", static_cast<bool>(obj.nullDescriptor), 19);
1795 }
1796 void DumpVkPhysicalDeviceRobustness2PropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceRobustness2PropertiesEXT &obj) {
1797     ObjectWrapper object{p, name};
1798     p.PrintKeyValue("robustStorageBufferAccessSizeAlignment", to_hex_str(p, obj.robustStorageBufferAccessSizeAlignment), 38);
1799     p.PrintKeyValue("robustUniformBufferAccessSizeAlignment", to_hex_str(p, obj.robustUniformBufferAccessSizeAlignment), 38);
1800 }
1801 void DumpVkPhysicalDeviceCustomBorderColorPropertiesEXT(Printer &p, std::string name, VkPhysicalDeviceCustomBorderColorPropertiesEXT &obj) {
1802     ObjectWrapper object{p, name};
1803     p.PrintKeyValue("maxCustomBorderColorSamplers", obj.maxCustomBorderColorSamplers, 28);
1804 }
1805 void DumpVkPhysicalDeviceCustomBorderColorFeaturesEXT(Printer &p, std::string name, VkPhysicalDeviceCustomBorderColorFeaturesEXT &obj) {
1806     ObjectWrapper object{p, name};
1807     p.PrintKeyBool("customBorderColors", static_cast<bool>(obj.customBorderColors), 30);
1808     p.PrintKeyBool("customBorderColorWithoutFormat", static_cast<bool>(obj.customBorderColorWithoutFormat), 30);
1809 }
1810 void DumpVkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(Printer &p, std::string name, VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT &obj) {
1811     ObjectWrapper object{p, name};
1812     p.PrintKeyBool("pipelineCreationCacheControl", static_cast<bool>(obj.pipelineCreationCacheControl), 28);
1813 }
1814 #ifdef VK_ENABLE_BETA_EXTENSIONS
1815 void DumpVkPhysicalDeviceRayTracingFeaturesKHR(Printer &p, std::string name, VkPhysicalDeviceRayTracingFeaturesKHR &obj) {
1816     ObjectWrapper object{p, name};
1817     p.PrintKeyBool("rayTracing", static_cast<bool>(obj.rayTracing), 45);
1818     p.PrintKeyBool("rayTracingShaderGroupHandleCaptureReplay", static_cast<bool>(obj.rayTracingShaderGroupHandleCaptureReplay), 45);
1819     p.PrintKeyBool("rayTracingShaderGroupHandleCaptureReplayMixed", static_cast<bool>(obj.rayTracingShaderGroupHandleCaptureReplayMixed), 45);
1820     p.PrintKeyBool("rayTracingAccelerationStructureCaptureReplay", static_cast<bool>(obj.rayTracingAccelerationStructureCaptureReplay), 45);
1821     p.PrintKeyBool("rayTracingIndirectTraceRays", static_cast<bool>(obj.rayTracingIndirectTraceRays), 45);
1822     p.PrintKeyBool("rayTracingIndirectAccelerationStructureBuild", static_cast<bool>(obj.rayTracingIndirectAccelerationStructureBuild), 45);
1823     p.PrintKeyBool("rayTracingHostAccelerationStructureCommands", static_cast<bool>(obj.rayTracingHostAccelerationStructureCommands), 45);
1824     p.PrintKeyBool("rayQuery", static_cast<bool>(obj.rayQuery), 45);
1825     p.PrintKeyBool("rayTracingPrimitiveCulling", static_cast<bool>(obj.rayTracingPrimitiveCulling), 45);
1826 }
1827 #endif  // VK_ENABLE_BETA_EXTENSIONS
1828 #ifdef VK_ENABLE_BETA_EXTENSIONS
1829 void DumpVkPhysicalDeviceRayTracingPropertiesKHR(Printer &p, std::string name, VkPhysicalDeviceRayTracingPropertiesKHR &obj) {
1830     ObjectWrapper object{p, name};
1831     p.PrintKeyValue("shaderGroupHandleSize", obj.shaderGroupHandleSize, 38);
1832     p.PrintKeyValue("maxRecursionDepth", obj.maxRecursionDepth, 38);
1833     p.PrintKeyValue("maxShaderGroupStride", obj.maxShaderGroupStride, 38);
1834     p.PrintKeyValue("shaderGroupBaseAlignment", obj.shaderGroupBaseAlignment, 38);
1835     p.PrintKeyValue("maxGeometryCount", obj.maxGeometryCount, 38);
1836     p.PrintKeyValue("maxInstanceCount", obj.maxInstanceCount, 38);
1837     p.PrintKeyValue("maxPrimitiveCount", obj.maxPrimitiveCount, 38);
1838     p.PrintKeyValue("maxDescriptorSetAccelerationStructures", obj.maxDescriptorSetAccelerationStructures, 38);
1839     p.PrintKeyValue("shaderGroupHandleCaptureReplaySize", obj.shaderGroupHandleCaptureReplaySize, 38);
1840 }
1841 #endif  // VK_ENABLE_BETA_EXTENSIONS
1842 pNextChainInfos get_chain_infos() {
1843     pNextChainInfos infos;
1844     infos.phys_device_props2 = {
1845         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT, sizeof(VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT)},
1846         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT, sizeof(VkPhysicalDeviceConservativeRasterizationPropertiesEXT)},
1847         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT, sizeof(VkPhysicalDeviceCustomBorderColorPropertiesEXT)},
1848         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES, sizeof(VkPhysicalDeviceDepthStencilResolveProperties)},
1849         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES, sizeof(VkPhysicalDeviceDescriptorIndexingProperties)},
1850         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT, sizeof(VkPhysicalDeviceDiscardRectanglePropertiesEXT)},
1851         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, sizeof(VkPhysicalDeviceDriverProperties)},
1852         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, sizeof(VkPhysicalDeviceExternalMemoryHostPropertiesEXT)},
1853         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, sizeof(VkPhysicalDeviceFloatControlsProperties)},
1854         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT, sizeof(VkPhysicalDeviceFragmentDensityMapPropertiesEXT)},
1855         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES, sizeof(VkPhysicalDeviceIDProperties)},
1856         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT, sizeof(VkPhysicalDeviceInlineUniformBlockPropertiesEXT)},
1857         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT, sizeof(VkPhysicalDeviceLineRasterizationPropertiesEXT)},
1858         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, sizeof(VkPhysicalDeviceMaintenance3Properties)},
1859         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, sizeof(VkPhysicalDeviceMultiviewProperties)},
1860         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT, sizeof(VkPhysicalDevicePCIBusInfoPropertiesEXT)},
1861         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR, sizeof(VkPhysicalDevicePerformanceQueryPropertiesKHR)},
1862         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, sizeof(VkPhysicalDevicePointClippingProperties)},
1863         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES, sizeof(VkPhysicalDeviceProtectedMemoryProperties)},
1864         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, sizeof(VkPhysicalDevicePushDescriptorPropertiesKHR)},
1865 #ifdef VK_ENABLE_BETA_EXTENSIONS
1866         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_KHR, sizeof(VkPhysicalDeviceRayTracingPropertiesKHR)},
1867 #endif  // VK_ENABLE_BETA_EXTENSIONS
1868         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT, sizeof(VkPhysicalDeviceRobustness2PropertiesEXT)},
1869         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT, sizeof(VkPhysicalDeviceSampleLocationsPropertiesEXT)},
1870         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES, sizeof(VkPhysicalDeviceSamplerFilterMinmaxProperties)},
1871         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, sizeof(VkPhysicalDeviceSubgroupProperties)},
1872         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT, sizeof(VkPhysicalDeviceSubgroupSizeControlPropertiesEXT)},
1873         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, sizeof(VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT)},
1874         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES, sizeof(VkPhysicalDeviceTimelineSemaphoreProperties)},
1875         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT, sizeof(VkPhysicalDeviceTransformFeedbackPropertiesEXT)},
1876         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, sizeof(VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT)},
1877         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, sizeof(VkPhysicalDeviceVulkan11Properties)},
1878         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES, sizeof(VkPhysicalDeviceVulkan12Properties)},
1879     };
1880     infos.phys_device_mem_props2 = {
1881         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT, sizeof(VkPhysicalDeviceMemoryBudgetPropertiesEXT)},
1882     };
1883     infos.phys_device_features2 = {
1884         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, sizeof(VkPhysicalDevice16BitStorageFeatures)},
1885         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, sizeof(VkPhysicalDevice8BitStorageFeatures)},
1886         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, sizeof(VkPhysicalDeviceASTCDecodeFeaturesEXT)},
1887         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, sizeof(VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT)},
1888         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, sizeof(VkPhysicalDeviceBufferDeviceAddressFeatures)},
1889         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, sizeof(VkPhysicalDeviceBufferDeviceAddressFeaturesEXT)},
1890         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, sizeof(VkPhysicalDeviceConditionalRenderingFeaturesEXT)},
1891         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, sizeof(VkPhysicalDeviceCustomBorderColorFeaturesEXT)},
1892         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, sizeof(VkPhysicalDeviceDepthClipEnableFeaturesEXT)},
1893         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, sizeof(VkPhysicalDeviceDescriptorIndexingFeatures)},
1894         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, sizeof(VkPhysicalDeviceFragmentDensityMapFeaturesEXT)},
1895         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, sizeof(VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT)},
1896         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, sizeof(VkPhysicalDeviceHostQueryResetFeatures)},
1897         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, sizeof(VkPhysicalDeviceImagelessFramebufferFeatures)},
1898         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, sizeof(VkPhysicalDeviceIndexTypeUint8FeaturesEXT)},
1899         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, sizeof(VkPhysicalDeviceInlineUniformBlockFeaturesEXT)},
1900         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, sizeof(VkPhysicalDeviceLineRasterizationFeaturesEXT)},
1901         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, sizeof(VkPhysicalDeviceMemoryPriorityFeaturesEXT)},
1902         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, sizeof(VkPhysicalDeviceMultiviewFeatures)},
1903         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR, sizeof(VkPhysicalDevicePerformanceQueryFeaturesKHR)},
1904         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT, sizeof(VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT)},
1905         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, sizeof(VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR)},
1906         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, sizeof(VkPhysicalDeviceProtectedMemoryFeatures)},
1907 #ifdef VK_ENABLE_BETA_EXTENSIONS
1908         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_FEATURES_KHR, sizeof(VkPhysicalDeviceRayTracingFeaturesKHR)},
1909 #endif  // VK_ENABLE_BETA_EXTENSIONS
1910         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, sizeof(VkPhysicalDeviceRobustness2FeaturesEXT)},
1911         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, sizeof(VkPhysicalDeviceSamplerYcbcrConversionFeatures)},
1912         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, sizeof(VkPhysicalDeviceScalarBlockLayoutFeatures)},
1913         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, sizeof(VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures)},
1914         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, sizeof(VkPhysicalDeviceShaderAtomicInt64Features)},
1915         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, sizeof(VkPhysicalDeviceShaderClockFeaturesKHR)},
1916         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT, sizeof(VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT)},
1917         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, sizeof(VkPhysicalDeviceShaderDrawParametersFeatures)},
1918         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, sizeof(VkPhysicalDeviceShaderFloat16Int8Features)},
1919         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, sizeof(VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures)},
1920         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT, sizeof(VkPhysicalDeviceSubgroupSizeControlFeaturesEXT)},
1921         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, sizeof(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT)},
1922         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT, sizeof(VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT)},
1923         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, sizeof(VkPhysicalDeviceTimelineSemaphoreFeatures)},
1924         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, sizeof(VkPhysicalDeviceTransformFeedbackFeaturesEXT)},
1925         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, sizeof(VkPhysicalDeviceUniformBufferStandardLayoutFeatures)},
1926         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, sizeof(VkPhysicalDeviceVariablePointersFeatures)},
1927         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, sizeof(VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT)},
1928         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, sizeof(VkPhysicalDeviceVulkan11Features)},
1929         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, sizeof(VkPhysicalDeviceVulkan12Features)},
1930         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, sizeof(VkPhysicalDeviceVulkanMemoryModelFeatures)},
1931         {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT, sizeof(VkPhysicalDeviceYcbcrImageArraysFeaturesEXT)},
1932     };
1933     infos.surface_capabilities2 = {
1934         {VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR, sizeof(VkSharedPresentSurfaceCapabilitiesKHR)},
1935 #ifdef VK_USE_PLATFORM_WIN32_KHR
1936         {VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT, sizeof(VkSurfaceCapabilitiesFullScreenExclusiveEXT)},
1937 #endif  // VK_USE_PLATFORM_WIN32_KHR
1938         {VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR, sizeof(VkSurfaceProtectedCapabilitiesKHR)},
1939     };
1940     infos.format_properties2 = {
1941         {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT, sizeof(VkDrmFormatModifierPropertiesListEXT)},
1942     };
1943     return infos;
1944 }
1945 void chain_iterator_phys_device_props2(Printer &p, AppInstance &inst, AppGpu &gpu, void * place, VulkanVersion version) {
1946     while (place) {
1947         struct VkStructureHeader *structure = (struct VkStructureHeader *)place;
1948         p.SetSubHeader();
1949         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES && 
1950            (version.minor >= 1)) {
1951             VkPhysicalDeviceSubgroupProperties* props = (VkPhysicalDeviceSubgroupProperties*)structure;
1952             DumpVkPhysicalDeviceSubgroupProperties(p, "VkPhysicalDeviceSubgroupProperties", *props);
1953             p.AddNewline();
1954         }
1955         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES && 
1956            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_MAINTENANCE2_EXTENSION_NAME) ||
1957             version.minor >= 1)) {
1958             VkPhysicalDevicePointClippingProperties* props = (VkPhysicalDevicePointClippingProperties*)structure;
1959             DumpVkPhysicalDevicePointClippingProperties(p, version.minor >= 1 ?"VkPhysicalDevicePointClippingProperties":"VkPhysicalDevicePointClippingPropertiesKHR", *props);
1960             p.AddNewline();
1961         }
1962         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES && 
1963            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_MULTIVIEW_EXTENSION_NAME) ||
1964             version.minor >= 1)) {
1965             VkPhysicalDeviceMultiviewProperties* props = (VkPhysicalDeviceMultiviewProperties*)structure;
1966             DumpVkPhysicalDeviceMultiviewProperties(p, version.minor >= 1 ?"VkPhysicalDeviceMultiviewProperties":"VkPhysicalDeviceMultiviewPropertiesKHR", *props);
1967             p.AddNewline();
1968         }
1969         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES && 
1970            (version.minor >= 1)) {
1971             VkPhysicalDeviceProtectedMemoryProperties* props = (VkPhysicalDeviceProtectedMemoryProperties*)structure;
1972             DumpVkPhysicalDeviceProtectedMemoryProperties(p, "VkPhysicalDeviceProtectedMemoryProperties", *props);
1973             p.AddNewline();
1974         }
1975         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES && 
1976            (inst.CheckExtensionEnabled(VK_KHR_EXTERNAL_FENCE_CAPABILITIES_EXTENSION_NAME) ||
1977             version.minor >= 1)) {
1978             VkPhysicalDeviceIDProperties* props = (VkPhysicalDeviceIDProperties*)structure;
1979             DumpVkPhysicalDeviceIDProperties(p, version.minor >= 1 ?"VkPhysicalDeviceIDProperties":"VkPhysicalDeviceIDPropertiesKHR", *props);
1980             p.AddNewline();
1981         }
1982         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES && 
1983            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_MAINTENANCE3_EXTENSION_NAME) ||
1984             version.minor >= 1)) {
1985             VkPhysicalDeviceMaintenance3Properties* props = (VkPhysicalDeviceMaintenance3Properties*)structure;
1986             DumpVkPhysicalDeviceMaintenance3Properties(p, version.minor >= 1 ?"VkPhysicalDeviceMaintenance3Properties":"VkPhysicalDeviceMaintenance3PropertiesKHR", *props);
1987             p.AddNewline();
1988         }
1989         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES && 
1990            (version.minor >= 2)) {
1991             VkPhysicalDeviceVulkan11Properties* props = (VkPhysicalDeviceVulkan11Properties*)structure;
1992             DumpVkPhysicalDeviceVulkan11Properties(p, "VkPhysicalDeviceVulkan11Properties", *props);
1993             p.AddNewline();
1994         }
1995         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES && 
1996            (version.minor >= 2)) {
1997             VkPhysicalDeviceVulkan12Properties* props = (VkPhysicalDeviceVulkan12Properties*)structure;
1998             DumpVkPhysicalDeviceVulkan12Properties(p, "VkPhysicalDeviceVulkan12Properties", *props);
1999             p.AddNewline();
2000         }
2001         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES && 
2002            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME) ||
2003             version.minor >= 2)) {
2004             VkPhysicalDeviceDriverProperties* props = (VkPhysicalDeviceDriverProperties*)structure;
2005             DumpVkPhysicalDeviceDriverProperties(p, version.minor >= 2 ?"VkPhysicalDeviceDriverProperties":"VkPhysicalDeviceDriverPropertiesKHR", *props);
2006             p.AddNewline();
2007         }
2008         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES && 
2009            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME) ||
2010             version.minor >= 2)) {
2011             VkPhysicalDeviceFloatControlsProperties* props = (VkPhysicalDeviceFloatControlsProperties*)structure;
2012             DumpVkPhysicalDeviceFloatControlsProperties(p, version.minor >= 2 ?"VkPhysicalDeviceFloatControlsProperties":"VkPhysicalDeviceFloatControlsPropertiesKHR", *props);
2013             p.AddNewline();
2014         }
2015         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES && 
2016            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME) ||
2017             version.minor >= 2)) {
2018             VkPhysicalDeviceDescriptorIndexingProperties* props = (VkPhysicalDeviceDescriptorIndexingProperties*)structure;
2019             DumpVkPhysicalDeviceDescriptorIndexingProperties(p, version.minor >= 2 ?"VkPhysicalDeviceDescriptorIndexingProperties":"VkPhysicalDeviceDescriptorIndexingPropertiesEXT", *props);
2020             p.AddNewline();
2021         }
2022         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES && 
2023            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME) ||
2024             version.minor >= 2)) {
2025             VkPhysicalDeviceDepthStencilResolveProperties* props = (VkPhysicalDeviceDepthStencilResolveProperties*)structure;
2026             DumpVkPhysicalDeviceDepthStencilResolveProperties(p, version.minor >= 2 ?"VkPhysicalDeviceDepthStencilResolveProperties":"VkPhysicalDeviceDepthStencilResolvePropertiesKHR", *props);
2027             p.AddNewline();
2028         }
2029         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES && 
2030            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME) ||
2031             version.minor >= 2)) {
2032             VkPhysicalDeviceSamplerFilterMinmaxProperties* props = (VkPhysicalDeviceSamplerFilterMinmaxProperties*)structure;
2033             DumpVkPhysicalDeviceSamplerFilterMinmaxProperties(p, version.minor >= 2 ?"VkPhysicalDeviceSamplerFilterMinmaxProperties":"VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT", *props);
2034             p.AddNewline();
2035         }
2036         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES && 
2037            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME) ||
2038             version.minor >= 2)) {
2039             VkPhysicalDeviceTimelineSemaphoreProperties* props = (VkPhysicalDeviceTimelineSemaphoreProperties*)structure;
2040             DumpVkPhysicalDeviceTimelineSemaphoreProperties(p, version.minor >= 2 ?"VkPhysicalDeviceTimelineSemaphoreProperties":"VkPhysicalDeviceTimelineSemaphorePropertiesKHR", *props);
2041             p.AddNewline();
2042         }
2043         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR && 
2044            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME))) {
2045             VkPhysicalDevicePushDescriptorPropertiesKHR* props = (VkPhysicalDevicePushDescriptorPropertiesKHR*)structure;
2046             DumpVkPhysicalDevicePushDescriptorPropertiesKHR(p, "VkPhysicalDevicePushDescriptorPropertiesKHR", *props);
2047             p.AddNewline();
2048         }
2049         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR && 
2050            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME))) {
2051             VkPhysicalDevicePerformanceQueryPropertiesKHR* props = (VkPhysicalDevicePerformanceQueryPropertiesKHR*)structure;
2052             DumpVkPhysicalDevicePerformanceQueryPropertiesKHR(p, "VkPhysicalDevicePerformanceQueryPropertiesKHR", *props);
2053             p.AddNewline();
2054         }
2055         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT && 
2056            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME))) {
2057             VkPhysicalDeviceTransformFeedbackPropertiesEXT* props = (VkPhysicalDeviceTransformFeedbackPropertiesEXT*)structure;
2058             DumpVkPhysicalDeviceTransformFeedbackPropertiesEXT(p, "VkPhysicalDeviceTransformFeedbackPropertiesEXT", *props);
2059             p.AddNewline();
2060         }
2061         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT && 
2062            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME))) {
2063             VkPhysicalDeviceDiscardRectanglePropertiesEXT* props = (VkPhysicalDeviceDiscardRectanglePropertiesEXT*)structure;
2064             DumpVkPhysicalDeviceDiscardRectanglePropertiesEXT(p, "VkPhysicalDeviceDiscardRectanglePropertiesEXT", *props);
2065             p.AddNewline();
2066         }
2067         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT && 
2068            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME))) {
2069             VkPhysicalDeviceConservativeRasterizationPropertiesEXT* props = (VkPhysicalDeviceConservativeRasterizationPropertiesEXT*)structure;
2070             DumpVkPhysicalDeviceConservativeRasterizationPropertiesEXT(p, "VkPhysicalDeviceConservativeRasterizationPropertiesEXT", *props);
2071             p.AddNewline();
2072         }
2073         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT && 
2074            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME))) {
2075             VkPhysicalDeviceInlineUniformBlockPropertiesEXT* props = (VkPhysicalDeviceInlineUniformBlockPropertiesEXT*)structure;
2076             DumpVkPhysicalDeviceInlineUniformBlockPropertiesEXT(p, "VkPhysicalDeviceInlineUniformBlockPropertiesEXT", *props);
2077             p.AddNewline();
2078         }
2079         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT && 
2080            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME))) {
2081             VkPhysicalDeviceSampleLocationsPropertiesEXT* props = (VkPhysicalDeviceSampleLocationsPropertiesEXT*)structure;
2082             DumpVkPhysicalDeviceSampleLocationsPropertiesEXT(p, "VkPhysicalDeviceSampleLocationsPropertiesEXT", *props);
2083             p.AddNewline();
2084         }
2085         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT && 
2086            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME))) {
2087             VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* props = (VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*)structure;
2088             DumpVkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(p, "VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT", *props);
2089             p.AddNewline();
2090         }
2091         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT && 
2092            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME))) {
2093             VkPhysicalDeviceExternalMemoryHostPropertiesEXT* props = (VkPhysicalDeviceExternalMemoryHostPropertiesEXT*)structure;
2094             DumpVkPhysicalDeviceExternalMemoryHostPropertiesEXT(p, "VkPhysicalDeviceExternalMemoryHostPropertiesEXT", *props);
2095             p.AddNewline();
2096         }
2097         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT && 
2098            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME))) {
2099             VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* props = (VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*)structure;
2100             DumpVkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(p, "VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT", *props);
2101             p.AddNewline();
2102         }
2103         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT && 
2104            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_PCI_BUS_INFO_EXTENSION_NAME))) {
2105             VkPhysicalDevicePCIBusInfoPropertiesEXT* props = (VkPhysicalDevicePCIBusInfoPropertiesEXT*)structure;
2106             DumpVkPhysicalDevicePCIBusInfoPropertiesEXT(p, "VkPhysicalDevicePCIBusInfoPropertiesEXT", *props);
2107             p.AddNewline();
2108         }
2109         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT && 
2110            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME))) {
2111             VkPhysicalDeviceFragmentDensityMapPropertiesEXT* props = (VkPhysicalDeviceFragmentDensityMapPropertiesEXT*)structure;
2112             DumpVkPhysicalDeviceFragmentDensityMapPropertiesEXT(p, "VkPhysicalDeviceFragmentDensityMapPropertiesEXT", *props);
2113             p.AddNewline();
2114         }
2115         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT && 
2116            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME))) {
2117             VkPhysicalDeviceSubgroupSizeControlPropertiesEXT* props = (VkPhysicalDeviceSubgroupSizeControlPropertiesEXT*)structure;
2118             DumpVkPhysicalDeviceSubgroupSizeControlPropertiesEXT(p, "VkPhysicalDeviceSubgroupSizeControlPropertiesEXT", *props);
2119             p.AddNewline();
2120         }
2121         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT && 
2122            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME))) {
2123             VkPhysicalDeviceLineRasterizationPropertiesEXT* props = (VkPhysicalDeviceLineRasterizationPropertiesEXT*)structure;
2124             DumpVkPhysicalDeviceLineRasterizationPropertiesEXT(p, "VkPhysicalDeviceLineRasterizationPropertiesEXT", *props);
2125             p.AddNewline();
2126         }
2127         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT && 
2128            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME))) {
2129             VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT* props = (VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT*)structure;
2130             DumpVkPhysicalDeviceTexelBufferAlignmentPropertiesEXT(p, "VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT", *props);
2131             p.AddNewline();
2132         }
2133         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT && 
2134            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME))) {
2135             VkPhysicalDeviceRobustness2PropertiesEXT* props = (VkPhysicalDeviceRobustness2PropertiesEXT*)structure;
2136             DumpVkPhysicalDeviceRobustness2PropertiesEXT(p, "VkPhysicalDeviceRobustness2PropertiesEXT", *props);
2137             p.AddNewline();
2138         }
2139         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT && 
2140            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME))) {
2141             VkPhysicalDeviceCustomBorderColorPropertiesEXT* props = (VkPhysicalDeviceCustomBorderColorPropertiesEXT*)structure;
2142             DumpVkPhysicalDeviceCustomBorderColorPropertiesEXT(p, "VkPhysicalDeviceCustomBorderColorPropertiesEXT", *props);
2143             p.AddNewline();
2144         }
2145 #ifdef VK_ENABLE_BETA_EXTENSIONS
2146         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_KHR && 
2147            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_RAY_TRACING_EXTENSION_NAME))) {
2148             VkPhysicalDeviceRayTracingPropertiesKHR* props = (VkPhysicalDeviceRayTracingPropertiesKHR*)structure;
2149             DumpVkPhysicalDeviceRayTracingPropertiesKHR(p, "VkPhysicalDeviceRayTracingPropertiesKHR", *props);
2150             p.AddNewline();
2151         }
2152 #endif  // VK_ENABLE_BETA_EXTENSIONS
2153         place = structure->pNext;
2154     }
2155 }
2156 void chain_iterator_phys_device_mem_props2(Printer &p, AppGpu &gpu, void * place, VulkanVersion version) {
2157     while (place) {
2158         struct VkStructureHeader *structure = (struct VkStructureHeader *)place;
2159         p.SetSubHeader();
2160         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT && 
2161            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME))) {
2162             VkPhysicalDeviceMemoryBudgetPropertiesEXT* props = (VkPhysicalDeviceMemoryBudgetPropertiesEXT*)structure;
2163             DumpVkPhysicalDeviceMemoryBudgetPropertiesEXT(p, "VkPhysicalDeviceMemoryBudgetPropertiesEXT", *props);
2164             p.AddNewline();
2165         }
2166         place = structure->pNext;
2167     }
2168 }
2169 void chain_iterator_phys_device_features2(Printer &p, AppGpu &gpu, void * place, VulkanVersion version) {
2170     while (place) {
2171         struct VkStructureHeader *structure = (struct VkStructureHeader *)place;
2172         p.SetSubHeader();
2173         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES && 
2174            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_16BIT_STORAGE_EXTENSION_NAME) ||
2175             version.minor >= 1)) {
2176             VkPhysicalDevice16BitStorageFeatures* props = (VkPhysicalDevice16BitStorageFeatures*)structure;
2177             DumpVkPhysicalDevice16BitStorageFeatures(p, version.minor >= 1 ?"VkPhysicalDevice16BitStorageFeatures":"VkPhysicalDevice16BitStorageFeaturesKHR", *props);
2178             p.AddNewline();
2179         }
2180         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES && 
2181            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_MULTIVIEW_EXTENSION_NAME) ||
2182             version.minor >= 1)) {
2183             VkPhysicalDeviceMultiviewFeatures* props = (VkPhysicalDeviceMultiviewFeatures*)structure;
2184             DumpVkPhysicalDeviceMultiviewFeatures(p, version.minor >= 1 ?"VkPhysicalDeviceMultiviewFeatures":"VkPhysicalDeviceMultiviewFeaturesKHR", *props);
2185             p.AddNewline();
2186         }
2187         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES && 
2188            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME) ||
2189             version.minor >= 1)) {
2190             VkPhysicalDeviceVariablePointersFeatures* props = (VkPhysicalDeviceVariablePointersFeatures*)structure;
2191             DumpVkPhysicalDeviceVariablePointersFeatures(p, version.minor >= 1 ?"VkPhysicalDeviceVariablePointersFeatures":"VkPhysicalDeviceVariablePointersFeaturesKHR", *props);
2192             p.AddNewline();
2193         }
2194         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES && 
2195            (version.minor >= 1)) {
2196             VkPhysicalDeviceProtectedMemoryFeatures* props = (VkPhysicalDeviceProtectedMemoryFeatures*)structure;
2197             DumpVkPhysicalDeviceProtectedMemoryFeatures(p, "VkPhysicalDeviceProtectedMemoryFeatures", *props);
2198             p.AddNewline();
2199         }
2200         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES && 
2201            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
2202             version.minor >= 1)) {
2203             VkPhysicalDeviceSamplerYcbcrConversionFeatures* props = (VkPhysicalDeviceSamplerYcbcrConversionFeatures*)structure;
2204             DumpVkPhysicalDeviceSamplerYcbcrConversionFeatures(p, version.minor >= 1 ?"VkPhysicalDeviceSamplerYcbcrConversionFeatures":"VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR", *props);
2205             p.AddNewline();
2206         }
2207         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES && 
2208            (version.minor >= 1)) {
2209             VkPhysicalDeviceShaderDrawParametersFeatures* props = (VkPhysicalDeviceShaderDrawParametersFeatures*)structure;
2210             DumpVkPhysicalDeviceShaderDrawParametersFeatures(p, version.minor >= 1 ?"VkPhysicalDeviceShaderDrawParametersFeatures":"VkPhysicalDeviceShaderDrawParameterFeatures", *props);
2211             p.AddNewline();
2212         }
2213         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES && 
2214            (version.minor >= 2)) {
2215             VkPhysicalDeviceVulkan11Features* props = (VkPhysicalDeviceVulkan11Features*)structure;
2216             DumpVkPhysicalDeviceVulkan11Features(p, "VkPhysicalDeviceVulkan11Features", *props);
2217             p.AddNewline();
2218         }
2219         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES && 
2220            (version.minor >= 2)) {
2221             VkPhysicalDeviceVulkan12Features* props = (VkPhysicalDeviceVulkan12Features*)structure;
2222             DumpVkPhysicalDeviceVulkan12Features(p, "VkPhysicalDeviceVulkan12Features", *props);
2223             p.AddNewline();
2224         }
2225         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES && 
2226            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_8BIT_STORAGE_EXTENSION_NAME) ||
2227             version.minor >= 2)) {
2228             VkPhysicalDevice8BitStorageFeatures* props = (VkPhysicalDevice8BitStorageFeatures*)structure;
2229             DumpVkPhysicalDevice8BitStorageFeatures(p, version.minor >= 2 ?"VkPhysicalDevice8BitStorageFeatures":"VkPhysicalDevice8BitStorageFeaturesKHR", *props);
2230             p.AddNewline();
2231         }
2232         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES && 
2233            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME) ||
2234             version.minor >= 2)) {
2235             VkPhysicalDeviceShaderAtomicInt64Features* props = (VkPhysicalDeviceShaderAtomicInt64Features*)structure;
2236             DumpVkPhysicalDeviceShaderAtomicInt64Features(p, version.minor >= 2 ?"VkPhysicalDeviceShaderAtomicInt64Features":"VkPhysicalDeviceShaderAtomicInt64FeaturesKHR", *props);
2237             p.AddNewline();
2238         }
2239         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES && 
2240            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME) ||
2241             version.minor >= 2)) {
2242             VkPhysicalDeviceShaderFloat16Int8Features* props = (VkPhysicalDeviceShaderFloat16Int8Features*)structure;
2243             DumpVkPhysicalDeviceShaderFloat16Int8Features(p, version.minor >= 2 ?"VkPhysicalDeviceShaderFloat16Int8Features":"VkPhysicalDeviceFloat16Int8FeaturesKHR", *props);
2244             p.AddNewline();
2245         }
2246         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES && 
2247            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME) ||
2248             version.minor >= 2)) {
2249             VkPhysicalDeviceDescriptorIndexingFeatures* props = (VkPhysicalDeviceDescriptorIndexingFeatures*)structure;
2250             DumpVkPhysicalDeviceDescriptorIndexingFeatures(p, version.minor >= 2 ?"VkPhysicalDeviceDescriptorIndexingFeatures":"VkPhysicalDeviceDescriptorIndexingFeaturesEXT", *props);
2251             p.AddNewline();
2252         }
2253         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES && 
2254            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME) ||
2255             version.minor >= 2)) {
2256             VkPhysicalDeviceScalarBlockLayoutFeatures* props = (VkPhysicalDeviceScalarBlockLayoutFeatures*)structure;
2257             DumpVkPhysicalDeviceScalarBlockLayoutFeatures(p, version.minor >= 2 ?"VkPhysicalDeviceScalarBlockLayoutFeatures":"VkPhysicalDeviceScalarBlockLayoutFeaturesEXT", *props);
2258             p.AddNewline();
2259         }
2260         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES && 
2261            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_VULKAN_MEMORY_MODEL_EXTENSION_NAME) ||
2262             version.minor >= 2)) {
2263             VkPhysicalDeviceVulkanMemoryModelFeatures* props = (VkPhysicalDeviceVulkanMemoryModelFeatures*)structure;
2264             DumpVkPhysicalDeviceVulkanMemoryModelFeatures(p, version.minor >= 2 ?"VkPhysicalDeviceVulkanMemoryModelFeatures":"VkPhysicalDeviceVulkanMemoryModelFeaturesKHR", *props);
2265             p.AddNewline();
2266         }
2267         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES && 
2268            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME) ||
2269             version.minor >= 2)) {
2270             VkPhysicalDeviceImagelessFramebufferFeatures* props = (VkPhysicalDeviceImagelessFramebufferFeatures*)structure;
2271             DumpVkPhysicalDeviceImagelessFramebufferFeatures(p, version.minor >= 2 ?"VkPhysicalDeviceImagelessFramebufferFeatures":"VkPhysicalDeviceImagelessFramebufferFeaturesKHR", *props);
2272             p.AddNewline();
2273         }
2274         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES && 
2275            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_UNIFORM_BUFFER_STANDARD_LAYOUT_EXTENSION_NAME) ||
2276             version.minor >= 2)) {
2277             VkPhysicalDeviceUniformBufferStandardLayoutFeatures* props = (VkPhysicalDeviceUniformBufferStandardLayoutFeatures*)structure;
2278             DumpVkPhysicalDeviceUniformBufferStandardLayoutFeatures(p, version.minor >= 2 ?"VkPhysicalDeviceUniformBufferStandardLayoutFeatures":"VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR", *props);
2279             p.AddNewline();
2280         }
2281         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES && 
2282            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME) ||
2283             version.minor >= 2)) {
2284             VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* props = (VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures*)structure;
2285             DumpVkPhysicalDeviceShaderSubgroupExtendedTypesFeatures(p, version.minor >= 2 ?"VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures":"VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR", *props);
2286             p.AddNewline();
2287         }
2288         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES && 
2289            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME) ||
2290             version.minor >= 2)) {
2291             VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures* props = (VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures*)structure;
2292             DumpVkPhysicalDeviceSeparateDepthStencilLayoutsFeatures(p, version.minor >= 2 ?"VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures":"VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR", *props);
2293             p.AddNewline();
2294         }
2295         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES && 
2296            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME) ||
2297             version.minor >= 2)) {
2298             VkPhysicalDeviceHostQueryResetFeatures* props = (VkPhysicalDeviceHostQueryResetFeatures*)structure;
2299             DumpVkPhysicalDeviceHostQueryResetFeatures(p, version.minor >= 2 ?"VkPhysicalDeviceHostQueryResetFeatures":"VkPhysicalDeviceHostQueryResetFeaturesEXT", *props);
2300             p.AddNewline();
2301         }
2302         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES && 
2303            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME) ||
2304             version.minor >= 2)) {
2305             VkPhysicalDeviceTimelineSemaphoreFeatures* props = (VkPhysicalDeviceTimelineSemaphoreFeatures*)structure;
2306             DumpVkPhysicalDeviceTimelineSemaphoreFeatures(p, version.minor >= 2 ?"VkPhysicalDeviceTimelineSemaphoreFeatures":"VkPhysicalDeviceTimelineSemaphoreFeaturesKHR", *props);
2307             p.AddNewline();
2308         }
2309         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES && 
2310            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME) ||
2311             version.minor >= 2)) {
2312             VkPhysicalDeviceBufferDeviceAddressFeatures* props = (VkPhysicalDeviceBufferDeviceAddressFeatures*)structure;
2313             DumpVkPhysicalDeviceBufferDeviceAddressFeatures(p, version.minor >= 2 ?"VkPhysicalDeviceBufferDeviceAddressFeatures":"VkPhysicalDeviceBufferDeviceAddressFeaturesKHR", *props);
2314             p.AddNewline();
2315         }
2316         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR && 
2317            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME))) {
2318             VkPhysicalDevicePerformanceQueryFeaturesKHR* props = (VkPhysicalDevicePerformanceQueryFeaturesKHR*)structure;
2319             DumpVkPhysicalDevicePerformanceQueryFeaturesKHR(p, "VkPhysicalDevicePerformanceQueryFeaturesKHR", *props);
2320             p.AddNewline();
2321         }
2322         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR && 
2323            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_SHADER_CLOCK_EXTENSION_NAME))) {
2324             VkPhysicalDeviceShaderClockFeaturesKHR* props = (VkPhysicalDeviceShaderClockFeaturesKHR*)structure;
2325             DumpVkPhysicalDeviceShaderClockFeaturesKHR(p, "VkPhysicalDeviceShaderClockFeaturesKHR", *props);
2326             p.AddNewline();
2327         }
2328         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR && 
2329            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME))) {
2330             VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR* props = (VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR*)structure;
2331             DumpVkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR(p, "VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR", *props);
2332             p.AddNewline();
2333         }
2334         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT && 
2335            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME))) {
2336             VkPhysicalDeviceTransformFeedbackFeaturesEXT* props = (VkPhysicalDeviceTransformFeedbackFeaturesEXT*)structure;
2337             DumpVkPhysicalDeviceTransformFeedbackFeaturesEXT(p, "VkPhysicalDeviceTransformFeedbackFeaturesEXT", *props);
2338             p.AddNewline();
2339         }
2340         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT && 
2341            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_TEXTURE_COMPRESSION_ASTC_HDR_EXTENSION_NAME))) {
2342             VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT* props = (VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT*)structure;
2343             DumpVkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT(p, "VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT", *props);
2344             p.AddNewline();
2345         }
2346         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT && 
2347            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME))) {
2348             VkPhysicalDeviceASTCDecodeFeaturesEXT* props = (VkPhysicalDeviceASTCDecodeFeaturesEXT*)structure;
2349             DumpVkPhysicalDeviceASTCDecodeFeaturesEXT(p, "VkPhysicalDeviceASTCDecodeFeaturesEXT", *props);
2350             p.AddNewline();
2351         }
2352         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT && 
2353            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME))) {
2354             VkPhysicalDeviceConditionalRenderingFeaturesEXT* props = (VkPhysicalDeviceConditionalRenderingFeaturesEXT*)structure;
2355             DumpVkPhysicalDeviceConditionalRenderingFeaturesEXT(p, "VkPhysicalDeviceConditionalRenderingFeaturesEXT", *props);
2356             p.AddNewline();
2357         }
2358         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT && 
2359            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME))) {
2360             VkPhysicalDeviceDepthClipEnableFeaturesEXT* props = (VkPhysicalDeviceDepthClipEnableFeaturesEXT*)structure;
2361             DumpVkPhysicalDeviceDepthClipEnableFeaturesEXT(p, "VkPhysicalDeviceDepthClipEnableFeaturesEXT", *props);
2362             p.AddNewline();
2363         }
2364         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT && 
2365            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME))) {
2366             VkPhysicalDeviceInlineUniformBlockFeaturesEXT* props = (VkPhysicalDeviceInlineUniformBlockFeaturesEXT*)structure;
2367             DumpVkPhysicalDeviceInlineUniformBlockFeaturesEXT(p, "VkPhysicalDeviceInlineUniformBlockFeaturesEXT", *props);
2368             p.AddNewline();
2369         }
2370         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT && 
2371            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_BLEND_OPERATION_ADVANCED_EXTENSION_NAME))) {
2372             VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* props = (VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*)structure;
2373             DumpVkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(p, "VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT", *props);
2374             p.AddNewline();
2375         }
2376         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT && 
2377            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME))) {
2378             VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT* props = (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT*)structure;
2379             DumpVkPhysicalDeviceVertexAttributeDivisorFeaturesEXT(p, "VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT", *props);
2380             p.AddNewline();
2381         }
2382         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT && 
2383            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME))) {
2384             VkPhysicalDeviceFragmentDensityMapFeaturesEXT* props = (VkPhysicalDeviceFragmentDensityMapFeaturesEXT*)structure;
2385             DumpVkPhysicalDeviceFragmentDensityMapFeaturesEXT(p, "VkPhysicalDeviceFragmentDensityMapFeaturesEXT", *props);
2386             p.AddNewline();
2387         }
2388         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT && 
2389            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME))) {
2390             VkPhysicalDeviceSubgroupSizeControlFeaturesEXT* props = (VkPhysicalDeviceSubgroupSizeControlFeaturesEXT*)structure;
2391             DumpVkPhysicalDeviceSubgroupSizeControlFeaturesEXT(p, "VkPhysicalDeviceSubgroupSizeControlFeaturesEXT", *props);
2392             p.AddNewline();
2393         }
2394         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT && 
2395            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_MEMORY_PRIORITY_EXTENSION_NAME))) {
2396             VkPhysicalDeviceMemoryPriorityFeaturesEXT* props = (VkPhysicalDeviceMemoryPriorityFeaturesEXT*)structure;
2397             DumpVkPhysicalDeviceMemoryPriorityFeaturesEXT(p, "VkPhysicalDeviceMemoryPriorityFeaturesEXT", *props);
2398             p.AddNewline();
2399         }
2400         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT && 
2401            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME))) {
2402             VkPhysicalDeviceBufferDeviceAddressFeaturesEXT* props = (VkPhysicalDeviceBufferDeviceAddressFeaturesEXT*)structure;
2403             DumpVkPhysicalDeviceBufferDeviceAddressFeaturesEXT(p, "VkPhysicalDeviceBufferDeviceAddressFeaturesEXT", *props);
2404             p.AddNewline();
2405         }
2406         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT && 
2407            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME))) {
2408             VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT* props = (VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT*)structure;
2409             DumpVkPhysicalDeviceFragmentShaderInterlockFeaturesEXT(p, "VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT", *props);
2410             p.AddNewline();
2411         }
2412         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT && 
2413            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_YCBCR_IMAGE_ARRAYS_EXTENSION_NAME))) {
2414             VkPhysicalDeviceYcbcrImageArraysFeaturesEXT* props = (VkPhysicalDeviceYcbcrImageArraysFeaturesEXT*)structure;
2415             DumpVkPhysicalDeviceYcbcrImageArraysFeaturesEXT(p, "VkPhysicalDeviceYcbcrImageArraysFeaturesEXT", *props);
2416             p.AddNewline();
2417         }
2418         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT && 
2419            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME))) {
2420             VkPhysicalDeviceLineRasterizationFeaturesEXT* props = (VkPhysicalDeviceLineRasterizationFeaturesEXT*)structure;
2421             DumpVkPhysicalDeviceLineRasterizationFeaturesEXT(p, "VkPhysicalDeviceLineRasterizationFeaturesEXT", *props);
2422             p.AddNewline();
2423         }
2424         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT && 
2425            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME))) {
2426             VkPhysicalDeviceIndexTypeUint8FeaturesEXT* props = (VkPhysicalDeviceIndexTypeUint8FeaturesEXT*)structure;
2427             DumpVkPhysicalDeviceIndexTypeUint8FeaturesEXT(p, "VkPhysicalDeviceIndexTypeUint8FeaturesEXT", *props);
2428             p.AddNewline();
2429         }
2430         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT && 
2431            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME))) {
2432             VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* props = (VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT*)structure;
2433             DumpVkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(p, "VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT", *props);
2434             p.AddNewline();
2435         }
2436         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT && 
2437            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME))) {
2438             VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT* props = (VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT*)structure;
2439             DumpVkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(p, "VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT", *props);
2440             p.AddNewline();
2441         }
2442         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT && 
2443            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME))) {
2444             VkPhysicalDeviceRobustness2FeaturesEXT* props = (VkPhysicalDeviceRobustness2FeaturesEXT*)structure;
2445             DumpVkPhysicalDeviceRobustness2FeaturesEXT(p, "VkPhysicalDeviceRobustness2FeaturesEXT", *props);
2446             p.AddNewline();
2447         }
2448         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT && 
2449            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME))) {
2450             VkPhysicalDeviceCustomBorderColorFeaturesEXT* props = (VkPhysicalDeviceCustomBorderColorFeaturesEXT*)structure;
2451             DumpVkPhysicalDeviceCustomBorderColorFeaturesEXT(p, "VkPhysicalDeviceCustomBorderColorFeaturesEXT", *props);
2452             p.AddNewline();
2453         }
2454         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT && 
2455            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME))) {
2456             VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* props = (VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT*)structure;
2457             DumpVkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(p, "VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT", *props);
2458             p.AddNewline();
2459         }
2460 #ifdef VK_ENABLE_BETA_EXTENSIONS
2461         if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_FEATURES_KHR && 
2462            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_RAY_TRACING_EXTENSION_NAME))) {
2463             VkPhysicalDeviceRayTracingFeaturesKHR* props = (VkPhysicalDeviceRayTracingFeaturesKHR*)structure;
2464             DumpVkPhysicalDeviceRayTracingFeaturesKHR(p, "VkPhysicalDeviceRayTracingFeaturesKHR", *props);
2465             p.AddNewline();
2466         }
2467 #endif  // VK_ENABLE_BETA_EXTENSIONS
2468         place = structure->pNext;
2469     }
2470 }
2471 void chain_iterator_surface_capabilities2(Printer &p, AppInstance &inst, AppGpu &gpu, void * place, VulkanVersion version) {
2472     while (place) {
2473         struct VkStructureHeader *structure = (struct VkStructureHeader *)place;
2474         p.SetSubHeader();
2475         if (structure->sType == VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR && 
2476            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME))) {
2477             VkSharedPresentSurfaceCapabilitiesKHR* props = (VkSharedPresentSurfaceCapabilitiesKHR*)structure;
2478             DumpVkSharedPresentSurfaceCapabilitiesKHR(p, "VkSharedPresentSurfaceCapabilitiesKHR", *props);
2479             p.AddNewline();
2480         }
2481         if (structure->sType == VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR && 
2482            (inst.CheckExtensionEnabled(VK_KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME))) {
2483             VkSurfaceProtectedCapabilitiesKHR* props = (VkSurfaceProtectedCapabilitiesKHR*)structure;
2484             DumpVkSurfaceProtectedCapabilitiesKHR(p, "VkSurfaceProtectedCapabilitiesKHR", *props);
2485             p.AddNewline();
2486         }
2487 #ifdef VK_USE_PLATFORM_WIN32_KHR
2488         if (structure->sType == VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT && 
2489            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_FULL_SCREEN_EXCLUSIVE_EXTENSION_NAME))) {
2490             VkSurfaceCapabilitiesFullScreenExclusiveEXT* props = (VkSurfaceCapabilitiesFullScreenExclusiveEXT*)structure;
2491             DumpVkSurfaceCapabilitiesFullScreenExclusiveEXT(p, "VkSurfaceCapabilitiesFullScreenExclusiveEXT", *props);
2492             p.AddNewline();
2493         }
2494 #endif  // VK_USE_PLATFORM_WIN32_KHR
2495         place = structure->pNext;
2496     }
2497 }
2498 void chain_iterator_format_properties2(Printer &p, AppGpu &gpu, void * place, VulkanVersion version) {
2499     while (place) {
2500         struct VkStructureHeader *structure = (struct VkStructureHeader *)place;
2501         p.SetSubHeader();
2502         if (structure->sType == VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT && 
2503            (gpu.CheckPhysicalDeviceExtensionIncluded(VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME))) {
2504             VkDrmFormatModifierPropertiesListEXT* props = (VkDrmFormatModifierPropertiesListEXT*)structure;
2505             DumpVkDrmFormatModifierPropertiesListEXT(p, "VkDrmFormatModifierPropertiesListEXT", *props);
2506             p.AddNewline();
2507         }
2508         place = structure->pNext;
2509     }
2510 }
2511 bool operator==(const VkExtent2D & a, const VkExtent2D b) {
2512     return a.width == b.width
2513         && a.height == b.height;
2514 }
2515 bool operator==(const VkSurfaceCapabilitiesKHR & a, const VkSurfaceCapabilitiesKHR b) {
2516     return a.minImageCount == b.minImageCount
2517         && a.maxImageCount == b.maxImageCount
2518         && a.currentExtent == b.currentExtent
2519         && a.minImageExtent == b.minImageExtent
2520         && a.maxImageExtent == b.maxImageExtent
2521         && a.maxImageArrayLayers == b.maxImageArrayLayers
2522         && a.supportedTransforms == b.supportedTransforms
2523         && a.currentTransform == b.currentTransform
2524         && a.supportedCompositeAlpha == b.supportedCompositeAlpha
2525         && a.supportedUsageFlags == b.supportedUsageFlags;
2526 }
2527 bool operator==(const VkSurfaceFormatKHR & a, const VkSurfaceFormatKHR b) {
2528     return a.format == b.format
2529         && a.colorSpace == b.colorSpace;
2530 }
2531 bool operator==(const VkSurfaceCapabilities2KHR & a, const VkSurfaceCapabilities2KHR b) {
2532     return a.surfaceCapabilities == b.surfaceCapabilities;
2533 }
2534 bool operator==(const VkSurfaceFormat2KHR & a, const VkSurfaceFormat2KHR b) {
2535     return a.surfaceFormat == b.surfaceFormat;
2536 }
2537 bool operator==(const VkSurfaceCapabilities2EXT & a, const VkSurfaceCapabilities2EXT b) {
2538     return a.minImageCount == b.minImageCount
2539         && a.maxImageCount == b.maxImageCount
2540         && a.currentExtent == b.currentExtent
2541         && a.minImageExtent == b.minImageExtent
2542         && a.maxImageExtent == b.maxImageExtent
2543         && a.maxImageArrayLayers == b.maxImageArrayLayers
2544         && a.supportedTransforms == b.supportedTransforms
2545         && a.currentTransform == b.currentTransform
2546         && a.supportedCompositeAlpha == b.supportedCompositeAlpha
2547         && a.supportedUsageFlags == b.supportedUsageFlags
2548         && a.supportedSurfaceCounters == b.supportedSurfaceCounters;
2549 }
2550 std::ostream &operator<<(std::ostream &o, VkExtent3D &obj) {
2551     return o << "(" << obj.width << ',' << obj.height << ',' << obj.depth << ")";
2552 }
2553