Commit d5e1cb3ea2

Ali Cheraghi <alichraghi@proton.me>
2025-02-14 21:38:05
spirv: ziggify and remove unknown spirv features
`OpCapability` and `OpExtension` now can also be emitted from inline assembly
1 parent 85169bb
lib/std/Target/spirv.zig
@@ -1,8 +1,3 @@
-//! This file is auto-generated by tools/update_spirv_features.zig.
-//! TODO: Dependencies of capabilities on extensions.
-//! TODO: Dependencies of extensions on extensions.
-//! TODO: Dependencies of extensions on versions.
-
 const std = @import("../std.zig");
 const CpuFeature = std.Target.Cpu.Feature;
 const CpuModel = std.Target.Cpu.Model;
@@ -15,397 +10,17 @@ pub const Feature = enum {
     v1_4,
     v1_5,
     v1_6,
-    SPV_AMDX_shader_enqueue,
-    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_early_and_late_fragment_tests,
-    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_ARM_cooperative_matrix_layouts,
-    SPV_ARM_core_builtins,
-    SPV_EXT_arithmetic_fence,
-    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_image_raw10_raw12,
-    SPV_EXT_mesh_shader,
-    SPV_EXT_opacity_micromap,
-    SPV_EXT_optnone,
-    SPV_EXT_physical_storage_buffer,
-    SPV_EXT_replicated_composites,
-    SPV_EXT_shader_atomic_float16_add,
-    SPV_EXT_shader_atomic_float_add,
-    SPV_EXT_shader_atomic_float_min_max,
-    SPV_EXT_shader_image_int64,
-    SPV_EXT_shader_stencil_export,
-    SPV_EXT_shader_tile_image,
-    SPV_EXT_shader_viewport_index_layer,
-    SPV_EXT_ycbcr_attachments,
-    SPV_GOOGLE_decorate_string,
-    SPV_GOOGLE_hlsl_functionality1,
-    SPV_GOOGLE_user_type,
-    SPV_HUAWEI_cluster_culling_shader,
-    SPV_HUAWEI_subpass_shading,
-    SPV_INTEL_arbitrary_precision_fixed_point,
-    SPV_INTEL_arbitrary_precision_floating_point,
-    SPV_INTEL_arbitrary_precision_integers,
-    SPV_INTEL_blocking_pipes,
-    SPV_INTEL_device_side_avc_motion_estimation,
-    SPV_INTEL_fpga_argument_interfaces,
-    SPV_INTEL_fpga_buffer_location,
-    SPV_INTEL_fpga_cluster_attributes,
-    SPV_INTEL_fpga_dsp_control,
-    SPV_INTEL_fpga_invocation_pipelining_attributes,
-    SPV_INTEL_fpga_latency_control,
-    SPV_INTEL_fpga_loop_controls,
-    SPV_INTEL_fpga_memory_accesses,
-    SPV_INTEL_fpga_memory_attributes,
-    SPV_INTEL_fpga_reg,
-    SPV_INTEL_fp_fast_math_mode,
-    SPV_INTEL_fp_max_error,
-    SPV_INTEL_global_variable_fpga_decorations,
-    SPV_INTEL_global_variable_host_access,
-    SPV_INTEL_io_pipes,
-    SPV_INTEL_kernel_attributes,
-    SPV_INTEL_long_composites,
-    SPV_INTEL_loop_fuse,
-    SPV_INTEL_maximum_registers,
-    SPV_INTEL_media_block_io,
-    SPV_INTEL_runtime_aligned,
-    SPV_INTEL_shader_integer_functions2,
-    SPV_INTEL_split_barrier,
-    SPV_INTEL_subgroups,
-    SPV_INTEL_subgroup_buffer_prefetch,
-    SPV_INTEL_task_sequence,
-    SPV_INTEL_unstructured_loop_controls,
-    SPV_INTEL_usm_storage_classes,
-    SPV_KHR_16bit_storage,
-    SPV_KHR_8bit_storage,
-    SPV_KHR_bit_instructions,
-    SPV_KHR_compute_shader_derivatives,
-    SPV_KHR_cooperative_matrix,
-    SPV_KHR_device_group,
-    SPV_KHR_expect_assume,
-    SPV_KHR_float_controls,
-    SPV_KHR_float_controls2,
-    SPV_KHR_fragment_shader_barycentric,
-    SPV_KHR_fragment_shading_rate,
-    SPV_KHR_integer_dot_product,
-    SPV_KHR_linkonce_odr,
-    SPV_KHR_maximal_reconvergence,
-    SPV_KHR_multiview,
-    SPV_KHR_non_semantic_info,
-    SPV_KHR_no_integer_wrap_decoration,
-    SPV_KHR_physical_storage_buffer,
-    SPV_KHR_post_depth_coverage,
-    SPV_KHR_quad_control,
-    SPV_KHR_ray_cull_mask,
-    SPV_KHR_ray_query,
-    SPV_KHR_ray_tracing,
-    SPV_KHR_ray_tracing_position_fetch,
-    SPV_KHR_relaxed_extended_instruction,
-    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_rotate,
-    SPV_KHR_subgroup_uniform_control_flow,
-    SPV_KHR_subgroup_vote,
-    SPV_KHR_terminate_invocation,
-    SPV_KHR_untyped_pointers,
-    SPV_KHR_variable_pointers,
-    SPV_KHR_vulkan_memory_model,
-    SPV_KHR_workgroup_memory_explicit_layout,
-    SPV_NVX_multiview_per_view_attributes,
-    SPV_NV_bindless_texture,
-    SPV_NV_cluster_acceleration_structure,
-    SPV_NV_compute_shader_derivatives,
-    SPV_NV_cooperative_matrix,
-    SPV_NV_cooperative_matrix2,
-    SPV_NV_cooperative_vector,
-    SPV_NV_displacement_micromap,
-    SPV_NV_fragment_shader_barycentric,
-    SPV_NV_geometry_shader_passthrough,
-    SPV_NV_linear_swept_spheres,
-    SPV_NV_mesh_shader,
-    SPV_NV_raw_access_chains,
-    SPV_NV_ray_tracing,
-    SPV_NV_ray_tracing_motion_blur,
-    SPV_NV_sample_mask_override_coverage,
-    SPV_NV_shader_atomic_fp16_vector,
-    SPV_NV_shader_image_footprint,
-    SPV_NV_shader_invocation_reorder,
-    SPV_NV_shader_sm_builtins,
-    SPV_NV_shader_subgroup_partitioned,
-    SPV_NV_shading_rate,
-    SPV_NV_stereo_view_rendering,
-    SPV_NV_tensor_addressing,
-    SPV_NV_viewport_array2,
-    SPV_QCOM_image_processing,
-    SPV_QCOM_image_processing2,
-    Matrix,
-    Shader,
-    Geometry,
-    Tessellation,
-    Addresses,
-    Linkage,
-    Kernel,
-    Vector16,
-    Float16Buffer,
-    Float16,
-    Float64,
-    Int64,
-    Int64Atomics,
-    ImageBasic,
-    ImageReadWrite,
-    ImageMipmap,
-    Pipes,
-    Groups,
-    DeviceEnqueue,
-    LiteralSampler,
-    AtomicStorage,
-    Int16,
-    TessellationPointSize,
-    GeometryPointSize,
-    ImageGatherExtended,
-    StorageImageMultisample,
-    UniformBufferArrayDynamicIndexing,
-    SampledImageArrayDynamicIndexing,
-    StorageBufferArrayDynamicIndexing,
-    StorageImageArrayDynamicIndexing,
-    ClipDistance,
-    CullDistance,
-    ImageCubeArray,
-    SampleRateShading,
-    ImageRect,
-    SampledRect,
-    GenericPointer,
-    Int8,
-    InputAttachment,
-    SparseResidency,
-    MinLod,
-    Sampled1D,
-    Image1D,
-    SampledCubeArray,
-    SampledBuffer,
-    ImageBuffer,
-    ImageMSArray,
-    StorageImageExtendedFormats,
-    ImageQuery,
-    DerivativeControl,
-    InterpolationFunction,
-    TransformFeedback,
-    GeometryStreams,
-    StorageImageReadWithoutFormat,
-    StorageImageWriteWithoutFormat,
-    MultiViewport,
-    SubgroupDispatch,
-    NamedBarrier,
-    PipeStorage,
-    GroupNonUniform,
-    GroupNonUniformVote,
-    GroupNonUniformArithmetic,
-    GroupNonUniformBallot,
-    GroupNonUniformShuffle,
-    GroupNonUniformShuffleRelative,
-    GroupNonUniformClustered,
-    GroupNonUniformQuad,
-    ShaderLayer,
-    ShaderViewportIndex,
-    UniformDecoration,
-    CoreBuiltinsARM,
-    TileImageColorReadAccessEXT,
-    TileImageDepthReadAccessEXT,
-    TileImageStencilReadAccessEXT,
-    CooperativeMatrixLayoutsARM,
-    FragmentShadingRateKHR,
-    SubgroupBallotKHR,
-    DrawParameters,
-    WorkgroupMemoryExplicitLayoutKHR,
-    WorkgroupMemoryExplicitLayout8BitAccessKHR,
-    WorkgroupMemoryExplicitLayout16BitAccessKHR,
-    SubgroupVoteKHR,
-    StorageBuffer16BitAccess,
-    UniformAndStorageBuffer16BitAccess,
-    StoragePushConstant16,
-    StorageInputOutput16,
-    DeviceGroup,
-    MultiView,
-    VariablePointersStorageBuffer,
-    VariablePointers,
-    AtomicStorageOps,
-    SampleMaskPostDepthCoverage,
-    StorageBuffer8BitAccess,
-    UniformAndStorageBuffer8BitAccess,
-    StoragePushConstant8,
-    DenormPreserve,
-    DenormFlushToZero,
-    SignedZeroInfNanPreserve,
-    RoundingModeRTE,
-    RoundingModeRTZ,
-    RayQueryProvisionalKHR,
-    RayQueryKHR,
-    UntypedPointersKHR,
-    RayTraversalPrimitiveCullingKHR,
-    RayTracingKHR,
-    TextureSampleWeightedQCOM,
-    TextureBoxFilterQCOM,
-    TextureBlockMatchQCOM,
-    TextureBlockMatch2QCOM,
-    Float16ImageAMD,
-    ImageGatherBiasLodAMD,
-    FragmentMaskAMD,
-    StencilExportEXT,
-    ImageReadWriteLodAMD,
-    Int64ImageEXT,
-    ShaderClockKHR,
-    ShaderEnqueueAMDX,
-    QuadControlKHR,
-    SampleMaskOverrideCoverageNV,
-    GeometryShaderPassthroughNV,
-    ShaderViewportIndexLayerEXT,
-    ShaderViewportMaskNV,
-    ShaderStereoViewNV,
-    PerViewAttributesNV,
-    FragmentFullyCoveredEXT,
-    MeshShadingNV,
-    ImageFootprintNV,
-    MeshShadingEXT,
-    FragmentBarycentricKHR,
-    ComputeDerivativeGroupQuadsKHR,
-    FragmentDensityEXT,
-    GroupNonUniformPartitionedNV,
-    ShaderNonUniform,
-    RuntimeDescriptorArray,
-    InputAttachmentArrayDynamicIndexing,
-    UniformTexelBufferArrayDynamicIndexing,
-    StorageTexelBufferArrayDynamicIndexing,
-    UniformBufferArrayNonUniformIndexing,
-    SampledImageArrayNonUniformIndexing,
-    StorageBufferArrayNonUniformIndexing,
-    StorageImageArrayNonUniformIndexing,
-    InputAttachmentArrayNonUniformIndexing,
-    UniformTexelBufferArrayNonUniformIndexing,
-    StorageTexelBufferArrayNonUniformIndexing,
-    RayTracingPositionFetchKHR,
-    RayTracingNV,
-    RayTracingMotionBlurNV,
-    VulkanMemoryModel,
-    VulkanMemoryModelDeviceScope,
-    PhysicalStorageBufferAddresses,
-    ComputeDerivativeGroupLinearKHR,
-    RayTracingProvisionalKHR,
-    CooperativeMatrixNV,
-    FragmentShaderSampleInterlockEXT,
-    FragmentShaderShadingRateInterlockEXT,
-    ShaderSMBuiltinsNV,
-    FragmentShaderPixelInterlockEXT,
-    DemoteToHelperInvocation,
-    DisplacementMicromapNV,
-    RayTracingOpacityMicromapEXT,
-    ShaderInvocationReorderNV,
-    BindlessTextureNV,
-    RayQueryPositionFetchKHR,
-    CooperativeVectorNV,
-    AtomicFloat16VectorNV,
-    RayTracingDisplacementMicromapNV,
-    RawAccessChainsNV,
-    RayTracingSpheresGeometryNV,
-    RayTracingLinearSweptSpheresGeometryNV,
-    CooperativeMatrixReductionsNV,
-    CooperativeMatrixConversionsNV,
-    CooperativeMatrixPerElementOperationsNV,
-    CooperativeMatrixTensorAddressingNV,
-    CooperativeMatrixBlockLoadsNV,
-    CooperativeVectorTrainingNV,
-    RayTracingClusterAccelerationStructureNV,
-    TensorAddressingNV,
-    SubgroupShuffleINTEL,
-    SubgroupBufferBlockIOINTEL,
-    SubgroupImageBlockIOINTEL,
-    SubgroupImageMediaBlockIOINTEL,
-    RoundToInfinityINTEL,
-    FloatingPointModeINTEL,
-    IntegerFunctions2INTEL,
-    FunctionPointersINTEL,
-    IndirectReferencesINTEL,
-    AsmINTEL,
-    AtomicFloat32MinMaxEXT,
-    AtomicFloat64MinMaxEXT,
-    AtomicFloat16MinMaxEXT,
-    VectorComputeINTEL,
-    VectorAnyINTEL,
-    ExpectAssumeKHR,
-    SubgroupAvcMotionEstimationINTEL,
-    SubgroupAvcMotionEstimationIntraINTEL,
-    SubgroupAvcMotionEstimationChromaINTEL,
-    VariableLengthArrayINTEL,
-    FunctionFloatControlINTEL,
-    FPGAMemoryAttributesINTEL,
-    FPFastMathModeINTEL,
-    ArbitraryPrecisionIntegersINTEL,
-    ArbitraryPrecisionFloatingPointINTEL,
-    UnstructuredLoopControlsINTEL,
-    FPGALoopControlsINTEL,
-    KernelAttributesINTEL,
-    FPGAKernelAttributesINTEL,
-    FPGAMemoryAccessesINTEL,
-    FPGAClusterAttributesINTEL,
-    LoopFuseINTEL,
-    FPGADSPControlINTEL,
-    MemoryAccessAliasingINTEL,
-    FPGAInvocationPipeliningAttributesINTEL,
-    FPGABufferLocationINTEL,
-    ArbitraryPrecisionFixedPointINTEL,
-    USMStorageClassesINTEL,
-    RuntimeAlignedAttributeINTEL,
-    IOPipesINTEL,
-    BlockingPipesINTEL,
-    FPGARegINTEL,
-    DotProductInputAll,
-    DotProductInput4x8Bit,
-    DotProductInput4x8BitPacked,
-    DotProduct,
-    RayCullMaskKHR,
-    CooperativeMatrixKHR,
-    ReplicatedCompositesEXT,
-    BitInstructions,
-    GroupNonUniformRotateKHR,
-    FloatControls2,
-    AtomicFloat32AddEXT,
-    AtomicFloat64AddEXT,
-    LongCompositesINTEL,
-    OptNoneEXT,
-    AtomicFloat16AddEXT,
-    DebugInfoModuleINTEL,
-    BFloat16ConversionINTEL,
-    SplitBarrierINTEL,
-    ArithmeticFenceEXT,
-    FPGAClusterAttributesV2INTEL,
-    FPGAKernelAttributesv2INTEL,
-    FPMaxErrorINTEL,
-    FPGALatencyControlINTEL,
-    FPGAArgumentInterfacesINTEL,
-    GlobalVariableHostAccessINTEL,
-    GlobalVariableFPGADecorationsINTEL,
-    SubgroupBufferPrefetchINTEL,
-    Subgroup2DBlockIOINTEL,
-    Subgroup2DBlockTransformINTEL,
-    Subgroup2DBlockTransposeINTEL,
-    SubgroupMatrixMultiplyAccumulateINTEL,
-    GroupUniformArithmeticKHR,
-    MaskedGatherScatterINTEL,
-    CacheControlsINTEL,
-    RegisterLimitsINTEL,
+    int8,
+    int16,
+    int64,
+    float16,
+    float64,
+    addresses,
+    matrix,
+    kernel,
+    generic_pointer,
+    vector16,
+    shader,
 };
 
 pub const featureSet = CpuFeature.FeatureSetFns(Feature).featureSet;
@@ -426,2391 +41,87 @@ pub const all_features = blk: {
     result[@intFromEnum(Feature.v1_1)] = .{
         .llvm_name = null,
         .description = "SPIR-V version 1.1",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
+        .dependencies = featureSet(&[_]Feature{.v1_0}),
     };
     result[@intFromEnum(Feature.v1_2)] = .{
         .llvm_name = null,
         .description = "SPIR-V version 1.2",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_1,
-        }),
+        .dependencies = featureSet(&[_]Feature{.v1_1}),
     };
     result[@intFromEnum(Feature.v1_3)] = .{
         .llvm_name = null,
         .description = "SPIR-V version 1.3",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_2,
-        }),
+        .dependencies = featureSet(&[_]Feature{.v1_2}),
     };
     result[@intFromEnum(Feature.v1_4)] = .{
         .llvm_name = null,
         .description = "SPIR-V version 1.4",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-        }),
+        .dependencies = featureSet(&[_]Feature{.v1_3}),
     };
     result[@intFromEnum(Feature.v1_5)] = .{
         .llvm_name = null,
         .description = "SPIR-V version 1.5",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_4,
-        }),
+        .dependencies = featureSet(&[_]Feature{.v1_4}),
     };
     result[@intFromEnum(Feature.v1_6)] = .{
         .llvm_name = null,
         .description = "SPIR-V version 1.6",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-        }),
-    };
-    result[@intFromEnum(Feature.SPV_AMDX_shader_enqueue)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_AMDX_shader_enqueue",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_AMD_gcn_shader)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_AMD_gcn_shader",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_AMD_gpu_shader_half_float)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_AMD_gpu_shader_half_float",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_AMD_gpu_shader_half_float_fetch)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_AMD_gpu_shader_half_float_fetch",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_AMD_gpu_shader_int16)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_AMD_gpu_shader_int16",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_AMD_shader_ballot)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_AMD_shader_ballot",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_AMD_shader_early_and_late_fragment_tests)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_AMD_shader_early_and_late_fragment_tests",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_AMD_shader_explicit_vertex_parameter)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_AMD_shader_explicit_vertex_parameter",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_AMD_shader_fragment_mask)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_AMD_shader_fragment_mask",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_AMD_shader_image_load_store_lod)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_AMD_shader_image_load_store_lod",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_AMD_shader_trinary_minmax)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_AMD_shader_trinary_minmax",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_AMD_texture_gather_bias_lod)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_AMD_texture_gather_bias_lod",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_ARM_cooperative_matrix_layouts)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_ARM_cooperative_matrix_layouts",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_ARM_core_builtins)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_ARM_core_builtins",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_arithmetic_fence)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_arithmetic_fence",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_demote_to_helper_invocation)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_demote_to_helper_invocation",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_descriptor_indexing)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_descriptor_indexing",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_fragment_fully_covered)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_fragment_fully_covered",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_fragment_invocation_density)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_fragment_invocation_density",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_fragment_shader_interlock)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_fragment_shader_interlock",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_image_raw10_raw12)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_image_raw10_raw12",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_mesh_shader)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_mesh_shader",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_opacity_micromap)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_opacity_micromap",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_optnone)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_optnone",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_physical_storage_buffer)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_physical_storage_buffer",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_replicated_composites)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_replicated_composites",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float16_add)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_shader_atomic_float16_add",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float_add)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_shader_atomic_float_add",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float_min_max)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_shader_atomic_float_min_max",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_shader_image_int64)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_shader_image_int64",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_shader_stencil_export)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_shader_stencil_export",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_shader_tile_image)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_shader_tile_image",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_shader_viewport_index_layer)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_shader_viewport_index_layer",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_EXT_ycbcr_attachments)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_EXT_ycbcr_attachments",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_GOOGLE_decorate_string)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_GOOGLE_decorate_string",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_GOOGLE_hlsl_functionality1)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_GOOGLE_hlsl_functionality1",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_GOOGLE_user_type)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_GOOGLE_user_type",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_HUAWEI_cluster_culling_shader)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_HUAWEI_cluster_culling_shader",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_HUAWEI_subpass_shading)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_HUAWEI_subpass_shading",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_arbitrary_precision_fixed_point)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_arbitrary_precision_fixed_point",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_arbitrary_precision_floating_point)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_arbitrary_precision_floating_point",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_arbitrary_precision_integers)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_arbitrary_precision_integers",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_blocking_pipes)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_blocking_pipes",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_device_side_avc_motion_estimation)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_device_side_avc_motion_estimation",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_fpga_argument_interfaces)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_fpga_argument_interfaces",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_fpga_buffer_location)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_fpga_buffer_location",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_fpga_cluster_attributes)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_fpga_cluster_attributes",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_fpga_dsp_control)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_fpga_dsp_control",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_fpga_invocation_pipelining_attributes)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_fpga_invocation_pipelining_attributes",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_fpga_latency_control)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_fpga_latency_control",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_fpga_loop_controls)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_fpga_loop_controls",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_fpga_memory_accesses)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_fpga_memory_accesses",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_fpga_memory_attributes)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_fpga_memory_attributes",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_fpga_reg)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_fpga_reg",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_fp_fast_math_mode)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_fp_fast_math_mode",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_fp_max_error)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_fp_max_error",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_global_variable_fpga_decorations)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_global_variable_fpga_decorations",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_global_variable_host_access)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_global_variable_host_access",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_io_pipes)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_io_pipes",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_kernel_attributes)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_kernel_attributes",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_long_composites)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_long_composites",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_loop_fuse)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_loop_fuse",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_maximum_registers)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_maximum_registers",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_media_block_io)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_media_block_io",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_runtime_aligned)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_runtime_aligned",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_shader_integer_functions2)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_shader_integer_functions2",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_split_barrier)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_split_barrier",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_subgroups)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_subgroups",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_subgroup_buffer_prefetch)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_subgroup_buffer_prefetch",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_task_sequence)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_task_sequence",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_unstructured_loop_controls)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_unstructured_loop_controls",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_INTEL_usm_storage_classes)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_INTEL_usm_storage_classes",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_16bit_storage)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_16bit_storage",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_8bit_storage)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_8bit_storage",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_bit_instructions)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_bit_instructions",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_compute_shader_derivatives)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_compute_shader_derivatives",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_cooperative_matrix)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_cooperative_matrix",
-        .dependencies = featureSet(&[_]Feature{}),
+        .dependencies = featureSet(&[_]Feature{.v1_5}),
     };
-    result[@intFromEnum(Feature.SPV_KHR_device_group)] = .{
+    result[@intFromEnum(Feature.int8)] = .{
         .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_device_group",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_expect_assume)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_expect_assume",
-        .dependencies = featureSet(&[_]Feature{}),
+        .description = "Enable SPIR-V capability Int8",
+        .dependencies = featureSet(&[_]Feature{.v1_0}),
     };
-    result[@intFromEnum(Feature.SPV_KHR_float_controls)] = .{
+    result[@intFromEnum(Feature.int16)] = .{
         .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_float_controls",
-        .dependencies = featureSet(&[_]Feature{}),
+        .description = "Enable SPIR-V capability Int16",
+        .dependencies = featureSet(&[_]Feature{.v1_0}),
     };
-    result[@intFromEnum(Feature.SPV_KHR_float_controls2)] = .{
+    result[@intFromEnum(Feature.int64)] = .{
         .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_float_controls2",
-        .dependencies = featureSet(&[_]Feature{}),
+        .description = "Enable SPIR-V capability Int64",
+        .dependencies = featureSet(&[_]Feature{.v1_0}),
     };
-    result[@intFromEnum(Feature.SPV_KHR_fragment_shader_barycentric)] = .{
+    result[@intFromEnum(Feature.float16)] = .{
         .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_fragment_shader_barycentric",
-        .dependencies = featureSet(&[_]Feature{}),
+        .description = "Enable SPIR-V capability Float16",
+        .dependencies = featureSet(&[_]Feature{.v1_0}),
     };
-    result[@intFromEnum(Feature.SPV_KHR_fragment_shading_rate)] = .{
+    result[@intFromEnum(Feature.float64)] = .{
         .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_fragment_shading_rate",
-        .dependencies = featureSet(&[_]Feature{}),
+        .description = "Enable SPIR-V capability Float64",
+        .dependencies = featureSet(&[_]Feature{.v1_0}),
     };
-    result[@intFromEnum(Feature.SPV_KHR_integer_dot_product)] = .{
+    result[@intFromEnum(Feature.addresses)] = .{
         .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_integer_dot_product",
-        .dependencies = featureSet(&[_]Feature{}),
+        .description = "Enable SPIR-V capability Addresses",
+        .dependencies = featureSet(&[_]Feature{.v1_0}),
     };
-    result[@intFromEnum(Feature.SPV_KHR_linkonce_odr)] = .{
+    result[@intFromEnum(Feature.matrix)] = .{
         .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_linkonce_odr",
-        .dependencies = featureSet(&[_]Feature{}),
+        .description = "Enable SPIR-V capability Matrix",
+        .dependencies = featureSet(&[_]Feature{.v1_0}),
     };
-    result[@intFromEnum(Feature.SPV_KHR_maximal_reconvergence)] = .{
+    result[@intFromEnum(Feature.kernel)] = .{
         .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_maximal_reconvergence",
-        .dependencies = featureSet(&[_]Feature{}),
+        .description = "Enable SPIR-V capability Kernel",
+        .dependencies = featureSet(&[_]Feature{.v1_0}),
     };
-    result[@intFromEnum(Feature.SPV_KHR_multiview)] = .{
+    result[@intFromEnum(Feature.generic_pointer)] = .{
         .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_multiview",
-        .dependencies = featureSet(&[_]Feature{}),
+        .description = "Enable SPIR-V capability GenericPointer",
+        .dependencies = featureSet(&[_]Feature{ .v1_0, .addresses }),
     };
-    result[@intFromEnum(Feature.SPV_KHR_non_semantic_info)] = .{
+    result[@intFromEnum(Feature.vector16)] = .{
         .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_non_semantic_info",
-        .dependencies = featureSet(&[_]Feature{}),
+        .description = "Enable SPIR-V capability Vector16",
+        .dependencies = featureSet(&[_]Feature{ .v1_0, .kernel }),
     };
-    result[@intFromEnum(Feature.SPV_KHR_no_integer_wrap_decoration)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_no_integer_wrap_decoration",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_physical_storage_buffer)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_physical_storage_buffer",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_post_depth_coverage)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_post_depth_coverage",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_quad_control)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_quad_control",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_ray_cull_mask)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_ray_cull_mask",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_ray_query)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_ray_query",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_ray_tracing)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_ray_tracing",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_ray_tracing_position_fetch)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_ray_tracing_position_fetch",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_relaxed_extended_instruction)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_relaxed_extended_instruction",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_shader_atomic_counter_ops)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_shader_atomic_counter_ops",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_shader_ballot)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_shader_ballot",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_shader_clock)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_shader_clock",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_shader_draw_parameters)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_shader_draw_parameters",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_storage_buffer_storage_class)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_storage_buffer_storage_class",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_subgroup_rotate)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_subgroup_rotate",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_subgroup_uniform_control_flow)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_subgroup_uniform_control_flow",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_subgroup_vote)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_subgroup_vote",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_terminate_invocation)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_terminate_invocation",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_untyped_pointers)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_untyped_pointers",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_variable_pointers)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_variable_pointers",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_vulkan_memory_model)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_vulkan_memory_model",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_KHR_workgroup_memory_explicit_layout)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_KHR_workgroup_memory_explicit_layout",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NVX_multiview_per_view_attributes)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NVX_multiview_per_view_attributes",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_bindless_texture)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_bindless_texture",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_cluster_acceleration_structure)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_cluster_acceleration_structure",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_compute_shader_derivatives)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_compute_shader_derivatives",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_cooperative_matrix)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_cooperative_matrix",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_cooperative_matrix2)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_cooperative_matrix2",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_cooperative_vector)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_cooperative_vector",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_displacement_micromap)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_displacement_micromap",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_fragment_shader_barycentric)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_fragment_shader_barycentric",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_geometry_shader_passthrough)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_geometry_shader_passthrough",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_linear_swept_spheres)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_linear_swept_spheres",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_mesh_shader)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_mesh_shader",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_raw_access_chains)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_raw_access_chains",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_ray_tracing)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_ray_tracing",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_ray_tracing_motion_blur)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_ray_tracing_motion_blur",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_sample_mask_override_coverage)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_sample_mask_override_coverage",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_shader_atomic_fp16_vector)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_shader_atomic_fp16_vector",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_shader_image_footprint)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_shader_image_footprint",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_shader_invocation_reorder)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_shader_invocation_reorder",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_shader_sm_builtins)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_shader_sm_builtins",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_shader_subgroup_partitioned)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_shader_subgroup_partitioned",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_shading_rate)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_shading_rate",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_stereo_view_rendering)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_stereo_view_rendering",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_tensor_addressing)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_tensor_addressing",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_NV_viewport_array2)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_NV_viewport_array2",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_QCOM_image_processing)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_QCOM_image_processing",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SPV_QCOM_image_processing2)] = .{
-        .llvm_name = null,
-        .description = "SPIR-V extension SPV_QCOM_image_processing2",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.Matrix)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Matrix",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
-    };
-    result[@intFromEnum(Feature.Shader)] = .{
+    result[@intFromEnum(Feature.shader)] = .{
         .llvm_name = null,
         .description = "Enable SPIR-V capability Shader",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Matrix,
-        }),
-    };
-    result[@intFromEnum(Feature.Geometry)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Geometry",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.Tessellation)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Tessellation",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.Addresses)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Addresses",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
-    };
-    result[@intFromEnum(Feature.Linkage)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Linkage",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
-    };
-    result[@intFromEnum(Feature.Kernel)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Kernel",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
-    };
-    result[@intFromEnum(Feature.Vector16)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Vector16",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Kernel,
-        }),
-    };
-    result[@intFromEnum(Feature.Float16Buffer)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Float16Buffer",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Kernel,
-        }),
-    };
-    result[@intFromEnum(Feature.Float16)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Float16",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
-    };
-    result[@intFromEnum(Feature.Float64)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Float64",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
-    };
-    result[@intFromEnum(Feature.Int64)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Int64",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
-    };
-    result[@intFromEnum(Feature.Int64Atomics)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Int64Atomics",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Int64,
-        }),
-    };
-    result[@intFromEnum(Feature.ImageBasic)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ImageBasic",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Kernel,
-        }),
-    };
-    result[@intFromEnum(Feature.ImageReadWrite)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ImageReadWrite",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .ImageBasic,
-        }),
-    };
-    result[@intFromEnum(Feature.ImageMipmap)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ImageMipmap",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .ImageBasic,
-        }),
-    };
-    result[@intFromEnum(Feature.Pipes)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Pipes",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Kernel,
-        }),
-    };
-    result[@intFromEnum(Feature.Groups)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Groups",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
-    };
-    result[@intFromEnum(Feature.DeviceEnqueue)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DeviceEnqueue",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Kernel,
-        }),
-    };
-    result[@intFromEnum(Feature.LiteralSampler)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability LiteralSampler",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Kernel,
-        }),
-    };
-    result[@intFromEnum(Feature.AtomicStorage)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability AtomicStorage",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.Int16)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Int16",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
-    };
-    result[@intFromEnum(Feature.TessellationPointSize)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability TessellationPointSize",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Tessellation,
-        }),
-    };
-    result[@intFromEnum(Feature.GeometryPointSize)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GeometryPointSize",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Geometry,
-        }),
-    };
-    result[@intFromEnum(Feature.ImageGatherExtended)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ImageGatherExtended",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.StorageImageMultisample)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageImageMultisample",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.UniformBufferArrayDynamicIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability UniformBufferArrayDynamicIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.SampledImageArrayDynamicIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SampledImageArrayDynamicIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.StorageBufferArrayDynamicIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageBufferArrayDynamicIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.StorageImageArrayDynamicIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageImageArrayDynamicIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.ClipDistance)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ClipDistance",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.CullDistance)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CullDistance",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.ImageCubeArray)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ImageCubeArray",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .SampledCubeArray,
-        }),
-    };
-    result[@intFromEnum(Feature.SampleRateShading)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SampleRateShading",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.ImageRect)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ImageRect",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .SampledRect,
-        }),
-    };
-    result[@intFromEnum(Feature.SampledRect)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SampledRect",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.GenericPointer)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GenericPointer",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Addresses,
-        }),
-    };
-    result[@intFromEnum(Feature.Int8)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Int8",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
-    };
-    result[@intFromEnum(Feature.InputAttachment)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability InputAttachment",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.SparseResidency)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SparseResidency",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.MinLod)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability MinLod",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.Sampled1D)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Sampled1D",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
-    };
-    result[@intFromEnum(Feature.Image1D)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Image1D",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Sampled1D,
-        }),
-    };
-    result[@intFromEnum(Feature.SampledCubeArray)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SampledCubeArray",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.SampledBuffer)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SampledBuffer",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-        }),
-    };
-    result[@intFromEnum(Feature.ImageBuffer)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ImageBuffer",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .SampledBuffer,
-        }),
-    };
-    result[@intFromEnum(Feature.ImageMSArray)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ImageMSArray",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.StorageImageExtendedFormats)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageImageExtendedFormats",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.ImageQuery)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ImageQuery",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.DerivativeControl)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DerivativeControl",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.InterpolationFunction)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability InterpolationFunction",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.TransformFeedback)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability TransformFeedback",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.GeometryStreams)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GeometryStreams",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Geometry,
-        }),
-    };
-    result[@intFromEnum(Feature.StorageImageReadWithoutFormat)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageImageReadWithoutFormat",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.StorageImageWriteWithoutFormat)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageImageWriteWithoutFormat",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.MultiViewport)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability MultiViewport",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_0,
-            .Geometry,
-        }),
-    };
-    result[@intFromEnum(Feature.SubgroupDispatch)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SubgroupDispatch",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_1,
-            .DeviceEnqueue,
-        }),
-    };
-    result[@intFromEnum(Feature.NamedBarrier)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability NamedBarrier",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_1,
-            .Kernel,
-        }),
-    };
-    result[@intFromEnum(Feature.PipeStorage)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability PipeStorage",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_1,
-            .Pipes,
-        }),
-    };
-    result[@intFromEnum(Feature.GroupNonUniform)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GroupNonUniform",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-        }),
-    };
-    result[@intFromEnum(Feature.GroupNonUniformVote)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GroupNonUniformVote",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-            .GroupNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.GroupNonUniformArithmetic)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GroupNonUniformArithmetic",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-            .GroupNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.GroupNonUniformBallot)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GroupNonUniformBallot",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-            .GroupNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.GroupNonUniformShuffle)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GroupNonUniformShuffle",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-            .GroupNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.GroupNonUniformShuffleRelative)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GroupNonUniformShuffleRelative",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-            .GroupNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.GroupNonUniformClustered)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GroupNonUniformClustered",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-            .GroupNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.GroupNonUniformQuad)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GroupNonUniformQuad",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-            .GroupNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.ShaderLayer)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ShaderLayer",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-        }),
-    };
-    result[@intFromEnum(Feature.ShaderViewportIndex)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ShaderViewportIndex",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-        }),
-    };
-    result[@intFromEnum(Feature.UniformDecoration)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability UniformDecoration",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_6,
-        }),
-    };
-    result[@intFromEnum(Feature.CoreBuiltinsARM)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CoreBuiltinsARM",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.TileImageColorReadAccessEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability TileImageColorReadAccessEXT",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.TileImageDepthReadAccessEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability TileImageDepthReadAccessEXT",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.TileImageStencilReadAccessEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability TileImageStencilReadAccessEXT",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.CooperativeMatrixLayoutsARM)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CooperativeMatrixLayoutsARM",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FragmentShadingRateKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FragmentShadingRateKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.SubgroupBallotKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SubgroupBallotKHR",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.DrawParameters)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DrawParameters",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.WorkgroupMemoryExplicitLayoutKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability WorkgroupMemoryExplicitLayoutKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.WorkgroupMemoryExplicitLayout8BitAccessKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability WorkgroupMemoryExplicitLayout8BitAccessKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .WorkgroupMemoryExplicitLayoutKHR,
-        }),
-    };
-    result[@intFromEnum(Feature.WorkgroupMemoryExplicitLayout16BitAccessKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability WorkgroupMemoryExplicitLayout16BitAccessKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .WorkgroupMemoryExplicitLayoutKHR,
-        }),
-    };
-    result[@intFromEnum(Feature.SubgroupVoteKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SubgroupVoteKHR",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.StorageBuffer16BitAccess)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageBuffer16BitAccess",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-        }),
-    };
-    result[@intFromEnum(Feature.UniformAndStorageBuffer16BitAccess)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability UniformAndStorageBuffer16BitAccess",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-            .StorageBuffer16BitAccess,
-        }),
-    };
-    result[@intFromEnum(Feature.StoragePushConstant16)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StoragePushConstant16",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-        }),
-    };
-    result[@intFromEnum(Feature.StorageInputOutput16)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageInputOutput16",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-        }),
-    };
-    result[@intFromEnum(Feature.DeviceGroup)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DeviceGroup",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-        }),
-    };
-    result[@intFromEnum(Feature.MultiView)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability MultiView",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.VariablePointersStorageBuffer)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability VariablePointersStorageBuffer",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.VariablePointers)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability VariablePointers",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_3,
-            .VariablePointersStorageBuffer,
-        }),
-    };
-    result[@intFromEnum(Feature.AtomicStorageOps)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability AtomicStorageOps",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SampleMaskPostDepthCoverage)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SampleMaskPostDepthCoverage",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.StorageBuffer8BitAccess)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageBuffer8BitAccess",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-        }),
-    };
-    result[@intFromEnum(Feature.UniformAndStorageBuffer8BitAccess)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability UniformAndStorageBuffer8BitAccess",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .StorageBuffer8BitAccess,
-        }),
-    };
-    result[@intFromEnum(Feature.StoragePushConstant8)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StoragePushConstant8",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-        }),
-    };
-    result[@intFromEnum(Feature.DenormPreserve)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DenormPreserve",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_4,
-        }),
-    };
-    result[@intFromEnum(Feature.DenormFlushToZero)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DenormFlushToZero",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_4,
-        }),
-    };
-    result[@intFromEnum(Feature.SignedZeroInfNanPreserve)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SignedZeroInfNanPreserve",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_4,
-        }),
-    };
-    result[@intFromEnum(Feature.RoundingModeRTE)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RoundingModeRTE",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_4,
-        }),
-    };
-    result[@intFromEnum(Feature.RoundingModeRTZ)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RoundingModeRTZ",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_4,
-        }),
-    };
-    result[@intFromEnum(Feature.RayQueryProvisionalKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayQueryProvisionalKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.RayQueryKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayQueryKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.UntypedPointersKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability UntypedPointersKHR",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.RayTraversalPrimitiveCullingKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayTraversalPrimitiveCullingKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .RayQueryKHR,
-            .RayTracingKHR,
-        }),
-    };
-    result[@intFromEnum(Feature.RayTracingKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayTracingKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.TextureSampleWeightedQCOM)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability TextureSampleWeightedQCOM",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.TextureBoxFilterQCOM)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability TextureBoxFilterQCOM",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.TextureBlockMatchQCOM)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability TextureBlockMatchQCOM",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.TextureBlockMatch2QCOM)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability TextureBlockMatch2QCOM",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.Float16ImageAMD)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Float16ImageAMD",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.ImageGatherBiasLodAMD)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ImageGatherBiasLodAMD",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.FragmentMaskAMD)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FragmentMaskAMD",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.StencilExportEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StencilExportEXT",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.ImageReadWriteLodAMD)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ImageReadWriteLodAMD",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.Int64ImageEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Int64ImageEXT",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.ShaderClockKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ShaderClockKHR",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.ShaderEnqueueAMDX)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ShaderEnqueueAMDX",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.QuadControlKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability QuadControlKHR",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SampleMaskOverrideCoverageNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SampleMaskOverrideCoverageNV",
-        .dependencies = featureSet(&[_]Feature{
-            .SampleRateShading,
-        }),
-    };
-    result[@intFromEnum(Feature.GeometryShaderPassthroughNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GeometryShaderPassthroughNV",
-        .dependencies = featureSet(&[_]Feature{
-            .Geometry,
-        }),
-    };
-    result[@intFromEnum(Feature.ShaderViewportIndexLayerEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ShaderViewportIndexLayerEXT",
-        .dependencies = featureSet(&[_]Feature{
-            .MultiViewport,
-        }),
-    };
-    result[@intFromEnum(Feature.ShaderViewportMaskNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ShaderViewportMaskNV",
-        .dependencies = featureSet(&[_]Feature{
-            .ShaderViewportIndexLayerEXT,
-        }),
-    };
-    result[@intFromEnum(Feature.ShaderStereoViewNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ShaderStereoViewNV",
-        .dependencies = featureSet(&[_]Feature{
-            .ShaderViewportMaskNV,
-        }),
-    };
-    result[@intFromEnum(Feature.PerViewAttributesNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability PerViewAttributesNV",
-        .dependencies = featureSet(&[_]Feature{
-            .MultiView,
-        }),
-    };
-    result[@intFromEnum(Feature.FragmentFullyCoveredEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FragmentFullyCoveredEXT",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.MeshShadingNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability MeshShadingNV",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.ImageFootprintNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ImageFootprintNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.MeshShadingEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability MeshShadingEXT",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.FragmentBarycentricKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FragmentBarycentricKHR",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.ComputeDerivativeGroupQuadsKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ComputeDerivativeGroupQuadsKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.FragmentDensityEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FragmentDensityEXT",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.GroupNonUniformPartitionedNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GroupNonUniformPartitionedNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.ShaderNonUniform)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ShaderNonUniform",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.RuntimeDescriptorArray)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RuntimeDescriptorArray",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.InputAttachmentArrayDynamicIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability InputAttachmentArrayDynamicIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .InputAttachment,
-        }),
-    };
-    result[@intFromEnum(Feature.UniformTexelBufferArrayDynamicIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability UniformTexelBufferArrayDynamicIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .SampledBuffer,
-        }),
-    };
-    result[@intFromEnum(Feature.StorageTexelBufferArrayDynamicIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageTexelBufferArrayDynamicIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .ImageBuffer,
-        }),
-    };
-    result[@intFromEnum(Feature.UniformBufferArrayNonUniformIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability UniformBufferArrayNonUniformIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .ShaderNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.SampledImageArrayNonUniformIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SampledImageArrayNonUniformIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .ShaderNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.StorageBufferArrayNonUniformIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageBufferArrayNonUniformIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .ShaderNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.StorageImageArrayNonUniformIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageImageArrayNonUniformIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .ShaderNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.InputAttachmentArrayNonUniformIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability InputAttachmentArrayNonUniformIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .InputAttachment,
-            .ShaderNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.UniformTexelBufferArrayNonUniformIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability UniformTexelBufferArrayNonUniformIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .SampledBuffer,
-            .ShaderNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.StorageTexelBufferArrayNonUniformIndexing)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability StorageTexelBufferArrayNonUniformIndexing",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .ImageBuffer,
-            .ShaderNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.RayTracingPositionFetchKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayTracingPositionFetchKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.RayTracingNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayTracingNV",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.RayTracingMotionBlurNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayTracingMotionBlurNV",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.VulkanMemoryModel)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability VulkanMemoryModel",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-        }),
-    };
-    result[@intFromEnum(Feature.VulkanMemoryModelDeviceScope)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability VulkanMemoryModelDeviceScope",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-        }),
-    };
-    result[@intFromEnum(Feature.PhysicalStorageBufferAddresses)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability PhysicalStorageBufferAddresses",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_5,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.ComputeDerivativeGroupLinearKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ComputeDerivativeGroupLinearKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.RayTracingProvisionalKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayTracingProvisionalKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.CooperativeMatrixNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CooperativeMatrixNV",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.FragmentShaderSampleInterlockEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FragmentShaderSampleInterlockEXT",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.FragmentShaderShadingRateInterlockEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FragmentShaderShadingRateInterlockEXT",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.ShaderSMBuiltinsNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ShaderSMBuiltinsNV",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.FragmentShaderPixelInterlockEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FragmentShaderPixelInterlockEXT",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.DemoteToHelperInvocation)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DemoteToHelperInvocation",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_6,
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.DisplacementMicromapNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DisplacementMicromapNV",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.RayTracingOpacityMicromapEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayTracingOpacityMicromapEXT",
-        .dependencies = featureSet(&[_]Feature{
-            .RayQueryKHR,
-            .RayTracingKHR,
-        }),
-    };
-    result[@intFromEnum(Feature.ShaderInvocationReorderNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ShaderInvocationReorderNV",
-        .dependencies = featureSet(&[_]Feature{
-            .RayTracingKHR,
-        }),
-    };
-    result[@intFromEnum(Feature.BindlessTextureNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability BindlessTextureNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.RayQueryPositionFetchKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayQueryPositionFetchKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .Shader,
-        }),
-    };
-    result[@intFromEnum(Feature.CooperativeVectorNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CooperativeVectorNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.AtomicFloat16VectorNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability AtomicFloat16VectorNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.RayTracingDisplacementMicromapNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayTracingDisplacementMicromapNV",
-        .dependencies = featureSet(&[_]Feature{
-            .RayTracingKHR,
-        }),
-    };
-    result[@intFromEnum(Feature.RawAccessChainsNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RawAccessChainsNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.RayTracingSpheresGeometryNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayTracingSpheresGeometryNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.RayTracingLinearSweptSpheresGeometryNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayTracingLinearSweptSpheresGeometryNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.CooperativeMatrixReductionsNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CooperativeMatrixReductionsNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.CooperativeMatrixConversionsNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CooperativeMatrixConversionsNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.CooperativeMatrixPerElementOperationsNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CooperativeMatrixPerElementOperationsNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.CooperativeMatrixTensorAddressingNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CooperativeMatrixTensorAddressingNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.CooperativeMatrixBlockLoadsNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CooperativeMatrixBlockLoadsNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.CooperativeVectorTrainingNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CooperativeVectorTrainingNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.RayTracingClusterAccelerationStructureNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayTracingClusterAccelerationStructureNV",
-        .dependencies = featureSet(&[_]Feature{
-            .RayTracingKHR,
-        }),
-    };
-    result[@intFromEnum(Feature.TensorAddressingNV)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability TensorAddressingNV",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SubgroupShuffleINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SubgroupShuffleINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SubgroupBufferBlockIOINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SubgroupBufferBlockIOINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SubgroupImageBlockIOINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SubgroupImageBlockIOINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SubgroupImageMediaBlockIOINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SubgroupImageMediaBlockIOINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.RoundToInfinityINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RoundToInfinityINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FloatingPointModeINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FloatingPointModeINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.IntegerFunctions2INTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability IntegerFunctions2INTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FunctionPointersINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FunctionPointersINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.IndirectReferencesINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability IndirectReferencesINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.AsmINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability AsmINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.AtomicFloat32MinMaxEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability AtomicFloat32MinMaxEXT",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.AtomicFloat64MinMaxEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability AtomicFloat64MinMaxEXT",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.AtomicFloat16MinMaxEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability AtomicFloat16MinMaxEXT",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.VectorComputeINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability VectorComputeINTEL",
-        .dependencies = featureSet(&[_]Feature{
-            .VectorAnyINTEL,
-        }),
-    };
-    result[@intFromEnum(Feature.VectorAnyINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability VectorAnyINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.ExpectAssumeKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ExpectAssumeKHR",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SubgroupAvcMotionEstimationINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SubgroupAvcMotionEstimationINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SubgroupAvcMotionEstimationIntraINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SubgroupAvcMotionEstimationIntraINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SubgroupAvcMotionEstimationChromaINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SubgroupAvcMotionEstimationChromaINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.VariableLengthArrayINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability VariableLengthArrayINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FunctionFloatControlINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FunctionFloatControlINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPGAMemoryAttributesINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGAMemoryAttributesINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPFastMathModeINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPFastMathModeINTEL",
-        .dependencies = featureSet(&[_]Feature{
-            .Kernel,
-        }),
-    };
-    result[@intFromEnum(Feature.ArbitraryPrecisionIntegersINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ArbitraryPrecisionIntegersINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.ArbitraryPrecisionFloatingPointINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ArbitraryPrecisionFloatingPointINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.UnstructuredLoopControlsINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability UnstructuredLoopControlsINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPGALoopControlsINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGALoopControlsINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.KernelAttributesINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability KernelAttributesINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPGAKernelAttributesINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGAKernelAttributesINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPGAMemoryAccessesINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGAMemoryAccessesINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPGAClusterAttributesINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGAClusterAttributesINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.LoopFuseINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability LoopFuseINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPGADSPControlINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGADSPControlINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.MemoryAccessAliasingINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability MemoryAccessAliasingINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPGAInvocationPipeliningAttributesINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGAInvocationPipeliningAttributesINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPGABufferLocationINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGABufferLocationINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.ArbitraryPrecisionFixedPointINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ArbitraryPrecisionFixedPointINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.USMStorageClassesINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability USMStorageClassesINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.RuntimeAlignedAttributeINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RuntimeAlignedAttributeINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.IOPipesINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability IOPipesINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.BlockingPipesINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability BlockingPipesINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPGARegINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGARegINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.DotProductInputAll)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DotProductInputAll",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_6,
-        }),
-    };
-    result[@intFromEnum(Feature.DotProductInput4x8Bit)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DotProductInput4x8Bit",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_6,
-            .Int8,
-        }),
-    };
-    result[@intFromEnum(Feature.DotProductInput4x8BitPacked)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DotProductInput4x8BitPacked",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_6,
-        }),
-    };
-    result[@intFromEnum(Feature.DotProduct)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DotProduct",
-        .dependencies = featureSet(&[_]Feature{
-            .v1_6,
-        }),
-    };
-    result[@intFromEnum(Feature.RayCullMaskKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RayCullMaskKHR",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.CooperativeMatrixKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CooperativeMatrixKHR",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.ReplicatedCompositesEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ReplicatedCompositesEXT",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.BitInstructions)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability BitInstructions",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.GroupNonUniformRotateKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GroupNonUniformRotateKHR",
-        .dependencies = featureSet(&[_]Feature{
-            .GroupNonUniform,
-        }),
-    };
-    result[@intFromEnum(Feature.FloatControls2)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FloatControls2",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.AtomicFloat32AddEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability AtomicFloat32AddEXT",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.AtomicFloat64AddEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability AtomicFloat64AddEXT",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.LongCompositesINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability LongCompositesINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.OptNoneEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability OptNoneEXT",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.AtomicFloat16AddEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability AtomicFloat16AddEXT",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.DebugInfoModuleINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability DebugInfoModuleINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.BFloat16ConversionINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability BFloat16ConversionINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SplitBarrierINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SplitBarrierINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.ArithmeticFenceEXT)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability ArithmeticFenceEXT",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPGAClusterAttributesV2INTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGAClusterAttributesV2INTEL",
-        .dependencies = featureSet(&[_]Feature{
-            .FPGAClusterAttributesINTEL,
-        }),
-    };
-    result[@intFromEnum(Feature.FPGAKernelAttributesv2INTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGAKernelAttributesv2INTEL",
-        .dependencies = featureSet(&[_]Feature{
-            .FPGAKernelAttributesINTEL,
-        }),
-    };
-    result[@intFromEnum(Feature.FPMaxErrorINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPMaxErrorINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPGALatencyControlINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGALatencyControlINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.FPGAArgumentInterfacesINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability FPGAArgumentInterfacesINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.GlobalVariableHostAccessINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GlobalVariableHostAccessINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.GlobalVariableFPGADecorationsINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GlobalVariableFPGADecorationsINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.SubgroupBufferPrefetchINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SubgroupBufferPrefetchINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.Subgroup2DBlockIOINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Subgroup2DBlockIOINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.Subgroup2DBlockTransformINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Subgroup2DBlockTransformINTEL",
-        .dependencies = featureSet(&[_]Feature{
-            .Subgroup2DBlockIOINTEL,
-        }),
-    };
-    result[@intFromEnum(Feature.Subgroup2DBlockTransposeINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability Subgroup2DBlockTransposeINTEL",
-        .dependencies = featureSet(&[_]Feature{
-            .Subgroup2DBlockIOINTEL,
-        }),
-    };
-    result[@intFromEnum(Feature.SubgroupMatrixMultiplyAccumulateINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability SubgroupMatrixMultiplyAccumulateINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.GroupUniformArithmeticKHR)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability GroupUniformArithmeticKHR",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.MaskedGatherScatterINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability MaskedGatherScatterINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.CacheControlsINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability CacheControlsINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
-    };
-    result[@intFromEnum(Feature.RegisterLimitsINTEL)] = .{
-        .llvm_name = null,
-        .description = "Enable SPIR-V capability RegisterLimitsINTEL",
-        .dependencies = featureSet(&[_]Feature{}),
+        .dependencies = featureSet(&[_]Feature{ .v1_0, .matrix }),
     };
     const ti = @typeInfo(Feature);
     for (&result, 0..) |*elem, i| {
@@ -2830,24 +141,12 @@ pub const cpu = struct {
     pub const vulkan_v1_2: CpuModel = .{
         .name = "vulkan_v1_2",
         .llvm_name = null,
-        .features = featureSet(&[_]Feature{
-            .v1_5,
-            .Shader,
-            .PhysicalStorageBufferAddresses,
-            .VariablePointers,
-            .VariablePointersStorageBuffer,
-            .SPV_KHR_physical_storage_buffer,
-        }),
+        .features = featureSet(&[_]Feature{ .v1_5, .shader, .addresses }),
     };
 
     pub const opencl_v2: CpuModel = .{
         .name = "opencl_v2",
         .llvm_name = null,
-        .features = featureSet(&[_]Feature{
-            .v1_2,
-            .Kernel,
-            .Addresses,
-            .GenericPointer,
-        }),
+        .features = featureSet(&[_]Feature{ .v1_2, .kernel, .addresses, .generic_pointer }),
     };
 };
lib/std/Target.zig
@@ -1184,7 +1184,7 @@ pub const Cpu = struct {
         pub const Set = struct {
             ints: [usize_count]usize,
 
-            pub const needed_bit_count = 398;
+            pub const needed_bit_count = 288;
             pub const byte_count = (needed_bit_count + 7) / 8;
             pub const usize_count = (byte_count + (@sizeOf(usize) - 1)) / @sizeOf(usize);
             pub const Index = std.math.Log2Int(std.meta.Int(.unsigned, usize_count * @bitSizeOf(usize)));
src/codegen/spirv/Assembler.zig
@@ -274,6 +274,16 @@ fn processInstruction(self: *Assembler) !void {
         .OpEntryPoint => {
             return self.fail(0, "cannot export entry points via OpEntryPoint, export the kernel using callconv(.Kernel)", .{});
         },
+        .OpCapability => {
+            try self.spv.addCapability(@enumFromInt(self.inst.operands.items[0].value));
+            return;
+        },
+        .OpExtension => {
+            const ext_name_offset = self.inst.operands.items[0].string;
+            const ext_name = std.mem.sliceTo(self.inst.string_bytes.items[ext_name_offset..], 0);
+            try self.spv.addExtension(ext_name);
+            return;
+        },
         .OpExtInstImport => blk: {
             const set_name_offset = self.inst.operands.items[1].string;
             const set_name = std.mem.sliceTo(self.inst.string_bytes.items[set_name_offset..], 0);
src/codegen/spirv/Module.zig
@@ -183,8 +183,11 @@ cache: struct {
     array_types: std.AutoHashMapUnmanaged(struct { IdRef, IdRef }, IdRef) = .empty,
     function_types: DeepHashMap(struct { IdRef, []const IdRef }, IdRef) = .empty,
 
-    builtins: std.AutoHashMapUnmanaged(struct { IdRef, spec.BuiltIn }, Decl.Index) = .empty,
+    capabilities: std.AutoHashMapUnmanaged(spec.Capability, void) = .empty,
+    extensions: std.StringHashMapUnmanaged(void) = .empty,
+    extended_instruction_set: std.AutoHashMapUnmanaged(spec.InstructionSet, IdRef) = .empty,
     decorations: std.AutoHashMapUnmanaged(struct { IdRef, spec.Decoration }, void) = .empty,
+    builtins: std.AutoHashMapUnmanaged(struct { IdRef, spec.BuiltIn }, Decl.Index) = .empty,
 
     bool_const: [2]?IdRef = .{ null, null },
 } = .{},
@@ -199,9 +202,6 @@ decl_deps: std.ArrayListUnmanaged(Decl.Index) = .empty,
 /// The list of entry points that should be exported from this module.
 entry_points: std.ArrayListUnmanaged(EntryPoint) = .empty,
 
-/// The list of extended instruction sets that should be imported.
-extended_instruction_set: std.AutoHashMapUnmanaged(spec.InstructionSet, IdRef) = .empty,
-
 pub fn init(gpa: Allocator, target: std.Target) Module {
     const version_minor: u8 = blk: {
         // Prefer higher versions
@@ -242,15 +242,16 @@ pub fn deinit(self: *Module) void {
     self.cache.vector_types.deinit(self.gpa);
     self.cache.array_types.deinit(self.gpa);
     self.cache.function_types.deinit(self.gpa);
-    self.cache.builtins.deinit(self.gpa);
+    self.cache.capabilities.deinit(self.gpa);
+    self.cache.extensions.deinit(self.gpa);
+    self.cache.extended_instruction_set.deinit(self.gpa);
     self.cache.decorations.deinit(self.gpa);
+    self.cache.builtins.deinit(self.gpa);
 
     self.decls.deinit(self.gpa);
     self.decl_deps.deinit(self.gpa);
-
     self.entry_points.deinit(self.gpa);
 
-    self.extended_instruction_set.deinit(self.gpa);
     self.arena.deinit();
 
     self.* = undefined;
@@ -339,9 +340,61 @@ fn entryPoints(self: *Module) !Section {
 }
 
 pub fn finalize(self: *Module, a: Allocator) ![]Word {
+    // Emit capabilities and extensions
+    for (std.Target.spirv.all_features) |feature| {
+        if (self.target.cpu.features.isEnabled(feature.index)) {
+            const feature_tag: std.Target.spirv.Feature = @enumFromInt(feature.index);
+            switch (feature_tag) {
+                .v1_0, .v1_1, .v1_2, .v1_3, .v1_4, .v1_5, .v1_6 => {},
+                .int8 => try self.addCapability(.Int8),
+                .int16 => try self.addCapability(.Int16),
+                .int64 => try self.addCapability(.Int64),
+                .float16 => try self.addCapability(.Float16),
+                .float64 => try self.addCapability(.Float64),
+                .addresses => if (self.hasFeature(.shader)) {
+                    try self.addCapability(.PhysicalStorageBufferAddresses);
+                    try self.addExtension("SPV_KHR_physical_storage_buffer");
+                } else {
+                    try self.addCapability(.Addresses);
+                },
+                .matrix => try self.addCapability(.Matrix),
+                .kernel => try self.addCapability(.Kernel),
+                .generic_pointer => try self.addCapability(.GenericPointer),
+                .vector16 => try self.addCapability(.Vector16),
+                .shader => try self.addCapability(.Shader),
+            }
+        }
+    }
+
+    // Emit memory model
+    const addressing_model: spec.AddressingModel = blk: {
+        if (self.hasFeature(.shader)) {
+            break :blk switch (self.target.cpu.arch) {
+                .spirv32 => .Logical, // TODO: I don't think this will ever be implemented.
+                .spirv64 => .PhysicalStorageBuffer64,
+                else => unreachable,
+            };
+        } else if (self.hasFeature(.kernel)) {
+            break :blk switch (self.target.cpu.arch) {
+                .spirv32 => .Physical32,
+                .spirv64 => .Physical64,
+                else => unreachable,
+            };
+        }
+
+        unreachable;
+    };
+    try self.sections.memory_model.emit(self.gpa, .OpMemoryModel, .{
+        .addressing_model = addressing_model,
+        .memory_model = switch (self.target.os.tag) {
+            .opencl => .OpenCL,
+            .vulkan, .opengl => .GLSL450,
+            else => unreachable,
+        },
+    });
+
     // See SPIR-V Spec section 2.3, "Physical Layout of a SPIR-V Module and Instruction"
     // TODO: Audit calls to allocId() in this function to make it idempotent.
-
     var entry_points = try self.entryPoints();
     defer entry_points.deinit(self.gpa);
 
@@ -405,11 +458,23 @@ pub fn addFunction(self: *Module, decl_index: Decl.Index, func: Fn) !void {
     try self.declareDeclDeps(decl_index, func.decl_deps.keys());
 }
 
+pub fn addCapability(self: *Module, cap: spec.Capability) !void {
+    const entry = try self.cache.capabilities.getOrPut(self.gpa, cap);
+    if (entry.found_existing) return;
+    try self.sections.capabilities.emit(self.gpa, .OpCapability, .{ .capability = cap });
+}
+
+pub fn addExtension(self: *Module, ext: []const u8) !void {
+    const entry = try self.cache.extensions.getOrPut(self.gpa, ext);
+    if (entry.found_existing) return;
+    try self.sections.extensions.emit(self.gpa, .OpExtension, .{ .name = ext });
+}
+
 /// Imports or returns the existing id of an extended instruction set
 pub fn importInstructionSet(self: *Module, set: spec.InstructionSet) !IdRef {
     assert(set != .core);
 
-    const gop = try self.extended_instruction_set.getOrPut(self.gpa, set);
+    const gop = try self.cache.extended_instruction_set.getOrPut(self.gpa, set);
     if (gop.found_existing) return gop.value_ptr.*;
 
     const result_id = self.allocId();
src/codegen/spirv.zig
@@ -552,7 +552,7 @@ const NavGen = struct {
     }
 
     fn castToGeneric(self: *NavGen, type_id: IdRef, ptr_id: IdRef) !IdRef {
-        if (self.spv.hasFeature(.Kernel)) {
+        if (self.spv.hasFeature(.kernel)) {
             const result_id = self.spv.allocId();
             try self.func.body.emit(self.spv.gpa, .OpPtrCastToGeneric, .{
                 .id_result_type = type_id,
@@ -591,10 +591,10 @@ const NavGen = struct {
         // 8, 16 and 64-bit integers require the Int8, Int16 and Inr64 capabilities respectively.
         // 32-bit integers are always supported (see spec, 2.16.1, Data rules).
         const ints = [_]struct { bits: u16, feature: ?Target.spirv.Feature }{
-            .{ .bits = 8, .feature = .Int8 },
-            .{ .bits = 16, .feature = .Int16 },
+            .{ .bits = 8, .feature = .int8 },
+            .{ .bits = 16, .feature = .int16 },
             .{ .bits = 32, .feature = null },
-            .{ .bits = 64, .feature = .Int64 },
+            .{ .bits = 64, .feature = .int64 },
         };
 
         for (ints) |int| {
@@ -612,7 +612,7 @@ const NavGen = struct {
     /// is no way of knowing whether those are actually supported.
     /// TODO: Maybe this should be cached?
     fn largestSupportedIntBits(self: *NavGen) u16 {
-        return if (self.spv.hasFeature(.Int64)) 64 else 32;
+        return if (self.spv.hasFeature(.int64)) 64 else 32;
     }
 
     /// Checks whether the type is "composite int", an integer consisting of multiple native integers. These are represented by
@@ -644,7 +644,7 @@ const NavGen = struct {
 
         if (elem_ty.isNumeric(zcu) or elem_ty.toIntern() == .bool_type) {
             if (len > 1 and len <= 4) return true;
-            if (self.spv.hasFeature(.Vector16)) return (len == 8 or len == 16);
+            if (self.spv.hasFeature(.vector16)) return (len == 8 or len == 16);
         }
 
         return false;
@@ -1241,7 +1241,7 @@ const NavGen = struct {
         };
 
         // Kernel only supports unsigned ints.
-        if (self.spv.hasFeature(.Kernel)) {
+        if (self.spv.hasFeature(.kernel)) {
             return self.spv.intType(.unsigned, backing_bits);
         }
 
@@ -1465,10 +1465,10 @@ const NavGen = struct {
                 // so if the float is not supported, just return an error.
                 const bits = ty.floatBits(target);
                 const supported = switch (bits) {
-                    16 => Target.spirv.featureSetHas(target.cpu.features, .Float16),
+                    16 => self.spv.hasFeature(.float16),
                     // 32-bit floats are always supported (see spec, 2.16.1, Data rules).
                     32 => true,
-                    64 => Target.spirv.featureSetHas(target.cpu.features, .Float64),
+                    64 => self.spv.hasFeature(.float64),
                     else => false,
                 };
 
@@ -1511,7 +1511,7 @@ const NavGen = struct {
                     return try self.arrayType(1, elem_ty_id);
                 } else {
                     const result_id = try self.arrayType(total_len, elem_ty_id);
-                    if (self.spv.hasFeature(.Shader)) {
+                    if (self.spv.hasFeature(.shader)) {
                         try self.spv.decorate(result_id, .{ .ArrayStride = .{
                             .array_stride = @intCast(elem_ty.abiSize(zcu)),
                         } });
@@ -1645,7 +1645,7 @@ const NavGen = struct {
                         continue;
                     }
 
-                    if (self.spv.hasFeature(.Shader)) {
+                    if (self.spv.hasFeature(.shader)) {
                         try self.spv.decorateMember(result_id, index, .{ .Offset = .{
                             .byte_offset = @intCast(ty.structFieldOffset(field_index, zcu)),
                         } });
@@ -1748,10 +1748,10 @@ const NavGen = struct {
 
     fn spvStorageClass(self: *NavGen, as: std.builtin.AddressSpace) StorageClass {
         return switch (as) {
-            .generic => if (self.spv.hasFeature(.GenericPointer)) .Generic else .Function,
+            .generic => if (self.spv.hasFeature(.generic_pointer)) .Generic else .Function,
             .shared => .Workgroup,
             .local => .Function,
-            .global => if (self.spv.hasFeature(.Shader)) .PhysicalStorageBuffer else .CrossWorkgroup,
+            .global => if (self.spv.hasFeature(.shader)) .PhysicalStorageBuffer else .CrossWorkgroup,
             .constant => .UniformConstant,
             .push_constant => .PushConstant,
             .input => .Input,
@@ -2461,7 +2461,7 @@ const NavGen = struct {
                 // TODO: These instructions don't seem to be working
                 // properly for LLVM-based backends on OpenCL for 8- and
                 // 16-component vectors.
-                .i_abs => if (self.spv.hasFeature(.Vector16) and v.components() >= 8) v.unroll() else v,
+                .i_abs => if (self.spv.hasFeature(.vector16) and v.components() >= 8) v.unroll() else v,
                 else => v,
             };
         };
@@ -3650,7 +3650,7 @@ const NavGen = struct {
                 // depending on the result type. Do that when
                 // bitCast is implemented for vectors.
                 // This is only relevant for Vulkan
-                assert(self.spv.hasFeature(.Kernel)); // TODO
+                assert(self.spv.hasFeature(.kernel)); // TODO
 
                 return try self.normalize(abs_value, self.arithmeticTypeInfo(result_ty));
             },
@@ -3968,7 +3968,7 @@ const NavGen = struct {
             .float, .bool => unreachable,
         }
 
-        assert(self.spv.hasFeature(.Kernel)); // TODO
+        assert(self.spv.hasFeature(.kernel)); // TODO
 
         const count = try self.buildUnary(op, operand);
 
@@ -4204,7 +4204,7 @@ const NavGen = struct {
         defer self.gpa.free(ids);
 
         const result_id = self.spv.allocId();
-        if (self.spv.hasFeature(.Kernel)) {
+        if (self.spv.hasFeature(.kernel)) {
             try self.func.body.emit(self.spv.gpa, .OpInBoundsPtrAccessChain, .{
                 .id_result_type = result_ty_id,
                 .id_result = result_id,
@@ -5290,7 +5290,7 @@ const NavGen = struct {
             .initializer = options.initializer,
         });
 
-        if (self.spv.hasFeature(.Shader)) return var_id;
+        if (self.spv.hasFeature(.shader)) return var_id;
 
         switch (options.storage_class) {
             .Generic => {
src/link/SpirV.zig
@@ -232,13 +232,9 @@ pub fn flushModule(
     const diags = &comp.link_diags;
     const gpa = comp.gpa;
 
-    try writeCapabilities(spv);
-    try writeMemoryModel(spv);
-
     // We need to export the list of error names somewhere so that we can pretty-print them in the
     // executor. This is not really an important thing though, so we can just dump it in any old
     // nonsemantic instruction. For now, just put it in OpSourceExtension with a special name.
-
     var error_info = std.ArrayList(u8).init(self.object.gpa);
     defer error_info.deinit();
 
@@ -297,65 +293,3 @@ fn linkModule(self: *SpirV, a: Allocator, module: []Word, progress: std.Progress
 
     return binary.finalize(a);
 }
-
-fn writeCapabilities(spv: *SpvModule) !void {
-    var caps: std.ArrayList(spec.Capability) = .init(spv.gpa);
-    var extensions: std.ArrayList([]const u8) = .init(spv.gpa);
-    defer {
-        caps.deinit();
-        extensions.deinit();
-    }
-
-    // Currently all spirv target features name are mapped to a Capability or an Extension.
-    // Except for versions which we ignore.
-    for (std.Target.spirv.all_features, 0..) |_, i| {
-        if (spv.target.cpu.features.isEnabled(@intCast(i))) {
-            const feature: std.Target.spirv.Feature = @enumFromInt(i);
-            const name = @tagName(feature);
-            if (std.meta.stringToEnum(spec.Capability, name)) |cap| {
-                try caps.append(cap);
-            } else if (std.mem.startsWith(u8, name, "SPV_")) {
-                try extensions.append(name);
-            }
-        }
-    }
-
-    for (caps.items) |cap| {
-        try spv.sections.capabilities.emit(spv.gpa, .OpCapability, .{
-            .capability = cap,
-        });
-    }
-
-    for (extensions.items) |ext| {
-        try spv.sections.extensions.emit(spv.gpa, .OpExtension, .{ .name = ext });
-    }
-}
-
-fn writeMemoryModel(spv: *SpvModule) !void {
-    const addressing_model: spec.AddressingModel = blk: {
-        if (spv.hasFeature(.Shader)) {
-            break :blk switch (spv.target.cpu.arch) {
-                .spirv32 => .Logical, // TODO: I don't think this will ever be implemented.
-                .spirv64 => .PhysicalStorageBuffer64,
-                else => unreachable,
-            };
-        } else if (spv.hasFeature(.Kernel)) {
-            break :blk switch (spv.target.cpu.arch) {
-                .spirv32 => .Physical32,
-                .spirv64 => .Physical64,
-                else => unreachable,
-            };
-        }
-
-        unreachable;
-    };
-    const memory_model: spec.MemoryModel = switch (spv.target.os.tag) {
-        .opencl => .OpenCL,
-        .vulkan, .opengl => .GLSL450,
-        else => unreachable,
-    };
-    try spv.sections.memory_model.emit(spv.gpa, .OpMemoryModel, .{
-        .addressing_model = addressing_model,
-        .memory_model = memory_model,
-    });
-}
test/standalone/build.zig
@@ -43,7 +43,6 @@ pub fn build(b: *std.Build) void {
         "../../tools/update_clang_options.zig",
         "../../tools/update_cpu_features.zig",
         "../../tools/update_glibc.zig",
-        "../../tools/update_spirv_features.zig",
     }) |tool_src_path| {
         const tool = b.addTest(.{
             .name = std.fs.path.stem(tool_src_path),
tools/update_cpu_features.zig
@@ -1072,13 +1072,6 @@ const targets = [_]ArchTarget{
             .td_name = "Sparc",
         },
     },
-    // TODO: merge tools/update_spirv_features.zig into this script
-    //.{
-    //    .zig_name = "spirv",
-    //    .llvm = .{
-    //        .name = "SPIRV",
-    //    },
-    //},
     .{
         .zig_name = "s390x",
         .llvm = .{
tools/update_spirv_features.zig
@@ -1,361 +0,0 @@
-//! This tool generates SPIR-V features from the grammar files in the SPIRV-Headers
-//! (https://github.com/KhronosGroup/SPIRV-Headers/) and SPIRV-Registry (https://github.com/KhronosGroup/SPIRV-Registry/)
-//! repositories. Currently it only generates a basic feature set definition consisting of versions, extensions and capabilities.
-//! There is a lot left to be desired, as currently dependencies of extensions and dependencies on extensions aren't generated.
-//! This is because there are some peculiarities in the SPIR-V registries:
-//! - Capabilities may depend on multiple extensions, which cannot be modelled yet by std.Target.
-//! - Extension dependencies are not documented in a machine-readable manner.
-//! - Note that the grammar spec also contains definitions from extensions which aren't actually official. Most of these seem to be
-//!   from an intel project (https://github.com/intel/llvm/, https://github.com/intel/llvm/tree/sycl/sycl/doc/extensions/SPIRV),
-//!   and so ONLY extensions in the SPIRV-Registry should be included.
-
-const std = @import("std");
-const fs = std.fs;
-const Allocator = std.mem.Allocator;
-const g = @import("spirv/grammar.zig");
-
-const Version = struct {
-    major: u32,
-    minor: u32,
-
-    fn parse(str: []const u8) !Version {
-        var it = std.mem.splitScalar(u8, str, '.');
-
-        const major = it.first();
-        const minor = it.next() orelse return error.InvalidVersion;
-
-        if (it.next() != null) return error.InvalidVersion;
-
-        return Version{
-            .major = std.fmt.parseInt(u32, major, 10) catch return error.InvalidVersion,
-            .minor = std.fmt.parseInt(u32, minor, 10) catch return error.InvalidVersion,
-        };
-    }
-
-    fn eql(a: Version, b: Version) bool {
-        return a.major == b.major and a.minor == b.minor;
-    }
-
-    fn lessThan(ctx: void, a: Version, b: Version) bool {
-        _ = ctx;
-        return if (a.major == b.major)
-            a.minor < b.minor
-        else
-            a.major < b.major;
-    }
-};
-
-pub fn main() !void {
-    var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
-    defer arena.deinit();
-    const allocator = arena.allocator();
-
-    const args = try std.process.argsAlloc(allocator);
-
-    if (args.len <= 1) {
-        usageAndExit(std.io.getStdErr(), args[0], 1);
-    }
-    if (std.mem.eql(u8, args[1], "--help")) {
-        usageAndExit(std.io.getStdErr(), args[0], 0);
-    }
-    if (args.len != 3) {
-        usageAndExit(std.io.getStdErr(), args[0], 1);
-    }
-
-    const spirv_headers_root = args[1];
-    const spirv_registry_root = args[2];
-
-    if (std.mem.startsWith(u8, spirv_headers_root, "-") or std.mem.startsWith(u8, spirv_registry_root, "-")) {
-        usageAndExit(std.io.getStdErr(), args[0], 1);
-    }
-
-    // Required for json parsing.
-    @setEvalBranchQuota(10000);
-
-    const registry_path = try fs.path.join(allocator, &.{ spirv_headers_root, "include", "spirv", "unified1", "spirv.core.grammar.json" });
-    const registry_json = try std.fs.cwd().readFileAlloc(allocator, registry_path, std.math.maxInt(usize));
-    var scanner = std.json.Scanner.initCompleteInput(allocator, registry_json);
-    var diagnostics = std.json.Diagnostics{};
-    scanner.enableDiagnostics(&diagnostics);
-    const registry = std.json.parseFromTokenSourceLeaky(g.CoreRegistry, allocator, &scanner, .{ .ignore_unknown_fields = true }) catch |err| {
-        std.debug.print("line,col: {},{}\n", .{ diagnostics.getLine(), diagnostics.getColumn() });
-        return err;
-    };
-
-    const capabilities = for (registry.operand_kinds) |opkind| {
-        if (std.mem.eql(u8, opkind.kind, "Capability"))
-            break opkind.enumerants orelse return error.InvalidRegistry;
-    } else return error.InvalidRegistry;
-
-    const extensions = try gather_extensions(allocator, spirv_registry_root);
-    const versions = try gatherVersions(allocator, registry);
-
-    var bw = std.io.bufferedWriter(std.io.getStdOut().writer());
-    const w = bw.writer();
-
-    try w.writeAll(
-        \\//! This file is auto-generated by tools/update_spirv_features.zig.
-        \\//! TODO: Dependencies of capabilities on extensions.
-        \\//! TODO: Dependencies of extensions on extensions.
-        \\//! TODO: Dependencies of extensions on versions.
-        \\
-        \\const std = @import("../std.zig");
-        \\const CpuFeature = std.Target.Cpu.Feature;
-        \\const CpuModel = std.Target.Cpu.Model;
-        \\
-        \\pub const Feature = enum {
-        \\
-    );
-
-    for (versions) |ver| {
-        try w.print("    v{}_{},\n", .{ ver.major, ver.minor });
-    }
-
-    for (extensions) |ext| {
-        try w.print("    {p},\n", .{std.zig.fmtId(ext)});
-    }
-
-    for (capabilities) |cap| {
-        try w.print("    {p},\n", .{std.zig.fmtId(cap.enumerant)});
-    }
-
-    try w.writeAll(
-        \\};
-        \\
-        \\pub const featureSet = CpuFeature.FeatureSetFns(Feature).featureSet;
-        \\pub const featureSetHas = CpuFeature.FeatureSetFns(Feature).featureSetHas;
-        \\pub const featureSetHasAny = CpuFeature.FeatureSetFns(Feature).featureSetHasAny;
-        \\pub const featureSetHasAll = CpuFeature.FeatureSetFns(Feature).featureSetHasAll;
-        \\
-        \\pub const all_features = blk: {
-        \\    @setEvalBranchQuota(2000);
-        \\    const len = @typeInfo(Feature).@"enum".fields.len;
-        \\    std.debug.assert(len <= CpuFeature.Set.needed_bit_count);
-        \\    var result: [len]CpuFeature = undefined;
-        \\
-    );
-
-    for (versions, 0..) |ver, i| {
-        try w.print(
-            \\    result[@intFromEnum(Feature.v{0}_{1})] = .{{
-            \\        .llvm_name = null,
-            \\        .description = "SPIR-V version {0}.{1}",
-            \\
-        , .{ ver.major, ver.minor });
-
-        if (i == 0) {
-            try w.writeAll(
-                \\        .dependencies = featureSet(&[_]Feature{}),
-                \\    };
-                \\
-            );
-        } else {
-            try w.print(
-                \\        .dependencies = featureSet(&[_]Feature{{
-                \\            .v{}_{},
-                \\        }}),
-                \\    }};
-                \\
-            , .{ versions[i - 1].major, versions[i - 1].minor });
-        }
-    }
-
-    // TODO: Extension dependencies.
-    for (extensions) |ext| {
-        try w.print(
-            \\    result[@intFromEnum(Feature.{p_})] = .{{
-            \\        .llvm_name = null,
-            \\        .description = "SPIR-V extension {s}",
-            \\        .dependencies = featureSet(&[_]Feature{{}}),
-            \\    }};
-            \\
-        , .{
-            std.zig.fmtId(ext),
-            ext,
-        });
-    }
-
-    // TODO: Capability extension dependencies.
-    for (capabilities) |cap| {
-        try w.print(
-            \\    result[@intFromEnum(Feature.{p_})] = .{{
-            \\        .llvm_name = null,
-            \\        .description = "Enable SPIR-V capability {s}",
-            \\        .dependencies = featureSet(&[_]Feature{{
-            \\
-        , .{
-            std.zig.fmtId(cap.enumerant),
-            cap.enumerant,
-        });
-
-        if (cap.version) |ver_str| blk: {
-            if (std.mem.eql(u8, ver_str, "None")) break :blk;
-
-            const ver = try Version.parse(ver_str);
-            try w.print("            .v{}_{},\n", .{ ver.major, ver.minor });
-        }
-
-        for (cap.capabilities) |cap_dep| {
-            try w.print("            .{p_},\n", .{std.zig.fmtId(cap_dep)});
-        }
-
-        try w.writeAll(
-            \\        }),
-            \\    };
-            \\
-        );
-    }
-
-    try w.writeAll(
-        \\    const ti = @typeInfo(Feature);
-        \\    for (&result, 0..) |*elem, i| {
-        \\        elem.index = i;
-        \\        elem.name = ti.@"enum".fields[i].name;
-        \\    }
-        \\    break :blk result;
-        \\};
-        \\
-        \\pub const cpu = struct {
-        \\    pub const generic: CpuModel = .{
-        \\        .name = "generic",
-        \\        .llvm_name = "generic",
-        \\        .features = featureSet(&[_]Feature{ .v1_0 }),
-        \\    };
-        \\
-        \\    pub const vulkan_v1_2: CpuModel = .{
-        \\        .name = "vulkan_v1_2",
-        \\        .llvm_name = null,
-        \\        .features = featureSet(&[_]Feature{
-        \\            .v1_5,
-        \\            .Shader,
-        \\            .PhysicalStorageBufferAddresses,
-        \\            .VariablePointers,
-        \\            .VariablePointersStorageBuffer,
-        \\            .SPV_KHR_physical_storage_buffer,
-        \\        }),
-        \\    };
-        \\
-        \\    pub const opencl_v2: CpuModel = .{
-        \\        .name = "opencl_v2",
-        \\        .llvm_name = null,
-        \\        .features = featureSet(&[_]Feature{
-        \\            .v1_2,
-        \\            .Kernel,
-        \\            .Addresses,
-        \\            .GenericPointer,
-        \\        }),
-        \\    };
-        \\};
-    );
-
-    try bw.flush();
-}
-
-/// SPIRV-Registry should hold all extensions currently registered for SPIR-V.
-/// The *.grammar.json in SPIRV-Headers should have most of these as well, but with this we're sure to get only the actually
-/// registered ones.
-/// TODO: Unfortunately, neither repository contains a machine-readable list of extension dependencies.
-fn gather_extensions(allocator: Allocator, spirv_registry_root: []const u8) ![]const []const u8 {
-    const extensions_path = try fs.path.join(allocator, &.{ spirv_registry_root, "extensions" });
-    var extensions_dir = try fs.cwd().openDir(extensions_path, .{ .iterate = true });
-    defer extensions_dir.close();
-
-    var extensions = std.ArrayList([]const u8).init(allocator);
-
-    var vendor_it = extensions_dir.iterate();
-    while (try vendor_it.next()) |vendor_entry| {
-        std.debug.assert(vendor_entry.kind == .directory); // If this fails, the structure of SPIRV-Registry has changed.
-
-        const vendor_dir = try extensions_dir.openDir(vendor_entry.name, .{ .iterate = true });
-        var ext_it = vendor_dir.iterate();
-        while (try ext_it.next()) |ext_entry| {
-            // There is both a HTML and asciidoc version of every spec (as well as some other directories),
-            // we need just the name, but to avoid duplicates here we will just skip anything thats not asciidoc.
-            if (!std.mem.endsWith(u8, ext_entry.name, ".asciidoc"))
-                continue;
-
-            // Unfortunately, some extension filenames are incorrect, so we need to look for the string in the 'Name Strings' section.
-            // This has the following format:
-            // ```
-            // Name Strings
-            // ------------
-            //
-            // SPV_EXT_name
-            // ```
-            // OR
-            // ```
-            // == Name Strings
-            //
-            // SPV_EXT_name
-            // ```
-
-            const ext_spec = try vendor_dir.readFileAlloc(allocator, ext_entry.name, std.math.maxInt(usize));
-            const name_strings = "Name Strings";
-
-            const name_strings_offset = std.mem.indexOf(u8, ext_spec, name_strings) orelse return error.InvalidRegistry;
-
-            // As the specs are inconsistent on this next part, just skip any newlines/minuses
-            var ext_start = name_strings_offset + name_strings.len + 1;
-            while (std.ascii.isWhitespace(ext_spec[ext_start]) or ext_spec[ext_start] == '-') {
-                ext_start += 1;
-            }
-
-            const ext_end = std.mem.indexOfScalarPos(u8, ext_spec, ext_start, '\n') orelse return error.InvalidRegistry;
-            const ext = std.mem.trim(u8, ext_spec[ext_start..ext_end], &std.ascii.whitespace);
-
-            // Ignore invalid/incomplete extensions
-            if (std.mem.eql(u8, ext, "{extension_name}")) continue;
-
-            std.debug.assert(std.mem.startsWith(u8, ext, "SPV_")); // Sanity check, all extensions should have a name like SPV_VENDOR_extension.
-
-            try extensions.append(try allocator.dupe(u8, ext));
-        }
-    }
-
-    return extensions.items;
-}
-
-fn insertVersion(versions: *std.ArrayList(Version), version: ?[]const u8) !void {
-    const ver_str = version orelse return;
-    if (std.mem.eql(u8, ver_str, "None")) return;
-
-    const ver = try Version.parse(ver_str);
-    for (versions.items) |existing_ver| {
-        if (ver.eql(existing_ver)) return;
-    }
-
-    try versions.append(ver);
-}
-
-fn gatherVersions(allocator: Allocator, registry: g.CoreRegistry) ![]const Version {
-    // Expected number of versions is small
-    var versions = std.ArrayList(Version).init(allocator);
-
-    for (registry.instructions) |inst| {
-        try insertVersion(&versions, inst.version);
-    }
-
-    for (registry.operand_kinds) |opkind| {
-        const enumerants = opkind.enumerants orelse continue;
-        for (enumerants) |enumerant| {
-            try insertVersion(&versions, enumerant.version);
-        }
-    }
-
-    std.mem.sort(Version, versions.items, {}, Version.lessThan);
-
-    return versions.items;
-}
-
-fn usageAndExit(file: fs.File, arg0: []const u8, code: u8) noreturn {
-    file.writer().print(
-        \\Usage: {s} /path/git/SPIRV-Headers /path/git/SPIRV-Registry
-        \\
-        \\Prints to stdout Zig code which can be used to replace the file lib/std/target/spirv.zig.
-        \\
-        \\SPIRV-Headers can be cloned from https://github.com/KhronosGroup/SPIRV-Headers,
-        \\SPIRV-Registry can be cloned from https://github.com/KhronosGroup/SPIRV-Registry.
-        \\
-    , .{arg0}) catch std.process.exit(1);
-    std.process.exit(code);
-}