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_16BIT_STORAGE_FEATURES = "16bitStorageFeatures";
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_POINTER_FEATURES = "variablePointerFeatures";
486     private static final String KEY_VARIABLE_POINTER_FEATURES_KHR = "variablePointerFeaturesKHR";
487     private static final String KEY_VENDOR_ID = "vendorID";
488     private static final String KEY_VERTEX_PIPELINE_STORES_AND_ATOMICS = "vertexPipelineStoresAndAtomics";
489     private static final String KEY_VIEWPORT_BOUNDS_RANGE = "viewportBoundsRange";
490     private static final String KEY_VIEWPORT_SUB_PIXEL_BITS = "viewportSubPixelBits";
491     private static final String KEY_VK_KHR_DRIVER_PROPERTIES = "VK_KHR_driver_properties";
492     private static final String KEY_VK_KHR_VARIABLE_POINTERS = "VK_KHR_variable_pointers";
493     private static final String KEY_VULKAN_12_FEATURES = "vulkan_12_features";
494     private static final String KEY_VULKAN_12_PROPERTIES = "vulkan_12_properties";
495     private static final String KEY_VULKAN_13_FEATURES = "vulkan_13_features";
496     private static final String KEY_VULKAN_13_PROPERTIES = "vulkan_13_properties";
497     private static final String KEY_VULKAN_MEMORY_MODEL = "vulkanMemoryModel";
498     private static final String KEY_VULKAN_MEMORY_MODEL_AVAILABILITY_VISIBILITY_CHAINS = "vulkanMemoryModelAvailabilityVisibilityChains";
499     private static final String KEY_VULKAN_MEMORY_MODEL_DEVICE_SCOPE = "vulkanMemoryModelDeviceScope";
500     private static final String KEY_WIDE_LINES = "wideLines";
501     private static final String KEY_WIDTH = "width";
502 
503     private static final int VK_API_VERSION_1_1 = 4198400;
504     private static final int VK_API_VERSION_1_2 = 4202496;
505     private static final int VK_API_VERSION_1_3 = 4206592;
506     private static final int ENUM_VK_KHR_VARIABLE_POINTERS = 0;
507     private static final int ENUM_VK_KHR_DRIVER_PROPERTIES = 1;
508 
509     private static HashMap<String, Integer> extensionNameToEnum;
510 
511     static {
512         System.loadLibrary("ctsdeviceinfo");
513         extensionNameToEnum = new HashMap<>();
extensionNameToEnum.put(KEY_VK_KHR_DRIVER_PROPERTIES, ENUM_VK_KHR_DRIVER_PROPERTIES)514         extensionNameToEnum.put(KEY_VK_KHR_DRIVER_PROPERTIES, ENUM_VK_KHR_DRIVER_PROPERTIES);
extensionNameToEnum.put(KEY_VK_KHR_VARIABLE_POINTERS, ENUM_VK_KHR_VARIABLE_POINTERS)515         extensionNameToEnum.put(KEY_VK_KHR_VARIABLE_POINTERS, ENUM_VK_KHR_VARIABLE_POINTERS);
516     }
517 
518     @Override
collectDeviceInfo(DeviceInfoStore store)519     protected void collectDeviceInfo(DeviceInfoStore store) throws Exception {
520         try {
521             JSONObject instance = new JSONObject(nativeGetVkJSON());
522             emitDeviceGroups(store, instance);
523             emitLayers(store, instance);
524             emitExtensions(store, instance);
525             emitDevices(store, instance);
526 
527             // Access to Instance API version was only added alongside 1.2 support in instance
528             if (instance.getLong(KEY_API_VERSION) >= VK_API_VERSION_1_2) {
529                 emitInstanceApiVersion(store, instance);
530             }
531         } catch (JSONException e) {
532             e.printStackTrace();
533             throw new RuntimeException(e);
534         }
535     }
536 
emitDeviceGroups(DeviceInfoStore store, JSONObject parent)537     private static void emitDeviceGroups(DeviceInfoStore store, JSONObject parent)
538             throws Exception {
539         JSONArray deviceGroups = parent.getJSONArray(KEY_DEVICE_GROUPS);
540         store.startArray(convertName(KEY_DEVICE_GROUPS));
541         for (int deviceGroupIdx = 0; deviceGroupIdx < deviceGroups.length(); deviceGroupIdx++) {
542             JSONObject deviceGroup = deviceGroups.getJSONObject(deviceGroupIdx);
543             store.startGroup();
544             {
545                 emitLongArray(store, deviceGroup, KEY_DEVICES);
546                 emitBoolean(store, deviceGroup, KEY_SUBSET_ALLOCATION);
547             }
548             store.endGroup();
549         }
550         store.endArray();
551     }
552 
emitDevices(DeviceInfoStore store, JSONObject parent)553     private static void emitDevices(DeviceInfoStore store, JSONObject parent)
554             throws Exception {
555         JSONArray devices = parent.getJSONArray(KEY_DEVICES);
556         store.startArray(convertName(KEY_DEVICES));
557         for (int deviceIdx = 0; deviceIdx < devices.length(); deviceIdx++) {
558             JSONObject device = devices.getJSONObject(deviceIdx);
559             store.startGroup();
560             {
561                 JSONObject properties = device.getJSONObject(KEY_PROPERTIES);
562                 store.startGroup(convertName(KEY_PROPERTIES));
563                 {
564                     emitLong(store, properties, KEY_API_VERSION);
565                     emitLong(store, properties, KEY_DRIVER_VERSION);
566                     emitLong(store, properties, KEY_VENDOR_ID);
567                     emitLong(store, properties, KEY_DEVICE_ID);
568                     emitLong(store, properties, KEY_DEVICE_TYPE);
569                     emitString(store, properties, KEY_DEVICE_NAME);
570                     emitLongArray(store, properties, KEY_PIPELINE_CACHE_UUID);
571 
572                     JSONObject limits = properties.getJSONObject(KEY_LIMITS);
573                     store.startGroup(convertName(KEY_LIMITS));
574                     {
575                         emitLong(store, limits, KEY_MAX_IMAGE_DIMENSION_1D);
576                         emitLong(store, limits, KEY_MAX_IMAGE_DIMENSION_2D);
577                         emitLong(store, limits, KEY_MAX_IMAGE_DIMENSION_3D);
578                         emitLong(store, limits, KEY_MAX_IMAGE_DIMENSION_CUBE);
579                         emitLong(store, limits, KEY_MAX_IMAGE_ARRAY_LAYERS);
580                         emitLong(store, limits, KEY_MAX_TEXEL_BUFFER_ELEMENTS);
581                         emitLong(store, limits, KEY_MAX_UNIFORM_BUFFER_RANGE);
582                         emitLong(store, limits, KEY_MAX_STORAGE_BUFFER_RANGE);
583                         emitLong(store, limits, KEY_MAX_PUSH_CONSTANTS_SIZE);
584                         emitLong(store, limits, KEY_MAX_MEMORY_ALLOCATION_COUNT);
585                         emitLong(store, limits, KEY_MAX_SAMPLER_ALLOCATION_COUNT);
586                         emitString(store, limits, KEY_BUFFER_IMAGE_GRANULARITY);
587                         emitString(store, limits, KEY_SPARSE_ADDRESS_SPACE_SIZE);
588                         emitLong(store, limits, KEY_MAX_BOUND_DESCRIPTOR_SETS);
589                         emitLong(store, limits, KEY_MAX_PER_STAGE_DESCRIPTOR_SAMPLERS);
590                         emitLong(store, limits, KEY_MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BUFFERS);
591                         emitLong(store, limits, KEY_MAX_PER_STAGE_DESCRIPTOR_STORAGE_BUFFERS);
592                         emitLong(store, limits, KEY_MAX_PER_STAGE_DESCRIPTOR_SAMPLED_IMAGES);
593                         emitLong(store, limits, KEY_MAX_PER_STAGE_DESCRIPTOR_STORAGE_IMAGES);
594                         emitLong(store, limits, KEY_MAX_PER_STAGE_DESCRIPTOR_INPUT_ATTACHMENTS);
595                         emitLong(store, limits, KEY_MAX_PER_STAGE_RESOURCES);
596                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_SAMPLERS);
597                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS);
598                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC);
599                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_STORAGE_BUFFERS);
600                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC);
601                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_SAMPLED_IMAGES);
602                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_STORAGE_IMAGES);
603                         emitLong(store, limits, KEY_MAX_DESCRIPTOR_SET_INPUT_ATTACHMENTS);
604                         emitLong(store, limits, KEY_MAX_VERTEX_INPUT_ATTRIBUTES);
605                         emitLong(store, limits, KEY_MAX_VERTEX_INPUT_BINDINGS);
606                         emitLong(store, limits, KEY_MAX_VERTEX_INPUT_ATTRIBUTE_OFFSET);
607                         emitLong(store, limits, KEY_MAX_VERTEX_INPUT_BINDING_STRIDE);
608                         emitLong(store, limits, KEY_MAX_VERTEX_OUTPUT_COMPONENTS);
609                         emitLong(store, limits, KEY_MAX_TESSELLATION_GENERATION_LEVEL);
610                         emitLong(store, limits, KEY_MAX_TESSELLATION_PATCH_SIZE);
611                         emitLong(store, limits, KEY_MAX_TESSELLATION_CONTROL_PER_VERTEX_INPUT_COMPONENTS);
612                         emitLong(store, limits, KEY_MAX_TESSELLATION_CONTROL_PER_VERTEX_OUTPUT_COMPONENTS);
613                         emitLong(store, limits, KEY_MAX_TESSELLATION_CONTROL_PER_PATCH_OUTPUT_COMPONENTS);
614                         emitLong(store, limits, KEY_MAX_TESSELLATION_CONTROL_TOTAL_OUTPUT_COMPONENTS);
615                         emitLong(store, limits, KEY_MAX_TESSELLATION_EVALUATION_INPUT_COMPONENTS);
616                         emitLong(store, limits, KEY_MAX_TESSELLATION_EVALUATION_OUTPUT_COMPONENTS);
617                         emitLong(store, limits, KEY_MAX_GEOMETRY_SHADER_INVOCATIONS);
618                         emitLong(store, limits, KEY_MAX_GEOMETRY_INPUT_COMPONENTS);
619                         emitLong(store, limits, KEY_MAX_GEOMETRY_OUTPUT_COMPONENTS);
620                         emitLong(store, limits, KEY_MAX_GEOMETRY_OUTPUT_VERTICES);
621                         emitLong(store, limits, KEY_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS);
622                         emitLong(store, limits, KEY_MAX_FRAGMENT_INPUT_COMPONENTS);
623                         emitLong(store, limits, KEY_MAX_FRAGMENT_OUTPUT_ATTACHMENTS);
624                         emitLong(store, limits, KEY_MAX_FRAGMENT_DUAL_SRC_ATTACHMENTS);
625                         emitLong(store, limits, KEY_MAX_FRAGMENT_COMBINED_OUTPUT_RESOURCES);
626                         emitLong(store, limits, KEY_MAX_COMPUTE_SHARED_MEMORY_SIZE);
627                         emitLongArray(store, limits, KEY_MAX_COMPUTE_WORK_GROUP_COUNT);
628                         emitLong(store, limits, KEY_MAX_COMPUTE_WORK_GROUP_INVOCATIONS);
629                         emitLongArray(store, limits, KEY_MAX_COMPUTE_WORK_GROUP_SIZE);
630                         emitLong(store, limits, KEY_SUB_PIXEL_PRECISION_BITS);
631                         emitLong(store, limits, KEY_SUB_TEXEL_PRECISION_BITS);
632                         emitLong(store, limits, KEY_MIPMAP_PRECISION_BITS);
633                         emitLong(store, limits, KEY_MAX_DRAW_INDEXED_INDEX_VALUE);
634                         emitLong(store, limits, KEY_MAX_DRAW_INDIRECT_COUNT);
635                         emitDouble(store, limits, KEY_MAX_SAMPLER_LOD_BIAS);
636                         emitDouble(store, limits, KEY_MAX_SAMPLER_ANISOTROPY);
637                         emitLong(store, limits, KEY_MAX_VIEWPORTS);
638                         emitLongArray(store, limits, KEY_MAX_VIEWPORT_DIMENSIONS);
639                         emitDoubleArray(store, limits, KEY_VIEWPORT_BOUNDS_RANGE);
640                         emitLong(store, limits, KEY_VIEWPORT_SUB_PIXEL_BITS);
641                         emitString(store, limits, KEY_MIN_MEMORY_MAP_ALIGNMENT);
642                         emitString(store, limits, KEY_MIN_TEXEL_BUFFER_OFFSET_ALIGNMENT);
643                         emitString(store, limits, KEY_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT);
644                         emitString(store, limits, KEY_MIN_STORAGE_BUFFER_OFFSET_ALIGNMENT);
645                         emitLong(store, limits, KEY_MIN_TEXEL_OFFSET);
646                         emitLong(store, limits, KEY_MAX_TEXEL_OFFSET);
647                         emitLong(store, limits, KEY_MIN_TEXEL_GATHER_OFFSET);
648                         emitLong(store, limits, KEY_MAX_TEXEL_GATHER_OFFSET);
649                         emitDouble(store, limits, KEY_MIN_INTERPOLATION_OFFSET);
650                         emitDouble(store, limits, KEY_MAX_INTERPOLATION_OFFSET);
651                         emitLong(store, limits, KEY_SUB_PIXEL_INTERPOLATION_OFFSET_BITS);
652                         emitLong(store, limits, KEY_MAX_FRAMEBUFFER_WIDTH);
653                         emitLong(store, limits, KEY_MAX_FRAMEBUFFER_HEIGHT);
654                         emitLong(store, limits, KEY_MAX_FRAMEBUFFER_LAYERS);
655                         emitLong(store, limits, KEY_FRAMEBUFFER_COLOR_SAMPLE_COUNTS);
656                         emitLong(store, limits, KEY_FRAMEBUFFER_DEPTH_SAMPLE_COUNTS);
657                         emitLong(store, limits, KEY_FRAMEBUFFER_STENCIL_SAMPLE_COUNTS);
658                         emitLong(store, limits, KEY_FRAMEBUFFER_NO_ATTACHMENTS_SAMPLE_COUNTS);
659                         emitLong(store, limits, KEY_MAX_COLOR_ATTACHMENTS);
660                         emitLong(store, limits, KEY_SAMPLED_IMAGE_COLOR_SAMPLE_COUNTS);
661                         emitLong(store, limits, KEY_SAMPLED_IMAGE_INTEGER_SAMPLE_COUNTS);
662                         emitLong(store, limits, KEY_SAMPLED_IMAGE_DEPTH_SAMPLE_COUNTS);
663                         emitLong(store, limits, KEY_SAMPLED_IMAGE_STENCIL_SAMPLE_COUNTS);
664                         emitLong(store, limits, KEY_STORAGE_IMAGE_SAMPLE_COUNTS);
665                         emitLong(store, limits, KEY_MAX_SAMPLE_MASK_WORDS);
666                         emitBoolean(store, limits, KEY_TIMESTAMP_COMPUTE_AND_GRAPHICS);
667                         emitDouble(store, limits, KEY_TIMESTAMP_PERIOD);
668                         emitLong(store, limits, KEY_MAX_CLIP_DISTANCES);
669                         emitLong(store, limits, KEY_MAX_CULL_DISTANCES);
670                         emitLong(store, limits, KEY_MAX_COMBINED_CLIP_AND_CULL_DISTANCES);
671                         emitLong(store, limits, KEY_DISCRETE_QUEUE_PRIORITIES);
672                         emitDoubleArray(store, limits, KEY_POINT_SIZE_RANGE);
673                         emitDoubleArray(store, limits, KEY_LINE_WIDTH_RANGE);
674                         emitDouble(store, limits, KEY_POINT_SIZE_GRANULARITY);
675                         emitDouble(store, limits, KEY_LINE_WIDTH_GRANULARITY);
676                         emitBoolean(store, limits, KEY_STRICT_LINES);
677                         emitBoolean(store, limits, KEY_STANDARD_SAMPLE_LOCATIONS);
678                         emitString(store, limits, KEY_OPTIMAL_BUFFER_COPY_OFFSET_ALIGNMENT);
679                         emitString(store, limits, KEY_OPTIMAL_BUFFER_COPY_ROW_PITCH_ALIGNMENT);
680                         emitString(store, limits, KEY_NON_COHERENT_ATOM_SIZE);
681                     }
682                     store.endGroup();
683 
684                     JSONObject sparse = properties.getJSONObject(KEY_SPARSE_PROPERTIES);
685                     store.startGroup(convertName(KEY_SPARSE_PROPERTIES));
686                     {
687                         emitBoolean(store, sparse, KEY_RESIDENCY_STANDARD_2D_BLOCK_SHAPE);
688                         emitBoolean(store, sparse, KEY_RESIDENCY_STANDARD_2D_MULTISAMPLE_BLOCK_SHAPE);
689                         emitBoolean(store, sparse, KEY_RESIDENCY_STANDARD_3D_BLOCK_SHAPE);
690                         emitBoolean(store, sparse, KEY_RESIDENCY_ALIGNED_MIP_SIZE);
691                         emitBoolean(store, sparse, KEY_RESIDENCY_NON_RESIDENT_STRICT);
692                     }
693                     store.endGroup();
694 
695                     if (properties.getLong(KEY_API_VERSION) >= VK_API_VERSION_1_2) {
696                         JSONObject core12 = device.getJSONObject(KEY_CORE12);
697                         JSONObject vulkan12Properties = core12.getJSONObject(KEY_PROPERTIES);
698                         store.startGroup(convertName(KEY_VULKAN_12_PROPERTIES));
699                         {
700                             emitLong(store, vulkan12Properties, KEY_DRIVER_ID);
701                             emitString(store, vulkan12Properties, KEY_DRIVER_NAME);
702                             emitString(store, vulkan12Properties, KEY_DRIVER_INFO);
703 
704                             JSONObject conformanceVersion = vulkan12Properties.getJSONObject(KEY_CONFORMANCE_VERSION);
705                             store.startGroup(convertName(KEY_CONFORMANCE_VERSION));
706                             {
707                                 emitLong(store, conformanceVersion, KEY_MAJOR);
708                                 emitLong(store, conformanceVersion, KEY_MINOR);
709                                 emitLong(store, conformanceVersion, KEY_SUBMINOR);
710                                 emitLong(store, conformanceVersion, KEY_PATCH);
711                             }
712                             store.endGroup();
713 
714                             emitLong(store, vulkan12Properties, KEY_DENORM_BEHAVIOR_INDEPENDENCE);
715                             emitLong(store, vulkan12Properties, KEY_ROUNDING_MODE_INDEPENDENCE);
716                             emitBoolean(store, vulkan12Properties, KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT16);
717                             emitBoolean(store, vulkan12Properties, KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT32);
718                             emitBoolean(store, vulkan12Properties, KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT64);
719                             emitBoolean(store, vulkan12Properties, KEY_SHADER_DENORM_PRESERVE_FLOAT16);
720                             emitBoolean(store, vulkan12Properties, KEY_SHADER_DENORM_PRESERVE_FLOAT32);
721                             emitBoolean(store, vulkan12Properties, KEY_SHADER_DENORM_PRESERVE_FLOAT64);
722                             emitBoolean(store, vulkan12Properties, KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT16);
723                             emitBoolean(store, vulkan12Properties, KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT32);
724                             emitBoolean(store, vulkan12Properties, KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT64);
725                             emitBoolean(store, vulkan12Properties, KEY_SHADER_ROUNDING_MODE_RTE_FLOAT16);
726                             emitBoolean(store, vulkan12Properties, KEY_SHADER_ROUNDING_MODE_RTE_FLOAT32);
727                             emitBoolean(store, vulkan12Properties, KEY_SHADER_ROUNDING_MODE_RTE_FLOAT64);
728                             emitBoolean(store, vulkan12Properties, KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT16);
729                             emitBoolean(store, vulkan12Properties, KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT32);
730                             emitBoolean(store, vulkan12Properties, KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT64);
731                             emitLong(store, vulkan12Properties, KEY_MAX_UPDATE_AFTER_BIND_DESCRIPTORS_IN_ALL_POOLS);
732                             emitBoolean(store, vulkan12Properties, KEY_SHADER_UNIFORM_BUFFER_ARRAY_NONUNIFORM_INDEXING_NATIVE);
733                             emitBoolean(store, vulkan12Properties, KEY_SHADER_SAMPLED_IMAGE_ARRAY_NONUNIFORM_INDEXING_NATIVE);
734                             emitBoolean(store, vulkan12Properties, KEY_SHADER_STORAGE_BUFFER_ARRAY_NONUNIFORM_INDEXING_NATIVE);
735                             emitBoolean(store, vulkan12Properties, KEY_SHADER_STORAGE_IMAGE_ARRAY_NONUNIFORM_INDEXING_NATIVE);
736                             emitBoolean(store, vulkan12Properties, KEY_SHADER_INPUT_ATTACHMENT_ARRAY_NONUNIFORM_INDEXING_NATIVE);
737                             emitBoolean(store, vulkan12Properties, KEY_ROBUST_BUFFER_ACCESS_UPDATE_AFTER_BIND);
738                             emitBoolean(store, vulkan12Properties, KEY_QUAD_DIVERGENT_IMPLICIT_LOD);
739                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_SAMPLERS);
740                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_UNIFORM_BUFFERS);
741                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_STORAGE_BUFFERS);
742                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_SAMPLED_IMAGES);
743                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_STORAGE_IMAGES);
744                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_INPUT_ATTACHMENTS);
745                             emitLong(store, vulkan12Properties, KEY_MAX_PER_STAGE_UPDATE_AFTER_BIND_RESOURCES);
746                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_SAMPLERS);
747                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_UNIFORM_BUFFERS);
748                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_UNIFORM_BUFFERS_DYNAMIC);
749                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_BUFFERS);
750                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_BUFFERS_DYNAMIC);
751                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_SAMPLED_IMAGES);
752                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_IMAGES);
753                             emitLong(store, vulkan12Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_INPUT_ATTACHMENTS);
754                             emitLong(store, vulkan12Properties, KEY_SUPPORTED_DEPTH_RESOLVE_MODES);
755                             emitLong(store, vulkan12Properties, KEY_SUPPORTED_STENCIL_RESOLVE_MODES);
756                             emitBoolean(store, vulkan12Properties, KEY_INDEPENDENT_RESOLVE_NONE);
757                             emitBoolean(store, vulkan12Properties, KEY_INDEPENDENT_RESOLVE);
758                             emitBoolean(store, vulkan12Properties, KEY_FILTER_MINMAX_SINGLE_COMPONENT_FORMATS);
759                             emitBoolean(store, vulkan12Properties, KEY_FILTER_MINMAX_IMAGE_COMPONENT_MAPPING);
760                             emitString(store, vulkan12Properties, KEY_MAX_TIMELINE_SEMAPHORE_VALUE_DIFFERENCE);
761                             emitLong(store, vulkan12Properties, KEY_FRAMEBUFFER_INTEGER_COLOR_SAMPLE_COUNTS);
762                         }
763                         store.endGroup();
764                     }
765 
766                     if (properties.getLong(KEY_API_VERSION) >= VK_API_VERSION_1_3) {
767                         JSONObject core13 = device.getJSONObject(KEY_CORE13);
768                         JSONObject vulkan13Properties = core13.getJSONObject(KEY_PROPERTIES);
769                         store.startGroup(convertName(KEY_VULKAN_13_PROPERTIES));
770                         {
771                             emitLong(store, vulkan13Properties, KEY_MIN_SUBGROUP_SIZE);
772                             emitLong(store, vulkan13Properties, KEY_MAX_SUBGROUP_SIZE);
773                             emitLong(store, vulkan13Properties, KEY_MAX_COMPUTE_WORKGROUP_SUBGROUPS);
774                             emitLong(store, vulkan13Properties, KEY_REQUIRED_SUBGROUP_SIZE_STAGES);
775                             emitLong(store, vulkan13Properties, KEY_MAX_INLINE_UNIFORM_BLOCK_SIZE);
776                             emitLong(store, vulkan13Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_INLINE_UNIFORM_BLOCKS);
777                             emitLong(store, vulkan13Properties, KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_INLINE_UNIFORM_BLOCKS);
778                             emitLong(store, vulkan13Properties, KEY_MAX_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCKS);
779                             emitLong(store, vulkan13Properties, KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_INLINE_UNIFORM_BLOCKS);
780                             emitLong(store, vulkan13Properties, KEY_MAX_INLINE_UNIFORM_TOTAL_SIZE);
781                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_8BIT_UNSIGNED_ACCELERATED);
782                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_8BIT_SIGNED_ACCELERATED);
783                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_8BIT_MIXED_SIGNEDNESS_ACCELERATED);
784                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_UNSIGNED_ACCELERATED);
785                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_SIGNED_ACCELERATED);
786                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_MIXED_SIGNEDNESS_ACCELERATED);
787                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_16BIT_UNSIGNED_ACCELERATED);
788                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_16BIT_SIGNED_ACCELERATED);
789                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_16BIT_MIXED_SIGNEDNESS_ACCELERATED);
790                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_32BIT_UNSIGNED_ACCELERATED);
791                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_32BIT_SIGNED_ACCELERATED);
792                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_32BIT_MIXED_SIGNEDNESS_ACCELERATED);
793                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_64BIT_UNSIGNED_ACCELERATED);
794                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_64BIT_SIGNED_ACCELERATED);
795                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_64BIT_MIXED_SIGNEDNESS_ACCELERATED);
796                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_UNSIGNED_ACCELERATED);
797                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_SIGNED_ACCELERATED);
798                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_MIXED_SIGNEDNESS_ACCELERATED);
799                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_UNSIGNED_ACCELERATED);
800                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_SIGNED_ACCELERATED);
801                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_MIXED_SIGNEDNESS_ACCELERATED);
802                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_UNSIGNED_ACCELERATED);
803                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_SIGNED_ACCELERATED);
804                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_MIXED_SIGNEDNESS_ACCELERATED);
805                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_UNSIGNED_ACCELERATED);
806                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_SIGNED_ACCELERATED);
807                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_MIXED_SIGNEDNESS_ACCELERATED);
808                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_UNSIGNED_ACCELERATED);
809                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_SIGNEDNESS_ACCELERATED);
810                             emitBoolean(store, vulkan13Properties, KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_MIXED_SIGNEDNESS_ACCELERATED);
811                             emitString(store, vulkan13Properties, KEY_STORAGE_TEXEL_BUFFER_OFFSET_ALIGNMENT_BYTES);
812                             emitBoolean(store, vulkan13Properties, KEY_STORAGE_TEXEL_BUFFER_OFFSET_SINGLE_TEXEL_ALIGNMENT);
813                             emitString(store, vulkan13Properties, KEY_UNIFORM_TEXEL_BUFFER_OFFSET_ALIGNMENT_BYTES);
814                             emitBoolean(store, vulkan13Properties, KEY_UNIFORM_TEXEL_BUFFER_OFFSET_SINGLE_TEXEL_ALIGNMENT);
815                             emitString(store, vulkan13Properties, KEY_MAX_BUFFER_SIZE);
816                         }
817                         store.endGroup();
818                     }
819                 }
820                 store.endGroup();
821 
822                 JSONObject features = device.getJSONObject(KEY_FEATURES);
823                 store.startGroup(convertName(KEY_FEATURES));
824                 {
825                     emitBoolean(store, features, KEY_ROBUST_BUFFER_ACCESS);
826                     emitBoolean(store, features, KEY_FULL_DRAW_INDEX_UINT32);
827                     emitBoolean(store, features, KEY_IMAGE_CUBE_ARRAY);
828                     emitBoolean(store, features, KEY_INDEPENDENT_BLEND);
829                     emitBoolean(store, features, KEY_GEOMETRY_SHADER);
830                     emitBoolean(store, features, KEY_TESSELLATION_SHADER);
831                     emitBoolean(store, features, KEY_SAMPLE_RATE_SHADING);
832                     emitBoolean(store, features, KEY_DUAL_SRC_BLEND);
833                     emitBoolean(store, features, KEY_LOGIC_OP);
834                     emitBoolean(store, features, KEY_MULTI_DRAW_INDIRECT);
835                     emitBoolean(store, features, KEY_DRAW_INDIRECT_FIRST_INSTANCE);
836                     emitBoolean(store, features, KEY_DEPTH_CLAMP);
837                     emitBoolean(store, features, KEY_DEPTH_BIAS_CLAMP);
838                     emitBoolean(store, features, KEY_FILL_MODE_NON_SOLID);
839                     emitBoolean(store, features, KEY_DEPTH_BOUNDS);
840                     emitBoolean(store, features, KEY_WIDE_LINES);
841                     emitBoolean(store, features, KEY_LARGE_POINTS);
842                     emitBoolean(store, features, KEY_ALPHA_TO_ONE);
843                     emitBoolean(store, features, KEY_MULTI_VIEWPORT);
844                     emitBoolean(store, features, KEY_SAMPLER_ANISOTROPY);
845                     emitBoolean(store, features, KEY_TEXTURE_COMPRESSION_ETC2);
846                     emitBoolean(store, features, KEY_TEXTURE_COMPRESSION_ASTC_LDR);
847                     emitBoolean(store, features, KEY_TEXTURE_COMPRESSION_BC);
848                     emitBoolean(store, features, KEY_OCCLUSION_QUERY_PRECISE);
849                     emitBoolean(store, features, KEY_PIPELINE_STATISTICS_QUERY);
850                     emitBoolean(store, features, KEY_VERTEX_PIPELINE_STORES_AND_ATOMICS);
851                     emitBoolean(store, features, KEY_FRAGMENT_STORES_AND_ATOMICS);
852                     emitBoolean(store, features, KEY_SHADER_TESSELLATION_AND_GEOMETRY_POINT_SIZE);
853                     emitBoolean(store, features, KEY_SHADER_IMAGE_GATHER_EXTENDED);
854                     emitBoolean(store, features, KEY_SHADER_STORAGE_IMAGE_EXTENDED_FORMATS);
855                     emitBoolean(store, features, KEY_SHADER_STORAGE_IMAGE_MULTISAMPLE);
856                     emitBoolean(store, features, KEY_SHADER_STORAGE_IMAGE_READ_WITHOUT_FORMAT);
857                     emitBoolean(store, features, KEY_SHADER_STORAGE_IMAGE_WRITE_WITHOUT_FORMAT);
858                     emitBoolean(store, features, KEY_SHADER_UNIFORM_BUFFER_ARRAY_DYNAMIC_INDEXING);
859                     emitBoolean(store, features, KEY_SHADER_SAMPLED_IMAGE_ARRAY_DYNAMIC_INDEXING);
860                     emitBoolean(store, features, KEY_SHADER_STORAGE_BUFFER_ARRAY_DYNAMIC_INDEXING);
861                     emitBoolean(store, features, KEY_SHADER_STORAGE_IMAGE_ARRAY_DYNAMIC_INDEXING);
862                     emitBoolean(store, features, KEY_SHADER_CLIP_DISTANCE);
863                     emitBoolean(store, features, KEY_SHADER_CULL_DISTANCE);
864                     emitBoolean(store, features, KEY_SHADER_FLOAT64);
865                     emitBoolean(store, features, KEY_SHADER_INT64);
866                     emitBoolean(store, features, KEY_SHADER_INT16);
867                     emitBoolean(store, features, KEY_SHADER_RESOURCE_RESIDENCY);
868                     emitBoolean(store, features, KEY_SHADER_RESOURCE_MIN_LOD);
869                     emitBoolean(store, features, KEY_SPARSE_BINDING);
870                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_BUFFER);
871                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_IMAGE_2D);
872                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_IMAGE_3D);
873                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_2_SAMPLES);
874                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_4_SAMPLES);
875                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_8_SAMPLES);
876                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_16_SAMPLES);
877                     emitBoolean(store, features, KEY_SPARSE_RESIDENCY_ALIASED);
878                     emitBoolean(store, features, KEY_VARIABLE_MULTISAMPLE_RATE);
879                     emitBoolean(store, features, KEY_INHERITED_QUERIES);
880 
881                     if (properties.getLong(KEY_API_VERSION) >= VK_API_VERSION_1_2) {
882                         JSONObject core12 = device.getJSONObject(KEY_CORE12);
883                         JSONObject vulkan12Features = core12.getJSONObject(KEY_FEATURES);
884                         store.startGroup(convertName(KEY_VULKAN_12_FEATURES));
885                         {
886                             emitBoolean(store, vulkan12Features, KEY_SAMPLER_MIRROR_CLAMP_TO_EDGE);
887                             emitBoolean(store, vulkan12Features, KEY_DRAW_INDIRECT_COUNT);
888                             emitBoolean(store, vulkan12Features, KEY_STORAGE_BUFFER_8BIT_ACCESS);
889                             emitBoolean(store, vulkan12Features, KEY_UNIFORM_AND_STORAGE_BUFFER_8BIT_ACCESS);
890                             emitBoolean(store, vulkan12Features, KEY_STORAGE_PUSH_CONSTANT8);
891                             emitBoolean(store, vulkan12Features, KEY_SHADER_BUFFER_INT64_ATOMICS);
892                             emitBoolean(store, vulkan12Features, KEY_SHADER_SHARED_INT64_ATOMICS);
893                             emitBoolean(store, vulkan12Features, KEY_SHADER_FLOAT16);
894                             emitBoolean(store, vulkan12Features, KEY_SHADER_INT8);
895                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_INDEXING);
896                             emitBoolean(store, vulkan12Features, KEY_SHADER_INPUT_ATTACHMENT_ARRAY_DYNAMIC_INDEXING);
897                             emitBoolean(store, vulkan12Features, KEY_SHADER_UNIFORM_TEXEL_BUFFER_ARRAY_DYNAMIC_INDEXING);
898                             emitBoolean(store, vulkan12Features, KEY_SHADER_STORAGE_TEXEL_BUFFER_ARRAY_DYNAMIC_INDEXING);
899                             emitBoolean(store, vulkan12Features, KEY_SHADER_UNIFORM_BUFFER_ARRAY_NON_UNIFORM_INDEXING);
900                             emitBoolean(store, vulkan12Features, KEY_SHADER_SAMPLED_IMAGE_ARRAY_NON_UNIFORM_INDEXING);
901                             emitBoolean(store, vulkan12Features, KEY_SHADER_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING);
902                             emitBoolean(store, vulkan12Features, KEY_SHADER_STORAGE_IMAGE_ARRAY_NON_UNIFORM_INDEXING);
903                             emitBoolean(store, vulkan12Features, KEY_SHADER_INPUT_ATTACHMENT_ARRAY_NON_UNIFORM_INDEXING);
904                             emitBoolean(store, vulkan12Features, KEY_SHADER_UNIFORM_TEXEL_BUFFER_ARRAY_NON_UNIFORM_INDEXING);
905                             emitBoolean(store, vulkan12Features, KEY_SHADER_STORAGE_TEXEL_BUFFER_ARRAY_NON_UNIFORM_INDEXING);
906                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_UNIFORM_BUFFER_UPDATE_AFTER_BIND);
907                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_SAMPLED_IMAGE_UPDATE_AFTER_BIND);
908                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_STORAGE_IMAGE_UPDATE_AFTER_BIND);
909                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_STORAGE_BUFFER_UPDATE_AFTER_BIND);
910                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_UNIFORM_TEXEL_BUFFER_UPDATE_AFTER_BIND);
911                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_STORAGE_TEXEL_BUFFER_UPDATE_AFTER_BIND);
912                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING);
913                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_PARTIALLY_BOUND);
914                             emitBoolean(store, vulkan12Features, KEY_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT);
915                             emitBoolean(store, vulkan12Features, KEY_RUNTIME_DESCRIPTOR_ARRAY);
916                             emitBoolean(store, vulkan12Features, KEY_SAMPLER_FILTER_MINMAX);
917                             emitBoolean(store, vulkan12Features, KEY_SCALAR_BLOCK_LAYOUT);
918                             emitBoolean(store, vulkan12Features, KEY_IMAGELESS_FRAMEBUFFER);
919                             emitBoolean(store, vulkan12Features, KEY_UNIFORM_BUFFER_STANDARD_LAYOUT);
920                             emitBoolean(store, vulkan12Features, KEY_SHADER_SUBGROUP_EXTENDED_TYPES);
921                             emitBoolean(store, vulkan12Features, KEY_SEPARATE_DEPTH_STENCIL_LAYOUTS);
922                             emitBoolean(store, vulkan12Features, KEY_HOST_QUERY_RESET);
923                             emitBoolean(store, vulkan12Features, KEY_TIMELINE_SEMAPHORE);
924                             emitBoolean(store, vulkan12Features, KEY_BUFFER_DEVICE_ADDRESS);
925                             emitBoolean(store, vulkan12Features, KEY_BUFFER_DEVICE_ADDRESS_CAPTURE_REPLAY);
926                             emitBoolean(store, vulkan12Features, KEY_BUFFER_DEVICE_ADDRESS_MULTI_DEVICE);
927                             emitBoolean(store, vulkan12Features, KEY_VULKAN_MEMORY_MODEL);
928                             emitBoolean(store, vulkan12Features, KEY_VULKAN_MEMORY_MODEL_DEVICE_SCOPE);
929                             emitBoolean(store, vulkan12Features, KEY_VULKAN_MEMORY_MODEL_AVAILABILITY_VISIBILITY_CHAINS);
930                             emitBoolean(store, vulkan12Features, KEY_SHADER_OUTPUT_VIEWPORT_INDEX);
931                             emitBoolean(store, vulkan12Features, KEY_SHADER_OUTPUT_LAYER);
932                             // subgroupBroadcastDynamicId was erroneously left out of vkjson reporting in Android T
933                             //   and later added in U, so we need to explicitly check if the feature is reported
934                             if (vulkan12Features.has(KEY_SUBGROUP_BROADCAST_DYNAMIC_ID)) {
935                                 emitBoolean(store, vulkan12Features, KEY_SUBGROUP_BROADCAST_DYNAMIC_ID);
936                             }
937                         }
938                         store.endGroup();
939                     }
940 
941                     if (properties.getLong(KEY_API_VERSION) >= VK_API_VERSION_1_3) {
942                         JSONObject core13 = device.getJSONObject(KEY_CORE13);
943                         JSONObject vulkan13Features = core13.getJSONObject(KEY_FEATURES);
944                         store.startGroup(convertName(KEY_VULKAN_13_FEATURES));
945                         {
946                             emitBoolean(store, vulkan13Features, KEY_ROBUST_IMAGE_ACCESS);
947                             emitBoolean(store, vulkan13Features, KEY_INLINE_UNIFORM_BLOCK);
948                             emitBoolean(store, vulkan13Features, KEY_DESCRIPTOR_BINDING_INLINE_UNIFORM_BLOCK_UPDATE_AFTER_BIND);
949                             emitBoolean(store, vulkan13Features, KEY_PIPELINE_CREATION_CACHE_CONTROL);
950                             emitBoolean(store, vulkan13Features, KEY_PRIVATE_DATA);
951                             emitBoolean(store, vulkan13Features, KEY_SHADER_DEMOTE_TO_HELPER_INVOCATION);
952                             emitBoolean(store, vulkan13Features, KEY_SHADER_TERMINATE_INVOCATION);
953                             emitBoolean(store, vulkan13Features, KEY_SUBGROUP_SIZE_CONTROL);
954                             emitBoolean(store, vulkan13Features, KEY_COMPUTE_FULL_SUBGROUPS);
955                             emitBoolean(store, vulkan13Features, KEY_SYNCHRONIZATION2);
956                             emitBoolean(store, vulkan13Features, KEY_TEXTURE_COMPRESSION_ASTC_HDR);
957                             emitBoolean(store, vulkan13Features, KEY_SHADER_ZERO_INITIALIZE_WORKGROUP_MEMORY);
958                             emitBoolean(store, vulkan13Features, KEY_DYNAMIC_RENDERING);
959                             emitBoolean(store, vulkan13Features, KEY_SHADER_INTEGER_DOT_PRODUCT);
960                             emitBoolean(store, vulkan13Features, KEY_MAINTENANCE4);
961                         }
962                         store.endGroup();
963                     }
964                 }
965                 store.endGroup();
966 
967                 JSONObject memory = device.getJSONObject(KEY_MEMORY);
968                 store.startGroup(convertName(KEY_MEMORY));
969                 {
970                     emitLong(store, memory, KEY_MEMORY_TYPE_COUNT);
971                     JSONArray memoryTypes = memory.getJSONArray(KEY_MEMORY_TYPES);
972                     store.startArray(convertName(KEY_MEMORY_TYPES));
973                     for (int memoryTypeIdx = 0; memoryTypeIdx < memoryTypes.length();
974                             memoryTypeIdx++) {
975                         JSONObject memoryType = memoryTypes.getJSONObject(memoryTypeIdx);
976                         store.startGroup();
977                         {
978                             emitLong(store, memoryType, KEY_PROPERTY_FLAGS);
979                             emitLong(store, memoryType, KEY_HEAP_INDEX);
980                         }
981                         store.endGroup();
982                     }
983                     store.endArray();
984 
985                     emitLong(store, memory, KEY_MEMORY_HEAP_COUNT);
986                     JSONArray memoryHeaps = memory.getJSONArray(KEY_MEMORY_HEAPS);
987                     store.startArray(convertName(KEY_MEMORY_HEAPS));
988                     for (int memoryHeapIdx = 0; memoryHeapIdx < memoryHeaps.length();
989                             memoryHeapIdx++) {
990                         JSONObject memoryHeap = memoryHeaps.getJSONObject(memoryHeapIdx);
991                         store.startGroup();
992                         {
993                             emitString(store, memoryHeap, KEY_SIZE);
994                             emitLong(store, memoryHeap, KEY_FLAGS);
995                         }
996                         store.endGroup();
997                     }
998                     store.endArray();
999                 }
1000                 store.endGroup();
1001 
1002                 JSONArray queues = device.getJSONArray(KEY_QUEUES);
1003                 store.startArray(convertName(KEY_QUEUES));
1004                 for (int queueIdx = 0; queueIdx < queues.length(); queueIdx++) {
1005                     JSONObject queue = queues.getJSONObject(queueIdx);
1006                     store.startGroup();
1007                     {
1008                         emitLong(store, queue, KEY_QUEUE_FLAGS);
1009                         emitLong(store, queue, KEY_QUEUE_COUNT);
1010                         emitLong(store, queue, KEY_TIMESTAMP_VALID_BITS);
1011                         JSONObject extent = queue.getJSONObject(KEY_MIN_IMAGE_TRANSFER_GRANULARITY);
1012                         store.startGroup(convertName(KEY_MIN_IMAGE_TRANSFER_GRANULARITY));
1013                         {
1014                             emitLong(store, extent, KEY_WIDTH);
1015                             emitLong(store, extent, KEY_HEIGHT);
1016                             emitLong(store, extent, KEY_DEPTH);
1017                         }
1018                         store.endGroup();
1019                     }
1020                     store.endGroup();
1021                 }
1022                 store.endArray();
1023 
1024                 // Skip layers for now. VkJSON doesn't yet include device layer extensions, so
1025                 // this is entirely redundant with the instance extension information.
1026                 // emitLayers(store, device);
1027                 store.startArray(convertName(KEY_LAYERS));
1028                 store.endArray();
1029 
1030                 emitExtensions(store, device);
1031 
1032                 JSONArray formats = device.getJSONArray(KEY_FORMATS);
1033                 // Note: Earlier code used field named 'formats' with different data structure.
1034                 // In order to have the mix of old and new data, we cannot reuse that name.
1035                 store.startArray("supported_formats");
1036                 for (int formatIdx = 0; formatIdx < formats.length(); formatIdx++) {
1037                     JSONArray formatPair = formats.getJSONArray(formatIdx);
1038                     JSONObject formatProperties = formatPair.getJSONObject(1);
1039                     store.startGroup();
1040                     {
1041                         store.addResult("format", (long)formatPair.getInt(0));
1042                         emitLong(store, formatProperties, KEY_LINEAR_TILING_FEATURES);
1043                         emitLong(store, formatProperties, KEY_OPTIMAL_TILING_FEATURES);
1044                         emitLong(store, formatProperties, KEY_BUFFER_FEATURES);
1045                     }
1046                     store.endGroup();
1047                 }
1048                 store.endArray();
1049 
1050                 if (properties.getLong(KEY_API_VERSION) >= VK_API_VERSION_1_1) {
1051                     JSONObject subgroupProperties = device.getJSONObject(KEY_SUBGROUP_PROPERTIES);
1052                     store.startGroup(convertName(KEY_SUBGROUP_PROPERTIES));
1053                     {
1054                         emitLong(store, subgroupProperties, KEY_SUBGROUP_SIZE);
1055                         emitLong(store, subgroupProperties, KEY_SUPPORTED_STAGES);
1056                         emitLong(store, subgroupProperties, KEY_SUPPORTED_OPERATIONS);
1057                         emitBoolean(store, subgroupProperties, KEY_QUAD_OPERATIONS_IN_ALL_STAGES);
1058                     }
1059                     store.endGroup();
1060 
1061                     JSONObject pointClippingProperties = device.getJSONObject(KEY_POINT_CLIPPING_PROPERTIES);
1062                     store.startGroup(convertName(KEY_POINT_CLIPPING_PROPERTIES));
1063                     {
1064                         emitLong(store, pointClippingProperties, KEY_POINT_CLIPPING_BEHAVIOR);
1065                     }
1066                     store.endGroup();
1067 
1068                     JSONObject multiviewProperties = device.getJSONObject(KEY_MULTIVIEW_PROPERTIES);
1069                     store.startGroup(convertName(KEY_MULTIVIEW_PROPERTIES));
1070                     {
1071                         emitLong(store, multiviewProperties, KEY_MAX_MULTIVIEW_VIEW_COUNT);
1072                         emitLong(store, multiviewProperties, KEY_MAX_MULTIVIEW_INSTANCE_INDEX);
1073                     }
1074                     store.endGroup();
1075 
1076                     JSONObject idProperties = device.getJSONObject(KEY_ID_PROPERTIES);
1077                     store.startGroup(convertName(KEY_ID_PROPERTIES));
1078                     {
1079                         emitLongArray(store, idProperties, KEY_DEVICE_UUID);
1080                         emitLongArray(store, idProperties, KEY_DRIVER_UUID);
1081                         emitLongArray(store, idProperties, KEY_DEVICE_LUID);
1082                         emitLong(store, idProperties, KEY_DEVICE_NODE_MASK);
1083                         emitBoolean(store, idProperties, KEY_DEVICE_LUID_VALID);
1084                     }
1085                     store.endGroup();
1086 
1087                     JSONObject maintenance3Properties = device.getJSONObject(KEY_MAINTENANCE_3_PROPERTIES);
1088                     store.startGroup(convertName(KEY_MAINTENANCE_3_PROPERTIES));
1089                     {
1090                         emitLong(store, maintenance3Properties, KEY_MAX_PER_SET_DESCRIPTORS);
1091                         emitString(store, maintenance3Properties, KEY_MAX_MEMORY_ALLOCATION_SIZE);
1092                     }
1093                     store.endGroup();
1094 
1095                     JSONObject bit16StorageFeatures = device.getJSONObject(KEY_16BIT_STORAGE_FEATURES);
1096                     store.startGroup(convertName(KEY_16BIT_STORAGE_FEATURES));
1097                     {
1098                         emitBoolean(store, bit16StorageFeatures, KEY_STORAGE_BUFFER_16BIT_ACCESS);
1099                         emitBoolean(store, bit16StorageFeatures, KEY_UNIFORM_AND_STORAGE_BUFFER_16BIT_ACCESS);
1100                         emitBoolean(store, bit16StorageFeatures, KEY_STORAGE_PUSH_CONSTANT_16);
1101                         emitBoolean(store, bit16StorageFeatures, KEY_STORAGE_INPUT_OUTPUT_16);
1102                     }
1103                     store.endGroup();
1104 
1105                     JSONObject multiviewFeatures = device.getJSONObject(KEY_MULTIVIEW_FEATURES);
1106                     store.startGroup(convertName(KEY_MULTIVIEW_FEATURES));
1107                     {
1108                         emitBoolean(store, multiviewFeatures, KEY_MULTIVIEW);
1109                         emitBoolean(store, multiviewFeatures, KEY_MULTIVIEW_GEOMETRY_SHADER);
1110                         emitBoolean(store, multiviewFeatures, KEY_MULTIVIEW_TESSELLATION_SHADER);
1111                     }
1112                     store.endGroup();
1113 
1114                     JSONObject variablePointerFeatures = device.getJSONObject(KEY_VARIABLE_POINTER_FEATURES);
1115                     store.startGroup(convertName(KEY_VARIABLE_POINTER_FEATURES));
1116                     {
1117                         emitBoolean(store, variablePointerFeatures, KEY_VARIABLE_POINTERS_STORAGE_BUFFER);
1118                         emitBoolean(store, variablePointerFeatures, KEY_VARIABLE_POINTERS);
1119                     }
1120                     store.endGroup();
1121 
1122                     JSONObject protectedMemoryFeatures = device.getJSONObject(KEY_PROTECTED_MEMORY_FEATURES);
1123                     store.startGroup(convertName(KEY_PROTECTED_MEMORY_FEATURES));
1124                     {
1125                         emitBoolean(store, protectedMemoryFeatures, KEY_PROTECTED_MEMORY);
1126                     }
1127                     store.endGroup();
1128 
1129                     JSONObject samplerYcbcrConversionFeatures = device.getJSONObject(KEY_SAMPLER_YCBCR_CONVERSION_FEATURES);
1130                     store.startGroup(convertName(KEY_SAMPLER_YCBCR_CONVERSION_FEATURES));
1131                     {
1132                         emitBoolean(store, samplerYcbcrConversionFeatures, KEY_SAMPLER_YCBCR_CONVERSION);
1133                     }
1134                     store.endGroup();
1135 
1136                     JSONObject shaderDrawParameterFeatures = device.getJSONObject(KEY_SHADER_DRAW_PARAMETER_FEATURES);
1137                     store.startGroup(convertName(KEY_SHADER_DRAW_PARAMETER_FEATURES));
1138                     {
1139                         emitBoolean(store, shaderDrawParameterFeatures, KEY_SHADER_DRAW_PARAMETERS);
1140                     }
1141                     store.endGroup();
1142 
1143                     JSONArray externalFences = device.getJSONArray(KEY_EXTERNAL_FENCE_PROPERTIES);
1144                     store.startArray(convertName(KEY_EXTERNAL_FENCE_PROPERTIES));
1145                     for (int idx = 0; idx < externalFences.length(); ++idx) {
1146                         JSONArray externalFencePair = externalFences.getJSONArray(idx);
1147                         JSONObject externalFenceProperties = externalFencePair.getJSONObject(1);
1148                         store.startGroup();
1149                         {
1150                             store.addResult("handle_type", externalFencePair.getLong(0));
1151                             emitLong(store, externalFenceProperties, KEY_EXPORT_FROM_IMPORTED_HANDLE_TYPES);
1152                             emitLong(store, externalFenceProperties, KEY_COMPATIBLE_HANDLE_TYPES);
1153                             emitLong(store, externalFenceProperties, KEY_EXTERNAL_FENCE_FEATURES);
1154                         }
1155                         store.endGroup();
1156                     }
1157                     store.endArray();
1158 
1159                     JSONArray externalSemaphores = device.getJSONArray(KEY_EXTERNAL_SEMAPHORE_PROPERTIES);
1160                     store.startArray(convertName(KEY_EXTERNAL_SEMAPHORE_PROPERTIES));
1161                     for (int idx = 0; idx < externalSemaphores.length(); ++idx) {
1162                         JSONArray externalSemaphorePair = externalSemaphores.getJSONArray(idx);
1163                         JSONObject externalSemaphoreProperties = externalSemaphorePair.getJSONObject(1);
1164                         store.startGroup();
1165                         {
1166                             store.addResult("handle_type", externalSemaphorePair.getLong(0));
1167                             emitLong(store, externalSemaphoreProperties, KEY_EXPORT_FROM_IMPORTED_HANDLE_TYPES);
1168                             emitLong(store, externalSemaphoreProperties, KEY_COMPATIBLE_HANDLE_TYPES);
1169                             emitLong(store, externalSemaphoreProperties, KEY_EXTERNAL_SEMAPHORE_FEATURES);
1170                         }
1171                         store.endGroup();
1172                     }
1173                     store.endArray();
1174                 }
1175             }
1176             store.endGroup();
1177         }
1178         store.endArray();
1179     }
1180 
emitLayers(DeviceInfoStore store, JSONObject parent)1181     private static void emitLayers(DeviceInfoStore store, JSONObject parent)
1182             throws Exception {
1183         JSONArray layers = parent.getJSONArray(KEY_LAYERS);
1184         store.startArray(convertName(KEY_LAYERS));
1185         for (int i = 0; i < layers.length(); i++) {
1186             JSONObject layer = layers.getJSONObject(i);
1187             store.startGroup();
1188             {
1189                 JSONObject properties = layer.getJSONObject(KEY_PROPERTIES);
1190                 store.startGroup(convertName(KEY_PROPERTIES));
1191                 {
1192                     emitString(store, properties, KEY_LAYER_NAME);
1193                     emitLong(store, properties, KEY_SPEC_VERSION);
1194                     emitLong(store, properties, KEY_IMPLEMENTATION_VERSION);
1195                     emitString(store, properties, KEY_DESCRIPTION);
1196                 }
1197                 store.endGroup();
1198                 emitExtensions(store, layer);
1199             }
1200             store.endGroup();
1201         }
1202         store.endArray();
1203     }
1204 
emitInstanceApiVersion(DeviceInfoStore store, JSONObject parent)1205     private static void emitInstanceApiVersion(DeviceInfoStore store, JSONObject parent)
1206             throws Exception {
1207         store.addResult(convertName(KEY_INSTANCE_API_VERSION), parent.getLong(KEY_API_VERSION));
1208     }
1209 
emitDriverPropertiesKHR(DeviceInfoStore store, JSONObject parent)1210     private static void emitDriverPropertiesKHR(DeviceInfoStore store, JSONObject parent)
1211             throws Exception {
1212         try {
1213             JSONObject extDriverProperties = parent.getJSONObject(KEY_VK_KHR_DRIVER_PROPERTIES);
1214             try {
1215                 store.startGroup(convertName(KEY_VK_KHR_DRIVER_PROPERTIES));
1216                 {
1217                     JSONObject driverPropertiesKHR = extDriverProperties.getJSONObject(KEY_DRIVER_PROPERTIES_KHR);
1218                     store.startGroup(convertName(KEY_DRIVER_PROPERTIES_KHR));
1219                     {
1220                         emitLong(store, driverPropertiesKHR, KEY_DRIVER_ID);
1221                         emitString(store, driverPropertiesKHR, KEY_DRIVER_NAME);
1222                         emitString(store, driverPropertiesKHR, KEY_DRIVER_INFO);
1223 
1224                         JSONObject conformanceVersion = driverPropertiesKHR.getJSONObject(KEY_CONFORMANCE_VERSION);
1225                         store.startGroup(convertName(KEY_CONFORMANCE_VERSION));
1226                         {
1227                             emitLong(store, conformanceVersion, KEY_MAJOR);
1228                             emitLong(store, conformanceVersion, KEY_MINOR);
1229                             emitLong(store, conformanceVersion, KEY_SUBMINOR);
1230                             emitLong(store, conformanceVersion, KEY_PATCH);
1231                         }
1232                         store.endGroup();
1233                     }
1234                     store.endGroup();
1235                 }
1236                 store.endGroup();
1237             } catch (JSONException e) {
1238                 e.printStackTrace();
1239                 throw new RuntimeException(e);
1240             }
1241         } catch (JSONException ignored) {
1242         }
1243     }
1244 
emitVariablePointerFeaturesKHR(DeviceInfoStore store, JSONObject parent)1245     private static void emitVariablePointerFeaturesKHR(DeviceInfoStore store, JSONObject parent)
1246             throws Exception {
1247         try {
1248             JSONObject extVariablePointerFeatures = parent.getJSONObject(KEY_VK_KHR_VARIABLE_POINTERS);
1249             try {
1250                 store.startGroup(convertName(KEY_VK_KHR_VARIABLE_POINTERS));
1251                 {
1252                     JSONObject variablePointerFeaturesKHR = extVariablePointerFeatures.getJSONObject(KEY_VARIABLE_POINTER_FEATURES_KHR);
1253                     store.startGroup(convertName(KEY_VARIABLE_POINTER_FEATURES_KHR));
1254                     {
1255                         emitBoolean(store, variablePointerFeaturesKHR, KEY_VARIABLE_POINTERS_STORAGE_BUFFER);
1256                         emitBoolean(store, variablePointerFeaturesKHR, KEY_VARIABLE_POINTERS);
1257                     }
1258                     store.endGroup();
1259                 }
1260                 store.endGroup();
1261             } catch (JSONException e) {
1262                 e.printStackTrace();
1263                 throw new RuntimeException(e);
1264             }
1265         } catch (JSONException ignored) {
1266         }
1267     }
1268 
emitExtension(String key, DeviceInfoStore store, JSONObject parent)1269     private static void emitExtension(String key, DeviceInfoStore store, JSONObject parent)
1270             throws Exception {
1271         if (!extensionNameToEnum.containsKey(key)) return;
1272         switch (extensionNameToEnum.get(key)) {
1273             case ENUM_VK_KHR_VARIABLE_POINTERS:
1274               emitVariablePointerFeaturesKHR(store, parent);
1275               break;
1276             case ENUM_VK_KHR_DRIVER_PROPERTIES:
1277               emitDriverPropertiesKHR(store, parent);
1278               break;
1279         }
1280     }
1281 
emitExtensions(DeviceInfoStore store, JSONObject parent)1282     private static void emitExtensions(DeviceInfoStore store, JSONObject parent)
1283             throws Exception {
1284         JSONArray extensions = parent.getJSONArray(KEY_EXTENSIONS);
1285         store.startArray(convertName(KEY_EXTENSIONS));
1286         for (int i = 0; i < extensions.length(); i++) {
1287             JSONObject extension = extensions.getJSONObject(i);
1288             store.startGroup();
1289             {
1290                 emitString(store, extension, KEY_EXTENSION_NAME);
1291                 emitLong(store, extension, KEY_SPEC_VERSION);
1292             }
1293             store.endGroup();
1294         }
1295         store.endArray();
1296 
1297         for (int i = 0; i < extensions.length(); i++) {
1298             JSONObject extension = extensions.getJSONObject(i);
1299             String key = extension.getString(KEY_EXTENSION_NAME);
1300             emitExtension(key, store, parent);
1301         }
1302     }
1303 
emitBoolean(DeviceInfoStore store, JSONObject parent, String name)1304     private static void emitBoolean(DeviceInfoStore store, JSONObject parent, String name)
1305             throws Exception {
1306         store.addResult(convertName(name), parent.getInt(name) != 0 ? true : false);
1307     }
1308 
emitLong(DeviceInfoStore store, JSONObject parent, String name)1309     private static void emitLong(DeviceInfoStore store, JSONObject parent, String name)
1310             throws Exception {
1311         store.addResult(convertName(name), parent.getLong(name));
1312     }
1313 
emitDouble(DeviceInfoStore store, JSONObject parent, String name)1314     private static void emitDouble(DeviceInfoStore store, JSONObject parent, String name)
1315             throws Exception {
1316         store.addResult(convertName(name), parent.getDouble(name));
1317     }
1318 
emitString(DeviceInfoStore store, JSONObject parent, String name)1319     private static void emitString(DeviceInfoStore store, JSONObject parent, String name)
1320             throws Exception {
1321         store.addResult(convertName(name), parent.getString(name));
1322     }
1323 
emitLongArray(DeviceInfoStore store, JSONObject parent, String name)1324     private static void emitLongArray(DeviceInfoStore store, JSONObject parent, String name)
1325             throws Exception {
1326         JSONArray jsonArray = parent.getJSONArray(name);
1327         long[] array = new long[jsonArray.length()];
1328         for (int i = 0; i < jsonArray.length(); i++) {
1329             array[i] = jsonArray.getLong(i);
1330         }
1331         store.addArrayResult(convertName(name), array);
1332     }
1333 
emitDoubleArray(DeviceInfoStore store, JSONObject parent, String name)1334     private static void emitDoubleArray(DeviceInfoStore store, JSONObject parent, String name)
1335             throws Exception {
1336         JSONArray jsonArray = parent.getJSONArray(name);
1337         double[] array = new double[jsonArray.length()];
1338         for (int i = 0; i < jsonArray.length(); i++) {
1339             array[i] = jsonArray.getDouble(i);
1340         }
1341         store.addArrayResult(convertName(name), array);
1342     }
1343 
convertName(String name)1344     private static String convertName(String name) {
1345         // This translation could be done algorithmically, but in this case being able to
1346         // code-search for both the original and converted names is more important.
1347         switch (name) {
1348             case KEY_16BIT_STORAGE_FEATURES: return "bit16_storage_features";
1349             case KEY_ALPHA_TO_ONE: return "alpha_to_one";
1350             case KEY_API_VERSION: return "api_version";
1351             case KEY_BUFFER_DEVICE_ADDRESS: return "buffer_device_address";
1352             case KEY_BUFFER_DEVICE_ADDRESS_CAPTURE_REPLAY: return "buffer_device_address_capture_replay";
1353             case KEY_BUFFER_DEVICE_ADDRESS_MULTI_DEVICE: return "buffer_device_address_multi_device";
1354             case KEY_BUFFER_FEATURES: return "buffer_features";
1355             case KEY_BUFFER_IMAGE_GRANULARITY: return "buffer_image_granularity";
1356             case KEY_COMPATIBLE_HANDLE_TYPES: return "compatible_handle_types";
1357             case KEY_COMPUTE_FULL_SUBGROUPS: return "compute_full_subgroups";
1358             case KEY_CONFORMANCE_VERSION: return "conformance_version";
1359             case KEY_DENORM_BEHAVIOR_INDEPENDENCE: return "denorm_behavior_independence";
1360             case KEY_DEPTH: return "depth";
1361             case KEY_DEPTH_BIAS_CLAMP: return "depth_bias_clamp";
1362             case KEY_DEPTH_BOUNDS: return "depth_bounds";
1363             case KEY_DEPTH_CLAMP: return "depth_clamp";
1364             case KEY_DESCRIPTION: return "description";
1365             case KEY_DESCRIPTOR_BINDING_INLINE_UNIFORM_BLOCK_UPDATE_AFTER_BIND: return "descriptor_binding_inline_uniform_block_update_after_bind";
1366             case KEY_DESCRIPTOR_BINDING_PARTIALLY_BOUND: return "descriptor_binding_partially_bound";
1367             case KEY_DESCRIPTOR_BINDING_SAMPLED_IMAGE_UPDATE_AFTER_BIND: return "descriptor_binding_sampled_image_update_after_bind";
1368             case KEY_DESCRIPTOR_BINDING_STORAGE_BUFFER_UPDATE_AFTER_BIND: return "descriptor_binding_storage_buffer_update_after_bind";
1369             case KEY_DESCRIPTOR_BINDING_STORAGE_IMAGE_UPDATE_AFTER_BIND: return "descriptor_binding_storage_image_update_after_bind";
1370             case KEY_DESCRIPTOR_BINDING_STORAGE_TEXEL_BUFFER_UPDATE_AFTER_BIND: return "descriptor_binding_storage_texel_buffer_update_after_bind";
1371             case KEY_DESCRIPTOR_BINDING_UNIFORM_BUFFER_UPDATE_AFTER_BIND: return "descriptor_binding_uniform_buffer_update_after_bind";
1372             case KEY_DESCRIPTOR_BINDING_UNIFORM_TEXEL_BUFFER_UPDATE_AFTER_BIND: return "descriptor_binding_uniform_texel_buffer_update_after_bind";
1373             case KEY_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING: return "descriptor_binding_update_unused_while_pending";
1374             case KEY_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT: return "descriptor_binding_variable_descriptor_count";
1375             case KEY_DESCRIPTOR_INDEXING: return "descriptor_indexing";
1376             case KEY_DEVICES: return "devices";
1377             case KEY_DEVICE_GROUPS: return "device_groups";
1378             case KEY_DEVICE_ID: return "device_id";
1379             case KEY_DEVICE_LUID: return "device_luid";
1380             case KEY_DEVICE_LUID_VALID: return "device_luid_valid";
1381             case KEY_DEVICE_NAME: return "device_name";
1382             case KEY_DEVICE_NODE_MASK: return "device_node_mask";
1383             case KEY_DEVICE_TYPE: return "device_type";
1384             case KEY_DEVICE_UUID: return "device_uuid";
1385             case KEY_DISCRETE_QUEUE_PRIORITIES: return "discrete_queue_priorities";
1386             case KEY_DRAW_INDIRECT_COUNT: return "draw_indirect_count";
1387             case KEY_DRAW_INDIRECT_FIRST_INSTANCE: return "draw_indirect_first_instance";
1388             case KEY_DRIVER_ID: return "driver_id";
1389             case KEY_DRIVER_INFO: return "driver_info";
1390             case KEY_DRIVER_NAME: return "driver_name";
1391             case KEY_DRIVER_PROPERTIES_KHR: return "driver_properties_khr";
1392             case KEY_DRIVER_UUID: return "driver_uuid";
1393             case KEY_DRIVER_VERSION: return "driver_version";
1394             case KEY_DUAL_SRC_BLEND: return "dual_src_blend";
1395             case KEY_DYNAMIC_RENDERING: return "dynamic_rendering";
1396             case KEY_EXPORT_FROM_IMPORTED_HANDLE_TYPES: return "export_from_imported_handle_types";
1397             case KEY_EXTENSIONS: return "extensions";
1398             case KEY_EXTENSION_NAME: return "extension_name";
1399             case KEY_EXTERNAL_FENCE_FEATURES: return "external_fence_features";
1400             case KEY_EXTERNAL_FENCE_PROPERTIES: return "external_fence_properties";
1401             case KEY_EXTERNAL_SEMAPHORE_FEATURES: return "external_semaphore_features";
1402             case KEY_EXTERNAL_SEMAPHORE_PROPERTIES: return "external_semaphore_properties";
1403             case KEY_FEATURES: return "features";
1404             case KEY_FILL_MODE_NON_SOLID: return "fill_mode_non_solid";
1405             case KEY_FILTER_MINMAX_IMAGE_COMPONENT_MAPPING: return "filter_minmax_image_component_mapping";
1406             case KEY_FILTER_MINMAX_SINGLE_COMPONENT_FORMATS: return "filter_minmax_single_component_formats";
1407             case KEY_FLAGS: return "flags";
1408             case KEY_FORMATS: return "formats";
1409             case KEY_FRAGMENT_STORES_AND_ATOMICS: return "fragment_stores_and_atomics";
1410             case KEY_FRAMEBUFFER_COLOR_SAMPLE_COUNTS: return "framebuffer_color_sample_counts";
1411             case KEY_FRAMEBUFFER_DEPTH_SAMPLE_COUNTS: return "framebuffer_depth_sample_counts";
1412             case KEY_FRAMEBUFFER_INTEGER_COLOR_SAMPLE_COUNTS: return "framebuffer_integer_color_sample_counts";
1413             case KEY_FRAMEBUFFER_NO_ATTACHMENTS_SAMPLE_COUNTS: return "framebuffer_no_attachments_sample_counts";
1414             case KEY_FRAMEBUFFER_STENCIL_SAMPLE_COUNTS: return "framebuffer_stencil_sample_counts";
1415             case KEY_FULL_DRAW_INDEX_UINT32: return "full_draw_index_uint32";
1416             case KEY_GEOMETRY_SHADER: return "geometry_shader";
1417             case KEY_HEAP_INDEX: return "heap_index";
1418             case KEY_HEIGHT: return "height";
1419             case KEY_HOST_QUERY_RESET: return "host_query_reset";
1420             case KEY_ID_PROPERTIES: return "id_properties";
1421             case KEY_IMAGELESS_FRAMEBUFFER: return "imageless_framebuffer";
1422             case KEY_IMAGE_CUBE_ARRAY: return "image_cube_array";
1423             case KEY_IMPLEMENTATION_VERSION: return "implementation_version";
1424             case KEY_INDEPENDENT_BLEND: return "independent_blend";
1425             case KEY_INDEPENDENT_RESOLVE: return "independent_resolve";
1426             case KEY_INDEPENDENT_RESOLVE_NONE: return "independent_resolve_none";
1427             case KEY_INHERITED_QUERIES: return "inherited_queries";
1428             case KEY_INLINE_UNIFORM_BLOCK: return "inline_uniform_block";
1429             case KEY_INSTANCE_API_VERSION: return "instance_api_version";
1430             case KEY_INTEGER_DOT_PRODUCT_16BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_16bit_mixed_signedness_accelerated";
1431             case KEY_INTEGER_DOT_PRODUCT_16BIT_SIGNED_ACCELERATED: return "integer_dot_product_16bit_signed_accelerated";
1432             case KEY_INTEGER_DOT_PRODUCT_16BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_16bit_unsigned_accelerated";
1433             case KEY_INTEGER_DOT_PRODUCT_32BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_32bit_mixed_signedness_accelerated";
1434             case KEY_INTEGER_DOT_PRODUCT_32BIT_SIGNED_ACCELERATED: return "integer_dot_product_32bit_signed_accelerated";
1435             case KEY_INTEGER_DOT_PRODUCT_32BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_32bit_unsigned_accelerated";
1436             case KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_4x8bit_packed_mixed_signedness_accelerated";
1437             case KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_SIGNED_ACCELERATED: return "integer_dot_product_4x8bit_packed_signed_accelerated";
1438             case KEY_INTEGER_DOT_PRODUCT_4X8BIT_PACKED_UNSIGNED_ACCELERATED: return "integer_dot_product_4x8bit_packed_unsigned_accelerated";
1439             case KEY_INTEGER_DOT_PRODUCT_64BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_64bit_mixed_signedness_accelerated";
1440             case KEY_INTEGER_DOT_PRODUCT_64BIT_SIGNED_ACCELERATED: return "integer_dot_product_64bit_signed_accelerated";
1441             case KEY_INTEGER_DOT_PRODUCT_64BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_64bit_unsigned_accelerated";
1442             case KEY_INTEGER_DOT_PRODUCT_8BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_8bit_mixed_signedness_accelerated";
1443             case KEY_INTEGER_DOT_PRODUCT_8BIT_SIGNED_ACCELERATED: return "integer_dot_product_8bit_signed_accelerated";
1444             case KEY_INTEGER_DOT_PRODUCT_8BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_8bit_unsigned_accelerated";
1445             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_accumulating_saturating_16bit_mixed_signedness_accelerated";
1446             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_SIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_16bit_signed_accelerated";
1447             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_16BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_16bit_unsigned_accelerated";
1448             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_accumulating_saturating_32bit_mixed_signedness_accelerated";
1449             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_SIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_32bit_signed_accelerated";
1450             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_32BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_32bit_unsigned_accelerated";
1451             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_accumulating_saturating_4x8bit_packed_mixed_signedness_accelerated";
1452             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_SIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_4x8bit_packed_signed_accelerated";
1453             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_4X8BIT_PACKED_UNSIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_4x8bit_packed_unsigned_accelerated";
1454             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_accumulating_saturating_64bit_mixed_signedness_accelerated";
1455             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_SIGNEDNESS_ACCELERATED: return "integer_dot_product_accumulating_saturating_64bit_signed_accelerated";
1456             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_64BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_64bit_unsigned_accelerated";
1457             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_MIXED_SIGNEDNESS_ACCELERATED: return "integer_dot_product_accumulating_saturating_8bit_mixed_signedness_accelerated";
1458             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_SIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_8bit_signed_accelerated";
1459             case KEY_INTEGER_DOT_PRODUCT_ACCUMULATING_SATURATING_8BIT_UNSIGNED_ACCELERATED: return "integer_dot_product_accumulating_saturating_8bit_unsigned_accelerated";
1460             case KEY_LARGE_POINTS: return "large_points";
1461             case KEY_LAYERS: return "layers";
1462             case KEY_LAYER_NAME: return "layer_name";
1463             case KEY_LIMITS: return "limits";
1464             case KEY_LINEAR_TILING_FEATURES: return "linear_tiling_features";
1465             case KEY_LINE_WIDTH_GRANULARITY: return "line_width_granularity";
1466             case KEY_LINE_WIDTH_RANGE: return "line_width_range";
1467             case KEY_LOGIC_OP: return "logic_op";
1468             case KEY_MAINTENANCE4: return "maintenance4";
1469             case KEY_MAINTENANCE_3_PROPERTIES: return "maintenance_3_properties";
1470             case KEY_MAJOR: return "major";
1471             case KEY_MAX_BOUND_DESCRIPTOR_SETS: return "max_bound_descriptor_sets";
1472             case KEY_MAX_BUFFER_SIZE: return "max_buffer_size";
1473             case KEY_MAX_CLIP_DISTANCES: return "max_clip_distances";
1474             case KEY_MAX_COLOR_ATTACHMENTS: return "max_color_attachments";
1475             case KEY_MAX_COMBINED_CLIP_AND_CULL_DISTANCES: return "max_combined_clip_and_cull_distances";
1476             case KEY_MAX_COMPUTE_SHARED_MEMORY_SIZE: return "max_compute_shared_memory_size";
1477             case KEY_MAX_COMPUTE_WORKGROUP_SUBGROUPS: return "max_compute_workgroup_subgroups";
1478             case KEY_MAX_COMPUTE_WORK_GROUP_COUNT: return "max_compute_work_group_count";
1479             case KEY_MAX_COMPUTE_WORK_GROUP_INVOCATIONS: return "max_compute_work_group_invocations";
1480             case KEY_MAX_COMPUTE_WORK_GROUP_SIZE: return "max_compute_work_group_size";
1481             case KEY_MAX_CULL_DISTANCES: return "max_cull_distances";
1482             case KEY_MAX_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCKS: return "max_descriptor_set_inline_uniform_blocks";
1483             case KEY_MAX_DESCRIPTOR_SET_INPUT_ATTACHMENTS: return "max_descriptor_set_input_attachments";
1484             case KEY_MAX_DESCRIPTOR_SET_SAMPLED_IMAGES: return "max_descriptor_set_sampled_images";
1485             case KEY_MAX_DESCRIPTOR_SET_SAMPLERS: return "max_descriptor_set_samplers";
1486             case KEY_MAX_DESCRIPTOR_SET_STORAGE_BUFFERS: return "max_descriptor_set_storage_buffers";
1487             case KEY_MAX_DESCRIPTOR_SET_STORAGE_BUFFERS_DYNAMIC: return "max_descriptor_set_storage_buffers_dynamic";
1488             case KEY_MAX_DESCRIPTOR_SET_STORAGE_IMAGES: return "max_descriptor_set_storage_images";
1489             case KEY_MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS: return "max_descriptor_set_uniform_buffers";
1490             case KEY_MAX_DESCRIPTOR_SET_UNIFORM_BUFFERS_DYNAMIC: return "max_descriptor_set_uniform_buffers_dynamic";
1491             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_INLINE_UNIFORM_BLOCKS: return "max_descriptor_set_update_after_bind_inline_uniform_blocks";
1492             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_INPUT_ATTACHMENTS: return "max_descriptor_set_update_after_bind_input_attachments";
1493             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_SAMPLED_IMAGES: return "max_descriptor_set_update_after_bind_sampled_images";
1494             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_SAMPLERS: return "max_descriptor_set_update_after_bind_samplers";
1495             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_BUFFERS: return "max_descriptor_set_update_after_bind_storage_buffers";
1496             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_BUFFERS_DYNAMIC: return "max_descriptor_set_update_after_bind_storage_buffers_dynamic";
1497             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_STORAGE_IMAGES: return "max_descriptor_set_update_after_bind_storage_images";
1498             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_UNIFORM_BUFFERS: return "max_descriptor_set_update_after_bind_uniform_buffers";
1499             case KEY_MAX_DESCRIPTOR_SET_UPDATE_AFTER_BIND_UNIFORM_BUFFERS_DYNAMIC: return "max_descriptor_set_update_after_bind_uniform_buffers_dynamic";
1500             case KEY_MAX_DRAW_INDEXED_INDEX_VALUE: return "max_draw_indexed_index_value";
1501             case KEY_MAX_DRAW_INDIRECT_COUNT: return "max_draw_indirect_count";
1502             case KEY_MAX_FRAGMENT_COMBINED_OUTPUT_RESOURCES: return "max_fragment_combined_output_resources";
1503             case KEY_MAX_FRAGMENT_DUAL_SRC_ATTACHMENTS: return "max_fragment_dual_src_attachments";
1504             case KEY_MAX_FRAGMENT_INPUT_COMPONENTS: return "max_fragment_input_components";
1505             case KEY_MAX_FRAGMENT_OUTPUT_ATTACHMENTS: return "max_fragment_output_attachments";
1506             case KEY_MAX_FRAMEBUFFER_HEIGHT: return "max_framebuffer_height";
1507             case KEY_MAX_FRAMEBUFFER_LAYERS: return "max_framebuffer_layers";
1508             case KEY_MAX_FRAMEBUFFER_WIDTH: return "max_framebuffer_width";
1509             case KEY_MAX_GEOMETRY_INPUT_COMPONENTS: return "max_geometry_input_components";
1510             case KEY_MAX_GEOMETRY_OUTPUT_COMPONENTS: return "max_geometry_output_components";
1511             case KEY_MAX_GEOMETRY_OUTPUT_VERTICES: return "max_geometry_output_vertices";
1512             case KEY_MAX_GEOMETRY_SHADER_INVOCATIONS: return "max_geometry_shader_invocations";
1513             case KEY_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: return "max_geometry_total_output_components";
1514             case KEY_MAX_IMAGE_ARRAY_LAYERS: return "max_image_array_layers";
1515             case KEY_MAX_IMAGE_DIMENSION_1D: return "max_image_dimension_1d";
1516             case KEY_MAX_IMAGE_DIMENSION_2D: return "max_image_dimension_2d";
1517             case KEY_MAX_IMAGE_DIMENSION_3D: return "max_image_dimension_3d";
1518             case KEY_MAX_IMAGE_DIMENSION_CUBE: return "max_image_dimension_cube";
1519             case KEY_MAX_INLINE_UNIFORM_BLOCK_SIZE: return "max_inline_uniform_block_size";
1520             case KEY_MAX_INLINE_UNIFORM_TOTAL_SIZE: return "max_inline_uniform_total_size";
1521             case KEY_MAX_INTERPOLATION_OFFSET: return "max_interpolation_offset";
1522             case KEY_MAX_MEMORY_ALLOCATION_COUNT: return "max_memory_allocation_count";
1523             case KEY_MAX_MEMORY_ALLOCATION_SIZE: return "max_memory_allocation_size";
1524             case KEY_MAX_MULTIVIEW_INSTANCE_INDEX: return "max_multiview_instance_index";
1525             case KEY_MAX_MULTIVIEW_VIEW_COUNT: return "max_multiview_view_count";
1526             case KEY_MAX_PER_SET_DESCRIPTORS: return "max_per_set_descriptors";
1527             case KEY_MAX_PER_STAGE_DESCRIPTOR_INLINE_UNIFORM_BLOCKS: return "max_per_stage_descriptor_inline_uniform_blocks";
1528             case KEY_MAX_PER_STAGE_DESCRIPTOR_INPUT_ATTACHMENTS: return "max_per_stage_descriptor_input_attachments";
1529             case KEY_MAX_PER_STAGE_DESCRIPTOR_SAMPLED_IMAGES: return "max_per_stage_descriptor_sampled_images";
1530             case KEY_MAX_PER_STAGE_DESCRIPTOR_SAMPLERS: return "max_per_stage_descriptor_samplers";
1531             case KEY_MAX_PER_STAGE_DESCRIPTOR_STORAGE_BUFFERS: return "max_per_stage_descriptor_storage_buffers";
1532             case KEY_MAX_PER_STAGE_DESCRIPTOR_STORAGE_IMAGES: return "max_per_stage_descriptor_storage_images";
1533             case KEY_MAX_PER_STAGE_DESCRIPTOR_UNIFORM_BUFFERS: return "max_per_stage_descriptor_uniform_buffers";
1534             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_INLINE_UNIFORM_BLOCKS: return "max_per_stage_descriptor_update_after_bind_inline_uniform_blocks";
1535             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_INPUT_ATTACHMENTS: return "max_per_stage_descriptor_update_after_bind_input_attachments";
1536             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_SAMPLED_IMAGES: return "max_per_stage_descriptor_update_after_bind_sampled_images";
1537             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_SAMPLERS: return "max_per_stage_descriptor_update_after_bind_samplers";
1538             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_STORAGE_BUFFERS: return "max_per_stage_descriptor_update_after_bind_storage_buffers";
1539             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_STORAGE_IMAGES: return "max_per_stage_descriptor_update_after_bind_storage_images";
1540             case KEY_MAX_PER_STAGE_DESCRIPTOR_UPDATE_AFTER_BIND_UNIFORM_BUFFERS: return "max_per_stage_descriptor_update_after_bind_uniform_buffers";
1541             case KEY_MAX_PER_STAGE_RESOURCES: return "max_per_stage_resources";
1542             case KEY_MAX_PER_STAGE_UPDATE_AFTER_BIND_RESOURCES: return "max_per_stage_update_after_bind_resources";
1543             case KEY_MAX_PUSH_CONSTANTS_SIZE: return "max_push_constants_size";
1544             case KEY_MAX_SAMPLER_ALLOCATION_COUNT: return "max_sampler_allocation_count";
1545             case KEY_MAX_SAMPLER_ANISOTROPY: return "max_sampler_anisotropy";
1546             case KEY_MAX_SAMPLER_LOD_BIAS: return "max_sampler_lod_bias";
1547             case KEY_MAX_SAMPLE_MASK_WORDS: return "max_sample_mask_words";
1548             case KEY_MAX_STORAGE_BUFFER_RANGE: return "max_storage_buffer_range";
1549             case KEY_MAX_SUBGROUP_SIZE: return "max_subgroup_size";
1550             case KEY_MAX_TESSELLATION_CONTROL_PER_PATCH_OUTPUT_COMPONENTS: return "max_tessellation_control_per_patch_output_components";
1551             case KEY_MAX_TESSELLATION_CONTROL_PER_VERTEX_INPUT_COMPONENTS: return "max_tessellation_control_per_vertex_input_components";
1552             case KEY_MAX_TESSELLATION_CONTROL_PER_VERTEX_OUTPUT_COMPONENTS: return "max_tessellation_control_per_vertex_output_components";
1553             case KEY_MAX_TESSELLATION_CONTROL_TOTAL_OUTPUT_COMPONENTS: return "max_tessellation_control_total_output_components";
1554             case KEY_MAX_TESSELLATION_EVALUATION_INPUT_COMPONENTS: return "max_tessellation_evaluation_input_components";
1555             case KEY_MAX_TESSELLATION_EVALUATION_OUTPUT_COMPONENTS: return "max_tessellation_evaluation_output_components";
1556             case KEY_MAX_TESSELLATION_GENERATION_LEVEL: return "max_tessellation_generation_level";
1557             case KEY_MAX_TESSELLATION_PATCH_SIZE: return "max_tessellation_patch_size";
1558             case KEY_MAX_TEXEL_BUFFER_ELEMENTS: return "max_texel_buffer_elements";
1559             case KEY_MAX_TEXEL_GATHER_OFFSET: return "max_texel_gather_offset";
1560             case KEY_MAX_TEXEL_OFFSET: return "max_texel_offset";
1561             case KEY_MAX_TIMELINE_SEMAPHORE_VALUE_DIFFERENCE: return "max_timeline_semaphore_value_difference";
1562             case KEY_MAX_UNIFORM_BUFFER_RANGE: return "max_uniform_buffer_range";
1563             case KEY_MAX_UPDATE_AFTER_BIND_DESCRIPTORS_IN_ALL_POOLS: return "max_update_after_bind_descriptors_in_all_pools";
1564             case KEY_MAX_VERTEX_INPUT_ATTRIBUTES: return "max_vertex_input_attributes";
1565             case KEY_MAX_VERTEX_INPUT_ATTRIBUTE_OFFSET: return "max_vertex_input_attribute_offset";
1566             case KEY_MAX_VERTEX_INPUT_BINDINGS: return "max_vertex_input_bindings";
1567             case KEY_MAX_VERTEX_INPUT_BINDING_STRIDE: return "max_vertex_input_binding_stride";
1568             case KEY_MAX_VERTEX_OUTPUT_COMPONENTS: return "max_vertex_output_components";
1569             case KEY_MAX_VIEWPORTS: return "max_viewports";
1570             case KEY_MAX_VIEWPORT_DIMENSIONS: return "max_viewport_dimensions";
1571             case KEY_MEMORY: return "memory";
1572             case KEY_MEMORY_HEAPS: return "memory_heaps";
1573             case KEY_MEMORY_HEAP_COUNT: return "memory_heap_count";
1574             case KEY_MEMORY_TYPES: return "memory_types";
1575             case KEY_MEMORY_TYPE_COUNT: return "memory_type_count";
1576             case KEY_MINOR: return "minor";
1577             case KEY_MIN_IMAGE_TRANSFER_GRANULARITY: return "min_image_transfer_granularity";
1578             case KEY_MIN_INTERPOLATION_OFFSET: return "min_interpolation_offset";
1579             case KEY_MIN_MEMORY_MAP_ALIGNMENT: return "min_memory_map_alignment";
1580             case KEY_MIN_STORAGE_BUFFER_OFFSET_ALIGNMENT: return "min_storage_buffer_offset_alignment";
1581             case KEY_MIN_SUBGROUP_SIZE: return "min_subgroup_size";
1582             case KEY_MIN_TEXEL_BUFFER_OFFSET_ALIGNMENT: return "min_texel_buffer_offset_alignment";
1583             case KEY_MIN_TEXEL_GATHER_OFFSET: return "min_texel_gather_offset";
1584             case KEY_MIN_TEXEL_OFFSET: return "min_texel_offset";
1585             case KEY_MIN_UNIFORM_BUFFER_OFFSET_ALIGNMENT: return "min_uniform_buffer_offset_alignment";
1586             case KEY_MIPMAP_PRECISION_BITS: return "mipmap_precision_bits";
1587             case KEY_MULTIVIEW: return "multiview";
1588             case KEY_MULTIVIEW_FEATURES: return "multiview_features";
1589             case KEY_MULTIVIEW_GEOMETRY_SHADER: return "multiview_geometry_shader";
1590             case KEY_MULTIVIEW_PROPERTIES: return "multiview_properties";
1591             case KEY_MULTIVIEW_TESSELLATION_SHADER: return "multiview_tessellation_shader";
1592             case KEY_MULTI_DRAW_INDIRECT: return "multi_draw_indirect";
1593             case KEY_MULTI_VIEWPORT: return "multi_viewport";
1594             case KEY_NON_COHERENT_ATOM_SIZE: return "non_coherent_atom_size";
1595             case KEY_OCCLUSION_QUERY_PRECISE: return "occlusion_query_precise";
1596             case KEY_OPTIMAL_BUFFER_COPY_OFFSET_ALIGNMENT: return "optimal_buffer_copy_offset_alignment";
1597             case KEY_OPTIMAL_BUFFER_COPY_ROW_PITCH_ALIGNMENT: return "optimal_buffer_copy_row_pitch_alignment";
1598             case KEY_OPTIMAL_TILING_FEATURES: return "optimal_tiling_features";
1599             case KEY_PATCH: return "patch";
1600             case KEY_PIPELINE_CACHE_UUID: return "pipeline_cache_uuid";
1601             case KEY_PIPELINE_CREATION_CACHE_CONTROL: return "pipeline_creation_cache_control";
1602             case KEY_PIPELINE_STATISTICS_QUERY: return "pipeline_statistics_query";
1603             case KEY_POINT_CLIPPING_BEHAVIOR: return "point_clipping_behavior";
1604             case KEY_POINT_CLIPPING_PROPERTIES: return "point_clipping_properties";
1605             case KEY_POINT_SIZE_GRANULARITY: return "point_size_granularity";
1606             case KEY_POINT_SIZE_RANGE: return "point_size_range";
1607             case KEY_PRIVATE_DATA: return "private_data";
1608             case KEY_PROPERTIES: return "properties";
1609             case KEY_PROPERTY_FLAGS: return "property_flags";
1610             case KEY_PROTECTED_MEMORY: return "protected_memory";
1611             case KEY_PROTECTED_MEMORY_FEATURES: return "protected_memory_features";
1612             case KEY_QUAD_DIVERGENT_IMPLICIT_LOD: return "quad_divergent_implicit_lod";
1613             case KEY_QUAD_OPERATIONS_IN_ALL_STAGES: return "quad_operations_in_all_stages";
1614             case KEY_QUEUES: return "queues";
1615             case KEY_QUEUE_COUNT: return "queue_count";
1616             case KEY_QUEUE_FLAGS: return "queue_flags";
1617             case KEY_REQUIRED_SUBGROUP_SIZE_STAGES: return "required_subgroup_size_stages";
1618             case KEY_RESIDENCY_ALIGNED_MIP_SIZE: return "residency_aligned_mip_size";
1619             case KEY_RESIDENCY_NON_RESIDENT_STRICT: return "residency_non_resident_strict";
1620             case KEY_RESIDENCY_STANDARD_2D_BLOCK_SHAPE: return "residency_standard_2d_block_shape";
1621             case KEY_RESIDENCY_STANDARD_2D_MULTISAMPLE_BLOCK_SHAPE: return "residency_standard_2d_multisample_block_shape";
1622             case KEY_RESIDENCY_STANDARD_3D_BLOCK_SHAPE: return "residency_standard_3d_block_shape";
1623             case KEY_ROBUST_BUFFER_ACCESS: return "robust_buffer_access";
1624             case KEY_ROBUST_BUFFER_ACCESS_UPDATE_AFTER_BIND: return "robust_buffer_access_update_after_bind";
1625             case KEY_ROBUST_IMAGE_ACCESS: return "robust_image_access";
1626             case KEY_ROUNDING_MODE_INDEPENDENCE: return "rounding_mode_independence";
1627             case KEY_RUNTIME_DESCRIPTOR_ARRAY: return "runtime_descriptor_array";
1628             case KEY_SAMPLED_IMAGE_COLOR_SAMPLE_COUNTS: return "sampled_image_color_sample_counts";
1629             case KEY_SAMPLED_IMAGE_DEPTH_SAMPLE_COUNTS: return "sampled_image_depth_sample_counts";
1630             case KEY_SAMPLED_IMAGE_INTEGER_SAMPLE_COUNTS: return "sampled_image_integer_sample_counts";
1631             case KEY_SAMPLED_IMAGE_STENCIL_SAMPLE_COUNTS: return "sampled_image_stencil_sample_counts";
1632             case KEY_SAMPLER_ANISOTROPY: return "sampler_anisotropy";
1633             case KEY_SAMPLER_FILTER_MINMAX: return "sampler_filter_minmax";
1634             case KEY_SAMPLER_MIRROR_CLAMP_TO_EDGE: return "sampler_mirror_clamp_to_edge";
1635             case KEY_SAMPLER_YCBCR_CONVERSION: return "sampler_ycbcr_conversion";
1636             case KEY_SAMPLER_YCBCR_CONVERSION_FEATURES: return "sampler_ycbcr_conversion_features";
1637             case KEY_SAMPLE_RATE_SHADING: return "sample_rate_shading";
1638             case KEY_SCALAR_BLOCK_LAYOUT: return "scalar_block_layout";
1639             case KEY_SEPARATE_DEPTH_STENCIL_LAYOUTS: return "separate_depth_stencil_layouts";
1640             case KEY_SHADER_BUFFER_INT64_ATOMICS: return "shader_buffer_int64_atomics";
1641             case KEY_SHADER_CLIP_DISTANCE: return "shader_clip_distance";
1642             case KEY_SHADER_CULL_DISTANCE: return "shader_cull_distance";
1643             case KEY_SHADER_DEMOTE_TO_HELPER_INVOCATION: return "shader_demote_to_helper_invocation";
1644             case KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT16: return "shader_denorm_flush_to_zero_float16";
1645             case KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT32: return "shader_denorm_flush_to_zero_float32";
1646             case KEY_SHADER_DENORM_FLUSH_TO_ZERO_FLOAT64: return "shader_denorm_flush_to_zero_float64";
1647             case KEY_SHADER_DENORM_PRESERVE_FLOAT16: return "shader_denorm_preserve_float16";
1648             case KEY_SHADER_DENORM_PRESERVE_FLOAT32: return "shader_denorm_preserve_float32";
1649             case KEY_SHADER_DENORM_PRESERVE_FLOAT64: return "shader_denorm_preserve_float64";
1650             case KEY_SHADER_DRAW_PARAMETERS: return "shader_draw_parameters";
1651             case KEY_SHADER_DRAW_PARAMETER_FEATURES: return "shader_draw_parameter_features";
1652             case KEY_SHADER_FLOAT16: return "shader_float16";
1653             case KEY_SHADER_FLOAT64: return "shader_float64";
1654             case KEY_SHADER_IMAGE_GATHER_EXTENDED: return "shader_image_gather_extended";
1655             case KEY_SHADER_INPUT_ATTACHMENT_ARRAY_DYNAMIC_INDEXING: return "shader_input_attachment_array_dynamic_indexing";
1656             case KEY_SHADER_INPUT_ATTACHMENT_ARRAY_NONUNIFORM_INDEXING_NATIVE: return "shader_input_attachment_array_nonuniform_indexing_native";
1657             case KEY_SHADER_INPUT_ATTACHMENT_ARRAY_NON_UNIFORM_INDEXING: return "shader_input_attachment_array_non_uniform_indexing";
1658             case KEY_SHADER_INT16: return "shader_int16";
1659             case KEY_SHADER_INT64: return "shader_int64";
1660             case KEY_SHADER_INT8: return "shader_int8";
1661             case KEY_SHADER_INTEGER_DOT_PRODUCT: return "shader_integer_dot_product";
1662             case KEY_SHADER_OUTPUT_LAYER: return "shader_output_layer";
1663             case KEY_SHADER_OUTPUT_VIEWPORT_INDEX: return "shader_output_viewport_index";
1664             case KEY_SHADER_RESOURCE_MIN_LOD: return "shader_resource_min_lod";
1665             case KEY_SHADER_RESOURCE_RESIDENCY: return "shader_resource_residency";
1666             case KEY_SHADER_ROUNDING_MODE_RTE_FLOAT16: return "shader_rounding_mode_rte_float16";
1667             case KEY_SHADER_ROUNDING_MODE_RTE_FLOAT32: return "shader_rounding_mode_rte_float32";
1668             case KEY_SHADER_ROUNDING_MODE_RTE_FLOAT64: return "shader_rounding_mode_rte_float64";
1669             case KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT16: return "shader_rounding_mode_rtz_float16";
1670             case KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT32: return "shader_rounding_mode_rtz_float32";
1671             case KEY_SHADER_ROUNDING_MODE_RTZ_FLOAT64: return "shader_rounding_mode_rtz_float64";
1672             case KEY_SHADER_SAMPLED_IMAGE_ARRAY_DYNAMIC_INDEXING: return "shader_sampled_image_array_dynamic_indexing";
1673             case KEY_SHADER_SAMPLED_IMAGE_ARRAY_NONUNIFORM_INDEXING_NATIVE: return "shader_sampled_image_array_nonuniform_indexing_native";
1674             case KEY_SHADER_SAMPLED_IMAGE_ARRAY_NON_UNIFORM_INDEXING: return "shader_sampled_image_array_non_uniform_indexing";
1675             case KEY_SHADER_SHARED_INT64_ATOMICS: return "shader_shared_int64_atomics";
1676             case KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT16: return "shader_signed_zero_inf_nan_preserve_float16";
1677             case KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT32: return "shader_signed_zero_inf_nan_preserve_float32";
1678             case KEY_SHADER_SIGNED_ZERO_INF_NAN_PRESERVE_FLOAT64: return "shader_signed_zero_inf_nan_preserve_float64";
1679             case KEY_SHADER_STORAGE_BUFFER_ARRAY_DYNAMIC_INDEXING: return "shader_storage_buffer_array_dynamic_indexing";
1680             case KEY_SHADER_STORAGE_BUFFER_ARRAY_NONUNIFORM_INDEXING_NATIVE: return "shader_storage_buffer_array_nonuniform_indexing_native";
1681             case KEY_SHADER_STORAGE_BUFFER_ARRAY_NON_UNIFORM_INDEXING: return "shader_storage_buffer_array_non_uniform_indexing";
1682             case KEY_SHADER_STORAGE_IMAGE_ARRAY_DYNAMIC_INDEXING: return "shader_storage_image_array_dynamic_indexing";
1683             case KEY_SHADER_STORAGE_IMAGE_ARRAY_NONUNIFORM_INDEXING_NATIVE: return "shader_storage_image_array_nonuniform_indexing_native";
1684             case KEY_SHADER_STORAGE_IMAGE_ARRAY_NON_UNIFORM_INDEXING: return "shader_storage_image_array_non_uniform_indexing";
1685             case KEY_SHADER_STORAGE_IMAGE_EXTENDED_FORMATS: return "shader_storage_image_extended_formats";
1686             case KEY_SHADER_STORAGE_IMAGE_MULTISAMPLE: return "shader_storage_image_multisample";
1687             case KEY_SHADER_STORAGE_IMAGE_READ_WITHOUT_FORMAT: return "shader_storage_image_read_without_format";
1688             case KEY_SHADER_STORAGE_IMAGE_WRITE_WITHOUT_FORMAT: return "shader_storage_image_write_without_format";
1689             case KEY_SHADER_STORAGE_TEXEL_BUFFER_ARRAY_DYNAMIC_INDEXING: return "shader_storage_texel_buffer_array_dynamic_indexing";
1690             case KEY_SHADER_STORAGE_TEXEL_BUFFER_ARRAY_NON_UNIFORM_INDEXING: return "shader_storage_texel_buffer_array_non_uniform_indexing";
1691             case KEY_SHADER_SUBGROUP_EXTENDED_TYPES: return "shader_subgroup_extended_types";
1692             case KEY_SHADER_TERMINATE_INVOCATION: return "shader_terminate_invocation";
1693             case KEY_SHADER_TESSELLATION_AND_GEOMETRY_POINT_SIZE: return "shader_tessellation_and_geometry_point_size";
1694             case KEY_SHADER_UNIFORM_BUFFER_ARRAY_DYNAMIC_INDEXING: return "shader_uniform_buffer_array_dynamic_indexing";
1695             case KEY_SHADER_UNIFORM_BUFFER_ARRAY_NONUNIFORM_INDEXING_NATIVE: return "shader_uniform_buffer_array_nonuniform_indexing_native";
1696             case KEY_SHADER_UNIFORM_BUFFER_ARRAY_NON_UNIFORM_INDEXING: return "shader_uniform_buffer_array_non_uniform_indexing";
1697             case KEY_SHADER_UNIFORM_TEXEL_BUFFER_ARRAY_DYNAMIC_INDEXING: return "shader_uniform_texel_buffer_array_dynamic_indexing";
1698             case KEY_SHADER_UNIFORM_TEXEL_BUFFER_ARRAY_NON_UNIFORM_INDEXING: return "shader_uniform_texel_buffer_array_non_uniform_indexing";
1699             case KEY_SHADER_ZERO_INITIALIZE_WORKGROUP_MEMORY: return "shader_zero_initialize_workgroup_memory";
1700             case KEY_SIZE: return "size";
1701             case KEY_SPARSE_ADDRESS_SPACE_SIZE: return "sparse_address_space_size";
1702             case KEY_SPARSE_BINDING: return "sparse_binding";
1703             case KEY_SPARSE_PROPERTIES: return "sparse_properties";
1704             case KEY_SPARSE_RESIDENCY_16_SAMPLES: return "sparse_residency_16_samples";
1705             case KEY_SPARSE_RESIDENCY_2_SAMPLES: return "sparse_residency_2_samples";
1706             case KEY_SPARSE_RESIDENCY_4_SAMPLES: return "sparse_residency_4_samples";
1707             case KEY_SPARSE_RESIDENCY_8_SAMPLES: return "sparse_residency_8_samples";
1708             case KEY_SPARSE_RESIDENCY_ALIASED: return "sparse_residency_aliased";
1709             case KEY_SPARSE_RESIDENCY_BUFFER: return "sparse_residency_buffer";
1710             case KEY_SPARSE_RESIDENCY_IMAGE_2D: return "sparse_residency_image_2d";
1711             case KEY_SPARSE_RESIDENCY_IMAGE_3D: return "sparse_residency_image_3d";
1712             case KEY_SPEC_VERSION: return "spec_version";
1713             case KEY_STANDARD_SAMPLE_LOCATIONS: return "standard_sample_locations";
1714             case KEY_STORAGE_BUFFER_16BIT_ACCESS: return "storage_buffer_16bit_access";
1715             case KEY_STORAGE_BUFFER_8BIT_ACCESS: return "storage_buffer_8bit_access";
1716             case KEY_STORAGE_IMAGE_SAMPLE_COUNTS: return "storage_image_sample_counts";
1717             case KEY_STORAGE_INPUT_OUTPUT_16: return "storage_input_output_16";
1718             case KEY_STORAGE_PUSH_CONSTANT8: return "storage_push_constant8";
1719             case KEY_STORAGE_PUSH_CONSTANT_16: return "storage_push_constant_16";
1720             case KEY_STORAGE_TEXEL_BUFFER_OFFSET_ALIGNMENT_BYTES: return "storage_texel_buffer_offset_alignment_bytes";
1721             case KEY_STORAGE_TEXEL_BUFFER_OFFSET_SINGLE_TEXEL_ALIGNMENT: return "storage_texel_buffer_offset_single_texel_alignment";
1722             case KEY_STRICT_LINES: return "strict_lines";
1723             case KEY_SUBGROUP_BROADCAST_DYNAMIC_ID: return "subgroup_broadcast_dynamic_id";
1724             case KEY_SUBGROUP_PROPERTIES: return "subgroup_properties";
1725             case KEY_SUBGROUP_SIZE: return "subgroup_size";
1726             case KEY_SUBGROUP_SIZE_CONTROL: return "subgroup_size_control";
1727             case KEY_SUBMINOR: return "subminor";
1728             case KEY_SUBSET_ALLOCATION: return "subset_allocation";
1729             case KEY_SUB_PIXEL_INTERPOLATION_OFFSET_BITS: return "sub_pixel_interpolation_offset_bits";
1730             case KEY_SUB_PIXEL_PRECISION_BITS: return "sub_pixel_precision_bits";
1731             case KEY_SUB_TEXEL_PRECISION_BITS: return "sub_texel_precision_bits";
1732             case KEY_SUPPORTED_DEPTH_RESOLVE_MODES: return "supported_depth_resolve_modes";
1733             case KEY_SUPPORTED_OPERATIONS: return "supported_operations";
1734             case KEY_SUPPORTED_STAGES: return "supported_stages";
1735             case KEY_SUPPORTED_STENCIL_RESOLVE_MODES: return "supported_stencil_resolve_modes";
1736             case KEY_SYNCHRONIZATION2: return "synchronization2";
1737             case KEY_TESSELLATION_SHADER: return "tessellation_shader";
1738             case KEY_TEXTURE_COMPRESSION_ASTC_HDR: return "texture_compression_astc_hdr";
1739             case KEY_TEXTURE_COMPRESSION_ASTC_LDR: return "texture_compression_astc_ldr";
1740             case KEY_TEXTURE_COMPRESSION_BC: return "texture_compression_bc";
1741             case KEY_TEXTURE_COMPRESSION_ETC2: return "texture_compression_etc2";
1742             case KEY_TIMELINE_SEMAPHORE: return "timeline_semaphore";
1743             case KEY_TIMESTAMP_COMPUTE_AND_GRAPHICS: return "timestamp_compute_and_graphics";
1744             case KEY_TIMESTAMP_PERIOD: return "timestamp_period";
1745             case KEY_TIMESTAMP_VALID_BITS: return "timestamp_valid_bits";
1746             case KEY_UNIFORM_AND_STORAGE_BUFFER_16BIT_ACCESS: return "uniform_and_storage_buffer_16bit_access";
1747             case KEY_UNIFORM_AND_STORAGE_BUFFER_8BIT_ACCESS: return "uniform_and_storage_buffer_8bit_access";
1748             case KEY_UNIFORM_BUFFER_STANDARD_LAYOUT: return "uniform_buffer_standard_layout";
1749             case KEY_UNIFORM_TEXEL_BUFFER_OFFSET_ALIGNMENT_BYTES: return "uniform_texel_buffer_offset_alignment_bytes";
1750             case KEY_UNIFORM_TEXEL_BUFFER_OFFSET_SINGLE_TEXEL_ALIGNMENT: return "uniform_texel_buffer_offset_single_texel_alignment";
1751             case KEY_VARIABLE_MULTISAMPLE_RATE: return "variable_multisample_rate";
1752             case KEY_VARIABLE_POINTERS: return "variable_pointers";
1753             case KEY_VARIABLE_POINTERS_STORAGE_BUFFER: return "variable_pointers_storage_buffer";
1754             case KEY_VARIABLE_POINTER_FEATURES: return "variable_pointer_features";
1755             case KEY_VARIABLE_POINTER_FEATURES_KHR: return "variable_pointer_features_khr";
1756             case KEY_VENDOR_ID: return "vendor_id";
1757             case KEY_VERTEX_PIPELINE_STORES_AND_ATOMICS: return "vertex_pipeline_stores_and_atomics";
1758             case KEY_VIEWPORT_BOUNDS_RANGE: return "viewport_bounds_range";
1759             case KEY_VIEWPORT_SUB_PIXEL_BITS: return "viewport_sub_pixel_bits";
1760             case KEY_VK_KHR_DRIVER_PROPERTIES: return "vk_khr_driver_properties";
1761             case KEY_VK_KHR_VARIABLE_POINTERS: return "vk_khr_variable_pointers";
1762             case KEY_VULKAN_12_FEATURES: return "vulkan_12_features";
1763             case KEY_VULKAN_12_PROPERTIES: return "vulkan_12_properties";
1764             case KEY_VULKAN_13_FEATURES: return "vulkan_13_features";
1765             case KEY_VULKAN_13_PROPERTIES: return "vulkan_13_properties";
1766             case KEY_VULKAN_MEMORY_MODEL: return "vulkan_memory_model";
1767             case KEY_VULKAN_MEMORY_MODEL_AVAILABILITY_VISIBILITY_CHAINS: return "vulkan_memory_model_availability_visibility_chains";
1768             case KEY_VULKAN_MEMORY_MODEL_DEVICE_SCOPE: return "vulkan_memory_model_device_scope";
1769             case KEY_WIDE_LINES: return "wide_lines";
1770             case KEY_WIDTH: return "width";
1771             default: throw new RuntimeException("unknown key name: " + name);
1772         }
1773     }
1774 
nativeGetVkJSON()1775     private static native String nativeGetVkJSON();
1776 
1777 }
1778