Update vkjson

Bug: b/401181863
Test: adb shell cmd gpu vkjson
Flag: NONE infeasible

Change-Id: If9995c3af5827ebfbe5445c1c649aed947fb2233
diff --git a/vulkan/vkjson/vkjson.cc b/vulkan/vkjson/vkjson.cc
index 18fef2b..531a623 100644
--- a/vulkan/vkjson/vkjson.cc
+++ b/vulkan/vkjson/vkjson.cc
@@ -56,13 +56,15 @@
 // Floating point fields of Vulkan structure use single precision. The string
 // output of max double value in c++ will be larger than Java double's infinity
 // value. Below fake double max/min values are only to serve the safe json text
-// parsing in between C++ and Java, becasue Java json library simply cannot
+// parsing in between C++ and Java, because Java json library simply cannot
 // handle infinity.
 static const double SAFE_DOUBLE_MAX = 0.99 * std::numeric_limits<double>::max();
 static const double SAFE_DOUBLE_MIN = -SAFE_DOUBLE_MAX;
 
-template <typename T> struct EnumTraits;
-template <> struct EnumTraits<VkPhysicalDeviceType> {
+template <typename T>
+struct EnumTraits;
+template <>
+struct EnumTraits<VkPhysicalDeviceType> {
   static bool exist(uint32_t e) {
     switch (e) {
       case VK_PHYSICAL_DEVICE_TYPE_OTHER:
@@ -76,7 +78,8 @@
   }
 };
 
-template <> struct EnumTraits<VkFormat> {
+template <>
+struct EnumTraits<VkFormat> {
   static bool exist(uint32_t e) {
     switch (e) {
       case VK_FORMAT_UNDEFINED:
@@ -482,495 +485,13 @@
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor, VkExtent3D* extents) {
-  return
-    visitor->Visit("width", &extents->width) &&
-    visitor->Visit("height", &extents->height) &&
-    visitor->Visit("depth", &extents->depth);
+  return visitor->Visit("width", &extents->width) &&
+         visitor->Visit("height", &extents->height) &&
+         visitor->Visit("depth", &extents->depth);
 }
 
 template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkImageFormatProperties* properties) {
-  return
-    visitor->Visit("maxExtent", &properties->maxExtent) &&
-    visitor->Visit("maxMipLevels", &properties->maxMipLevels) &&
-    visitor->Visit("maxArrayLayers", &properties->maxArrayLayers) &&
-    visitor->Visit("sampleCounts", &properties->sampleCounts) &&
-    visitor->Visit("maxResourceSize", &properties->maxResourceSize);
-}
-
-// clang-format off
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkPhysicalDeviceLimits* limits) {
-  return
-    visitor->Visit("maxImageDimension1D", &limits->maxImageDimension1D) &&
-    visitor->Visit("maxImageDimension2D", &limits->maxImageDimension2D) &&
-    visitor->Visit("maxImageDimension3D", &limits->maxImageDimension3D) &&
-    visitor->Visit("maxImageDimensionCube", &limits->maxImageDimensionCube) &&
-    visitor->Visit("maxImageArrayLayers", &limits->maxImageArrayLayers) &&
-    visitor->Visit("maxTexelBufferElements", &limits->maxTexelBufferElements) &&
-    visitor->Visit("maxUniformBufferRange", &limits->maxUniformBufferRange) &&
-    visitor->Visit("maxStorageBufferRange", &limits->maxStorageBufferRange) &&
-    visitor->Visit("maxPushConstantsSize", &limits->maxPushConstantsSize) &&
-    visitor->Visit("maxMemoryAllocationCount", &limits->maxMemoryAllocationCount) &&
-    visitor->Visit("maxSamplerAllocationCount", &limits->maxSamplerAllocationCount) &&
-    visitor->Visit("bufferImageGranularity", &limits->bufferImageGranularity) &&
-    visitor->Visit("sparseAddressSpaceSize", &limits->sparseAddressSpaceSize) &&
-    visitor->Visit("maxBoundDescriptorSets", &limits->maxBoundDescriptorSets) &&
-    visitor->Visit("maxPerStageDescriptorSamplers", &limits->maxPerStageDescriptorSamplers) &&
-    visitor->Visit("maxPerStageDescriptorUniformBuffers", &limits->maxPerStageDescriptorUniformBuffers) &&
-    visitor->Visit("maxPerStageDescriptorStorageBuffers", &limits->maxPerStageDescriptorStorageBuffers) &&
-    visitor->Visit("maxPerStageDescriptorSampledImages", &limits->maxPerStageDescriptorSampledImages) &&
-    visitor->Visit("maxPerStageDescriptorStorageImages", &limits->maxPerStageDescriptorStorageImages) &&
-    visitor->Visit("maxPerStageDescriptorInputAttachments", &limits->maxPerStageDescriptorInputAttachments) &&
-    visitor->Visit("maxPerStageResources", &limits->maxPerStageResources) &&
-    visitor->Visit("maxDescriptorSetSamplers", &limits->maxDescriptorSetSamplers) &&
-    visitor->Visit("maxDescriptorSetUniformBuffers", &limits->maxDescriptorSetUniformBuffers) &&
-    visitor->Visit("maxDescriptorSetUniformBuffersDynamic", &limits->maxDescriptorSetUniformBuffersDynamic) &&
-    visitor->Visit("maxDescriptorSetStorageBuffers", &limits->maxDescriptorSetStorageBuffers) &&
-    visitor->Visit("maxDescriptorSetStorageBuffersDynamic", &limits->maxDescriptorSetStorageBuffersDynamic) &&
-    visitor->Visit("maxDescriptorSetSampledImages", &limits->maxDescriptorSetSampledImages) &&
-    visitor->Visit("maxDescriptorSetStorageImages", &limits->maxDescriptorSetStorageImages) &&
-    visitor->Visit("maxDescriptorSetInputAttachments", &limits->maxDescriptorSetInputAttachments) &&
-    visitor->Visit("maxVertexInputAttributes", &limits->maxVertexInputAttributes) &&
-    visitor->Visit("maxVertexInputBindings", &limits->maxVertexInputBindings) &&
-    visitor->Visit("maxVertexInputAttributeOffset", &limits->maxVertexInputAttributeOffset) &&
-    visitor->Visit("maxVertexInputBindingStride", &limits->maxVertexInputBindingStride) &&
-    visitor->Visit("maxVertexOutputComponents", &limits->maxVertexOutputComponents) &&
-    visitor->Visit("maxTessellationGenerationLevel", &limits->maxTessellationGenerationLevel) &&
-    visitor->Visit("maxTessellationPatchSize", &limits->maxTessellationPatchSize) &&
-    visitor->Visit("maxTessellationControlPerVertexInputComponents", &limits->maxTessellationControlPerVertexInputComponents) &&
-    visitor->Visit("maxTessellationControlPerVertexOutputComponents", &limits->maxTessellationControlPerVertexOutputComponents) &&
-    visitor->Visit("maxTessellationControlPerPatchOutputComponents", &limits->maxTessellationControlPerPatchOutputComponents) &&
-    visitor->Visit("maxTessellationControlTotalOutputComponents", &limits->maxTessellationControlTotalOutputComponents) &&
-    visitor->Visit("maxTessellationEvaluationInputComponents", &limits->maxTessellationEvaluationInputComponents) &&
-    visitor->Visit("maxTessellationEvaluationOutputComponents", &limits->maxTessellationEvaluationOutputComponents) &&
-    visitor->Visit("maxGeometryShaderInvocations", &limits->maxGeometryShaderInvocations) &&
-    visitor->Visit("maxGeometryInputComponents", &limits->maxGeometryInputComponents) &&
-    visitor->Visit("maxGeometryOutputComponents", &limits->maxGeometryOutputComponents) &&
-    visitor->Visit("maxGeometryOutputVertices", &limits->maxGeometryOutputVertices) &&
-    visitor->Visit("maxGeometryTotalOutputComponents", &limits->maxGeometryTotalOutputComponents) &&
-    visitor->Visit("maxFragmentInputComponents", &limits->maxFragmentInputComponents) &&
-    visitor->Visit("maxFragmentOutputAttachments", &limits->maxFragmentOutputAttachments) &&
-    visitor->Visit("maxFragmentDualSrcAttachments", &limits->maxFragmentDualSrcAttachments) &&
-    visitor->Visit("maxFragmentCombinedOutputResources", &limits->maxFragmentCombinedOutputResources) &&
-    visitor->Visit("maxComputeSharedMemorySize", &limits->maxComputeSharedMemorySize) &&
-    visitor->Visit("maxComputeWorkGroupCount", &limits->maxComputeWorkGroupCount) &&
-    visitor->Visit("maxComputeWorkGroupInvocations", &limits->maxComputeWorkGroupInvocations) &&
-    visitor->Visit("maxComputeWorkGroupSize", &limits->maxComputeWorkGroupSize) &&
-    visitor->Visit("subPixelPrecisionBits", &limits->subPixelPrecisionBits) &&
-    visitor->Visit("subTexelPrecisionBits", &limits->subTexelPrecisionBits) &&
-    visitor->Visit("mipmapPrecisionBits", &limits->mipmapPrecisionBits) &&
-    visitor->Visit("maxDrawIndexedIndexValue", &limits->maxDrawIndexedIndexValue) &&
-    visitor->Visit("maxDrawIndirectCount", &limits->maxDrawIndirectCount) &&
-    visitor->Visit("maxSamplerLodBias", &limits->maxSamplerLodBias) &&
-    visitor->Visit("maxSamplerAnisotropy", &limits->maxSamplerAnisotropy) &&
-    visitor->Visit("maxViewports", &limits->maxViewports) &&
-    visitor->Visit("maxViewportDimensions", &limits->maxViewportDimensions) &&
-    visitor->Visit("viewportBoundsRange", &limits->viewportBoundsRange) &&
-    visitor->Visit("viewportSubPixelBits", &limits->viewportSubPixelBits) &&
-    visitor->Visit("minMemoryMapAlignment", &limits->minMemoryMapAlignment) &&
-    visitor->Visit("minTexelBufferOffsetAlignment", &limits->minTexelBufferOffsetAlignment) &&
-    visitor->Visit("minUniformBufferOffsetAlignment", &limits->minUniformBufferOffsetAlignment) &&
-    visitor->Visit("minStorageBufferOffsetAlignment", &limits->minStorageBufferOffsetAlignment) &&
-    visitor->Visit("minTexelOffset", &limits->minTexelOffset) &&
-    visitor->Visit("maxTexelOffset", &limits->maxTexelOffset) &&
-    visitor->Visit("minTexelGatherOffset", &limits->minTexelGatherOffset) &&
-    visitor->Visit("maxTexelGatherOffset", &limits->maxTexelGatherOffset) &&
-    visitor->Visit("minInterpolationOffset", &limits->minInterpolationOffset) &&
-    visitor->Visit("maxInterpolationOffset", &limits->maxInterpolationOffset) &&
-    visitor->Visit("subPixelInterpolationOffsetBits", &limits->subPixelInterpolationOffsetBits) &&
-    visitor->Visit("maxFramebufferWidth", &limits->maxFramebufferWidth) &&
-    visitor->Visit("maxFramebufferHeight", &limits->maxFramebufferHeight) &&
-    visitor->Visit("maxFramebufferLayers", &limits->maxFramebufferLayers) &&
-    visitor->Visit("framebufferColorSampleCounts", &limits->framebufferColorSampleCounts) &&
-    visitor->Visit("framebufferDepthSampleCounts", &limits->framebufferDepthSampleCounts) &&
-    visitor->Visit("framebufferStencilSampleCounts", &limits->framebufferStencilSampleCounts) &&
-    visitor->Visit("framebufferNoAttachmentsSampleCounts", &limits->framebufferNoAttachmentsSampleCounts) &&
-    visitor->Visit("maxColorAttachments", &limits->maxColorAttachments) &&
-    visitor->Visit("sampledImageColorSampleCounts", &limits->sampledImageColorSampleCounts) &&
-    visitor->Visit("sampledImageIntegerSampleCounts", &limits->sampledImageIntegerSampleCounts) &&
-    visitor->Visit("sampledImageDepthSampleCounts", &limits->sampledImageDepthSampleCounts) &&
-    visitor->Visit("sampledImageStencilSampleCounts", &limits->sampledImageStencilSampleCounts) &&
-    visitor->Visit("storageImageSampleCounts", &limits->storageImageSampleCounts) &&
-    visitor->Visit("maxSampleMaskWords", &limits->maxSampleMaskWords) &&
-    visitor->Visit("timestampComputeAndGraphics", &limits->timestampComputeAndGraphics) &&
-    visitor->Visit("timestampPeriod", &limits->timestampPeriod) &&
-    visitor->Visit("maxClipDistances", &limits->maxClipDistances) &&
-    visitor->Visit("maxCullDistances", &limits->maxCullDistances) &&
-    visitor->Visit("maxCombinedClipAndCullDistances", &limits->maxCombinedClipAndCullDistances) &&
-    visitor->Visit("discreteQueuePriorities", &limits->discreteQueuePriorities) &&
-    visitor->Visit("pointSizeRange", &limits->pointSizeRange) &&
-    visitor->Visit("lineWidthRange", &limits->lineWidthRange) &&
-    visitor->Visit("pointSizeGranularity", &limits->pointSizeGranularity) &&
-    visitor->Visit("lineWidthGranularity", &limits->lineWidthGranularity) &&
-    visitor->Visit("strictLines", &limits->strictLines) &&
-    visitor->Visit("standardSampleLocations", &limits->standardSampleLocations) &&
-    visitor->Visit("optimalBufferCopyOffsetAlignment", &limits->optimalBufferCopyOffsetAlignment) &&
-    visitor->Visit("optimalBufferCopyRowPitchAlignment", &limits->optimalBufferCopyRowPitchAlignment) &&
-    visitor->Visit("nonCoherentAtomSize", &limits->nonCoherentAtomSize);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor,
-                    VkPhysicalDeviceSparseProperties* properties) {
-  return
-    visitor->Visit("residencyStandard2DBlockShape", &properties->residencyStandard2DBlockShape) &&
-    visitor->Visit("residencyStandard2DMultisampleBlockShape", &properties->residencyStandard2DMultisampleBlockShape) &&
-    visitor->Visit("residencyStandard3DBlockShape", &properties->residencyStandard3DBlockShape) &&
-    visitor->Visit("residencyAlignedMipSize", &properties->residencyAlignedMipSize) &&
-    visitor->Visit("residencyNonResidentStrict", &properties->residencyNonResidentStrict);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor,
-                    VkPhysicalDeviceProperties* properties) {
-  return
-    visitor->Visit("apiVersion", &properties->apiVersion) &&
-    visitor->Visit("driverVersion", &properties->driverVersion) &&
-    visitor->Visit("vendorID", &properties->vendorID) &&
-    visitor->Visit("deviceID", &properties->deviceID) &&
-    visitor->Visit("deviceType", &properties->deviceType) &&
-    visitor->Visit("deviceName", &properties->deviceName) &&
-    visitor->Visit("pipelineCacheUUID", &properties->pipelineCacheUUID) &&
-    visitor->Visit("limits", &properties->limits) &&
-    visitor->Visit("sparseProperties", &properties->sparseProperties);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkPhysicalDeviceFeatures* features) {
-  return
-    visitor->Visit("robustBufferAccess", &features->robustBufferAccess) &&
-    visitor->Visit("fullDrawIndexUint32", &features->fullDrawIndexUint32) &&
-    visitor->Visit("imageCubeArray", &features->imageCubeArray) &&
-    visitor->Visit("independentBlend", &features->independentBlend) &&
-    visitor->Visit("geometryShader", &features->geometryShader) &&
-    visitor->Visit("tessellationShader", &features->tessellationShader) &&
-    visitor->Visit("sampleRateShading", &features->sampleRateShading) &&
-    visitor->Visit("dualSrcBlend", &features->dualSrcBlend) &&
-    visitor->Visit("logicOp", &features->logicOp) &&
-    visitor->Visit("multiDrawIndirect", &features->multiDrawIndirect) &&
-    visitor->Visit("drawIndirectFirstInstance", &features->drawIndirectFirstInstance) &&
-    visitor->Visit("depthClamp", &features->depthClamp) &&
-    visitor->Visit("depthBiasClamp", &features->depthBiasClamp) &&
-    visitor->Visit("fillModeNonSolid", &features->fillModeNonSolid) &&
-    visitor->Visit("depthBounds", &features->depthBounds) &&
-    visitor->Visit("wideLines", &features->wideLines) &&
-    visitor->Visit("largePoints", &features->largePoints) &&
-    visitor->Visit("alphaToOne", &features->alphaToOne) &&
-    visitor->Visit("multiViewport", &features->multiViewport) &&
-    visitor->Visit("samplerAnisotropy", &features->samplerAnisotropy) &&
-    visitor->Visit("textureCompressionETC2", &features->textureCompressionETC2) &&
-    visitor->Visit("textureCompressionASTC_LDR", &features->textureCompressionASTC_LDR) &&
-    visitor->Visit("textureCompressionBC", &features->textureCompressionBC) &&
-    visitor->Visit("occlusionQueryPrecise", &features->occlusionQueryPrecise) &&
-    visitor->Visit("pipelineStatisticsQuery", &features->pipelineStatisticsQuery) &&
-    visitor->Visit("vertexPipelineStoresAndAtomics", &features->vertexPipelineStoresAndAtomics) &&
-    visitor->Visit("fragmentStoresAndAtomics", &features->fragmentStoresAndAtomics) &&
-    visitor->Visit("shaderTessellationAndGeometryPointSize", &features->shaderTessellationAndGeometryPointSize) &&
-    visitor->Visit("shaderImageGatherExtended", &features->shaderImageGatherExtended) &&
-    visitor->Visit("shaderStorageImageExtendedFormats", &features->shaderStorageImageExtendedFormats) &&
-    visitor->Visit("shaderStorageImageMultisample", &features->shaderStorageImageMultisample) &&
-    visitor->Visit("shaderStorageImageReadWithoutFormat", &features->shaderStorageImageReadWithoutFormat) &&
-    visitor->Visit("shaderStorageImageWriteWithoutFormat", &features->shaderStorageImageWriteWithoutFormat) &&
-    visitor->Visit("shaderUniformBufferArrayDynamicIndexing", &features->shaderUniformBufferArrayDynamicIndexing) &&
-    visitor->Visit("shaderSampledImageArrayDynamicIndexing", &features->shaderSampledImageArrayDynamicIndexing) &&
-    visitor->Visit("shaderStorageBufferArrayDynamicIndexing", &features->shaderStorageBufferArrayDynamicIndexing) &&
-    visitor->Visit("shaderStorageImageArrayDynamicIndexing", &features->shaderStorageImageArrayDynamicIndexing) &&
-    visitor->Visit("shaderClipDistance", &features->shaderClipDistance) &&
-    visitor->Visit("shaderCullDistance", &features->shaderCullDistance) &&
-    visitor->Visit("shaderFloat64", &features->shaderFloat64) &&
-    visitor->Visit("shaderInt64", &features->shaderInt64) &&
-    visitor->Visit("shaderInt16", &features->shaderInt16) &&
-    visitor->Visit("shaderResourceResidency", &features->shaderResourceResidency) &&
-    visitor->Visit("shaderResourceMinLod", &features->shaderResourceMinLod) &&
-    visitor->Visit("sparseBinding", &features->sparseBinding) &&
-    visitor->Visit("sparseResidencyBuffer", &features->sparseResidencyBuffer) &&
-    visitor->Visit("sparseResidencyImage2D", &features->sparseResidencyImage2D) &&
-    visitor->Visit("sparseResidencyImage3D", &features->sparseResidencyImage3D) &&
-    visitor->Visit("sparseResidency2Samples", &features->sparseResidency2Samples) &&
-    visitor->Visit("sparseResidency4Samples", &features->sparseResidency4Samples) &&
-    visitor->Visit("sparseResidency8Samples", &features->sparseResidency8Samples) &&
-    visitor->Visit("sparseResidency16Samples", &features->sparseResidency16Samples) &&
-    visitor->Visit("sparseResidencyAliased", &features->sparseResidencyAliased) &&
-    visitor->Visit("variableMultisampleRate", &features->variableMultisampleRate) &&
-    visitor->Visit("inheritedQueries", &features->inheritedQueries);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkJsonCore12* core) {
-  return
-    visitor->Visit("features", &core->features) &&
-    visitor->Visit("properties", &core->properties);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkPhysicalDeviceVulkan12Properties* properties) {
-  return
-    visitor->Visit("driverID", &properties->driverID) &&
-    visitor->Visit("driverName", &properties->driverName) &&
-    visitor->Visit("driverInfo", &properties->driverInfo) &&
-    visitor->Visit("conformanceVersion", &properties->conformanceVersion) &&
-    visitor->Visit("denormBehaviorIndependence", &properties->denormBehaviorIndependence) &&
-    visitor->Visit("roundingModeIndependence", &properties->roundingModeIndependence) &&
-    visitor->Visit("shaderSignedZeroInfNanPreserveFloat16", &properties->shaderSignedZeroInfNanPreserveFloat16) &&
-    visitor->Visit("shaderSignedZeroInfNanPreserveFloat32", &properties->shaderSignedZeroInfNanPreserveFloat32) &&
-    visitor->Visit("shaderSignedZeroInfNanPreserveFloat64", &properties->shaderSignedZeroInfNanPreserveFloat64) &&
-    visitor->Visit("shaderDenormPreserveFloat16", &properties->shaderDenormPreserveFloat16) &&
-    visitor->Visit("shaderDenormPreserveFloat32", &properties->shaderDenormPreserveFloat32) &&
-    visitor->Visit("shaderDenormPreserveFloat64", &properties->shaderDenormPreserveFloat64) &&
-    visitor->Visit("shaderDenormFlushToZeroFloat16", &properties->shaderDenormFlushToZeroFloat16) &&
-    visitor->Visit("shaderDenormFlushToZeroFloat32", &properties->shaderDenormFlushToZeroFloat32) &&
-    visitor->Visit("shaderDenormFlushToZeroFloat64", &properties->shaderDenormFlushToZeroFloat64) &&
-    visitor->Visit("shaderRoundingModeRTEFloat16", &properties->shaderRoundingModeRTEFloat16) &&
-    visitor->Visit("shaderRoundingModeRTEFloat32", &properties->shaderRoundingModeRTEFloat32) &&
-    visitor->Visit("shaderRoundingModeRTEFloat64", &properties->shaderRoundingModeRTEFloat64) &&
-    visitor->Visit("shaderRoundingModeRTZFloat16", &properties->shaderRoundingModeRTZFloat16) &&
-    visitor->Visit("shaderRoundingModeRTZFloat32", &properties->shaderRoundingModeRTZFloat32) &&
-    visitor->Visit("shaderRoundingModeRTZFloat64", &properties->shaderRoundingModeRTZFloat64) &&
-    visitor->Visit("maxUpdateAfterBindDescriptorsInAllPools", &properties->maxUpdateAfterBindDescriptorsInAllPools) &&
-    visitor->Visit("shaderUniformBufferArrayNonUniformIndexingNative", &properties->shaderUniformBufferArrayNonUniformIndexingNative) &&
-    visitor->Visit("shaderSampledImageArrayNonUniformIndexingNative", &properties->shaderSampledImageArrayNonUniformIndexingNative) &&
-    visitor->Visit("shaderStorageBufferArrayNonUniformIndexingNative", &properties->shaderStorageBufferArrayNonUniformIndexingNative) &&
-    visitor->Visit("shaderStorageImageArrayNonUniformIndexingNative", &properties->shaderStorageImageArrayNonUniformIndexingNative) &&
-    visitor->Visit("shaderInputAttachmentArrayNonUniformIndexingNative", &properties->shaderInputAttachmentArrayNonUniformIndexingNative) &&
-    visitor->Visit("robustBufferAccessUpdateAfterBind", &properties->robustBufferAccessUpdateAfterBind) &&
-    visitor->Visit("quadDivergentImplicitLod", &properties->quadDivergentImplicitLod) &&
-    visitor->Visit("maxPerStageDescriptorUpdateAfterBindSamplers", &properties->maxPerStageDescriptorUpdateAfterBindSamplers) &&
-    visitor->Visit("maxPerStageDescriptorUpdateAfterBindUniformBuffers", &properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers) &&
-    visitor->Visit("maxPerStageDescriptorUpdateAfterBindStorageBuffers", &properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers) &&
-    visitor->Visit("maxPerStageDescriptorUpdateAfterBindSampledImages", &properties->maxPerStageDescriptorUpdateAfterBindSampledImages) &&
-    visitor->Visit("maxPerStageDescriptorUpdateAfterBindStorageImages", &properties->maxPerStageDescriptorUpdateAfterBindStorageImages) &&
-    visitor->Visit("maxPerStageDescriptorUpdateAfterBindInputAttachments", &properties->maxPerStageDescriptorUpdateAfterBindInputAttachments) &&
-    visitor->Visit("maxPerStageUpdateAfterBindResources", &properties->maxPerStageUpdateAfterBindResources) &&
-    visitor->Visit("maxDescriptorSetUpdateAfterBindSamplers", &properties->maxDescriptorSetUpdateAfterBindSamplers) &&
-    visitor->Visit("maxDescriptorSetUpdateAfterBindUniformBuffers", &properties->maxDescriptorSetUpdateAfterBindUniformBuffers) &&
-    visitor->Visit("maxDescriptorSetUpdateAfterBindUniformBuffersDynamic", &properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic) &&
-    visitor->Visit("maxDescriptorSetUpdateAfterBindStorageBuffers", &properties->maxDescriptorSetUpdateAfterBindStorageBuffers) &&
-    visitor->Visit("maxDescriptorSetUpdateAfterBindStorageBuffersDynamic", &properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic) &&
-    visitor->Visit("maxDescriptorSetUpdateAfterBindSampledImages", &properties->maxDescriptorSetUpdateAfterBindSampledImages) &&
-    visitor->Visit("maxDescriptorSetUpdateAfterBindStorageImages", &properties->maxDescriptorSetUpdateAfterBindStorageImages) &&
-    visitor->Visit("maxDescriptorSetUpdateAfterBindInputAttachments", &properties->maxDescriptorSetUpdateAfterBindInputAttachments) &&
-    visitor->Visit("supportedDepthResolveModes", &properties->supportedDepthResolveModes) &&
-    visitor->Visit("supportedStencilResolveModes", &properties->supportedStencilResolveModes) &&
-    visitor->Visit("independentResolveNone", &properties->independentResolveNone) &&
-    visitor->Visit("independentResolve", &properties->independentResolve) &&
-    visitor->Visit("filterMinmaxSingleComponentFormats", &properties->filterMinmaxSingleComponentFormats) &&
-    visitor->Visit("filterMinmaxImageComponentMapping", &properties->filterMinmaxImageComponentMapping) &&
-    visitor->Visit("maxTimelineSemaphoreValueDifference", &properties->maxTimelineSemaphoreValueDifference) &&
-    visitor->Visit("framebufferIntegerColorSampleCounts", &properties->framebufferIntegerColorSampleCounts);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkPhysicalDeviceVulkan12Features* features) {
-  return
-    visitor->Visit("samplerMirrorClampToEdge", &features->samplerMirrorClampToEdge) &&
-    visitor->Visit("drawIndirectCount", &features->drawIndirectCount) &&
-    visitor->Visit("storageBuffer8BitAccess", &features->storageBuffer8BitAccess) &&
-    visitor->Visit("uniformAndStorageBuffer8BitAccess", &features->uniformAndStorageBuffer8BitAccess) &&
-    visitor->Visit("storagePushConstant8", &features->storagePushConstant8) &&
-    visitor->Visit("shaderBufferInt64Atomics", &features->shaderBufferInt64Atomics) &&
-    visitor->Visit("shaderSharedInt64Atomics", &features->shaderSharedInt64Atomics) &&
-    visitor->Visit("shaderFloat16", &features->shaderFloat16) &&
-    visitor->Visit("shaderInt8", &features->shaderInt8) &&
-    visitor->Visit("descriptorIndexing", &features->descriptorIndexing) &&
-    visitor->Visit("shaderInputAttachmentArrayDynamicIndexing", &features->shaderInputAttachmentArrayDynamicIndexing) &&
-    visitor->Visit("shaderUniformTexelBufferArrayDynamicIndexing", &features->shaderUniformTexelBufferArrayDynamicIndexing) &&
-    visitor->Visit("shaderStorageTexelBufferArrayDynamicIndexing", &features->shaderStorageTexelBufferArrayDynamicIndexing) &&
-    visitor->Visit("shaderUniformBufferArrayNonUniformIndexing", &features->shaderUniformBufferArrayNonUniformIndexing) &&
-    visitor->Visit("shaderSampledImageArrayNonUniformIndexing", &features->shaderSampledImageArrayNonUniformIndexing) &&
-    visitor->Visit("shaderStorageBufferArrayNonUniformIndexing", &features->shaderStorageBufferArrayNonUniformIndexing) &&
-    visitor->Visit("shaderStorageImageArrayNonUniformIndexing", &features->shaderStorageImageArrayNonUniformIndexing) &&
-    visitor->Visit("shaderInputAttachmentArrayNonUniformIndexing", &features->shaderInputAttachmentArrayNonUniformIndexing) &&
-    visitor->Visit("shaderUniformTexelBufferArrayNonUniformIndexing", &features->shaderUniformTexelBufferArrayNonUniformIndexing) &&
-    visitor->Visit("shaderStorageTexelBufferArrayNonUniformIndexing", &features->shaderStorageTexelBufferArrayNonUniformIndexing) &&
-    visitor->Visit("descriptorBindingUniformBufferUpdateAfterBind", &features->descriptorBindingUniformBufferUpdateAfterBind) &&
-    visitor->Visit("descriptorBindingSampledImageUpdateAfterBind", &features->descriptorBindingSampledImageUpdateAfterBind) &&
-    visitor->Visit("descriptorBindingStorageImageUpdateAfterBind", &features->descriptorBindingStorageImageUpdateAfterBind) &&
-    visitor->Visit("descriptorBindingStorageBufferUpdateAfterBind", &features->descriptorBindingStorageBufferUpdateAfterBind) &&
-    visitor->Visit("descriptorBindingUniformTexelBufferUpdateAfterBind", &features->descriptorBindingUniformTexelBufferUpdateAfterBind) &&
-    visitor->Visit("descriptorBindingStorageTexelBufferUpdateAfterBind", &features->descriptorBindingStorageTexelBufferUpdateAfterBind) &&
-    visitor->Visit("descriptorBindingUpdateUnusedWhilePending", &features->descriptorBindingUpdateUnusedWhilePending) &&
-    visitor->Visit("descriptorBindingPartiallyBound", &features->descriptorBindingPartiallyBound) &&
-    visitor->Visit("descriptorBindingVariableDescriptorCount", &features->descriptorBindingVariableDescriptorCount) &&
-    visitor->Visit("runtimeDescriptorArray", &features->runtimeDescriptorArray) &&
-    visitor->Visit("samplerFilterMinmax", &features->samplerFilterMinmax) &&
-    visitor->Visit("scalarBlockLayout", &features->scalarBlockLayout) &&
-    visitor->Visit("imagelessFramebuffer", &features->imagelessFramebuffer) &&
-    visitor->Visit("uniformBufferStandardLayout", &features->uniformBufferStandardLayout) &&
-    visitor->Visit("shaderSubgroupExtendedTypes", &features->shaderSubgroupExtendedTypes) &&
-    visitor->Visit("separateDepthStencilLayouts", &features->separateDepthStencilLayouts) &&
-    visitor->Visit("hostQueryReset", &features->hostQueryReset) &&
-    visitor->Visit("timelineSemaphore", &features->timelineSemaphore) &&
-    visitor->Visit("bufferDeviceAddress", &features->bufferDeviceAddress) &&
-    visitor->Visit("bufferDeviceAddressCaptureReplay", &features->bufferDeviceAddressCaptureReplay) &&
-    visitor->Visit("bufferDeviceAddressMultiDevice", &features->bufferDeviceAddressMultiDevice) &&
-    visitor->Visit("vulkanMemoryModel", &features->vulkanMemoryModel) &&
-    visitor->Visit("vulkanMemoryModelDeviceScope", &features->vulkanMemoryModelDeviceScope) &&
-    visitor->Visit("vulkanMemoryModelAvailabilityVisibilityChains", &features->vulkanMemoryModelAvailabilityVisibilityChains) &&
-    visitor->Visit("shaderOutputViewportIndex", &features->shaderOutputViewportIndex) &&
-    visitor->Visit("shaderOutputLayer", &features->shaderOutputLayer) &&
-    visitor->Visit("subgroupBroadcastDynamicId", &features->subgroupBroadcastDynamicId);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkJsonCore13* core) {
-  return
-    visitor->Visit("features", &core->features) &&
-    visitor->Visit("properties", &core->properties);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkPhysicalDeviceVulkan13Properties* properties) {
-  return
-    visitor->Visit("minSubgroupSize", &properties->minSubgroupSize) &&
-    visitor->Visit("maxSubgroupSize", &properties->maxSubgroupSize) &&
-    visitor->Visit("maxComputeWorkgroupSubgroups", &properties->maxComputeWorkgroupSubgroups) &&
-    visitor->Visit("requiredSubgroupSizeStages", &properties->requiredSubgroupSizeStages) &&
-    visitor->Visit("maxInlineUniformBlockSize", &properties->maxInlineUniformBlockSize) &&
-    visitor->Visit("maxPerStageDescriptorInlineUniformBlocks", &properties->maxPerStageDescriptorInlineUniformBlocks) &&
-    visitor->Visit("maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks", &properties->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks) &&
-    visitor->Visit("maxDescriptorSetInlineUniformBlocks", &properties->maxDescriptorSetInlineUniformBlocks) &&
-    visitor->Visit("maxDescriptorSetUpdateAfterBindInlineUniformBlocks", &properties->maxDescriptorSetUpdateAfterBindInlineUniformBlocks) &&
-    visitor->Visit("maxInlineUniformTotalSize", &properties->maxInlineUniformTotalSize) &&
-    visitor->Visit("integerDotProduct8BitUnsignedAccelerated", &properties->integerDotProduct8BitUnsignedAccelerated) &&
-    visitor->Visit("integerDotProduct8BitSignedAccelerated", &properties->integerDotProduct8BitSignedAccelerated) &&
-    visitor->Visit("integerDotProduct8BitMixedSignednessAccelerated", &properties->integerDotProduct8BitMixedSignednessAccelerated) &&
-    visitor->Visit("integerDotProduct4x8BitPackedUnsignedAccelerated", &properties->integerDotProduct4x8BitPackedUnsignedAccelerated) &&
-    visitor->Visit("integerDotProduct4x8BitPackedSignedAccelerated", &properties->integerDotProduct4x8BitPackedSignedAccelerated) &&
-    visitor->Visit("integerDotProduct4x8BitPackedMixedSignednessAccelerated", &properties->integerDotProduct4x8BitPackedMixedSignednessAccelerated) &&
-    visitor->Visit("integerDotProduct16BitUnsignedAccelerated", &properties->integerDotProduct16BitUnsignedAccelerated) &&
-    visitor->Visit("integerDotProduct16BitSignedAccelerated", &properties->integerDotProduct16BitSignedAccelerated) &&
-    visitor->Visit("integerDotProduct16BitMixedSignednessAccelerated", &properties->integerDotProduct16BitMixedSignednessAccelerated) &&
-    visitor->Visit("integerDotProduct32BitUnsignedAccelerated", &properties->integerDotProduct32BitUnsignedAccelerated) &&
-    visitor->Visit("integerDotProduct32BitSignedAccelerated", &properties->integerDotProduct32BitSignedAccelerated) &&
-    visitor->Visit("integerDotProduct32BitMixedSignednessAccelerated", &properties->integerDotProduct32BitMixedSignednessAccelerated) &&
-    visitor->Visit("integerDotProduct64BitUnsignedAccelerated", &properties->integerDotProduct64BitUnsignedAccelerated) &&
-    visitor->Visit("integerDotProduct64BitSignedAccelerated", &properties->integerDotProduct64BitSignedAccelerated) &&
-    visitor->Visit("integerDotProduct64BitMixedSignednessAccelerated", &properties->integerDotProduct64BitMixedSignednessAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating8BitUnsignedAccelerated", &properties->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating8BitSignedAccelerated", &properties->integerDotProductAccumulatingSaturating8BitSignedAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated", &properties->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated", &properties->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated", &properties->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated", &properties->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating16BitUnsignedAccelerated", &properties->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating16BitSignedAccelerated", &properties->integerDotProductAccumulatingSaturating16BitSignedAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated", &properties->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating32BitUnsignedAccelerated", &properties->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating32BitSignedAccelerated", &properties->integerDotProductAccumulatingSaturating32BitSignedAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated", &properties->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating64BitUnsignedAccelerated", &properties->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating64BitSignedAccelerated", &properties->integerDotProductAccumulatingSaturating64BitSignedAccelerated) &&
-    visitor->Visit("integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated", &properties->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated) &&
-    visitor->Visit("storageTexelBufferOffsetAlignmentBytes", &properties->storageTexelBufferOffsetAlignmentBytes) &&
-    visitor->Visit("storageTexelBufferOffsetSingleTexelAlignment", &properties->storageTexelBufferOffsetSingleTexelAlignment) &&
-    visitor->Visit("uniformTexelBufferOffsetAlignmentBytes", &properties->uniformTexelBufferOffsetAlignmentBytes) &&
-    visitor->Visit("uniformTexelBufferOffsetSingleTexelAlignment", &properties->uniformTexelBufferOffsetSingleTexelAlignment) &&
-    visitor->Visit("maxBufferSize", &properties->maxBufferSize);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkPhysicalDeviceVulkan13Features* features) {
-  return
-    visitor->Visit("robustImageAccess", &features->robustImageAccess) &&
-    visitor->Visit("inlineUniformBlock", &features->inlineUniformBlock) &&
-    visitor->Visit("descriptorBindingInlineUniformBlockUpdateAfterBind", &features->descriptorBindingInlineUniformBlockUpdateAfterBind) &&
-    visitor->Visit("pipelineCreationCacheControl", &features->pipelineCreationCacheControl) &&
-    visitor->Visit("privateData", &features->privateData) &&
-    visitor->Visit("shaderDemoteToHelperInvocation", &features->shaderDemoteToHelperInvocation) &&
-    visitor->Visit("shaderTerminateInvocation", &features->shaderTerminateInvocation) &&
-    visitor->Visit("subgroupSizeControl", &features->subgroupSizeControl) &&
-    visitor->Visit("computeFullSubgroups", &features->computeFullSubgroups) &&
-    visitor->Visit("synchronization2", &features->synchronization2) &&
-    visitor->Visit("textureCompressionASTC_HDR", &features->textureCompressionASTC_HDR) &&
-    visitor->Visit("shaderZeroInitializeWorkgroupMemory", &features->shaderZeroInitializeWorkgroupMemory) &&
-    visitor->Visit("dynamicRendering", &features->dynamicRendering) &&
-    visitor->Visit("shaderIntegerDotProduct", &features->shaderIntegerDotProduct) &&
-    visitor->Visit("maintenance4", &features->maintenance4);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkJsonCore14* core) {
-  return
-    visitor->Visit("features", &core->features) &&
-    visitor->Visit("properties", &core->properties);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkPhysicalDeviceVulkan14Properties* properties) {
-  return
-    visitor->Visit("lineSubPixelPrecisionBits", &properties->lineSubPixelPrecisionBits) &&
-    visitor->Visit("maxVertexAttribDivisor", &properties->maxVertexAttribDivisor) &&
-    visitor->Visit("supportsNonZeroFirstInstance", &properties->supportsNonZeroFirstInstance) &&
-    visitor->Visit("maxPushDescriptors", &properties->maxPushDescriptors) &&
-    visitor->Visit("dynamicRenderingLocalReadDepthStencilAttachments", &properties->dynamicRenderingLocalReadDepthStencilAttachments) &&
-    visitor->Visit("dynamicRenderingLocalReadMultisampledAttachments", &properties->dynamicRenderingLocalReadMultisampledAttachments) &&
-    visitor->Visit("earlyFragmentMultisampleCoverageAfterSampleCounting", &properties->earlyFragmentMultisampleCoverageAfterSampleCounting) &&
-    visitor->Visit("earlyFragmentSampleMaskTestBeforeSampleCounting", &properties->earlyFragmentSampleMaskTestBeforeSampleCounting) &&
-    visitor->Visit("depthStencilSwizzleOneSupport", &properties->depthStencilSwizzleOneSupport) &&
-    visitor->Visit("polygonModePointSize", &properties->polygonModePointSize) &&
-    visitor->Visit("nonStrictSinglePixelWideLinesUseParallelogram", &properties->nonStrictSinglePixelWideLinesUseParallelogram) &&
-    visitor->Visit("nonStrictWideLinesUseParallelogram", &properties->nonStrictWideLinesUseParallelogram) &&
-    visitor->Visit("blockTexelViewCompatibleMultipleLayers", &properties->blockTexelViewCompatibleMultipleLayers) &&
-    visitor->Visit("maxCombinedImageSamplerDescriptorCount", &properties->maxCombinedImageSamplerDescriptorCount) &&
-    visitor->Visit("fragmentShadingRateClampCombinerInputs", &properties->fragmentShadingRateClampCombinerInputs) &&
-    visitor->Visit("defaultRobustnessStorageBuffers", &properties->defaultRobustnessStorageBuffers) &&
-    visitor->Visit("defaultRobustnessUniformBuffers", &properties->defaultRobustnessUniformBuffers) &&
-    visitor->Visit("defaultRobustnessVertexInputs", &properties->defaultRobustnessVertexInputs) &&
-    visitor->Visit("defaultRobustnessImages", &properties->defaultRobustnessImages) &&
-    visitor->Visit("copySrcLayoutCount", &properties->copySrcLayoutCount) &&
-    visitor->VisitArray("pCopySrcLayouts", properties->copySrcLayoutCount, &properties->pCopySrcLayouts) &&
-    visitor->Visit("copyDstLayoutCount", &properties->copyDstLayoutCount) &&
-    visitor->VisitArray("pCopyDstLayouts", properties->copyDstLayoutCount, &properties->pCopyDstLayouts) &&
-    visitor->Visit("optimalTilingLayoutUUID", &properties->optimalTilingLayoutUUID) &&
-    visitor->Visit("identicalMemoryTypeRequirements", &properties->identicalMemoryTypeRequirements);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkPhysicalDeviceVulkan14Features* features) {
-  return
-    visitor->Visit("globalPriorityQuery", &features->globalPriorityQuery) &&
-    visitor->Visit("shaderSubgroupRotate", &features->shaderSubgroupRotate) &&
-    visitor->Visit("shaderSubgroupRotateClustered", &features->shaderSubgroupRotateClustered) &&
-    visitor->Visit("shaderFloatControls2", &features->shaderFloatControls2) &&
-    visitor->Visit("shaderExpectAssume", &features->shaderExpectAssume) &&
-    visitor->Visit("rectangularLines", &features->rectangularLines) &&
-    visitor->Visit("bresenhamLines", &features->bresenhamLines) &&
-    visitor->Visit("smoothLines", &features->smoothLines) &&
-    visitor->Visit("stippledRectangularLines", &features->stippledRectangularLines) &&
-    visitor->Visit("stippledBresenhamLines", &features->stippledBresenhamLines) &&
-    visitor->Visit("stippledSmoothLines", &features->stippledSmoothLines) &&
-    visitor->Visit("vertexAttributeInstanceRateDivisor", &features->vertexAttributeInstanceRateDivisor) &&
-    visitor->Visit("vertexAttributeInstanceRateZeroDivisor", &features->vertexAttributeInstanceRateZeroDivisor) &&
-    visitor->Visit("indexTypeUint8", &features->indexTypeUint8) &&
-    visitor->Visit("dynamicRenderingLocalRead", &features->dynamicRenderingLocalRead) &&
-    visitor->Visit("maintenance5", &features->maintenance5) &&
-    visitor->Visit("maintenance6", &features->maintenance6) &&
-    visitor->Visit("pipelineProtectedAccess", &features->pipelineProtectedAccess) &&
-    visitor->Visit("pipelineRobustness", &features->pipelineRobustness) &&
-    visitor->Visit("hostImageCopy", &features->hostImageCopy);
-}
-// clang-format on
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor,
-                    VkJsonExtDriverProperties* properties) {
-  return visitor->Visit("driverPropertiesKHR",
-                        &properties->driver_properties_khr);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor,
-                    VkPhysicalDeviceDriverPropertiesKHR* properties) {
-  return visitor->Visit("driverID", &properties->driverID) &&
-         visitor->Visit("driverName", &properties->driverName) &&
-         visitor->Visit("driverInfo", &properties->driverInfo) &&
-         visitor->Visit("conformanceVersion", &properties->conformanceVersion);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor,
-                    VkConformanceVersionKHR* version) {
+inline bool Iterate(Visitor* visitor, VkConformanceVersionKHR* version) {
   return visitor->Visit("major", &version->major) &&
          visitor->Visit("minor", &version->minor) &&
          visitor->Visit("subminor", &version->subminor) &&
@@ -978,158 +499,1412 @@
 }
 
 template <typename Visitor>
-inline bool Iterate(Visitor* visitor,
-                    VkJsonExtVariablePointerFeatures* features) {
-  return visitor->Visit("variablePointerFeaturesKHR",
-                        &features->variable_pointer_features_khr);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor,
-                    VkJsonExtImage2DViewOf3DFeatures* features) {
-  return visitor->Visit("image2DViewOf3DFeaturesEXT",
-                        &features->image_2D_view_of_3D_features_EXT);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor,
-                    VkJsonExtShaderFloat16Int8Features* features) {
-  return visitor->Visit("shaderFloat16Int8FeaturesKHR",
-                        &features->shader_float16_int8_features_khr);
-}
-
-template <typename Visitor>
 inline bool Iterate(Visitor* visitor, VkMemoryType* type) {
-  return
-    visitor->Visit("propertyFlags", &type->propertyFlags) &&
-    visitor->Visit("heapIndex", &type->heapIndex);
+  return visitor->Visit("propertyFlags", &type->propertyFlags) &&
+         visitor->Visit("heapIndex", &type->heapIndex);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor, VkMemoryHeap* heap) {
-  return
-    visitor->Visit("size", &heap->size) &&
-    visitor->Visit("flags", &heap->flags);
+  return visitor->Visit("size", &heap->size) &&
+         visitor->Visit("flags", &heap->flags);
 }
 
 template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkPhysicalDeviceMemoryProperties* properties) {
+inline bool Iterate(Visitor* visitor, VkJsonCore11* core) {
+  return visitor->Visit("properties", &core->properties) &&
+         visitor->Visit("features", &core->features);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonCore12* core) {
+  return visitor->Visit("properties", &core->properties) &&
+         visitor->Visit("features", &core->features);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonCore13* core) {
+  return visitor->Visit("properties", &core->properties) &&
+         visitor->Visit("features", &core->features);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonCore14* core) {
+  return visitor->Visit("properties", &core->properties) &&
+         visitor->Visit("features", &core->features);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonKHRVariablePointers* structs) {
+  return visitor->Visit("variablePointerFeaturesKHR",
+                        &structs->variable_pointer_features_khr) &&
+         visitor->Visit("variablePointersFeaturesKHR",
+                        &structs->variable_pointers_features_khr);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonKHRShaderFloat16Int8* structs) {
+  return visitor->Visit("shaderFloat16Int8FeaturesKHR",
+                        &structs->shader_float16_int8_features_khr) &&
+         visitor->Visit("float16Int8FeaturesKHR",
+                        &structs->float16_int8_features_khr);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonExtImage2dViewOf3d* structs) {
+  return visitor->Visit("image2DViewOf3DFeaturesEXT",
+                        &structs->image_2d_view_of_3d_features_ext);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonExtCustomBorderColor* structs) {
+  return visitor->Visit("customBorderColorFeaturesEXT",
+                        &structs->custom_border_color_features_ext);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkJsonExtPrimitiveTopologyListRestart* structs) {
+  return visitor->Visit("primitiveTopologyListRestartFeaturesEXT",
+                        &structs->primitive_topology_list_restart_features_ext);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonExtProvokingVertex* structs) {
+  return visitor->Visit("provokingVertexFeaturesEXT",
+                        &structs->provoking_vertex_features_ext);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonKHRIndexTypeUint8* structs) {
+  return visitor->Visit("indexTypeUint8FeaturesKHR",
+                        &structs->index_type_uint8_features_khr);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonExtIndexTypeUint8* structs) {
+  return visitor->Visit("indexTypeUint8FeaturesEXT",
+                        &structs->index_type_uint8_features_ext);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkJsonKHRVertexAttributeDivisor* structs) {
+  return visitor->Visit("vertexAttributeDivisorFeaturesKHR",
+                        &structs->vertex_attribute_divisor_features_khr);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkJsonExtVertexAttributeDivisor* structs) {
+  return visitor->Visit("vertexAttributeDivisorFeaturesEXT",
+                        &structs->vertex_attribute_divisor_features_ext);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonExtTransformFeedback* structs) {
+  return visitor->Visit("transformFeedbackFeaturesEXT",
+                        &structs->transform_feedback_features_ext);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkJsonKHRShaderSubgroupUniformControlFlow* structs) {
+  return visitor->Visit(
+      "shaderSubgroupUniformControlFlowFeaturesKHR",
+      &structs->shader_subgroup_uniform_control_flow_features_khr);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkJsonKHRShaderSubgroupExtendedTypes* structs) {
+  return visitor->Visit("shaderSubgroupExtendedTypesFeaturesKHR",
+                        &structs->shader_subgroup_extended_types_features_khr);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonKHR8bitStorage* structs) {
+  return visitor->Visit("bit8StorageFeaturesKHR",
+                        &structs->bit8_storage_features_khr);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkJsonKHRShaderIntegerDotProduct* structs) {
+  return visitor->Visit("shaderIntegerDotProductFeaturesKHR",
+                        &structs->shader_integer_dot_product_features_khr);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkJsonIMGRelaxedLineRasterization* structs) {
+  return visitor->Visit("relaxedLineRasterizationFeaturesIMG",
+                        &structs->relaxed_line_rasterization_features_img);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonKHRLineRasterization* structs) {
+  return visitor->Visit("lineRasterizationFeaturesKHR",
+                        &structs->line_rasterization_features_khr);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonExtLineRasterization* structs) {
+  return visitor->Visit("lineRasterizationFeaturesEXT",
+                        &structs->line_rasterization_features_ext);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkJsonExtPrimitivesGeneratedQuery* structs) {
+  return visitor->Visit("primitivesGeneratedQueryFeaturesEXT",
+                        &structs->primitives_generated_query_features_ext);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonKHRShaderFloatControls* structs) {
+  return visitor->Visit("floatControlsPropertiesKHR",
+                        &structs->float_controls_properties_khr);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkJsonKHRDriverProperties* structs) {
+  return visitor->Visit("driverPropertiesKHR", &structs->driver_properties_khr);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceFloatControlsProperties* properties) {
   return
-    visitor->Visit("memoryTypeCount", &properties->memoryTypeCount) &&
-    visitor->VisitArray("memoryTypes", properties->memoryTypeCount, &properties->memoryTypes) &&
-    visitor->Visit("memoryHeapCount", &properties->memoryHeapCount) &&
-    visitor->VisitArray("memoryHeaps", properties->memoryHeapCount, &properties->memoryHeaps);
+
+      visitor->Visit("denormBehaviorIndependence",
+                     &properties->denormBehaviorIndependence) &&
+      visitor->Visit("roundingModeIndependence",
+                     &properties->roundingModeIndependence) &&
+      visitor->Visit("shaderSignedZeroInfNanPreserveFloat16",
+                     &properties->shaderSignedZeroInfNanPreserveFloat16) &&
+      visitor->Visit("shaderSignedZeroInfNanPreserveFloat32",
+                     &properties->shaderSignedZeroInfNanPreserveFloat32) &&
+      visitor->Visit("shaderSignedZeroInfNanPreserveFloat64",
+                     &properties->shaderSignedZeroInfNanPreserveFloat64) &&
+      visitor->Visit("shaderDenormPreserveFloat16",
+                     &properties->shaderDenormPreserveFloat16) &&
+      visitor->Visit("shaderDenormPreserveFloat32",
+                     &properties->shaderDenormPreserveFloat32) &&
+      visitor->Visit("shaderDenormPreserveFloat64",
+                     &properties->shaderDenormPreserveFloat64) &&
+      visitor->Visit("shaderDenormFlushToZeroFloat16",
+                     &properties->shaderDenormFlushToZeroFloat16) &&
+      visitor->Visit("shaderDenormFlushToZeroFloat32",
+                     &properties->shaderDenormFlushToZeroFloat32) &&
+      visitor->Visit("shaderDenormFlushToZeroFloat64",
+                     &properties->shaderDenormFlushToZeroFloat64) &&
+      visitor->Visit("shaderRoundingModeRTEFloat16",
+                     &properties->shaderRoundingModeRTEFloat16) &&
+      visitor->Visit("shaderRoundingModeRTEFloat32",
+                     &properties->shaderRoundingModeRTEFloat32) &&
+      visitor->Visit("shaderRoundingModeRTEFloat64",
+                     &properties->shaderRoundingModeRTEFloat64) &&
+      visitor->Visit("shaderRoundingModeRTZFloat16",
+                     &properties->shaderRoundingModeRTZFloat16) &&
+      visitor->Visit("shaderRoundingModeRTZFloat32",
+                     &properties->shaderRoundingModeRTZFloat32) &&
+      visitor->Visit("shaderRoundingModeRTZFloat64",
+                     &properties->shaderRoundingModeRTZFloat64);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkPhysicalDeviceProperties* properties) {
+  return
+
+      visitor->Visit("apiVersion", &properties->apiVersion) &&
+      visitor->Visit("driverVersion", &properties->driverVersion) &&
+      visitor->Visit("vendorID", &properties->vendorID) &&
+      visitor->Visit("deviceID", &properties->deviceID) &&
+      visitor->Visit("deviceType", &properties->deviceType) &&
+      visitor->Visit("deviceName", &properties->deviceName) &&
+      visitor->Visit("pipelineCacheUUID", &properties->pipelineCacheUUID) &&
+      visitor->Visit("limits", &properties->limits) &&
+      visitor->Visit("sparseProperties", &properties->sparseProperties);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceMemoryProperties* properties) {
+  return
+
+      visitor->Visit("memoryTypeCount", &properties->memoryTypeCount) &&
+      visitor->VisitArray("memoryTypes", properties->memoryTypeCount,
+                          &properties->memoryTypes) &&
+      visitor->Visit("memoryHeapCount", &properties->memoryHeapCount) &&
+      visitor->VisitArray("memoryHeaps", properties->memoryHeapCount,
+                          &properties->memoryHeaps);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
                     VkPhysicalDeviceSubgroupProperties* properties) {
-  return visitor->Visit("subgroupSize", &properties->subgroupSize) &&
-         visitor->Visit("supportedStages", &properties->supportedStages) &&
-         visitor->Visit("supportedOperations",
-                        &properties->supportedOperations) &&
-         visitor->Visit("quadOperationsInAllStages",
-                        &properties->quadOperationsInAllStages);
+  return
+
+      visitor->Visit("subgroupSize", &properties->subgroupSize) &&
+      visitor->Visit("supportedStages", &properties->supportedStages) &&
+      visitor->Visit("supportedOperations", &properties->supportedOperations) &&
+      visitor->Visit("quadOperationsInAllStages",
+                     &properties->quadOperationsInAllStages);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
                     VkPhysicalDevicePointClippingProperties* properties) {
-  return visitor->Visit("pointClippingBehavior",
-                        &properties->pointClippingBehavior);
+  return
+
+      visitor->Visit("pointClippingBehavior",
+                     &properties->pointClippingBehavior);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
                     VkPhysicalDeviceMultiviewProperties* properties) {
-  return visitor->Visit("maxMultiviewViewCount",
-                        &properties->maxMultiviewViewCount) &&
-         visitor->Visit("maxMultiviewInstanceIndex",
-                        &properties->maxMultiviewInstanceIndex);
+  return
+
+      visitor->Visit("maxMultiviewViewCount",
+                     &properties->maxMultiviewViewCount) &&
+      visitor->Visit("maxMultiviewInstanceIndex",
+                     &properties->maxMultiviewInstanceIndex);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
                     VkPhysicalDeviceIDProperties* properties) {
-  return visitor->Visit("deviceUUID", &properties->deviceUUID) &&
-         visitor->Visit("driverUUID", &properties->driverUUID) &&
-         visitor->Visit("deviceLUID", &properties->deviceLUID) &&
-         visitor->Visit("deviceNodeMask", &properties->deviceNodeMask) &&
-         visitor->Visit("deviceLUIDValid", &properties->deviceLUIDValid);
+  return
+
+      visitor->Visit("deviceUUID", &properties->deviceUUID) &&
+      visitor->Visit("driverUUID", &properties->driverUUID) &&
+      visitor->Visit("deviceLUID", &properties->deviceLUID) &&
+      visitor->Visit("deviceNodeMask", &properties->deviceNodeMask) &&
+      visitor->Visit("deviceLUIDValid", &properties->deviceLUIDValid);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
                     VkPhysicalDeviceMaintenance3Properties* properties) {
-  return visitor->Visit("maxPerSetDescriptors",
-                        &properties->maxPerSetDescriptors) &&
-         visitor->Visit("maxMemoryAllocationSize",
-                        &properties->maxMemoryAllocationSize);
+  return
+
+      visitor->Visit("maxPerSetDescriptors",
+                     &properties->maxPerSetDescriptors) &&
+      visitor->Visit("maxMemoryAllocationSize",
+                     &properties->maxMemoryAllocationSize);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
-                    VkPhysicalDevice16BitStorageFeatures* features) {
-  return visitor->Visit("storageBuffer16BitAccess",
-                        &features->storageBuffer16BitAccess) &&
-         visitor->Visit("uniformAndStorageBuffer16BitAccess",
-                        &features->uniformAndStorageBuffer16BitAccess) &&
-         visitor->Visit("storagePushConstant16",
-                        &features->storagePushConstant16) &&
-         visitor->Visit("storageInputOutput16",
-                        &features->storageInputOutput16);
+                    VkPhysicalDeviceSparseProperties* properties) {
+  return
+
+      visitor->Visit("residencyStandard2DBlockShape",
+                     &properties->residencyStandard2DBlockShape) &&
+      visitor->Visit("residencyStandard2DMultisampleBlockShape",
+                     &properties->residencyStandard2DMultisampleBlockShape) &&
+      visitor->Visit("residencyStandard3DBlockShape",
+                     &properties->residencyStandard3DBlockShape) &&
+      visitor->Visit("residencyAlignedMipSize",
+                     &properties->residencyAlignedMipSize) &&
+      visitor->Visit("residencyNonResidentStrict",
+                     &properties->residencyNonResidentStrict);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkImageFormatProperties* properties) {
+  return
+
+      visitor->Visit("maxExtent", &properties->maxExtent) &&
+      visitor->Visit("maxMipLevels", &properties->maxMipLevels) &&
+      visitor->Visit("maxArrayLayers", &properties->maxArrayLayers) &&
+      visitor->Visit("sampleCounts", &properties->sampleCounts) &&
+      visitor->Visit("maxResourceSize", &properties->maxResourceSize);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkQueueFamilyProperties* properties) {
+  return
+
+      visitor->Visit("queueFlags", &properties->queueFlags) &&
+      visitor->Visit("queueCount", &properties->queueCount) &&
+      visitor->Visit("timestampValidBits", &properties->timestampValidBits) &&
+      visitor->Visit("minImageTransferGranularity",
+                     &properties->minImageTransferGranularity);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkExtensionProperties* properties) {
+  return
+
+      visitor->Visit("extensionName", &properties->extensionName) &&
+      visitor->Visit("specVersion", &properties->specVersion);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkLayerProperties* properties) {
+  return
+
+      visitor->Visit("layerName", &properties->layerName) &&
+      visitor->Visit("specVersion", &properties->specVersion) &&
+      visitor->Visit("implementationVersion",
+                     &properties->implementationVersion) &&
+      visitor->Visit("description", &properties->description);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkFormatProperties* properties) {
+  return
+
+      visitor->Visit("linearTilingFeatures",
+                     &properties->linearTilingFeatures) &&
+      visitor->Visit("optimalTilingFeatures",
+                     &properties->optimalTilingFeatures) &&
+      visitor->Visit("bufferFeatures", &properties->bufferFeatures);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
-                    VkPhysicalDeviceMultiviewFeatures* features) {
-  return visitor->Visit("multiview", &features->multiview) &&
-         visitor->Visit("multiviewGeometryShader",
-                        &features->multiviewGeometryShader) &&
-         visitor->Visit("multiviewTessellationShader",
-                        &features->multiviewTessellationShader);
+                    VkPhysicalDeviceVariablePointersFeatures* features) {
+  return
+
+      visitor->Visit("variablePointersStorageBuffer",
+                     &features->variablePointersStorageBuffer) &&
+      visitor->Visit("variablePointers", &features->variablePointers);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
-                    VkPhysicalDeviceVariablePointerFeatures* features) {
-  return visitor->Visit("variablePointersStorageBuffer",
-                        &features->variablePointersStorageBuffer) &&
-         visitor->Visit("variablePointers", &features->variablePointers);
+                    VkPhysicalDeviceShaderFloat16Int8Features* features) {
+  return
+
+      visitor->Visit("shaderFloat16", &features->shaderFloat16) &&
+      visitor->Visit("shaderInt8", &features->shaderInt8);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
                     VkPhysicalDeviceImage2DViewOf3DFeaturesEXT* features) {
-  return visitor->Visit("image2DViewOf3D", &features->image2DViewOf3D) &&
-         visitor->Visit("sampler2DViewOf3D", &features->sampler2DViewOf3D);
+  return
+
+      visitor->Visit("image2DViewOf3D", &features->image2DViewOf3D) &&
+      visitor->Visit("sampler2DViewOf3D", &features->sampler2DViewOf3D);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
-                    VkPhysicalDeviceShaderFloat16Int8FeaturesKHR* features) {
-  return visitor->Visit("shaderFloat16", &features->shaderFloat16) &&
-         visitor->Visit("shaderInt8", &features->shaderInt8);
+                    VkPhysicalDeviceCustomBorderColorFeaturesEXT* features) {
+  return
+
+      visitor->Visit("customBorderColors", &features->customBorderColors) &&
+      visitor->Visit("customBorderColorWithoutFormat",
+                     &features->customBorderColorWithoutFormat);
+}
+
+template <typename Visitor>
+inline bool Iterate(
+    Visitor* visitor,
+    VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT* features) {
+  return
+
+      visitor->Visit("primitiveTopologyListRestart",
+                     &features->primitiveTopologyListRestart) &&
+      visitor->Visit("primitiveTopologyPatchListRestart",
+                     &features->primitiveTopologyPatchListRestart);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceProvokingVertexFeaturesEXT* features) {
+  return
+
+      visitor->Visit("provokingVertexLast", &features->provokingVertexLast) &&
+      visitor->Visit("transformFeedbackPreservesProvokingVertex",
+                     &features->transformFeedbackPreservesProvokingVertex);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceIndexTypeUint8Features* features) {
+  return
+
+      visitor->Visit("indexTypeUint8", &features->indexTypeUint8);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceVertexAttributeDivisorFeatures* features) {
+  return
+
+      visitor->Visit("vertexAttributeInstanceRateDivisor",
+                     &features->vertexAttributeInstanceRateDivisor) &&
+      visitor->Visit("vertexAttributeInstanceRateZeroDivisor",
+                     &features->vertexAttributeInstanceRateZeroDivisor);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceTransformFeedbackFeaturesEXT* features) {
+  return
+
+      visitor->Visit("transformFeedback", &features->transformFeedback) &&
+      visitor->Visit("geometryStreams", &features->geometryStreams);
+}
+
+template <typename Visitor>
+inline bool Iterate(
+    Visitor* visitor,
+    VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR* features) {
+  return
+
+      visitor->Visit("shaderSubgroupUniformControlFlow",
+                     &features->shaderSubgroupUniformControlFlow);
+}
+
+template <typename Visitor>
+inline bool Iterate(
+    Visitor* visitor,
+    VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures* features) {
+  return
+
+      visitor->Visit("shaderSubgroupExtendedTypes",
+                     &features->shaderSubgroupExtendedTypes);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDevice8BitStorageFeatures* features) {
+  return
+
+      visitor->Visit("storageBuffer8BitAccess",
+                     &features->storageBuffer8BitAccess) &&
+      visitor->Visit("uniformAndStorageBuffer8BitAccess",
+                     &features->uniformAndStorageBuffer8BitAccess) &&
+      visitor->Visit("storagePushConstant8", &features->storagePushConstant8);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceShaderIntegerDotProductFeatures* features) {
+  return
+
+      visitor->Visit("shaderIntegerDotProduct",
+                     &features->shaderIntegerDotProduct);
+}
+
+template <typename Visitor>
+inline bool Iterate(
+    Visitor* visitor,
+    VkPhysicalDeviceRelaxedLineRasterizationFeaturesIMG* features) {
+  return
+
+      visitor->Visit("relaxedLineRasterization",
+                     &features->relaxedLineRasterization);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceLineRasterizationFeatures* features) {
+  return
+
+      visitor->Visit("rectangularLines", &features->rectangularLines) &&
+      visitor->Visit("bresenhamLines", &features->bresenhamLines) &&
+      visitor->Visit("smoothLines", &features->smoothLines) &&
+      visitor->Visit("stippledRectangularLines",
+                     &features->stippledRectangularLines) &&
+      visitor->Visit("stippledBresenhamLines",
+                     &features->stippledBresenhamLines) &&
+      visitor->Visit("stippledSmoothLines", &features->stippledSmoothLines);
+}
+
+template <typename Visitor>
+inline bool Iterate(
+    Visitor* visitor,
+    VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT* features) {
+  return
+
+      visitor->Visit("primitivesGeneratedQuery",
+                     &features->primitivesGeneratedQuery) &&
+      visitor->Visit(
+          "primitivesGeneratedQueryWithRasterizerDiscard",
+          &features->primitivesGeneratedQueryWithRasterizerDiscard) &&
+      visitor->Visit("primitivesGeneratedQueryWithNonZeroStreams",
+                     &features->primitivesGeneratedQueryWithNonZeroStreams);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDevice16BitStorageFeatures* features) {
+  return
+
+      visitor->Visit("storageBuffer16BitAccess",
+                     &features->storageBuffer16BitAccess) &&
+      visitor->Visit("uniformAndStorageBuffer16BitAccess",
+                     &features->uniformAndStorageBuffer16BitAccess) &&
+      visitor->Visit("storagePushConstant16",
+                     &features->storagePushConstant16) &&
+      visitor->Visit("storageInputOutput16", &features->storageInputOutput16);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceMultiviewFeatures* features) {
+  return
+
+      visitor->Visit("multiview", &features->multiview) &&
+      visitor->Visit("multiviewGeometryShader",
+                     &features->multiviewGeometryShader) &&
+      visitor->Visit("multiviewTessellationShader",
+                     &features->multiviewTessellationShader);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
                     VkPhysicalDeviceProtectedMemoryFeatures* features) {
-  return visitor->Visit("protectedMemory", &features->protectedMemory);
+  return
+
+      visitor->Visit("protectedMemory", &features->protectedMemory);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
                     VkPhysicalDeviceSamplerYcbcrConversionFeatures* features) {
-  return visitor->Visit("samplerYcbcrConversion",
-                        &features->samplerYcbcrConversion);
+  return
+
+      visitor->Visit("samplerYcbcrConversion",
+                     &features->samplerYcbcrConversion);
 }
 
 template <typename Visitor>
 inline bool Iterate(Visitor* visitor,
                     VkPhysicalDeviceShaderDrawParameterFeatures* features) {
-  return visitor->Visit("shaderDrawParameters",
-                        &features->shaderDrawParameters);
+  return
+
+      visitor->Visit("shaderDrawParameters", &features->shaderDrawParameters);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkPhysicalDeviceLimits* limits) {
+  return
+
+      visitor->Visit("maxImageDimension1D", &limits->maxImageDimension1D) &&
+      visitor->Visit("maxImageDimension2D", &limits->maxImageDimension2D) &&
+      visitor->Visit("maxImageDimension3D", &limits->maxImageDimension3D) &&
+      visitor->Visit("maxImageDimensionCube", &limits->maxImageDimensionCube) &&
+      visitor->Visit("maxImageArrayLayers", &limits->maxImageArrayLayers) &&
+      visitor->Visit("maxTexelBufferElements",
+                     &limits->maxTexelBufferElements) &&
+      visitor->Visit("maxUniformBufferRange", &limits->maxUniformBufferRange) &&
+      visitor->Visit("maxStorageBufferRange", &limits->maxStorageBufferRange) &&
+      visitor->Visit("maxPushConstantsSize", &limits->maxPushConstantsSize) &&
+      visitor->Visit("maxMemoryAllocationCount",
+                     &limits->maxMemoryAllocationCount) &&
+      visitor->Visit("maxSamplerAllocationCount",
+                     &limits->maxSamplerAllocationCount) &&
+      visitor->Visit("bufferImageGranularity",
+                     &limits->bufferImageGranularity) &&
+      visitor->Visit("sparseAddressSpaceSize",
+                     &limits->sparseAddressSpaceSize) &&
+      visitor->Visit("maxBoundDescriptorSets",
+                     &limits->maxBoundDescriptorSets) &&
+      visitor->Visit("maxPerStageDescriptorSamplers",
+                     &limits->maxPerStageDescriptorSamplers) &&
+      visitor->Visit("maxPerStageDescriptorUniformBuffers",
+                     &limits->maxPerStageDescriptorUniformBuffers) &&
+      visitor->Visit("maxPerStageDescriptorStorageBuffers",
+                     &limits->maxPerStageDescriptorStorageBuffers) &&
+      visitor->Visit("maxPerStageDescriptorSampledImages",
+                     &limits->maxPerStageDescriptorSampledImages) &&
+      visitor->Visit("maxPerStageDescriptorStorageImages",
+                     &limits->maxPerStageDescriptorStorageImages) &&
+      visitor->Visit("maxPerStageDescriptorInputAttachments",
+                     &limits->maxPerStageDescriptorInputAttachments) &&
+      visitor->Visit("maxPerStageResources", &limits->maxPerStageResources) &&
+      visitor->Visit("maxDescriptorSetSamplers",
+                     &limits->maxDescriptorSetSamplers) &&
+      visitor->Visit("maxDescriptorSetUniformBuffers",
+                     &limits->maxDescriptorSetUniformBuffers) &&
+      visitor->Visit("maxDescriptorSetUniformBuffersDynamic",
+                     &limits->maxDescriptorSetUniformBuffersDynamic) &&
+      visitor->Visit("maxDescriptorSetStorageBuffers",
+                     &limits->maxDescriptorSetStorageBuffers) &&
+      visitor->Visit("maxDescriptorSetStorageBuffersDynamic",
+                     &limits->maxDescriptorSetStorageBuffersDynamic) &&
+      visitor->Visit("maxDescriptorSetSampledImages",
+                     &limits->maxDescriptorSetSampledImages) &&
+      visitor->Visit("maxDescriptorSetStorageImages",
+                     &limits->maxDescriptorSetStorageImages) &&
+      visitor->Visit("maxDescriptorSetInputAttachments",
+                     &limits->maxDescriptorSetInputAttachments) &&
+      visitor->Visit("maxVertexInputAttributes",
+                     &limits->maxVertexInputAttributes) &&
+      visitor->Visit("maxVertexInputBindings",
+                     &limits->maxVertexInputBindings) &&
+      visitor->Visit("maxVertexInputAttributeOffset",
+                     &limits->maxVertexInputAttributeOffset) &&
+      visitor->Visit("maxVertexInputBindingStride",
+                     &limits->maxVertexInputBindingStride) &&
+      visitor->Visit("maxVertexOutputComponents",
+                     &limits->maxVertexOutputComponents) &&
+      visitor->Visit("maxTessellationGenerationLevel",
+                     &limits->maxTessellationGenerationLevel) &&
+      visitor->Visit("maxTessellationPatchSize",
+                     &limits->maxTessellationPatchSize) &&
+      visitor->Visit("maxTessellationControlPerVertexInputComponents",
+                     &limits->maxTessellationControlPerVertexInputComponents) &&
+      visitor->Visit(
+          "maxTessellationControlPerVertexOutputComponents",
+          &limits->maxTessellationControlPerVertexOutputComponents) &&
+      visitor->Visit("maxTessellationControlPerPatchOutputComponents",
+                     &limits->maxTessellationControlPerPatchOutputComponents) &&
+      visitor->Visit("maxTessellationControlTotalOutputComponents",
+                     &limits->maxTessellationControlTotalOutputComponents) &&
+      visitor->Visit("maxTessellationEvaluationInputComponents",
+                     &limits->maxTessellationEvaluationInputComponents) &&
+      visitor->Visit("maxTessellationEvaluationOutputComponents",
+                     &limits->maxTessellationEvaluationOutputComponents) &&
+      visitor->Visit("maxGeometryShaderInvocations",
+                     &limits->maxGeometryShaderInvocations) &&
+      visitor->Visit("maxGeometryInputComponents",
+                     &limits->maxGeometryInputComponents) &&
+      visitor->Visit("maxGeometryOutputComponents",
+                     &limits->maxGeometryOutputComponents) &&
+      visitor->Visit("maxGeometryOutputVertices",
+                     &limits->maxGeometryOutputVertices) &&
+      visitor->Visit("maxGeometryTotalOutputComponents",
+                     &limits->maxGeometryTotalOutputComponents) &&
+      visitor->Visit("maxFragmentInputComponents",
+                     &limits->maxFragmentInputComponents) &&
+      visitor->Visit("maxFragmentOutputAttachments",
+                     &limits->maxFragmentOutputAttachments) &&
+      visitor->Visit("maxFragmentDualSrcAttachments",
+                     &limits->maxFragmentDualSrcAttachments) &&
+      visitor->Visit("maxFragmentCombinedOutputResources",
+                     &limits->maxFragmentCombinedOutputResources) &&
+      visitor->Visit("maxComputeSharedMemorySize",
+                     &limits->maxComputeSharedMemorySize) &&
+      visitor->Visit("maxComputeWorkGroupCount",
+                     &limits->maxComputeWorkGroupCount) &&
+      visitor->Visit("maxComputeWorkGroupInvocations",
+                     &limits->maxComputeWorkGroupInvocations) &&
+      visitor->Visit("maxComputeWorkGroupSize",
+                     &limits->maxComputeWorkGroupSize) &&
+      visitor->Visit("subPixelPrecisionBits", &limits->subPixelPrecisionBits) &&
+      visitor->Visit("subTexelPrecisionBits", &limits->subTexelPrecisionBits) &&
+      visitor->Visit("mipmapPrecisionBits", &limits->mipmapPrecisionBits) &&
+      visitor->Visit("maxDrawIndexedIndexValue",
+                     &limits->maxDrawIndexedIndexValue) &&
+      visitor->Visit("maxDrawIndirectCount", &limits->maxDrawIndirectCount) &&
+      visitor->Visit("maxSamplerLodBias", &limits->maxSamplerLodBias) &&
+      visitor->Visit("maxSamplerAnisotropy", &limits->maxSamplerAnisotropy) &&
+      visitor->Visit("maxViewports", &limits->maxViewports) &&
+      visitor->Visit("maxViewportDimensions", &limits->maxViewportDimensions) &&
+      visitor->Visit("viewportBoundsRange", &limits->viewportBoundsRange) &&
+      visitor->Visit("viewportSubPixelBits", &limits->viewportSubPixelBits) &&
+      visitor->Visit("minMemoryMapAlignment", &limits->minMemoryMapAlignment) &&
+      visitor->Visit("minTexelBufferOffsetAlignment",
+                     &limits->minTexelBufferOffsetAlignment) &&
+      visitor->Visit("minUniformBufferOffsetAlignment",
+                     &limits->minUniformBufferOffsetAlignment) &&
+      visitor->Visit("minStorageBufferOffsetAlignment",
+                     &limits->minStorageBufferOffsetAlignment) &&
+      visitor->Visit("minTexelOffset", &limits->minTexelOffset) &&
+      visitor->Visit("maxTexelOffset", &limits->maxTexelOffset) &&
+      visitor->Visit("minTexelGatherOffset", &limits->minTexelGatherOffset) &&
+      visitor->Visit("maxTexelGatherOffset", &limits->maxTexelGatherOffset) &&
+      visitor->Visit("minInterpolationOffset",
+                     &limits->minInterpolationOffset) &&
+      visitor->Visit("maxInterpolationOffset",
+                     &limits->maxInterpolationOffset) &&
+      visitor->Visit("subPixelInterpolationOffsetBits",
+                     &limits->subPixelInterpolationOffsetBits) &&
+      visitor->Visit("maxFramebufferWidth", &limits->maxFramebufferWidth) &&
+      visitor->Visit("maxFramebufferHeight", &limits->maxFramebufferHeight) &&
+      visitor->Visit("maxFramebufferLayers", &limits->maxFramebufferLayers) &&
+      visitor->Visit("framebufferColorSampleCounts",
+                     &limits->framebufferColorSampleCounts) &&
+      visitor->Visit("framebufferDepthSampleCounts",
+                     &limits->framebufferDepthSampleCounts) &&
+      visitor->Visit("framebufferStencilSampleCounts",
+                     &limits->framebufferStencilSampleCounts) &&
+      visitor->Visit("framebufferNoAttachmentsSampleCounts",
+                     &limits->framebufferNoAttachmentsSampleCounts) &&
+      visitor->Visit("maxColorAttachments", &limits->maxColorAttachments) &&
+      visitor->Visit("sampledImageColorSampleCounts",
+                     &limits->sampledImageColorSampleCounts) &&
+      visitor->Visit("sampledImageIntegerSampleCounts",
+                     &limits->sampledImageIntegerSampleCounts) &&
+      visitor->Visit("sampledImageDepthSampleCounts",
+                     &limits->sampledImageDepthSampleCounts) &&
+      visitor->Visit("sampledImageStencilSampleCounts",
+                     &limits->sampledImageStencilSampleCounts) &&
+      visitor->Visit("storageImageSampleCounts",
+                     &limits->storageImageSampleCounts) &&
+      visitor->Visit("maxSampleMaskWords", &limits->maxSampleMaskWords) &&
+      visitor->Visit("timestampComputeAndGraphics",
+                     &limits->timestampComputeAndGraphics) &&
+      visitor->Visit("timestampPeriod", &limits->timestampPeriod) &&
+      visitor->Visit("maxClipDistances", &limits->maxClipDistances) &&
+      visitor->Visit("maxCullDistances", &limits->maxCullDistances) &&
+      visitor->Visit("maxCombinedClipAndCullDistances",
+                     &limits->maxCombinedClipAndCullDistances) &&
+      visitor->Visit("discreteQueuePriorities",
+                     &limits->discreteQueuePriorities) &&
+      visitor->Visit("pointSizeRange", &limits->pointSizeRange) &&
+      visitor->Visit("lineWidthRange", &limits->lineWidthRange) &&
+      visitor->Visit("pointSizeGranularity", &limits->pointSizeGranularity) &&
+      visitor->Visit("lineWidthGranularity", &limits->lineWidthGranularity) &&
+      visitor->Visit("strictLines", &limits->strictLines) &&
+      visitor->Visit("standardSampleLocations",
+                     &limits->standardSampleLocations) &&
+      visitor->Visit("optimalBufferCopyOffsetAlignment",
+                     &limits->optimalBufferCopyOffsetAlignment) &&
+      visitor->Visit("optimalBufferCopyRowPitchAlignment",
+                     &limits->optimalBufferCopyRowPitchAlignment) &&
+      visitor->Visit("nonCoherentAtomSize", &limits->nonCoherentAtomSize);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor, VkPhysicalDeviceFeatures* features) {
+  return
+
+      visitor->Visit("robustBufferAccess", &features->robustBufferAccess) &&
+      visitor->Visit("fullDrawIndexUint32", &features->fullDrawIndexUint32) &&
+      visitor->Visit("imageCubeArray", &features->imageCubeArray) &&
+      visitor->Visit("independentBlend", &features->independentBlend) &&
+      visitor->Visit("geometryShader", &features->geometryShader) &&
+      visitor->Visit("tessellationShader", &features->tessellationShader) &&
+      visitor->Visit("sampleRateShading", &features->sampleRateShading) &&
+      visitor->Visit("dualSrcBlend", &features->dualSrcBlend) &&
+      visitor->Visit("logicOp", &features->logicOp) &&
+      visitor->Visit("multiDrawIndirect", &features->multiDrawIndirect) &&
+      visitor->Visit("drawIndirectFirstInstance",
+                     &features->drawIndirectFirstInstance) &&
+      visitor->Visit("depthClamp", &features->depthClamp) &&
+      visitor->Visit("depthBiasClamp", &features->depthBiasClamp) &&
+      visitor->Visit("fillModeNonSolid", &features->fillModeNonSolid) &&
+      visitor->Visit("depthBounds", &features->depthBounds) &&
+      visitor->Visit("wideLines", &features->wideLines) &&
+      visitor->Visit("largePoints", &features->largePoints) &&
+      visitor->Visit("alphaToOne", &features->alphaToOne) &&
+      visitor->Visit("multiViewport", &features->multiViewport) &&
+      visitor->Visit("samplerAnisotropy", &features->samplerAnisotropy) &&
+      visitor->Visit("textureCompressionETC2",
+                     &features->textureCompressionETC2) &&
+      visitor->Visit("textureCompressionASTC_LDR",
+                     &features->textureCompressionASTC_LDR) &&
+      visitor->Visit("textureCompressionBC", &features->textureCompressionBC) &&
+      visitor->Visit("occlusionQueryPrecise",
+                     &features->occlusionQueryPrecise) &&
+      visitor->Visit("pipelineStatisticsQuery",
+                     &features->pipelineStatisticsQuery) &&
+      visitor->Visit("vertexPipelineStoresAndAtomics",
+                     &features->vertexPipelineStoresAndAtomics) &&
+      visitor->Visit("fragmentStoresAndAtomics",
+                     &features->fragmentStoresAndAtomics) &&
+      visitor->Visit("shaderTessellationAndGeometryPointSize",
+                     &features->shaderTessellationAndGeometryPointSize) &&
+      visitor->Visit("shaderImageGatherExtended",
+                     &features->shaderImageGatherExtended) &&
+      visitor->Visit("shaderStorageImageExtendedFormats",
+                     &features->shaderStorageImageExtendedFormats) &&
+      visitor->Visit("shaderStorageImageMultisample",
+                     &features->shaderStorageImageMultisample) &&
+      visitor->Visit("shaderStorageImageReadWithoutFormat",
+                     &features->shaderStorageImageReadWithoutFormat) &&
+      visitor->Visit("shaderStorageImageWriteWithoutFormat",
+                     &features->shaderStorageImageWriteWithoutFormat) &&
+      visitor->Visit("shaderUniformBufferArrayDynamicIndexing",
+                     &features->shaderUniformBufferArrayDynamicIndexing) &&
+      visitor->Visit("shaderSampledImageArrayDynamicIndexing",
+                     &features->shaderSampledImageArrayDynamicIndexing) &&
+      visitor->Visit("shaderStorageBufferArrayDynamicIndexing",
+                     &features->shaderStorageBufferArrayDynamicIndexing) &&
+      visitor->Visit("shaderStorageImageArrayDynamicIndexing",
+                     &features->shaderStorageImageArrayDynamicIndexing) &&
+      visitor->Visit("shaderClipDistance", &features->shaderClipDistance) &&
+      visitor->Visit("shaderCullDistance", &features->shaderCullDistance) &&
+      visitor->Visit("shaderFloat64", &features->shaderFloat64) &&
+      visitor->Visit("shaderInt64", &features->shaderInt64) &&
+      visitor->Visit("shaderInt16", &features->shaderInt16) &&
+      visitor->Visit("shaderResourceResidency",
+                     &features->shaderResourceResidency) &&
+      visitor->Visit("shaderResourceMinLod", &features->shaderResourceMinLod) &&
+      visitor->Visit("sparseBinding", &features->sparseBinding) &&
+      visitor->Visit("sparseResidencyBuffer",
+                     &features->sparseResidencyBuffer) &&
+      visitor->Visit("sparseResidencyImage2D",
+                     &features->sparseResidencyImage2D) &&
+      visitor->Visit("sparseResidencyImage3D",
+                     &features->sparseResidencyImage3D) &&
+      visitor->Visit("sparseResidency2Samples",
+                     &features->sparseResidency2Samples) &&
+      visitor->Visit("sparseResidency4Samples",
+                     &features->sparseResidency4Samples) &&
+      visitor->Visit("sparseResidency8Samples",
+                     &features->sparseResidency8Samples) &&
+      visitor->Visit("sparseResidency16Samples",
+                     &features->sparseResidency16Samples) &&
+      visitor->Visit("sparseResidencyAliased",
+                     &features->sparseResidencyAliased) &&
+      visitor->Visit("variableMultisampleRate",
+                     &features->variableMultisampleRate) &&
+      visitor->Visit("inheritedQueries", &features->inheritedQueries);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceVulkan11Properties* properties) {
+  return
+
+      visitor->Visit("deviceUUID", &properties->deviceUUID) &&
+      visitor->Visit("driverUUID", &properties->driverUUID) &&
+      visitor->Visit("deviceLUID", &properties->deviceLUID) &&
+      visitor->Visit("deviceNodeMask", &properties->deviceNodeMask) &&
+      visitor->Visit("deviceLUIDValid", &properties->deviceLUIDValid) &&
+      visitor->Visit("subgroupSize", &properties->subgroupSize) &&
+      visitor->Visit("subgroupSupportedStages",
+                     &properties->subgroupSupportedStages) &&
+      visitor->Visit("subgroupSupportedOperations",
+                     &properties->subgroupSupportedOperations) &&
+      visitor->Visit("subgroupQuadOperationsInAllStages",
+                     &properties->subgroupQuadOperationsInAllStages) &&
+      visitor->Visit("pointClippingBehavior",
+                     &properties->pointClippingBehavior) &&
+      visitor->Visit("maxMultiviewViewCount",
+                     &properties->maxMultiviewViewCount) &&
+      visitor->Visit("maxMultiviewInstanceIndex",
+                     &properties->maxMultiviewInstanceIndex) &&
+      visitor->Visit("protectedNoFault", &properties->protectedNoFault) &&
+      visitor->Visit("maxPerSetDescriptors",
+                     &properties->maxPerSetDescriptors) &&
+      visitor->Visit("maxMemoryAllocationSize",
+                     &properties->maxMemoryAllocationSize);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceVulkan11Features* features) {
+  return
+
+      visitor->Visit("storageBuffer16BitAccess",
+                     &features->storageBuffer16BitAccess) &&
+      visitor->Visit("uniformAndStorageBuffer16BitAccess",
+                     &features->uniformAndStorageBuffer16BitAccess) &&
+      visitor->Visit("storagePushConstant16",
+                     &features->storagePushConstant16) &&
+      visitor->Visit("storageInputOutput16", &features->storageInputOutput16) &&
+      visitor->Visit("multiview", &features->multiview) &&
+      visitor->Visit("multiviewGeometryShader",
+                     &features->multiviewGeometryShader) &&
+      visitor->Visit("multiviewTessellationShader",
+                     &features->multiviewTessellationShader) &&
+      visitor->Visit("variablePointersStorageBuffer",
+                     &features->variablePointersStorageBuffer) &&
+      visitor->Visit("variablePointers", &features->variablePointers) &&
+      visitor->Visit("protectedMemory", &features->protectedMemory) &&
+      visitor->Visit("samplerYcbcrConversion",
+                     &features->samplerYcbcrConversion) &&
+      visitor->Visit("shaderDrawParameters", &features->shaderDrawParameters);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceVulkan12Properties* properties) {
+  return
+
+      visitor->Visit("driverID", &properties->driverID) &&
+      visitor->Visit("driverName", &properties->driverName) &&
+      visitor->Visit("driverInfo", &properties->driverInfo) &&
+      visitor->Visit("conformanceVersion", &properties->conformanceVersion) &&
+      visitor->Visit("denormBehaviorIndependence",
+                     &properties->denormBehaviorIndependence) &&
+      visitor->Visit("roundingModeIndependence",
+                     &properties->roundingModeIndependence) &&
+      visitor->Visit("shaderSignedZeroInfNanPreserveFloat16",
+                     &properties->shaderSignedZeroInfNanPreserveFloat16) &&
+      visitor->Visit("shaderSignedZeroInfNanPreserveFloat32",
+                     &properties->shaderSignedZeroInfNanPreserveFloat32) &&
+      visitor->Visit("shaderSignedZeroInfNanPreserveFloat64",
+                     &properties->shaderSignedZeroInfNanPreserveFloat64) &&
+      visitor->Visit("shaderDenormPreserveFloat16",
+                     &properties->shaderDenormPreserveFloat16) &&
+      visitor->Visit("shaderDenormPreserveFloat32",
+                     &properties->shaderDenormPreserveFloat32) &&
+      visitor->Visit("shaderDenormPreserveFloat64",
+                     &properties->shaderDenormPreserveFloat64) &&
+      visitor->Visit("shaderDenormFlushToZeroFloat16",
+                     &properties->shaderDenormFlushToZeroFloat16) &&
+      visitor->Visit("shaderDenormFlushToZeroFloat32",
+                     &properties->shaderDenormFlushToZeroFloat32) &&
+      visitor->Visit("shaderDenormFlushToZeroFloat64",
+                     &properties->shaderDenormFlushToZeroFloat64) &&
+      visitor->Visit("shaderRoundingModeRTEFloat16",
+                     &properties->shaderRoundingModeRTEFloat16) &&
+      visitor->Visit("shaderRoundingModeRTEFloat32",
+                     &properties->shaderRoundingModeRTEFloat32) &&
+      visitor->Visit("shaderRoundingModeRTEFloat64",
+                     &properties->shaderRoundingModeRTEFloat64) &&
+      visitor->Visit("shaderRoundingModeRTZFloat16",
+                     &properties->shaderRoundingModeRTZFloat16) &&
+      visitor->Visit("shaderRoundingModeRTZFloat32",
+                     &properties->shaderRoundingModeRTZFloat32) &&
+      visitor->Visit("shaderRoundingModeRTZFloat64",
+                     &properties->shaderRoundingModeRTZFloat64) &&
+      visitor->Visit("maxUpdateAfterBindDescriptorsInAllPools",
+                     &properties->maxUpdateAfterBindDescriptorsInAllPools) &&
+      visitor->Visit(
+          "shaderUniformBufferArrayNonUniformIndexingNative",
+          &properties->shaderUniformBufferArrayNonUniformIndexingNative) &&
+      visitor->Visit(
+          "shaderSampledImageArrayNonUniformIndexingNative",
+          &properties->shaderSampledImageArrayNonUniformIndexingNative) &&
+      visitor->Visit(
+          "shaderStorageBufferArrayNonUniformIndexingNative",
+          &properties->shaderStorageBufferArrayNonUniformIndexingNative) &&
+      visitor->Visit(
+          "shaderStorageImageArrayNonUniformIndexingNative",
+          &properties->shaderStorageImageArrayNonUniformIndexingNative) &&
+      visitor->Visit(
+          "shaderInputAttachmentArrayNonUniformIndexingNative",
+          &properties->shaderInputAttachmentArrayNonUniformIndexingNative) &&
+      visitor->Visit("robustBufferAccessUpdateAfterBind",
+                     &properties->robustBufferAccessUpdateAfterBind) &&
+      visitor->Visit("quadDivergentImplicitLod",
+                     &properties->quadDivergentImplicitLod) &&
+      visitor->Visit(
+          "maxPerStageDescriptorUpdateAfterBindSamplers",
+          &properties->maxPerStageDescriptorUpdateAfterBindSamplers) &&
+      visitor->Visit(
+          "maxPerStageDescriptorUpdateAfterBindUniformBuffers",
+          &properties->maxPerStageDescriptorUpdateAfterBindUniformBuffers) &&
+      visitor->Visit(
+          "maxPerStageDescriptorUpdateAfterBindStorageBuffers",
+          &properties->maxPerStageDescriptorUpdateAfterBindStorageBuffers) &&
+      visitor->Visit(
+          "maxPerStageDescriptorUpdateAfterBindSampledImages",
+          &properties->maxPerStageDescriptorUpdateAfterBindSampledImages) &&
+      visitor->Visit(
+          "maxPerStageDescriptorUpdateAfterBindStorageImages",
+          &properties->maxPerStageDescriptorUpdateAfterBindStorageImages) &&
+      visitor->Visit(
+          "maxPerStageDescriptorUpdateAfterBindInputAttachments",
+          &properties->maxPerStageDescriptorUpdateAfterBindInputAttachments) &&
+      visitor->Visit("maxPerStageUpdateAfterBindResources",
+                     &properties->maxPerStageUpdateAfterBindResources) &&
+      visitor->Visit("maxDescriptorSetUpdateAfterBindSamplers",
+                     &properties->maxDescriptorSetUpdateAfterBindSamplers) &&
+      visitor->Visit(
+          "maxDescriptorSetUpdateAfterBindUniformBuffers",
+          &properties->maxDescriptorSetUpdateAfterBindUniformBuffers) &&
+      visitor->Visit(
+          "maxDescriptorSetUpdateAfterBindUniformBuffersDynamic",
+          &properties->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic) &&
+      visitor->Visit(
+          "maxDescriptorSetUpdateAfterBindStorageBuffers",
+          &properties->maxDescriptorSetUpdateAfterBindStorageBuffers) &&
+      visitor->Visit(
+          "maxDescriptorSetUpdateAfterBindStorageBuffersDynamic",
+          &properties->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic) &&
+      visitor->Visit(
+          "maxDescriptorSetUpdateAfterBindSampledImages",
+          &properties->maxDescriptorSetUpdateAfterBindSampledImages) &&
+      visitor->Visit(
+          "maxDescriptorSetUpdateAfterBindStorageImages",
+          &properties->maxDescriptorSetUpdateAfterBindStorageImages) &&
+      visitor->Visit(
+          "maxDescriptorSetUpdateAfterBindInputAttachments",
+          &properties->maxDescriptorSetUpdateAfterBindInputAttachments) &&
+      visitor->Visit("supportedDepthResolveModes",
+                     &properties->supportedDepthResolveModes) &&
+      visitor->Visit("supportedStencilResolveModes",
+                     &properties->supportedStencilResolveModes) &&
+      visitor->Visit("independentResolveNone",
+                     &properties->independentResolveNone) &&
+      visitor->Visit("independentResolve", &properties->independentResolve) &&
+      visitor->Visit("filterMinmaxSingleComponentFormats",
+                     &properties->filterMinmaxSingleComponentFormats) &&
+      visitor->Visit("filterMinmaxImageComponentMapping",
+                     &properties->filterMinmaxImageComponentMapping) &&
+      visitor->Visit("maxTimelineSemaphoreValueDifference",
+                     &properties->maxTimelineSemaphoreValueDifference) &&
+      visitor->Visit("framebufferIntegerColorSampleCounts",
+                     &properties->framebufferIntegerColorSampleCounts);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceVulkan12Features* features) {
+  return
+
+      visitor->Visit("samplerMirrorClampToEdge",
+                     &features->samplerMirrorClampToEdge) &&
+      visitor->Visit("drawIndirectCount", &features->drawIndirectCount) &&
+      visitor->Visit("storageBuffer8BitAccess",
+                     &features->storageBuffer8BitAccess) &&
+      visitor->Visit("uniformAndStorageBuffer8BitAccess",
+                     &features->uniformAndStorageBuffer8BitAccess) &&
+      visitor->Visit("storagePushConstant8", &features->storagePushConstant8) &&
+      visitor->Visit("shaderBufferInt64Atomics",
+                     &features->shaderBufferInt64Atomics) &&
+      visitor->Visit("shaderSharedInt64Atomics",
+                     &features->shaderSharedInt64Atomics) &&
+      visitor->Visit("shaderFloat16", &features->shaderFloat16) &&
+      visitor->Visit("shaderInt8", &features->shaderInt8) &&
+      visitor->Visit("descriptorIndexing", &features->descriptorIndexing) &&
+      visitor->Visit("shaderInputAttachmentArrayDynamicIndexing",
+                     &features->shaderInputAttachmentArrayDynamicIndexing) &&
+      visitor->Visit("shaderUniformTexelBufferArrayDynamicIndexing",
+                     &features->shaderUniformTexelBufferArrayDynamicIndexing) &&
+      visitor->Visit("shaderStorageTexelBufferArrayDynamicIndexing",
+                     &features->shaderStorageTexelBufferArrayDynamicIndexing) &&
+      visitor->Visit("shaderUniformBufferArrayNonUniformIndexing",
+                     &features->shaderUniformBufferArrayNonUniformIndexing) &&
+      visitor->Visit("shaderSampledImageArrayNonUniformIndexing",
+                     &features->shaderSampledImageArrayNonUniformIndexing) &&
+      visitor->Visit("shaderStorageBufferArrayNonUniformIndexing",
+                     &features->shaderStorageBufferArrayNonUniformIndexing) &&
+      visitor->Visit("shaderStorageImageArrayNonUniformIndexing",
+                     &features->shaderStorageImageArrayNonUniformIndexing) &&
+      visitor->Visit("shaderInputAttachmentArrayNonUniformIndexing",
+                     &features->shaderInputAttachmentArrayNonUniformIndexing) &&
+      visitor->Visit(
+          "shaderUniformTexelBufferArrayNonUniformIndexing",
+          &features->shaderUniformTexelBufferArrayNonUniformIndexing) &&
+      visitor->Visit(
+          "shaderStorageTexelBufferArrayNonUniformIndexing",
+          &features->shaderStorageTexelBufferArrayNonUniformIndexing) &&
+      visitor->Visit(
+          "descriptorBindingUniformBufferUpdateAfterBind",
+          &features->descriptorBindingUniformBufferUpdateAfterBind) &&
+      visitor->Visit("descriptorBindingSampledImageUpdateAfterBind",
+                     &features->descriptorBindingSampledImageUpdateAfterBind) &&
+      visitor->Visit("descriptorBindingStorageImageUpdateAfterBind",
+                     &features->descriptorBindingStorageImageUpdateAfterBind) &&
+      visitor->Visit(
+          "descriptorBindingStorageBufferUpdateAfterBind",
+          &features->descriptorBindingStorageBufferUpdateAfterBind) &&
+      visitor->Visit(
+          "descriptorBindingUniformTexelBufferUpdateAfterBind",
+          &features->descriptorBindingUniformTexelBufferUpdateAfterBind) &&
+      visitor->Visit(
+          "descriptorBindingStorageTexelBufferUpdateAfterBind",
+          &features->descriptorBindingStorageTexelBufferUpdateAfterBind) &&
+      visitor->Visit("descriptorBindingUpdateUnusedWhilePending",
+                     &features->descriptorBindingUpdateUnusedWhilePending) &&
+      visitor->Visit("descriptorBindingPartiallyBound",
+                     &features->descriptorBindingPartiallyBound) &&
+      visitor->Visit("descriptorBindingVariableDescriptorCount",
+                     &features->descriptorBindingVariableDescriptorCount) &&
+      visitor->Visit("runtimeDescriptorArray",
+                     &features->runtimeDescriptorArray) &&
+      visitor->Visit("samplerFilterMinmax", &features->samplerFilterMinmax) &&
+      visitor->Visit("scalarBlockLayout", &features->scalarBlockLayout) &&
+      visitor->Visit("imagelessFramebuffer", &features->imagelessFramebuffer) &&
+      visitor->Visit("uniformBufferStandardLayout",
+                     &features->uniformBufferStandardLayout) &&
+      visitor->Visit("shaderSubgroupExtendedTypes",
+                     &features->shaderSubgroupExtendedTypes) &&
+      visitor->Visit("separateDepthStencilLayouts",
+                     &features->separateDepthStencilLayouts) &&
+      visitor->Visit("hostQueryReset", &features->hostQueryReset) &&
+      visitor->Visit("timelineSemaphore", &features->timelineSemaphore) &&
+      visitor->Visit("bufferDeviceAddress", &features->bufferDeviceAddress) &&
+      visitor->Visit("bufferDeviceAddressCaptureReplay",
+                     &features->bufferDeviceAddressCaptureReplay) &&
+      visitor->Visit("bufferDeviceAddressMultiDevice",
+                     &features->bufferDeviceAddressMultiDevice) &&
+      visitor->Visit("vulkanMemoryModel", &features->vulkanMemoryModel) &&
+      visitor->Visit("vulkanMemoryModelDeviceScope",
+                     &features->vulkanMemoryModelDeviceScope) &&
+      visitor->Visit(
+          "vulkanMemoryModelAvailabilityVisibilityChains",
+          &features->vulkanMemoryModelAvailabilityVisibilityChains) &&
+      visitor->Visit("shaderOutputViewportIndex",
+                     &features->shaderOutputViewportIndex) &&
+      visitor->Visit("shaderOutputLayer", &features->shaderOutputLayer) &&
+      visitor->Visit("subgroupBroadcastDynamicId",
+                     &features->subgroupBroadcastDynamicId);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceVulkan13Properties* properties) {
+  return
+
+      visitor->Visit("minSubgroupSize", &properties->minSubgroupSize) &&
+      visitor->Visit("maxSubgroupSize", &properties->maxSubgroupSize) &&
+      visitor->Visit("maxComputeWorkgroupSubgroups",
+                     &properties->maxComputeWorkgroupSubgroups) &&
+      visitor->Visit("requiredSubgroupSizeStages",
+                     &properties->requiredSubgroupSizeStages) &&
+      visitor->Visit("maxInlineUniformBlockSize",
+                     &properties->maxInlineUniformBlockSize) &&
+      visitor->Visit("maxPerStageDescriptorInlineUniformBlocks",
+                     &properties->maxPerStageDescriptorInlineUniformBlocks) &&
+      visitor->Visit(
+          "maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks",
+          &properties
+               ->maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks) &&
+      visitor->Visit("maxDescriptorSetInlineUniformBlocks",
+                     &properties->maxDescriptorSetInlineUniformBlocks) &&
+      visitor->Visit(
+          "maxDescriptorSetUpdateAfterBindInlineUniformBlocks",
+          &properties->maxDescriptorSetUpdateAfterBindInlineUniformBlocks) &&
+      visitor->Visit("maxInlineUniformTotalSize",
+                     &properties->maxInlineUniformTotalSize) &&
+      visitor->Visit("integerDotProduct8BitUnsignedAccelerated",
+                     &properties->integerDotProduct8BitUnsignedAccelerated) &&
+      visitor->Visit("integerDotProduct8BitSignedAccelerated",
+                     &properties->integerDotProduct8BitSignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProduct8BitMixedSignednessAccelerated",
+          &properties->integerDotProduct8BitMixedSignednessAccelerated) &&
+      visitor->Visit(
+          "integerDotProduct4x8BitPackedUnsignedAccelerated",
+          &properties->integerDotProduct4x8BitPackedUnsignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProduct4x8BitPackedSignedAccelerated",
+          &properties->integerDotProduct4x8BitPackedSignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProduct4x8BitPackedMixedSignednessAccelerated",
+          &properties
+               ->integerDotProduct4x8BitPackedMixedSignednessAccelerated) &&
+      visitor->Visit("integerDotProduct16BitUnsignedAccelerated",
+                     &properties->integerDotProduct16BitUnsignedAccelerated) &&
+      visitor->Visit("integerDotProduct16BitSignedAccelerated",
+                     &properties->integerDotProduct16BitSignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProduct16BitMixedSignednessAccelerated",
+          &properties->integerDotProduct16BitMixedSignednessAccelerated) &&
+      visitor->Visit("integerDotProduct32BitUnsignedAccelerated",
+                     &properties->integerDotProduct32BitUnsignedAccelerated) &&
+      visitor->Visit("integerDotProduct32BitSignedAccelerated",
+                     &properties->integerDotProduct32BitSignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProduct32BitMixedSignednessAccelerated",
+          &properties->integerDotProduct32BitMixedSignednessAccelerated) &&
+      visitor->Visit("integerDotProduct64BitUnsignedAccelerated",
+                     &properties->integerDotProduct64BitUnsignedAccelerated) &&
+      visitor->Visit("integerDotProduct64BitSignedAccelerated",
+                     &properties->integerDotProduct64BitSignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProduct64BitMixedSignednessAccelerated",
+          &properties->integerDotProduct64BitMixedSignednessAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating8BitUnsignedAccelerated",
+          &properties
+               ->integerDotProductAccumulatingSaturating8BitUnsignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating8BitSignedAccelerated",
+          &properties
+               ->integerDotProductAccumulatingSaturating8BitSignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerate"
+          "d",
+          &properties
+               ->integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerat"
+          "ed",
+          &properties
+               ->integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerate"
+          "d",
+          &properties
+               ->integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAc"
+          "celerated",
+          &properties
+               ->integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating16BitUnsignedAccelerated",
+          &properties
+               ->integerDotProductAccumulatingSaturating16BitUnsignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating16BitSignedAccelerated",
+          &properties
+               ->integerDotProductAccumulatingSaturating16BitSignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerat"
+          "ed",
+          &properties
+               ->integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating32BitUnsignedAccelerated",
+          &properties
+               ->integerDotProductAccumulatingSaturating32BitUnsignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating32BitSignedAccelerated",
+          &properties
+               ->integerDotProductAccumulatingSaturating32BitSignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerat"
+          "ed",
+          &properties
+               ->integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating64BitUnsignedAccelerated",
+          &properties
+               ->integerDotProductAccumulatingSaturating64BitUnsignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating64BitSignedAccelerated",
+          &properties
+               ->integerDotProductAccumulatingSaturating64BitSignedAccelerated) &&
+      visitor->Visit(
+          "integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerat"
+          "ed",
+          &properties
+               ->integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated) &&
+      visitor->Visit("storageTexelBufferOffsetAlignmentBytes",
+                     &properties->storageTexelBufferOffsetAlignmentBytes) &&
+      visitor->Visit(
+          "storageTexelBufferOffsetSingleTexelAlignment",
+          &properties->storageTexelBufferOffsetSingleTexelAlignment) &&
+      visitor->Visit("uniformTexelBufferOffsetAlignmentBytes",
+                     &properties->uniformTexelBufferOffsetAlignmentBytes) &&
+      visitor->Visit(
+          "uniformTexelBufferOffsetSingleTexelAlignment",
+          &properties->uniformTexelBufferOffsetSingleTexelAlignment) &&
+      visitor->Visit("maxBufferSize", &properties->maxBufferSize);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceVulkan13Features* features) {
+  return
+
+      visitor->Visit("robustImageAccess", &features->robustImageAccess) &&
+      visitor->Visit("inlineUniformBlock", &features->inlineUniformBlock) &&
+      visitor->Visit(
+          "descriptorBindingInlineUniformBlockUpdateAfterBind",
+          &features->descriptorBindingInlineUniformBlockUpdateAfterBind) &&
+      visitor->Visit("pipelineCreationCacheControl",
+                     &features->pipelineCreationCacheControl) &&
+      visitor->Visit("privateData", &features->privateData) &&
+      visitor->Visit("shaderDemoteToHelperInvocation",
+                     &features->shaderDemoteToHelperInvocation) &&
+      visitor->Visit("shaderTerminateInvocation",
+                     &features->shaderTerminateInvocation) &&
+      visitor->Visit("subgroupSizeControl", &features->subgroupSizeControl) &&
+      visitor->Visit("computeFullSubgroups", &features->computeFullSubgroups) &&
+      visitor->Visit("synchronization2", &features->synchronization2) &&
+      visitor->Visit("textureCompressionASTC_HDR",
+                     &features->textureCompressionASTC_HDR) &&
+      visitor->Visit("shaderZeroInitializeWorkgroupMemory",
+                     &features->shaderZeroInitializeWorkgroupMemory) &&
+      visitor->Visit("dynamicRendering", &features->dynamicRendering) &&
+      visitor->Visit("shaderIntegerDotProduct",
+                     &features->shaderIntegerDotProduct) &&
+      visitor->Visit("maintenance4", &features->maintenance4);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceVulkan14Properties* properties) {
+  return
+
+      visitor->Visit("lineSubPixelPrecisionBits",
+                     &properties->lineSubPixelPrecisionBits) &&
+      visitor->Visit("maxVertexAttribDivisor",
+                     &properties->maxVertexAttribDivisor) &&
+      visitor->Visit("supportsNonZeroFirstInstance",
+                     &properties->supportsNonZeroFirstInstance) &&
+      visitor->Visit("maxPushDescriptors", &properties->maxPushDescriptors) &&
+      visitor->Visit(
+          "dynamicRenderingLocalReadDepthStencilAttachments",
+          &properties->dynamicRenderingLocalReadDepthStencilAttachments) &&
+      visitor->Visit(
+          "dynamicRenderingLocalReadMultisampledAttachments",
+          &properties->dynamicRenderingLocalReadMultisampledAttachments) &&
+      visitor->Visit(
+          "earlyFragmentMultisampleCoverageAfterSampleCounting",
+          &properties->earlyFragmentMultisampleCoverageAfterSampleCounting) &&
+      visitor->Visit(
+          "earlyFragmentSampleMaskTestBeforeSampleCounting",
+          &properties->earlyFragmentSampleMaskTestBeforeSampleCounting) &&
+      visitor->Visit("depthStencilSwizzleOneSupport",
+                     &properties->depthStencilSwizzleOneSupport) &&
+      visitor->Visit("polygonModePointSize",
+                     &properties->polygonModePointSize) &&
+      visitor->Visit(
+          "nonStrictSinglePixelWideLinesUseParallelogram",
+          &properties->nonStrictSinglePixelWideLinesUseParallelogram) &&
+      visitor->Visit("nonStrictWideLinesUseParallelogram",
+                     &properties->nonStrictWideLinesUseParallelogram) &&
+      visitor->Visit("blockTexelViewCompatibleMultipleLayers",
+                     &properties->blockTexelViewCompatibleMultipleLayers) &&
+      visitor->Visit("maxCombinedImageSamplerDescriptorCount",
+                     &properties->maxCombinedImageSamplerDescriptorCount) &&
+      visitor->Visit("fragmentShadingRateClampCombinerInputs",
+                     &properties->fragmentShadingRateClampCombinerInputs) &&
+      visitor->Visit("defaultRobustnessStorageBuffers",
+                     &properties->defaultRobustnessStorageBuffers) &&
+      visitor->Visit("defaultRobustnessUniformBuffers",
+                     &properties->defaultRobustnessUniformBuffers) &&
+      visitor->Visit("defaultRobustnessVertexInputs",
+                     &properties->defaultRobustnessVertexInputs) &&
+      visitor->Visit("defaultRobustnessImages",
+                     &properties->defaultRobustnessImages) &&
+      visitor->Visit("copySrcLayoutCount", &properties->copySrcLayoutCount) &&
+      visitor->VisitArray("pCopySrcLayouts", properties->copySrcLayoutCount,
+                          &properties->pCopySrcLayouts) &&
+      visitor->Visit("copyDstLayoutCount", &properties->copyDstLayoutCount) &&
+      visitor->VisitArray("pCopyDstLayouts", properties->copyDstLayoutCount,
+                          &properties->pCopyDstLayouts) &&
+      visitor->Visit("optimalTilingLayoutUUID",
+                     &properties->optimalTilingLayoutUUID) &&
+      visitor->Visit("identicalMemoryTypeRequirements",
+                     &properties->identicalMemoryTypeRequirements);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceVulkan14Features* features) {
+  return
+
+      visitor->Visit("globalPriorityQuery", &features->globalPriorityQuery) &&
+      visitor->Visit("shaderSubgroupRotate", &features->shaderSubgroupRotate) &&
+      visitor->Visit("shaderSubgroupRotateClustered",
+                     &features->shaderSubgroupRotateClustered) &&
+      visitor->Visit("shaderFloatControls2", &features->shaderFloatControls2) &&
+      visitor->Visit("shaderExpectAssume", &features->shaderExpectAssume) &&
+      visitor->Visit("rectangularLines", &features->rectangularLines) &&
+      visitor->Visit("bresenhamLines", &features->bresenhamLines) &&
+      visitor->Visit("smoothLines", &features->smoothLines) &&
+      visitor->Visit("stippledRectangularLines",
+                     &features->stippledRectangularLines) &&
+      visitor->Visit("stippledBresenhamLines",
+                     &features->stippledBresenhamLines) &&
+      visitor->Visit("stippledSmoothLines", &features->stippledSmoothLines) &&
+      visitor->Visit("vertexAttributeInstanceRateDivisor",
+                     &features->vertexAttributeInstanceRateDivisor) &&
+      visitor->Visit("vertexAttributeInstanceRateZeroDivisor",
+                     &features->vertexAttributeInstanceRateZeroDivisor) &&
+      visitor->Visit("indexTypeUint8", &features->indexTypeUint8) &&
+      visitor->Visit("dynamicRenderingLocalRead",
+                     &features->dynamicRenderingLocalRead) &&
+      visitor->Visit("maintenance5", &features->maintenance5) &&
+      visitor->Visit("maintenance6", &features->maintenance6) &&
+      visitor->Visit("pipelineProtectedAccess",
+                     &features->pipelineProtectedAccess) &&
+      visitor->Visit("pipelineRobustness", &features->pipelineRobustness) &&
+      visitor->Visit("hostImageCopy", &features->hostImageCopy);
+}
+
+template <typename Visitor>
+inline bool Iterate(Visitor* visitor,
+                    VkPhysicalDeviceDriverProperties* properties) {
+  return
+
+      visitor->Visit("driverID", &properties->driverID) &&
+      visitor->Visit("driverName", &properties->driverName) &&
+      visitor->Visit("driverInfo", &properties->driverInfo) &&
+      visitor->Visit("conformanceVersion", &properties->conformanceVersion);
 }
 
 template <typename Visitor>
@@ -1154,39 +1929,6 @@
 }
 
 template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkQueueFamilyProperties* properties) {
-  return
-    visitor->Visit("queueFlags", &properties->queueFlags) &&
-    visitor->Visit("queueCount", &properties->queueCount) &&
-    visitor->Visit("timestampValidBits", &properties->timestampValidBits) &&
-    visitor->Visit("minImageTransferGranularity", &properties->minImageTransferGranularity);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkExtensionProperties* properties) {
-  return
-    visitor->Visit("extensionName", &properties->extensionName) &&
-    visitor->Visit("specVersion", &properties->specVersion);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkLayerProperties* properties) {
-  return
-    visitor->Visit("layerName", &properties->layerName) &&
-    visitor->Visit("specVersion", &properties->specVersion) &&
-    visitor->Visit("implementationVersion", &properties->implementationVersion) &&
-    visitor->Visit("description", &properties->description);
-}
-
-template <typename Visitor>
-inline bool Iterate(Visitor* visitor, VkFormatProperties* properties) {
-  return
-    visitor->Visit("linearTilingFeatures", &properties->linearTilingFeatures) &&
-    visitor->Visit("optimalTilingFeatures", &properties->optimalTilingFeatures) &&
-    visitor->Visit("bufferFeatures", &properties->bufferFeatures);
-}
-
-template <typename Visitor>
 inline bool Iterate(Visitor* visitor, VkJsonLayer* layer) {
   return visitor->Visit("properties", &layer->properties) &&
          visitor->Visit("extensions", &layer->extensions);
@@ -1211,6 +1953,7 @@
       ret &= visitor->Visit("core13", &device->core13);
       FALLTHROUGH_INTENDED;
     case VK_API_VERSION_1_2:
+      ret &= visitor->Visit("core11", &device->core11);
       ret &= visitor->Visit("core12", &device->core12);
       FALLTHROUGH_INTENDED;
     case VK_API_VERSION_1_1:
@@ -1223,17 +1966,17 @@
           visitor->Visit("idProperties", &device->id_properties) &&
           visitor->Visit("maintenance3Properties",
                          &device->maintenance3_properties) &&
-          visitor->Visit("16bitStorageFeatures",
-                         &device->bit16_storage_features) &&
           visitor->Visit("multiviewFeatures", &device->multiview_features) &&
-          visitor->Visit("variablePointerFeatures",
-                         &device->variable_pointer_features) &&
+          visitor->Visit("variablePointersFeatures",
+                         &device->variable_pointers_features) &&
           visitor->Visit("protectedMemoryFeatures",
                          &device->protected_memory_features) &&
           visitor->Visit("samplerYcbcrConversionFeatures",
                          &device->sampler_ycbcr_conversion_features) &&
           visitor->Visit("shaderDrawParameterFeatures",
                          &device->shader_draw_parameter_features) &&
+          visitor->Visit("bit16StorageFeatures",
+                         &device->bit16_storage_features) &&
           visitor->Visit("externalFenceProperties",
                          &device->external_fence_properties) &&
           visitor->Visit("externalSemaphoreProperties",
@@ -1247,21 +1990,90 @@
              visitor->Visit("extensions", &device->extensions) &&
              visitor->Visit("layers", &device->layers) &&
              visitor->Visit("formats", &device->formats);
-      if (device->ext_driver_properties.reported) {
-        ret &= visitor->Visit("VK_KHR_driver_properties",
-                            &device->ext_driver_properties);
-      }
-      if (device->ext_variable_pointer_features.reported) {
+
+      if (device->khr_variable_pointers.reported) {
         ret &= visitor->Visit("VK_KHR_variable_pointers",
-                            &device->ext_variable_pointer_features);
+                              &device->khr_variable_pointers);
       }
-      if (device->ext_image_2d_view_of_3d_features.reported) {
-        ret &= visitor->Visit("VK_EXT_image_2d_view_of_3d",
-                              &device->ext_image_2d_view_of_3d_features);
-      }
-      if (device->ext_shader_float16_int8_features.reported) {
+      if (device->khr_shader_float16_int8.reported) {
         ret &= visitor->Visit("VK_KHR_shader_float16_int8",
-                              &device->ext_shader_float16_int8_features);
+                              &device->khr_shader_float16_int8);
+      }
+      if (device->ext_image_2d_view_of_3d.reported) {
+        ret &= visitor->Visit("VK_EXT_image_2d_view_of_3d",
+                              &device->ext_image_2d_view_of_3d);
+      }
+      if (device->ext_custom_border_color.reported) {
+        ret &= visitor->Visit("VK_EXT_custom_border_color",
+                              &device->ext_custom_border_color);
+      }
+      if (device->ext_primitive_topology_list_restart.reported) {
+        ret &= visitor->Visit("VK_EXT_primitive_topology_list_restart",
+                              &device->ext_primitive_topology_list_restart);
+      }
+      if (device->ext_provoking_vertex.reported) {
+        ret &= visitor->Visit("VK_EXT_provoking_vertex",
+                              &device->ext_provoking_vertex);
+      }
+      if (device->khr_index_type_uint8.reported) {
+        ret &= visitor->Visit("VK_KHR_index_type_uint8",
+                              &device->khr_index_type_uint8);
+      }
+      if (device->ext_index_type_uint8.reported) {
+        ret &= visitor->Visit("VK_EXT_index_type_uint8",
+                              &device->ext_index_type_uint8);
+      }
+      if (device->khr_vertex_attribute_divisor.reported) {
+        ret &= visitor->Visit("VK_KHR_vertex_attribute_divisor",
+                              &device->khr_vertex_attribute_divisor);
+      }
+      if (device->ext_vertex_attribute_divisor.reported) {
+        ret &= visitor->Visit("VK_EXT_vertex_attribute_divisor",
+                              &device->ext_vertex_attribute_divisor);
+      }
+      if (device->ext_transform_feedback.reported) {
+        ret &= visitor->Visit("VK_EXT_transform_feedback",
+                              &device->ext_transform_feedback);
+      }
+      if (device->khr_shader_subgroup_uniform_control_flow.reported) {
+        ret &=
+            visitor->Visit("VK_KHR_shader_subgroup_uniform_control_flow",
+                           &device->khr_shader_subgroup_uniform_control_flow);
+      }
+      if (device->khr_shader_subgroup_extended_types.reported) {
+        ret &= visitor->Visit("VK_KHR_shader_subgroup_extended_types",
+                              &device->khr_shader_subgroup_extended_types);
+      }
+      if (device->khr_8bit_storage.reported) {
+        ret &= visitor->Visit("VK_KHR_8bit_storage", &device->khr_8bit_storage);
+      }
+      if (device->khr_shader_integer_dot_product.reported) {
+        ret &= visitor->Visit("VK_KHR_shader_integer_dot_product",
+                              &device->khr_shader_integer_dot_product);
+      }
+      if (device->img_relaxed_line_rasterization.reported) {
+        ret &= visitor->Visit("VK_IMG_relaxed_line_rasterization",
+                              &device->img_relaxed_line_rasterization);
+      }
+      if (device->khr_line_rasterization.reported) {
+        ret &= visitor->Visit("VK_KHR_line_rasterization",
+                              &device->khr_line_rasterization);
+      }
+      if (device->ext_line_rasterization.reported) {
+        ret &= visitor->Visit("VK_EXT_line_rasterization",
+                              &device->ext_line_rasterization);
+      }
+      if (device->ext_primitives_generated_query.reported) {
+        ret &= visitor->Visit("VK_EXT_primitives_generated_query",
+                              &device->ext_primitives_generated_query);
+      }
+      if (device->khr_shader_float_controls.reported) {
+        ret &= visitor->Visit("VK_KHR_shader_float_controls",
+                              &device->khr_shader_float_controls);
+      }
+      if (device->khr_driver_properties.reported) {
+        ret &= visitor->Visit("VK_KHR_driver_properties",
+                              &device->khr_driver_properties);
       }
   }
   return ret;
@@ -1319,7 +2131,9 @@
   return Json::Value(string);
 }
 
-template <typename T, typename = EnableForEnum<T>, typename = void,
+template <typename T,
+          typename = EnableForEnum<T>,
+          typename = void,
           typename = void>
 inline Json::Value ToJsonValue(const T& value) {
   return Json::Value(static_cast<double>(value));
@@ -1328,7 +2142,8 @@
 template <typename T>
 inline Json::Value ArrayToJsonValue(uint32_t count, const T* values) {
   Json::Value array(Json::arrayValue);
-  for (unsigned int i = 0; i < count; ++i) array.append(ToJsonValue(values[i]));
+  for (unsigned int i = 0; i < count; ++i)
+    array.append(ToJsonValue(values[i]));
   return array;
 }
 
@@ -1360,7 +2175,8 @@
 template <typename F, typename S>
 inline Json::Value ToJsonValue(const std::map<F, S>& value) {
   Json::Value array(Json::arrayValue);
-  for (auto& kv : value) array.append(ToJsonValue(kv));
+  for (auto& kv : value)
+    array.append(ToJsonValue(kv));
   return array;
 }
 
@@ -1370,7 +2186,8 @@
 
   ~JsonWriterVisitor() {}
 
-  template <typename T> bool Visit(const char* key, const T* value) {
+  template <typename T>
+  bool Visit(const char* key, const T* value) {
     object_[key] = ToJsonValue(*value);
     return true;
   }
@@ -1383,7 +2200,7 @@
   }
 
   template <typename T>
-  bool VisitArray(const char* key, uint32_t count, const T *value) {
+  bool VisitArray(const char* key, uint32_t count, const T* value) {
     object_[key] = ArrayToJsonValue(count, *value);
     return true;
   }
@@ -1410,7 +2227,8 @@
 bool AsValue(Json::Value* json_value, T* t);
 
 inline bool AsValue(Json::Value* json_value, int32_t* value) {
-  if (json_value->type() != Json::realValue) return false;
+  if (json_value->type() != Json::realValue)
+    return false;
   double d = json_value->asDouble();
   if (!IsIntegral(d) ||
       d < static_cast<double>(std::numeric_limits<int32_t>::min()) ||
@@ -1421,14 +2239,16 @@
 }
 
 inline bool AsValue(Json::Value* json_value, uint64_t* value) {
-  if (json_value->type() != Json::stringValue) return false;
+  if (json_value->type() != Json::stringValue)
+    return false;
   int result =
       std::sscanf(json_value->asString().c_str(), "0x%016" PRIx64, value);
   return result == 1;
 }
 
 inline bool AsValue(Json::Value* json_value, uint32_t* value) {
-  if (json_value->type() != Json::realValue) return false;
+  if (json_value->type() != Json::realValue)
+    return false;
   double d = json_value->asDouble();
   if (!IsIntegral(d) || d < 0.0 ||
       d > static_cast<double>(std::numeric_limits<uint32_t>::max()))
@@ -1447,7 +2267,8 @@
 }
 
 inline bool AsValue(Json::Value* json_value, float* value) {
-  if (json_value->type() != Json::realValue) return false;
+  if (json_value->type() != Json::realValue)
+    return false;
   *value = static_cast<float>(json_value->asDouble());
   return true;
 }
@@ -1456,7 +2277,8 @@
   uint32_t value = 0;
   if (!AsValue(json_value, &value))
     return false;
-  if (!EnumTraits<VkImageLayout>::exist(value)) return false;
+  if (!EnumTraits<VkImageLayout>::exist(value))
+    return false;
   *t = static_cast<VkImageLayout>(value);
   return true;
 }
@@ -1466,7 +2288,8 @@
   if (json_value->type() != Json::arrayValue || json_value->size() != count)
     return false;
   for (uint32_t i = 0; i < count; ++i) {
-    if (!AsValue(&(*json_value)[i], values + i)) return false;
+    if (!AsValue(&(*json_value)[i], values + i))
+      return false;
   }
   return true;
 }
@@ -1478,12 +2301,13 @@
 
 template <size_t N>
 inline bool AsValue(Json::Value* json_value, char (*value)[N]) {
-  if (json_value->type() != Json::stringValue) return false;
+  if (json_value->type() != Json::stringValue)
+    return false;
   size_t len = json_value->asString().length();
   if (len >= N)
     return false;
   memcpy(*value, json_value->asString().c_str(), len);
-  memset(*value + len, 0, N-len);
+  memset(*value + len, 0, N - len);
   return true;
 }
 
@@ -1491,15 +2315,17 @@
 inline bool AsValue(Json::Value* json_value, T* t) {
   uint32_t value = 0;
   if (!AsValue(json_value, &value))
-      return false;
-  if (!EnumTraits<T>::exist(value)) return false;
+    return false;
+  if (!EnumTraits<T>::exist(value))
+    return false;
   *t = static_cast<T>(value);
   return true;
 }
 
 template <typename T>
 inline bool AsValue(Json::Value* json_value, std::vector<T>* value) {
-  if (json_value->type() != Json::arrayValue) return false;
+  if (json_value->type() != Json::arrayValue)
+    return false;
   int size = json_value->size();
   value->resize(size);
   return AsArray(json_value, size, value->data());
@@ -1515,11 +2341,13 @@
 
 template <typename F, typename S>
 inline bool AsValue(Json::Value* json_value, std::map<F, S>* value) {
-  if (json_value->type() != Json::arrayValue) return false;
+  if (json_value->type() != Json::arrayValue)
+    return false;
   int size = json_value->size();
   for (int i = 0; i < size; ++i) {
     std::pair<F, S> elem;
-    if (!AsValue(&(*json_value)[i], &elem)) return false;
+    if (!AsValue(&(*json_value)[i], &elem))
+      return false;
     if (!value->insert(elem).second)
       return false;
   }
@@ -1527,7 +2355,9 @@
 }
 
 template <typename T>
-bool ReadValue(Json::Value* object, const char* key, T* value,
+bool ReadValue(Json::Value* object,
+               const char* key,
+               T* value,
                std::string* errors) {
   Json::Value json_value = (*object)[key];
   if (!json_value) {
@@ -1535,7 +2365,8 @@
       *errors = std::string(key) + " missing.";
     return false;
   }
-  if (AsValue(&json_value, value)) return true;
+  if (AsValue(&json_value, value))
+    return true;
   if (errors)
     *errors = std::string("Wrong type for ") + std::string(key) + ".";
   return false;
@@ -1551,7 +2382,8 @@
   JsonReaderVisitor(Json::Value* object, std::string* errors)
       : object_(object), errors_(errors) {}
 
-  template <typename T> bool Visit(const char* key, T* value) const {
+  template <typename T>
+  bool Visit(const char* key, T* value) const {
     return ReadValue(object_, key, value, errors_);
   }
 
@@ -1565,27 +2397,28 @@
         *errors_ = std::string(key) + " missing.";
       return false;
     }
-    if (AsArray(&json_value, count, *value)) return true;
+    if (AsArray(&json_value, count, *value))
+      return true;
     if (errors_)
       *errors_ = std::string("Wrong type for ") + std::string(key) + ".";
     return false;
   }
 
   template <typename T>
-  bool VisitArray(const char* key, uint32_t count, T *value) {
+  bool VisitArray(const char* key, uint32_t count, T* value) {
     Json::Value json_value = (*object_)[key];
     if (!json_value) {
       if (errors_)
         *errors_ = std::string(key) + " missing.";
       return false;
     }
-    if (AsArray(&json_value, count, *value)) return true;
+    if (AsArray(&json_value, count, *value))
+      return true;
     if (errors_)
       *errors_ = std::string("Wrong type for ") + std::string(key) + ".";
     return false;
   }
 
-
  private:
   Json::Value* object_;
   std::string* errors_;
@@ -1593,21 +2426,21 @@
 
 template <typename T, typename /*= EnableForStruct<T>*/>
 bool AsValue(Json::Value* json_value, T* t) {
-  if (json_value->type() != Json::objectValue) return false;
+  if (json_value->type() != Json::objectValue)
+    return false;
   JsonReaderVisitor visitor(json_value, nullptr);
   return VisitForRead(&visitor, t);
 }
 
-
-template <typename T> std::string VkTypeToJson(const T& t) {
+template <typename T>
+std::string VkTypeToJson(const T& t) {
   JsonWriterVisitor visitor;
   VisitForWrite(&visitor, t);
   return visitor.get_object().toStyledString();
 }
 
-template <typename T> bool VkTypeFromJson(const std::string& json,
-                                          T* t,
-                                          std::string* errors) {
+template <typename T>
+bool VkTypeFromJson(const std::string& json, T* t, std::string* errors) {
   *t = T();
   Json::Value object(Json::objectValue);
   Json::CharReaderBuilder builder;