• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.cts.deviceinfo;
18 
19 import com.android.compatibility.common.deviceinfo.DeviceInfo;
20 import com.android.compatibility.common.util.DeviceInfoStore;
21 
22 import org.json.JSONArray;
23 import org.json.JSONException;
24 import org.json.JSONObject;
25 
26 import java.util.HashMap;
27 
28 /**
29  * Vulkan info collector.
30  *
31  * This collector gathers a VkJSONInstance representing the Vulkan capabilities of the Android
32  * device, and translates it into a DeviceInfoStore. The goal is to be as faithful to the original
33  * VkJSON as possible, so that the DeviceInfo can later be turned back into VkJSON without loss,
34  * while still allow complex queries against the DeviceInfo database.
35  *
36  * We inherit some design decisions from VkJSON, and there are a few places were translation isn't
37  * perfect:
38  *
39  * - Most JSON implementations handle JSON Numbers as doubles (64-bit floating point), which can't
40  *   faithfully transfer 64-bit integers. So Vulkan uint64_t and VkDeviceSize values are encoded as
41  *   Strings containing the hexadecimal representation of the value (with "0x" prefix).
42  *
43  * - Vulkan enum values are represented as Numbers. This is most convenient for processing, though
44  *   isn't very human-readable. Pretty-printing these as strings is left for other tools.
45  *
46  * - For implementation convenience, VkJSON represents VkBool32 values as JSON Numbers (0/1). This
47  *   collector converts them to JSON Boolean values (false/true).
48  *
49  * - DeviceInfoStore doesn't allow arrays of non-uniform or non-primitive types. VkJSON stores
50  *   format capabilities as an array of formats, where each format is an array containing a number
51  *   (the format enum value) and an object (the format properties). Since DeviceInfoStore doesn't
52  *   allow array-of-array, we instead store formats as an array of uniform structs, So instead of
53  *       [[3, {
54  *           "linearTilingFeatures": 0,
55  *           "optimalTilingFeatures": 5121,
56  *           "bufferFeatures": 0
57  *       }]]
58  *   the format with enum value "3" will be represented as
59  *       {
60  *           "id": 3,
61  *           "linear_tiling_features": 0,
62  *           "optimal_tiling_features": 5121,
63  *           "buffer_features": 0
64  *       }
65  *
66  * - Device layers are deprecated, but instance layers can still add device extensions. VkJSON
67  *   doesn't yet include device extensions provided by layers, though. So VulkanDeviceInfo omits
68  *   device layers altogether. Eventually VkJSON and VulkanDeviceInfo should report device layers
69  *   and their extensions the same way instance layers and their extensions are reported.
70  *
71  * - VkJSON uses the original Vulkan field names, while VulkanDeviceInfo follows the DeviceInfo
72  *   naming convention. So VkJSON fields named like "sparseProperties" will be converted to names
73  *   like "sparse_properties".
74  */
75 public final class VulkanDeviceInfo extends DeviceInfo {
76 
77     private static final String KEY_BIT16_STORAGE_FEATURES = "bit16StorageFeatures";
78     private static final String KEY_ALPHA_TO_ONE = "alphaToOne";
79     private static final String KEY_API_VERSION = "apiVersion";
80     private static final String KEY_BUFFER_DEVICE_ADDRESS = "bufferDeviceAddress";
81     private static final String KEY_BUFFER_DEVICE_ADDRESS_CAPTURE_REPLAY = "bufferDeviceAddressCaptureReplay";
82     private static final String KEY_BUFFER_DEVICE_ADDRESS_MULTI_DEVICE = "bufferDeviceAddressMultiDevice";
83     private static final String KEY_BUFFER_FEATURES = "bufferFeatures";
84     private static final String KEY_BUFFER_IMAGE_GRANULARITY = "bufferImageGranularity";
85     private static final String KEY_COMPATIBLE_HANDLE_TYPES = "compatibleHandleTypes";
86     private static final String KEY_COMPUTE_FULL_SUBGROUPS = "computeFullSubgroups";
87     private static final String KEY_CONFORMANCE_VERSION = "conformanceVersion";
88     private static final String KEY_CORE12 = "core12";
89     private static final String KEY_CORE13 = "core13";
90     private static final String KEY_DENORM_BEHAVIOR_INDEPENDENCE = "denormBehaviorIndependence";
91     private static final String KEY_DEPTH = "depth";
92     private static final String KEY_DEPTH_BIAS_CLAMP = "depthBiasClamp";
93     private static final String KEY_DEPTH_BOUNDS = "depthBounds";
94     private static final String KEY_DEPTH_CLAMP = "depthClamp";
95     private static final String KEY_DESCRIPTION = "description";
96     private static final String KEY_DESCRIPTOR_BINDING_INLINE_UNIFORM_BLOCK_UPDATE_AFTER_BIND = "descriptorBindingInlineUniformBlockUpdateAfterBind";
97     private static final String KEY_DESCRIPTOR_BINDING_PARTIALLY_BOUND = "descriptorBindingPartiallyBound";
98     private static final String KEY_DESCRIPTOR_BINDING_SAMPLED_IMAGE_UPDATE_AFTER_BIND = "descriptorBindingSampledImageUpdateAfterBind";
99     private static final String KEY_DESCRIPTOR_BINDING_STORAGE_BUFFER_UPDATE_AFTER_BIND = "descriptorBindingStorageBufferUpdateAfterBind";
100     private static final String KEY_DESCRIPTOR_BINDING_STORAGE_IMAGE_UPDATE_AFTER_BIND = "descriptorBindingStorageImageUpdateAfterBind";
101     private static final String KEY_DESCRIPTOR_BINDING_STORAGE_TEXEL_BUFFER_UPDATE_AFTER_BIND = "descriptorBindingStorageTexelBufferUpdateAfterBind";
102     private static final String KEY_DESCRIPTOR_BINDING_UNIFORM_BUFFER_UPDATE_AFTER_BIND = "descriptorBindingUniformBufferUpdateAfterBind";
103     private static final String KEY_DESCRIPTOR_BINDING_UNIFORM_TEXEL_BUFFER_UPDATE_AFTER_BIND = "descriptorBindingUniformTexelBufferUpdateAfterBind";
104     private static final String KEY_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING = "descriptorBindingUpdateUnusedWhilePending";
105     private static final String KEY_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT = "descriptorBindingVariableDescriptorCount";
106     private static final String KEY_DESCRIPTOR_INDEXING = "descriptorIndexing";
107     private static final String KEY_DEVICES = "devices";
108     private static final String KEY_DEVICE_GROUPS = "deviceGroups";
109     private static final String KEY_DEVICE_ID = "deviceID";
110     private static final String KEY_DEVICE_LUID = "deviceLUID";
111     private static final String KEY_DEVICE_LUID_VALID = "deviceLUIDValid";
112     private static final String KEY_DEVICE_NAME = "deviceName";
113     private static final String KEY_DEVICE_NODE_MASK = "deviceNodeMask";
114     private static final String KEY_DEVICE_TYPE = "deviceType";
115     private static final String KEY_DEVICE_UUID = "deviceUUID";
116     private static final String KEY_DISCRETE_QUEUE_PRIORITIES = "discreteQueuePriorities";
117     private static final String KEY_DRAW_INDIRECT_COUNT = "drawIndirectCount";
118     private static final String KEY_DRAW_INDIRECT_FIRST_INSTANCE = "drawIndirectFirstInstance";
119     private static final String KEY_DRIVER_ID = "driverID";
120     private static final String KEY_DRIVER_INFO = "driverInfo";
121     private static final String KEY_DRIVER_NAME = "driverName";
122     private static final String KEY_DRIVER_PROPERTIES_KHR = "driverPropertiesKHR";
123     private static final String KEY_DRIVER_UUID = "driverUUID";
124     private static final String KEY_DRIVER_VERSION = "driverVersion";
125     private static final String KEY_DUAL_SRC_BLEND = "dualSrcBlend";
126     private static final String KEY_DYNAMIC_RENDERING = "dynamicRendering";
127     private static final String KEY_EXPORT_FROM_IMPORTED_HANDLE_TYPES = "exportFromImportedHandleTypes";
128     private static final String KEY_EXTENSIONS = "extensions";
129     private static final String KEY_EXTENSION_NAME = "extensionName";
130     private static final String KEY_EXTERNAL_FENCE_FEATURES = "externalFenceFeatures";
131     private static final String KEY_EXTERNAL_FENCE_PROPERTIES = "externalFenceProperties";
132     private static final String KEY_EXTERNAL_SEMAPHORE_FEATURES = "externalSemaphoreFeatures";
133     private static final String KEY_EXTERNAL_SEMAPHORE_PROPERTIES = "externalSemaphoreProperties";
134     private static final String KEY_FEATURES = "features";
135     private static final String KEY_FILL_MODE_NON_SOLID = "fillModeNonSolid";
136     private static final String KEY_FILTER_MINMAX_IMAGE_COMPONENT_MAPPING = "filterMinmaxImageComponentMapping";
137     private static final String KEY_FILTER_MINMAX_SINGLE_COMPONENT_FORMATS = "filterMinmaxSingleComponentFormats";
138     private static final String KEY_FLAGS = "flags";
139     private static final String KEY_FORMATS = "formats";
140     private static final String KEY_FRAGMENT_STORES_AND_ATOMICS = "fragmentStoresAndAtomics";
141     private static final String KEY_FRAMEBUFFER_COLOR_SAMPLE_COUNTS = "framebufferColorSampleCounts";
142     private static final String KEY_FRAMEBUFFER_DEPTH_SAMPLE_COUNTS = "framebufferDepthSampleCounts";
143     private static final String KEY_FRAMEBUFFER_INTEGER_COLOR_SAMPLE_COUNTS = "framebufferIntegerColorSampleCounts";
144     private static final String KEY_FRAMEBUFFER_NO_ATTACHMENTS_SAMPLE_COUNTS = "framebufferNoAttachmentsSampleCounts";
145     private static final String KEY_FRAMEBUFFER_STENCIL_SAMPLE_COUNTS = "framebufferStencilSampleCounts";
146     private static final String KEY_FULL_DRAW_INDEX_UINT32 = "fullDrawIndexUint32";
147     private static final String KEY_GEOMETRY_SHADER = "geometryShader";
148     private static final String KEY_HEAP_INDEX = "heapIndex";
149     private static final String KEY_HEIGHT = "height";
150     private static final String KEY_HOST_QUERY_RESET = "hostQueryReset";
151     private static final String KEY_ID_PROPERTIES = "idProperties";
152     private static final String KEY_IMAGELESS_FRAMEBUFFER = "imagelessFramebuffer";
153     private static final String KEY_IMAGE_CUBE_ARRAY = "imageCubeArray";
154     private static final String KEY_IMPLEMENTATION_VERSION = "implementationVersion";
155     private static final String KEY_INDEPENDENT_BLEND = "independentBlend";
156     private static final String KEY_INDEPENDENT_RESOLVE = "independentResolve";
157     private static final String KEY_INDEPENDENT_RESOLVE_NONE = "independentResolveNone";
158     private static final String KEY_INHERITED_QUERIES = "inheritedQueries";
159     private static final String KEY_INLINE_UNIFORM_BLOCK = "inlineUniformBlock";
160     private static final String KEY_INSTANCE_API_VERSION = "instanceApiVersion";
161     private static final String KEY_INTEGER_DOT_PRODUCT_16BIT_MIXED_SIGNEDNESS_ACCELERATED = "integerDotProduct16BitMixedSignednessAccelerated";
162     private static final String KEY_INTEGER_DOT_PRODUCT_16BIT_SIGNED_ACCELERATED = "integerDotProduct16BitSignedAccelerated";
163     private static final String KEY_INTEGER_DOT_PRODUCT_16BIT_UNSIGNED_ACCELERATED = "integerDotProduct16BitUnsignedAccelerated";
164     private static final String KEY_INTEGER_DOT_PRODUCT_32BIT_MIXED_SIGNEDNESS_ACCELERATED = "integerDotProduct32BitMixedSignednessAccelerated";
165     private static final String KEY_INTEGER_DOT_PRODUCT_32BIT_SIGNED_ACCELERATED = "integerDotProduct32BitSignedAccelerated";
166     private static final String KEY_INTEGER_DOT_PRODUCT_32BIT_UNSIGNED_ACCELERATED = "integerDotProduct32BitUnsignedAccelerated";
167     private static final String KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_MIXED_SIGNEDNESS_ACCELERATED = "integerDotProduct4x8BitPackedMixedSignednessAccelerated";
168     private static final String KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_SIGNED_ACCELERATED = "integerDotProduct4x8BitPackedSignedAccelerated";
169     private static final String KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_UNSIGNED_ACCELERATED = "integerDotProduct4x8BitPackedUnsignedAccelerated";
170     private static final String KEY_INTEGER_DOT_PRODUCT_64BIT_MIXED_SIGNEDNESS_ACCELERATED = "integerDotProduct64BitMixedSignednessAccelerated";
171     private static final String KEY_INTEGER_DOT_PRODUCT_64BIT_SIGNED_ACCELERATED = "integerDotProduct64BitSignedAccelerated";
172     private static final String KEY_INTEGER_DOT_PRODUCT_64BIT_UNSIGNED_ACCELERATED = "integerDotProduct64BitUnsignedAccelerated";
173     private static final String KEY_INTEGER_DOT_PRODUCT_8BIT_MIXED_SIGNEDNESS_ACCELERATED = "integerDotProduct8BitMixedSignednessAccelerated";
174     private static final String KEY_INTEGER_DOT_PRODUCT_8BIT_SIGNED_ACCELERATED = "integerDotProduct8BitSignedAccelerated";
175     private static final String KEY_INTEGER_DOT_PRODUCT_8BIT_UNSIGNED_ACCELERATED = "integerDotProduct8BitUnsignedAccelerated";
176     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_MIXED_SIGNEDNESS_ACCELERATED = "integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated";
177     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_SIGNED_ACCELERATED = "integerDotProductAccumulatingSaturating16BitSignedAccelerated";
178     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_UNSIGNED_ACCELERATED = "integerDotProductAccumulatingSaturating16BitUnsignedAccelerated";
179     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_MIXED_SIGNEDNESS_ACCELERATED = "integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated";
180     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_SIGNED_ACCELERATED = "integerDotProductAccumulatingSaturating32BitSignedAccelerated";
181     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_UNSIGNED_ACCELERATED = "integerDotProductAccumulatingSaturating32BitUnsignedAccelerated";
182     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_MIXED_SIGNEDNESS_ACCELERATED = "integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated";
183     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_SIGNED_ACCELERATED = "integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated";
184     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_UNSIGNED_ACCELERATED = "integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated";
185     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_MIXED_SIGNEDNESS_ACCELERATED = "integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated";
186     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_SIGNEDNESS_ACCELERATED = "integerDotProductAccumulatingSaturating64BitSignedAccelerated";
187     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_UNSIGNED_ACCELERATED = "integerDotProductAccumulatingSaturating64BitUnsignedAccelerated";
188     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_MIXED_SIGNEDNESS_ACCELERATED = "integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated";
189     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_SIGNED_ACCELERATED = "integerDotProductAccumulatingSaturating8BitSignedAccelerated";
190     private static final String KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_UNSIGNED_ACCELERATED = "integerDotProductAccumulatingSaturating8BitUnsignedAccelerated";
191     private static final String KEY_LARGE_POINTS = "largePoints";
192     private static final String KEY_LAYERS = "layers";
193     private static final String KEY_LAYER_NAME = "layerName";
194     private static final String KEY_LIMITS = "limits";
195     private static final String KEY_LINEAR_TILING_FEATURES = "linearTilingFeatures";
196     private static final String KEY_LINE_WIDTH_GRANULARITY = "lineWidthGranularity";
197     private static final String KEY_LINE_WIDTH_RANGE = "lineWidthRange";
198     private static final String KEY_LOGIC_OP = "logicOp";
199     private static final String KEY_MAINTENANCE4 = "maintenance4";
200     private static final String KEY_MAINTENANCE_3_PROPERTIES = "maintenance3Properties";
201     private static final String KEY_MAJOR = "major";
202     private static final String KEY_MAX_BOUND_DESCRIPTOR_SETS = "maxBoundDescriptorSets";
203     private static final String KEY_MAX_BUFFER_SIZE = "maxBufferSize";
204     private static final String KEY_MAX_CLIP_DISTANCES = "maxClipDistances";
205     private static final String KEY_MAX_COLOR_ATTACHMENTS = "maxColorAttachments";
206     private static final String KEY_MAX_COMBINED_CLIP_AND_CULL_DISTANCES = "maxCombinedClipAndCullDistances";
207     private static final String KEY_MAX_COMPUTE_SHARED_MEMORY_SIZE = "maxComputeSharedMemorySize";
208     private static final String KEY_MAX_COMPUTE_WORKGROUP_SUBGROUPS = "maxComputeWorkgroupSubgroups";
209     private static final String KEY_MAX_COMPUTE_WORK_GROUP_COUNT = "maxComputeWorkGroupCount";
210     private static final String KEY_MAX_COMPUTE_WORK_GROUP_INVOCATIONS = "maxComputeWorkGroupInvocations";
211     private static final String KEY_MAX_COMPUTE_WORK_GROUP_SIZE = "maxComputeWorkGroupSize";
212     private static final String KEY_MAX_CULL_DISTANCES = "maxCullDistances";
213     private static final String KEY_MAX_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCKS = "maxDescriptorSetInlineUniformBlocks";
214     private static final String KEY_MAX_DESCRIPTOR_SET_INPUT_ATTACHMENTS = "maxDescriptorSetInputAttachments";
215     private static final String KEY_MAX_DESCRIPTOR_SET_SAMPLED_IMAGES = "maxDescriptorSetSampledImages";
216     private static final String KEY_MAX_DESCRIPTOR_SET_SAMPLERS = "maxDescriptorSetSamplers";
217     private static final String KEY_MAX_DESCRIPTOR_SET_STORAGE_BUFFERS = "maxDescriptorSetStorageBuffers";
218     private static final String KEY_MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC = "maxDescriptorSetStorageBuffersDynamic";
219     private static final String KEY_MAX_DESCRIPTOR_SET_STORAGE_IMAGES = "maxDescriptorSetStorageImages";
220     private static final String KEY_MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS = "maxDescriptorSetUniformBuffers";
221     private static final String KEY_MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC = "maxDescriptorSetUniformBuffersDynamic";
222     private static final String KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_INLINE_UNIFORM_BLOCKS = "maxDescriptorSetUpdateAfterBindInlineUniformBlocks";
223     private static final String KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_INPUT_ATTACHMENTS = "maxDescriptorSetUpdateAfterBindInputAttachments";
224     private static final String KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_SAMPLED_IMAGES = "maxDescriptorSetUpdateAfterBindSampledImages";
225     private static final String KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_SAMPLERS = "maxDescriptorSetUpdateAfterBindSamplers";
226     private static final String KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_BUFFERS = "maxDescriptorSetUpdateAfterBindStorageBuffers";
227     private static final String KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_BUFFERS_DYNAMIC = "maxDescriptorSetUpdateAfterBindStorageBuffersDynamic";
228     private static final String KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_IMAGES = "maxDescriptorSetUpdateAfterBindStorageImages";
229     private static final String KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_UNIFORM_BUFFERS = "maxDescriptorSetUpdateAfterBindUniformBuffers";
230     private static final String KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_UNIFORM_BUFFERS_DYNAMIC = "maxDescriptorSetUpdateAfterBindUniformBuffersDynamic";
231     private static final String KEY_MAX_DRAW_INDEXED_INDEX_VALUE = "maxDrawIndexedIndexValue";
232     private static final String KEY_MAX_DRAW_INDIRECT_COUNT = "maxDrawIndirectCount";
233     private static final String KEY_MAX_FRAGMENT_COMBINED_OUTPUT_RESOURCES = "maxFragmentCombinedOutputResources";
234     private static final String KEY_MAX_FRAGMENT_DUAL_SRC_ATTACHMENTS = "maxFragmentDualSrcAttachments";
235     private static final String KEY_MAX_FRAGMENT_INPUT_COMPONENTS = "maxFragmentInputComponents";
236     private static final String KEY_MAX_FRAGMENT_OUTPUT_ATTACHMENTS = "maxFragmentOutputAttachments";
237     private static final String KEY_MAX_FRAMEBUFFER_HEIGHT = "maxFramebufferHeight";
238     private static final String KEY_MAX_FRAMEBUFFER_LAYERS = "maxFramebufferLayers";
239     private static final String KEY_MAX_FRAMEBUFFER_WIDTH = "maxFramebufferWidth";
240     private static final String KEY_MAX_GEOMETRY_INPUT_COMPONENTS = "maxGeometryInputComponents";
241     private static final String KEY_MAX_GEOMETRY_OUTPUT_COMPONENTS = "maxGeometryOutputComponents";
242     private static final String KEY_MAX_GEOMETRY_OUTPUT_VERTICES = "maxGeometryOutputVertices";
243     private static final String KEY_MAX_GEOMETRY_SHADER_INVOCATIONS = "maxGeometryShaderInvocations";
244     private static final String KEY_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = "maxGeometryTotalOutputComponents";
245     private static final String KEY_MAX_IMAGE_ARRAY_LAYERS = "maxImageArrayLayers";
246     private static final String KEY_MAX_IMAGE_DIMENSION_1D = "maxImageDimension1D";
247     private static final String KEY_MAX_IMAGE_DIMENSION_2D = "maxImageDimension2D";
248     private static final String KEY_MAX_IMAGE_DIMENSION_3D = "maxImageDimension3D";
249     private static final String KEY_MAX_IMAGE_DIMENSION_CUBE = "maxImageDimensionCube";
250     private static final String KEY_MAX_INLINE_UNIFORM_BLOCK_SIZE = "maxInlineUniformBlockSize";
251     private static final String KEY_MAX_INLINE_UNIFORM_TOTAL_SIZE = "maxInlineUniformTotalSize";
252     private static final String KEY_MAX_INTERPOLATION_OFFSET = "maxInterpolationOffset";
253     private static final String KEY_MAX_MEMORY_ALLOCATION_COUNT = "maxMemoryAllocationCount";
254     private static final String KEY_MAX_MEMORY_ALLOCATION_SIZE = "maxMemoryAllocationSize";
255     private static final String KEY_MAX_MULTIVIEW_INSTANCE_INDEX = "maxMultiviewInstanceIndex";
256     private static final String KEY_MAX_MULTIVIEW_VIEW_COUNT = "maxMultiviewViewCount";
257     private static final String KEY_MAX_PER_SET_DESCRIPTORS = "maxPerSetDescriptors";
258     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_INLINE_UNIFORM_BLOCKS = "maxPerStageDescriptorInlineUniformBlocks";
259     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_INPUT_ATTACHMENTS = "maxPerStageDescriptorInputAttachments";
260     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_SAMPLED_IMAGES = "maxPerStageDescriptorSampledImages";
261     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_SAMPLERS = "maxPerStageDescriptorSamplers";
262     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_STORAGE_BUFFERS = "maxPerStageDescriptorStorageBuffers";
263     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_STORAGE_IMAGES = "maxPerStageDescriptorStorageImages";
264     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BUFFERS = "maxPerStageDescriptorUniformBuffers";
265     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_INLINE_UNIFORM_BLOCKS = "maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks";
266     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_INPUT_ATTACHMENTS = "maxPerStageDescriptorUpdateAfterBindInputAttachments";
267     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_SAMPLED_IMAGES = "maxPerStageDescriptorUpdateAfterBindSampledImages";
268     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_SAMPLERS = "maxPerStageDescriptorUpdateAfterBindSamplers";
269     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_STORAGE_BUFFERS = "maxPerStageDescriptorUpdateAfterBindStorageBuffers";
270     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_STORAGE_IMAGES = "maxPerStageDescriptorUpdateAfterBindStorageImages";
271     private static final String KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_UNIFORM_BUFFERS = "maxPerStageDescriptorUpdateAfterBindUniformBuffers";
272     private static final String KEY_MAX_PER_STAGE_RESOURCES = "maxPerStageResources";
273     private static final String KEY_MAX_PER_STAGE_UPDATE_AFTER_BIND_RESOURCES = "maxPerStageUpdateAfterBindResources";
274     private static final String KEY_MAX_PUSH_CONSTANTS_SIZE = "maxPushConstantsSize";
275     private static final String KEY_MAX_SAMPLER_ALLOCATION_COUNT = "maxSamplerAllocationCount";
276     private static final String KEY_MAX_SAMPLER_ANISOTROPY = "maxSamplerAnisotropy";
277     private static final String KEY_MAX_SAMPLER_LOD_BIAS = "maxSamplerLodBias";
278     private static final String KEY_MAX_SAMPLE_MASK_WORDS = "maxSampleMaskWords";
279     private static final String KEY_MAX_STORAGE_BUFFER_RANGE = "maxStorageBufferRange";
280     private static final String KEY_MAX_SUBGROUP_SIZE = "maxSubgroupSize";
281     private static final String KEY_MAX_TESSELLATION_CONTROL_PER_PATCH_OUTPUT_COMPONENTS = "maxTessellationControlPerPatchOutputComponents";
282     private static final String KEY_MAX_TESSELLATION_CONTROL_PER_VERTEX_INPUT_COMPONENTS = "maxTessellationControlPerVertexInputComponents";
283     private static final String KEY_MAX_TESSELLATION_CONTROL_PER_VERTEX_OUTPUT_COMPONENTS = "maxTessellationControlPerVertexOutputComponents";
284     private static final String KEY_MAX_TESSELLATION_CONTROL_TOTAL_OUTPUT_COMPONENTS = "maxTessellationControlTotalOutputComponents";
285     private static final String KEY_MAX_TESSELLATION_EVALUATION_INPUT_COMPONENTS = "maxTessellationEvaluationInputComponents";
286     private static final String KEY_MAX_TESSELLATION_EVALUATION_OUTPUT_COMPONENTS = "maxTessellationEvaluationOutputComponents";
287     private static final String KEY_MAX_TESSELLATION_GENERATION_LEVEL = "maxTessellationGenerationLevel";
288     private static final String KEY_MAX_TESSELLATION_PATCH_SIZE = "maxTessellationPatchSize";
289     private static final String KEY_MAX_TEXEL_BUFFER_ELEMENTS = "maxTexelBufferElements";
290     private static final String KEY_MAX_TEXEL_GATHER_OFFSET = "maxTexelGatherOffset";
291     private static final String KEY_MAX_TEXEL_OFFSET = "maxTexelOffset";
292     private static final String KEY_MAX_TIMELINE_SEMAPHORE_VALUE_DIFFERENCE = "maxTimelineSemaphoreValueDifference";
293     private static final String KEY_MAX_UNIFORM_BUFFER_RANGE = "maxUniformBufferRange";
294     private static final String KEY_MAX_UPDATE_AFTER_BIND_DESCRIPTORS_IN_ALL_POOLS = "maxUpdateAfterBindDescriptorsInAllPools";
295     private static final String KEY_MAX_VERTEX_INPUT_ATTRIBUTES = "maxVertexInputAttributes";
296     private static final String KEY_MAX_VERTEX_INPUT_ATTRIBUTE_OFFSET = "maxVertexInputAttributeOffset";
297     private static final String KEY_MAX_VERTEX_INPUT_BINDINGS = "maxVertexInputBindings";
298     private static final String KEY_MAX_VERTEX_INPUT_BINDING_STRIDE = "maxVertexInputBindingStride";
299     private static final String KEY_MAX_VERTEX_OUTPUT_COMPONENTS = "maxVertexOutputComponents";
300     private static final String KEY_MAX_VIEWPORTS = "maxViewports";
301     private static final String KEY_MAX_VIEWPORT_DIMENSIONS = "maxViewportDimensions";
302     private static final String KEY_MEMORY = "memory";
303     private static final String KEY_MEMORY_HEAPS = "memoryHeaps";
304     private static final String KEY_MEMORY_HEAP_COUNT = "memoryHeapCount";
305     private static final String KEY_MEMORY_TYPES = "memoryTypes";
306     private static final String KEY_MEMORY_TYPE_COUNT = "memoryTypeCount";
307     private static final String KEY_MINOR = "minor";
308     private static final String KEY_MIN_IMAGE_TRANSFER_GRANULARITY = "minImageTransferGranularity";
309     private static final String KEY_MIN_INTERPOLATION_OFFSET = "minInterpolationOffset";
310     private static final String KEY_MIN_MEMORY_MAP_ALIGNMENT = "minMemoryMapAlignment";
311     private static final String KEY_MIN_STORAGE_BUFFER_OFFSET_ALIGNMENT = "minStorageBufferOffsetAlignment";
312     private static final String KEY_MIN_SUBGROUP_SIZE = "minSubgroupSize";
313     private static final String KEY_MIN_TEXEL_BUFFER_OFFSET_ALIGNMENT = "minTexelBufferOffsetAlignment";
314     private static final String KEY_MIN_TEXEL_GATHER_OFFSET = "minTexelGatherOffset";
315     private static final String KEY_MIN_TEXEL_OFFSET = "minTexelOffset";
316     private static final String KEY_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT = "minUniformBufferOffsetAlignment";
317     private static final String KEY_MIPMAP_PRECISION_BITS = "mipmapPrecisionBits";
318     private static final String KEY_MULTIVIEW = "multiview";
319     private static final String KEY_MULTIVIEW_FEATURES = "multiviewFeatures";
320     private static final String KEY_MULTIVIEW_GEOMETRY_SHADER = "multiviewGeometryShader";
321     private static final String KEY_MULTIVIEW_PROPERTIES = "multiviewProperties";
322     private static final String KEY_MULTIVIEW_TESSELLATION_SHADER = "multiviewTessellationShader";
323     private static final String KEY_MULTI_DRAW_INDIRECT = "multiDrawIndirect";
324     private static final String KEY_MULTI_VIEWPORT = "multiViewport";
325     private static final String KEY_NON_COHERENT_ATOM_SIZE = "nonCoherentAtomSize";
326     private static final String KEY_OCCLUSION_QUERY_PRECISE = "occlusionQueryPrecise";
327     private static final String KEY_OPTIMAL_BUFFER_COPY_OFFSET_ALIGNMENT = "optimalBufferCopyOffsetAlignment";
328     private static final String KEY_OPTIMAL_BUFFER_COPY_ROW_PITCH_ALIGNMENT = "optimalBufferCopyRowPitchAlignment";
329     private static final String KEY_OPTIMAL_TILING_FEATURES = "optimalTilingFeatures";
330     private static final String KEY_PATCH = "patch";
331     private static final String KEY_PIPELINE_CACHE_UUID = "pipelineCacheUUID";
332     private static final String KEY_PIPELINE_CREATION_CACHE_CONTROL = "pipelineCreationCacheControl";
333     private static final String KEY_PIPELINE_STATISTICS_QUERY = "pipelineStatisticsQuery";
334     private static final String KEY_POINT_CLIPPING_BEHAVIOR = "pointClippingBehavior";
335     private static final String KEY_POINT_CLIPPING_PROPERTIES = "pointClippingProperties";
336     private static final String KEY_POINT_SIZE_GRANULARITY = "pointSizeGranularity";
337     private static final String KEY_POINT_SIZE_RANGE = "pointSizeRange";
338     private static final String KEY_PRIVATE_DATA = "privateData";
339     private static final String KEY_PROPERTIES = "properties";
340     private static final String KEY_PROPERTY_FLAGS = "propertyFlags";
341     private static final String KEY_PROTECTED_MEMORY = "protectedMemory";
342     private static final String KEY_PROTECTED_MEMORY_FEATURES = "protectedMemoryFeatures";
343     private static final String KEY_QUAD_DIVERGENT_IMPLICIT_LOD = "quadDivergentImplicitLod";
344     private static final String KEY_QUAD_OPERATIONS_IN_ALL_STAGES = "quadOperationsInAllStages";
345     private static final String KEY_QUEUES = "queues";
346     private static final String KEY_QUEUE_COUNT = "queueCount";
347     private static final String KEY_QUEUE_FLAGS = "queueFlags";
348     private static final String KEY_REQUIRED_SUBGROUP_SIZE_STAGES = "requiredSubgroupSizeStages";
349     private static final String KEY_RESIDENCY_ALIGNED_MIP_SIZE = "residencyAlignedMipSize";
350     private static final String KEY_RESIDENCY_NON_RESIDENT_STRICT = "residencyNonResidentStrict";
351     private static final String KEY_RESIDENCY_STANDARD_2D_BLOCK_SHAPE = "residencyStandard2DBlockShape";
352     private static final String KEY_RESIDENCY_STANDARD_2D_MULTISAMPLE_BLOCK_SHAPE = "residencyStandard2DMultisampleBlockShape";
353     private static final String KEY_RESIDENCY_STANDARD_3D_BLOCK_SHAPE = "residencyStandard3DBlockShape";
354     private static final String KEY_ROBUST_BUFFER_ACCESS = "robustBufferAccess";
355     private static final String KEY_ROBUST_BUFFER_ACCESS_UPDATE_AFTER_BIND = "robustBufferAccessUpdateAfterBind";
356     private static final String KEY_ROBUST_IMAGE_ACCESS = "robustImageAccess";
357     private static final String KEY_ROUNDING_MODE_INDEPENDENCE = "roundingModeIndependence";
358     private static final String KEY_RUNTIME_DESCRIPTOR_ARRAY = "runtimeDescriptorArray";
359     private static final String KEY_SAMPLED_IMAGE_COLOR_SAMPLE_COUNTS = "sampledImageColorSampleCounts";
360     private static final String KEY_SAMPLED_IMAGE_DEPTH_SAMPLE_COUNTS = "sampledImageDepthSampleCounts";
361     private static final String KEY_SAMPLED_IMAGE_INTEGER_SAMPLE_COUNTS = "sampledImageIntegerSampleCounts";
362     private static final String KEY_SAMPLED_IMAGE_STENCIL_SAMPLE_COUNTS = "sampledImageStencilSampleCounts";
363     private static final String KEY_SAMPLER_ANISOTROPY = "samplerAnisotropy";
364     private static final String KEY_SAMPLER_FILTER_MINMAX = "samplerFilterMinmax";
365     private static final String KEY_SAMPLER_MIRROR_CLAMP_TO_EDGE = "samplerMirrorClampToEdge";
366     private static final String KEY_SAMPLER_YCBCR_CONVERSION = "samplerYcbcrConversion";
367     private static final String KEY_SAMPLER_YCBCR_CONVERSION_FEATURES = "samplerYcbcrConversionFeatures";
368     private static final String KEY_SAMPLE_RATE_SHADING = "sampleRateShading";
369     private static final String KEY_SCALAR_BLOCK_LAYOUT = "scalarBlockLayout";
370     private static final String KEY_SEPARATE_DEPTH_STENCIL_LAYOUTS = "separateDepthStencilLayouts";
371     private static final String KEY_SHADER_BUFFER_INT64_ATOMICS = "shaderBufferInt64Atomics";
372     private static final String KEY_SHADER_CLIP_DISTANCE = "shaderClipDistance";
373     private static final String KEY_SHADER_CULL_DISTANCE = "shaderCullDistance";
374     private static final String KEY_SHADER_DEMOTE_TO_HELPER_INVOCATION = "shaderDemoteToHelperInvocation";
375     private static final String KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT16 = "shaderDenormFlushToZeroFloat16";
376     private static final String KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT32 = "shaderDenormFlushToZeroFloat32";
377     private static final String KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT64 = "shaderDenormFlushToZeroFloat64";
378     private static final String KEY_SHADER_DENORM_PRESERVE_FLOAT16 = "shaderDenormPreserveFloat16";
379     private static final String KEY_SHADER_DENORM_PRESERVE_FLOAT32 = "shaderDenormPreserveFloat32";
380     private static final String KEY_SHADER_DENORM_PRESERVE_FLOAT64 = "shaderDenormPreserveFloat64";
381     private static final String KEY_SHADER_DRAW_PARAMETERS = "shaderDrawParameters";
382     private static final String KEY_SHADER_DRAW_PARAMETER_FEATURES = "shaderDrawParameterFeatures";
383     private static final String KEY_SHADER_FLOAT16 = "shaderFloat16";
384     private static final String KEY_SHADER_FLOAT64 = "shaderFloat64";
385     private static final String KEY_SHADER_IMAGE_GATHER_EXTENDED = "shaderImageGatherExtended";
386     private static final String KEY_SHADER_INPUT_ATTACHMENT_ARRAY_DYNAMIC_INDEXING = "shaderInputAttachmentArrayDynamicIndexing";
387     private static final String KEY_SHADER_INPUT_ATTACHMENT_ARRAY_NONUNIFORM_INDEXING_NATIVE = "shaderInputAttachmentArrayNonUniformIndexingNative";
388     private static final String KEY_SHADER_INPUT_ATTACHMENT_ARRAY_NON_UNIFORM_INDEXING = "shaderInputAttachmentArrayNonUniformIndexing";
389     private static final String KEY_SHADER_INT16 = "shaderInt16";
390     private static final String KEY_SHADER_INT64 = "shaderInt64";
391     private static final String KEY_SHADER_INT8 = "shaderInt8";
392     private static final String KEY_SHADER_INTEGER_DOT_PRODUCT = "shaderIntegerDotProduct";
393     private static final String KEY_SHADER_OUTPUT_LAYER = "shaderOutputLayer";
394     private static final String KEY_SHADER_OUTPUT_VIEWPORT_INDEX = "shaderOutputViewportIndex";
395     private static final String KEY_SHADER_RESOURCE_MIN_LOD = "shaderResourceMinLod";
396     private static final String KEY_SHADER_RESOURCE_RESIDENCY = "shaderResourceResidency";
397     private static final String KEY_SHADER_ROUNDING_MODE_RTE_FLOAT16 = "shaderRoundingModeRTEFloat16";
398     private static final String KEY_SHADER_ROUNDING_MODE_RTE_FLOAT32 = "shaderRoundingModeRTEFloat32";
399     private static final String KEY_SHADER_ROUNDING_MODE_RTE_FLOAT64 = "shaderRoundingModeRTEFloat64";
400     private static final String KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT16 = "shaderRoundingModeRTZFloat16";
401     private static final String KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT32 = "shaderRoundingModeRTZFloat32";
402     private static final String KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT64 = "shaderRoundingModeRTZFloat64";
403     private static final String KEY_SHADER_SAMPLED_IMAGE_ARRAY_DYNAMIC_INDEXING = "shaderSampledImageArrayDynamicIndexing";
404     private static final String KEY_SHADER_SAMPLED_IMAGE_ARRAY_NONUNIFORM_INDEXING_NATIVE = "shaderSampledImageArrayNonUniformIndexingNative";
405     private static final String KEY_SHADER_SAMPLED_IMAGE_ARRAY_NON_UNIFORM_INDEXING = "shaderSampledImageArrayNonUniformIndexing";
406     private static final String KEY_SHADER_SHARED_INT64_ATOMICS = "shaderSharedInt64Atomics";
407     private static final String KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT16 = "shaderSignedZeroInfNanPreserveFloat16";
408     private static final String KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT32 = "shaderSignedZeroInfNanPreserveFloat32";
409     private static final String KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT64 = "shaderSignedZeroInfNanPreserveFloat64";
410     private static final String KEY_SHADER_STORAGE_BUFFER_ARRAY_DYNAMIC_INDEXING = "shaderStorageBufferArrayDynamicIndexing";
411     private static final String KEY_SHADER_STORAGE_BUFFER_ARRAY_NONUNIFORM_INDEXING_NATIVE = "shaderStorageBufferArrayNonUniformIndexingNative";
412     private static final String KEY_SHADER_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING = "shaderStorageBufferArrayNonUniformIndexing";
413     private static final String KEY_SHADER_STORAGE_IMAGE_ARRAY_DYNAMIC_INDEXING = "shaderStorageImageArrayDynamicIndexing";
414     private static final String KEY_SHADER_STORAGE_IMAGE_ARRAY_NONUNIFORM_INDEXING_NATIVE = "shaderStorageImageArrayNonUniformIndexingNative";
415     private static final String KEY_SHADER_STORAGE_IMAGE_ARRAY_NON_UNIFORM_INDEXING = "shaderStorageImageArrayNonUniformIndexing";
416     private static final String KEY_SHADER_STORAGE_IMAGE_EXTENDED_FORMATS = "shaderStorageImageExtendedFormats";
417     private static final String KEY_SHADER_STORAGE_IMAGE_MULTISAMPLE = "shaderStorageImageMultisample";
418     private static final String KEY_SHADER_STORAGE_IMAGE_READ_WITHOUT_FORMAT = "shaderStorageImageReadWithoutFormat";
419     private static final String KEY_SHADER_STORAGE_IMAGE_WRITE_WITHOUT_FORMAT = "shaderStorageImageWriteWithoutFormat";
420     private static final String KEY_SHADER_STORAGE_TEXEL_BUFFER_ARRAY_DYNAMIC_INDEXING = "shaderStorageTexelBufferArrayDynamicIndexing";
421     private static final String KEY_SHADER_STORAGE_TEXEL_BUFFER_ARRAY_NON_UNIFORM_INDEXING = "shaderStorageTexelBufferArrayNonUniformIndexing";
422     private static final String KEY_SHADER_SUBGROUP_EXTENDED_TYPES = "shaderSubgroupExtendedTypes";
423     private static final String KEY_SHADER_TERMINATE_INVOCATION = "shaderTerminateInvocation";
424     private static final String KEY_SHADER_TESSELLATION_AND_GEOMETRY_POINT_SIZE = "shaderTessellationAndGeometryPointSize";
425     private static final String KEY_SHADER_UNIFORM_BUFFER_ARRAY_DYNAMIC_INDEXING = "shaderUniformBufferArrayDynamicIndexing";
426     private static final String KEY_SHADER_UNIFORM_BUFFER_ARRAY_NONUNIFORM_INDEXING_NATIVE = "shaderUniformBufferArrayNonUniformIndexingNative";
427     private static final String KEY_SHADER_UNIFORM_BUFFER_ARRAY_NON_UNIFORM_INDEXING = "shaderUniformBufferArrayNonUniformIndexing";
428     private static final String KEY_SHADER_UNIFORM_TEXEL_BUFFER_ARRAY_DYNAMIC_INDEXING = "shaderUniformTexelBufferArrayDynamicIndexing";
429     private static final String KEY_SHADER_UNIFORM_TEXEL_BUFFER_ARRAY_NON_UNIFORM_INDEXING = "shaderUniformTexelBufferArrayNonUniformIndexing";
430     private static final String KEY_SHADER_ZERO_INITIALIZE_WORKGROUP_MEMORY = "shaderZeroInitializeWorkgroupMemory";
431     private static final String KEY_SIZE = "size";
432     private static final String KEY_SPARSE_ADDRESS_SPACE_SIZE = "sparseAddressSpaceSize";
433     private static final String KEY_SPARSE_BINDING = "sparseBinding";
434     private static final String KEY_SPARSE_PROPERTIES = "sparseProperties";
435     private static final String KEY_SPARSE_RESIDENCY_16_SAMPLES = "sparseResidency16Samples";
436     private static final String KEY_SPARSE_RESIDENCY_2_SAMPLES = "sparseResidency2Samples";
437     private static final String KEY_SPARSE_RESIDENCY_4_SAMPLES = "sparseResidency4Samples";
438     private static final String KEY_SPARSE_RESIDENCY_8_SAMPLES = "sparseResidency8Samples";
439     private static final String KEY_SPARSE_RESIDENCY_ALIASED = "sparseResidencyAliased";
440     private static final String KEY_SPARSE_RESIDENCY_BUFFER = "sparseResidencyBuffer";
441     private static final String KEY_SPARSE_RESIDENCY_IMAGE_2D = "sparseResidencyImage2D";
442     private static final String KEY_SPARSE_RESIDENCY_IMAGE_3D = "sparseResidencyImage3D";
443     private static final String KEY_SPEC_VERSION = "specVersion";
444     private static final String KEY_STANDARD_SAMPLE_LOCATIONS = "standardSampleLocations";
445     private static final String KEY_STORAGE_BUFFER_16BIT_ACCESS = "storageBuffer16BitAccess";
446     private static final String KEY_STORAGE_BUFFER_8BIT_ACCESS = "storageBuffer8BitAccess";
447     private static final String KEY_STORAGE_IMAGE_SAMPLE_COUNTS = "storageImageSampleCounts";
448     private static final String KEY_STORAGE_INPUT_OUTPUT_16 = "storageInputOutput16";
449     private static final String KEY_STORAGE_PUSH_CONSTANT8 = "storagePushConstant8";
450     private static final String KEY_STORAGE_PUSH_CONSTANT_16 = "storagePushConstant16";
451     private static final String KEY_STORAGE_TEXEL_BUFFER_OFFSET_ALIGNMENT_BYTES = "storageTexelBufferOffsetAlignmentBytes";
452     private static final String KEY_STORAGE_TEXEL_BUFFER_OFFSET_SINGLE_TEXEL_ALIGNMENT = "storageTexelBufferOffsetSingleTexelAlignment";
453     private static final String KEY_STRICT_LINES = "strictLines";
454     private static final String KEY_SUBGROUP_BROADCAST_DYNAMIC_ID = "subgroupBroadcastDynamicId";
455     private static final String KEY_SUBGROUP_PROPERTIES = "subgroupProperties";
456     private static final String KEY_SUBGROUP_SIZE = "subgroupSize";
457     private static final String KEY_SUBGROUP_SIZE_CONTROL = "subgroupSizeControl";
458     private static final String KEY_SUBMINOR = "subminor";
459     private static final String KEY_SUBSET_ALLOCATION = "subsetAllocation";
460     private static final String KEY_SUB_PIXEL_INTERPOLATION_OFFSET_BITS = "subPixelInterpolationOffsetBits";
461     private static final String KEY_SUB_PIXEL_PRECISION_BITS = "subPixelPrecisionBits";
462     private static final String KEY_SUB_TEXEL_PRECISION_BITS = "subTexelPrecisionBits";
463     private static final String KEY_SUPPORTED_DEPTH_RESOLVE_MODES = "supportedDepthResolveModes";
464     private static final String KEY_SUPPORTED_OPERATIONS = "supportedOperations";
465     private static final String KEY_SUPPORTED_STAGES = "supportedStages";
466     private static final String KEY_SUPPORTED_STENCIL_RESOLVE_MODES = "supportedStencilResolveModes";
467     private static final String KEY_SYNCHRONIZATION2 = "synchronization2";
468     private static final String KEY_TESSELLATION_SHADER = "tessellationShader";
469     private static final String KEY_TEXTURE_COMPRESSION_ASTC_HDR = "textureCompressionASTC_HDR";
470     private static final String KEY_TEXTURE_COMPRESSION_ASTC_LDR = "textureCompressionASTC_LDR";
471     private static final String KEY_TEXTURE_COMPRESSION_BC = "textureCompressionBC";
472     private static final String KEY_TEXTURE_COMPRESSION_ETC2 = "textureCompressionETC2";
473     private static final String KEY_TIMELINE_SEMAPHORE = "timelineSemaphore";
474     private static final String KEY_TIMESTAMP_COMPUTE_AND_GRAPHICS = "timestampComputeAndGraphics";
475     private static final String KEY_TIMESTAMP_PERIOD = "timestampPeriod";
476     private static final String KEY_TIMESTAMP_VALID_BITS = "timestampValidBits";
477     private static final String KEY_UNIFORM_AND_STORAGE_BUFFER_16BIT_ACCESS = "uniformAndStorageBuffer16BitAccess";
478     private static final String KEY_UNIFORM_AND_STORAGE_BUFFER_8BIT_ACCESS = "uniformAndStorageBuffer8BitAccess";
479     private static final String KEY_UNIFORM_BUFFER_STANDARD_LAYOUT = "uniformBufferStandardLayout";
480     private static final String KEY_UNIFORM_TEXEL_BUFFER_OFFSET_ALIGNMENT_BYTES = "uniformTexelBufferOffsetAlignmentBytes";
481     private static final String KEY_UNIFORM_TEXEL_BUFFER_OFFSET_SINGLE_TEXEL_ALIGNMENT = "uniformTexelBufferOffsetSingleTexelAlignment";
482     private static final String KEY_VARIABLE_MULTISAMPLE_RATE = "variableMultisampleRate";
483     private static final String KEY_VARIABLE_POINTERS = "variablePointers";
484     private static final String KEY_VARIABLE_POINTERS_STORAGE_BUFFER = "variablePointersStorageBuffer";
485     private static final String KEY_VARIABLE_POINTERS_FEATURES = "variablePointersFeatures";
486     private static final String KEY_VARIABLE_POINTER_FEATURES_KHR = "variablePointerFeaturesKHR";
487     private static final String KEY_VARIABLE_POINTERS_FEATURES_KHR = "variablePointersFeaturesKHR";
488     private static final String KEY_VENDOR_ID = "vendorID";
489     private static final String KEY_VERTEX_PIPELINE_STORES_AND_ATOMICS = "vertexPipelineStoresAndAtomics";
490     private static final String KEY_VIEWPORT_BOUNDS_RANGE = "viewportBoundsRange";
491     private static final String KEY_VIEWPORT_SUB_PIXEL_BITS = "viewportSubPixelBits";
492     private static final String KEY_VK_KHR_DRIVER_PROPERTIES = "VK_KHR_driver_properties";
493     private static final String KEY_VK_KHR_VARIABLE_POINTERS = "VK_KHR_variable_pointers";
494     private static final String KEY_VK_EXT_IMAGE_2D_VIEW_OF_3D = "VK_EXT_image_2d_view_of_3d";
495     private static final String KEY_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT = "image2DViewOf3DFeaturesEXT";
496     private static final String KEY_IMAGE_2D_VIEW_OF_3D = "image2DViewOf3D";
497     private static final String KEY_SAMPLER_2D_VIEW_OF_3D = "sampler2DViewOf3D";
498     private static final String KEY_VK_EXT_CUSTOM_BORDER_COLOR = "VK_EXT_custom_border_color";
499     private static final String KEY_CUSTOM_BORDER_COLOR_FEATURES_EXT =
500             "customBorderColorFeaturesEXT";
501     private static final String KEY_CUSTOM_BORDER_COLOR_WITHOUT_FORMAT =
502             "customBorderColorWithoutFormat";
503     private static final String KEY_CUSTOM_BORDER_COLORS = "customBorderColors";
504     private static final String KEY_VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART =
505             "VK_EXT_primitive_topology_list_restart";
506     private static final String KEY_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT =
507             "primitiveTopologyListRestartFeaturesEXT";
508     private static final String KEY_PRIMITIVE_TOPOLOGY_LIST_RESTART =
509             "primitiveTopologyListRestart";
510     private static final String KEY_PRIMITIVE_TOPOLOGY_PATCH_LIST_RESTART =
511             "primitiveTopologyPatchListRestart";
512     private static final String KEY_VK_EXT_PROVOKING_VERTEX = "VK_EXT_provoking_vertex";
513     private static final String KEY_PROVOKING_VERTEX_FEATURES_EXT = "provokingVertexFeaturesEXT";
514     private static final String KEY_PROVOKING_VERTEX_LAST = "provokingVertexLast";
515     private static final String KEY_TRANSFORM_FEEDBACK_PRESERVES_PROVOKING_VERTEX =
516             "transformFeedbackPreservesProvokingVertex";
517     private static final String KEY_VK_EXT_TRANSFORM_FEEDBACK = "VK_EXT_transform_feedback";
518     private static final String KEY_TRANSFORM_FEEDBACK_FEATURES_EXT =
519             "transformFeedbackFeaturesEXT";
520     private static final String KEY_GEOMETRY_STREAMS = "geometryStreams";
521     private static final String KEY_TRANSFORM_FEEDBACK = "transformFeedback";
522     private static final String KEY_VK_KHR_SHADER_FLOAT16_INT8 = "VK_KHR_shader_float16_int8";
523     private static final String KEY_SHADER_FLOAT16_INT8_FEATURES_KHR =
524             "shaderFloat16Int8FeaturesKHR";
525   private static final String KEY_FLOAT16_INT8_FEATURES_KHR =
526             "float16Int8FeaturesKHR";
527     private static final String KEY_VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES =
528             "VK_KHR_shader_subgroup_extended_types";
529     private static final String KEY_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR =
530             "shaderSubgroupExtendedTypesFeaturesKHR";
531     private static final String KEY_VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW =
532             "VK_KHR_shader_subgroup_uniform_control_flow";
533     private static final String KEY_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR =
534             "shaderSubgroupUniformControlFlowFeaturesKHR";
535     private static final String KEY_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW =
536             "shaderSubgroupUniformControlFlow";
537     private static final String KEY_VK_KHR_8BIT_STORAGE = "VK_KHR_8bit_storage";
538     private static final String KEY_BIT8_STORAGE_FEATURES_KHR = "bit8StorageFeaturesKHR";
539     private static final String KEY_VK_KHR_SHADER_INTEGER_DOT_PRODUCT =
540             "VK_KHR_shader_integer_dot_product";
541     private static final String KEY_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR =
542             "shaderIntegerDotProductFeaturesKHR";
543     private static final String KEY_VK_EXT_INDEX_TYPE_UINT8 = "VK_EXT_index_type_uint8";
544     private static final String KEY_INDEX_TYPE_UINT8_FEATURES_EXT = "indexTypeUint8FeaturesEXT";
545     private static final String KEY_INDEX_TYPE_UINT8 = "indexTypeUint8";
546     private static final String KEY_VK_KHR_INDEX_TYPE_UINT8 = "VK_KHR_index_type_uint8";
547     private static final String KEY_INDEX_TYPE_UINT8_FEATURES_KHR = "indexTypeUint8FeaturesKHR";
548     private static final String KEY_VK_EXT_LINE_RASTERIZATION = "VK_EXT_line_rasterization";
549     private static final String KEY_LINE_RASTERIZATION_FEATURES_EXT =
550             "lineRasterizationFeaturesEXT";
551     private static final String KEY_BRESENHAM_LINES = "bresenhamLines";
552     private static final String KEY_RECTANGULAR_LINES = "rectangularLines";
553     private static final String KEY_SMOOTH_LINES = "smoothLines";
554     private static final String KEY_STIPPLED_BRESENHAM_LINES = "stippledBresenhamLines";
555     private static final String KEY_STIPPLED_RECTANGULAR_LINES = "stippledRectangularLines";
556     private static final String KEY_STIPPLED_SMOOTH_LINES = "stippledSmoothLines";
557     private static final String KEY_VK_EXT_PRIMITIVES_GENERATED_QUERY =
558             "VK_EXT_primitives_generated_query";
559     private static final String KEY_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT =
560             "primitivesGeneratedQueryFeaturesEXT";
561     private static final String KEY_PRIMITIVES_GENERATED_QUERY = "primitivesGeneratedQuery";
562     private static final String KEY_PRIMITIVES_GENERATED_QUERY_WITH_NON_ZERO_STREAMS =
563             "primitivesGeneratedQueryWithNonZeroStreams";
564     private static final String KEY_PRIMITIVES_GENERATED_QUERY_WITH_RASTERIZER_DISCARD =
565             "primitivesGeneratedQueryWithRasterizerDiscard";
566     private static final String KEY_VK_KHR_SHADER_FLOAT_CONTROLS = "VK_KHR_shader_float_controls";
567     private static final String KEY_FLOAT_CONTROLS_PROPERTIES_KHR = "floatControlsPropertiesKHR";
568     private static final String KEY_VK_IMG_RELAXED_LINE_RASTERIZATION =
569             "VK_IMG_relaxed_line_rasterization";
570     private static final String KEY_RELAXED_LINE_RASTERIZATION_FEATURES_IMG =
571             "relaxedLineRasterizationFeaturesIMG";
572     private static final String RELAXED_LINE_RASTERIZATION = "relaxedLineRasterization";
573     private static final String KEY_CORE11 = "core11";
574     private static final String KEY_VULKAN_11_PROPERTIES = "vulkan_11_properties";
575     private static final String KEY_VULKAN_11_FEATURES = "vulkan_11_features";
576     private static final String KEY_PROTECTED_NO_FAULT = "protectedNoFault";
577     private static final String KEY_SUBGROUP_QUAD_OPERATIONS_IN_ALL_STAGES =
578             "subgroupQuadOperationsInAllStages";
579     private static final String KEY_SUBGROUP_SUPPORTED_OPERATIONS = "subgroupSupportedOperations";
580     private static final String KEY_SUBGROUP_SUPPORTED_STAGES = "subgroupSupportedStages";
581     private static final String KEY_VK_KHR_VERTEX_ATTRIBUTE_DIVISOR = "VK_KHR_vertex_attribute_divisor";
582     private static final String KEY_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR =
583             "vertexAttributeDivisorFeaturesKHR";
584     private static final String KEY_VERTEX_ATTRIBUTE_INSTANCE_RATE_DIVISOR = "vertexAttributeInstanceRateDivisor";
585     private static final String KEY_VERTEX_ATTRIBUTE_INSTANCE_RATE_ZERO_DIVISOR = "vertexAttributeInstanceRateZeroDivisor";
586     private static final String KEY_VULKAN_12_FEATURES = "vulkan_12_features";
587     private static final String KEY_VULKAN_12_PROPERTIES = "vulkan_12_properties";
588     private static final String KEY_VULKAN_13_FEATURES = "vulkan_13_features";
589     private static final String KEY_VULKAN_13_PROPERTIES = "vulkan_13_properties";
590     private static final String KEY_VULKAN_MEMORY_MODEL = "vulkanMemoryModel";
591     private static final String KEY_VULKAN_MEMORY_MODEL_AVAILABILITY_VISIBILITY_CHAINS = "vulkanMemoryModelAvailabilityVisibilityChains";
592     private static final String KEY_VULKAN_MEMORY_MODEL_DEVICE_SCOPE = "vulkanMemoryModelDeviceScope";
593     private static final String KEY_WIDE_LINES = "wideLines";
594     private static final String KEY_WIDTH = "width";
595 
596     private static final int VK_API_VERSION_1_1 = 4198400;
597     private static final int VK_API_VERSION_1_2 = 4202496;
598     private static final int VK_API_VERSION_1_3 = 4206592;
599     private static final int ENUM_VK_KHR_VARIABLE_POINTERS = 0;
600     private static final int ENUM_VK_KHR_DRIVER_PROPERTIES = 1;
601     private static final int ENUM_KEY_VK_EXT_IMAGE_2D_VIEW_OF_3D = 2;
602     private static final int ENUM_KEY_VK_EXT_CUSTOM_BORDER_COLOR = 3;
603     private static final int ENUM_KEY_VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART = 4;
604     private static final int ENUM_KEY_VK_EXT_PROVOKING_VERTEX = 5;
605     private static final int ENUM_KEY_VK_EXT_TRANSFORM_FEEDBACK = 6;
606     private static final int ENUM_KEY_VK_KHR_8BIT_STORAGE = 7;
607     private static final int ENUM_KEY_VK_KHR_SHADER_FLOAT16_INT8 = 8;
608     private static final int ENUM_KEY_VK_KHR_SHADER_INTEGER_DOT_PRODUCT = 9;
609     private static final int ENUM_KEY_VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES = 10;
610     private static final int ENUM_KEY_VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW = 11;
611     private static final int ENUM_KEY_VK_EXT_INDEX_TYPE_UINT8 = 12;
612     private static final int ENUM_KEY_VK_KHR_INDEX_TYPE_UINT8 = 13;
613     private static final int ENUM_KEY_VK_EXT_LINE_RASTERIZATION = 14;
614     private static final int ENUM_KEY_VK_EXT_PRIMITIVES_GENERATED_QUERY = 15;
615     private static final int ENUM_KEY_VK_KHR_SHADER_FLOAT_CONTROLS = 16;
616     private static final int ENUM_KEY_VK_IMG_RELAXED_LINE_RASTERIZATION = 17;
617     private static final int ENUM_KEY_VK_KHR_VERTEX_ATTRIBUTE_DIVISOR = 18;
618 
619     private static HashMap<String, Integer> extensionNameToEnum;
620 
621     static {
622         System.loadLibrary("ctsdeviceinfo");
623         extensionNameToEnum = new HashMap<>();
extensionNameToEnum.put(KEY_VK_KHR_DRIVER_PROPERTIES, ENUM_VK_KHR_DRIVER_PROPERTIES)624         extensionNameToEnum.put(KEY_VK_KHR_DRIVER_PROPERTIES, ENUM_VK_KHR_DRIVER_PROPERTIES);
extensionNameToEnum.put(KEY_VK_KHR_VARIABLE_POINTERS, ENUM_VK_KHR_VARIABLE_POINTERS)625         extensionNameToEnum.put(KEY_VK_KHR_VARIABLE_POINTERS, ENUM_VK_KHR_VARIABLE_POINTERS);
extensionNameToEnum.put(KEY_VK_EXT_IMAGE_2D_VIEW_OF_3D, ENUM_KEY_VK_EXT_IMAGE_2D_VIEW_OF_3D)626         extensionNameToEnum.put(KEY_VK_EXT_IMAGE_2D_VIEW_OF_3D, ENUM_KEY_VK_EXT_IMAGE_2D_VIEW_OF_3D);
extensionNameToEnum.put(KEY_VK_EXT_CUSTOM_BORDER_COLOR, ENUM_KEY_VK_EXT_CUSTOM_BORDER_COLOR)627         extensionNameToEnum.put(KEY_VK_EXT_CUSTOM_BORDER_COLOR, ENUM_KEY_VK_EXT_CUSTOM_BORDER_COLOR);
extensionNameToEnum.put(KEY_VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART, ENUM_KEY_VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART)628         extensionNameToEnum.put(KEY_VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART,
629 ENUM_KEY_VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART);
extensionNameToEnum.put(KEY_VK_EXT_PROVOKING_VERTEX, ENUM_KEY_VK_EXT_PROVOKING_VERTEX)630         extensionNameToEnum.put(KEY_VK_EXT_PROVOKING_VERTEX, ENUM_KEY_VK_EXT_PROVOKING_VERTEX);
extensionNameToEnum.put(KEY_VK_EXT_TRANSFORM_FEEDBACK, ENUM_KEY_VK_EXT_TRANSFORM_FEEDBACK)631         extensionNameToEnum.put(KEY_VK_EXT_TRANSFORM_FEEDBACK, ENUM_KEY_VK_EXT_TRANSFORM_FEEDBACK);
extensionNameToEnum.put( KEY_VK_KHR_SHADER_FLOAT16_INT8, ENUM_KEY_VK_KHR_SHADER_FLOAT16_INT8)632         extensionNameToEnum.put(
633                 KEY_VK_KHR_SHADER_FLOAT16_INT8, ENUM_KEY_VK_KHR_SHADER_FLOAT16_INT8);
extensionNameToEnum.put( KEY_VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES, ENUM_KEY_VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES)634         extensionNameToEnum.put(
635                 KEY_VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES,
636                 ENUM_KEY_VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES);
extensionNameToEnum.put( KEY_VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW, ENUM_KEY_VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW)637         extensionNameToEnum.put(
638                 KEY_VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW,
639                 ENUM_KEY_VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW);
extensionNameToEnum.put(KEY_VK_KHR_8BIT_STORAGE, ENUM_KEY_VK_KHR_8BIT_STORAGE)640         extensionNameToEnum.put(KEY_VK_KHR_8BIT_STORAGE, ENUM_KEY_VK_KHR_8BIT_STORAGE);
extensionNameToEnum.put( KEY_VK_KHR_SHADER_INTEGER_DOT_PRODUCT, ENUM_KEY_VK_KHR_SHADER_INTEGER_DOT_PRODUCT)641         extensionNameToEnum.put(
642                 KEY_VK_KHR_SHADER_INTEGER_DOT_PRODUCT, ENUM_KEY_VK_KHR_SHADER_INTEGER_DOT_PRODUCT);
extensionNameToEnum.put(KEY_VK_EXT_INDEX_TYPE_UINT8, ENUM_KEY_VK_EXT_INDEX_TYPE_UINT8)643         extensionNameToEnum.put(KEY_VK_EXT_INDEX_TYPE_UINT8, ENUM_KEY_VK_EXT_INDEX_TYPE_UINT8);
extensionNameToEnum.put(KEY_VK_KHR_INDEX_TYPE_UINT8, ENUM_KEY_VK_KHR_INDEX_TYPE_UINT8)644         extensionNameToEnum.put(KEY_VK_KHR_INDEX_TYPE_UINT8, ENUM_KEY_VK_KHR_INDEX_TYPE_UINT8);
extensionNameToEnum.put(KEY_VK_EXT_LINE_RASTERIZATION, ENUM_KEY_VK_EXT_LINE_RASTERIZATION)645         extensionNameToEnum.put(KEY_VK_EXT_LINE_RASTERIZATION, ENUM_KEY_VK_EXT_LINE_RASTERIZATION);
extensionNameToEnum.put( KEY_VK_EXT_PRIMITIVES_GENERATED_QUERY, ENUM_KEY_VK_EXT_PRIMITIVES_GENERATED_QUERY)646         extensionNameToEnum.put(
647                 KEY_VK_EXT_PRIMITIVES_GENERATED_QUERY, ENUM_KEY_VK_EXT_PRIMITIVES_GENERATED_QUERY);
extensionNameToEnum.put( KEY_VK_KHR_SHADER_FLOAT_CONTROLS, ENUM_KEY_VK_KHR_SHADER_FLOAT_CONTROLS)648         extensionNameToEnum.put(
649                 KEY_VK_KHR_SHADER_FLOAT_CONTROLS, ENUM_KEY_VK_KHR_SHADER_FLOAT_CONTROLS);
extensionNameToEnum.put( KEY_VK_IMG_RELAXED_LINE_RASTERIZATION, ENUM_KEY_VK_IMG_RELAXED_LINE_RASTERIZATION)650         extensionNameToEnum.put(
651                 KEY_VK_IMG_RELAXED_LINE_RASTERIZATION, ENUM_KEY_VK_IMG_RELAXED_LINE_RASTERIZATION);
extensionNameToEnum.put( KEY_VK_KHR_VERTEX_ATTRIBUTE_DIVISOR, ENUM_KEY_VK_KHR_VERTEX_ATTRIBUTE_DIVISOR)652         extensionNameToEnum.put(
653                 KEY_VK_KHR_VERTEX_ATTRIBUTE_DIVISOR, ENUM_KEY_VK_KHR_VERTEX_ATTRIBUTE_DIVISOR);
654     }
655 
656     @Override
collectDeviceInfo(DeviceInfoStore store)657     protected void collectDeviceInfo(DeviceInfoStore store) throws Exception {
658         try {
659             JSONObject instance = new JSONObject(nativeGetVkJSON());
660             emitDeviceGroups(store, instance);
661             emitLayers(store, instance);
662             emitExtensions(store, instance);
663             emitDevices(store, instance);
664 
665             // Access to Instance API version was only added alongside 1.2 support in instance
666             if (instance.getLong(KEY_API_VERSION) >= VK_API_VERSION_1_2) {
667                 emitInstanceApiVersion(store, instance);
668             }
669         } catch (JSONException e) {
670             e.printStackTrace();
671             throw new RuntimeException(e);
672         }
673     }
674 
emitDeviceGroups(DeviceInfoStore store, JSONObject parent)675     private static void emitDeviceGroups(DeviceInfoStore store, JSONObject parent)
676             throws Exception {
677         JSONArray deviceGroups = parent.getJSONArray(KEY_DEVICE_GROUPS);
678         store.startArray(convertName(KEY_DEVICE_GROUPS));
679         for (int deviceGroupIdx = 0; deviceGroupIdx < deviceGroups.length(); deviceGroupIdx++) {
680             JSONObject deviceGroup = deviceGroups.getJSONObject(deviceGroupIdx);
681             store.startGroup();
682             {
683                 emitLongArray(store, deviceGroup, KEY_DEVICES);
684                 emitBoolean(store, deviceGroup, KEY_SUBSET_ALLOCATION);
685             }
686             store.endGroup();
687         }
688         store.endArray();
689     }
690 
emitDevices(DeviceInfoStore store, JSONObject parent)691     private static void emitDevices(DeviceInfoStore store, JSONObject parent)
692             throws Exception {
693         JSONArray devices = parent.getJSONArray(KEY_DEVICES);
694         store.startArray(convertName(KEY_DEVICES));
695         for (int deviceIdx = 0; deviceIdx < devices.length(); deviceIdx++) {
696             JSONObject device = devices.getJSONObject(deviceIdx);
697             store.startGroup();
698             {
699                 JSONObject properties = device.getJSONObject(KEY_PROPERTIES);
700                 store.startGroup(convertName(KEY_PROPERTIES));
701                 {
702                     emitLong(store, properties, KEY_API_VERSION);
703                     emitLong(store, properties, KEY_DRIVER_VERSION);
704                     emitLong(store, properties, KEY_VENDOR_ID);
705                     emitLong(store, properties, KEY_DEVICE_ID);
706                     emitLong(store, properties, KEY_DEVICE_TYPE);
707                     emitString(store, properties, KEY_DEVICE_NAME);
708                     emitLongArray(store, properties, KEY_PIPELINE_CACHE_UUID);
709 
710                     JSONObject limits = properties.getJSONObject(KEY_LIMITS);
711                     store.startGroup(convertName(KEY_LIMITS));
712                     {
713                         emitLong(store, limits, KEY_MAX_IMAGE_DIMENSION_1D);
714                         emitLong(store, limits, KEY_MAX_IMAGE_DIMENSION_2D);
715                         emitLong(store, limits, KEY_MAX_IMAGE_DIMENSION_3D);
716                         emitLong(store, limits, KEY_MAX_IMAGE_DIMENSION_CUBE);
717                         emitLong(store, limits, KEY_MAX_IMAGE_ARRAY_LAYERS);
718                         emitLong(store, limits, KEY_MAX_TEXEL_BUFFER_ELEMENTS);
719                         emitLong(store, limits, KEY_MAX_UNIFORM_BUFFER_RANGE);
720                         emitLong(store, limits, KEY_MAX_STORAGE_BUFFER_RANGE);
721                         emitLong(store, limits, KEY_MAX_PUSH_CONSTANTS_SIZE);
722                         emitLong(store, limits, KEY_MAX_MEMORY_ALLOCATION_COUNT);
723                         emitLong(store, limits, KEY_MAX_SAMPLER_ALLOCATION_COUNT);
724                         emitString(store, limits, KEY_BUFFER_IMAGE_GRANULARITY);
725                         emitString(store, limits, KEY_SPARSE_ADDRESS_SPACE_SIZE);
726                         emitLong(store, limits, KEY_MAX_BOUND_DESCRIPTOR_SETS);
727                         emitLong(store, limits, KEY_MAX_PER_STAGE_DESCRIPTOR_SAMPLERS);
728                         emitLong(store, limits, KEY_MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BUFFERS);
729                         emitLong(store, limits, KEY_MAX_PER_STAGE_DESCRIPTOR_STORAGE_BUFFERS);
730                         emitLong(store, limits, KEY_MAX_PER_STAGE_DESCRIPTOR_SAMPLED_IMAGES);
731                         emitLong(store, limits, KEY_MAX_PER_STAGE_DESCRIPTOR_STORAGE_IMAGES);
732                         emitLong(store, limits, KEY_MAX_PER_STAGE_DESCRIPTOR_INPUT_ATTACHMENTS);
733                         emitLong(store, limits, KEY_MAX_PER_STAGE_RESOURCES);
734                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_SAMPLERS);
735                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS);
736                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC);
737                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_STORAGE_BUFFERS);
738                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC);
739                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_SAMPLED_IMAGES);
740                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_STORAGE_IMAGES);
741                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_INPUT_ATTACHMENTS);
742                         emitLong(store, limits, KEY_MAX_VERTEX_INPUT_ATTRIBUTES);
743                         emitLong(store, limits, KEY_MAX_VERTEX_INPUT_BINDINGS);
744                         emitLong(store, limits, KEY_MAX_VERTEX_INPUT_ATTRIBUTE_OFFSET);
745                         emitLong(store, limits, KEY_MAX_VERTEX_INPUT_BINDING_STRIDE);
746                         emitLong(store, limits, KEY_MAX_VERTEX_OUTPUT_COMPONENTS);
747                         emitLong(store, limits, KEY_MAX_TESSELLATION_GENERATION_LEVEL);
748                         emitLong(store, limits, KEY_MAX_TESSELLATION_PATCH_SIZE);
749                         emitLong(store, limits, KEY_MAX_TESSELLATION_CONTROL_PER_VERTEX_INPUT_COMPONENTS);
750                         emitLong(store, limits, KEY_MAX_TESSELLATION_CONTROL_PER_VERTEX_OUTPUT_COMPONENTS);
751                         emitLong(store, limits, KEY_MAX_TESSELLATION_CONTROL_PER_PATCH_OUTPUT_COMPONENTS);
752                         emitLong(store, limits, KEY_MAX_TESSELLATION_CONTROL_TOTAL_OUTPUT_COMPONENTS);
753                         emitLong(store, limits, KEY_MAX_TESSELLATION_EVALUATION_INPUT_COMPONENTS);
754                         emitLong(store, limits, KEY_MAX_TESSELLATION_EVALUATION_OUTPUT_COMPONENTS);
755                         emitLong(store, limits, KEY_MAX_GEOMETRY_SHADER_INVOCATIONS);
756                         emitLong(store, limits, KEY_MAX_GEOMETRY_INPUT_COMPONENTS);
757                         emitLong(store, limits, KEY_MAX_GEOMETRY_OUTPUT_COMPONENTS);
758                         emitLong(store, limits, KEY_MAX_GEOMETRY_OUTPUT_VERTICES);
759                         emitLong(store, limits, KEY_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS);
760                         emitLong(store, limits, KEY_MAX_FRAGMENT_INPUT_COMPONENTS);
761                         emitLong(store, limits, KEY_MAX_FRAGMENT_OUTPUT_ATTACHMENTS);
762                         emitLong(store, limits, KEY_MAX_FRAGMENT_DUAL_SRC_ATTACHMENTS);
763                         emitLong(store, limits, KEY_MAX_FRAGMENT_COMBINED_OUTPUT_RESOURCES);
764                         emitLong(store, limits, KEY_MAX_COMPUTE_SHARED_MEMORY_SIZE);
765                         emitLongArray(store, limits, KEY_MAX_COMPUTE_WORK_GROUP_COUNT);
766                         emitLong(store, limits, KEY_MAX_COMPUTE_WORK_GROUP_INVOCATIONS);
767                         emitLongArray(store, limits, KEY_MAX_COMPUTE_WORK_GROUP_SIZE);
768                         emitLong(store, limits, KEY_SUB_PIXEL_PRECISION_BITS);
769                         emitLong(store, limits, KEY_SUB_TEXEL_PRECISION_BITS);
770                         emitLong(store, limits, KEY_MIPMAP_PRECISION_BITS);
771                         emitLong(store, limits, KEY_MAX_DRAW_INDEXED_INDEX_VALUE);
772                         emitLong(store, limits, KEY_MAX_DRAW_INDIRECT_COUNT);
773                         emitDouble(store, limits, KEY_MAX_SAMPLER_LOD_BIAS);
774                         emitDouble(store, limits, KEY_MAX_SAMPLER_ANISOTROPY);
775                         emitLong(store, limits, KEY_MAX_VIEWPORTS);
776                         emitLongArray(store, limits, KEY_MAX_VIEWPORT_DIMENSIONS);
777                         emitDoubleArray(store, limits, KEY_VIEWPORT_BOUNDS_RANGE);
778                         emitLong(store, limits, KEY_VIEWPORT_SUB_PIXEL_BITS);
779                         emitString(store, limits, KEY_MIN_MEMORY_MAP_ALIGNMENT);
780                         emitString(store, limits, KEY_MIN_TEXEL_BUFFER_OFFSET_ALIGNMENT);
781                         emitString(store, limits, KEY_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT);
782                         emitString(store, limits, KEY_MIN_STORAGE_BUFFER_OFFSET_ALIGNMENT);
783                         emitLong(store, limits, KEY_MIN_TEXEL_OFFSET);
784                         emitLong(store, limits, KEY_MAX_TEXEL_OFFSET);
785                         emitLong(store, limits, KEY_MIN_TEXEL_GATHER_OFFSET);
786                         emitLong(store, limits, KEY_MAX_TEXEL_GATHER_OFFSET);
787                         emitDouble(store, limits, KEY_MIN_INTERPOLATION_OFFSET);
788                         emitDouble(store, limits, KEY_MAX_INTERPOLATION_OFFSET);
789                         emitLong(store, limits, KEY_SUB_PIXEL_INTERPOLATION_OFFSET_BITS);
790                         emitLong(store, limits, KEY_MAX_FRAMEBUFFER_WIDTH);
791                         emitLong(store, limits, KEY_MAX_FRAMEBUFFER_HEIGHT);
792                         emitLong(store, limits, KEY_MAX_FRAMEBUFFER_LAYERS);
793                         emitLong(store, limits, KEY_FRAMEBUFFER_COLOR_SAMPLE_COUNTS);
794                         emitLong(store, limits, KEY_FRAMEBUFFER_DEPTH_SAMPLE_COUNTS);
795                         emitLong(store, limits, KEY_FRAMEBUFFER_STENCIL_SAMPLE_COUNTS);
796                         emitLong(store, limits, KEY_FRAMEBUFFER_NO_ATTACHMENTS_SAMPLE_COUNTS);
797                         emitLong(store, limits, KEY_MAX_COLOR_ATTACHMENTS);
798                         emitLong(store, limits, KEY_SAMPLED_IMAGE_COLOR_SAMPLE_COUNTS);
799                         emitLong(store, limits, KEY_SAMPLED_IMAGE_INTEGER_SAMPLE_COUNTS);
800                         emitLong(store, limits, KEY_SAMPLED_IMAGE_DEPTH_SAMPLE_COUNTS);
801                         emitLong(store, limits, KEY_SAMPLED_IMAGE_STENCIL_SAMPLE_COUNTS);
802                         emitLong(store, limits, KEY_STORAGE_IMAGE_SAMPLE_COUNTS);
803                         emitLong(store, limits, KEY_MAX_SAMPLE_MASK_WORDS);
804                         emitBoolean(store, limits, KEY_TIMESTAMP_COMPUTE_AND_GRAPHICS);
805                         emitDouble(store, limits, KEY_TIMESTAMP_PERIOD);
806                         emitLong(store, limits, KEY_MAX_CLIP_DISTANCES);
807                         emitLong(store, limits, KEY_MAX_CULL_DISTANCES);
808                         emitLong(store, limits, KEY_MAX_COMBINED_CLIP_AND_CULL_DISTANCES);
809                         emitLong(store, limits, KEY_DISCRETE_QUEUE_PRIORITIES);
810                         emitDoubleArray(store, limits, KEY_POINT_SIZE_RANGE);
811                         emitDoubleArray(store, limits, KEY_LINE_WIDTH_RANGE);
812                         emitDouble(store, limits, KEY_POINT_SIZE_GRANULARITY);
813                         emitDouble(store, limits, KEY_LINE_WIDTH_GRANULARITY);
814                         emitBoolean(store, limits, KEY_STRICT_LINES);
815                         emitBoolean(store, limits, KEY_STANDARD_SAMPLE_LOCATIONS);
816                         emitString(store, limits, KEY_OPTIMAL_BUFFER_COPY_OFFSET_ALIGNMENT);
817                         emitString(store, limits, KEY_OPTIMAL_BUFFER_COPY_ROW_PITCH_ALIGNMENT);
818                         emitString(store, limits, KEY_NON_COHERENT_ATOM_SIZE);
819                     }
820                     store.endGroup();
821 
822                     JSONObject sparse = properties.getJSONObject(KEY_SPARSE_PROPERTIES);
823                     store.startGroup(convertName(KEY_SPARSE_PROPERTIES));
824                     {
825                         emitBoolean(store, sparse, KEY_RESIDENCY_STANDARD_2D_BLOCK_SHAPE);
826                         emitBoolean(store, sparse, KEY_RESIDENCY_STANDARD_2D_MULTISAMPLE_BLOCK_SHAPE);
827                         emitBoolean(store, sparse, KEY_RESIDENCY_STANDARD_3D_BLOCK_SHAPE);
828                         emitBoolean(store, sparse, KEY_RESIDENCY_ALIGNED_MIP_SIZE);
829                         emitBoolean(store, sparse, KEY_RESIDENCY_NON_RESIDENT_STRICT);
830                     }
831                     store.endGroup();
832 
833                     if (properties.getLong(KEY_API_VERSION) >= VK_API_VERSION_1_2) {
834                         JSONObject core11 = device.getJSONObject(KEY_CORE11);
835                         JSONObject vulkan11Properties = core11.getJSONObject(KEY_PROPERTIES);
836                         store.startGroup(convertName(KEY_VULKAN_11_PROPERTIES));
837                         {
838                             emitLong(store, vulkan11Properties, KEY_DEVICE_NODE_MASK);
839                             emitBoolean(store, vulkan11Properties, KEY_DEVICE_LUID_VALID);
840                             emitLong(store, vulkan11Properties, KEY_SUBGROUP_SIZE);
841                             emitBoolean(
842                                     store,
843                                     vulkan11Properties,
844                                     KEY_SUBGROUP_QUAD_OPERATIONS_IN_ALL_STAGES);
845                             emitLong(store, vulkan11Properties, KEY_MAX_MULTIVIEW_INSTANCE_INDEX);
846                             emitLong(store, vulkan11Properties, KEY_MAX_MULTIVIEW_VIEW_COUNT);
847                             emitLong(store, vulkan11Properties, KEY_MAX_PER_SET_DESCRIPTORS);
848                             emitLong(store, vulkan11Properties, KEY_PROTECTED_NO_FAULT);
849 
850                             emitLongArray(store, vulkan11Properties, KEY_DEVICE_LUID);
851 
852                             emitLongArray(store, vulkan11Properties, KEY_DEVICE_UUID);
853                             emitLongArray(store, vulkan11Properties, KEY_DRIVER_UUID);
854                             emitString(store, vulkan11Properties, KEY_MAX_MEMORY_ALLOCATION_SIZE);
855                             emitLong(store, vulkan11Properties, KEY_POINT_CLIPPING_BEHAVIOR);
856                             emitLong(store, vulkan11Properties, KEY_SUBGROUP_SUPPORTED_OPERATIONS);
857                             emitLong(store, vulkan11Properties, KEY_SUBGROUP_SUPPORTED_STAGES);
858                         }
859                         store.endGroup();
860 
861                         JSONObject core12 = device.getJSONObject(KEY_CORE12);
862                         JSONObject vulkan12Properties = core12.getJSONObject(KEY_PROPERTIES);
863                         store.startGroup(convertName(KEY_VULKAN_12_PROPERTIES));
864                         {
865                             emitLong(store, vulkan12Properties, KEY_DRIVER_ID);
866                             emitString(store, vulkan12Properties, KEY_DRIVER_NAME);
867                             emitString(store, vulkan12Properties, KEY_DRIVER_INFO);
868 
869                             JSONObject conformanceVersion = vulkan12Properties.getJSONObject(KEY_CONFORMANCE_VERSION);
870                             store.startGroup(convertName(KEY_CONFORMANCE_VERSION));
871                             {
872                                 emitLong(store, conformanceVersion, KEY_MAJOR);
873                                 emitLong(store, conformanceVersion, KEY_MINOR);
874                                 emitLong(store, conformanceVersion, KEY_SUBMINOR);
875                                 emitLong(store, conformanceVersion, KEY_PATCH);
876                             }
877                             store.endGroup();
878 
879                             emitLong(store, vulkan12Properties, KEY_DENORM_BEHAVIOR_INDEPENDENCE);
880                             emitLong(store, vulkan12Properties, KEY_ROUNDING_MODE_INDEPENDENCE);
881                             emitBoolean(store, vulkan12Properties, KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT16);
882                             emitBoolean(store, vulkan12Properties, KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT32);
883                             emitBoolean(store, vulkan12Properties, KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT64);
884                             emitBoolean(store, vulkan12Properties, KEY_SHADER_DENORM_PRESERVE_FLOAT16);
885                             emitBoolean(store, vulkan12Properties, KEY_SHADER_DENORM_PRESERVE_FLOAT32);
886                             emitBoolean(store, vulkan12Properties, KEY_SHADER_DENORM_PRESERVE_FLOAT64);
887                             emitBoolean(store, vulkan12Properties, KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT16);
888                             emitBoolean(store, vulkan12Properties, KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT32);
889                             emitBoolean(store, vulkan12Properties, KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT64);
890                             emitBoolean(store, vulkan12Properties, KEY_SHADER_ROUNDING_MODE_RTE_FLOAT16);
891                             emitBoolean(store, vulkan12Properties, KEY_SHADER_ROUNDING_MODE_RTE_FLOAT32);
892                             emitBoolean(store, vulkan12Properties, KEY_SHADER_ROUNDING_MODE_RTE_FLOAT64);
893                             emitBoolean(store, vulkan12Properties, KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT16);
894                             emitBoolean(store, vulkan12Properties, KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT32);
895                             emitBoolean(store, vulkan12Properties, KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT64);
896                             emitLong(store, vulkan12Properties, KEY_MAX_UPDATE_AFTER_BIND_DESCRIPTORS_IN_ALL_POOLS);
897                             emitBoolean(store, vulkan12Properties, KEY_SHADER_UNIFORM_BUFFER_ARRAY_NONUNIFORM_INDEXING_NATIVE);
898                             emitBoolean(store, vulkan12Properties, KEY_SHADER_SAMPLED_IMAGE_ARRAY_NONUNIFORM_INDEXING_NATIVE);
899                             emitBoolean(store, vulkan12Properties, KEY_SHADER_STORAGE_BUFFER_ARRAY_NONUNIFORM_INDEXING_NATIVE);
900                             emitBoolean(store, vulkan12Properties, KEY_SHADER_STORAGE_IMAGE_ARRAY_NONUNIFORM_INDEXING_NATIVE);
901                             emitBoolean(store, vulkan12Properties, KEY_SHADER_INPUT_ATTACHMENT_ARRAY_NONUNIFORM_INDEXING_NATIVE);
902                             emitBoolean(store, vulkan12Properties, KEY_ROBUST_BUFFER_ACCESS_UPDATE_AFTER_BIND);
903                             emitBoolean(store, vulkan12Properties, KEY_QUAD_DIVERGENT_IMPLICIT_LOD);
904                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_SAMPLERS);
905                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_UNIFORM_BUFFERS);
906                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_STORAGE_BUFFERS);
907                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_SAMPLED_IMAGES);
908                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_STORAGE_IMAGES);
909                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_INPUT_ATTACHMENTS);
910                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_UPDATE_AFTER_BIND_RESOURCES);
911                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_SAMPLERS);
912                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_UNIFORM_BUFFERS);
913                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_UNIFORM_BUFFERS_DYNAMIC);
914                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_BUFFERS);
915                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_BUFFERS_DYNAMIC);
916                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_SAMPLED_IMAGES);
917                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_IMAGES);
918                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_INPUT_ATTACHMENTS);
919                             emitLong(store, vulkan12Properties, KEY_SUPPORTED_DEPTH_RESOLVE_MODES);
920                             emitLong(store, vulkan12Properties, KEY_SUPPORTED_STENCIL_RESOLVE_MODES);
921                             emitBoolean(store, vulkan12Properties, KEY_INDEPENDENT_RESOLVE_NONE);
922                             emitBoolean(store, vulkan12Properties, KEY_INDEPENDENT_RESOLVE);
923                             emitBoolean(store, vulkan12Properties, KEY_FILTER_MINMAX_SINGLE_COMPONENT_FORMATS);
924                             emitBoolean(store, vulkan12Properties, KEY_FILTER_MINMAX_IMAGE_COMPONENT_MAPPING);
925                             emitString(store, vulkan12Properties, KEY_MAX_TIMELINE_SEMAPHORE_VALUE_DIFFERENCE);
926                             emitLong(store, vulkan12Properties, KEY_FRAMEBUFFER_INTEGER_COLOR_SAMPLE_COUNTS);
927                         }
928                         store.endGroup();
929                     }
930 
931                     if (properties.getLong(KEY_API_VERSION) >= VK_API_VERSION_1_3) {
932                         JSONObject core13 = device.getJSONObject(KEY_CORE13);
933                         JSONObject vulkan13Properties = core13.getJSONObject(KEY_PROPERTIES);
934                         store.startGroup(convertName(KEY_VULKAN_13_PROPERTIES));
935                         {
936                             emitLong(store, vulkan13Properties, KEY_MIN_SUBGROUP_SIZE);
937                             emitLong(store, vulkan13Properties, KEY_MAX_SUBGROUP_SIZE);
938                             emitLong(store, vulkan13Properties, KEY_MAX_COMPUTE_WORKGROUP_SUBGROUPS);
939                             emitLong(store, vulkan13Properties, KEY_REQUIRED_SUBGROUP_SIZE_STAGES);
940                             emitLong(store, vulkan13Properties, KEY_MAX_INLINE_UNIFORM_BLOCK_SIZE);
941                             emitLong(store, vulkan13Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_INLINE_UNIFORM_BLOCKS);
942                             emitLong(store, vulkan13Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_INLINE_UNIFORM_BLOCKS);
943                             emitLong(store, vulkan13Properties, KEY_MAX_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCKS);
944                             emitLong(store, vulkan13Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_INLINE_UNIFORM_BLOCKS);
945                             emitLong(store, vulkan13Properties, KEY_MAX_INLINE_UNIFORM_TOTAL_SIZE);
946                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_8BIT_UNSIGNED_ACCELERATED);
947                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_8BIT_SIGNED_ACCELERATED);
948                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_8BIT_MIXED_SIGNEDNESS_ACCELERATED);
949                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_UNSIGNED_ACCELERATED);
950                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_SIGNED_ACCELERATED);
951                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_MIXED_SIGNEDNESS_ACCELERATED);
952                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_16BIT_UNSIGNED_ACCELERATED);
953                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_16BIT_SIGNED_ACCELERATED);
954                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_16BIT_MIXED_SIGNEDNESS_ACCELERATED);
955                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_32BIT_UNSIGNED_ACCELERATED);
956                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_32BIT_SIGNED_ACCELERATED);
957                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_32BIT_MIXED_SIGNEDNESS_ACCELERATED);
958                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_64BIT_UNSIGNED_ACCELERATED);
959                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_64BIT_SIGNED_ACCELERATED);
960                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_64BIT_MIXED_SIGNEDNESS_ACCELERATED);
961                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_UNSIGNED_ACCELERATED);
962                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_SIGNED_ACCELERATED);
963                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_MIXED_SIGNEDNESS_ACCELERATED);
964                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_UNSIGNED_ACCELERATED);
965                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_SIGNED_ACCELERATED);
966                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_MIXED_SIGNEDNESS_ACCELERATED);
967                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_UNSIGNED_ACCELERATED);
968                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_SIGNED_ACCELERATED);
969                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_MIXED_SIGNEDNESS_ACCELERATED);
970                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_UNSIGNED_ACCELERATED);
971                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_SIGNED_ACCELERATED);
972                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_MIXED_SIGNEDNESS_ACCELERATED);
973                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_UNSIGNED_ACCELERATED);
974                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_SIGNEDNESS_ACCELERATED);
975                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_MIXED_SIGNEDNESS_ACCELERATED);
976                             emitString(store, vulkan13Properties, KEY_STORAGE_TEXEL_BUFFER_OFFSET_ALIGNMENT_BYTES);
977                             emitBoolean(store, vulkan13Properties, KEY_STORAGE_TEXEL_BUFFER_OFFSET_SINGLE_TEXEL_ALIGNMENT);
978                             emitString(store, vulkan13Properties, KEY_UNIFORM_TEXEL_BUFFER_OFFSET_ALIGNMENT_BYTES);
979                             emitBoolean(store, vulkan13Properties, KEY_UNIFORM_TEXEL_BUFFER_OFFSET_SINGLE_TEXEL_ALIGNMENT);
980                             emitString(store, vulkan13Properties, KEY_MAX_BUFFER_SIZE);
981                         }
982                         store.endGroup();
983                     }
984                 }
985                 store.endGroup();
986 
987                 JSONObject features = device.getJSONObject(KEY_FEATURES);
988                 store.startGroup(convertName(KEY_FEATURES));
989                 {
990                     emitBoolean(store, features, KEY_ROBUST_BUFFER_ACCESS);
991                     emitBoolean(store, features, KEY_FULL_DRAW_INDEX_UINT32);
992                     emitBoolean(store, features, KEY_IMAGE_CUBE_ARRAY);
993                     emitBoolean(store, features, KEY_INDEPENDENT_BLEND);
994                     emitBoolean(store, features, KEY_GEOMETRY_SHADER);
995                     emitBoolean(store, features, KEY_TESSELLATION_SHADER);
996                     emitBoolean(store, features, KEY_SAMPLE_RATE_SHADING);
997                     emitBoolean(store, features, KEY_DUAL_SRC_BLEND);
998                     emitBoolean(store, features, KEY_LOGIC_OP);
999                     emitBoolean(store, features, KEY_MULTI_DRAW_INDIRECT);
1000                     emitBoolean(store, features, KEY_DRAW_INDIRECT_FIRST_INSTANCE);
1001                     emitBoolean(store, features, KEY_DEPTH_CLAMP);
1002                     emitBoolean(store, features, KEY_DEPTH_BIAS_CLAMP);
1003                     emitBoolean(store, features, KEY_FILL_MODE_NON_SOLID);
1004                     emitBoolean(store, features, KEY_DEPTH_BOUNDS);
1005                     emitBoolean(store, features, KEY_WIDE_LINES);
1006                     emitBoolean(store, features, KEY_LARGE_POINTS);
1007                     emitBoolean(store, features, KEY_ALPHA_TO_ONE);
1008                     emitBoolean(store, features, KEY_MULTI_VIEWPORT);
1009                     emitBoolean(store, features, KEY_SAMPLER_ANISOTROPY);
1010                     emitBoolean(store, features, KEY_TEXTURE_COMPRESSION_ETC2);
1011                     emitBoolean(store, features, KEY_TEXTURE_COMPRESSION_ASTC_LDR);
1012                     emitBoolean(store, features, KEY_TEXTURE_COMPRESSION_BC);
1013                     emitBoolean(store, features, KEY_OCCLUSION_QUERY_PRECISE);
1014                     emitBoolean(store, features, KEY_PIPELINE_STATISTICS_QUERY);
1015                     emitBoolean(store, features, KEY_VERTEX_PIPELINE_STORES_AND_ATOMICS);
1016                     emitBoolean(store, features, KEY_FRAGMENT_STORES_AND_ATOMICS);
1017                     emitBoolean(store, features, KEY_SHADER_TESSELLATION_AND_GEOMETRY_POINT_SIZE);
1018                     emitBoolean(store, features, KEY_SHADER_IMAGE_GATHER_EXTENDED);
1019                     emitBoolean(store, features, KEY_SHADER_STORAGE_IMAGE_EXTENDED_FORMATS);
1020                     emitBoolean(store, features, KEY_SHADER_STORAGE_IMAGE_MULTISAMPLE);
1021                     emitBoolean(store, features, KEY_SHADER_STORAGE_IMAGE_READ_WITHOUT_FORMAT);
1022                     emitBoolean(store, features, KEY_SHADER_STORAGE_IMAGE_WRITE_WITHOUT_FORMAT);
1023                     emitBoolean(store, features, KEY_SHADER_UNIFORM_BUFFER_ARRAY_DYNAMIC_INDEXING);
1024                     emitBoolean(store, features, KEY_SHADER_SAMPLED_IMAGE_ARRAY_DYNAMIC_INDEXING);
1025                     emitBoolean(store, features, KEY_SHADER_STORAGE_BUFFER_ARRAY_DYNAMIC_INDEXING);
1026                     emitBoolean(store, features, KEY_SHADER_STORAGE_IMAGE_ARRAY_DYNAMIC_INDEXING);
1027                     emitBoolean(store, features, KEY_SHADER_CLIP_DISTANCE);
1028                     emitBoolean(store, features, KEY_SHADER_CULL_DISTANCE);
1029                     emitBoolean(store, features, KEY_SHADER_FLOAT64);
1030                     emitBoolean(store, features, KEY_SHADER_INT64);
1031                     emitBoolean(store, features, KEY_SHADER_INT16);
1032                     emitBoolean(store, features, KEY_SHADER_RESOURCE_RESIDENCY);
1033                     emitBoolean(store, features, KEY_SHADER_RESOURCE_MIN_LOD);
1034                     emitBoolean(store, features, KEY_SPARSE_BINDING);
1035                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_BUFFER);
1036                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_IMAGE_2D);
1037                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_IMAGE_3D);
1038                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_2_SAMPLES);
1039                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_4_SAMPLES);
1040                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_8_SAMPLES);
1041                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_16_SAMPLES);
1042                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_ALIASED);
1043                     emitBoolean(store, features, KEY_VARIABLE_MULTISAMPLE_RATE);
1044                     emitBoolean(store, features, KEY_INHERITED_QUERIES);
1045 
1046 
1047                     if (properties.getLong(KEY_API_VERSION) >= VK_API_VERSION_1_2) {
1048                         JSONObject core11 = device.getJSONObject(KEY_CORE11);
1049                         JSONObject vulkan11Features = core11.getJSONObject(KEY_FEATURES);
1050                         store.startGroup(convertName(KEY_VULKAN_11_FEATURES));
1051                         {
1052                             emitBoolean(store, vulkan11Features, KEY_MULTIVIEW);
1053                             emitBoolean(store, vulkan11Features, KEY_MULTIVIEW_GEOMETRY_SHADER);
1054                             emitBoolean(store, vulkan11Features, KEY_MULTIVIEW_TESSELLATION_SHADER);
1055                             emitBoolean(store, vulkan11Features, KEY_PROTECTED_MEMORY);
1056                             emitBoolean(store, vulkan11Features, KEY_SAMPLER_YCBCR_CONVERSION);
1057                             emitBoolean(store, vulkan11Features, KEY_SHADER_DRAW_PARAMETERS);
1058                             emitBoolean(store, vulkan11Features, KEY_STORAGE_BUFFER_16BIT_ACCESS);
1059                             emitBoolean(store, vulkan11Features, KEY_STORAGE_INPUT_OUTPUT_16);
1060                             emitBoolean(store, vulkan11Features, KEY_STORAGE_PUSH_CONSTANT_16);
1061                             emitBoolean(store, vulkan11Features, KEY_UNIFORM_AND_STORAGE_BUFFER_16BIT_ACCESS);
1062                             emitBoolean(store, vulkan11Features, KEY_VARIABLE_POINTERS);
1063                             emitBoolean(store, vulkan11Features, KEY_VARIABLE_POINTERS_STORAGE_BUFFER);
1064                         }
1065                         store.endGroup();
1066 
1067                         JSONObject core12 = device.getJSONObject(KEY_CORE12);
1068                         JSONObject vulkan12Features = core12.getJSONObject(KEY_FEATURES);
1069                         store.startGroup(convertName(KEY_VULKAN_12_FEATURES));
1070                         {
1071                             emitBoolean(store, vulkan12Features, KEY_SAMPLER_MIRROR_CLAMP_TO_EDGE);
1072                             emitBoolean(store, vulkan12Features, KEY_DRAW_INDIRECT_COUNT);
1073                             emitBoolean(store, vulkan12Features, KEY_STORAGE_BUFFER_8BIT_ACCESS);
1074                             emitBoolean(store, vulkan12Features, KEY_UNIFORM_AND_STORAGE_BUFFER_8BIT_ACCESS);
1075                             emitBoolean(store, vulkan12Features, KEY_STORAGE_PUSH_CONSTANT8);
1076                             emitBoolean(store, vulkan12Features, KEY_SHADER_BUFFER_INT64_ATOMICS);
1077                             emitBoolean(store, vulkan12Features, KEY_SHADER_SHARED_INT64_ATOMICS);
1078                             emitBoolean(store, vulkan12Features, KEY_SHADER_FLOAT16);
1079                             emitBoolean(store, vulkan12Features, KEY_SHADER_INT8);
1080                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_INDEXING);
1081                             emitBoolean(store, vulkan12Features, KEY_SHADER_INPUT_ATTACHMENT_ARRAY_DYNAMIC_INDEXING);
1082                             emitBoolean(store, vulkan12Features, KEY_SHADER_UNIFORM_TEXEL_BUFFER_ARRAY_DYNAMIC_INDEXING);
1083                             emitBoolean(store, vulkan12Features, KEY_SHADER_STORAGE_TEXEL_BUFFER_ARRAY_DYNAMIC_INDEXING);
1084                             emitBoolean(store, vulkan12Features, KEY_SHADER_UNIFORM_BUFFER_ARRAY_NON_UNIFORM_INDEXING);
1085                             emitBoolean(store, vulkan12Features, KEY_SHADER_SAMPLED_IMAGE_ARRAY_NON_UNIFORM_INDEXING);
1086                             emitBoolean(store, vulkan12Features, KEY_SHADER_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING);
1087                             emitBoolean(store, vulkan12Features, KEY_SHADER_STORAGE_IMAGE_ARRAY_NON_UNIFORM_INDEXING);
1088                             emitBoolean(store, vulkan12Features, KEY_SHADER_INPUT_ATTACHMENT_ARRAY_NON_UNIFORM_INDEXING);
1089                             emitBoolean(store, vulkan12Features, KEY_SHADER_UNIFORM_TEXEL_BUFFER_ARRAY_NON_UNIFORM_INDEXING);
1090                             emitBoolean(store, vulkan12Features, KEY_SHADER_STORAGE_TEXEL_BUFFER_ARRAY_NON_UNIFORM_INDEXING);
1091                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_UNIFORM_BUFFER_UPDATE_AFTER_BIND);
1092                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_SAMPLED_IMAGE_UPDATE_AFTER_BIND);
1093                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_STORAGE_IMAGE_UPDATE_AFTER_BIND);
1094                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_STORAGE_BUFFER_UPDATE_AFTER_BIND);
1095                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_UNIFORM_TEXEL_BUFFER_UPDATE_AFTER_BIND);
1096                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_STORAGE_TEXEL_BUFFER_UPDATE_AFTER_BIND);
1097                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING);
1098                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_PARTIALLY_BOUND);
1099                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT);
1100                             emitBoolean(store, vulkan12Features, KEY_RUNTIME_DESCRIPTOR_ARRAY);
1101                             emitBoolean(store, vulkan12Features, KEY_SAMPLER_FILTER_MINMAX);
1102                             emitBoolean(store, vulkan12Features, KEY_SCALAR_BLOCK_LAYOUT);
1103                             emitBoolean(store, vulkan12Features, KEY_IMAGELESS_FRAMEBUFFER);
1104                             emitBoolean(store, vulkan12Features, KEY_UNIFORM_BUFFER_STANDARD_LAYOUT);
1105                             emitBoolean(store, vulkan12Features, KEY_SHADER_SUBGROUP_EXTENDED_TYPES);
1106                             emitBoolean(store, vulkan12Features, KEY_SEPARATE_DEPTH_STENCIL_LAYOUTS);
1107                             emitBoolean(store, vulkan12Features, KEY_HOST_QUERY_RESET);
1108                             emitBoolean(store, vulkan12Features, KEY_TIMELINE_SEMAPHORE);
1109                             emitBoolean(store, vulkan12Features, KEY_BUFFER_DEVICE_ADDRESS);
1110                             emitBoolean(store, vulkan12Features, KEY_BUFFER_DEVICE_ADDRESS_CAPTURE_REPLAY);
1111                             emitBoolean(store, vulkan12Features, KEY_BUFFER_DEVICE_ADDRESS_MULTI_DEVICE);
1112                             emitBoolean(store, vulkan12Features, KEY_VULKAN_MEMORY_MODEL);
1113                             emitBoolean(store, vulkan12Features, KEY_VULKAN_MEMORY_MODEL_DEVICE_SCOPE);
1114                             emitBoolean(store, vulkan12Features, KEY_VULKAN_MEMORY_MODEL_AVAILABILITY_VISIBILITY_CHAINS);
1115                             emitBoolean(store, vulkan12Features, KEY_SHADER_OUTPUT_VIEWPORT_INDEX);
1116                             emitBoolean(store, vulkan12Features, KEY_SHADER_OUTPUT_LAYER);
1117                             // subgroupBroadcastDynamicId was erroneously left out of vkjson reporting in Android T
1118                             //   and later added in U, so we need to explicitly check if the feature is reported
1119                             if (vulkan12Features.has(KEY_SUBGROUP_BROADCAST_DYNAMIC_ID)) {
1120                                 emitBoolean(store, vulkan12Features, KEY_SUBGROUP_BROADCAST_DYNAMIC_ID);
1121                             }
1122                         }
1123                         store.endGroup();
1124                     }
1125 
1126                     if (properties.getLong(KEY_API_VERSION) >= VK_API_VERSION_1_3) {
1127                         JSONObject core13 = device.getJSONObject(KEY_CORE13);
1128                         JSONObject vulkan13Features = core13.getJSONObject(KEY_FEATURES);
1129                         store.startGroup(convertName(KEY_VULKAN_13_FEATURES));
1130                         {
1131                             emitBoolean(store, vulkan13Features, KEY_ROBUST_IMAGE_ACCESS);
1132                             emitBoolean(store, vulkan13Features, KEY_INLINE_UNIFORM_BLOCK);
1133                             emitBoolean(store, vulkan13Features, KEY_DESCRIPTOR_BINDING_INLINE_UNIFORM_BLOCK_UPDATE_AFTER_BIND);
1134                             emitBoolean(store, vulkan13Features, KEY_PIPELINE_CREATION_CACHE_CONTROL);
1135                             emitBoolean(store, vulkan13Features, KEY_PRIVATE_DATA);
1136                             emitBoolean(store, vulkan13Features, KEY_SHADER_DEMOTE_TO_HELPER_INVOCATION);
1137                             emitBoolean(store, vulkan13Features, KEY_SHADER_TERMINATE_INVOCATION);
1138                             emitBoolean(store, vulkan13Features, KEY_SUBGROUP_SIZE_CONTROL);
1139                             emitBoolean(store, vulkan13Features, KEY_COMPUTE_FULL_SUBGROUPS);
1140                             emitBoolean(store, vulkan13Features, KEY_SYNCHRONIZATION2);
1141                             emitBoolean(store, vulkan13Features, KEY_TEXTURE_COMPRESSION_ASTC_HDR);
1142                             emitBoolean(store, vulkan13Features, KEY_SHADER_ZERO_INITIALIZE_WORKGROUP_MEMORY);
1143                             emitBoolean(store, vulkan13Features, KEY_DYNAMIC_RENDERING);
1144                             emitBoolean(store, vulkan13Features, KEY_SHADER_INTEGER_DOT_PRODUCT);
1145                             emitBoolean(store, vulkan13Features, KEY_MAINTENANCE4);
1146                         }
1147                         store.endGroup();
1148                     }
1149                 }
1150                 store.endGroup();
1151 
1152                 JSONObject memory = device.getJSONObject(KEY_MEMORY);
1153                 store.startGroup(convertName(KEY_MEMORY));
1154                 {
1155                     emitLong(store, memory, KEY_MEMORY_TYPE_COUNT);
1156                     JSONArray memoryTypes = memory.getJSONArray(KEY_MEMORY_TYPES);
1157                     store.startArray(convertName(KEY_MEMORY_TYPES));
1158                     for (int memoryTypeIdx = 0; memoryTypeIdx < memoryTypes.length();
1159                             memoryTypeIdx++) {
1160                         JSONObject memoryType = memoryTypes.getJSONObject(memoryTypeIdx);
1161                         store.startGroup();
1162                         {
1163                             emitLong(store, memoryType, KEY_PROPERTY_FLAGS);
1164                             emitLong(store, memoryType, KEY_HEAP_INDEX);
1165                         }
1166                         store.endGroup();
1167                     }
1168                     store.endArray();
1169 
1170                     emitLong(store, memory, KEY_MEMORY_HEAP_COUNT);
1171                     JSONArray memoryHeaps = memory.getJSONArray(KEY_MEMORY_HEAPS);
1172                     store.startArray(convertName(KEY_MEMORY_HEAPS));
1173                     for (int memoryHeapIdx = 0; memoryHeapIdx < memoryHeaps.length();
1174                             memoryHeapIdx++) {
1175                         JSONObject memoryHeap = memoryHeaps.getJSONObject(memoryHeapIdx);
1176                         store.startGroup();
1177                         {
1178                             emitString(store, memoryHeap, KEY_SIZE);
1179                             emitLong(store, memoryHeap, KEY_FLAGS);
1180                         }
1181                         store.endGroup();
1182                     }
1183                     store.endArray();
1184                 }
1185                 store.endGroup();
1186 
1187                 JSONArray queues = device.getJSONArray(KEY_QUEUES);
1188                 store.startArray(convertName(KEY_QUEUES));
1189                 for (int queueIdx = 0; queueIdx < queues.length(); queueIdx++) {
1190                     JSONObject queue = queues.getJSONObject(queueIdx);
1191                     store.startGroup();
1192                     {
1193                         emitLong(store, queue, KEY_QUEUE_FLAGS);
1194                         emitLong(store, queue, KEY_QUEUE_COUNT);
1195                         emitLong(store, queue, KEY_TIMESTAMP_VALID_BITS);
1196                         JSONObject extent = queue.getJSONObject(KEY_MIN_IMAGE_TRANSFER_GRANULARITY);
1197                         store.startGroup(convertName(KEY_MIN_IMAGE_TRANSFER_GRANULARITY));
1198                         {
1199                             emitLong(store, extent, KEY_WIDTH);
1200                             emitLong(store, extent, KEY_HEIGHT);
1201                             emitLong(store, extent, KEY_DEPTH);
1202                         }
1203                         store.endGroup();
1204                     }
1205                     store.endGroup();
1206                 }
1207                 store.endArray();
1208 
1209                 // Skip layers for now. VkJSON doesn't yet include device layer extensions, so
1210                 // this is entirely redundant with the instance extension information.
1211                 // emitLayers(store, device);
1212                 store.startArray(convertName(KEY_LAYERS));
1213                 store.endArray();
1214 
1215                 emitExtensions(store, device);
1216 
1217                 JSONArray formats = device.getJSONArray(KEY_FORMATS);
1218                 // Note: Earlier code used field named 'formats' with different data structure.
1219                 // In order to have the mix of old and new data, we cannot reuse that name.
1220                 store.startArray("supported_formats");
1221                 for (int formatIdx = 0; formatIdx < formats.length(); formatIdx++) {
1222                     JSONArray formatPair = formats.getJSONArray(formatIdx);
1223                     JSONObject formatProperties = formatPair.getJSONObject(1);
1224                     store.startGroup();
1225                     {
1226                         store.addResult("format", (long)formatPair.getInt(0));
1227                         emitLong(store, formatProperties, KEY_LINEAR_TILING_FEATURES);
1228                         emitLong(store, formatProperties, KEY_OPTIMAL_TILING_FEATURES);
1229                         emitLong(store, formatProperties, KEY_BUFFER_FEATURES);
1230                     }
1231                     store.endGroup();
1232                 }
1233                 store.endArray();
1234 
1235                 if (properties.getLong(KEY_API_VERSION) >= VK_API_VERSION_1_1) {
1236                     JSONObject subgroupProperties = device.getJSONObject(KEY_SUBGROUP_PROPERTIES);
1237                     store.startGroup(convertName(KEY_SUBGROUP_PROPERTIES));
1238                     {
1239                         emitLong(store, subgroupProperties, KEY_SUBGROUP_SIZE);
1240                         emitLong(store, subgroupProperties, KEY_SUPPORTED_STAGES);
1241                         emitLong(store, subgroupProperties, KEY_SUPPORTED_OPERATIONS);
1242                         emitBoolean(store, subgroupProperties, KEY_QUAD_OPERATIONS_IN_ALL_STAGES);
1243                     }
1244                     store.endGroup();
1245 
1246                     JSONObject pointClippingProperties = device.getJSONObject(KEY_POINT_CLIPPING_PROPERTIES);
1247                     store.startGroup(convertName(KEY_POINT_CLIPPING_PROPERTIES));
1248                     {
1249                         emitLong(store, pointClippingProperties, KEY_POINT_CLIPPING_BEHAVIOR);
1250                     }
1251                     store.endGroup();
1252 
1253                     JSONObject multiviewProperties = device.getJSONObject(KEY_MULTIVIEW_PROPERTIES);
1254                     store.startGroup(convertName(KEY_MULTIVIEW_PROPERTIES));
1255                     {
1256                         emitLong(store, multiviewProperties, KEY_MAX_MULTIVIEW_VIEW_COUNT);
1257                         emitLong(store, multiviewProperties, KEY_MAX_MULTIVIEW_INSTANCE_INDEX);
1258                     }
1259                     store.endGroup();
1260 
1261                     JSONObject idProperties = device.getJSONObject(KEY_ID_PROPERTIES);
1262                     store.startGroup(convertName(KEY_ID_PROPERTIES));
1263                     {
1264                         emitLongArray(store, idProperties, KEY_DEVICE_UUID);
1265                         emitLongArray(store, idProperties, KEY_DRIVER_UUID);
1266                         emitLongArray(store, idProperties, KEY_DEVICE_LUID);
1267                         emitLong(store, idProperties, KEY_DEVICE_NODE_MASK);
1268                         emitBoolean(store, idProperties, KEY_DEVICE_LUID_VALID);
1269                     }
1270                     store.endGroup();
1271 
1272                     JSONObject maintenance3Properties = device.getJSONObject(KEY_MAINTENANCE_3_PROPERTIES);
1273                     store.startGroup(convertName(KEY_MAINTENANCE_3_PROPERTIES));
1274                     {
1275                         emitLong(store, maintenance3Properties, KEY_MAX_PER_SET_DESCRIPTORS);
1276                         emitString(store, maintenance3Properties, KEY_MAX_MEMORY_ALLOCATION_SIZE);
1277                     }
1278                     store.endGroup();
1279 
1280                     JSONObject bit16StorageFeatures = device.getJSONObject(KEY_BIT16_STORAGE_FEATURES);
1281                     store.startGroup(convertName(KEY_BIT16_STORAGE_FEATURES));
1282                     {
1283                         emitBoolean(store, bit16StorageFeatures, KEY_STORAGE_BUFFER_16BIT_ACCESS);
1284                         emitBoolean(store, bit16StorageFeatures, KEY_UNIFORM_AND_STORAGE_BUFFER_16BIT_ACCESS);
1285                         emitBoolean(store, bit16StorageFeatures, KEY_STORAGE_PUSH_CONSTANT_16);
1286                         emitBoolean(store, bit16StorageFeatures, KEY_STORAGE_INPUT_OUTPUT_16);
1287                     }
1288                     store.endGroup();
1289 
1290                     JSONObject multiviewFeatures = device.getJSONObject(KEY_MULTIVIEW_FEATURES);
1291                     store.startGroup(convertName(KEY_MULTIVIEW_FEATURES));
1292                     {
1293                         emitBoolean(store, multiviewFeatures, KEY_MULTIVIEW);
1294                         emitBoolean(store, multiviewFeatures, KEY_MULTIVIEW_GEOMETRY_SHADER);
1295                         emitBoolean(store, multiviewFeatures, KEY_MULTIVIEW_TESSELLATION_SHADER);
1296                     }
1297                     store.endGroup();
1298 
1299                     JSONObject variablePointersFeatures = device.getJSONObject(KEY_VARIABLE_POINTERS_FEATURES);
1300                     store.startGroup(convertName(KEY_VARIABLE_POINTERS_FEATURES));
1301                     {
1302                         emitBoolean(store, variablePointersFeatures, KEY_VARIABLE_POINTERS_STORAGE_BUFFER);
1303                         emitBoolean(store, variablePointersFeatures, KEY_VARIABLE_POINTERS);
1304                     }
1305                     store.endGroup();
1306 
1307                     JSONObject protectedMemoryFeatures = device.getJSONObject(KEY_PROTECTED_MEMORY_FEATURES);
1308                     store.startGroup(convertName(KEY_PROTECTED_MEMORY_FEATURES));
1309                     {
1310                         emitBoolean(store, protectedMemoryFeatures, KEY_PROTECTED_MEMORY);
1311                     }
1312                     store.endGroup();
1313 
1314                     JSONObject samplerYcbcrConversionFeatures = device.getJSONObject(KEY_SAMPLER_YCBCR_CONVERSION_FEATURES);
1315                     store.startGroup(convertName(KEY_SAMPLER_YCBCR_CONVERSION_FEATURES));
1316                     {
1317                         emitBoolean(store, samplerYcbcrConversionFeatures, KEY_SAMPLER_YCBCR_CONVERSION);
1318                     }
1319                     store.endGroup();
1320 
1321                     JSONObject shaderDrawParameterFeatures = device.getJSONObject(KEY_SHADER_DRAW_PARAMETER_FEATURES);
1322                     store.startGroup(convertName(KEY_SHADER_DRAW_PARAMETER_FEATURES));
1323                     {
1324                         emitBoolean(store, shaderDrawParameterFeatures, KEY_SHADER_DRAW_PARAMETERS);
1325                     }
1326                     store.endGroup();
1327 
1328                     JSONArray externalFences = device.getJSONArray(KEY_EXTERNAL_FENCE_PROPERTIES);
1329                     store.startArray(convertName(KEY_EXTERNAL_FENCE_PROPERTIES));
1330                     for (int idx = 0; idx < externalFences.length(); ++idx) {
1331                         JSONArray externalFencePair = externalFences.getJSONArray(idx);
1332                         JSONObject externalFenceProperties = externalFencePair.getJSONObject(1);
1333                         store.startGroup();
1334                         {
1335                             store.addResult("handle_type", externalFencePair.getLong(0));
1336                             emitLong(store, externalFenceProperties, KEY_EXPORT_FROM_IMPORTED_HANDLE_TYPES);
1337                             emitLong(store, externalFenceProperties, KEY_COMPATIBLE_HANDLE_TYPES);
1338                             emitLong(store, externalFenceProperties, KEY_EXTERNAL_FENCE_FEATURES);
1339                         }
1340                         store.endGroup();
1341                     }
1342                     store.endArray();
1343 
1344                     JSONArray externalSemaphores = device.getJSONArray(KEY_EXTERNAL_SEMAPHORE_PROPERTIES);
1345                     store.startArray(convertName(KEY_EXTERNAL_SEMAPHORE_PROPERTIES));
1346                     for (int idx = 0; idx < externalSemaphores.length(); ++idx) {
1347                         JSONArray externalSemaphorePair = externalSemaphores.getJSONArray(idx);
1348                         JSONObject externalSemaphoreProperties = externalSemaphorePair.getJSONObject(1);
1349                         store.startGroup();
1350                         {
1351                             store.addResult("handle_type", externalSemaphorePair.getLong(0));
1352                             emitLong(store, externalSemaphoreProperties, KEY_EXPORT_FROM_IMPORTED_HANDLE_TYPES);
1353                             emitLong(store, externalSemaphoreProperties, KEY_COMPATIBLE_HANDLE_TYPES);
1354                             emitLong(store, externalSemaphoreProperties, KEY_EXTERNAL_SEMAPHORE_FEATURES);
1355                         }
1356                         store.endGroup();
1357                     }
1358                     store.endArray();
1359                 }
1360             }
1361             store.endGroup();
1362         }
1363         store.endArray();
1364     }
1365 
emitLayers(DeviceInfoStore store, JSONObject parent)1366     private static void emitLayers(DeviceInfoStore store, JSONObject parent)
1367             throws Exception {
1368         JSONArray layers = parent.getJSONArray(KEY_LAYERS);
1369         store.startArray(convertName(KEY_LAYERS));
1370         for (int i = 0; i < layers.length(); i++) {
1371             JSONObject layer = layers.getJSONObject(i);
1372             store.startGroup();
1373             {
1374                 JSONObject properties = layer.getJSONObject(KEY_PROPERTIES);
1375                 store.startGroup(convertName(KEY_PROPERTIES));
1376                 {
1377                     emitString(store, properties, KEY_LAYER_NAME);
1378                     emitLong(store, properties, KEY_SPEC_VERSION);
1379                     emitLong(store, properties, KEY_IMPLEMENTATION_VERSION);
1380                     emitString(store, properties, KEY_DESCRIPTION);
1381                 }
1382                 store.endGroup();
1383                 emitExtensions(store, layer);
1384             }
1385             store.endGroup();
1386         }
1387         store.endArray();
1388     }
1389 
emitInstanceApiVersion(DeviceInfoStore store, JSONObject parent)1390     private static void emitInstanceApiVersion(DeviceInfoStore store, JSONObject parent)
1391             throws Exception {
1392         store.addResult(convertName(KEY_INSTANCE_API_VERSION), parent.getLong(KEY_API_VERSION));
1393     }
1394 
emitDriverPropertiesKHR(DeviceInfoStore store, JSONObject parent)1395     private static void emitDriverPropertiesKHR(DeviceInfoStore store, JSONObject parent)
1396             throws Exception {
1397         try {
1398             JSONObject extDriverProperties = parent.getJSONObject(KEY_VK_KHR_DRIVER_PROPERTIES);
1399             try {
1400                 store.startGroup(convertName(KEY_VK_KHR_DRIVER_PROPERTIES));
1401                 {
1402                     JSONObject driverPropertiesKHR = extDriverProperties.getJSONObject(KEY_DRIVER_PROPERTIES_KHR);
1403                     store.startGroup(convertName(KEY_DRIVER_PROPERTIES_KHR));
1404                     {
1405                         emitLong(store, driverPropertiesKHR, KEY_DRIVER_ID);
1406                         emitString(store, driverPropertiesKHR, KEY_DRIVER_NAME);
1407                         emitString(store, driverPropertiesKHR, KEY_DRIVER_INFO);
1408 
1409                         JSONObject conformanceVersion = driverPropertiesKHR.getJSONObject(KEY_CONFORMANCE_VERSION);
1410                         store.startGroup(convertName(KEY_CONFORMANCE_VERSION));
1411                         {
1412                             emitLong(store, conformanceVersion, KEY_MAJOR);
1413                             emitLong(store, conformanceVersion, KEY_MINOR);
1414                             emitLong(store, conformanceVersion, KEY_SUBMINOR);
1415                             emitLong(store, conformanceVersion, KEY_PATCH);
1416                         }
1417                         store.endGroup();
1418                     }
1419                     store.endGroup();
1420                 }
1421                 store.endGroup();
1422             } catch (JSONException e) {
1423                 e.printStackTrace();
1424                 throw new RuntimeException(e);
1425             }
1426         } catch (JSONException ok) {
1427             // The tag is not present in vkjson; that's fine, just continue
1428         }
1429     }
1430 
emitVariablePointerFeaturesKHR(DeviceInfoStore store, JSONObject parent)1431     private static void emitVariablePointerFeaturesKHR(DeviceInfoStore store, JSONObject parent)
1432             throws Exception {
1433         try {
1434             JSONObject extVariablePointerFeatures = parent.getJSONObject(KEY_VK_KHR_VARIABLE_POINTERS);
1435             try {
1436                 store.startGroup(convertName(KEY_VK_KHR_VARIABLE_POINTERS));
1437                 {
1438                     JSONObject variablePointerFeaturesKHR = extVariablePointerFeatures.getJSONObject(KEY_VARIABLE_POINTER_FEATURES_KHR);
1439                     store.startGroup(convertName(KEY_VARIABLE_POINTER_FEATURES_KHR));
1440                     {
1441                         emitBoolean(store, variablePointerFeaturesKHR, KEY_VARIABLE_POINTERS_STORAGE_BUFFER);
1442                         emitBoolean(store, variablePointerFeaturesKHR, KEY_VARIABLE_POINTERS);
1443                     }
1444                     store.endGroup();
1445                     JSONObject variablePointersFeaturesKHR = extVariablePointerFeatures.getJSONObject(KEY_VARIABLE_POINTERS_FEATURES_KHR);
1446                     store.startGroup(convertName(KEY_VARIABLE_POINTERS_FEATURES_KHR));
1447                     {
1448                         emitBoolean(store, variablePointersFeaturesKHR, KEY_VARIABLE_POINTERS_STORAGE_BUFFER);
1449                         emitBoolean(store, variablePointersFeaturesKHR, KEY_VARIABLE_POINTERS);
1450                     }
1451                     store.endGroup();
1452                 }
1453                 store.endGroup();
1454             } catch (JSONException e) {
1455                 e.printStackTrace();
1456                 throw new RuntimeException(e);
1457             }
1458         } catch (JSONException ok) {
1459             // The tag is not present in vkjson; that's fine, just continue
1460 
1461         }
1462     }
1463 
emitImage2DViewOf3DFeaturesEXT(DeviceInfoStore store, JSONObject parent)1464     private static void emitImage2DViewOf3DFeaturesEXT(DeviceInfoStore store, JSONObject parent)
1465             throws Exception {
1466         try {
1467             JSONObject extImage2DViewOf3DFeatures = parent.getJSONObject(KEY_VK_EXT_IMAGE_2D_VIEW_OF_3D);
1468             try {
1469                 store.startGroup(convertName(KEY_VK_EXT_IMAGE_2D_VIEW_OF_3D));
1470                 {
1471                     JSONObject image2DViewOf3DFeaturesEXT = extImage2DViewOf3DFeatures.getJSONObject(KEY_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT);
1472                     store.startGroup(convertName(KEY_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT));
1473                     {
1474                         emitBoolean(store, image2DViewOf3DFeaturesEXT, KEY_IMAGE_2D_VIEW_OF_3D);
1475                         emitBoolean(store, image2DViewOf3DFeaturesEXT, KEY_SAMPLER_2D_VIEW_OF_3D);
1476                     }
1477                     store.endGroup();
1478                 }
1479                 store.endGroup();
1480             } catch (JSONException e) {
1481                 e.printStackTrace();
1482                 throw new RuntimeException(e);
1483             }
1484         } catch (JSONException ok) {
1485             // The tag is not present in vkjson; that's fine, just continue
1486         }
1487     }
1488 
emitVertexAttributeDivisorFeaturesKHR(DeviceInfoStore store, JSONObject parent)1489     private static void emitVertexAttributeDivisorFeaturesKHR(DeviceInfoStore store, JSONObject parent)
1490             throws Exception {
1491         try {
1492             JSONObject khrVertexAttributeDivisorFeatures = parent.getJSONObject(KEY_VK_KHR_VERTEX_ATTRIBUTE_DIVISOR);
1493             try {
1494                 store.startGroup(convertName(KEY_VK_KHR_VERTEX_ATTRIBUTE_DIVISOR));
1495                 {
1496                     JSONObject vertexAttributeDivisorFeaturesKHR = khrVertexAttributeDivisorFeatures.getJSONObject(KEY_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR);
1497                     store.startGroup(convertName(KEY_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR));
1498                     {
1499                         emitBoolean(store, vertexAttributeDivisorFeaturesKHR, KEY_VERTEX_ATTRIBUTE_INSTANCE_RATE_DIVISOR);
1500                         emitBoolean(store, vertexAttributeDivisorFeaturesKHR, KEY_VERTEX_ATTRIBUTE_INSTANCE_RATE_ZERO_DIVISOR);
1501                     }
1502                     store.endGroup();
1503                 }
1504                 store.endGroup();
1505             } catch (JSONException e) {
1506                 e.printStackTrace();
1507                 throw new RuntimeException(e);
1508             }
1509         } catch (JSONException ok) {
1510             // The tag is not present in vkjson; that's fine, just continue
1511         }
1512     }
1513 
emitCustomBorderColorFeaturesEXT(DeviceInfoStore store, JSONObject parent)1514     private static void emitCustomBorderColorFeaturesEXT(DeviceInfoStore store, JSONObject parent)
1515             throws Exception {
1516         try {
1517             JSONObject extCustomborderColorFeatures =
1518                     parent.getJSONObject(KEY_VK_EXT_CUSTOM_BORDER_COLOR);
1519             try {
1520                 store.startGroup(convertName(KEY_VK_EXT_CUSTOM_BORDER_COLOR));
1521                 {
1522                     JSONObject customBorderColorFeaturesEXT =
1523                             extCustomborderColorFeatures.getJSONObject(
1524                                     KEY_CUSTOM_BORDER_COLOR_FEATURES_EXT);
1525                     store.startGroup(convertName(KEY_CUSTOM_BORDER_COLOR_FEATURES_EXT));
1526                     {
1527                         emitBoolean(
1528                                 store,
1529                                 customBorderColorFeaturesEXT,
1530                                 KEY_CUSTOM_BORDER_COLOR_WITHOUT_FORMAT);
1531                         emitBoolean(store, customBorderColorFeaturesEXT, KEY_CUSTOM_BORDER_COLORS);
1532                     }
1533                     store.endGroup();
1534                 }
1535                 store.endGroup();
1536             } catch (JSONException e) {
1537                 e.printStackTrace();
1538                 throw new RuntimeException(e);
1539             }
1540         } catch (JSONException ok) {
1541             // The tag is not present in vkjson; that's fine, just continue
1542         }
1543     }
1544 
emitPrimitiveTopologyListRestartFeaturesEXT( DeviceInfoStore store, JSONObject parent)1545     private static void emitPrimitiveTopologyListRestartFeaturesEXT(
1546             DeviceInfoStore store, JSONObject parent) throws Exception {
1547         try {
1548             JSONObject extPrimitiveTopologyListRestartFeatures =
1549                     parent.getJSONObject(KEY_VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART);
1550             try {
1551                 store.startGroup(convertName(KEY_VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART));
1552                 {
1553                     JSONObject primitiveTopologyListRestartFeaturesEXT =
1554                             extPrimitiveTopologyListRestartFeatures.getJSONObject(
1555                                     KEY_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT);
1556                     store.startGroup(convertName(KEY_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT));
1557                     {
1558                         emitBoolean(
1559                                 store,
1560                                 primitiveTopologyListRestartFeaturesEXT,
1561                                 KEY_PRIMITIVE_TOPOLOGY_LIST_RESTART);
1562                         emitBoolean(
1563                                 store,
1564                                 primitiveTopologyListRestartFeaturesEXT,
1565                                 KEY_PRIMITIVE_TOPOLOGY_PATCH_LIST_RESTART);
1566                     }
1567                     store.endGroup();
1568                 }
1569                 store.endGroup();
1570             } catch (JSONException e) {
1571                 e.printStackTrace();
1572                 throw new RuntimeException(e);
1573             }
1574         } catch (JSONException ok) {
1575             // The tag is not present in vkjson; that's fine, just continue
1576         }
1577     }
1578 
emitransformFeedbackFeaturesEXT(DeviceInfoStore store, JSONObject parent)1579     private static void emitransformFeedbackFeaturesEXT(DeviceInfoStore store, JSONObject parent)
1580             throws Exception {
1581         try {
1582             JSONObject extTransformFeedbackFeatures =
1583                     parent.getJSONObject(KEY_VK_EXT_TRANSFORM_FEEDBACK);
1584             try {
1585                 store.startGroup(convertName(KEY_VK_EXT_TRANSFORM_FEEDBACK));
1586                 {
1587                     JSONObject transformFeedbackFeaturesEXT =
1588                             extTransformFeedbackFeatures.getJSONObject(
1589                                     KEY_TRANSFORM_FEEDBACK_FEATURES_EXT);
1590                     store.startGroup(convertName(KEY_TRANSFORM_FEEDBACK_FEATURES_EXT));
1591                     {
1592                         emitBoolean(store, transformFeedbackFeaturesEXT, KEY_GEOMETRY_STREAMS);
1593                         emitBoolean(store, transformFeedbackFeaturesEXT, KEY_TRANSFORM_FEEDBACK);
1594                     }
1595                     store.endGroup();
1596                 }
1597                 store.endGroup();
1598             } catch (JSONException e) {
1599                 e.printStackTrace();
1600                 throw new RuntimeException(e);
1601             }
1602         } catch (JSONException ok) {
1603             // The tag is not present in vkjson; that's fine, just continue
1604         }
1605     }
1606 
emitProvokingVertexFeaturesEXT(DeviceInfoStore store, JSONObject parent)1607     private static void emitProvokingVertexFeaturesEXT(DeviceInfoStore store, JSONObject parent)
1608             throws Exception {
1609         try {
1610             JSONObject extProvokingVertexFeatures =
1611                     parent.getJSONObject(KEY_VK_EXT_PROVOKING_VERTEX);
1612             try {
1613                 store.startGroup(convertName(KEY_VK_EXT_PROVOKING_VERTEX));
1614                 {
1615                     JSONObject provokingVertexFeaturesEXT =
1616                             extProvokingVertexFeatures.getJSONObject(
1617                                     KEY_PROVOKING_VERTEX_FEATURES_EXT);
1618 
1619                     store.startGroup(convertName(KEY_PROVOKING_VERTEX_FEATURES_EXT));
1620                     {
1621                         emitBoolean(store, provokingVertexFeaturesEXT, KEY_PROVOKING_VERTEX_LAST);
1622 
1623                         emitBoolean(
1624                                 store,
1625                                 provokingVertexFeaturesEXT,
1626                                 KEY_TRANSFORM_FEEDBACK_PRESERVES_PROVOKING_VERTEX);
1627                     }
1628                     store.endGroup();
1629                 }
1630                 store.endGroup();
1631             } catch (JSONException e) {
1632                 e.printStackTrace();
1633                 throw new RuntimeException(e);
1634             }
1635         } catch (JSONException ok) {
1636             // The tag is not present in vkjson; that's fine, just continue
1637         }
1638     }
1639 
emitIndexTypeUint8FeaturesEXT(DeviceInfoStore store, JSONObject parent)1640     private static void emitIndexTypeUint8FeaturesEXT(DeviceInfoStore store, JSONObject parent)
1641             throws Exception {
1642         try {
1643             JSONObject extIndexTypeUint8Features =
1644                     parent.getJSONObject(KEY_VK_EXT_INDEX_TYPE_UINT8);
1645             try {
1646                 store.startGroup(convertName(KEY_VK_EXT_INDEX_TYPE_UINT8));
1647                 {
1648                     JSONObject indexTypeUint8FeaturesEXT =
1649                             extIndexTypeUint8Features.getJSONObject(
1650                                     KEY_INDEX_TYPE_UINT8_FEATURES_EXT);
1651                     store.startGroup(convertName(KEY_INDEX_TYPE_UINT8_FEATURES_EXT));
1652                     {
1653                         emitBoolean(store, indexTypeUint8FeaturesEXT, KEY_INDEX_TYPE_UINT8);
1654                     }
1655                     store.endGroup();
1656                 }
1657                 store.endGroup();
1658             } catch (JSONException e) {
1659                 e.printStackTrace();
1660                 throw new RuntimeException(e);
1661             }
1662         } catch (JSONException ok) {
1663             // The tag is not present in vkjson; that's fine, just continue
1664         }
1665     }
1666 
emitIndexTypeUint8FeaturesKHR(DeviceInfoStore store, JSONObject parent)1667     private static void emitIndexTypeUint8FeaturesKHR(DeviceInfoStore store, JSONObject parent)
1668             throws Exception {
1669         try {
1670             JSONObject khrIndexTypeUint8Features =
1671                     parent.getJSONObject(KEY_VK_KHR_INDEX_TYPE_UINT8);
1672             try {
1673                 store.startGroup(convertName(KEY_VK_KHR_INDEX_TYPE_UINT8));
1674                 {
1675                     JSONObject indexTypeUint8FeaturesKHR =
1676                             khrIndexTypeUint8Features.getJSONObject(
1677                                     KEY_INDEX_TYPE_UINT8_FEATURES_KHR);
1678                     store.startGroup(convertName(KEY_INDEX_TYPE_UINT8_FEATURES_KHR));
1679                     {
1680                         emitBoolean(store, indexTypeUint8FeaturesKHR, KEY_INDEX_TYPE_UINT8);
1681                     }
1682                     store.endGroup();
1683                 }
1684                 store.endGroup();
1685             } catch (JSONException e) {
1686                 e.printStackTrace();
1687                 throw new RuntimeException(e);
1688             }
1689         } catch (JSONException ok) {
1690             // The tag is not present in vkjson; that's fine, just continue
1691         }
1692     }
1693 
emit8bitStorageFeaturesKHR(DeviceInfoStore store, JSONObject parent)1694     private static void emit8bitStorageFeaturesKHR(DeviceInfoStore store, JSONObject parent)
1695             throws Exception {
1696         try {
1697             JSONObject khr8bitStorageFeatures = parent.getJSONObject(KEY_VK_KHR_8BIT_STORAGE);
1698             try {
1699                 store.startGroup(convertName(KEY_VK_KHR_8BIT_STORAGE));
1700                 {
1701                     JSONObject bit8StorageFeaturesKHR=
1702                             khr8bitStorageFeatures.getJSONObject(KEY_BIT8_STORAGE_FEATURES_KHR);
1703                     store.startGroup(convertName(KEY_BIT8_STORAGE_FEATURES_KHR));
1704                     {
1705                         emitBoolean(store, bit8StorageFeaturesKHR, KEY_STORAGE_BUFFER_8BIT_ACCESS);
1706                         emitBoolean(store, bit8StorageFeaturesKHR, KEY_STORAGE_PUSH_CONSTANT8);
1707                         emitBoolean(store, bit8StorageFeaturesKHR, KEY_UNIFORM_AND_STORAGE_BUFFER_8BIT_ACCESS);
1708                     }
1709                     store.endGroup();
1710                 }
1711                 store.endGroup();
1712             } catch (JSONException e) {
1713                 e.printStackTrace();
1714                 throw new RuntimeException(e);
1715             }
1716         } catch (JSONException ok) {
1717             // The tag is not present in vkjson; that's fine, just continue
1718         }
1719     }
1720 
emitShaderFloat16Int8FeaturesKHR(DeviceInfoStore store, JSONObject parent)1721     private static void emitShaderFloat16Int8FeaturesKHR(DeviceInfoStore store, JSONObject parent)
1722             throws Exception {
1723         try {
1724             JSONObject khrShaderFloat16Int8Features =
1725                     parent.getJSONObject(KEY_VK_KHR_SHADER_FLOAT16_INT8);
1726             try {
1727                 store.startGroup(convertName(KEY_VK_KHR_SHADER_FLOAT16_INT8));
1728                 {
1729                     JSONObject shaderFloat16Int8FeaturesKHR =
1730                             khrShaderFloat16Int8Features.getJSONObject(
1731                                     KEY_SHADER_FLOAT16_INT8_FEATURES_KHR);
1732                     store.startGroup(convertName(KEY_SHADER_FLOAT16_INT8_FEATURES_KHR));
1733                     {
1734                         emitBoolean(store, shaderFloat16Int8FeaturesKHR, KEY_SHADER_FLOAT16);
1735                         emitBoolean(store, shaderFloat16Int8FeaturesKHR, KEY_SHADER_INT8);
1736                     }
1737                     store.endGroup();
1738 
1739                     JSONObject float16Int8FeaturesKHR =
1740                             khrShaderFloat16Int8Features.getJSONObject(
1741                                     KEY_FLOAT16_INT8_FEATURES_KHR);
1742                     store.startGroup(convertName(KEY_FLOAT16_INT8_FEATURES_KHR));
1743                     {
1744                         emitBoolean(store, float16Int8FeaturesKHR, KEY_SHADER_FLOAT16);
1745                         emitBoolean(store, float16Int8FeaturesKHR, KEY_SHADER_INT8);
1746                     }
1747                     store.endGroup();
1748                 }
1749                 store.endGroup();
1750             } catch (JSONException e) {
1751                 e.printStackTrace();
1752                 throw new RuntimeException(e);
1753             }
1754         } catch (JSONException ok) {
1755             // The tag is not present in vkjson; that's fine, just continue
1756         }
1757     }
1758 
emitShaderIntegerDotProductFeaturesKHR( DeviceInfoStore store, JSONObject parent)1759     private static void emitShaderIntegerDotProductFeaturesKHR(
1760             DeviceInfoStore store, JSONObject parent) throws Exception {
1761         try {
1762             JSONObject khrShaderIntegerDotProductFeatures =
1763                     parent.getJSONObject(KEY_VK_KHR_SHADER_INTEGER_DOT_PRODUCT);
1764             try {
1765                 store.startGroup(convertName(KEY_VK_KHR_SHADER_INTEGER_DOT_PRODUCT));
1766                 {
1767                     JSONObject shaderIntegerDotProductFeaturesKHR =
1768                             khrShaderIntegerDotProductFeatures.getJSONObject(
1769                                     KEY_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR);
1770                     store.startGroup(convertName(KEY_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR));
1771                     {
1772                         emitBoolean(
1773                                 store,
1774                                 shaderIntegerDotProductFeaturesKHR,
1775                                 KEY_SHADER_INTEGER_DOT_PRODUCT);
1776                     }
1777                     store.endGroup();
1778                 }
1779                 store.endGroup();
1780             } catch (JSONException e) {
1781                 e.printStackTrace();
1782                 throw new RuntimeException(e);
1783             }
1784         } catch (JSONException ok) {
1785             // The tag is not present in vkjson; that's fine, just continue
1786         }
1787     }
1788 
emitShaderSubgroupExtendedTypesFeaturesKHR( DeviceInfoStore store, JSONObject parent)1789     private static void emitShaderSubgroupExtendedTypesFeaturesKHR(
1790             DeviceInfoStore store, JSONObject parent) throws Exception {
1791         try {
1792             JSONObject khrShaderSubgroupExtendedTypesFeatures =
1793                     parent.getJSONObject(KEY_VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES);
1794             try {
1795                 store.startGroup(convertName(KEY_VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES));
1796                 {
1797                     JSONObject shaderSubgroupExtendedTypesFeaturesKHR =
1798                             khrShaderSubgroupExtendedTypesFeatures.getJSONObject(
1799                                     KEY_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR);
1800                     store.startGroup(convertName(KEY_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR));
1801                     {
1802                         emitBoolean(
1803                                 store,
1804                                 shaderSubgroupExtendedTypesFeaturesKHR,
1805                                 KEY_SHADER_SUBGROUP_EXTENDED_TYPES);
1806                     }
1807                     store.endGroup();
1808                 }
1809                 store.endGroup();
1810             } catch (JSONException e) {
1811                 e.printStackTrace();
1812                 throw new RuntimeException(e);
1813             }
1814         } catch (JSONException ok) {
1815             // The tag is not present in vkjson; that's fine, just continue
1816         }
1817     }
1818 
emitShaderSubgroupUniformControlFlowFeaturesKHR( DeviceInfoStore store, JSONObject parent)1819     private static void emitShaderSubgroupUniformControlFlowFeaturesKHR(
1820             DeviceInfoStore store, JSONObject parent) throws Exception {
1821         try {
1822             JSONObject extShaderSubgroupUniformControlFlowFeatures =
1823                     parent.getJSONObject(KEY_VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW);
1824             try {
1825                 store.startGroup(convertName(KEY_VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW));
1826                 {
1827                     JSONObject shaderSubgroupUniformControlFlowFeaturesKHR =
1828                             extShaderSubgroupUniformControlFlowFeatures.getJSONObject(
1829                                     KEY_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR);
1830                     store.startGroup(
1831                             convertName(KEY_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR));
1832                     {
1833                         emitBoolean(
1834                                 store,
1835                                 shaderSubgroupUniformControlFlowFeaturesKHR,
1836                                 KEY_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW);
1837                     }
1838                     store.endGroup();
1839                 }
1840                 store.endGroup();
1841             } catch (JSONException e) {
1842                 e.printStackTrace();
1843                 throw new RuntimeException(e);
1844             }
1845         } catch (JSONException ok) {
1846             // The tag is not present in vkjson; that's fine, just continue
1847         }
1848     }
1849 
emitLineRasterizationFeaturesEXT(DeviceInfoStore store, JSONObject parent)1850     private static void emitLineRasterizationFeaturesEXT(DeviceInfoStore store, JSONObject parent)
1851             throws Exception {
1852         try {
1853             JSONObject extLineRasterizationFeatures =
1854                     parent.getJSONObject(KEY_VK_EXT_LINE_RASTERIZATION);
1855             try {
1856                 store.startGroup(convertName(KEY_VK_EXT_LINE_RASTERIZATION));
1857                 {
1858                     JSONObject lineRasterizationFeaturesEXT =
1859                             extLineRasterizationFeatures.getJSONObject(
1860                                     KEY_LINE_RASTERIZATION_FEATURES_EXT);
1861                     store.startGroup(convertName(KEY_LINE_RASTERIZATION_FEATURES_EXT));
1862                     {
1863                         emitBoolean(store, lineRasterizationFeaturesEXT, KEY_BRESENHAM_LINES);
1864                         emitBoolean(store, lineRasterizationFeaturesEXT, KEY_RECTANGULAR_LINES);
1865                         emitBoolean(store, lineRasterizationFeaturesEXT, KEY_SMOOTH_LINES);
1866                         emitBoolean(
1867                                 store, lineRasterizationFeaturesEXT, KEY_STIPPLED_BRESENHAM_LINES);
1868                         emitBoolean(
1869                                 store,
1870                                 lineRasterizationFeaturesEXT,
1871                                 KEY_STIPPLED_RECTANGULAR_LINES);
1872                         emitBoolean(store, lineRasterizationFeaturesEXT, KEY_STIPPLED_SMOOTH_LINES);
1873                     }
1874                     store.endGroup();
1875                 }
1876                 store.endGroup();
1877             } catch (JSONException e) {
1878                 e.printStackTrace();
1879                 throw new RuntimeException(e);
1880             }
1881         } catch (JSONException ok) {
1882             // The tag is not present in vkjson; that's fine, just continue
1883         }
1884     }
1885 
emitPrimitivesGeneratedQueryFeaturesEXT( DeviceInfoStore store, JSONObject parent)1886     private static void emitPrimitivesGeneratedQueryFeaturesEXT(
1887             DeviceInfoStore store, JSONObject parent) throws Exception {
1888         try {
1889             JSONObject extPrimitivesGeneratedQueryFeatures =
1890                     parent.getJSONObject(KEY_VK_EXT_PRIMITIVES_GENERATED_QUERY);
1891             try {
1892                 store.startGroup(convertName(KEY_VK_EXT_PRIMITIVES_GENERATED_QUERY));
1893                 {
1894                     JSONObject primitivesGeneratedQueryFeaturesEXT =
1895                             extPrimitivesGeneratedQueryFeatures.getJSONObject(
1896                                     KEY_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT);
1897                     store.startGroup(convertName(KEY_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT));
1898                     {
1899                         emitBoolean(
1900                                 store,
1901                                 primitivesGeneratedQueryFeaturesEXT,
1902                                 KEY_PRIMITIVES_GENERATED_QUERY);
1903                         emitBoolean(
1904                                 store,
1905                                 primitivesGeneratedQueryFeaturesEXT,
1906                                 KEY_PRIMITIVES_GENERATED_QUERY_WITH_NON_ZERO_STREAMS);
1907                         emitBoolean(
1908                                 store,
1909                                 primitivesGeneratedQueryFeaturesEXT,
1910                                 KEY_PRIMITIVES_GENERATED_QUERY_WITH_RASTERIZER_DISCARD);
1911                     }
1912                     store.endGroup();
1913                 }
1914                 store.endGroup();
1915             } catch (JSONException e) {
1916                 e.printStackTrace();
1917                 throw new RuntimeException(e);
1918             }
1919         } catch (JSONException ok) {
1920             // The tag is not present in vkjson; that's fine, just continue
1921         }
1922     }
1923 
emitFloatControlsPropertiesKHR(DeviceInfoStore store, JSONObject parent)1924     private static void emitFloatControlsPropertiesKHR(DeviceInfoStore store, JSONObject parent)
1925             throws Exception {
1926         try {
1927             JSONObject khrFloatControlsProperties =
1928                     parent.getJSONObject(KEY_VK_KHR_SHADER_FLOAT_CONTROLS);
1929             try {
1930                 store.startGroup(convertName(KEY_VK_KHR_SHADER_FLOAT_CONTROLS));
1931                 {
1932                     JSONObject floatControlsPropertiesKHR =
1933                             khrFloatControlsProperties.getJSONObject(
1934                                     KEY_FLOAT_CONTROLS_PROPERTIES_KHR);
1935                     store.startGroup(convertName(KEY_FLOAT_CONTROLS_PROPERTIES_KHR));
1936                     {
1937                         emitLong(
1938                                 store,
1939                                 floatControlsPropertiesKHR,
1940                                 KEY_DENORM_BEHAVIOR_INDEPENDENCE);
1941                         emitLong(
1942                                 store, floatControlsPropertiesKHR, KEY_ROUNDING_MODE_INDEPENDENCE);
1943                         emitBoolean(
1944                                 store,
1945                                 floatControlsPropertiesKHR,
1946                                 KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT16);
1947                         emitBoolean(
1948                                 store,
1949                                 floatControlsPropertiesKHR,
1950                                 KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT32);
1951                         emitBoolean(
1952                                 store,
1953                                 floatControlsPropertiesKHR,
1954                                 KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT64);
1955                         emitBoolean(
1956                                 store,
1957                                 floatControlsPropertiesKHR,
1958                                 KEY_SHADER_DENORM_PRESERVE_FLOAT16);
1959                         emitBoolean(
1960                                 store,
1961                                 floatControlsPropertiesKHR,
1962                                 KEY_SHADER_DENORM_PRESERVE_FLOAT32);
1963                         emitBoolean(
1964                                 store,
1965                                 floatControlsPropertiesKHR,
1966                                 KEY_SHADER_DENORM_PRESERVE_FLOAT64);
1967                         emitBoolean(
1968                                 store,
1969                                 floatControlsPropertiesKHR,
1970                                 KEY_SHADER_ROUNDING_MODE_RTE_FLOAT16);
1971                         emitBoolean(
1972                                 store,
1973                                 floatControlsPropertiesKHR,
1974                                 KEY_SHADER_ROUNDING_MODE_RTE_FLOAT32);
1975                         emitBoolean(
1976                                 store,
1977                                 floatControlsPropertiesKHR,
1978                                 KEY_SHADER_ROUNDING_MODE_RTE_FLOAT64);
1979                         emitBoolean(
1980                                 store,
1981                                 floatControlsPropertiesKHR,
1982                                 KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT16);
1983                         emitBoolean(
1984                                 store,
1985                                 floatControlsPropertiesKHR,
1986                                 KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT32);
1987                         emitBoolean(
1988                                 store,
1989                                 floatControlsPropertiesKHR,
1990                                 KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT64);
1991                         emitBoolean(
1992                                 store,
1993                                 floatControlsPropertiesKHR,
1994                                 KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT16);
1995                         emitBoolean(
1996                                 store,
1997                                 floatControlsPropertiesKHR,
1998                                 KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT32);
1999                         emitBoolean(
2000                                 store,
2001                                 floatControlsPropertiesKHR,
2002                                 KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT64);
2003                     }
2004                     store.endGroup();
2005                 }
2006                 store.endGroup();
2007             } catch (JSONException e) {
2008                 e.printStackTrace();
2009                 throw new RuntimeException(e);
2010             }
2011         } catch (JSONException ok) {
2012             // The tag is not present in vkjson; that's fine, just continue
2013         }
2014     }
2015 
emitRelaxedLineRasterizationFeaturesIMG( DeviceInfoStore store, JSONObject parent)2016     private static void emitRelaxedLineRasterizationFeaturesIMG(
2017             DeviceInfoStore store, JSONObject parent) throws Exception {
2018         try {
2019             JSONObject imgRelaxedLineRasterizationFeatures =
2020                     parent.getJSONObject(KEY_VK_IMG_RELAXED_LINE_RASTERIZATION);
2021             try {
2022                 store.startGroup(convertName(KEY_VK_IMG_RELAXED_LINE_RASTERIZATION));
2023                 {
2024                     JSONObject relaxedLineRasterizationFeaturesIMG =
2025                             imgRelaxedLineRasterizationFeatures.getJSONObject(
2026                                     KEY_RELAXED_LINE_RASTERIZATION_FEATURES_IMG);
2027                     store.startGroup(convertName(KEY_RELAXED_LINE_RASTERIZATION_FEATURES_IMG));
2028                     {
2029                         emitBoolean(
2030                                 store,
2031                                 relaxedLineRasterizationFeaturesIMG,
2032                                 RELAXED_LINE_RASTERIZATION);
2033                     }
2034                     store.endGroup();
2035                 }
2036                 store.endGroup();
2037             } catch (JSONException e) {
2038                 e.printStackTrace();
2039                 throw new RuntimeException(e);
2040             }
2041         } catch (JSONException ok) {
2042             // The tag is not present in vkjson; that's fine, just continue
2043         }
2044     }
2045 
emitExtension(String key, DeviceInfoStore store, JSONObject parent)2046     private static void emitExtension(String key, DeviceInfoStore store, JSONObject parent)
2047             throws Exception {
2048         if (!extensionNameToEnum.containsKey(key)) return;
2049         switch (extensionNameToEnum.get(key)) {
2050             case ENUM_VK_KHR_VARIABLE_POINTERS:
2051               emitVariablePointerFeaturesKHR(store, parent);
2052               break;
2053             case ENUM_VK_KHR_DRIVER_PROPERTIES:
2054               emitDriverPropertiesKHR(store, parent);
2055               break;
2056             case ENUM_KEY_VK_EXT_CUSTOM_BORDER_COLOR:
2057                 emitCustomBorderColorFeaturesEXT(store, parent);
2058               break;
2059             case ENUM_KEY_VK_EXT_IMAGE_2D_VIEW_OF_3D:
2060                 emitImage2DViewOf3DFeaturesEXT(store, parent);
2061               break;
2062             case ENUM_KEY_VK_EXT_TRANSFORM_FEEDBACK:
2063                 emitransformFeedbackFeaturesEXT(store, parent);
2064                 break;
2065             case ENUM_KEY_VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART:
2066                 emitPrimitiveTopologyListRestartFeaturesEXT(store, parent);
2067                 break;
2068             case ENUM_KEY_VK_EXT_PROVOKING_VERTEX:
2069                 emitProvokingVertexFeaturesEXT(store, parent);
2070                 break;
2071             case ENUM_KEY_VK_EXT_INDEX_TYPE_UINT8:
2072                 emitIndexTypeUint8FeaturesEXT(store, parent);
2073                 break;
2074             case ENUM_KEY_VK_KHR_INDEX_TYPE_UINT8:
2075                 emitIndexTypeUint8FeaturesKHR(store, parent);
2076                 break;
2077             case ENUM_KEY_VK_KHR_8BIT_STORAGE:
2078                 emit8bitStorageFeaturesKHR(store, parent);
2079                 break;
2080             case ENUM_KEY_VK_KHR_SHADER_FLOAT16_INT8:
2081                 emitShaderFloat16Int8FeaturesKHR(store, parent);
2082                 break;
2083             case ENUM_KEY_VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW:
2084                 emitShaderSubgroupUniformControlFlowFeaturesKHR(store, parent);
2085                 break;
2086             case ENUM_KEY_VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES:
2087                 emitShaderSubgroupExtendedTypesFeaturesKHR(store, parent);
2088                 break;
2089             case ENUM_KEY_VK_KHR_SHADER_INTEGER_DOT_PRODUCT:
2090                 emitShaderIntegerDotProductFeaturesKHR(store, parent);
2091                 break;
2092             case ENUM_KEY_VK_EXT_LINE_RASTERIZATION:
2093                 emitLineRasterizationFeaturesEXT(store, parent);
2094                 break;
2095             case ENUM_KEY_VK_EXT_PRIMITIVES_GENERATED_QUERY:
2096                 emitPrimitivesGeneratedQueryFeaturesEXT(store, parent);
2097                 break;
2098             case ENUM_KEY_VK_KHR_SHADER_FLOAT_CONTROLS:
2099                 emitFloatControlsPropertiesKHR(store, parent);
2100                 break;
2101             case ENUM_KEY_VK_IMG_RELAXED_LINE_RASTERIZATION:
2102                 emitRelaxedLineRasterizationFeaturesIMG(store, parent);
2103                 break;
2104             case ENUM_KEY_VK_KHR_VERTEX_ATTRIBUTE_DIVISOR:
2105                 emitVertexAttributeDivisorFeaturesKHR(store, parent);
2106                 break;
2107         }
2108     }
2109 
emitExtensions(DeviceInfoStore store, JSONObject parent)2110     private static void emitExtensions(DeviceInfoStore store, JSONObject parent)
2111             throws Exception {
2112         JSONArray extensions = parent.getJSONArray(KEY_EXTENSIONS);
2113         store.startArray(convertName(KEY_EXTENSIONS));
2114         for (int i = 0; i < extensions.length(); i++) {
2115             JSONObject extension = extensions.getJSONObject(i);
2116             store.startGroup();
2117             {
2118                 emitString(store, extension, KEY_EXTENSION_NAME);
2119                 emitLong(store, extension, KEY_SPEC_VERSION);
2120             }
2121             store.endGroup();
2122         }
2123         store.endArray();
2124 
2125         for (int i = 0; i < extensions.length(); i++) {
2126             JSONObject extension = extensions.getJSONObject(i);
2127             String key = extension.getString(KEY_EXTENSION_NAME);
2128             emitExtension(key, store, parent);
2129         }
2130     }
2131 
emitBoolean(DeviceInfoStore store, JSONObject parent, String name)2132     private static void emitBoolean(DeviceInfoStore store, JSONObject parent, String name)
2133             throws Exception {
2134         store.addResult(convertName(name), parent.getInt(name) != 0 ? true : false);
2135     }
2136 
emitLong(DeviceInfoStore store, JSONObject parent, String name)2137     private static void emitLong(DeviceInfoStore store, JSONObject parent, String name)
2138             throws Exception {
2139         store.addResult(convertName(name), parent.getLong(name));
2140     }
2141 
emitDouble(DeviceInfoStore store, JSONObject parent, String name)2142     private static void emitDouble(DeviceInfoStore store, JSONObject parent, String name)
2143             throws Exception {
2144         store.addResult(convertName(name), parent.getDouble(name));
2145     }
2146 
emitString(DeviceInfoStore store, JSONObject parent, String name)2147     private static void emitString(DeviceInfoStore store, JSONObject parent, String name)
2148             throws Exception {
2149         store.addResult(convertName(name), parent.getString(name));
2150     }
2151 
emitLongArray(DeviceInfoStore store, JSONObject parent, String name)2152     private static void emitLongArray(DeviceInfoStore store, JSONObject parent, String name)
2153             throws Exception {
2154         JSONArray jsonArray = parent.getJSONArray(name);
2155         long[] array = new long[jsonArray.length()];
2156         for (int i = 0; i < jsonArray.length(); i++) {
2157             array[i] = jsonArray.getLong(i);
2158         }
2159         store.addArrayResult(convertName(name), array);
2160     }
2161 
emitDoubleArray(DeviceInfoStore store, JSONObject parent, String name)2162     private static void emitDoubleArray(DeviceInfoStore store, JSONObject parent, String name)
2163             throws Exception {
2164         JSONArray jsonArray = parent.getJSONArray(name);
2165         double[] array = new double[jsonArray.length()];
2166         for (int i = 0; i < jsonArray.length(); i++) {
2167             array[i] = jsonArray.getDouble(i);
2168         }
2169         store.addArrayResult(convertName(name), array);
2170     }
2171 
convertName(String name)2172     private static String convertName(String name) {
2173         // This translation could be done algorithmically, but in this case being able to
2174         // code-search for both the original and converted names is more important.
2175         switch (name) {
2176             case KEY_BIT16_STORAGE_FEATURES: return "bit16_storage_features";
2177             case KEY_ALPHA_TO_ONE: return "alpha_to_one";
2178             case KEY_API_VERSION: return "api_version";
2179             case KEY_BUFFER_DEVICE_ADDRESS: return "buffer_device_address";
2180             case KEY_BUFFER_DEVICE_ADDRESS_CAPTURE_REPLAY: return "buffer_device_address_capture_replay";
2181             case KEY_BUFFER_DEVICE_ADDRESS_MULTI_DEVICE: return "buffer_device_address_multi_device";
2182             case KEY_BUFFER_FEATURES: return "buffer_features";
2183             case KEY_BUFFER_IMAGE_GRANULARITY: return "buffer_image_granularity";
2184             case KEY_COMPATIBLE_HANDLE_TYPES: return "compatible_handle_types";
2185             case KEY_COMPUTE_FULL_SUBGROUPS: return "compute_full_subgroups";
2186             case KEY_CONFORMANCE_VERSION: return "conformance_version";
2187             case KEY_DENORM_BEHAVIOR_INDEPENDENCE: return "denorm_behavior_independence";
2188             case KEY_DEPTH: return "depth";
2189             case KEY_DEPTH_BIAS_CLAMP: return "depth_bias_clamp";
2190             case KEY_DEPTH_BOUNDS: return "depth_bounds";
2191             case KEY_DEPTH_CLAMP: return "depth_clamp";
2192             case KEY_DESCRIPTION: return "description";
2193             case KEY_DESCRIPTOR_BINDING_INLINE_UNIFORM_BLOCK_UPDATE_AFTER_BIND: return "descriptor_binding_inline_uniform_block_update_after_bind";
2194             case KEY_DESCRIPTOR_BINDING_PARTIALLY_BOUND: return "descriptor_binding_partially_bound";
2195             case KEY_DESCRIPTOR_BINDING_SAMPLED_IMAGE_UPDATE_AFTER_BIND: return "descriptor_binding_sampled_image_update_after_bind";
2196             case KEY_DESCRIPTOR_BINDING_STORAGE_BUFFER_UPDATE_AFTER_BIND: return "descriptor_binding_storage_buffer_update_after_bind";
2197             case KEY_DESCRIPTOR_BINDING_STORAGE_IMAGE_UPDATE_AFTER_BIND: return "descriptor_binding_storage_image_update_after_bind";
2198             case KEY_DESCRIPTOR_BINDING_STORAGE_TEXEL_BUFFER_UPDATE_AFTER_BIND: return "descriptor_binding_storage_texel_buffer_update_after_bind";
2199             case KEY_DESCRIPTOR_BINDING_UNIFORM_BUFFER_UPDATE_AFTER_BIND: return "descriptor_binding_uniform_buffer_update_after_bind";
2200             case KEY_DESCRIPTOR_BINDING_UNIFORM_TEXEL_BUFFER_UPDATE_AFTER_BIND: return "descriptor_binding_uniform_texel_buffer_update_after_bind";
2201             case KEY_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING: return "descriptor_binding_update_unused_while_pending";
2202             case KEY_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT: return "descriptor_binding_variable_descriptor_count";
2203             case KEY_DESCRIPTOR_INDEXING: return "descriptor_indexing";
2204             case KEY_DEVICES: return "devices";
2205             case KEY_DEVICE_GROUPS: return "device_groups";
2206             case KEY_DEVICE_ID: return "device_id";
2207             case KEY_DEVICE_LUID: return "device_luid";
2208             case KEY_DEVICE_LUID_VALID: return "device_luid_valid";
2209             case KEY_DEVICE_NAME: return "device_name";
2210             case KEY_DEVICE_NODE_MASK: return "device_node_mask";
2211             case KEY_DEVICE_TYPE: return "device_type";
2212             case KEY_DEVICE_UUID: return "device_uuid";
2213             case KEY_DISCRETE_QUEUE_PRIORITIES: return "discrete_queue_priorities";
2214             case KEY_DRAW_INDIRECT_COUNT: return "draw_indirect_count";
2215             case KEY_DRAW_INDIRECT_FIRST_INSTANCE: return "draw_indirect_first_instance";
2216             case KEY_DRIVER_ID: return "driver_id";
2217             case KEY_DRIVER_INFO: return "driver_info";
2218             case KEY_DRIVER_NAME: return "driver_name";
2219             case KEY_DRIVER_PROPERTIES_KHR: return "driver_properties_khr";
2220             case KEY_DRIVER_UUID: return "driver_uuid";
2221             case KEY_DRIVER_VERSION: return "driver_version";
2222             case KEY_DUAL_SRC_BLEND: return "dual_src_blend";
2223             case KEY_DYNAMIC_RENDERING: return "dynamic_rendering";
2224             case KEY_EXPORT_FROM_IMPORTED_HANDLE_TYPES: return "export_from_imported_handle_types";
2225             case KEY_EXTENSIONS: return "extensions";
2226             case KEY_EXTENSION_NAME: return "extension_name";
2227             case KEY_EXTERNAL_FENCE_FEATURES: return "external_fence_features";
2228             case KEY_EXTERNAL_FENCE_PROPERTIES: return "external_fence_properties";
2229             case KEY_EXTERNAL_SEMAPHORE_FEATURES: return "external_semaphore_features";
2230             case KEY_EXTERNAL_SEMAPHORE_PROPERTIES: return "external_semaphore_properties";
2231             case KEY_FEATURES: return "features";
2232             case KEY_FILL_MODE_NON_SOLID: return "fill_mode_non_solid";
2233             case KEY_FILTER_MINMAX_IMAGE_COMPONENT_MAPPING: return "filter_minmax_image_component_mapping";
2234             case KEY_FILTER_MINMAX_SINGLE_COMPONENT_FORMATS: return "filter_minmax_single_component_formats";
2235             case KEY_FLAGS: return "flags";
2236             case KEY_FORMATS: return "formats";
2237             case KEY_FRAGMENT_STORES_AND_ATOMICS: return "fragment_stores_and_atomics";
2238             case KEY_FRAMEBUFFER_COLOR_SAMPLE_COUNTS: return "framebuffer_color_sample_counts";
2239             case KEY_FRAMEBUFFER_DEPTH_SAMPLE_COUNTS: return "framebuffer_depth_sample_counts";
2240             case KEY_FRAMEBUFFER_INTEGER_COLOR_SAMPLE_COUNTS: return "framebuffer_integer_color_sample_counts";
2241             case KEY_FRAMEBUFFER_NO_ATTACHMENTS_SAMPLE_COUNTS: return "framebuffer_no_attachments_sample_counts";
2242             case KEY_FRAMEBUFFER_STENCIL_SAMPLE_COUNTS: return "framebuffer_stencil_sample_counts";
2243             case KEY_FULL_DRAW_INDEX_UINT32: return "full_draw_index_uint32";
2244             case KEY_GEOMETRY_SHADER: return "geometry_shader";
2245             case KEY_HEAP_INDEX: return "heap_index";
2246             case KEY_HEIGHT: return "height";
2247             case KEY_HOST_QUERY_RESET: return "host_query_reset";
2248             case KEY_ID_PROPERTIES: return "id_properties";
2249             case KEY_IMAGELESS_FRAMEBUFFER: return "imageless_framebuffer";
2250             case KEY_IMAGE_CUBE_ARRAY: return "image_cube_array";
2251             case KEY_IMPLEMENTATION_VERSION: return "implementation_version";
2252             case KEY_INDEPENDENT_BLEND: return "independent_blend";
2253             case KEY_INDEPENDENT_RESOLVE: return "independent_resolve";
2254             case KEY_INDEPENDENT_RESOLVE_NONE: return "independent_resolve_none";
2255             case KEY_INHERITED_QUERIES: return "inherited_queries";
2256             case KEY_INLINE_UNIFORM_BLOCK: return "inline_uniform_block";
2257             case KEY_INSTANCE_API_VERSION: return "instance_api_version";
2258             case KEY_INTEGER_DOT_PRODUCT_16BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_16bit_mixed_signedness_accelerated";
2259             case KEY_INTEGER_DOT_PRODUCT_16BIT_SIGNED_ACCELERATED: return "integer_dot_product_16bit_signed_accelerated";
2260             case KEY_INTEGER_DOT_PRODUCT_16BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_16bit_unsigned_accelerated";
2261             case KEY_INTEGER_DOT_PRODUCT_32BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_32bit_mixed_signedness_accelerated";
2262             case KEY_INTEGER_DOT_PRODUCT_32BIT_SIGNED_ACCELERATED: return "integer_dot_product_32bit_signed_accelerated";
2263             case KEY_INTEGER_DOT_PRODUCT_32BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_32bit_unsigned_accelerated";
2264             case KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_4x8bit_packed_mixed_signedness_accelerated";
2265             case KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_SIGNED_ACCELERATED: return "integer_dot_product_4x8bit_packed_signed_accelerated";
2266             case KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_UNSIGNED_ACCELERATED: return "integer_dot_product_4x8bit_packed_unsigned_accelerated";
2267             case KEY_INTEGER_DOT_PRODUCT_64BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_64bit_mixed_signedness_accelerated";
2268             case KEY_INTEGER_DOT_PRODUCT_64BIT_SIGNED_ACCELERATED: return "integer_dot_product_64bit_signed_accelerated";
2269             case KEY_INTEGER_DOT_PRODUCT_64BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_64bit_unsigned_accelerated";
2270             case KEY_INTEGER_DOT_PRODUCT_8BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_8bit_mixed_signedness_accelerated";
2271             case KEY_INTEGER_DOT_PRODUCT_8BIT_SIGNED_ACCELERATED: return "integer_dot_product_8bit_signed_accelerated";
2272             case KEY_INTEGER_DOT_PRODUCT_8BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_8bit_unsigned_accelerated";
2273             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_accumulating_saturating_16bit_mixed_signedness_accelerated";
2274             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_SIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_16bit_signed_accelerated";
2275             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_16bit_unsigned_accelerated";
2276             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_accumulating_saturating_32bit_mixed_signedness_accelerated";
2277             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_SIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_32bit_signed_accelerated";
2278             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_32bit_unsigned_accelerated";
2279             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_accumulating_saturating_4x8bit_packed_mixed_signedness_accelerated";
2280             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_SIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_4x8bit_packed_signed_accelerated";
2281             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_UNSIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_4x8bit_packed_unsigned_accelerated";
2282             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_accumulating_saturating_64bit_mixed_signedness_accelerated";
2283             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_SIGNEDNESS_ACCELERATED: return "integer_dot_product_accumulating_saturating_64bit_signed_accelerated";
2284             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_64bit_unsigned_accelerated";
2285             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_accumulating_saturating_8bit_mixed_signedness_accelerated";
2286             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_SIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_8bit_signed_accelerated";
2287             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_8bit_unsigned_accelerated";
2288             case KEY_LARGE_POINTS: return "large_points";
2289             case KEY_LAYERS: return "layers";
2290             case KEY_LAYER_NAME: return "layer_name";
2291             case KEY_LIMITS: return "limits";
2292             case KEY_LINEAR_TILING_FEATURES: return "linear_tiling_features";
2293             case KEY_LINE_WIDTH_GRANULARITY: return "line_width_granularity";
2294             case KEY_LINE_WIDTH_RANGE: return "line_width_range";
2295             case KEY_LOGIC_OP: return "logic_op";
2296             case KEY_MAINTENANCE4: return "maintenance4";
2297             case KEY_MAINTENANCE_3_PROPERTIES: return "maintenance_3_properties";
2298             case KEY_MAJOR: return "major";
2299             case KEY_MAX_BOUND_DESCRIPTOR_SETS: return "max_bound_descriptor_sets";
2300             case KEY_MAX_BUFFER_SIZE: return "max_buffer_size";
2301             case KEY_MAX_CLIP_DISTANCES: return "max_clip_distances";
2302             case KEY_MAX_COLOR_ATTACHMENTS: return "max_color_attachments";
2303             case KEY_MAX_COMBINED_CLIP_AND_CULL_DISTANCES: return "max_combined_clip_and_cull_distances";
2304             case KEY_MAX_COMPUTE_SHARED_MEMORY_SIZE: return "max_compute_shared_memory_size";
2305             case KEY_MAX_COMPUTE_WORKGROUP_SUBGROUPS: return "max_compute_workgroup_subgroups";
2306             case KEY_MAX_COMPUTE_WORK_GROUP_COUNT: return "max_compute_work_group_count";
2307             case KEY_MAX_COMPUTE_WORK_GROUP_INVOCATIONS: return "max_compute_work_group_invocations";
2308             case KEY_MAX_COMPUTE_WORK_GROUP_SIZE: return "max_compute_work_group_size";
2309             case KEY_MAX_CULL_DISTANCES: return "max_cull_distances";
2310             case KEY_MAX_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCKS: return "max_descriptor_set_inline_uniform_blocks";
2311             case KEY_MAX_DESCRIPTOR_SET_INPUT_ATTACHMENTS: return "max_descriptor_set_input_attachments";
2312             case KEY_MAX_DESCRIPTOR_SET_SAMPLED_IMAGES: return "max_descriptor_set_sampled_images";
2313             case KEY_MAX_DESCRIPTOR_SET_SAMPLERS: return "max_descriptor_set_samplers";
2314             case KEY_MAX_DESCRIPTOR_SET_STORAGE_BUFFERS: return "max_descriptor_set_storage_buffers";
2315             case KEY_MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC: return "max_descriptor_set_storage_buffers_dynamic";
2316             case KEY_MAX_DESCRIPTOR_SET_STORAGE_IMAGES: return "max_descriptor_set_storage_images";
2317             case KEY_MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS: return "max_descriptor_set_uniform_buffers";
2318             case KEY_MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC: return "max_descriptor_set_uniform_buffers_dynamic";
2319             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_INLINE_UNIFORM_BLOCKS: return "max_descriptor_set_update_after_bind_inline_uniform_blocks";
2320             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_INPUT_ATTACHMENTS: return "max_descriptor_set_update_after_bind_input_attachments";
2321             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_SAMPLED_IMAGES: return "max_descriptor_set_update_after_bind_sampled_images";
2322             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_SAMPLERS: return "max_descriptor_set_update_after_bind_samplers";
2323             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_BUFFERS: return "max_descriptor_set_update_after_bind_storage_buffers";
2324             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_BUFFERS_DYNAMIC: return "max_descriptor_set_update_after_bind_storage_buffers_dynamic";
2325             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_IMAGES: return "max_descriptor_set_update_after_bind_storage_images";
2326             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_UNIFORM_BUFFERS: return "max_descriptor_set_update_after_bind_uniform_buffers";
2327             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_UNIFORM_BUFFERS_DYNAMIC: return "max_descriptor_set_update_after_bind_uniform_buffers_dynamic";
2328             case KEY_MAX_DRAW_INDEXED_INDEX_VALUE: return "max_draw_indexed_index_value";
2329             case KEY_MAX_DRAW_INDIRECT_COUNT: return "max_draw_indirect_count";
2330             case KEY_MAX_FRAGMENT_COMBINED_OUTPUT_RESOURCES: return "max_fragment_combined_output_resources";
2331             case KEY_MAX_FRAGMENT_DUAL_SRC_ATTACHMENTS: return "max_fragment_dual_src_attachments";
2332             case KEY_MAX_FRAGMENT_INPUT_COMPONENTS: return "max_fragment_input_components";
2333             case KEY_MAX_FRAGMENT_OUTPUT_ATTACHMENTS: return "max_fragment_output_attachments";
2334             case KEY_MAX_FRAMEBUFFER_HEIGHT: return "max_framebuffer_height";
2335             case KEY_MAX_FRAMEBUFFER_LAYERS: return "max_framebuffer_layers";
2336             case KEY_MAX_FRAMEBUFFER_WIDTH: return "max_framebuffer_width";
2337             case KEY_MAX_GEOMETRY_INPUT_COMPONENTS: return "max_geometry_input_components";
2338             case KEY_MAX_GEOMETRY_OUTPUT_COMPONENTS: return "max_geometry_output_components";
2339             case KEY_MAX_GEOMETRY_OUTPUT_VERTICES: return "max_geometry_output_vertices";
2340             case KEY_MAX_GEOMETRY_SHADER_INVOCATIONS: return "max_geometry_shader_invocations";
2341             case KEY_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: return "max_geometry_total_output_components";
2342             case KEY_MAX_IMAGE_ARRAY_LAYERS: return "max_image_array_layers";
2343             case KEY_MAX_IMAGE_DIMENSION_1D: return "max_image_dimension_1d";
2344             case KEY_MAX_IMAGE_DIMENSION_2D: return "max_image_dimension_2d";
2345             case KEY_MAX_IMAGE_DIMENSION_3D: return "max_image_dimension_3d";
2346             case KEY_MAX_IMAGE_DIMENSION_CUBE: return "max_image_dimension_cube";
2347             case KEY_MAX_INLINE_UNIFORM_BLOCK_SIZE: return "max_inline_uniform_block_size";
2348             case KEY_MAX_INLINE_UNIFORM_TOTAL_SIZE: return "max_inline_uniform_total_size";
2349             case KEY_MAX_INTERPOLATION_OFFSET: return "max_interpolation_offset";
2350             case KEY_MAX_MEMORY_ALLOCATION_COUNT: return "max_memory_allocation_count";
2351             case KEY_MAX_MEMORY_ALLOCATION_SIZE: return "max_memory_allocation_size";
2352             case KEY_MAX_MULTIVIEW_INSTANCE_INDEX: return "max_multiview_instance_index";
2353             case KEY_MAX_MULTIVIEW_VIEW_COUNT: return "max_multiview_view_count";
2354             case KEY_MAX_PER_SET_DESCRIPTORS: return "max_per_set_descriptors";
2355             case KEY_MAX_PER_STAGE_DESCRIPTOR_INLINE_UNIFORM_BLOCKS: return "max_per_stage_descriptor_inline_uniform_blocks";
2356             case KEY_MAX_PER_STAGE_DESCRIPTOR_INPUT_ATTACHMENTS: return "max_per_stage_descriptor_input_attachments";
2357             case KEY_MAX_PER_STAGE_DESCRIPTOR_SAMPLED_IMAGES: return "max_per_stage_descriptor_sampled_images";
2358             case KEY_MAX_PER_STAGE_DESCRIPTOR_SAMPLERS: return "max_per_stage_descriptor_samplers";
2359             case KEY_MAX_PER_STAGE_DESCRIPTOR_STORAGE_BUFFERS: return "max_per_stage_descriptor_storage_buffers";
2360             case KEY_MAX_PER_STAGE_DESCRIPTOR_STORAGE_IMAGES: return "max_per_stage_descriptor_storage_images";
2361             case KEY_MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BUFFERS: return "max_per_stage_descriptor_uniform_buffers";
2362             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_INLINE_UNIFORM_BLOCKS: return "max_per_stage_descriptor_update_after_bind_inline_uniform_blocks";
2363             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_INPUT_ATTACHMENTS: return "max_per_stage_descriptor_update_after_bind_input_attachments";
2364             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_SAMPLED_IMAGES: return "max_per_stage_descriptor_update_after_bind_sampled_images";
2365             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_SAMPLERS: return "max_per_stage_descriptor_update_after_bind_samplers";
2366             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_STORAGE_BUFFERS: return "max_per_stage_descriptor_update_after_bind_storage_buffers";
2367             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_STORAGE_IMAGES: return "max_per_stage_descriptor_update_after_bind_storage_images";
2368             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_UNIFORM_BUFFERS: return "max_per_stage_descriptor_update_after_bind_uniform_buffers";
2369             case KEY_MAX_PER_STAGE_RESOURCES: return "max_per_stage_resources";
2370             case KEY_MAX_PER_STAGE_UPDATE_AFTER_BIND_RESOURCES: return "max_per_stage_update_after_bind_resources";
2371             case KEY_MAX_PUSH_CONSTANTS_SIZE: return "max_push_constants_size";
2372             case KEY_MAX_SAMPLER_ALLOCATION_COUNT: return "max_sampler_allocation_count";
2373             case KEY_MAX_SAMPLER_ANISOTROPY: return "max_sampler_anisotropy";
2374             case KEY_MAX_SAMPLER_LOD_BIAS: return "max_sampler_lod_bias";
2375             case KEY_MAX_SAMPLE_MASK_WORDS: return "max_sample_mask_words";
2376             case KEY_MAX_STORAGE_BUFFER_RANGE: return "max_storage_buffer_range";
2377             case KEY_MAX_SUBGROUP_SIZE: return "max_subgroup_size";
2378             case KEY_MAX_TESSELLATION_CONTROL_PER_PATCH_OUTPUT_COMPONENTS: return "max_tessellation_control_per_patch_output_components";
2379             case KEY_MAX_TESSELLATION_CONTROL_PER_VERTEX_INPUT_COMPONENTS: return "max_tessellation_control_per_vertex_input_components";
2380             case KEY_MAX_TESSELLATION_CONTROL_PER_VERTEX_OUTPUT_COMPONENTS: return "max_tessellation_control_per_vertex_output_components";
2381             case KEY_MAX_TESSELLATION_CONTROL_TOTAL_OUTPUT_COMPONENTS: return "max_tessellation_control_total_output_components";
2382             case KEY_MAX_TESSELLATION_EVALUATION_INPUT_COMPONENTS: return "max_tessellation_evaluation_input_components";
2383             case KEY_MAX_TESSELLATION_EVALUATION_OUTPUT_COMPONENTS: return "max_tessellation_evaluation_output_components";
2384             case KEY_MAX_TESSELLATION_GENERATION_LEVEL: return "max_tessellation_generation_level";
2385             case KEY_MAX_TESSELLATION_PATCH_SIZE: return "max_tessellation_patch_size";
2386             case KEY_MAX_TEXEL_BUFFER_ELEMENTS: return "max_texel_buffer_elements";
2387             case KEY_MAX_TEXEL_GATHER_OFFSET: return "max_texel_gather_offset";
2388             case KEY_MAX_TEXEL_OFFSET: return "max_texel_offset";
2389             case KEY_MAX_TIMELINE_SEMAPHORE_VALUE_DIFFERENCE: return "max_timeline_semaphore_value_difference";
2390             case KEY_MAX_UNIFORM_BUFFER_RANGE: return "max_uniform_buffer_range";
2391             case KEY_MAX_UPDATE_AFTER_BIND_DESCRIPTORS_IN_ALL_POOLS: return "max_update_after_bind_descriptors_in_all_pools";
2392             case KEY_MAX_VERTEX_INPUT_ATTRIBUTES: return "max_vertex_input_attributes";
2393             case KEY_MAX_VERTEX_INPUT_ATTRIBUTE_OFFSET: return "max_vertex_input_attribute_offset";
2394             case KEY_MAX_VERTEX_INPUT_BINDINGS: return "max_vertex_input_bindings";
2395             case KEY_MAX_VERTEX_INPUT_BINDING_STRIDE: return "max_vertex_input_binding_stride";
2396             case KEY_MAX_VERTEX_OUTPUT_COMPONENTS: return "max_vertex_output_components";
2397             case KEY_MAX_VIEWPORTS: return "max_viewports";
2398             case KEY_MAX_VIEWPORT_DIMENSIONS: return "max_viewport_dimensions";
2399             case KEY_MEMORY: return "memory";
2400             case KEY_MEMORY_HEAPS: return "memory_heaps";
2401             case KEY_MEMORY_HEAP_COUNT: return "memory_heap_count";
2402             case KEY_MEMORY_TYPES: return "memory_types";
2403             case KEY_MEMORY_TYPE_COUNT: return "memory_type_count";
2404             case KEY_MINOR: return "minor";
2405             case KEY_MIN_IMAGE_TRANSFER_GRANULARITY: return "min_image_transfer_granularity";
2406             case KEY_MIN_INTERPOLATION_OFFSET: return "min_interpolation_offset";
2407             case KEY_MIN_MEMORY_MAP_ALIGNMENT: return "min_memory_map_alignment";
2408             case KEY_MIN_STORAGE_BUFFER_OFFSET_ALIGNMENT: return "min_storage_buffer_offset_alignment";
2409             case KEY_MIN_SUBGROUP_SIZE: return "min_subgroup_size";
2410             case KEY_MIN_TEXEL_BUFFER_OFFSET_ALIGNMENT: return "min_texel_buffer_offset_alignment";
2411             case KEY_MIN_TEXEL_GATHER_OFFSET: return "min_texel_gather_offset";
2412             case KEY_MIN_TEXEL_OFFSET: return "min_texel_offset";
2413             case KEY_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT: return "min_uniform_buffer_offset_alignment";
2414             case KEY_MIPMAP_PRECISION_BITS: return "mipmap_precision_bits";
2415             case KEY_MULTIVIEW: return "multiview";
2416             case KEY_MULTIVIEW_FEATURES: return "multiview_features";
2417             case KEY_MULTIVIEW_GEOMETRY_SHADER: return "multiview_geometry_shader";
2418             case KEY_MULTIVIEW_PROPERTIES: return "multiview_properties";
2419             case KEY_MULTIVIEW_TESSELLATION_SHADER: return "multiview_tessellation_shader";
2420             case KEY_MULTI_DRAW_INDIRECT: return "multi_draw_indirect";
2421             case KEY_MULTI_VIEWPORT: return "multi_viewport";
2422             case KEY_NON_COHERENT_ATOM_SIZE: return "non_coherent_atom_size";
2423             case KEY_OCCLUSION_QUERY_PRECISE: return "occlusion_query_precise";
2424             case KEY_OPTIMAL_BUFFER_COPY_OFFSET_ALIGNMENT: return "optimal_buffer_copy_offset_alignment";
2425             case KEY_OPTIMAL_BUFFER_COPY_ROW_PITCH_ALIGNMENT: return "optimal_buffer_copy_row_pitch_alignment";
2426             case KEY_OPTIMAL_TILING_FEATURES: return "optimal_tiling_features";
2427             case KEY_PATCH: return "patch";
2428             case KEY_PIPELINE_CACHE_UUID: return "pipeline_cache_uuid";
2429             case KEY_PIPELINE_CREATION_CACHE_CONTROL: return "pipeline_creation_cache_control";
2430             case KEY_PIPELINE_STATISTICS_QUERY: return "pipeline_statistics_query";
2431             case KEY_POINT_CLIPPING_BEHAVIOR: return "point_clipping_behavior";
2432             case KEY_POINT_CLIPPING_PROPERTIES: return "point_clipping_properties";
2433             case KEY_POINT_SIZE_GRANULARITY: return "point_size_granularity";
2434             case KEY_POINT_SIZE_RANGE: return "point_size_range";
2435             case KEY_PRIVATE_DATA: return "private_data";
2436             case KEY_PROPERTIES: return "properties";
2437             case KEY_PROPERTY_FLAGS: return "property_flags";
2438             case KEY_PROTECTED_MEMORY: return "protected_memory";
2439             case KEY_PROTECTED_MEMORY_FEATURES: return "protected_memory_features";
2440             case KEY_QUAD_DIVERGENT_IMPLICIT_LOD: return "quad_divergent_implicit_lod";
2441             case KEY_QUAD_OPERATIONS_IN_ALL_STAGES: return "quad_operations_in_all_stages";
2442             case KEY_QUEUES: return "queues";
2443             case KEY_QUEUE_COUNT: return "queue_count";
2444             case KEY_QUEUE_FLAGS: return "queue_flags";
2445             case KEY_REQUIRED_SUBGROUP_SIZE_STAGES: return "required_subgroup_size_stages";
2446             case KEY_RESIDENCY_ALIGNED_MIP_SIZE: return "residency_aligned_mip_size";
2447             case KEY_RESIDENCY_NON_RESIDENT_STRICT: return "residency_non_resident_strict";
2448             case KEY_RESIDENCY_STANDARD_2D_BLOCK_SHAPE: return "residency_standard_2d_block_shape";
2449             case KEY_RESIDENCY_STANDARD_2D_MULTISAMPLE_BLOCK_SHAPE: return "residency_standard_2d_multisample_block_shape";
2450             case KEY_RESIDENCY_STANDARD_3D_BLOCK_SHAPE: return "residency_standard_3d_block_shape";
2451             case KEY_ROBUST_BUFFER_ACCESS: return "robust_buffer_access";
2452             case KEY_ROBUST_BUFFER_ACCESS_UPDATE_AFTER_BIND: return "robust_buffer_access_update_after_bind";
2453             case KEY_ROBUST_IMAGE_ACCESS: return "robust_image_access";
2454             case KEY_ROUNDING_MODE_INDEPENDENCE: return "rounding_mode_independence";
2455             case KEY_RUNTIME_DESCRIPTOR_ARRAY: return "runtime_descriptor_array";
2456             case KEY_SAMPLED_IMAGE_COLOR_SAMPLE_COUNTS: return "sampled_image_color_sample_counts";
2457             case KEY_SAMPLED_IMAGE_DEPTH_SAMPLE_COUNTS: return "sampled_image_depth_sample_counts";
2458             case KEY_SAMPLED_IMAGE_INTEGER_SAMPLE_COUNTS: return "sampled_image_integer_sample_counts";
2459             case KEY_SAMPLED_IMAGE_STENCIL_SAMPLE_COUNTS: return "sampled_image_stencil_sample_counts";
2460             case KEY_SAMPLER_ANISOTROPY: return "sampler_anisotropy";
2461             case KEY_SAMPLER_FILTER_MINMAX: return "sampler_filter_minmax";
2462             case KEY_SAMPLER_MIRROR_CLAMP_TO_EDGE: return "sampler_mirror_clamp_to_edge";
2463             case KEY_SAMPLER_YCBCR_CONVERSION: return "sampler_ycbcr_conversion";
2464             case KEY_SAMPLER_YCBCR_CONVERSION_FEATURES: return "sampler_ycbcr_conversion_features";
2465             case KEY_SAMPLE_RATE_SHADING: return "sample_rate_shading";
2466             case KEY_SCALAR_BLOCK_LAYOUT: return "scalar_block_layout";
2467             case KEY_SEPARATE_DEPTH_STENCIL_LAYOUTS: return "separate_depth_stencil_layouts";
2468             case KEY_SHADER_BUFFER_INT64_ATOMICS: return "shader_buffer_int64_atomics";
2469             case KEY_SHADER_CLIP_DISTANCE: return "shader_clip_distance";
2470             case KEY_SHADER_CULL_DISTANCE: return "shader_cull_distance";
2471             case KEY_SHADER_DEMOTE_TO_HELPER_INVOCATION: return "shader_demote_to_helper_invocation";
2472             case KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT16: return "shader_denorm_flush_to_zero_float16";
2473             case KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT32: return "shader_denorm_flush_to_zero_float32";
2474             case KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT64: return "shader_denorm_flush_to_zero_float64";
2475             case KEY_SHADER_DENORM_PRESERVE_FLOAT16: return "shader_denorm_preserve_float16";
2476             case KEY_SHADER_DENORM_PRESERVE_FLOAT32: return "shader_denorm_preserve_float32";
2477             case KEY_SHADER_DENORM_PRESERVE_FLOAT64: return "shader_denorm_preserve_float64";
2478             case KEY_SHADER_DRAW_PARAMETERS: return "shader_draw_parameters";
2479             case KEY_SHADER_DRAW_PARAMETER_FEATURES: return "shader_draw_parameter_features";
2480             case KEY_SHADER_FLOAT16: return "shader_float16";
2481             case KEY_SHADER_FLOAT64: return "shader_float64";
2482             case KEY_SHADER_IMAGE_GATHER_EXTENDED: return "shader_image_gather_extended";
2483             case KEY_SHADER_INPUT_ATTACHMENT_ARRAY_DYNAMIC_INDEXING: return "shader_input_attachment_array_dynamic_indexing";
2484             case KEY_SHADER_INPUT_ATTACHMENT_ARRAY_NONUNIFORM_INDEXING_NATIVE: return "shader_input_attachment_array_nonuniform_indexing_native";
2485             case KEY_SHADER_INPUT_ATTACHMENT_ARRAY_NON_UNIFORM_INDEXING: return "shader_input_attachment_array_non_uniform_indexing";
2486             case KEY_SHADER_INT16: return "shader_int16";
2487             case KEY_SHADER_INT64: return "shader_int64";
2488             case KEY_SHADER_INT8: return "shader_int8";
2489             case KEY_SHADER_INTEGER_DOT_PRODUCT: return "shader_integer_dot_product";
2490             case KEY_SHADER_OUTPUT_LAYER: return "shader_output_layer";
2491             case KEY_SHADER_OUTPUT_VIEWPORT_INDEX: return "shader_output_viewport_index";
2492             case KEY_SHADER_RESOURCE_MIN_LOD: return "shader_resource_min_lod";
2493             case KEY_SHADER_RESOURCE_RESIDENCY: return "shader_resource_residency";
2494             case KEY_SHADER_ROUNDING_MODE_RTE_FLOAT16: return "shader_rounding_mode_rte_float16";
2495             case KEY_SHADER_ROUNDING_MODE_RTE_FLOAT32: return "shader_rounding_mode_rte_float32";
2496             case KEY_SHADER_ROUNDING_MODE_RTE_FLOAT64: return "shader_rounding_mode_rte_float64";
2497             case KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT16: return "shader_rounding_mode_rtz_float16";
2498             case KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT32: return "shader_rounding_mode_rtz_float32";
2499             case KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT64: return "shader_rounding_mode_rtz_float64";
2500             case KEY_SHADER_SAMPLED_IMAGE_ARRAY_DYNAMIC_INDEXING: return "shader_sampled_image_array_dynamic_indexing";
2501             case KEY_SHADER_SAMPLED_IMAGE_ARRAY_NONUNIFORM_INDEXING_NATIVE: return "shader_sampled_image_array_nonuniform_indexing_native";
2502             case KEY_SHADER_SAMPLED_IMAGE_ARRAY_NON_UNIFORM_INDEXING: return "shader_sampled_image_array_non_uniform_indexing";
2503             case KEY_SHADER_SHARED_INT64_ATOMICS: return "shader_shared_int64_atomics";
2504             case KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT16: return "shader_signed_zero_inf_nan_preserve_float16";
2505             case KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT32: return "shader_signed_zero_inf_nan_preserve_float32";
2506             case KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT64: return "shader_signed_zero_inf_nan_preserve_float64";
2507             case KEY_SHADER_STORAGE_BUFFER_ARRAY_DYNAMIC_INDEXING: return "shader_storage_buffer_array_dynamic_indexing";
2508             case KEY_SHADER_STORAGE_BUFFER_ARRAY_NONUNIFORM_INDEXING_NATIVE: return "shader_storage_buffer_array_nonuniform_indexing_native";
2509             case KEY_SHADER_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING: return "shader_storage_buffer_array_non_uniform_indexing";
2510             case KEY_SHADER_STORAGE_IMAGE_ARRAY_DYNAMIC_INDEXING: return "shader_storage_image_array_dynamic_indexing";
2511             case KEY_SHADER_STORAGE_IMAGE_ARRAY_NONUNIFORM_INDEXING_NATIVE: return "shader_storage_image_array_nonuniform_indexing_native";
2512             case KEY_SHADER_STORAGE_IMAGE_ARRAY_NON_UNIFORM_INDEXING: return "shader_storage_image_array_non_uniform_indexing";
2513             case KEY_SHADER_STORAGE_IMAGE_EXTENDED_FORMATS: return "shader_storage_image_extended_formats";
2514             case KEY_SHADER_STORAGE_IMAGE_MULTISAMPLE: return "shader_storage_image_multisample";
2515             case KEY_SHADER_STORAGE_IMAGE_READ_WITHOUT_FORMAT: return "shader_storage_image_read_without_format";
2516             case KEY_SHADER_STORAGE_IMAGE_WRITE_WITHOUT_FORMAT: return "shader_storage_image_write_without_format";
2517             case KEY_SHADER_STORAGE_TEXEL_BUFFER_ARRAY_DYNAMIC_INDEXING: return "shader_storage_texel_buffer_array_dynamic_indexing";
2518             case KEY_SHADER_STORAGE_TEXEL_BUFFER_ARRAY_NON_UNIFORM_INDEXING: return "shader_storage_texel_buffer_array_non_uniform_indexing";
2519             case KEY_SHADER_SUBGROUP_EXTENDED_TYPES: return "shader_subgroup_extended_types";
2520             case KEY_SHADER_TERMINATE_INVOCATION: return "shader_terminate_invocation";
2521             case KEY_SHADER_TESSELLATION_AND_GEOMETRY_POINT_SIZE: return "shader_tessellation_and_geometry_point_size";
2522             case KEY_SHADER_UNIFORM_BUFFER_ARRAY_DYNAMIC_INDEXING: return "shader_uniform_buffer_array_dynamic_indexing";
2523             case KEY_SHADER_UNIFORM_BUFFER_ARRAY_NONUNIFORM_INDEXING_NATIVE: return "shader_uniform_buffer_array_nonuniform_indexing_native";
2524             case KEY_SHADER_UNIFORM_BUFFER_ARRAY_NON_UNIFORM_INDEXING: return "shader_uniform_buffer_array_non_uniform_indexing";
2525             case KEY_SHADER_UNIFORM_TEXEL_BUFFER_ARRAY_DYNAMIC_INDEXING: return "shader_uniform_texel_buffer_array_dynamic_indexing";
2526             case KEY_SHADER_UNIFORM_TEXEL_BUFFER_ARRAY_NON_UNIFORM_INDEXING: return "shader_uniform_texel_buffer_array_non_uniform_indexing";
2527             case KEY_SHADER_ZERO_INITIALIZE_WORKGROUP_MEMORY: return "shader_zero_initialize_workgroup_memory";
2528             case KEY_SIZE: return "size";
2529             case KEY_SPARSE_ADDRESS_SPACE_SIZE: return "sparse_address_space_size";
2530             case KEY_SPARSE_BINDING: return "sparse_binding";
2531             case KEY_SPARSE_PROPERTIES: return "sparse_properties";
2532             case KEY_SPARSE_RESIDENCY_16_SAMPLES: return "sparse_residency_16_samples";
2533             case KEY_SPARSE_RESIDENCY_2_SAMPLES: return "sparse_residency_2_samples";
2534             case KEY_SPARSE_RESIDENCY_4_SAMPLES: return "sparse_residency_4_samples";
2535             case KEY_SPARSE_RESIDENCY_8_SAMPLES: return "sparse_residency_8_samples";
2536             case KEY_SPARSE_RESIDENCY_ALIASED: return "sparse_residency_aliased";
2537             case KEY_SPARSE_RESIDENCY_BUFFER: return "sparse_residency_buffer";
2538             case KEY_SPARSE_RESIDENCY_IMAGE_2D: return "sparse_residency_image_2d";
2539             case KEY_SPARSE_RESIDENCY_IMAGE_3D: return "sparse_residency_image_3d";
2540             case KEY_SPEC_VERSION: return "spec_version";
2541             case KEY_STANDARD_SAMPLE_LOCATIONS: return "standard_sample_locations";
2542             case KEY_STORAGE_BUFFER_16BIT_ACCESS: return "storage_buffer_16bit_access";
2543             case KEY_STORAGE_BUFFER_8BIT_ACCESS: return "storage_buffer_8bit_access";
2544             case KEY_STORAGE_IMAGE_SAMPLE_COUNTS: return "storage_image_sample_counts";
2545             case KEY_STORAGE_INPUT_OUTPUT_16: return "storage_input_output_16";
2546             case KEY_STORAGE_PUSH_CONSTANT8: return "storage_push_constant8";
2547             case KEY_STORAGE_PUSH_CONSTANT_16: return "storage_push_constant_16";
2548             case KEY_STORAGE_TEXEL_BUFFER_OFFSET_ALIGNMENT_BYTES: return "storage_texel_buffer_offset_alignment_bytes";
2549             case KEY_STORAGE_TEXEL_BUFFER_OFFSET_SINGLE_TEXEL_ALIGNMENT: return "storage_texel_buffer_offset_single_texel_alignment";
2550             case KEY_STRICT_LINES: return "strict_lines";
2551             case KEY_SUBGROUP_BROADCAST_DYNAMIC_ID: return "subgroup_broadcast_dynamic_id";
2552             case KEY_SUBGROUP_PROPERTIES: return "subgroup_properties";
2553             case KEY_SUBGROUP_SIZE: return "subgroup_size";
2554             case KEY_SUBGROUP_SIZE_CONTROL: return "subgroup_size_control";
2555             case KEY_SUBMINOR: return "subminor";
2556             case KEY_SUBSET_ALLOCATION: return "subset_allocation";
2557             case KEY_SUB_PIXEL_INTERPOLATION_OFFSET_BITS: return "sub_pixel_interpolation_offset_bits";
2558             case KEY_SUB_PIXEL_PRECISION_BITS: return "sub_pixel_precision_bits";
2559             case KEY_SUB_TEXEL_PRECISION_BITS: return "sub_texel_precision_bits";
2560             case KEY_SUPPORTED_DEPTH_RESOLVE_MODES: return "supported_depth_resolve_modes";
2561             case KEY_SUPPORTED_OPERATIONS: return "supported_operations";
2562             case KEY_SUPPORTED_STAGES: return "supported_stages";
2563             case KEY_SUPPORTED_STENCIL_RESOLVE_MODES: return "supported_stencil_resolve_modes";
2564             case KEY_SYNCHRONIZATION2: return "synchronization2";
2565             case KEY_TESSELLATION_SHADER: return "tessellation_shader";
2566             case KEY_TEXTURE_COMPRESSION_ASTC_HDR: return "texture_compression_astc_hdr";
2567             case KEY_TEXTURE_COMPRESSION_ASTC_LDR: return "texture_compression_astc_ldr";
2568             case KEY_TEXTURE_COMPRESSION_BC: return "texture_compression_bc";
2569             case KEY_TEXTURE_COMPRESSION_ETC2: return "texture_compression_etc2";
2570             case KEY_TIMELINE_SEMAPHORE: return "timeline_semaphore";
2571             case KEY_TIMESTAMP_COMPUTE_AND_GRAPHICS: return "timestamp_compute_and_graphics";
2572             case KEY_TIMESTAMP_PERIOD: return "timestamp_period";
2573             case KEY_TIMESTAMP_VALID_BITS: return "timestamp_valid_bits";
2574             case KEY_UNIFORM_AND_STORAGE_BUFFER_16BIT_ACCESS: return "uniform_and_storage_buffer_16bit_access";
2575             case KEY_UNIFORM_AND_STORAGE_BUFFER_8BIT_ACCESS: return "uniform_and_storage_buffer_8bit_access";
2576             case KEY_UNIFORM_BUFFER_STANDARD_LAYOUT: return "uniform_buffer_standard_layout";
2577             case KEY_UNIFORM_TEXEL_BUFFER_OFFSET_ALIGNMENT_BYTES: return "uniform_texel_buffer_offset_alignment_bytes";
2578             case KEY_UNIFORM_TEXEL_BUFFER_OFFSET_SINGLE_TEXEL_ALIGNMENT: return "uniform_texel_buffer_offset_single_texel_alignment";
2579             case KEY_VARIABLE_MULTISAMPLE_RATE: return "variable_multisample_rate";
2580             case KEY_VARIABLE_POINTERS: return "variable_pointers";
2581             case KEY_VARIABLE_POINTERS_STORAGE_BUFFER: return "variable_pointers_storage_buffer";
2582             // Field name should ideally be `variable_pointers_features`, but renaming would cause parsing errors for older JSON reports.
2583             case KEY_VARIABLE_POINTERS_FEATURES: return "variable_pointer_features";
2584             case KEY_VARIABLE_POINTER_FEATURES_KHR: return "variable_pointer_features_khr";
2585             case KEY_VARIABLE_POINTERS_FEATURES_KHR: return "variable_pointers_features_khr";
2586             case KEY_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT: return "image_2d_view_of_3d_features_ext";
2587             case KEY_IMAGE_2D_VIEW_OF_3D: return "image_2d_view_of_3d";
2588             case KEY_SAMPLER_2D_VIEW_OF_3D: return "sampler_2d_view_of_3d";
2589             case KEY_VENDOR_ID: return "vendor_id";
2590             case KEY_VERTEX_PIPELINE_STORES_AND_ATOMICS: return "vertex_pipeline_stores_and_atomics";
2591             case KEY_VIEWPORT_BOUNDS_RANGE: return "viewport_bounds_range";
2592             case KEY_VIEWPORT_SUB_PIXEL_BITS: return "viewport_sub_pixel_bits";
2593             case KEY_VK_KHR_DRIVER_PROPERTIES: return "vk_khr_driver_properties";
2594             case KEY_VK_KHR_VARIABLE_POINTERS: return "vk_khr_variable_pointers";
2595             case KEY_VK_EXT_IMAGE_2D_VIEW_OF_3D: return "vk_ext_image_2d_view_of_3d";
2596             case KEY_CUSTOM_BORDER_COLOR_FEATURES_EXT: return "custom_border_color_features_ext";
2597             case KEY_CUSTOM_BORDER_COLOR_WITHOUT_FORMAT: return "custom_border_color_without_format";
2598             case KEY_CUSTOM_BORDER_COLORS: return "custom_border_colors";
2599             case KEY_VK_EXT_CUSTOM_BORDER_COLOR: return "vk_ext_custom_border_color";
2600             case KEY_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: return "primitive_topology_list_restart_features_ext";
2601             case KEY_PRIMITIVE_TOPOLOGY_LIST_RESTART: return "primitive_topology_list_restart";
2602             case KEY_PRIMITIVE_TOPOLOGY_PATCH_LIST_RESTART: return "primitive_topology_patch_list_restart";
2603             case KEY_VK_EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART: return "vk_ext_primitive_topology_list_restart";
2604             case KEY_TRANSFORM_FEEDBACK_FEATURES_EXT: return "transform_feedback_features_ext";
2605             case KEY_GEOMETRY_STREAMS: return "geometry_streams";
2606             case KEY_TRANSFORM_FEEDBACK: return "transform_feedback";
2607             case KEY_VK_EXT_TRANSFORM_FEEDBACK: return "vk_ext_transform_feedback";
2608             case KEY_PROVOKING_VERTEX_FEATURES_EXT: return "provoking_vertex_features_ext";
2609             case KEY_PROVOKING_VERTEX_LAST: return "provoking_vertex_last";
2610             case KEY_TRANSFORM_FEEDBACK_PRESERVES_PROVOKING_VERTEX: return "transform_feedback_preserves_provoking_vertex";
2611             case KEY_VK_EXT_PROVOKING_VERTEX: return "vk_ext_provoking_vertex";
2612             case KEY_INDEX_TYPE_UINT8_FEATURES_EXT:
2613                 return "index_type_uint8_features_ext";
2614             case KEY_INDEX_TYPE_UINT8:
2615                 return "index_type_uint8";
2616             case KEY_VK_EXT_INDEX_TYPE_UINT8:
2617                 return "vk_ext_index_type_uint8";
2618             case KEY_INDEX_TYPE_UINT8_FEATURES_KHR:
2619                 return "index_type_uint8_features_khr";
2620             case KEY_VK_KHR_INDEX_TYPE_UINT8:
2621                 return "vk_khr_index_type_uint8";
2622             case KEY_SHADER_FLOAT16_INT8_FEATURES_KHR:
2623                 return "shader_float16_int8_features_khr";
2624             case KEY_FLOAT16_INT8_FEATURES_KHR:
2625                 return "float16_int8_features_khr";
2626             case KEY_VK_KHR_SHADER_FLOAT16_INT8:
2627                 return "vk_khr_shader_float16_int8";
2628             case KEY_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR:
2629                 return "shader_subgroup_extended_types_features_khr";
2630             case KEY_VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES:
2631                 return "vk_khr_shader_subgroup_extended_types";
2632             case KEY_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR:
2633                 return "shader_subgroup_uniform_control_flow_features_khr";
2634             case KEY_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW:
2635                 return "shader_subgroup_uniform_control_flow";
2636             case KEY_VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW:
2637                 return "vk_khr_shader_subgroup_uniform_control_flow";
2638             case KEY_BIT8_STORAGE_FEATURES_KHR:
2639                 return "bit8_storage_features_khr";
2640             case KEY_VK_KHR_8BIT_STORAGE:
2641                 return "vk_khr_8bit_storage";
2642             case KEY_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR:
2643                 return "shader_integer_dot_product_features_khr";
2644             case KEY_VK_KHR_SHADER_INTEGER_DOT_PRODUCT:
2645                 return "vk_khr_shader_integer_dot_product";
2646             case KEY_LINE_RASTERIZATION_FEATURES_EXT:
2647                 return "line_rasterization_features_ext";
2648             case KEY_BRESENHAM_LINES:
2649                 return "bresenham_lines";
2650             case KEY_RECTANGULAR_LINES:
2651                 return "rectangular_lines";
2652             case KEY_SMOOTH_LINES:
2653                 return "smooth_lines";
2654             case KEY_STIPPLED_BRESENHAM_LINES:
2655                 return "stippled_bresenham_lines";
2656             case KEY_STIPPLED_RECTANGULAR_LINES:
2657                 return "stippled_rectangular_lines";
2658             case KEY_STIPPLED_SMOOTH_LINES:
2659                 return "stippled_smooth_lines";
2660             case KEY_VK_EXT_LINE_RASTERIZATION:
2661                 return "vk_ext_line_rasterization";
2662             case KEY_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT:
2663                 return "primitives_generated_query_features_ext";
2664             case KEY_PRIMITIVES_GENERATED_QUERY:
2665                 return "primitives_generated_query";
2666             case KEY_PRIMITIVES_GENERATED_QUERY_WITH_NON_ZERO_STREAMS:
2667                 return "primitives_generated_query_with_non_zero_streams";
2668             case KEY_PRIMITIVES_GENERATED_QUERY_WITH_RASTERIZER_DISCARD:
2669                 return "primitives_generated_query_with_rasterizer_discard";
2670             case KEY_VK_EXT_PRIMITIVES_GENERATED_QUERY:
2671                 return "vk_ext_primitives_generated_query";
2672             case KEY_FLOAT_CONTROLS_PROPERTIES_KHR:
2673                 return "float_controls_properties_khr";
2674             case KEY_VK_KHR_SHADER_FLOAT_CONTROLS:
2675                 return "vk_khr_shader_float_controls";
2676             case KEY_RELAXED_LINE_RASTERIZATION_FEATURES_IMG:
2677                 return "relaxed_line_rasterization_features_img";
2678             case RELAXED_LINE_RASTERIZATION:
2679                 return "relaxed_line_rasterization";
2680             case KEY_VK_IMG_RELAXED_LINE_RASTERIZATION:
2681                 return "vk_img_relaxed_line_rasterization";
2682             case KEY_VULKAN_11_PROPERTIES:
2683                 return "vulkan_11_properties";
2684             case KEY_VULKAN_11_FEATURES:
2685                 return "vulkan_11_features";
2686             case KEY_PROTECTED_NO_FAULT:
2687                 return "protected_no_fault";
2688             case KEY_SUBGROUP_QUAD_OPERATIONS_IN_ALL_STAGES:
2689                 return "subgroup_quad_operations_in_all_stages";
2690             case KEY_SUBGROUP_SUPPORTED_OPERATIONS:
2691                 return "subgroup_supported_operations";
2692             case KEY_SUBGROUP_SUPPORTED_STAGES:
2693                 return "subgroup_supported_stages";
2694             case KEY_VK_KHR_VERTEX_ATTRIBUTE_DIVISOR: return "vk_khr_vertex_attribute_divisor";
2695             case KEY_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR: return "vertex_attribute_divisor_features_khr";
2696             case KEY_VERTEX_ATTRIBUTE_INSTANCE_RATE_DIVISOR: return "vertex_attribute_instance_rate_divisor";
2697             case KEY_VERTEX_ATTRIBUTE_INSTANCE_RATE_ZERO_DIVISOR: return "vertex_attribute_instance_rate_zero_divisor";
2698             case KEY_VULKAN_12_FEATURES: return "vulkan_12_features";
2699             case KEY_VULKAN_12_PROPERTIES: return "vulkan_12_properties";
2700             case KEY_VULKAN_13_FEATURES: return "vulkan_13_features";
2701             case KEY_VULKAN_13_PROPERTIES: return "vulkan_13_properties";
2702             case KEY_VULKAN_MEMORY_MODEL: return "vulkan_memory_model";
2703             case KEY_VULKAN_MEMORY_MODEL_AVAILABILITY_VISIBILITY_CHAINS: return "vulkan_memory_model_availability_visibility_chains";
2704             case KEY_VULKAN_MEMORY_MODEL_DEVICE_SCOPE: return "vulkan_memory_model_device_scope";
2705             case KEY_WIDE_LINES: return "wide_lines";
2706             case KEY_WIDTH: return "width";
2707             default: throw new RuntimeException("unknown key name: " + name);
2708         }
2709     }
2710 
nativeGetVkJSON()2711     private static native String nativeGetVkJSON();
2712 
2713 }
2714