1const char* ExtensionToString(Extension extension) {
2  switch (extension) {
3    case Extension::kSPV_AMD_gcn_shader:
4      return "SPV_AMD_gcn_shader";
5    case Extension::kSPV_AMD_gpu_shader_half_float:
6      return "SPV_AMD_gpu_shader_half_float";
7    case Extension::kSPV_AMD_gpu_shader_half_float_fetch:
8      return "SPV_AMD_gpu_shader_half_float_fetch";
9    case Extension::kSPV_AMD_gpu_shader_int16:
10      return "SPV_AMD_gpu_shader_int16";
11    case Extension::kSPV_AMD_shader_ballot:
12      return "SPV_AMD_shader_ballot";
13    case Extension::kSPV_AMD_shader_explicit_vertex_parameter:
14      return "SPV_AMD_shader_explicit_vertex_parameter";
15    case Extension::kSPV_AMD_shader_fragment_mask:
16      return "SPV_AMD_shader_fragment_mask";
17    case Extension::kSPV_AMD_shader_image_load_store_lod:
18      return "SPV_AMD_shader_image_load_store_lod";
19    case Extension::kSPV_AMD_shader_trinary_minmax:
20      return "SPV_AMD_shader_trinary_minmax";
21    case Extension::kSPV_AMD_texture_gather_bias_lod:
22      return "SPV_AMD_texture_gather_bias_lod";
23    case Extension::kSPV_EXT_demote_to_helper_invocation:
24      return "SPV_EXT_demote_to_helper_invocation";
25    case Extension::kSPV_EXT_descriptor_indexing:
26      return "SPV_EXT_descriptor_indexing";
27    case Extension::kSPV_EXT_fragment_fully_covered:
28      return "SPV_EXT_fragment_fully_covered";
29    case Extension::kSPV_EXT_fragment_invocation_density:
30      return "SPV_EXT_fragment_invocation_density";
31    case Extension::kSPV_EXT_fragment_shader_interlock:
32      return "SPV_EXT_fragment_shader_interlock";
33    case Extension::kSPV_EXT_physical_storage_buffer:
34      return "SPV_EXT_physical_storage_buffer";
35    case Extension::kSPV_EXT_shader_stencil_export:
36      return "SPV_EXT_shader_stencil_export";
37    case Extension::kSPV_EXT_shader_viewport_index_layer:
38      return "SPV_EXT_shader_viewport_index_layer";
39    case Extension::kSPV_GOOGLE_decorate_string:
40      return "SPV_GOOGLE_decorate_string";
41    case Extension::kSPV_GOOGLE_hlsl_functionality1:
42      return "SPV_GOOGLE_hlsl_functionality1";
43    case Extension::kSPV_GOOGLE_user_type:
44      return "SPV_GOOGLE_user_type";
45    case Extension::kSPV_INTEL_device_side_avc_motion_estimation:
46      return "SPV_INTEL_device_side_avc_motion_estimation";
47    case Extension::kSPV_INTEL_media_block_io:
48      return "SPV_INTEL_media_block_io";
49    case Extension::kSPV_INTEL_shader_integer_functions2:
50      return "SPV_INTEL_shader_integer_functions2";
51    case Extension::kSPV_INTEL_subgroups:
52      return "SPV_INTEL_subgroups";
53    case Extension::kSPV_KHR_16bit_storage:
54      return "SPV_KHR_16bit_storage";
55    case Extension::kSPV_KHR_8bit_storage:
56      return "SPV_KHR_8bit_storage";
57    case Extension::kSPV_KHR_device_group:
58      return "SPV_KHR_device_group";
59    case Extension::kSPV_KHR_float_controls:
60      return "SPV_KHR_float_controls";
61    case Extension::kSPV_KHR_multiview:
62      return "SPV_KHR_multiview";
63    case Extension::kSPV_KHR_no_integer_wrap_decoration:
64      return "SPV_KHR_no_integer_wrap_decoration";
65    case Extension::kSPV_KHR_physical_storage_buffer:
66      return "SPV_KHR_physical_storage_buffer";
67    case Extension::kSPV_KHR_post_depth_coverage:
68      return "SPV_KHR_post_depth_coverage";
69    case Extension::kSPV_KHR_shader_atomic_counter_ops:
70      return "SPV_KHR_shader_atomic_counter_ops";
71    case Extension::kSPV_KHR_shader_ballot:
72      return "SPV_KHR_shader_ballot";
73    case Extension::kSPV_KHR_shader_clock:
74      return "SPV_KHR_shader_clock";
75    case Extension::kSPV_KHR_shader_draw_parameters:
76      return "SPV_KHR_shader_draw_parameters";
77    case Extension::kSPV_KHR_storage_buffer_storage_class:
78      return "SPV_KHR_storage_buffer_storage_class";
79    case Extension::kSPV_KHR_subgroup_vote:
80      return "SPV_KHR_subgroup_vote";
81    case Extension::kSPV_KHR_variable_pointers:
82      return "SPV_KHR_variable_pointers";
83    case Extension::kSPV_KHR_vulkan_memory_model:
84      return "SPV_KHR_vulkan_memory_model";
85    case Extension::kSPV_NVX_multiview_per_view_attributes:
86      return "SPV_NVX_multiview_per_view_attributes";
87    case Extension::kSPV_NV_compute_shader_derivatives:
88      return "SPV_NV_compute_shader_derivatives";
89    case Extension::kSPV_NV_cooperative_matrix:
90      return "SPV_NV_cooperative_matrix";
91    case Extension::kSPV_NV_fragment_shader_barycentric:
92      return "SPV_NV_fragment_shader_barycentric";
93    case Extension::kSPV_NV_geometry_shader_passthrough:
94      return "SPV_NV_geometry_shader_passthrough";
95    case Extension::kSPV_NV_mesh_shader:
96      return "SPV_NV_mesh_shader";
97    case Extension::kSPV_NV_ray_tracing:
98      return "SPV_NV_ray_tracing";
99    case Extension::kSPV_NV_sample_mask_override_coverage:
100      return "SPV_NV_sample_mask_override_coverage";
101    case Extension::kSPV_NV_shader_image_footprint:
102      return "SPV_NV_shader_image_footprint";
103    case Extension::kSPV_NV_shader_sm_builtins:
104      return "SPV_NV_shader_sm_builtins";
105    case Extension::kSPV_NV_shader_subgroup_partitioned:
106      return "SPV_NV_shader_subgroup_partitioned";
107    case Extension::kSPV_NV_shading_rate:
108      return "SPV_NV_shading_rate";
109    case Extension::kSPV_NV_stereo_view_rendering:
110      return "SPV_NV_stereo_view_rendering";
111    case Extension::kSPV_NV_viewport_array2:
112      return "SPV_NV_viewport_array2";
113    case Extension::kSPV_VALIDATOR_ignore_type_decl_unique:
114      return "SPV_VALIDATOR_ignore_type_decl_unique";
115  };
116
117  return "";
118}
119
120
121    bool GetExtensionFromString(const char* str, Extension* extension) {
122        static const char* known_ext_strs[] = { "SPV_AMD_gcn_shader", "SPV_AMD_gpu_shader_half_float", "SPV_AMD_gpu_shader_half_float_fetch", "SPV_AMD_gpu_shader_int16", "SPV_AMD_shader_ballot", "SPV_AMD_shader_explicit_vertex_parameter", "SPV_AMD_shader_fragment_mask", "SPV_AMD_shader_image_load_store_lod", "SPV_AMD_shader_trinary_minmax", "SPV_AMD_texture_gather_bias_lod", "SPV_EXT_demote_to_helper_invocation", "SPV_EXT_descriptor_indexing", "SPV_EXT_fragment_fully_covered", "SPV_EXT_fragment_invocation_density", "SPV_EXT_fragment_shader_interlock", "SPV_EXT_physical_storage_buffer", "SPV_EXT_shader_stencil_export", "SPV_EXT_shader_viewport_index_layer", "SPV_GOOGLE_decorate_string", "SPV_GOOGLE_hlsl_functionality1", "SPV_GOOGLE_user_type", "SPV_INTEL_device_side_avc_motion_estimation", "SPV_INTEL_media_block_io", "SPV_INTEL_shader_integer_functions2", "SPV_INTEL_subgroups", "SPV_KHR_16bit_storage", "SPV_KHR_8bit_storage", "SPV_KHR_device_group", "SPV_KHR_float_controls", "SPV_KHR_multiview", "SPV_KHR_no_integer_wrap_decoration", "SPV_KHR_physical_storage_buffer", "SPV_KHR_post_depth_coverage", "SPV_KHR_shader_atomic_counter_ops", "SPV_KHR_shader_ballot", "SPV_KHR_shader_clock", "SPV_KHR_shader_draw_parameters", "SPV_KHR_storage_buffer_storage_class", "SPV_KHR_subgroup_vote", "SPV_KHR_variable_pointers", "SPV_KHR_vulkan_memory_model", "SPV_NVX_multiview_per_view_attributes", "SPV_NV_compute_shader_derivatives", "SPV_NV_cooperative_matrix", "SPV_NV_fragment_shader_barycentric", "SPV_NV_geometry_shader_passthrough", "SPV_NV_mesh_shader", "SPV_NV_ray_tracing", "SPV_NV_sample_mask_override_coverage", "SPV_NV_shader_image_footprint", "SPV_NV_shader_sm_builtins", "SPV_NV_shader_subgroup_partitioned", "SPV_NV_shading_rate", "SPV_NV_stereo_view_rendering", "SPV_NV_viewport_array2", "SPV_VALIDATOR_ignore_type_decl_unique" };
123        static const Extension known_ext_ids[] = { Extension::kSPV_AMD_gcn_shader, Extension::kSPV_AMD_gpu_shader_half_float, Extension::kSPV_AMD_gpu_shader_half_float_fetch, Extension::kSPV_AMD_gpu_shader_int16, Extension::kSPV_AMD_shader_ballot, Extension::kSPV_AMD_shader_explicit_vertex_parameter, Extension::kSPV_AMD_shader_fragment_mask, Extension::kSPV_AMD_shader_image_load_store_lod, Extension::kSPV_AMD_shader_trinary_minmax, Extension::kSPV_AMD_texture_gather_bias_lod, Extension::kSPV_EXT_demote_to_helper_invocation, Extension::kSPV_EXT_descriptor_indexing, Extension::kSPV_EXT_fragment_fully_covered, Extension::kSPV_EXT_fragment_invocation_density, Extension::kSPV_EXT_fragment_shader_interlock, Extension::kSPV_EXT_physical_storage_buffer, Extension::kSPV_EXT_shader_stencil_export, Extension::kSPV_EXT_shader_viewport_index_layer, Extension::kSPV_GOOGLE_decorate_string, Extension::kSPV_GOOGLE_hlsl_functionality1, Extension::kSPV_GOOGLE_user_type, Extension::kSPV_INTEL_device_side_avc_motion_estimation, Extension::kSPV_INTEL_media_block_io, Extension::kSPV_INTEL_shader_integer_functions2, Extension::kSPV_INTEL_subgroups, Extension::kSPV_KHR_16bit_storage, Extension::kSPV_KHR_8bit_storage, Extension::kSPV_KHR_device_group, Extension::kSPV_KHR_float_controls, Extension::kSPV_KHR_multiview, Extension::kSPV_KHR_no_integer_wrap_decoration, Extension::kSPV_KHR_physical_storage_buffer, Extension::kSPV_KHR_post_depth_coverage, Extension::kSPV_KHR_shader_atomic_counter_ops, Extension::kSPV_KHR_shader_ballot, Extension::kSPV_KHR_shader_clock, Extension::kSPV_KHR_shader_draw_parameters, Extension::kSPV_KHR_storage_buffer_storage_class, Extension::kSPV_KHR_subgroup_vote, Extension::kSPV_KHR_variable_pointers, Extension::kSPV_KHR_vulkan_memory_model, Extension::kSPV_NVX_multiview_per_view_attributes, Extension::kSPV_NV_compute_shader_derivatives, Extension::kSPV_NV_cooperative_matrix, Extension::kSPV_NV_fragment_shader_barycentric, Extension::kSPV_NV_geometry_shader_passthrough, Extension::kSPV_NV_mesh_shader, Extension::kSPV_NV_ray_tracing, Extension::kSPV_NV_sample_mask_override_coverage, Extension::kSPV_NV_shader_image_footprint, Extension::kSPV_NV_shader_sm_builtins, Extension::kSPV_NV_shader_subgroup_partitioned, Extension::kSPV_NV_shading_rate, Extension::kSPV_NV_stereo_view_rendering, Extension::kSPV_NV_viewport_array2, Extension::kSPV_VALIDATOR_ignore_type_decl_unique };
124        const auto b = std::begin(known_ext_strs);
125        const auto e = std::end(known_ext_strs);
126        const auto found = std::equal_range(
127            b, e, str, [](const char* str1, const char* str2) {
128                return std::strcmp(str1, str2) < 0;
129            });
130        if (found.first == e || found.first == found.second) return false;
131
132        *extension = known_ext_ids[found.first - b];
133        return true;
134    }
135
136
137const char* CapabilityToString(SpvCapability capability) {
138  switch (capability) {
139    case SpvCapabilityMatrix:
140      return "Matrix";
141    case SpvCapabilityShader:
142      return "Shader";
143    case SpvCapabilityGeometry:
144      return "Geometry";
145    case SpvCapabilityTessellation:
146      return "Tessellation";
147    case SpvCapabilityAddresses:
148      return "Addresses";
149    case SpvCapabilityLinkage:
150      return "Linkage";
151    case SpvCapabilityKernel:
152      return "Kernel";
153    case SpvCapabilityVector16:
154      return "Vector16";
155    case SpvCapabilityFloat16Buffer:
156      return "Float16Buffer";
157    case SpvCapabilityFloat16:
158      return "Float16";
159    case SpvCapabilityFloat64:
160      return "Float64";
161    case SpvCapabilityInt64:
162      return "Int64";
163    case SpvCapabilityInt64Atomics:
164      return "Int64Atomics";
165    case SpvCapabilityImageBasic:
166      return "ImageBasic";
167    case SpvCapabilityImageReadWrite:
168      return "ImageReadWrite";
169    case SpvCapabilityImageMipmap:
170      return "ImageMipmap";
171    case SpvCapabilityPipes:
172      return "Pipes";
173    case SpvCapabilityGroups:
174      return "Groups";
175    case SpvCapabilityDeviceEnqueue:
176      return "DeviceEnqueue";
177    case SpvCapabilityLiteralSampler:
178      return "LiteralSampler";
179    case SpvCapabilityAtomicStorage:
180      return "AtomicStorage";
181    case SpvCapabilityInt16:
182      return "Int16";
183    case SpvCapabilityTessellationPointSize:
184      return "TessellationPointSize";
185    case SpvCapabilityGeometryPointSize:
186      return "GeometryPointSize";
187    case SpvCapabilityImageGatherExtended:
188      return "ImageGatherExtended";
189    case SpvCapabilityStorageImageMultisample:
190      return "StorageImageMultisample";
191    case SpvCapabilityUniformBufferArrayDynamicIndexing:
192      return "UniformBufferArrayDynamicIndexing";
193    case SpvCapabilitySampledImageArrayDynamicIndexing:
194      return "SampledImageArrayDynamicIndexing";
195    case SpvCapabilityStorageBufferArrayDynamicIndexing:
196      return "StorageBufferArrayDynamicIndexing";
197    case SpvCapabilityStorageImageArrayDynamicIndexing:
198      return "StorageImageArrayDynamicIndexing";
199    case SpvCapabilityClipDistance:
200      return "ClipDistance";
201    case SpvCapabilityCullDistance:
202      return "CullDistance";
203    case SpvCapabilityImageCubeArray:
204      return "ImageCubeArray";
205    case SpvCapabilitySampleRateShading:
206      return "SampleRateShading";
207    case SpvCapabilityImageRect:
208      return "ImageRect";
209    case SpvCapabilitySampledRect:
210      return "SampledRect";
211    case SpvCapabilityGenericPointer:
212      return "GenericPointer";
213    case SpvCapabilityInt8:
214      return "Int8";
215    case SpvCapabilityInputAttachment:
216      return "InputAttachment";
217    case SpvCapabilitySparseResidency:
218      return "SparseResidency";
219    case SpvCapabilityMinLod:
220      return "MinLod";
221    case SpvCapabilitySampled1D:
222      return "Sampled1D";
223    case SpvCapabilityImage1D:
224      return "Image1D";
225    case SpvCapabilitySampledCubeArray:
226      return "SampledCubeArray";
227    case SpvCapabilitySampledBuffer:
228      return "SampledBuffer";
229    case SpvCapabilityImageBuffer:
230      return "ImageBuffer";
231    case SpvCapabilityImageMSArray:
232      return "ImageMSArray";
233    case SpvCapabilityStorageImageExtendedFormats:
234      return "StorageImageExtendedFormats";
235    case SpvCapabilityImageQuery:
236      return "ImageQuery";
237    case SpvCapabilityDerivativeControl:
238      return "DerivativeControl";
239    case SpvCapabilityInterpolationFunction:
240      return "InterpolationFunction";
241    case SpvCapabilityTransformFeedback:
242      return "TransformFeedback";
243    case SpvCapabilityGeometryStreams:
244      return "GeometryStreams";
245    case SpvCapabilityStorageImageReadWithoutFormat:
246      return "StorageImageReadWithoutFormat";
247    case SpvCapabilityStorageImageWriteWithoutFormat:
248      return "StorageImageWriteWithoutFormat";
249    case SpvCapabilityMultiViewport:
250      return "MultiViewport";
251    case SpvCapabilitySubgroupDispatch:
252      return "SubgroupDispatch";
253    case SpvCapabilityNamedBarrier:
254      return "NamedBarrier";
255    case SpvCapabilityPipeStorage:
256      return "PipeStorage";
257    case SpvCapabilityGroupNonUniform:
258      return "GroupNonUniform";
259    case SpvCapabilityGroupNonUniformVote:
260      return "GroupNonUniformVote";
261    case SpvCapabilityGroupNonUniformArithmetic:
262      return "GroupNonUniformArithmetic";
263    case SpvCapabilityGroupNonUniformBallot:
264      return "GroupNonUniformBallot";
265    case SpvCapabilityGroupNonUniformShuffle:
266      return "GroupNonUniformShuffle";
267    case SpvCapabilityGroupNonUniformShuffleRelative:
268      return "GroupNonUniformShuffleRelative";
269    case SpvCapabilityGroupNonUniformClustered:
270      return "GroupNonUniformClustered";
271    case SpvCapabilityGroupNonUniformQuad:
272      return "GroupNonUniformQuad";
273    case SpvCapabilityShaderLayer:
274      return "ShaderLayer";
275    case SpvCapabilityShaderViewportIndex:
276      return "ShaderViewportIndex";
277    case SpvCapabilitySubgroupBallotKHR:
278      return "SubgroupBallotKHR";
279    case SpvCapabilityDrawParameters:
280      return "DrawParameters";
281    case SpvCapabilitySubgroupVoteKHR:
282      return "SubgroupVoteKHR";
283    case SpvCapabilityStorageBuffer16BitAccess:
284      return "StorageBuffer16BitAccess";
285    case SpvCapabilityUniformAndStorageBuffer16BitAccess:
286      return "UniformAndStorageBuffer16BitAccess";
287    case SpvCapabilityStoragePushConstant16:
288      return "StoragePushConstant16";
289    case SpvCapabilityStorageInputOutput16:
290      return "StorageInputOutput16";
291    case SpvCapabilityDeviceGroup:
292      return "DeviceGroup";
293    case SpvCapabilityMultiView:
294      return "MultiView";
295    case SpvCapabilityVariablePointersStorageBuffer:
296      return "VariablePointersStorageBuffer";
297    case SpvCapabilityVariablePointers:
298      return "VariablePointers";
299    case SpvCapabilityAtomicStorageOps:
300      return "AtomicStorageOps";
301    case SpvCapabilitySampleMaskPostDepthCoverage:
302      return "SampleMaskPostDepthCoverage";
303    case SpvCapabilityStorageBuffer8BitAccess:
304      return "StorageBuffer8BitAccess";
305    case SpvCapabilityUniformAndStorageBuffer8BitAccess:
306      return "UniformAndStorageBuffer8BitAccess";
307    case SpvCapabilityStoragePushConstant8:
308      return "StoragePushConstant8";
309    case SpvCapabilityDenormPreserve:
310      return "DenormPreserve";
311    case SpvCapabilityDenormFlushToZero:
312      return "DenormFlushToZero";
313    case SpvCapabilitySignedZeroInfNanPreserve:
314      return "SignedZeroInfNanPreserve";
315    case SpvCapabilityRoundingModeRTE:
316      return "RoundingModeRTE";
317    case SpvCapabilityRoundingModeRTZ:
318      return "RoundingModeRTZ";
319    case SpvCapabilityFloat16ImageAMD:
320      return "Float16ImageAMD";
321    case SpvCapabilityImageGatherBiasLodAMD:
322      return "ImageGatherBiasLodAMD";
323    case SpvCapabilityFragmentMaskAMD:
324      return "FragmentMaskAMD";
325    case SpvCapabilityStencilExportEXT:
326      return "StencilExportEXT";
327    case SpvCapabilityImageReadWriteLodAMD:
328      return "ImageReadWriteLodAMD";
329    case SpvCapabilityShaderClockKHR:
330      return "ShaderClockKHR";
331    case SpvCapabilitySampleMaskOverrideCoverageNV:
332      return "SampleMaskOverrideCoverageNV";
333    case SpvCapabilityGeometryShaderPassthroughNV:
334      return "GeometryShaderPassthroughNV";
335    case SpvCapabilityShaderViewportIndexLayerEXT:
336      return "ShaderViewportIndexLayerEXT";
337    case SpvCapabilityShaderViewportMaskNV:
338      return "ShaderViewportMaskNV";
339    case SpvCapabilityShaderStereoViewNV:
340      return "ShaderStereoViewNV";
341    case SpvCapabilityPerViewAttributesNV:
342      return "PerViewAttributesNV";
343    case SpvCapabilityFragmentFullyCoveredEXT:
344      return "FragmentFullyCoveredEXT";
345    case SpvCapabilityMeshShadingNV:
346      return "MeshShadingNV";
347    case SpvCapabilityImageFootprintNV:
348      return "ImageFootprintNV";
349    case SpvCapabilityFragmentBarycentricNV:
350      return "FragmentBarycentricNV";
351    case SpvCapabilityComputeDerivativeGroupQuadsNV:
352      return "ComputeDerivativeGroupQuadsNV";
353    case SpvCapabilityFragmentDensityEXT:
354      return "FragmentDensityEXT";
355    case SpvCapabilityGroupNonUniformPartitionedNV:
356      return "GroupNonUniformPartitionedNV";
357    case SpvCapabilityShaderNonUniform:
358      return "ShaderNonUniform";
359    case SpvCapabilityRuntimeDescriptorArray:
360      return "RuntimeDescriptorArray";
361    case SpvCapabilityInputAttachmentArrayDynamicIndexing:
362      return "InputAttachmentArrayDynamicIndexing";
363    case SpvCapabilityUniformTexelBufferArrayDynamicIndexing:
364      return "UniformTexelBufferArrayDynamicIndexing";
365    case SpvCapabilityStorageTexelBufferArrayDynamicIndexing:
366      return "StorageTexelBufferArrayDynamicIndexing";
367    case SpvCapabilityUniformBufferArrayNonUniformIndexing:
368      return "UniformBufferArrayNonUniformIndexing";
369    case SpvCapabilitySampledImageArrayNonUniformIndexing:
370      return "SampledImageArrayNonUniformIndexing";
371    case SpvCapabilityStorageBufferArrayNonUniformIndexing:
372      return "StorageBufferArrayNonUniformIndexing";
373    case SpvCapabilityStorageImageArrayNonUniformIndexing:
374      return "StorageImageArrayNonUniformIndexing";
375    case SpvCapabilityInputAttachmentArrayNonUniformIndexing:
376      return "InputAttachmentArrayNonUniformIndexing";
377    case SpvCapabilityUniformTexelBufferArrayNonUniformIndexing:
378      return "UniformTexelBufferArrayNonUniformIndexing";
379    case SpvCapabilityStorageTexelBufferArrayNonUniformIndexing:
380      return "StorageTexelBufferArrayNonUniformIndexing";
381    case SpvCapabilityRayTracingNV:
382      return "RayTracingNV";
383    case SpvCapabilityVulkanMemoryModel:
384      return "VulkanMemoryModel";
385    case SpvCapabilityVulkanMemoryModelDeviceScope:
386      return "VulkanMemoryModelDeviceScope";
387    case SpvCapabilityPhysicalStorageBufferAddresses:
388      return "PhysicalStorageBufferAddresses";
389    case SpvCapabilityComputeDerivativeGroupLinearNV:
390      return "ComputeDerivativeGroupLinearNV";
391    case SpvCapabilityCooperativeMatrixNV:
392      return "CooperativeMatrixNV";
393    case SpvCapabilityFragmentShaderSampleInterlockEXT:
394      return "FragmentShaderSampleInterlockEXT";
395    case SpvCapabilityFragmentShaderShadingRateInterlockEXT:
396      return "FragmentShaderShadingRateInterlockEXT";
397    case SpvCapabilityShaderSMBuiltinsNV:
398      return "ShaderSMBuiltinsNV";
399    case SpvCapabilityFragmentShaderPixelInterlockEXT:
400      return "FragmentShaderPixelInterlockEXT";
401    case SpvCapabilityDemoteToHelperInvocationEXT:
402      return "DemoteToHelperInvocationEXT";
403    case SpvCapabilitySubgroupShuffleINTEL:
404      return "SubgroupShuffleINTEL";
405    case SpvCapabilitySubgroupBufferBlockIOINTEL:
406      return "SubgroupBufferBlockIOINTEL";
407    case SpvCapabilitySubgroupImageBlockIOINTEL:
408      return "SubgroupImageBlockIOINTEL";
409    case SpvCapabilitySubgroupImageMediaBlockIOINTEL:
410      return "SubgroupImageMediaBlockIOINTEL";
411    case SpvCapabilityIntegerFunctions2INTEL:
412      return "IntegerFunctions2INTEL";
413    case SpvCapabilitySubgroupAvcMotionEstimationINTEL:
414      return "SubgroupAvcMotionEstimationINTEL";
415    case SpvCapabilitySubgroupAvcMotionEstimationIntraINTEL:
416      return "SubgroupAvcMotionEstimationIntraINTEL";
417    case SpvCapabilitySubgroupAvcMotionEstimationChromaINTEL:
418      return "SubgroupAvcMotionEstimationChromaINTEL";
419    case SpvCapabilityMax:
420      assert(0 && "Attempting to convert SpvCapabilityMax to string");
421      return "";
422  };
423
424  return "";
425}