authorgravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2025-02-15 00:08:05+03:30
committergravatar for alichraghi@proton.meAli Chraghi <alichraghi@proton.me> 2025-02-18 18:08:47+03:30
logd5e1cb3ea2cdd85bc2a9ca002d69d121a94f721c
tree3dbfebe63a8723c3f761fdb297434d60d05e4354
parent85169bbba24d7e7592a24de5af6743b34bfe5961
signaturelock-open Commit is signed but in an unrecognized format.

spirv: ziggify and remove unknown spirv features

`OpCapability` and `OpExtension` now can also be emitted from inline assembly

9 files changed, 154 insertions(+), 3215 deletions(-)

lib/std/Target.zig+1-1
...@@ -1184,7 +1184,7 @@ pub const Cpu = struct {...@@ -1184,7 +1184,7 @@ pub const Cpu = struct {
1184 pub const Set = struct {1184 pub const Set = struct {
1185 ints: [usize_count]usize,1185 ints: [usize_count]usize,
11861186
1187 pub const needed_bit_count = 398;1187 pub const needed_bit_count = 288;
1188 pub const byte_count = (needed_bit_count + 7) / 8;1188 pub const byte_count = (needed_bit_count + 7) / 8;
1189 pub const usize_count = (byte_count + (@sizeOf(usize) - 1)) / @sizeOf(usize);1189 pub const usize_count = (byte_count + (@sizeOf(usize) - 1)) / @sizeOf(usize);
1190 pub const Index = std.math.Log2Int(std.meta.Int(.unsigned, usize_count * @bitSizeOf(usize)));1190 pub const Index = std.math.Log2Int(std.meta.Int(.unsigned, usize_count * @bitSizeOf(usize)));
lib/std/Target/spirv.zig+51-2752
...@@ -1,8 +1,3 @@...@@ -1,8 +1,3 @@
1//! This file is auto-generated by tools/update_spirv_features.zig.
2//! TODO: Dependencies of capabilities on extensions.
3//! TODO: Dependencies of extensions on extensions.
4//! TODO: Dependencies of extensions on versions.
5
6const std = @import("../std.zig");1const std = @import("../std.zig");
7const CpuFeature = std.Target.Cpu.Feature;2const CpuFeature = std.Target.Cpu.Feature;
8const CpuModel = std.Target.Cpu.Model;3const CpuModel = std.Target.Cpu.Model;
...@@ -15,397 +10,17 @@ pub const Feature = enum {...@@ -15,397 +10,17 @@ pub const Feature = enum {
15 v1_4,10 v1_4,
16 v1_5,11 v1_5,
17 v1_6,12 v1_6,
18 SPV_AMDX_shader_enqueue,13 int8,
19 SPV_AMD_gcn_shader,14 int16,
20 SPV_AMD_gpu_shader_half_float,15 int64,
21 SPV_AMD_gpu_shader_half_float_fetch,16 float16,
22 SPV_AMD_gpu_shader_int16,17 float64,
23 SPV_AMD_shader_ballot,18 addresses,
24 SPV_AMD_shader_early_and_late_fragment_tests,19 matrix,
25 SPV_AMD_shader_explicit_vertex_parameter,20 kernel,
26 SPV_AMD_shader_fragment_mask,21 generic_pointer,
27 SPV_AMD_shader_image_load_store_lod,22 vector16,
28 SPV_AMD_shader_trinary_minmax,23 shader,
29 SPV_AMD_texture_gather_bias_lod,
30 SPV_ARM_cooperative_matrix_layouts,
31 SPV_ARM_core_builtins,
32 SPV_EXT_arithmetic_fence,
33 SPV_EXT_demote_to_helper_invocation,
34 SPV_EXT_descriptor_indexing,
35 SPV_EXT_fragment_fully_covered,
36 SPV_EXT_fragment_invocation_density,
37 SPV_EXT_fragment_shader_interlock,
38 SPV_EXT_image_raw10_raw12,
39 SPV_EXT_mesh_shader,
40 SPV_EXT_opacity_micromap,
41 SPV_EXT_optnone,
42 SPV_EXT_physical_storage_buffer,
43 SPV_EXT_replicated_composites,
44 SPV_EXT_shader_atomic_float16_add,
45 SPV_EXT_shader_atomic_float_add,
46 SPV_EXT_shader_atomic_float_min_max,
47 SPV_EXT_shader_image_int64,
48 SPV_EXT_shader_stencil_export,
49 SPV_EXT_shader_tile_image,
50 SPV_EXT_shader_viewport_index_layer,
51 SPV_EXT_ycbcr_attachments,
52 SPV_GOOGLE_decorate_string,
53 SPV_GOOGLE_hlsl_functionality1,
54 SPV_GOOGLE_user_type,
55 SPV_HUAWEI_cluster_culling_shader,
56 SPV_HUAWEI_subpass_shading,
57 SPV_INTEL_arbitrary_precision_fixed_point,
58 SPV_INTEL_arbitrary_precision_floating_point,
59 SPV_INTEL_arbitrary_precision_integers,
60 SPV_INTEL_blocking_pipes,
61 SPV_INTEL_device_side_avc_motion_estimation,
62 SPV_INTEL_fpga_argument_interfaces,
63 SPV_INTEL_fpga_buffer_location,
64 SPV_INTEL_fpga_cluster_attributes,
65 SPV_INTEL_fpga_dsp_control,
66 SPV_INTEL_fpga_invocation_pipelining_attributes,
67 SPV_INTEL_fpga_latency_control,
68 SPV_INTEL_fpga_loop_controls,
69 SPV_INTEL_fpga_memory_accesses,
70 SPV_INTEL_fpga_memory_attributes,
71 SPV_INTEL_fpga_reg,
72 SPV_INTEL_fp_fast_math_mode,
73 SPV_INTEL_fp_max_error,
74 SPV_INTEL_global_variable_fpga_decorations,
75 SPV_INTEL_global_variable_host_access,
76 SPV_INTEL_io_pipes,
77 SPV_INTEL_kernel_attributes,
78 SPV_INTEL_long_composites,
79 SPV_INTEL_loop_fuse,
80 SPV_INTEL_maximum_registers,
81 SPV_INTEL_media_block_io,
82 SPV_INTEL_runtime_aligned,
83 SPV_INTEL_shader_integer_functions2,
84 SPV_INTEL_split_barrier,
85 SPV_INTEL_subgroups,
86 SPV_INTEL_subgroup_buffer_prefetch,
87 SPV_INTEL_task_sequence,
88 SPV_INTEL_unstructured_loop_controls,
89 SPV_INTEL_usm_storage_classes,
90 SPV_KHR_16bit_storage,
91 SPV_KHR_8bit_storage,
92 SPV_KHR_bit_instructions,
93 SPV_KHR_compute_shader_derivatives,
94 SPV_KHR_cooperative_matrix,
95 SPV_KHR_device_group,
96 SPV_KHR_expect_assume,
97 SPV_KHR_float_controls,
98 SPV_KHR_float_controls2,
99 SPV_KHR_fragment_shader_barycentric,
100 SPV_KHR_fragment_shading_rate,
101 SPV_KHR_integer_dot_product,
102 SPV_KHR_linkonce_odr,
103 SPV_KHR_maximal_reconvergence,
104 SPV_KHR_multiview,
105 SPV_KHR_non_semantic_info,
106 SPV_KHR_no_integer_wrap_decoration,
107 SPV_KHR_physical_storage_buffer,
108 SPV_KHR_post_depth_coverage,
109 SPV_KHR_quad_control,
110 SPV_KHR_ray_cull_mask,
111 SPV_KHR_ray_query,
112 SPV_KHR_ray_tracing,
113 SPV_KHR_ray_tracing_position_fetch,
114 SPV_KHR_relaxed_extended_instruction,
115 SPV_KHR_shader_atomic_counter_ops,
116 SPV_KHR_shader_ballot,
117 SPV_KHR_shader_clock,
118 SPV_KHR_shader_draw_parameters,
119 SPV_KHR_storage_buffer_storage_class,
120 SPV_KHR_subgroup_rotate,
121 SPV_KHR_subgroup_uniform_control_flow,
122 SPV_KHR_subgroup_vote,
123 SPV_KHR_terminate_invocation,
124 SPV_KHR_untyped_pointers,
125 SPV_KHR_variable_pointers,
126 SPV_KHR_vulkan_memory_model,
127 SPV_KHR_workgroup_memory_explicit_layout,
128 SPV_NVX_multiview_per_view_attributes,
129 SPV_NV_bindless_texture,
130 SPV_NV_cluster_acceleration_structure,
131 SPV_NV_compute_shader_derivatives,
132 SPV_NV_cooperative_matrix,
133 SPV_NV_cooperative_matrix2,
134 SPV_NV_cooperative_vector,
135 SPV_NV_displacement_micromap,
136 SPV_NV_fragment_shader_barycentric,
137 SPV_NV_geometry_shader_passthrough,
138 SPV_NV_linear_swept_spheres,
139 SPV_NV_mesh_shader,
140 SPV_NV_raw_access_chains,
141 SPV_NV_ray_tracing,
142 SPV_NV_ray_tracing_motion_blur,
143 SPV_NV_sample_mask_override_coverage,
144 SPV_NV_shader_atomic_fp16_vector,
145 SPV_NV_shader_image_footprint,
146 SPV_NV_shader_invocation_reorder,
147 SPV_NV_shader_sm_builtins,
148 SPV_NV_shader_subgroup_partitioned,
149 SPV_NV_shading_rate,
150 SPV_NV_stereo_view_rendering,
151 SPV_NV_tensor_addressing,
152 SPV_NV_viewport_array2,
153 SPV_QCOM_image_processing,
154 SPV_QCOM_image_processing2,
155 Matrix,
156 Shader,
157 Geometry,
158 Tessellation,
159 Addresses,
160 Linkage,
161 Kernel,
162 Vector16,
163 Float16Buffer,
164 Float16,
165 Float64,
166 Int64,
167 Int64Atomics,
168 ImageBasic,
169 ImageReadWrite,
170 ImageMipmap,
171 Pipes,
172 Groups,
173 DeviceEnqueue,
174 LiteralSampler,
175 AtomicStorage,
176 Int16,
177 TessellationPointSize,
178 GeometryPointSize,
179 ImageGatherExtended,
180 StorageImageMultisample,
181 UniformBufferArrayDynamicIndexing,
182 SampledImageArrayDynamicIndexing,
183 StorageBufferArrayDynamicIndexing,
184 StorageImageArrayDynamicIndexing,
185 ClipDistance,
186 CullDistance,
187 ImageCubeArray,
188 SampleRateShading,
189 ImageRect,
190 SampledRect,
191 GenericPointer,
192 Int8,
193 InputAttachment,
194 SparseResidency,
195 MinLod,
196 Sampled1D,
197 Image1D,
198 SampledCubeArray,
199 SampledBuffer,
200 ImageBuffer,
201 ImageMSArray,
202 StorageImageExtendedFormats,
203 ImageQuery,
204 DerivativeControl,
205 InterpolationFunction,
206 TransformFeedback,
207 GeometryStreams,
208 StorageImageReadWithoutFormat,
209 StorageImageWriteWithoutFormat,
210 MultiViewport,
211 SubgroupDispatch,
212 NamedBarrier,
213 PipeStorage,
214 GroupNonUniform,
215 GroupNonUniformVote,
216 GroupNonUniformArithmetic,
217 GroupNonUniformBallot,
218 GroupNonUniformShuffle,
219 GroupNonUniformShuffleRelative,
220 GroupNonUniformClustered,
221 GroupNonUniformQuad,
222 ShaderLayer,
223 ShaderViewportIndex,
224 UniformDecoration,
225 CoreBuiltinsARM,
226 TileImageColorReadAccessEXT,
227 TileImageDepthReadAccessEXT,
228 TileImageStencilReadAccessEXT,
229 CooperativeMatrixLayoutsARM,
230 FragmentShadingRateKHR,
231 SubgroupBallotKHR,
232 DrawParameters,
233 WorkgroupMemoryExplicitLayoutKHR,
234 WorkgroupMemoryExplicitLayout8BitAccessKHR,
235 WorkgroupMemoryExplicitLayout16BitAccessKHR,
236 SubgroupVoteKHR,
237 StorageBuffer16BitAccess,
238 UniformAndStorageBuffer16BitAccess,
239 StoragePushConstant16,
240 StorageInputOutput16,
241 DeviceGroup,
242 MultiView,
243 VariablePointersStorageBuffer,
244 VariablePointers,
245 AtomicStorageOps,
246 SampleMaskPostDepthCoverage,
247 StorageBuffer8BitAccess,
248 UniformAndStorageBuffer8BitAccess,
249 StoragePushConstant8,
250 DenormPreserve,
251 DenormFlushToZero,
252 SignedZeroInfNanPreserve,
253 RoundingModeRTE,
254 RoundingModeRTZ,
255 RayQueryProvisionalKHR,
256 RayQueryKHR,
257 UntypedPointersKHR,
258 RayTraversalPrimitiveCullingKHR,
259 RayTracingKHR,
260 TextureSampleWeightedQCOM,
261 TextureBoxFilterQCOM,
262 TextureBlockMatchQCOM,
263 TextureBlockMatch2QCOM,
264 Float16ImageAMD,
265 ImageGatherBiasLodAMD,
266 FragmentMaskAMD,
267 StencilExportEXT,
268 ImageReadWriteLodAMD,
269 Int64ImageEXT,
270 ShaderClockKHR,
271 ShaderEnqueueAMDX,
272 QuadControlKHR,
273 SampleMaskOverrideCoverageNV,
274 GeometryShaderPassthroughNV,
275 ShaderViewportIndexLayerEXT,
276 ShaderViewportMaskNV,
277 ShaderStereoViewNV,
278 PerViewAttributesNV,
279 FragmentFullyCoveredEXT,
280 MeshShadingNV,
281 ImageFootprintNV,
282 MeshShadingEXT,
283 FragmentBarycentricKHR,
284 ComputeDerivativeGroupQuadsKHR,
285 FragmentDensityEXT,
286 GroupNonUniformPartitionedNV,
287 ShaderNonUniform,
288 RuntimeDescriptorArray,
289 InputAttachmentArrayDynamicIndexing,
290 UniformTexelBufferArrayDynamicIndexing,
291 StorageTexelBufferArrayDynamicIndexing,
292 UniformBufferArrayNonUniformIndexing,
293 SampledImageArrayNonUniformIndexing,
294 StorageBufferArrayNonUniformIndexing,
295 StorageImageArrayNonUniformIndexing,
296 InputAttachmentArrayNonUniformIndexing,
297 UniformTexelBufferArrayNonUniformIndexing,
298 StorageTexelBufferArrayNonUniformIndexing,
299 RayTracingPositionFetchKHR,
300 RayTracingNV,
301 RayTracingMotionBlurNV,
302 VulkanMemoryModel,
303 VulkanMemoryModelDeviceScope,
304 PhysicalStorageBufferAddresses,
305 ComputeDerivativeGroupLinearKHR,
306 RayTracingProvisionalKHR,
307 CooperativeMatrixNV,
308 FragmentShaderSampleInterlockEXT,
309 FragmentShaderShadingRateInterlockEXT,
310 ShaderSMBuiltinsNV,
311 FragmentShaderPixelInterlockEXT,
312 DemoteToHelperInvocation,
313 DisplacementMicromapNV,
314 RayTracingOpacityMicromapEXT,
315 ShaderInvocationReorderNV,
316 BindlessTextureNV,
317 RayQueryPositionFetchKHR,
318 CooperativeVectorNV,
319 AtomicFloat16VectorNV,
320 RayTracingDisplacementMicromapNV,
321 RawAccessChainsNV,
322 RayTracingSpheresGeometryNV,
323 RayTracingLinearSweptSpheresGeometryNV,
324 CooperativeMatrixReductionsNV,
325 CooperativeMatrixConversionsNV,
326 CooperativeMatrixPerElementOperationsNV,
327 CooperativeMatrixTensorAddressingNV,
328 CooperativeMatrixBlockLoadsNV,
329 CooperativeVectorTrainingNV,
330 RayTracingClusterAccelerationStructureNV,
331 TensorAddressingNV,
332 SubgroupShuffleINTEL,
333 SubgroupBufferBlockIOINTEL,
334 SubgroupImageBlockIOINTEL,
335 SubgroupImageMediaBlockIOINTEL,
336 RoundToInfinityINTEL,
337 FloatingPointModeINTEL,
338 IntegerFunctions2INTEL,
339 FunctionPointersINTEL,
340 IndirectReferencesINTEL,
341 AsmINTEL,
342 AtomicFloat32MinMaxEXT,
343 AtomicFloat64MinMaxEXT,
344 AtomicFloat16MinMaxEXT,
345 VectorComputeINTEL,
346 VectorAnyINTEL,
347 ExpectAssumeKHR,
348 SubgroupAvcMotionEstimationINTEL,
349 SubgroupAvcMotionEstimationIntraINTEL,
350 SubgroupAvcMotionEstimationChromaINTEL,
351 VariableLengthArrayINTEL,
352 FunctionFloatControlINTEL,
353 FPGAMemoryAttributesINTEL,
354 FPFastMathModeINTEL,
355 ArbitraryPrecisionIntegersINTEL,
356 ArbitraryPrecisionFloatingPointINTEL,
357 UnstructuredLoopControlsINTEL,
358 FPGALoopControlsINTEL,
359 KernelAttributesINTEL,
360 FPGAKernelAttributesINTEL,
361 FPGAMemoryAccessesINTEL,
362 FPGAClusterAttributesINTEL,
363 LoopFuseINTEL,
364 FPGADSPControlINTEL,
365 MemoryAccessAliasingINTEL,
366 FPGAInvocationPipeliningAttributesINTEL,
367 FPGABufferLocationINTEL,
368 ArbitraryPrecisionFixedPointINTEL,
369 USMStorageClassesINTEL,
370 RuntimeAlignedAttributeINTEL,
371 IOPipesINTEL,
372 BlockingPipesINTEL,
373 FPGARegINTEL,
374 DotProductInputAll,
375 DotProductInput4x8Bit,
376 DotProductInput4x8BitPacked,
377 DotProduct,
378 RayCullMaskKHR,
379 CooperativeMatrixKHR,
380 ReplicatedCompositesEXT,
381 BitInstructions,
382 GroupNonUniformRotateKHR,
383 FloatControls2,
384 AtomicFloat32AddEXT,
385 AtomicFloat64AddEXT,
386 LongCompositesINTEL,
387 OptNoneEXT,
388 AtomicFloat16AddEXT,
389 DebugInfoModuleINTEL,
390 BFloat16ConversionINTEL,
391 SplitBarrierINTEL,
392 ArithmeticFenceEXT,
393 FPGAClusterAttributesV2INTEL,
394 FPGAKernelAttributesv2INTEL,
395 FPMaxErrorINTEL,
396 FPGALatencyControlINTEL,
397 FPGAArgumentInterfacesINTEL,
398 GlobalVariableHostAccessINTEL,
399 GlobalVariableFPGADecorationsINTEL,
400 SubgroupBufferPrefetchINTEL,
401 Subgroup2DBlockIOINTEL,
402 Subgroup2DBlockTransformINTEL,
403 Subgroup2DBlockTransposeINTEL,
404 SubgroupMatrixMultiplyAccumulateINTEL,
405 GroupUniformArithmeticKHR,
406 MaskedGatherScatterINTEL,
407 CacheControlsINTEL,
408 RegisterLimitsINTEL,
409};24};
41025
411pub const featureSet = CpuFeature.FeatureSetFns(Feature).featureSet;26pub const featureSet = CpuFeature.FeatureSetFns(Feature).featureSet;
...@@ -426,2391 +41,87 @@ pub const all_features = blk: {...@@ -426,2391 +41,87 @@ pub const all_features = blk: {
426 result[@intFromEnum(Feature.v1_1)] = .{41 result[@intFromEnum(Feature.v1_1)] = .{
427 .llvm_name = null,42 .llvm_name = null,
428 .description = "SPIR-V version 1.1",43 .description = "SPIR-V version 1.1",
429 .dependencies = featureSet(&[_]Feature{44 .dependencies = featureSet(&[_]Feature{.v1_0}),
430 .v1_0,
431 }),
432 };45 };
433 result[@intFromEnum(Feature.v1_2)] = .{46 result[@intFromEnum(Feature.v1_2)] = .{
434 .llvm_name = null,47 .llvm_name = null,
435 .description = "SPIR-V version 1.2",48 .description = "SPIR-V version 1.2",
436 .dependencies = featureSet(&[_]Feature{49 .dependencies = featureSet(&[_]Feature{.v1_1}),
437 .v1_1,
438 }),
439 };50 };
440 result[@intFromEnum(Feature.v1_3)] = .{51 result[@intFromEnum(Feature.v1_3)] = .{
441 .llvm_name = null,52 .llvm_name = null,
442 .description = "SPIR-V version 1.3",53 .description = "SPIR-V version 1.3",
443 .dependencies = featureSet(&[_]Feature{54 .dependencies = featureSet(&[_]Feature{.v1_2}),
444 .v1_2,
445 }),
446 };55 };
447 result[@intFromEnum(Feature.v1_4)] = .{56 result[@intFromEnum(Feature.v1_4)] = .{
448 .llvm_name = null,57 .llvm_name = null,
449 .description = "SPIR-V version 1.4",58 .description = "SPIR-V version 1.4",
450 .dependencies = featureSet(&[_]Feature{59 .dependencies = featureSet(&[_]Feature{.v1_3}),
451 .v1_3,
452 }),
453 };60 };
454 result[@intFromEnum(Feature.v1_5)] = .{61 result[@intFromEnum(Feature.v1_5)] = .{
455 .llvm_name = null,62 .llvm_name = null,
456 .description = "SPIR-V version 1.5",63 .description = "SPIR-V version 1.5",
457 .dependencies = featureSet(&[_]Feature{64 .dependencies = featureSet(&[_]Feature{.v1_4}),
458 .v1_4,
459 }),
460 };65 };
461 result[@intFromEnum(Feature.v1_6)] = .{66 result[@intFromEnum(Feature.v1_6)] = .{
462 .llvm_name = null,67 .llvm_name = null,
463 .description = "SPIR-V version 1.6",68 .description = "SPIR-V version 1.6",
464 .dependencies = featureSet(&[_]Feature{69 .dependencies = featureSet(&[_]Feature{.v1_5}),
465 .v1_5,
466 }),
467 };
468 result[@intFromEnum(Feature.SPV_AMDX_shader_enqueue)] = .{
469 .llvm_name = null,
470 .description = "SPIR-V extension SPV_AMDX_shader_enqueue",
471 .dependencies = featureSet(&[_]Feature{}),
472 };
473 result[@intFromEnum(Feature.SPV_AMD_gcn_shader)] = .{
474 .llvm_name = null,
475 .description = "SPIR-V extension SPV_AMD_gcn_shader",
476 .dependencies = featureSet(&[_]Feature{}),
477 };
478 result[@intFromEnum(Feature.SPV_AMD_gpu_shader_half_float)] = .{
479 .llvm_name = null,
480 .description = "SPIR-V extension SPV_AMD_gpu_shader_half_float",
481 .dependencies = featureSet(&[_]Feature{}),
482 };
483 result[@intFromEnum(Feature.SPV_AMD_gpu_shader_half_float_fetch)] = .{
484 .llvm_name = null,
485 .description = "SPIR-V extension SPV_AMD_gpu_shader_half_float_fetch",
486 .dependencies = featureSet(&[_]Feature{}),
487 };
488 result[@intFromEnum(Feature.SPV_AMD_gpu_shader_int16)] = .{
489 .llvm_name = null,
490 .description = "SPIR-V extension SPV_AMD_gpu_shader_int16",
491 .dependencies = featureSet(&[_]Feature{}),
492 };
493 result[@intFromEnum(Feature.SPV_AMD_shader_ballot)] = .{
494 .llvm_name = null,
495 .description = "SPIR-V extension SPV_AMD_shader_ballot",
496 .dependencies = featureSet(&[_]Feature{}),
497 };
498 result[@intFromEnum(Feature.SPV_AMD_shader_early_and_late_fragment_tests)] = .{
499 .llvm_name = null,
500 .description = "SPIR-V extension SPV_AMD_shader_early_and_late_fragment_tests",
501 .dependencies = featureSet(&[_]Feature{}),
502 };
503 result[@intFromEnum(Feature.SPV_AMD_shader_explicit_vertex_parameter)] = .{
504 .llvm_name = null,
505 .description = "SPIR-V extension SPV_AMD_shader_explicit_vertex_parameter",
506 .dependencies = featureSet(&[_]Feature{}),
507 };
508 result[@intFromEnum(Feature.SPV_AMD_shader_fragment_mask)] = .{
509 .llvm_name = null,
510 .description = "SPIR-V extension SPV_AMD_shader_fragment_mask",
511 .dependencies = featureSet(&[_]Feature{}),
512 };
513 result[@intFromEnum(Feature.SPV_AMD_shader_image_load_store_lod)] = .{
514 .llvm_name = null,
515 .description = "SPIR-V extension SPV_AMD_shader_image_load_store_lod",
516 .dependencies = featureSet(&[_]Feature{}),
517 };
518 result[@intFromEnum(Feature.SPV_AMD_shader_trinary_minmax)] = .{
519 .llvm_name = null,
520 .description = "SPIR-V extension SPV_AMD_shader_trinary_minmax",
521 .dependencies = featureSet(&[_]Feature{}),
522 };
523 result[@intFromEnum(Feature.SPV_AMD_texture_gather_bias_lod)] = .{
524 .llvm_name = null,
525 .description = "SPIR-V extension SPV_AMD_texture_gather_bias_lod",
526 .dependencies = featureSet(&[_]Feature{}),
527 };
528 result[@intFromEnum(Feature.SPV_ARM_cooperative_matrix_layouts)] = .{
529 .llvm_name = null,
530 .description = "SPIR-V extension SPV_ARM_cooperative_matrix_layouts",
531 .dependencies = featureSet(&[_]Feature{}),
532 };
533 result[@intFromEnum(Feature.SPV_ARM_core_builtins)] = .{
534 .llvm_name = null,
535 .description = "SPIR-V extension SPV_ARM_core_builtins",
536 .dependencies = featureSet(&[_]Feature{}),
537 };
538 result[@intFromEnum(Feature.SPV_EXT_arithmetic_fence)] = .{
539 .llvm_name = null,
540 .description = "SPIR-V extension SPV_EXT_arithmetic_fence",
541 .dependencies = featureSet(&[_]Feature{}),
542 };
543 result[@intFromEnum(Feature.SPV_EXT_demote_to_helper_invocation)] = .{
544 .llvm_name = null,
545 .description = "SPIR-V extension SPV_EXT_demote_to_helper_invocation",
546 .dependencies = featureSet(&[_]Feature{}),
547 };
548 result[@intFromEnum(Feature.SPV_EXT_descriptor_indexing)] = .{
549 .llvm_name = null,
550 .description = "SPIR-V extension SPV_EXT_descriptor_indexing",
551 .dependencies = featureSet(&[_]Feature{}),
552 };
553 result[@intFromEnum(Feature.SPV_EXT_fragment_fully_covered)] = .{
554 .llvm_name = null,
555 .description = "SPIR-V extension SPV_EXT_fragment_fully_covered",
556 .dependencies = featureSet(&[_]Feature{}),
557 };
558 result[@intFromEnum(Feature.SPV_EXT_fragment_invocation_density)] = .{
559 .llvm_name = null,
560 .description = "SPIR-V extension SPV_EXT_fragment_invocation_density",
561 .dependencies = featureSet(&[_]Feature{}),
562 };
563 result[@intFromEnum(Feature.SPV_EXT_fragment_shader_interlock)] = .{
564 .llvm_name = null,
565 .description = "SPIR-V extension SPV_EXT_fragment_shader_interlock",
566 .dependencies = featureSet(&[_]Feature{}),
567 };
568 result[@intFromEnum(Feature.SPV_EXT_image_raw10_raw12)] = .{
569 .llvm_name = null,
570 .description = "SPIR-V extension SPV_EXT_image_raw10_raw12",
571 .dependencies = featureSet(&[_]Feature{}),
572 };
573 result[@intFromEnum(Feature.SPV_EXT_mesh_shader)] = .{
574 .llvm_name = null,
575 .description = "SPIR-V extension SPV_EXT_mesh_shader",
576 .dependencies = featureSet(&[_]Feature{}),
577 };
578 result[@intFromEnum(Feature.SPV_EXT_opacity_micromap)] = .{
579 .llvm_name = null,
580 .description = "SPIR-V extension SPV_EXT_opacity_micromap",
581 .dependencies = featureSet(&[_]Feature{}),
582 };
583 result[@intFromEnum(Feature.SPV_EXT_optnone)] = .{
584 .llvm_name = null,
585 .description = "SPIR-V extension SPV_EXT_optnone",
586 .dependencies = featureSet(&[_]Feature{}),
587 };
588 result[@intFromEnum(Feature.SPV_EXT_physical_storage_buffer)] = .{
589 .llvm_name = null,
590 .description = "SPIR-V extension SPV_EXT_physical_storage_buffer",
591 .dependencies = featureSet(&[_]Feature{}),
592 };
593 result[@intFromEnum(Feature.SPV_EXT_replicated_composites)] = .{
594 .llvm_name = null,
595 .description = "SPIR-V extension SPV_EXT_replicated_composites",
596 .dependencies = featureSet(&[_]Feature{}),
597 };
598 result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float16_add)] = .{
599 .llvm_name = null,
600 .description = "SPIR-V extension SPV_EXT_shader_atomic_float16_add",
601 .dependencies = featureSet(&[_]Feature{}),
602 };
603 result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float_add)] = .{
604 .llvm_name = null,
605 .description = "SPIR-V extension SPV_EXT_shader_atomic_float_add",
606 .dependencies = featureSet(&[_]Feature{}),
607 };
608 result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float_min_max)] = .{
609 .llvm_name = null,
610 .description = "SPIR-V extension SPV_EXT_shader_atomic_float_min_max",
611 .dependencies = featureSet(&[_]Feature{}),
612 };
613 result[@intFromEnum(Feature.SPV_EXT_shader_image_int64)] = .{
614 .llvm_name = null,
615 .description = "SPIR-V extension SPV_EXT_shader_image_int64",
616 .dependencies = featureSet(&[_]Feature{}),
617 };
618 result[@intFromEnum(Feature.SPV_EXT_shader_stencil_export)] = .{
619 .llvm_name = null,
620 .description = "SPIR-V extension SPV_EXT_shader_stencil_export",
621 .dependencies = featureSet(&[_]Feature{}),
622 };
623 result[@intFromEnum(Feature.SPV_EXT_shader_tile_image)] = .{
624 .llvm_name = null,
625 .description = "SPIR-V extension SPV_EXT_shader_tile_image",
626 .dependencies = featureSet(&[_]Feature{}),
627 };
628 result[@intFromEnum(Feature.SPV_EXT_shader_viewport_index_layer)] = .{
629 .llvm_name = null,
630 .description = "SPIR-V extension SPV_EXT_shader_viewport_index_layer",
631 .dependencies = featureSet(&[_]Feature{}),
632 };
633 result[@intFromEnum(Feature.SPV_EXT_ycbcr_attachments)] = .{
634 .llvm_name = null,
635 .description = "SPIR-V extension SPV_EXT_ycbcr_attachments",
636 .dependencies = featureSet(&[_]Feature{}),
637 };
638 result[@intFromEnum(Feature.SPV_GOOGLE_decorate_string)] = .{
639 .llvm_name = null,
640 .description = "SPIR-V extension SPV_GOOGLE_decorate_string",
641 .dependencies = featureSet(&[_]Feature{}),
642 };
643 result[@intFromEnum(Feature.SPV_GOOGLE_hlsl_functionality1)] = .{
644 .llvm_name = null,
645 .description = "SPIR-V extension SPV_GOOGLE_hlsl_functionality1",
646 .dependencies = featureSet(&[_]Feature{}),
647 };
648 result[@intFromEnum(Feature.SPV_GOOGLE_user_type)] = .{
649 .llvm_name = null,
650 .description = "SPIR-V extension SPV_GOOGLE_user_type",
651 .dependencies = featureSet(&[_]Feature{}),
652 };
653 result[@intFromEnum(Feature.SPV_HUAWEI_cluster_culling_shader)] = .{
654 .llvm_name = null,
655 .description = "SPIR-V extension SPV_HUAWEI_cluster_culling_shader",
656 .dependencies = featureSet(&[_]Feature{}),
657 };
658 result[@intFromEnum(Feature.SPV_HUAWEI_subpass_shading)] = .{
659 .llvm_name = null,
660 .description = "SPIR-V extension SPV_HUAWEI_subpass_shading",
661 .dependencies = featureSet(&[_]Feature{}),
662 };
663 result[@intFromEnum(Feature.SPV_INTEL_arbitrary_precision_fixed_point)] = .{
664 .llvm_name = null,
665 .description = "SPIR-V extension SPV_INTEL_arbitrary_precision_fixed_point",
666 .dependencies = featureSet(&[_]Feature{}),
667 };
668 result[@intFromEnum(Feature.SPV_INTEL_arbitrary_precision_floating_point)] = .{
669 .llvm_name = null,
670 .description = "SPIR-V extension SPV_INTEL_arbitrary_precision_floating_point",
671 .dependencies = featureSet(&[_]Feature{}),
672 };
673 result[@intFromEnum(Feature.SPV_INTEL_arbitrary_precision_integers)] = .{
674 .llvm_name = null,
675 .description = "SPIR-V extension SPV_INTEL_arbitrary_precision_integers",
676 .dependencies = featureSet(&[_]Feature{}),
677 };
678 result[@intFromEnum(Feature.SPV_INTEL_blocking_pipes)] = .{
679 .llvm_name = null,
680 .description = "SPIR-V extension SPV_INTEL_blocking_pipes",
681 .dependencies = featureSet(&[_]Feature{}),
682 };
683 result[@intFromEnum(Feature.SPV_INTEL_device_side_avc_motion_estimation)] = .{
684 .llvm_name = null,
685 .description = "SPIR-V extension SPV_INTEL_device_side_avc_motion_estimation",
686 .dependencies = featureSet(&[_]Feature{}),
687 };
688 result[@intFromEnum(Feature.SPV_INTEL_fpga_argument_interfaces)] = .{
689 .llvm_name = null,
690 .description = "SPIR-V extension SPV_INTEL_fpga_argument_interfaces",
691 .dependencies = featureSet(&[_]Feature{}),
692 };
693 result[@intFromEnum(Feature.SPV_INTEL_fpga_buffer_location)] = .{
694 .llvm_name = null,
695 .description = "SPIR-V extension SPV_INTEL_fpga_buffer_location",
696 .dependencies = featureSet(&[_]Feature{}),
697 };
698 result[@intFromEnum(Feature.SPV_INTEL_fpga_cluster_attributes)] = .{
699 .llvm_name = null,
700 .description = "SPIR-V extension SPV_INTEL_fpga_cluster_attributes",
701 .dependencies = featureSet(&[_]Feature{}),
702 };
703 result[@intFromEnum(Feature.SPV_INTEL_fpga_dsp_control)] = .{
704 .llvm_name = null,
705 .description = "SPIR-V extension SPV_INTEL_fpga_dsp_control",
706 .dependencies = featureSet(&[_]Feature{}),
707 };
708 result[@intFromEnum(Feature.SPV_INTEL_fpga_invocation_pipelining_attributes)] = .{
709 .llvm_name = null,
710 .description = "SPIR-V extension SPV_INTEL_fpga_invocation_pipelining_attributes",
711 .dependencies = featureSet(&[_]Feature{}),
712 };
713 result[@intFromEnum(Feature.SPV_INTEL_fpga_latency_control)] = .{
714 .llvm_name = null,
715 .description = "SPIR-V extension SPV_INTEL_fpga_latency_control",
716 .dependencies = featureSet(&[_]Feature{}),
717 };
718 result[@intFromEnum(Feature.SPV_INTEL_fpga_loop_controls)] = .{
719 .llvm_name = null,
720 .description = "SPIR-V extension SPV_INTEL_fpga_loop_controls",
721 .dependencies = featureSet(&[_]Feature{}),
722 };
723 result[@intFromEnum(Feature.SPV_INTEL_fpga_memory_accesses)] = .{
724 .llvm_name = null,
725 .description = "SPIR-V extension SPV_INTEL_fpga_memory_accesses",
726 .dependencies = featureSet(&[_]Feature{}),
727 };
728 result[@intFromEnum(Feature.SPV_INTEL_fpga_memory_attributes)] = .{
729 .llvm_name = null,
730 .description = "SPIR-V extension SPV_INTEL_fpga_memory_attributes",
731 .dependencies = featureSet(&[_]Feature{}),
732 };
733 result[@intFromEnum(Feature.SPV_INTEL_fpga_reg)] = .{
734 .llvm_name = null,
735 .description = "SPIR-V extension SPV_INTEL_fpga_reg",
736 .dependencies = featureSet(&[_]Feature{}),
737 };
738 result[@intFromEnum(Feature.SPV_INTEL_fp_fast_math_mode)] = .{
739 .llvm_name = null,
740 .description = "SPIR-V extension SPV_INTEL_fp_fast_math_mode",
741 .dependencies = featureSet(&[_]Feature{}),
742 };
743 result[@intFromEnum(Feature.SPV_INTEL_fp_max_error)] = .{
744 .llvm_name = null,
745 .description = "SPIR-V extension SPV_INTEL_fp_max_error",
746 .dependencies = featureSet(&[_]Feature{}),
747 };
748 result[@intFromEnum(Feature.SPV_INTEL_global_variable_fpga_decorations)] = .{
749 .llvm_name = null,
750 .description = "SPIR-V extension SPV_INTEL_global_variable_fpga_decorations",
751 .dependencies = featureSet(&[_]Feature{}),
752 };
753 result[@intFromEnum(Feature.SPV_INTEL_global_variable_host_access)] = .{
754 .llvm_name = null,
755 .description = "SPIR-V extension SPV_INTEL_global_variable_host_access",
756 .dependencies = featureSet(&[_]Feature{}),
757 };
758 result[@intFromEnum(Feature.SPV_INTEL_io_pipes)] = .{
759 .llvm_name = null,
760 .description = "SPIR-V extension SPV_INTEL_io_pipes",
761 .dependencies = featureSet(&[_]Feature{}),
762 };
763 result[@intFromEnum(Feature.SPV_INTEL_kernel_attributes)] = .{
764 .llvm_name = null,
765 .description = "SPIR-V extension SPV_INTEL_kernel_attributes",
766 .dependencies = featureSet(&[_]Feature{}),
767 };
768 result[@intFromEnum(Feature.SPV_INTEL_long_composites)] = .{
769 .llvm_name = null,
770 .description = "SPIR-V extension SPV_INTEL_long_composites",
771 .dependencies = featureSet(&[_]Feature{}),
772 };
773 result[@intFromEnum(Feature.SPV_INTEL_loop_fuse)] = .{
774 .llvm_name = null,
775 .description = "SPIR-V extension SPV_INTEL_loop_fuse",
776 .dependencies = featureSet(&[_]Feature{}),
777 };
778 result[@intFromEnum(Feature.SPV_INTEL_maximum_registers)] = .{
779 .llvm_name = null,
780 .description = "SPIR-V extension SPV_INTEL_maximum_registers",
781 .dependencies = featureSet(&[_]Feature{}),
782 };
783 result[@intFromEnum(Feature.SPV_INTEL_media_block_io)] = .{
784 .llvm_name = null,
785 .description = "SPIR-V extension SPV_INTEL_media_block_io",
786 .dependencies = featureSet(&[_]Feature{}),
787 };
788 result[@intFromEnum(Feature.SPV_INTEL_runtime_aligned)] = .{
789 .llvm_name = null,
790 .description = "SPIR-V extension SPV_INTEL_runtime_aligned",
791 .dependencies = featureSet(&[_]Feature{}),
792 };
793 result[@intFromEnum(Feature.SPV_INTEL_shader_integer_functions2)] = .{
794 .llvm_name = null,
795 .description = "SPIR-V extension SPV_INTEL_shader_integer_functions2",
796 .dependencies = featureSet(&[_]Feature{}),
797 };
798 result[@intFromEnum(Feature.SPV_INTEL_split_barrier)] = .{
799 .llvm_name = null,
800 .description = "SPIR-V extension SPV_INTEL_split_barrier",
801 .dependencies = featureSet(&[_]Feature{}),
802 };
803 result[@intFromEnum(Feature.SPV_INTEL_subgroups)] = .{
804 .llvm_name = null,
805 .description = "SPIR-V extension SPV_INTEL_subgroups",
806 .dependencies = featureSet(&[_]Feature{}),
807 };
808 result[@intFromEnum(Feature.SPV_INTEL_subgroup_buffer_prefetch)] = .{
809 .llvm_name = null,
810 .description = "SPIR-V extension SPV_INTEL_subgroup_buffer_prefetch",
811 .dependencies = featureSet(&[_]Feature{}),
812 };
813 result[@intFromEnum(Feature.SPV_INTEL_task_sequence)] = .{
814 .llvm_name = null,
815 .description = "SPIR-V extension SPV_INTEL_task_sequence",
816 .dependencies = featureSet(&[_]Feature{}),
817 };
818 result[@intFromEnum(Feature.SPV_INTEL_unstructured_loop_controls)] = .{
819 .llvm_name = null,
820 .description = "SPIR-V extension SPV_INTEL_unstructured_loop_controls",
821 .dependencies = featureSet(&[_]Feature{}),
822 };
823 result[@intFromEnum(Feature.SPV_INTEL_usm_storage_classes)] = .{
824 .llvm_name = null,
825 .description = "SPIR-V extension SPV_INTEL_usm_storage_classes",
826 .dependencies = featureSet(&[_]Feature{}),
827 };
828 result[@intFromEnum(Feature.SPV_KHR_16bit_storage)] = .{
829 .llvm_name = null,
830 .description = "SPIR-V extension SPV_KHR_16bit_storage",
831 .dependencies = featureSet(&[_]Feature{}),
832 };
833 result[@intFromEnum(Feature.SPV_KHR_8bit_storage)] = .{
834 .llvm_name = null,
835 .description = "SPIR-V extension SPV_KHR_8bit_storage",
836 .dependencies = featureSet(&[_]Feature{}),
837 };
838 result[@intFromEnum(Feature.SPV_KHR_bit_instructions)] = .{
839 .llvm_name = null,
840 .description = "SPIR-V extension SPV_KHR_bit_instructions",
841 .dependencies = featureSet(&[_]Feature{}),
842 };
843 result[@intFromEnum(Feature.SPV_KHR_compute_shader_derivatives)] = .{
844 .llvm_name = null,
845 .description = "SPIR-V extension SPV_KHR_compute_shader_derivatives",
846 .dependencies = featureSet(&[_]Feature{}),
847 };
848 result[@intFromEnum(Feature.SPV_KHR_cooperative_matrix)] = .{
849 .llvm_name = null,
850 .description = "SPIR-V extension SPV_KHR_cooperative_matrix",
851 .dependencies = featureSet(&[_]Feature{}),
852 };70 };
853 result[@intFromEnum(Feature.SPV_KHR_device_group)] = .{71 result[@intFromEnum(Feature.int8)] = .{
854 .llvm_name = null,72 .llvm_name = null,
855 .description = "SPIR-V extension SPV_KHR_device_group",73 .description = "Enable SPIR-V capability Int8",
856 .dependencies = featureSet(&[_]Feature{}),74 .dependencies = featureSet(&[_]Feature{.v1_0}),
857 };
858 result[@intFromEnum(Feature.SPV_KHR_expect_assume)] = .{
859 .llvm_name = null,
860 .description = "SPIR-V extension SPV_KHR_expect_assume",
861 .dependencies = featureSet(&[_]Feature{}),
862 };75 };
863 result[@intFromEnum(Feature.SPV_KHR_float_controls)] = .{76 result[@intFromEnum(Feature.int16)] = .{
864 .llvm_name = null,77 .llvm_name = null,
865 .description = "SPIR-V extension SPV_KHR_float_controls",78 .description = "Enable SPIR-V capability Int16",
866 .dependencies = featureSet(&[_]Feature{}),79 .dependencies = featureSet(&[_]Feature{.v1_0}),
867 };80 };
868 result[@intFromEnum(Feature.SPV_KHR_float_controls2)] = .{81 result[@intFromEnum(Feature.int64)] = .{
869 .llvm_name = null,82 .llvm_name = null,
870 .description = "SPIR-V extension SPV_KHR_float_controls2",83 .description = "Enable SPIR-V capability Int64",
871 .dependencies = featureSet(&[_]Feature{}),84 .dependencies = featureSet(&[_]Feature{.v1_0}),
872 };85 };
873 result[@intFromEnum(Feature.SPV_KHR_fragment_shader_barycentric)] = .{86 result[@intFromEnum(Feature.float16)] = .{
874 .llvm_name = null,87 .llvm_name = null,
875 .description = "SPIR-V extension SPV_KHR_fragment_shader_barycentric",88 .description = "Enable SPIR-V capability Float16",
876 .dependencies = featureSet(&[_]Feature{}),89 .dependencies = featureSet(&[_]Feature{.v1_0}),
877 };90 };
878 result[@intFromEnum(Feature.SPV_KHR_fragment_shading_rate)] = .{91 result[@intFromEnum(Feature.float64)] = .{
879 .llvm_name = null,92 .llvm_name = null,
880 .description = "SPIR-V extension SPV_KHR_fragment_shading_rate",93 .description = "Enable SPIR-V capability Float64",
881 .dependencies = featureSet(&[_]Feature{}),94 .dependencies = featureSet(&[_]Feature{.v1_0}),
882 };95 };
883 result[@intFromEnum(Feature.SPV_KHR_integer_dot_product)] = .{96 result[@intFromEnum(Feature.addresses)] = .{
884 .llvm_name = null,97 .llvm_name = null,
885 .description = "SPIR-V extension SPV_KHR_integer_dot_product",98 .description = "Enable SPIR-V capability Addresses",
886 .dependencies = featureSet(&[_]Feature{}),99 .dependencies = featureSet(&[_]Feature{.v1_0}),
887 };100 };
888 result[@intFromEnum(Feature.SPV_KHR_linkonce_odr)] = .{101 result[@intFromEnum(Feature.matrix)] = .{
889 .llvm_name = null,102 .llvm_name = null,
890 .description = "SPIR-V extension SPV_KHR_linkonce_odr",103 .description = "Enable SPIR-V capability Matrix",
891 .dependencies = featureSet(&[_]Feature{}),104 .dependencies = featureSet(&[_]Feature{.v1_0}),
892 };105 };
893 result[@intFromEnum(Feature.SPV_KHR_maximal_reconvergence)] = .{106 result[@intFromEnum(Feature.kernel)] = .{
894 .llvm_name = null,107 .llvm_name = null,
895 .description = "SPIR-V extension SPV_KHR_maximal_reconvergence",108 .description = "Enable SPIR-V capability Kernel",
896 .dependencies = featureSet(&[_]Feature{}),109 .dependencies = featureSet(&[_]Feature{.v1_0}),
897 };110 };
898 result[@intFromEnum(Feature.SPV_KHR_multiview)] = .{111 result[@intFromEnum(Feature.generic_pointer)] = .{
899 .llvm_name = null,112 .llvm_name = null,
900 .description = "SPIR-V extension SPV_KHR_multiview",113 .description = "Enable SPIR-V capability GenericPointer",
901 .dependencies = featureSet(&[_]Feature{}),114 .dependencies = featureSet(&[_]Feature{ .v1_0, .addresses }),
902 };115 };
903 result[@intFromEnum(Feature.SPV_KHR_non_semantic_info)] = .{116 result[@intFromEnum(Feature.vector16)] = .{
904 .llvm_name = null,117 .llvm_name = null,
905 .description = "SPIR-V extension SPV_KHR_non_semantic_info",118 .description = "Enable SPIR-V capability Vector16",
906 .dependencies = featureSet(&[_]Feature{}),119 .dependencies = featureSet(&[_]Feature{ .v1_0, .kernel }),
907 };120 };
908 result[@intFromEnum(Feature.SPV_KHR_no_integer_wrap_decoration)] = .{121 result[@intFromEnum(Feature.shader)] = .{
909 .llvm_name = null,
910 .description = "SPIR-V extension SPV_KHR_no_integer_wrap_decoration",
911 .dependencies = featureSet(&[_]Feature{}),
912 };
913 result[@intFromEnum(Feature.SPV_KHR_physical_storage_buffer)] = .{
914 .llvm_name = null,
915 .description = "SPIR-V extension SPV_KHR_physical_storage_buffer",
916 .dependencies = featureSet(&[_]Feature{}),
917 };
918 result[@intFromEnum(Feature.SPV_KHR_post_depth_coverage)] = .{
919 .llvm_name = null,
920 .description = "SPIR-V extension SPV_KHR_post_depth_coverage",
921 .dependencies = featureSet(&[_]Feature{}),
922 };
923 result[@intFromEnum(Feature.SPV_KHR_quad_control)] = .{
924 .llvm_name = null,
925 .description = "SPIR-V extension SPV_KHR_quad_control",
926 .dependencies = featureSet(&[_]Feature{}),
927 };
928 result[@intFromEnum(Feature.SPV_KHR_ray_cull_mask)] = .{
929 .llvm_name = null,
930 .description = "SPIR-V extension SPV_KHR_ray_cull_mask",
931 .dependencies = featureSet(&[_]Feature{}),
932 };
933 result[@intFromEnum(Feature.SPV_KHR_ray_query)] = .{
934 .llvm_name = null,
935 .description = "SPIR-V extension SPV_KHR_ray_query",
936 .dependencies = featureSet(&[_]Feature{}),
937 };
938 result[@intFromEnum(Feature.SPV_KHR_ray_tracing)] = .{
939 .llvm_name = null,
940 .description = "SPIR-V extension SPV_KHR_ray_tracing",
941 .dependencies = featureSet(&[_]Feature{}),
942 };
943 result[@intFromEnum(Feature.SPV_KHR_ray_tracing_position_fetch)] = .{
944 .llvm_name = null,
945 .description = "SPIR-V extension SPV_KHR_ray_tracing_position_fetch",
946 .dependencies = featureSet(&[_]Feature{}),
947 };
948 result[@intFromEnum(Feature.SPV_KHR_relaxed_extended_instruction)] = .{
949 .llvm_name = null,
950 .description = "SPIR-V extension SPV_KHR_relaxed_extended_instruction",
951 .dependencies = featureSet(&[_]Feature{}),
952 };
953 result[@intFromEnum(Feature.SPV_KHR_shader_atomic_counter_ops)] = .{
954 .llvm_name = null,
955 .description = "SPIR-V extension SPV_KHR_shader_atomic_counter_ops",
956 .dependencies = featureSet(&[_]Feature{}),
957 };
958 result[@intFromEnum(Feature.SPV_KHR_shader_ballot)] = .{
959 .llvm_name = null,
960 .description = "SPIR-V extension SPV_KHR_shader_ballot",
961 .dependencies = featureSet(&[_]Feature{}),
962 };
963 result[@intFromEnum(Feature.SPV_KHR_shader_clock)] = .{
964 .llvm_name = null,
965 .description = "SPIR-V extension SPV_KHR_shader_clock",
966 .dependencies = featureSet(&[_]Feature{}),
967 };
968 result[@intFromEnum(Feature.SPV_KHR_shader_draw_parameters)] = .{
969 .llvm_name = null,
970 .description = "SPIR-V extension SPV_KHR_shader_draw_parameters",
971 .dependencies = featureSet(&[_]Feature{}),
972 };
973 result[@intFromEnum(Feature.SPV_KHR_storage_buffer_storage_class)] = .{
974 .llvm_name = null,
975 .description = "SPIR-V extension SPV_KHR_storage_buffer_storage_class",
976 .dependencies = featureSet(&[_]Feature{}),
977 };
978 result[@intFromEnum(Feature.SPV_KHR_subgroup_rotate)] = .{
979 .llvm_name = null,
980 .description = "SPIR-V extension SPV_KHR_subgroup_rotate",
981 .dependencies = featureSet(&[_]Feature{}),
982 };
983 result[@intFromEnum(Feature.SPV_KHR_subgroup_uniform_control_flow)] = .{
984 .llvm_name = null,
985 .description = "SPIR-V extension SPV_KHR_subgroup_uniform_control_flow",
986 .dependencies = featureSet(&[_]Feature{}),
987 };
988 result[@intFromEnum(Feature.SPV_KHR_subgroup_vote)] = .{
989 .llvm_name = null,
990 .description = "SPIR-V extension SPV_KHR_subgroup_vote",
991 .dependencies = featureSet(&[_]Feature{}),
992 };
993 result[@intFromEnum(Feature.SPV_KHR_terminate_invocation)] = .{
994 .llvm_name = null,
995 .description = "SPIR-V extension SPV_KHR_terminate_invocation",
996 .dependencies = featureSet(&[_]Feature{}),
997 };
998 result[@intFromEnum(Feature.SPV_KHR_untyped_pointers)] = .{
999 .llvm_name = null,
1000 .description = "SPIR-V extension SPV_KHR_untyped_pointers",
1001 .dependencies = featureSet(&[_]Feature{}),
1002 };
1003 result[@intFromEnum(Feature.SPV_KHR_variable_pointers)] = .{
1004 .llvm_name = null,
1005 .description = "SPIR-V extension SPV_KHR_variable_pointers",
1006 .dependencies = featureSet(&[_]Feature{}),
1007 };
1008 result[@intFromEnum(Feature.SPV_KHR_vulkan_memory_model)] = .{
1009 .llvm_name = null,
1010 .description = "SPIR-V extension SPV_KHR_vulkan_memory_model",
1011 .dependencies = featureSet(&[_]Feature{}),
1012 };
1013 result[@intFromEnum(Feature.SPV_KHR_workgroup_memory_explicit_layout)] = .{
1014 .llvm_name = null,
1015 .description = "SPIR-V extension SPV_KHR_workgroup_memory_explicit_layout",
1016 .dependencies = featureSet(&[_]Feature{}),
1017 };
1018 result[@intFromEnum(Feature.SPV_NVX_multiview_per_view_attributes)] = .{
1019 .llvm_name = null,
1020 .description = "SPIR-V extension SPV_NVX_multiview_per_view_attributes",
1021 .dependencies = featureSet(&[_]Feature{}),
1022 };
1023 result[@intFromEnum(Feature.SPV_NV_bindless_texture)] = .{
1024 .llvm_name = null,
1025 .description = "SPIR-V extension SPV_NV_bindless_texture",
1026 .dependencies = featureSet(&[_]Feature{}),
1027 };
1028 result[@intFromEnum(Feature.SPV_NV_cluster_acceleration_structure)] = .{
1029 .llvm_name = null,
1030 .description = "SPIR-V extension SPV_NV_cluster_acceleration_structure",
1031 .dependencies = featureSet(&[_]Feature{}),
1032 };
1033 result[@intFromEnum(Feature.SPV_NV_compute_shader_derivatives)] = .{
1034 .llvm_name = null,
1035 .description = "SPIR-V extension SPV_NV_compute_shader_derivatives",
1036 .dependencies = featureSet(&[_]Feature{}),
1037 };
1038 result[@intFromEnum(Feature.SPV_NV_cooperative_matrix)] = .{
1039 .llvm_name = null,
1040 .description = "SPIR-V extension SPV_NV_cooperative_matrix",
1041 .dependencies = featureSet(&[_]Feature{}),
1042 };
1043 result[@intFromEnum(Feature.SPV_NV_cooperative_matrix2)] = .{
1044 .llvm_name = null,
1045 .description = "SPIR-V extension SPV_NV_cooperative_matrix2",
1046 .dependencies = featureSet(&[_]Feature{}),
1047 };
1048 result[@intFromEnum(Feature.SPV_NV_cooperative_vector)] = .{
1049 .llvm_name = null,
1050 .description = "SPIR-V extension SPV_NV_cooperative_vector",
1051 .dependencies = featureSet(&[_]Feature{}),
1052 };
1053 result[@intFromEnum(Feature.SPV_NV_displacement_micromap)] = .{
1054 .llvm_name = null,
1055 .description = "SPIR-V extension SPV_NV_displacement_micromap",
1056 .dependencies = featureSet(&[_]Feature{}),
1057 };
1058 result[@intFromEnum(Feature.SPV_NV_fragment_shader_barycentric)] = .{
1059 .llvm_name = null,
1060 .description = "SPIR-V extension SPV_NV_fragment_shader_barycentric",
1061 .dependencies = featureSet(&[_]Feature{}),
1062 };
1063 result[@intFromEnum(Feature.SPV_NV_geometry_shader_passthrough)] = .{
1064 .llvm_name = null,
1065 .description = "SPIR-V extension SPV_NV_geometry_shader_passthrough",
1066 .dependencies = featureSet(&[_]Feature{}),
1067 };
1068 result[@intFromEnum(Feature.SPV_NV_linear_swept_spheres)] = .{
1069 .llvm_name = null,
1070 .description = "SPIR-V extension SPV_NV_linear_swept_spheres",
1071 .dependencies = featureSet(&[_]Feature{}),
1072 };
1073 result[@intFromEnum(Feature.SPV_NV_mesh_shader)] = .{
1074 .llvm_name = null,
1075 .description = "SPIR-V extension SPV_NV_mesh_shader",
1076 .dependencies = featureSet(&[_]Feature{}),
1077 };
1078 result[@intFromEnum(Feature.SPV_NV_raw_access_chains)] = .{
1079 .llvm_name = null,
1080 .description = "SPIR-V extension SPV_NV_raw_access_chains",
1081 .dependencies = featureSet(&[_]Feature{}),
1082 };
1083 result[@intFromEnum(Feature.SPV_NV_ray_tracing)] = .{
1084 .llvm_name = null,
1085 .description = "SPIR-V extension SPV_NV_ray_tracing",
1086 .dependencies = featureSet(&[_]Feature{}),
1087 };
1088 result[@intFromEnum(Feature.SPV_NV_ray_tracing_motion_blur)] = .{
1089 .llvm_name = null,
1090 .description = "SPIR-V extension SPV_NV_ray_tracing_motion_blur",
1091 .dependencies = featureSet(&[_]Feature{}),
1092 };
1093 result[@intFromEnum(Feature.SPV_NV_sample_mask_override_coverage)] = .{
1094 .llvm_name = null,
1095 .description = "SPIR-V extension SPV_NV_sample_mask_override_coverage",
1096 .dependencies = featureSet(&[_]Feature{}),
1097 };
1098 result[@intFromEnum(Feature.SPV_NV_shader_atomic_fp16_vector)] = .{
1099 .llvm_name = null,
1100 .description = "SPIR-V extension SPV_NV_shader_atomic_fp16_vector",
1101 .dependencies = featureSet(&[_]Feature{}),
1102 };
1103 result[@intFromEnum(Feature.SPV_NV_shader_image_footprint)] = .{
1104 .llvm_name = null,
1105 .description = "SPIR-V extension SPV_NV_shader_image_footprint",
1106 .dependencies = featureSet(&[_]Feature{}),
1107 };
1108 result[@intFromEnum(Feature.SPV_NV_shader_invocation_reorder)] = .{
1109 .llvm_name = null,
1110 .description = "SPIR-V extension SPV_NV_shader_invocation_reorder",
1111 .dependencies = featureSet(&[_]Feature{}),
1112 };
1113 result[@intFromEnum(Feature.SPV_NV_shader_sm_builtins)] = .{
1114 .llvm_name = null,
1115 .description = "SPIR-V extension SPV_NV_shader_sm_builtins",
1116 .dependencies = featureSet(&[_]Feature{}),
1117 };
1118 result[@intFromEnum(Feature.SPV_NV_shader_subgroup_partitioned)] = .{
1119 .llvm_name = null,
1120 .description = "SPIR-V extension SPV_NV_shader_subgroup_partitioned",
1121 .dependencies = featureSet(&[_]Feature{}),
1122 };
1123 result[@intFromEnum(Feature.SPV_NV_shading_rate)] = .{
1124 .llvm_name = null,
1125 .description = "SPIR-V extension SPV_NV_shading_rate",
1126 .dependencies = featureSet(&[_]Feature{}),
1127 };
1128 result[@intFromEnum(Feature.SPV_NV_stereo_view_rendering)] = .{
1129 .llvm_name = null,
1130 .description = "SPIR-V extension SPV_NV_stereo_view_rendering",
1131 .dependencies = featureSet(&[_]Feature{}),
1132 };
1133 result[@intFromEnum(Feature.SPV_NV_tensor_addressing)] = .{
1134 .llvm_name = null,
1135 .description = "SPIR-V extension SPV_NV_tensor_addressing",
1136 .dependencies = featureSet(&[_]Feature{}),
1137 };
1138 result[@intFromEnum(Feature.SPV_NV_viewport_array2)] = .{
1139 .llvm_name = null,
1140 .description = "SPIR-V extension SPV_NV_viewport_array2",
1141 .dependencies = featureSet(&[_]Feature{}),
1142 };
1143 result[@intFromEnum(Feature.SPV_QCOM_image_processing)] = .{
1144 .llvm_name = null,
1145 .description = "SPIR-V extension SPV_QCOM_image_processing",
1146 .dependencies = featureSet(&[_]Feature{}),
1147 };
1148 result[@intFromEnum(Feature.SPV_QCOM_image_processing2)] = .{
1149 .llvm_name = null,
1150 .description = "SPIR-V extension SPV_QCOM_image_processing2",
1151 .dependencies = featureSet(&[_]Feature{}),
1152 };
1153 result[@intFromEnum(Feature.Matrix)] = .{
1154 .llvm_name = null,
1155 .description = "Enable SPIR-V capability Matrix",
1156 .dependencies = featureSet(&[_]Feature{
1157 .v1_0,
1158 }),
1159 };
1160 result[@intFromEnum(Feature.Shader)] = .{
1161 .llvm_name = null,122 .llvm_name = null,
1162 .description = "Enable SPIR-V capability Shader",123 .description = "Enable SPIR-V capability Shader",
1163 .dependencies = featureSet(&[_]Feature{124 .dependencies = featureSet(&[_]Feature{ .v1_0, .matrix }),
1164 .v1_0,
1165 .Matrix,
1166 }),
1167 };
1168 result[@intFromEnum(Feature.Geometry)] = .{
1169 .llvm_name = null,
1170 .description = "Enable SPIR-V capability Geometry",
1171 .dependencies = featureSet(&[_]Feature{
1172 .v1_0,
1173 .Shader,
1174 }),
1175 };
1176 result[@intFromEnum(Feature.Tessellation)] = .{
1177 .llvm_name = null,
1178 .description = "Enable SPIR-V capability Tessellation",
1179 .dependencies = featureSet(&[_]Feature{
1180 .v1_0,
1181 .Shader,
1182 }),
1183 };
1184 result[@intFromEnum(Feature.Addresses)] = .{
1185 .llvm_name = null,
1186 .description = "Enable SPIR-V capability Addresses",
1187 .dependencies = featureSet(&[_]Feature{
1188 .v1_0,
1189 }),
1190 };
1191 result[@intFromEnum(Feature.Linkage)] = .{
1192 .llvm_name = null,
1193 .description = "Enable SPIR-V capability Linkage",
1194 .dependencies = featureSet(&[_]Feature{
1195 .v1_0,
1196 }),
1197 };
1198 result[@intFromEnum(Feature.Kernel)] = .{
1199 .llvm_name = null,
1200 .description = "Enable SPIR-V capability Kernel",
1201 .dependencies = featureSet(&[_]Feature{
1202 .v1_0,
1203 }),
1204 };
1205 result[@intFromEnum(Feature.Vector16)] = .{
1206 .llvm_name = null,
1207 .description = "Enable SPIR-V capability Vector16",
1208 .dependencies = featureSet(&[_]Feature{
1209 .v1_0,
1210 .Kernel,
1211 }),
1212 };
1213 result[@intFromEnum(Feature.Float16Buffer)] = .{
1214 .llvm_name = null,
1215 .description = "Enable SPIR-V capability Float16Buffer",
1216 .dependencies = featureSet(&[_]Feature{
1217 .v1_0,
1218 .Kernel,
1219 }),
1220 };
1221 result[@intFromEnum(Feature.Float16)] = .{
1222 .llvm_name = null,
1223 .description = "Enable SPIR-V capability Float16",
1224 .dependencies = featureSet(&[_]Feature{
1225 .v1_0,
1226 }),
1227 };
1228 result[@intFromEnum(Feature.Float64)] = .{
1229 .llvm_name = null,
1230 .description = "Enable SPIR-V capability Float64",
1231 .dependencies = featureSet(&[_]Feature{
1232 .v1_0,
1233 }),
1234 };
1235 result[@intFromEnum(Feature.Int64)] = .{
1236 .llvm_name = null,
1237 .description = "Enable SPIR-V capability Int64",
1238 .dependencies = featureSet(&[_]Feature{
1239 .v1_0,
1240 }),
1241 };
1242 result[@intFromEnum(Feature.Int64Atomics)] = .{
1243 .llvm_name = null,
1244 .description = "Enable SPIR-V capability Int64Atomics",
1245 .dependencies = featureSet(&[_]Feature{
1246 .v1_0,
1247 .Int64,
1248 }),
1249 };
1250 result[@intFromEnum(Feature.ImageBasic)] = .{
1251 .llvm_name = null,
1252 .description = "Enable SPIR-V capability ImageBasic",
1253 .dependencies = featureSet(&[_]Feature{
1254 .v1_0,
1255 .Kernel,
1256 }),
1257 };
1258 result[@intFromEnum(Feature.ImageReadWrite)] = .{
1259 .llvm_name = null,
1260 .description = "Enable SPIR-V capability ImageReadWrite",
1261 .dependencies = featureSet(&[_]Feature{
1262 .v1_0,
1263 .ImageBasic,
1264 }),
1265 };
1266 result[@intFromEnum(Feature.ImageMipmap)] = .{
1267 .llvm_name = null,
1268 .description = "Enable SPIR-V capability ImageMipmap",
1269 .dependencies = featureSet(&[_]Feature{
1270 .v1_0,
1271 .ImageBasic,
1272 }),
1273 };
1274 result[@intFromEnum(Feature.Pipes)] = .{
1275 .llvm_name = null,
1276 .description = "Enable SPIR-V capability Pipes",
1277 .dependencies = featureSet(&[_]Feature{
1278 .v1_0,
1279 .Kernel,
1280 }),
1281 };
1282 result[@intFromEnum(Feature.Groups)] = .{
1283 .llvm_name = null,
1284 .description = "Enable SPIR-V capability Groups",
1285 .dependencies = featureSet(&[_]Feature{
1286 .v1_0,
1287 }),
1288 };
1289 result[@intFromEnum(Feature.DeviceEnqueue)] = .{
1290 .llvm_name = null,
1291 .description = "Enable SPIR-V capability DeviceEnqueue",
1292 .dependencies = featureSet(&[_]Feature{
1293 .v1_0,
1294 .Kernel,
1295 }),
1296 };
1297 result[@intFromEnum(Feature.LiteralSampler)] = .{
1298 .llvm_name = null,
1299 .description = "Enable SPIR-V capability LiteralSampler",
1300 .dependencies = featureSet(&[_]Feature{
1301 .v1_0,
1302 .Kernel,
1303 }),
1304 };
1305 result[@intFromEnum(Feature.AtomicStorage)] = .{
1306 .llvm_name = null,
1307 .description = "Enable SPIR-V capability AtomicStorage",
1308 .dependencies = featureSet(&[_]Feature{
1309 .v1_0,
1310 .Shader,
1311 }),
1312 };
1313 result[@intFromEnum(Feature.Int16)] = .{
1314 .llvm_name = null,
1315 .description = "Enable SPIR-V capability Int16",
1316 .dependencies = featureSet(&[_]Feature{
1317 .v1_0,
1318 }),
1319 };
1320 result[@intFromEnum(Feature.TessellationPointSize)] = .{
1321 .llvm_name = null,
1322 .description = "Enable SPIR-V capability TessellationPointSize",
1323 .dependencies = featureSet(&[_]Feature{
1324 .v1_0,
1325 .Tessellation,
1326 }),
1327 };
1328 result[@intFromEnum(Feature.GeometryPointSize)] = .{
1329 .llvm_name = null,
1330 .description = "Enable SPIR-V capability GeometryPointSize",
1331 .dependencies = featureSet(&[_]Feature{
1332 .v1_0,
1333 .Geometry,
1334 }),
1335 };
1336 result[@intFromEnum(Feature.ImageGatherExtended)] = .{
1337 .llvm_name = null,
1338 .description = "Enable SPIR-V capability ImageGatherExtended",
1339 .dependencies = featureSet(&[_]Feature{
1340 .v1_0,
1341 .Shader,
1342 }),
1343 };
1344 result[@intFromEnum(Feature.StorageImageMultisample)] = .{
1345 .llvm_name = null,
1346 .description = "Enable SPIR-V capability StorageImageMultisample",
1347 .dependencies = featureSet(&[_]Feature{
1348 .v1_0,
1349 .Shader,
1350 }),
1351 };
1352 result[@intFromEnum(Feature.UniformBufferArrayDynamicIndexing)] = .{
1353 .llvm_name = null,
1354 .description = "Enable SPIR-V capability UniformBufferArrayDynamicIndexing",
1355 .dependencies = featureSet(&[_]Feature{
1356 .v1_0,
1357 .Shader,
1358 }),
1359 };
1360 result[@intFromEnum(Feature.SampledImageArrayDynamicIndexing)] = .{
1361 .llvm_name = null,
1362 .description = "Enable SPIR-V capability SampledImageArrayDynamicIndexing",
1363 .dependencies = featureSet(&[_]Feature{
1364 .v1_0,
1365 .Shader,
1366 }),
1367 };
1368 result[@intFromEnum(Feature.StorageBufferArrayDynamicIndexing)] = .{
1369 .llvm_name = null,
1370 .description = "Enable SPIR-V capability StorageBufferArrayDynamicIndexing",
1371 .dependencies = featureSet(&[_]Feature{
1372 .v1_0,
1373 .Shader,
1374 }),
1375 };
1376 result[@intFromEnum(Feature.StorageImageArrayDynamicIndexing)] = .{
1377 .llvm_name = null,
1378 .description = "Enable SPIR-V capability StorageImageArrayDynamicIndexing",
1379 .dependencies = featureSet(&[_]Feature{
1380 .v1_0,
1381 .Shader,
1382 }),
1383 };
1384 result[@intFromEnum(Feature.ClipDistance)] = .{
1385 .llvm_name = null,
1386 .description = "Enable SPIR-V capability ClipDistance",
1387 .dependencies = featureSet(&[_]Feature{
1388 .v1_0,
1389 .Shader,
1390 }),
1391 };
1392 result[@intFromEnum(Feature.CullDistance)] = .{
1393 .llvm_name = null,
1394 .description = "Enable SPIR-V capability CullDistance",
1395 .dependencies = featureSet(&[_]Feature{
1396 .v1_0,
1397 .Shader,
1398 }),
1399 };
1400 result[@intFromEnum(Feature.ImageCubeArray)] = .{
1401 .llvm_name = null,
1402 .description = "Enable SPIR-V capability ImageCubeArray",
1403 .dependencies = featureSet(&[_]Feature{
1404 .v1_0,
1405 .SampledCubeArray,
1406 }),
1407 };
1408 result[@intFromEnum(Feature.SampleRateShading)] = .{
1409 .llvm_name = null,
1410 .description = "Enable SPIR-V capability SampleRateShading",
1411 .dependencies = featureSet(&[_]Feature{
1412 .v1_0,
1413 .Shader,
1414 }),
1415 };
1416 result[@intFromEnum(Feature.ImageRect)] = .{
1417 .llvm_name = null,
1418 .description = "Enable SPIR-V capability ImageRect",
1419 .dependencies = featureSet(&[_]Feature{
1420 .v1_0,
1421 .SampledRect,
1422 }),
1423 };
1424 result[@intFromEnum(Feature.SampledRect)] = .{
1425 .llvm_name = null,
1426 .description = "Enable SPIR-V capability SampledRect",
1427 .dependencies = featureSet(&[_]Feature{
1428 .v1_0,
1429 .Shader,
1430 }),
1431 };
1432 result[@intFromEnum(Feature.GenericPointer)] = .{
1433 .llvm_name = null,
1434 .description = "Enable SPIR-V capability GenericPointer",
1435 .dependencies = featureSet(&[_]Feature{
1436 .v1_0,
1437 .Addresses,
1438 }),
1439 };
1440 result[@intFromEnum(Feature.Int8)] = .{
1441 .llvm_name = null,
1442 .description = "Enable SPIR-V capability Int8",
1443 .dependencies = featureSet(&[_]Feature{
1444 .v1_0,
1445 }),
1446 };
1447 result[@intFromEnum(Feature.InputAttachment)] = .{
1448 .llvm_name = null,
1449 .description = "Enable SPIR-V capability InputAttachment",
1450 .dependencies = featureSet(&[_]Feature{
1451 .v1_0,
1452 .Shader,
1453 }),
1454 };
1455 result[@intFromEnum(Feature.SparseResidency)] = .{
1456 .llvm_name = null,
1457 .description = "Enable SPIR-V capability SparseResidency",
1458 .dependencies = featureSet(&[_]Feature{
1459 .v1_0,
1460 .Shader,
1461 }),
1462 };
1463 result[@intFromEnum(Feature.MinLod)] = .{
1464 .llvm_name = null,
1465 .description = "Enable SPIR-V capability MinLod",
1466 .dependencies = featureSet(&[_]Feature{
1467 .v1_0,
1468 .Shader,
1469 }),
1470 };
1471 result[@intFromEnum(Feature.Sampled1D)] = .{
1472 .llvm_name = null,
1473 .description = "Enable SPIR-V capability Sampled1D",
1474 .dependencies = featureSet(&[_]Feature{
1475 .v1_0,
1476 }),
1477 };
1478 result[@intFromEnum(Feature.Image1D)] = .{
1479 .llvm_name = null,
1480 .description = "Enable SPIR-V capability Image1D",
1481 .dependencies = featureSet(&[_]Feature{
1482 .v1_0,
1483 .Sampled1D,
1484 }),
1485 };
1486 result[@intFromEnum(Feature.SampledCubeArray)] = .{
1487 .llvm_name = null,
1488 .description = "Enable SPIR-V capability SampledCubeArray",
1489 .dependencies = featureSet(&[_]Feature{
1490 .v1_0,
1491 .Shader,
1492 }),
1493 };
1494 result[@intFromEnum(Feature.SampledBuffer)] = .{
1495 .llvm_name = null,
1496 .description = "Enable SPIR-V capability SampledBuffer",
1497 .dependencies = featureSet(&[_]Feature{
1498 .v1_0,
1499 }),
1500 };
1501 result[@intFromEnum(Feature.ImageBuffer)] = .{
1502 .llvm_name = null,
1503 .description = "Enable SPIR-V capability ImageBuffer",
1504 .dependencies = featureSet(&[_]Feature{
1505 .v1_0,
1506 .SampledBuffer,
1507 }),
1508 };
1509 result[@intFromEnum(Feature.ImageMSArray)] = .{
1510 .llvm_name = null,
1511 .description = "Enable SPIR-V capability ImageMSArray",
1512 .dependencies = featureSet(&[_]Feature{
1513 .v1_0,
1514 .Shader,
1515 }),
1516 };
1517 result[@intFromEnum(Feature.StorageImageExtendedFormats)] = .{
1518 .llvm_name = null,
1519 .description = "Enable SPIR-V capability StorageImageExtendedFormats",
1520 .dependencies = featureSet(&[_]Feature{
1521 .v1_0,
1522 .Shader,
1523 }),
1524 };
1525 result[@intFromEnum(Feature.ImageQuery)] = .{
1526 .llvm_name = null,
1527 .description = "Enable SPIR-V capability ImageQuery",
1528 .dependencies = featureSet(&[_]Feature{
1529 .v1_0,
1530 .Shader,
1531 }),
1532 };
1533 result[@intFromEnum(Feature.DerivativeControl)] = .{
1534 .llvm_name = null,
1535 .description = "Enable SPIR-V capability DerivativeControl",
1536 .dependencies = featureSet(&[_]Feature{
1537 .v1_0,
1538 .Shader,
1539 }),
1540 };
1541 result[@intFromEnum(Feature.InterpolationFunction)] = .{
1542 .llvm_name = null,
1543 .description = "Enable SPIR-V capability InterpolationFunction",
1544 .dependencies = featureSet(&[_]Feature{
1545 .v1_0,
1546 .Shader,
1547 }),
1548 };
1549 result[@intFromEnum(Feature.TransformFeedback)] = .{
1550 .llvm_name = null,
1551 .description = "Enable SPIR-V capability TransformFeedback",
1552 .dependencies = featureSet(&[_]Feature{
1553 .v1_0,
1554 .Shader,
1555 }),
1556 };
1557 result[@intFromEnum(Feature.GeometryStreams)] = .{
1558 .llvm_name = null,
1559 .description = "Enable SPIR-V capability GeometryStreams",
1560 .dependencies = featureSet(&[_]Feature{
1561 .v1_0,
1562 .Geometry,
1563 }),
1564 };
1565 result[@intFromEnum(Feature.StorageImageReadWithoutFormat)] = .{
1566 .llvm_name = null,
1567 .description = "Enable SPIR-V capability StorageImageReadWithoutFormat",
1568 .dependencies = featureSet(&[_]Feature{
1569 .v1_0,
1570 .Shader,
1571 }),
1572 };
1573 result[@intFromEnum(Feature.StorageImageWriteWithoutFormat)] = .{
1574 .llvm_name = null,
1575 .description = "Enable SPIR-V capability StorageImageWriteWithoutFormat",
1576 .dependencies = featureSet(&[_]Feature{
1577 .v1_0,
1578 .Shader,
1579 }),
1580 };
1581 result[@intFromEnum(Feature.MultiViewport)] = .{
1582 .llvm_name = null,
1583 .description = "Enable SPIR-V capability MultiViewport",
1584 .dependencies = featureSet(&[_]Feature{
1585 .v1_0,
1586 .Geometry,
1587 }),
1588 };
1589 result[@intFromEnum(Feature.SubgroupDispatch)] = .{
1590 .llvm_name = null,
1591 .description = "Enable SPIR-V capability SubgroupDispatch",
1592 .dependencies = featureSet(&[_]Feature{
1593 .v1_1,
1594 .DeviceEnqueue,
1595 }),
1596 };
1597 result[@intFromEnum(Feature.NamedBarrier)] = .{
1598 .llvm_name = null,
1599 .description = "Enable SPIR-V capability NamedBarrier",
1600 .dependencies = featureSet(&[_]Feature{
1601 .v1_1,
1602 .Kernel,
1603 }),
1604 };
1605 result[@intFromEnum(Feature.PipeStorage)] = .{
1606 .llvm_name = null,
1607 .description = "Enable SPIR-V capability PipeStorage",
1608 .dependencies = featureSet(&[_]Feature{
1609 .v1_1,
1610 .Pipes,
1611 }),
1612 };
1613 result[@intFromEnum(Feature.GroupNonUniform)] = .{
1614 .llvm_name = null,
1615 .description = "Enable SPIR-V capability GroupNonUniform",
1616 .dependencies = featureSet(&[_]Feature{
1617 .v1_3,
1618 }),
1619 };
1620 result[@intFromEnum(Feature.GroupNonUniformVote)] = .{
1621 .llvm_name = null,
1622 .description = "Enable SPIR-V capability GroupNonUniformVote",
1623 .dependencies = featureSet(&[_]Feature{
1624 .v1_3,
1625 .GroupNonUniform,
1626 }),
1627 };
1628 result[@intFromEnum(Feature.GroupNonUniformArithmetic)] = .{
1629 .llvm_name = null,
1630 .description = "Enable SPIR-V capability GroupNonUniformArithmetic",
1631 .dependencies = featureSet(&[_]Feature{
1632 .v1_3,
1633 .GroupNonUniform,
1634 }),
1635 };
1636 result[@intFromEnum(Feature.GroupNonUniformBallot)] = .{
1637 .llvm_name = null,
1638 .description = "Enable SPIR-V capability GroupNonUniformBallot",
1639 .dependencies = featureSet(&[_]Feature{
1640 .v1_3,
1641 .GroupNonUniform,
1642 }),
1643 };
1644 result[@intFromEnum(Feature.GroupNonUniformShuffle)] = .{
1645 .llvm_name = null,
1646 .description = "Enable SPIR-V capability GroupNonUniformShuffle",
1647 .dependencies = featureSet(&[_]Feature{
1648 .v1_3,
1649 .GroupNonUniform,
1650 }),
1651 };
1652 result[@intFromEnum(Feature.GroupNonUniformShuffleRelative)] = .{
1653 .llvm_name = null,
1654 .description = "Enable SPIR-V capability GroupNonUniformShuffleRelative",
1655 .dependencies = featureSet(&[_]Feature{
1656 .v1_3,
1657 .GroupNonUniform,
1658 }),
1659 };
1660 result[@intFromEnum(Feature.GroupNonUniformClustered)] = .{
1661 .llvm_name = null,
1662 .description = "Enable SPIR-V capability GroupNonUniformClustered",
1663 .dependencies = featureSet(&[_]Feature{
1664 .v1_3,
1665 .GroupNonUniform,
1666 }),
1667 };
1668 result[@intFromEnum(Feature.GroupNonUniformQuad)] = .{
1669 .llvm_name = null,
1670 .description = "Enable SPIR-V capability GroupNonUniformQuad",
1671 .dependencies = featureSet(&[_]Feature{
1672 .v1_3,
1673 .GroupNonUniform,
1674 }),
1675 };
1676 result[@intFromEnum(Feature.ShaderLayer)] = .{
1677 .llvm_name = null,
1678 .description = "Enable SPIR-V capability ShaderLayer",
1679 .dependencies = featureSet(&[_]Feature{
1680 .v1_5,
1681 }),
1682 };
1683 result[@intFromEnum(Feature.ShaderViewportIndex)] = .{
1684 .llvm_name = null,
1685 .description = "Enable SPIR-V capability ShaderViewportIndex",
1686 .dependencies = featureSet(&[_]Feature{
1687 .v1_5,
1688 }),
1689 };
1690 result[@intFromEnum(Feature.UniformDecoration)] = .{
1691 .llvm_name = null,
1692 .description = "Enable SPIR-V capability UniformDecoration",
1693 .dependencies = featureSet(&[_]Feature{
1694 .v1_6,
1695 }),
1696 };
1697 result[@intFromEnum(Feature.CoreBuiltinsARM)] = .{
1698 .llvm_name = null,
1699 .description = "Enable SPIR-V capability CoreBuiltinsARM",
1700 .dependencies = featureSet(&[_]Feature{}),
1701 };
1702 result[@intFromEnum(Feature.TileImageColorReadAccessEXT)] = .{
1703 .llvm_name = null,
1704 .description = "Enable SPIR-V capability TileImageColorReadAccessEXT",
1705 .dependencies = featureSet(&[_]Feature{}),
1706 };
1707 result[@intFromEnum(Feature.TileImageDepthReadAccessEXT)] = .{
1708 .llvm_name = null,
1709 .description = "Enable SPIR-V capability TileImageDepthReadAccessEXT",
1710 .dependencies = featureSet(&[_]Feature{}),
1711 };
1712 result[@intFromEnum(Feature.TileImageStencilReadAccessEXT)] = .{
1713 .llvm_name = null,
1714 .description = "Enable SPIR-V capability TileImageStencilReadAccessEXT",
1715 .dependencies = featureSet(&[_]Feature{}),
1716 };
1717 result[@intFromEnum(Feature.CooperativeMatrixLayoutsARM)] = .{
1718 .llvm_name = null,
1719 .description = "Enable SPIR-V capability CooperativeMatrixLayoutsARM",
1720 .dependencies = featureSet(&[_]Feature{}),
1721 };
1722 result[@intFromEnum(Feature.FragmentShadingRateKHR)] = .{
1723 .llvm_name = null,
1724 .description = "Enable SPIR-V capability FragmentShadingRateKHR",
1725 .dependencies = featureSet(&[_]Feature{
1726 .Shader,
1727 }),
1728 };
1729 result[@intFromEnum(Feature.SubgroupBallotKHR)] = .{
1730 .llvm_name = null,
1731 .description = "Enable SPIR-V capability SubgroupBallotKHR",
1732 .dependencies = featureSet(&[_]Feature{}),
1733 };
1734 result[@intFromEnum(Feature.DrawParameters)] = .{
1735 .llvm_name = null,
1736 .description = "Enable SPIR-V capability DrawParameters",
1737 .dependencies = featureSet(&[_]Feature{
1738 .v1_3,
1739 .Shader,
1740 }),
1741 };
1742 result[@intFromEnum(Feature.WorkgroupMemoryExplicitLayoutKHR)] = .{
1743 .llvm_name = null,
1744 .description = "Enable SPIR-V capability WorkgroupMemoryExplicitLayoutKHR",
1745 .dependencies = featureSet(&[_]Feature{
1746 .Shader,
1747 }),
1748 };
1749 result[@intFromEnum(Feature.WorkgroupMemoryExplicitLayout8BitAccessKHR)] = .{
1750 .llvm_name = null,
1751 .description = "Enable SPIR-V capability WorkgroupMemoryExplicitLayout8BitAccessKHR",
1752 .dependencies = featureSet(&[_]Feature{
1753 .WorkgroupMemoryExplicitLayoutKHR,
1754 }),
1755 };
1756 result[@intFromEnum(Feature.WorkgroupMemoryExplicitLayout16BitAccessKHR)] = .{
1757 .llvm_name = null,
1758 .description = "Enable SPIR-V capability WorkgroupMemoryExplicitLayout16BitAccessKHR",
1759 .dependencies = featureSet(&[_]Feature{
1760 .WorkgroupMemoryExplicitLayoutKHR,
1761 }),
1762 };
1763 result[@intFromEnum(Feature.SubgroupVoteKHR)] = .{
1764 .llvm_name = null,
1765 .description = "Enable SPIR-V capability SubgroupVoteKHR",
1766 .dependencies = featureSet(&[_]Feature{}),
1767 };
1768 result[@intFromEnum(Feature.StorageBuffer16BitAccess)] = .{
1769 .llvm_name = null,
1770 .description = "Enable SPIR-V capability StorageBuffer16BitAccess",
1771 .dependencies = featureSet(&[_]Feature{
1772 .v1_3,
1773 }),
1774 };
1775 result[@intFromEnum(Feature.UniformAndStorageBuffer16BitAccess)] = .{
1776 .llvm_name = null,
1777 .description = "Enable SPIR-V capability UniformAndStorageBuffer16BitAccess",
1778 .dependencies = featureSet(&[_]Feature{
1779 .v1_3,
1780 .StorageBuffer16BitAccess,
1781 }),
1782 };
1783 result[@intFromEnum(Feature.StoragePushConstant16)] = .{
1784 .llvm_name = null,
1785 .description = "Enable SPIR-V capability StoragePushConstant16",
1786 .dependencies = featureSet(&[_]Feature{
1787 .v1_3,
1788 }),
1789 };
1790 result[@intFromEnum(Feature.StorageInputOutput16)] = .{
1791 .llvm_name = null,
1792 .description = "Enable SPIR-V capability StorageInputOutput16",
1793 .dependencies = featureSet(&[_]Feature{
1794 .v1_3,
1795 }),
1796 };
1797 result[@intFromEnum(Feature.DeviceGroup)] = .{
1798 .llvm_name = null,
1799 .description = "Enable SPIR-V capability DeviceGroup",
1800 .dependencies = featureSet(&[_]Feature{
1801 .v1_3,
1802 }),
1803 };
1804 result[@intFromEnum(Feature.MultiView)] = .{
1805 .llvm_name = null,
1806 .description = "Enable SPIR-V capability MultiView",
1807 .dependencies = featureSet(&[_]Feature{
1808 .v1_3,
1809 .Shader,
1810 }),
1811 };
1812 result[@intFromEnum(Feature.VariablePointersStorageBuffer)] = .{
1813 .llvm_name = null,
1814 .description = "Enable SPIR-V capability VariablePointersStorageBuffer",
1815 .dependencies = featureSet(&[_]Feature{
1816 .v1_3,
1817 .Shader,
1818 }),
1819 };
1820 result[@intFromEnum(Feature.VariablePointers)] = .{
1821 .llvm_name = null,
1822 .description = "Enable SPIR-V capability VariablePointers",
1823 .dependencies = featureSet(&[_]Feature{
1824 .v1_3,
1825 .VariablePointersStorageBuffer,
1826 }),
1827 };
1828 result[@intFromEnum(Feature.AtomicStorageOps)] = .{
1829 .llvm_name = null,
1830 .description = "Enable SPIR-V capability AtomicStorageOps",
1831 .dependencies = featureSet(&[_]Feature{}),
1832 };
1833 result[@intFromEnum(Feature.SampleMaskPostDepthCoverage)] = .{
1834 .llvm_name = null,
1835 .description = "Enable SPIR-V capability SampleMaskPostDepthCoverage",
1836 .dependencies = featureSet(&[_]Feature{}),
1837 };
1838 result[@intFromEnum(Feature.StorageBuffer8BitAccess)] = .{
1839 .llvm_name = null,
1840 .description = "Enable SPIR-V capability StorageBuffer8BitAccess",
1841 .dependencies = featureSet(&[_]Feature{
1842 .v1_5,
1843 }),
1844 };
1845 result[@intFromEnum(Feature.UniformAndStorageBuffer8BitAccess)] = .{
1846 .llvm_name = null,
1847 .description = "Enable SPIR-V capability UniformAndStorageBuffer8BitAccess",
1848 .dependencies = featureSet(&[_]Feature{
1849 .v1_5,
1850 .StorageBuffer8BitAccess,
1851 }),
1852 };
1853 result[@intFromEnum(Feature.StoragePushConstant8)] = .{
1854 .llvm_name = null,
1855 .description = "Enable SPIR-V capability StoragePushConstant8",
1856 .dependencies = featureSet(&[_]Feature{
1857 .v1_5,
1858 }),
1859 };
1860 result[@intFromEnum(Feature.DenormPreserve)] = .{
1861 .llvm_name = null,
1862 .description = "Enable SPIR-V capability DenormPreserve",
1863 .dependencies = featureSet(&[_]Feature{
1864 .v1_4,
1865 }),
1866 };
1867 result[@intFromEnum(Feature.DenormFlushToZero)] = .{
1868 .llvm_name = null,
1869 .description = "Enable SPIR-V capability DenormFlushToZero",
1870 .dependencies = featureSet(&[_]Feature{
1871 .v1_4,
1872 }),
1873 };
1874 result[@intFromEnum(Feature.SignedZeroInfNanPreserve)] = .{
1875 .llvm_name = null,
1876 .description = "Enable SPIR-V capability SignedZeroInfNanPreserve",
1877 .dependencies = featureSet(&[_]Feature{
1878 .v1_4,
1879 }),
1880 };
1881 result[@intFromEnum(Feature.RoundingModeRTE)] = .{
1882 .llvm_name = null,
1883 .description = "Enable SPIR-V capability RoundingModeRTE",
1884 .dependencies = featureSet(&[_]Feature{
1885 .v1_4,
1886 }),
1887 };
1888 result[@intFromEnum(Feature.RoundingModeRTZ)] = .{
1889 .llvm_name = null,
1890 .description = "Enable SPIR-V capability RoundingModeRTZ",
1891 .dependencies = featureSet(&[_]Feature{
1892 .v1_4,
1893 }),
1894 };
1895 result[@intFromEnum(Feature.RayQueryProvisionalKHR)] = .{
1896 .llvm_name = null,
1897 .description = "Enable SPIR-V capability RayQueryProvisionalKHR",
1898 .dependencies = featureSet(&[_]Feature{
1899 .Shader,
1900 }),
1901 };
1902 result[@intFromEnum(Feature.RayQueryKHR)] = .{
1903 .llvm_name = null,
1904 .description = "Enable SPIR-V capability RayQueryKHR",
1905 .dependencies = featureSet(&[_]Feature{
1906 .Shader,
1907 }),
1908 };
1909 result[@intFromEnum(Feature.UntypedPointersKHR)] = .{
1910 .llvm_name = null,
1911 .description = "Enable SPIR-V capability UntypedPointersKHR",
1912 .dependencies = featureSet(&[_]Feature{}),
1913 };
1914 result[@intFromEnum(Feature.RayTraversalPrimitiveCullingKHR)] = .{
1915 .llvm_name = null,
1916 .description = "Enable SPIR-V capability RayTraversalPrimitiveCullingKHR",
1917 .dependencies = featureSet(&[_]Feature{
1918 .RayQueryKHR,
1919 .RayTracingKHR,
1920 }),
1921 };
1922 result[@intFromEnum(Feature.RayTracingKHR)] = .{
1923 .llvm_name = null,
1924 .description = "Enable SPIR-V capability RayTracingKHR",
1925 .dependencies = featureSet(&[_]Feature{
1926 .Shader,
1927 }),
1928 };
1929 result[@intFromEnum(Feature.TextureSampleWeightedQCOM)] = .{
1930 .llvm_name = null,
1931 .description = "Enable SPIR-V capability TextureSampleWeightedQCOM",
1932 .dependencies = featureSet(&[_]Feature{}),
1933 };
1934 result[@intFromEnum(Feature.TextureBoxFilterQCOM)] = .{
1935 .llvm_name = null,
1936 .description = "Enable SPIR-V capability TextureBoxFilterQCOM",
1937 .dependencies = featureSet(&[_]Feature{}),
1938 };
1939 result[@intFromEnum(Feature.TextureBlockMatchQCOM)] = .{
1940 .llvm_name = null,
1941 .description = "Enable SPIR-V capability TextureBlockMatchQCOM",
1942 .dependencies = featureSet(&[_]Feature{}),
1943 };
1944 result[@intFromEnum(Feature.TextureBlockMatch2QCOM)] = .{
1945 .llvm_name = null,
1946 .description = "Enable SPIR-V capability TextureBlockMatch2QCOM",
1947 .dependencies = featureSet(&[_]Feature{}),
1948 };
1949 result[@intFromEnum(Feature.Float16ImageAMD)] = .{
1950 .llvm_name = null,
1951 .description = "Enable SPIR-V capability Float16ImageAMD",
1952 .dependencies = featureSet(&[_]Feature{
1953 .Shader,
1954 }),
1955 };
1956 result[@intFromEnum(Feature.ImageGatherBiasLodAMD)] = .{
1957 .llvm_name = null,
1958 .description = "Enable SPIR-V capability ImageGatherBiasLodAMD",
1959 .dependencies = featureSet(&[_]Feature{
1960 .Shader,
1961 }),
1962 };
1963 result[@intFromEnum(Feature.FragmentMaskAMD)] = .{
1964 .llvm_name = null,
1965 .description = "Enable SPIR-V capability FragmentMaskAMD",
1966 .dependencies = featureSet(&[_]Feature{
1967 .Shader,
1968 }),
1969 };
1970 result[@intFromEnum(Feature.StencilExportEXT)] = .{
1971 .llvm_name = null,
1972 .description = "Enable SPIR-V capability StencilExportEXT",
1973 .dependencies = featureSet(&[_]Feature{
1974 .Shader,
1975 }),
1976 };
1977 result[@intFromEnum(Feature.ImageReadWriteLodAMD)] = .{
1978 .llvm_name = null,
1979 .description = "Enable SPIR-V capability ImageReadWriteLodAMD",
1980 .dependencies = featureSet(&[_]Feature{
1981 .Shader,
1982 }),
1983 };
1984 result[@intFromEnum(Feature.Int64ImageEXT)] = .{
1985 .llvm_name = null,
1986 .description = "Enable SPIR-V capability Int64ImageEXT",
1987 .dependencies = featureSet(&[_]Feature{
1988 .Shader,
1989 }),
1990 };
1991 result[@intFromEnum(Feature.ShaderClockKHR)] = .{
1992 .llvm_name = null,
1993 .description = "Enable SPIR-V capability ShaderClockKHR",
1994 .dependencies = featureSet(&[_]Feature{}),
1995 };
1996 result[@intFromEnum(Feature.ShaderEnqueueAMDX)] = .{
1997 .llvm_name = null,
1998 .description = "Enable SPIR-V capability ShaderEnqueueAMDX",
1999 .dependencies = featureSet(&[_]Feature{
2000 .Shader,
2001 }),
2002 };
2003 result[@intFromEnum(Feature.QuadControlKHR)] = .{
2004 .llvm_name = null,
2005 .description = "Enable SPIR-V capability QuadControlKHR",
2006 .dependencies = featureSet(&[_]Feature{}),
2007 };
2008 result[@intFromEnum(Feature.SampleMaskOverrideCoverageNV)] = .{
2009 .llvm_name = null,
2010 .description = "Enable SPIR-V capability SampleMaskOverrideCoverageNV",
2011 .dependencies = featureSet(&[_]Feature{
2012 .SampleRateShading,
2013 }),
2014 };
2015 result[@intFromEnum(Feature.GeometryShaderPassthroughNV)] = .{
2016 .llvm_name = null,
2017 .description = "Enable SPIR-V capability GeometryShaderPassthroughNV",
2018 .dependencies = featureSet(&[_]Feature{
2019 .Geometry,
2020 }),
2021 };
2022 result[@intFromEnum(Feature.ShaderViewportIndexLayerEXT)] = .{
2023 .llvm_name = null,
2024 .description = "Enable SPIR-V capability ShaderViewportIndexLayerEXT",
2025 .dependencies = featureSet(&[_]Feature{
2026 .MultiViewport,
2027 }),
2028 };
2029 result[@intFromEnum(Feature.ShaderViewportMaskNV)] = .{
2030 .llvm_name = null,
2031 .description = "Enable SPIR-V capability ShaderViewportMaskNV",
2032 .dependencies = featureSet(&[_]Feature{
2033 .ShaderViewportIndexLayerEXT,
2034 }),
2035 };
2036 result[@intFromEnum(Feature.ShaderStereoViewNV)] = .{
2037 .llvm_name = null,
2038 .description = "Enable SPIR-V capability ShaderStereoViewNV",
2039 .dependencies = featureSet(&[_]Feature{
2040 .ShaderViewportMaskNV,
2041 }),
2042 };
2043 result[@intFromEnum(Feature.PerViewAttributesNV)] = .{
2044 .llvm_name = null,
2045 .description = "Enable SPIR-V capability PerViewAttributesNV",
2046 .dependencies = featureSet(&[_]Feature{
2047 .MultiView,
2048 }),
2049 };
2050 result[@intFromEnum(Feature.FragmentFullyCoveredEXT)] = .{
2051 .llvm_name = null,
2052 .description = "Enable SPIR-V capability FragmentFullyCoveredEXT",
2053 .dependencies = featureSet(&[_]Feature{
2054 .Shader,
2055 }),
2056 };
2057 result[@intFromEnum(Feature.MeshShadingNV)] = .{
2058 .llvm_name = null,
2059 .description = "Enable SPIR-V capability MeshShadingNV",
2060 .dependencies = featureSet(&[_]Feature{
2061 .Shader,
2062 }),
2063 };
2064 result[@intFromEnum(Feature.ImageFootprintNV)] = .{
2065 .llvm_name = null,
2066 .description = "Enable SPIR-V capability ImageFootprintNV",
2067 .dependencies = featureSet(&[_]Feature{}),
2068 };
2069 result[@intFromEnum(Feature.MeshShadingEXT)] = .{
2070 .llvm_name = null,
2071 .description = "Enable SPIR-V capability MeshShadingEXT",
2072 .dependencies = featureSet(&[_]Feature{
2073 .Shader,
2074 }),
2075 };
2076 result[@intFromEnum(Feature.FragmentBarycentricKHR)] = .{
2077 .llvm_name = null,
2078 .description = "Enable SPIR-V capability FragmentBarycentricKHR",
2079 .dependencies = featureSet(&[_]Feature{}),
2080 };
2081 result[@intFromEnum(Feature.ComputeDerivativeGroupQuadsKHR)] = .{
2082 .llvm_name = null,
2083 .description = "Enable SPIR-V capability ComputeDerivativeGroupQuadsKHR",
2084 .dependencies = featureSet(&[_]Feature{
2085 .Shader,
2086 }),
2087 };
2088 result[@intFromEnum(Feature.FragmentDensityEXT)] = .{
2089 .llvm_name = null,
2090 .description = "Enable SPIR-V capability FragmentDensityEXT",
2091 .dependencies = featureSet(&[_]Feature{
2092 .Shader,
2093 }),
2094 };
2095 result[@intFromEnum(Feature.GroupNonUniformPartitionedNV)] = .{
2096 .llvm_name = null,
2097 .description = "Enable SPIR-V capability GroupNonUniformPartitionedNV",
2098 .dependencies = featureSet(&[_]Feature{}),
2099 };
2100 result[@intFromEnum(Feature.ShaderNonUniform)] = .{
2101 .llvm_name = null,
2102 .description = "Enable SPIR-V capability ShaderNonUniform",
2103 .dependencies = featureSet(&[_]Feature{
2104 .v1_5,
2105 .Shader,
2106 }),
2107 };
2108 result[@intFromEnum(Feature.RuntimeDescriptorArray)] = .{
2109 .llvm_name = null,
2110 .description = "Enable SPIR-V capability RuntimeDescriptorArray",
2111 .dependencies = featureSet(&[_]Feature{
2112 .v1_5,
2113 .Shader,
2114 }),
2115 };
2116 result[@intFromEnum(Feature.InputAttachmentArrayDynamicIndexing)] = .{
2117 .llvm_name = null,
2118 .description = "Enable SPIR-V capability InputAttachmentArrayDynamicIndexing",
2119 .dependencies = featureSet(&[_]Feature{
2120 .v1_5,
2121 .InputAttachment,
2122 }),
2123 };
2124 result[@intFromEnum(Feature.UniformTexelBufferArrayDynamicIndexing)] = .{
2125 .llvm_name = null,
2126 .description = "Enable SPIR-V capability UniformTexelBufferArrayDynamicIndexing",
2127 .dependencies = featureSet(&[_]Feature{
2128 .v1_5,
2129 .SampledBuffer,
2130 }),
2131 };
2132 result[@intFromEnum(Feature.StorageTexelBufferArrayDynamicIndexing)] = .{
2133 .llvm_name = null,
2134 .description = "Enable SPIR-V capability StorageTexelBufferArrayDynamicIndexing",
2135 .dependencies = featureSet(&[_]Feature{
2136 .v1_5,
2137 .ImageBuffer,
2138 }),
2139 };
2140 result[@intFromEnum(Feature.UniformBufferArrayNonUniformIndexing)] = .{
2141 .llvm_name = null,
2142 .description = "Enable SPIR-V capability UniformBufferArrayNonUniformIndexing",
2143 .dependencies = featureSet(&[_]Feature{
2144 .v1_5,
2145 .ShaderNonUniform,
2146 }),
2147 };
2148 result[@intFromEnum(Feature.SampledImageArrayNonUniformIndexing)] = .{
2149 .llvm_name = null,
2150 .description = "Enable SPIR-V capability SampledImageArrayNonUniformIndexing",
2151 .dependencies = featureSet(&[_]Feature{
2152 .v1_5,
2153 .ShaderNonUniform,
2154 }),
2155 };
2156 result[@intFromEnum(Feature.StorageBufferArrayNonUniformIndexing)] = .{
2157 .llvm_name = null,
2158 .description = "Enable SPIR-V capability StorageBufferArrayNonUniformIndexing",
2159 .dependencies = featureSet(&[_]Feature{
2160 .v1_5,
2161 .ShaderNonUniform,
2162 }),
2163 };
2164 result[@intFromEnum(Feature.StorageImageArrayNonUniformIndexing)] = .{
2165 .llvm_name = null,
2166 .description = "Enable SPIR-V capability StorageImageArrayNonUniformIndexing",
2167 .dependencies = featureSet(&[_]Feature{
2168 .v1_5,
2169 .ShaderNonUniform,
2170 }),
2171 };
2172 result[@intFromEnum(Feature.InputAttachmentArrayNonUniformIndexing)] = .{
2173 .llvm_name = null,
2174 .description = "Enable SPIR-V capability InputAttachmentArrayNonUniformIndexing",
2175 .dependencies = featureSet(&[_]Feature{
2176 .v1_5,
2177 .InputAttachment,
2178 .ShaderNonUniform,
2179 }),
2180 };
2181 result[@intFromEnum(Feature.UniformTexelBufferArrayNonUniformIndexing)] = .{
2182 .llvm_name = null,
2183 .description = "Enable SPIR-V capability UniformTexelBufferArrayNonUniformIndexing",
2184 .dependencies = featureSet(&[_]Feature{
2185 .v1_5,
2186 .SampledBuffer,
2187 .ShaderNonUniform,
2188 }),
2189 };
2190 result[@intFromEnum(Feature.StorageTexelBufferArrayNonUniformIndexing)] = .{
2191 .llvm_name = null,
2192 .description = "Enable SPIR-V capability StorageTexelBufferArrayNonUniformIndexing",
2193 .dependencies = featureSet(&[_]Feature{
2194 .v1_5,
2195 .ImageBuffer,
2196 .ShaderNonUniform,
2197 }),
2198 };
2199 result[@intFromEnum(Feature.RayTracingPositionFetchKHR)] = .{
2200 .llvm_name = null,
2201 .description = "Enable SPIR-V capability RayTracingPositionFetchKHR",
2202 .dependencies = featureSet(&[_]Feature{
2203 .Shader,
2204 }),
2205 };
2206 result[@intFromEnum(Feature.RayTracingNV)] = .{
2207 .llvm_name = null,
2208 .description = "Enable SPIR-V capability RayTracingNV",
2209 .dependencies = featureSet(&[_]Feature{
2210 .Shader,
2211 }),
2212 };
2213 result[@intFromEnum(Feature.RayTracingMotionBlurNV)] = .{
2214 .llvm_name = null,
2215 .description = "Enable SPIR-V capability RayTracingMotionBlurNV",
2216 .dependencies = featureSet(&[_]Feature{
2217 .Shader,
2218 }),
2219 };
2220 result[@intFromEnum(Feature.VulkanMemoryModel)] = .{
2221 .llvm_name = null,
2222 .description = "Enable SPIR-V capability VulkanMemoryModel",
2223 .dependencies = featureSet(&[_]Feature{
2224 .v1_5,
2225 }),
2226 };
2227 result[@intFromEnum(Feature.VulkanMemoryModelDeviceScope)] = .{
2228 .llvm_name = null,
2229 .description = "Enable SPIR-V capability VulkanMemoryModelDeviceScope",
2230 .dependencies = featureSet(&[_]Feature{
2231 .v1_5,
2232 }),
2233 };
2234 result[@intFromEnum(Feature.PhysicalStorageBufferAddresses)] = .{
2235 .llvm_name = null,
2236 .description = "Enable SPIR-V capability PhysicalStorageBufferAddresses",
2237 .dependencies = featureSet(&[_]Feature{
2238 .v1_5,
2239 .Shader,
2240 }),
2241 };
2242 result[@intFromEnum(Feature.ComputeDerivativeGroupLinearKHR)] = .{
2243 .llvm_name = null,
2244 .description = "Enable SPIR-V capability ComputeDerivativeGroupLinearKHR",
2245 .dependencies = featureSet(&[_]Feature{
2246 .Shader,
2247 }),
2248 };
2249 result[@intFromEnum(Feature.RayTracingProvisionalKHR)] = .{
2250 .llvm_name = null,
2251 .description = "Enable SPIR-V capability RayTracingProvisionalKHR",
2252 .dependencies = featureSet(&[_]Feature{
2253 .Shader,
2254 }),
2255 };
2256 result[@intFromEnum(Feature.CooperativeMatrixNV)] = .{
2257 .llvm_name = null,
2258 .description = "Enable SPIR-V capability CooperativeMatrixNV",
2259 .dependencies = featureSet(&[_]Feature{
2260 .Shader,
2261 }),
2262 };
2263 result[@intFromEnum(Feature.FragmentShaderSampleInterlockEXT)] = .{
2264 .llvm_name = null,
2265 .description = "Enable SPIR-V capability FragmentShaderSampleInterlockEXT",
2266 .dependencies = featureSet(&[_]Feature{
2267 .Shader,
2268 }),
2269 };
2270 result[@intFromEnum(Feature.FragmentShaderShadingRateInterlockEXT)] = .{
2271 .llvm_name = null,
2272 .description = "Enable SPIR-V capability FragmentShaderShadingRateInterlockEXT",
2273 .dependencies = featureSet(&[_]Feature{
2274 .Shader,
2275 }),
2276 };
2277 result[@intFromEnum(Feature.ShaderSMBuiltinsNV)] = .{
2278 .llvm_name = null,
2279 .description = "Enable SPIR-V capability ShaderSMBuiltinsNV",
2280 .dependencies = featureSet(&[_]Feature{
2281 .Shader,
2282 }),
2283 };
2284 result[@intFromEnum(Feature.FragmentShaderPixelInterlockEXT)] = .{
2285 .llvm_name = null,
2286 .description = "Enable SPIR-V capability FragmentShaderPixelInterlockEXT",
2287 .dependencies = featureSet(&[_]Feature{
2288 .Shader,
2289 }),
2290 };
2291 result[@intFromEnum(Feature.DemoteToHelperInvocation)] = .{
2292 .llvm_name = null,
2293 .description = "Enable SPIR-V capability DemoteToHelperInvocation",
2294 .dependencies = featureSet(&[_]Feature{
2295 .v1_6,
2296 .Shader,
2297 }),
2298 };
2299 result[@intFromEnum(Feature.DisplacementMicromapNV)] = .{
2300 .llvm_name = null,
2301 .description = "Enable SPIR-V capability DisplacementMicromapNV",
2302 .dependencies = featureSet(&[_]Feature{
2303 .Shader,
2304 }),
2305 };
2306 result[@intFromEnum(Feature.RayTracingOpacityMicromapEXT)] = .{
2307 .llvm_name = null,
2308 .description = "Enable SPIR-V capability RayTracingOpacityMicromapEXT",
2309 .dependencies = featureSet(&[_]Feature{
2310 .RayQueryKHR,
2311 .RayTracingKHR,
2312 }),
2313 };
2314 result[@intFromEnum(Feature.ShaderInvocationReorderNV)] = .{
2315 .llvm_name = null,
2316 .description = "Enable SPIR-V capability ShaderInvocationReorderNV",
2317 .dependencies = featureSet(&[_]Feature{
2318 .RayTracingKHR,
2319 }),
2320 };
2321 result[@intFromEnum(Feature.BindlessTextureNV)] = .{
2322 .llvm_name = null,
2323 .description = "Enable SPIR-V capability BindlessTextureNV",
2324 .dependencies = featureSet(&[_]Feature{}),
2325 };
2326 result[@intFromEnum(Feature.RayQueryPositionFetchKHR)] = .{
2327 .llvm_name = null,
2328 .description = "Enable SPIR-V capability RayQueryPositionFetchKHR",
2329 .dependencies = featureSet(&[_]Feature{
2330 .Shader,
2331 }),
2332 };
2333 result[@intFromEnum(Feature.CooperativeVectorNV)] = .{
2334 .llvm_name = null,
2335 .description = "Enable SPIR-V capability CooperativeVectorNV",
2336 .dependencies = featureSet(&[_]Feature{}),
2337 };
2338 result[@intFromEnum(Feature.AtomicFloat16VectorNV)] = .{
2339 .llvm_name = null,
2340 .description = "Enable SPIR-V capability AtomicFloat16VectorNV",
2341 .dependencies = featureSet(&[_]Feature{}),
2342 };
2343 result[@intFromEnum(Feature.RayTracingDisplacementMicromapNV)] = .{
2344 .llvm_name = null,
2345 .description = "Enable SPIR-V capability RayTracingDisplacementMicromapNV",
2346 .dependencies = featureSet(&[_]Feature{
2347 .RayTracingKHR,
2348 }),
2349 };
2350 result[@intFromEnum(Feature.RawAccessChainsNV)] = .{
2351 .llvm_name = null,
2352 .description = "Enable SPIR-V capability RawAccessChainsNV",
2353 .dependencies = featureSet(&[_]Feature{}),
2354 };
2355 result[@intFromEnum(Feature.RayTracingSpheresGeometryNV)] = .{
2356 .llvm_name = null,
2357 .description = "Enable SPIR-V capability RayTracingSpheresGeometryNV",
2358 .dependencies = featureSet(&[_]Feature{}),
2359 };
2360 result[@intFromEnum(Feature.RayTracingLinearSweptSpheresGeometryNV)] = .{
2361 .llvm_name = null,
2362 .description = "Enable SPIR-V capability RayTracingLinearSweptSpheresGeometryNV",
2363 .dependencies = featureSet(&[_]Feature{}),
2364 };
2365 result[@intFromEnum(Feature.CooperativeMatrixReductionsNV)] = .{
2366 .llvm_name = null,
2367 .description = "Enable SPIR-V capability CooperativeMatrixReductionsNV",
2368 .dependencies = featureSet(&[_]Feature{}),
2369 };
2370 result[@intFromEnum(Feature.CooperativeMatrixConversionsNV)] = .{
2371 .llvm_name = null,
2372 .description = "Enable SPIR-V capability CooperativeMatrixConversionsNV",
2373 .dependencies = featureSet(&[_]Feature{}),
2374 };
2375 result[@intFromEnum(Feature.CooperativeMatrixPerElementOperationsNV)] = .{
2376 .llvm_name = null,
2377 .description = "Enable SPIR-V capability CooperativeMatrixPerElementOperationsNV",
2378 .dependencies = featureSet(&[_]Feature{}),
2379 };
2380 result[@intFromEnum(Feature.CooperativeMatrixTensorAddressingNV)] = .{
2381 .llvm_name = null,
2382 .description = "Enable SPIR-V capability CooperativeMatrixTensorAddressingNV",
2383 .dependencies = featureSet(&[_]Feature{}),
2384 };
2385 result[@intFromEnum(Feature.CooperativeMatrixBlockLoadsNV)] = .{
2386 .llvm_name = null,
2387 .description = "Enable SPIR-V capability CooperativeMatrixBlockLoadsNV",
2388 .dependencies = featureSet(&[_]Feature{}),
2389 };
2390 result[@intFromEnum(Feature.CooperativeVectorTrainingNV)] = .{
2391 .llvm_name = null,
2392 .description = "Enable SPIR-V capability CooperativeVectorTrainingNV",
2393 .dependencies = featureSet(&[_]Feature{}),
2394 };
2395 result[@intFromEnum(Feature.RayTracingClusterAccelerationStructureNV)] = .{
2396 .llvm_name = null,
2397 .description = "Enable SPIR-V capability RayTracingClusterAccelerationStructureNV",
2398 .dependencies = featureSet(&[_]Feature{
2399 .RayTracingKHR,
2400 }),
2401 };
2402 result[@intFromEnum(Feature.TensorAddressingNV)] = .{
2403 .llvm_name = null,
2404 .description = "Enable SPIR-V capability TensorAddressingNV",
2405 .dependencies = featureSet(&[_]Feature{}),
2406 };
2407 result[@intFromEnum(Feature.SubgroupShuffleINTEL)] = .{
2408 .llvm_name = null,
2409 .description = "Enable SPIR-V capability SubgroupShuffleINTEL",
2410 .dependencies = featureSet(&[_]Feature{}),
2411 };
2412 result[@intFromEnum(Feature.SubgroupBufferBlockIOINTEL)] = .{
2413 .llvm_name = null,
2414 .description = "Enable SPIR-V capability SubgroupBufferBlockIOINTEL",
2415 .dependencies = featureSet(&[_]Feature{}),
2416 };
2417 result[@intFromEnum(Feature.SubgroupImageBlockIOINTEL)] = .{
2418 .llvm_name = null,
2419 .description = "Enable SPIR-V capability SubgroupImageBlockIOINTEL",
2420 .dependencies = featureSet(&[_]Feature{}),
2421 };
2422 result[@intFromEnum(Feature.SubgroupImageMediaBlockIOINTEL)] = .{
2423 .llvm_name = null,
2424 .description = "Enable SPIR-V capability SubgroupImageMediaBlockIOINTEL",
2425 .dependencies = featureSet(&[_]Feature{}),
2426 };
2427 result[@intFromEnum(Feature.RoundToInfinityINTEL)] = .{
2428 .llvm_name = null,
2429 .description = "Enable SPIR-V capability RoundToInfinityINTEL",
2430 .dependencies = featureSet(&[_]Feature{}),
2431 };
2432 result[@intFromEnum(Feature.FloatingPointModeINTEL)] = .{
2433 .llvm_name = null,
2434 .description = "Enable SPIR-V capability FloatingPointModeINTEL",
2435 .dependencies = featureSet(&[_]Feature{}),
2436 };
2437 result[@intFromEnum(Feature.IntegerFunctions2INTEL)] = .{
2438 .llvm_name = null,
2439 .description = "Enable SPIR-V capability IntegerFunctions2INTEL",
2440 .dependencies = featureSet(&[_]Feature{}),
2441 };
2442 result[@intFromEnum(Feature.FunctionPointersINTEL)] = .{
2443 .llvm_name = null,
2444 .description = "Enable SPIR-V capability FunctionPointersINTEL",
2445 .dependencies = featureSet(&[_]Feature{}),
2446 };
2447 result[@intFromEnum(Feature.IndirectReferencesINTEL)] = .{
2448 .llvm_name = null,
2449 .description = "Enable SPIR-V capability IndirectReferencesINTEL",
2450 .dependencies = featureSet(&[_]Feature{}),
2451 };
2452 result[@intFromEnum(Feature.AsmINTEL)] = .{
2453 .llvm_name = null,
2454 .description = "Enable SPIR-V capability AsmINTEL",
2455 .dependencies = featureSet(&[_]Feature{}),
2456 };
2457 result[@intFromEnum(Feature.AtomicFloat32MinMaxEXT)] = .{
2458 .llvm_name = null,
2459 .description = "Enable SPIR-V capability AtomicFloat32MinMaxEXT",
2460 .dependencies = featureSet(&[_]Feature{}),
2461 };
2462 result[@intFromEnum(Feature.AtomicFloat64MinMaxEXT)] = .{
2463 .llvm_name = null,
2464 .description = "Enable SPIR-V capability AtomicFloat64MinMaxEXT",
2465 .dependencies = featureSet(&[_]Feature{}),
2466 };
2467 result[@intFromEnum(Feature.AtomicFloat16MinMaxEXT)] = .{
2468 .llvm_name = null,
2469 .description = "Enable SPIR-V capability AtomicFloat16MinMaxEXT",
2470 .dependencies = featureSet(&[_]Feature{}),
2471 };
2472 result[@intFromEnum(Feature.VectorComputeINTEL)] = .{
2473 .llvm_name = null,
2474 .description = "Enable SPIR-V capability VectorComputeINTEL",
2475 .dependencies = featureSet(&[_]Feature{
2476 .VectorAnyINTEL,
2477 }),
2478 };
2479 result[@intFromEnum(Feature.VectorAnyINTEL)] = .{
2480 .llvm_name = null,
2481 .description = "Enable SPIR-V capability VectorAnyINTEL",
2482 .dependencies = featureSet(&[_]Feature{}),
2483 };
2484 result[@intFromEnum(Feature.ExpectAssumeKHR)] = .{
2485 .llvm_name = null,
2486 .description = "Enable SPIR-V capability ExpectAssumeKHR",
2487 .dependencies = featureSet(&[_]Feature{}),
2488 };
2489 result[@intFromEnum(Feature.SubgroupAvcMotionEstimationINTEL)] = .{
2490 .llvm_name = null,
2491 .description = "Enable SPIR-V capability SubgroupAvcMotionEstimationINTEL",
2492 .dependencies = featureSet(&[_]Feature{}),
2493 };
2494 result[@intFromEnum(Feature.SubgroupAvcMotionEstimationIntraINTEL)] = .{
2495 .llvm_name = null,
2496 .description = "Enable SPIR-V capability SubgroupAvcMotionEstimationIntraINTEL",
2497 .dependencies = featureSet(&[_]Feature{}),
2498 };
2499 result[@intFromEnum(Feature.SubgroupAvcMotionEstimationChromaINTEL)] = .{
2500 .llvm_name = null,
2501 .description = "Enable SPIR-V capability SubgroupAvcMotionEstimationChromaINTEL",
2502 .dependencies = featureSet(&[_]Feature{}),
2503 };
2504 result[@intFromEnum(Feature.VariableLengthArrayINTEL)] = .{
2505 .llvm_name = null,
2506 .description = "Enable SPIR-V capability VariableLengthArrayINTEL",
2507 .dependencies = featureSet(&[_]Feature{}),
2508 };
2509 result[@intFromEnum(Feature.FunctionFloatControlINTEL)] = .{
2510 .llvm_name = null,
2511 .description = "Enable SPIR-V capability FunctionFloatControlINTEL",
2512 .dependencies = featureSet(&[_]Feature{}),
2513 };
2514 result[@intFromEnum(Feature.FPGAMemoryAttributesINTEL)] = .{
2515 .llvm_name = null,
2516 .description = "Enable SPIR-V capability FPGAMemoryAttributesINTEL",
2517 .dependencies = featureSet(&[_]Feature{}),
2518 };
2519 result[@intFromEnum(Feature.FPFastMathModeINTEL)] = .{
2520 .llvm_name = null,
2521 .description = "Enable SPIR-V capability FPFastMathModeINTEL",
2522 .dependencies = featureSet(&[_]Feature{
2523 .Kernel,
2524 }),
2525 };
2526 result[@intFromEnum(Feature.ArbitraryPrecisionIntegersINTEL)] = .{
2527 .llvm_name = null,
2528 .description = "Enable SPIR-V capability ArbitraryPrecisionIntegersINTEL",
2529 .dependencies = featureSet(&[_]Feature{}),
2530 };
2531 result[@intFromEnum(Feature.ArbitraryPrecisionFloatingPointINTEL)] = .{
2532 .llvm_name = null,
2533 .description = "Enable SPIR-V capability ArbitraryPrecisionFloatingPointINTEL",
2534 .dependencies = featureSet(&[_]Feature{}),
2535 };
2536 result[@intFromEnum(Feature.UnstructuredLoopControlsINTEL)] = .{
2537 .llvm_name = null,
2538 .description = "Enable SPIR-V capability UnstructuredLoopControlsINTEL",
2539 .dependencies = featureSet(&[_]Feature{}),
2540 };
2541 result[@intFromEnum(Feature.FPGALoopControlsINTEL)] = .{
2542 .llvm_name = null,
2543 .description = "Enable SPIR-V capability FPGALoopControlsINTEL",
2544 .dependencies = featureSet(&[_]Feature{}),
2545 };
2546 result[@intFromEnum(Feature.KernelAttributesINTEL)] = .{
2547 .llvm_name = null,
2548 .description = "Enable SPIR-V capability KernelAttributesINTEL",
2549 .dependencies = featureSet(&[_]Feature{}),
2550 };
2551 result[@intFromEnum(Feature.FPGAKernelAttributesINTEL)] = .{
2552 .llvm_name = null,
2553 .description = "Enable SPIR-V capability FPGAKernelAttributesINTEL",
2554 .dependencies = featureSet(&[_]Feature{}),
2555 };
2556 result[@intFromEnum(Feature.FPGAMemoryAccessesINTEL)] = .{
2557 .llvm_name = null,
2558 .description = "Enable SPIR-V capability FPGAMemoryAccessesINTEL",
2559 .dependencies = featureSet(&[_]Feature{}),
2560 };
2561 result[@intFromEnum(Feature.FPGAClusterAttributesINTEL)] = .{
2562 .llvm_name = null,
2563 .description = "Enable SPIR-V capability FPGAClusterAttributesINTEL",
2564 .dependencies = featureSet(&[_]Feature{}),
2565 };
2566 result[@intFromEnum(Feature.LoopFuseINTEL)] = .{
2567 .llvm_name = null,
2568 .description = "Enable SPIR-V capability LoopFuseINTEL",
2569 .dependencies = featureSet(&[_]Feature{}),
2570 };
2571 result[@intFromEnum(Feature.FPGADSPControlINTEL)] = .{
2572 .llvm_name = null,
2573 .description = "Enable SPIR-V capability FPGADSPControlINTEL",
2574 .dependencies = featureSet(&[_]Feature{}),
2575 };
2576 result[@intFromEnum(Feature.MemoryAccessAliasingINTEL)] = .{
2577 .llvm_name = null,
2578 .description = "Enable SPIR-V capability MemoryAccessAliasingINTEL",
2579 .dependencies = featureSet(&[_]Feature{}),
2580 };
2581 result[@intFromEnum(Feature.FPGAInvocationPipeliningAttributesINTEL)] = .{
2582 .llvm_name = null,
2583 .description = "Enable SPIR-V capability FPGAInvocationPipeliningAttributesINTEL",
2584 .dependencies = featureSet(&[_]Feature{}),
2585 };
2586 result[@intFromEnum(Feature.FPGABufferLocationINTEL)] = .{
2587 .llvm_name = null,
2588 .description = "Enable SPIR-V capability FPGABufferLocationINTEL",
2589 .dependencies = featureSet(&[_]Feature{}),
2590 };
2591 result[@intFromEnum(Feature.ArbitraryPrecisionFixedPointINTEL)] = .{
2592 .llvm_name = null,
2593 .description = "Enable SPIR-V capability ArbitraryPrecisionFixedPointINTEL",
2594 .dependencies = featureSet(&[_]Feature{}),
2595 };
2596 result[@intFromEnum(Feature.USMStorageClassesINTEL)] = .{
2597 .llvm_name = null,
2598 .description = "Enable SPIR-V capability USMStorageClassesINTEL",
2599 .dependencies = featureSet(&[_]Feature{}),
2600 };
2601 result[@intFromEnum(Feature.RuntimeAlignedAttributeINTEL)] = .{
2602 .llvm_name = null,
2603 .description = "Enable SPIR-V capability RuntimeAlignedAttributeINTEL",
2604 .dependencies = featureSet(&[_]Feature{}),
2605 };
2606 result[@intFromEnum(Feature.IOPipesINTEL)] = .{
2607 .llvm_name = null,
2608 .description = "Enable SPIR-V capability IOPipesINTEL",
2609 .dependencies = featureSet(&[_]Feature{}),
2610 };
2611 result[@intFromEnum(Feature.BlockingPipesINTEL)] = .{
2612 .llvm_name = null,
2613 .description = "Enable SPIR-V capability BlockingPipesINTEL",
2614 .dependencies = featureSet(&[_]Feature{}),
2615 };
2616 result[@intFromEnum(Feature.FPGARegINTEL)] = .{
2617 .llvm_name = null,
2618 .description = "Enable SPIR-V capability FPGARegINTEL",
2619 .dependencies = featureSet(&[_]Feature{}),
2620 };
2621 result[@intFromEnum(Feature.DotProductInputAll)] = .{
2622 .llvm_name = null,
2623 .description = "Enable SPIR-V capability DotProductInputAll",
2624 .dependencies = featureSet(&[_]Feature{
2625 .v1_6,
2626 }),
2627 };
2628 result[@intFromEnum(Feature.DotProductInput4x8Bit)] = .{
2629 .llvm_name = null,
2630 .description = "Enable SPIR-V capability DotProductInput4x8Bit",
2631 .dependencies = featureSet(&[_]Feature{
2632 .v1_6,
2633 .Int8,
2634 }),
2635 };
2636 result[@intFromEnum(Feature.DotProductInput4x8BitPacked)] = .{
2637 .llvm_name = null,
2638 .description = "Enable SPIR-V capability DotProductInput4x8BitPacked",
2639 .dependencies = featureSet(&[_]Feature{
2640 .v1_6,
2641 }),
2642 };
2643 result[@intFromEnum(Feature.DotProduct)] = .{
2644 .llvm_name = null,
2645 .description = "Enable SPIR-V capability DotProduct",
2646 .dependencies = featureSet(&[_]Feature{
2647 .v1_6,
2648 }),
2649 };
2650 result[@intFromEnum(Feature.RayCullMaskKHR)] = .{
2651 .llvm_name = null,
2652 .description = "Enable SPIR-V capability RayCullMaskKHR",
2653 .dependencies = featureSet(&[_]Feature{}),
2654 };
2655 result[@intFromEnum(Feature.CooperativeMatrixKHR)] = .{
2656 .llvm_name = null,
2657 .description = "Enable SPIR-V capability CooperativeMatrixKHR",
2658 .dependencies = featureSet(&[_]Feature{}),
2659 };
2660 result[@intFromEnum(Feature.ReplicatedCompositesEXT)] = .{
2661 .llvm_name = null,
2662 .description = "Enable SPIR-V capability ReplicatedCompositesEXT",
2663 .dependencies = featureSet(&[_]Feature{}),
2664 };
2665 result[@intFromEnum(Feature.BitInstructions)] = .{
2666 .llvm_name = null,
2667 .description = "Enable SPIR-V capability BitInstructions",
2668 .dependencies = featureSet(&[_]Feature{}),
2669 };
2670 result[@intFromEnum(Feature.GroupNonUniformRotateKHR)] = .{
2671 .llvm_name = null,
2672 .description = "Enable SPIR-V capability GroupNonUniformRotateKHR",
2673 .dependencies = featureSet(&[_]Feature{
2674 .GroupNonUniform,
2675 }),
2676 };
2677 result[@intFromEnum(Feature.FloatControls2)] = .{
2678 .llvm_name = null,
2679 .description = "Enable SPIR-V capability FloatControls2",
2680 .dependencies = featureSet(&[_]Feature{}),
2681 };
2682 result[@intFromEnum(Feature.AtomicFloat32AddEXT)] = .{
2683 .llvm_name = null,
2684 .description = "Enable SPIR-V capability AtomicFloat32AddEXT",
2685 .dependencies = featureSet(&[_]Feature{}),
2686 };
2687 result[@intFromEnum(Feature.AtomicFloat64AddEXT)] = .{
2688 .llvm_name = null,
2689 .description = "Enable SPIR-V capability AtomicFloat64AddEXT",
2690 .dependencies = featureSet(&[_]Feature{}),
2691 };
2692 result[@intFromEnum(Feature.LongCompositesINTEL)] = .{
2693 .llvm_name = null,
2694 .description = "Enable SPIR-V capability LongCompositesINTEL",
2695 .dependencies = featureSet(&[_]Feature{}),
2696 };
2697 result[@intFromEnum(Feature.OptNoneEXT)] = .{
2698 .llvm_name = null,
2699 .description = "Enable SPIR-V capability OptNoneEXT",
2700 .dependencies = featureSet(&[_]Feature{}),
2701 };
2702 result[@intFromEnum(Feature.AtomicFloat16AddEXT)] = .{
2703 .llvm_name = null,
2704 .description = "Enable SPIR-V capability AtomicFloat16AddEXT",
2705 .dependencies = featureSet(&[_]Feature{}),
2706 };
2707 result[@intFromEnum(Feature.DebugInfoModuleINTEL)] = .{
2708 .llvm_name = null,
2709 .description = "Enable SPIR-V capability DebugInfoModuleINTEL",
2710 .dependencies = featureSet(&[_]Feature{}),
2711 };
2712 result[@intFromEnum(Feature.BFloat16ConversionINTEL)] = .{
2713 .llvm_name = null,
2714 .description = "Enable SPIR-V capability BFloat16ConversionINTEL",
2715 .dependencies = featureSet(&[_]Feature{}),
2716 };
2717 result[@intFromEnum(Feature.SplitBarrierINTEL)] = .{
2718 .llvm_name = null,
2719 .description = "Enable SPIR-V capability SplitBarrierINTEL",
2720 .dependencies = featureSet(&[_]Feature{}),
2721 };
2722 result[@intFromEnum(Feature.ArithmeticFenceEXT)] = .{
2723 .llvm_name = null,
2724 .description = "Enable SPIR-V capability ArithmeticFenceEXT",
2725 .dependencies = featureSet(&[_]Feature{}),
2726 };
2727 result[@intFromEnum(Feature.FPGAClusterAttributesV2INTEL)] = .{
2728 .llvm_name = null,
2729 .description = "Enable SPIR-V capability FPGAClusterAttributesV2INTEL",
2730 .dependencies = featureSet(&[_]Feature{
2731 .FPGAClusterAttributesINTEL,
2732 }),
2733 };
2734 result[@intFromEnum(Feature.FPGAKernelAttributesv2INTEL)] = .{
2735 .llvm_name = null,
2736 .description = "Enable SPIR-V capability FPGAKernelAttributesv2INTEL",
2737 .dependencies = featureSet(&[_]Feature{
2738 .FPGAKernelAttributesINTEL,
2739 }),
2740 };
2741 result[@intFromEnum(Feature.FPMaxErrorINTEL)] = .{
2742 .llvm_name = null,
2743 .description = "Enable SPIR-V capability FPMaxErrorINTEL",
2744 .dependencies = featureSet(&[_]Feature{}),
2745 };
2746 result[@intFromEnum(Feature.FPGALatencyControlINTEL)] = .{
2747 .llvm_name = null,
2748 .description = "Enable SPIR-V capability FPGALatencyControlINTEL",
2749 .dependencies = featureSet(&[_]Feature{}),
2750 };
2751 result[@intFromEnum(Feature.FPGAArgumentInterfacesINTEL)] = .{
2752 .llvm_name = null,
2753 .description = "Enable SPIR-V capability FPGAArgumentInterfacesINTEL",
2754 .dependencies = featureSet(&[_]Feature{}),
2755 };
2756 result[@intFromEnum(Feature.GlobalVariableHostAccessINTEL)] = .{
2757 .llvm_name = null,
2758 .description = "Enable SPIR-V capability GlobalVariableHostAccessINTEL",
2759 .dependencies = featureSet(&[_]Feature{}),
2760 };
2761 result[@intFromEnum(Feature.GlobalVariableFPGADecorationsINTEL)] = .{
2762 .llvm_name = null,
2763 .description = "Enable SPIR-V capability GlobalVariableFPGADecorationsINTEL",
2764 .dependencies = featureSet(&[_]Feature{}),
2765 };
2766 result[@intFromEnum(Feature.SubgroupBufferPrefetchINTEL)] = .{
2767 .llvm_name = null,
2768 .description = "Enable SPIR-V capability SubgroupBufferPrefetchINTEL",
2769 .dependencies = featureSet(&[_]Feature{}),
2770 };
2771 result[@intFromEnum(Feature.Subgroup2DBlockIOINTEL)] = .{
2772 .llvm_name = null,
2773 .description = "Enable SPIR-V capability Subgroup2DBlockIOINTEL",
2774 .dependencies = featureSet(&[_]Feature{}),
2775 };
2776 result[@intFromEnum(Feature.Subgroup2DBlockTransformINTEL)] = .{
2777 .llvm_name = null,
2778 .description = "Enable SPIR-V capability Subgroup2DBlockTransformINTEL",
2779 .dependencies = featureSet(&[_]Feature{
2780 .Subgroup2DBlockIOINTEL,
2781 }),
2782 };
2783 result[@intFromEnum(Feature.Subgroup2DBlockTransposeINTEL)] = .{
2784 .llvm_name = null,
2785 .description = "Enable SPIR-V capability Subgroup2DBlockTransposeINTEL",
2786 .dependencies = featureSet(&[_]Feature{
2787 .Subgroup2DBlockIOINTEL,
2788 }),
2789 };
2790 result[@intFromEnum(Feature.SubgroupMatrixMultiplyAccumulateINTEL)] = .{
2791 .llvm_name = null,
2792 .description = "Enable SPIR-V capability SubgroupMatrixMultiplyAccumulateINTEL",
2793 .dependencies = featureSet(&[_]Feature{}),
2794 };
2795 result[@intFromEnum(Feature.GroupUniformArithmeticKHR)] = .{
2796 .llvm_name = null,
2797 .description = "Enable SPIR-V capability GroupUniformArithmeticKHR",
2798 .dependencies = featureSet(&[_]Feature{}),
2799 };
2800 result[@intFromEnum(Feature.MaskedGatherScatterINTEL)] = .{
2801 .llvm_name = null,
2802 .description = "Enable SPIR-V capability MaskedGatherScatterINTEL",
2803 .dependencies = featureSet(&[_]Feature{}),
2804 };
2805 result[@intFromEnum(Feature.CacheControlsINTEL)] = .{
2806 .llvm_name = null,
2807 .description = "Enable SPIR-V capability CacheControlsINTEL",
2808 .dependencies = featureSet(&[_]Feature{}),
2809 };
2810 result[@intFromEnum(Feature.RegisterLimitsINTEL)] = .{
2811 .llvm_name = null,
2812 .description = "Enable SPIR-V capability RegisterLimitsINTEL",
2813 .dependencies = featureSet(&[_]Feature{}),
2814 };125 };
2815 const ti = @typeInfo(Feature);126 const ti = @typeInfo(Feature);
2816 for (&result, 0..) |*elem, i| {127 for (&result, 0..) |*elem, i| {
...@@ -2830,24 +141,12 @@ pub const cpu = struct {...@@ -2830,24 +141,12 @@ pub const cpu = struct {
2830 pub const vulkan_v1_2: CpuModel = .{141 pub const vulkan_v1_2: CpuModel = .{
2831 .name = "vulkan_v1_2",142 .name = "vulkan_v1_2",
2832 .llvm_name = null,143 .llvm_name = null,
2833 .features = featureSet(&[_]Feature{144 .features = featureSet(&[_]Feature{ .v1_5, .shader, .addresses }),
2834 .v1_5,
2835 .Shader,
2836 .PhysicalStorageBufferAddresses,
2837 .VariablePointers,
2838 .VariablePointersStorageBuffer,
2839 .SPV_KHR_physical_storage_buffer,
2840 }),
2841 };145 };
2842146
2843 pub const opencl_v2: CpuModel = .{147 pub const opencl_v2: CpuModel = .{
2844 .name = "opencl_v2",148 .name = "opencl_v2",
2845 .llvm_name = null,149 .llvm_name = null,
2846 .features = featureSet(&[_]Feature{150 .features = featureSet(&[_]Feature{ .v1_2, .kernel, .addresses, .generic_pointer }),
2847 .v1_2,
2848 .Kernel,
2849 .Addresses,
2850 .GenericPointer,
2851 }),
2852 };151 };
2853};152};
src/codegen/spirv.zig+18-18
...@@ -552,7 +552,7 @@ const NavGen = struct {...@@ -552,7 +552,7 @@ const NavGen = struct {
552 }552 }
553553
554 fn castToGeneric(self: *NavGen, type_id: IdRef, ptr_id: IdRef) !IdRef {554 fn castToGeneric(self: *NavGen, type_id: IdRef, ptr_id: IdRef) !IdRef {
555 if (self.spv.hasFeature(.Kernel)) {555 if (self.spv.hasFeature(.kernel)) {
556 const result_id = self.spv.allocId();556 const result_id = self.spv.allocId();
557 try self.func.body.emit(self.spv.gpa, .OpPtrCastToGeneric, .{557 try self.func.body.emit(self.spv.gpa, .OpPtrCastToGeneric, .{
558 .id_result_type = type_id,558 .id_result_type = type_id,
...@@ -591,10 +591,10 @@ const NavGen = struct {...@@ -591,10 +591,10 @@ const NavGen = struct {
591 // 8, 16 and 64-bit integers require the Int8, Int16 and Inr64 capabilities respectively.591 // 8, 16 and 64-bit integers require the Int8, Int16 and Inr64 capabilities respectively.
592 // 32-bit integers are always supported (see spec, 2.16.1, Data rules).592 // 32-bit integers are always supported (see spec, 2.16.1, Data rules).
593 const ints = [_]struct { bits: u16, feature: ?Target.spirv.Feature }{593 const ints = [_]struct { bits: u16, feature: ?Target.spirv.Feature }{
594 .{ .bits = 8, .feature = .Int8 },594 .{ .bits = 8, .feature = .int8 },
595 .{ .bits = 16, .feature = .Int16 },595 .{ .bits = 16, .feature = .int16 },
596 .{ .bits = 32, .feature = null },596 .{ .bits = 32, .feature = null },
597 .{ .bits = 64, .feature = .Int64 },597 .{ .bits = 64, .feature = .int64 },
598 };598 };
599599
600 for (ints) |int| {600 for (ints) |int| {
...@@ -612,7 +612,7 @@ const NavGen = struct {...@@ -612,7 +612,7 @@ const NavGen = struct {
612 /// is no way of knowing whether those are actually supported.612 /// is no way of knowing whether those are actually supported.
613 /// TODO: Maybe this should be cached?613 /// TODO: Maybe this should be cached?
614 fn largestSupportedIntBits(self: *NavGen) u16 {614 fn largestSupportedIntBits(self: *NavGen) u16 {
615 return if (self.spv.hasFeature(.Int64)) 64 else 32;615 return if (self.spv.hasFeature(.int64)) 64 else 32;
616 }616 }
617617
618 /// Checks whether the type is "composite int", an integer consisting of multiple native integers. These are represented by618 /// 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 {...@@ -644,7 +644,7 @@ const NavGen = struct {
644644
645 if (elem_ty.isNumeric(zcu) or elem_ty.toIntern() == .bool_type) {645 if (elem_ty.isNumeric(zcu) or elem_ty.toIntern() == .bool_type) {
646 if (len > 1 and len <= 4) return true;646 if (len > 1 and len <= 4) return true;
647 if (self.spv.hasFeature(.Vector16)) return (len == 8 or len == 16);647 if (self.spv.hasFeature(.vector16)) return (len == 8 or len == 16);
648 }648 }
649649
650 return false;650 return false;
...@@ -1241,7 +1241,7 @@ const NavGen = struct {...@@ -1241,7 +1241,7 @@ const NavGen = struct {
1241 };1241 };
12421242
1243 // Kernel only supports unsigned ints.1243 // Kernel only supports unsigned ints.
1244 if (self.spv.hasFeature(.Kernel)) {1244 if (self.spv.hasFeature(.kernel)) {
1245 return self.spv.intType(.unsigned, backing_bits);1245 return self.spv.intType(.unsigned, backing_bits);
1246 }1246 }
12471247
...@@ -1465,10 +1465,10 @@ const NavGen = struct {...@@ -1465,10 +1465,10 @@ const NavGen = struct {
1465 // so if the float is not supported, just return an error.1465 // so if the float is not supported, just return an error.
1466 const bits = ty.floatBits(target);1466 const bits = ty.floatBits(target);
1467 const supported = switch (bits) {1467 const supported = switch (bits) {
1468 16 => Target.spirv.featureSetHas(target.cpu.features, .Float16),1468 16 => self.spv.hasFeature(.float16),
1469 // 32-bit floats are always supported (see spec, 2.16.1, Data rules).1469 // 32-bit floats are always supported (see spec, 2.16.1, Data rules).
1470 32 => true,1470 32 => true,
1471 64 => Target.spirv.featureSetHas(target.cpu.features, .Float64),1471 64 => self.spv.hasFeature(.float64),
1472 else => false,1472 else => false,
1473 };1473 };
14741474
...@@ -1511,7 +1511,7 @@ const NavGen = struct {...@@ -1511,7 +1511,7 @@ const NavGen = struct {
1511 return try self.arrayType(1, elem_ty_id);1511 return try self.arrayType(1, elem_ty_id);
1512 } else {1512 } else {
1513 const result_id = try self.arrayType(total_len, elem_ty_id);1513 const result_id = try self.arrayType(total_len, elem_ty_id);
1514 if (self.spv.hasFeature(.Shader)) {1514 if (self.spv.hasFeature(.shader)) {
1515 try self.spv.decorate(result_id, .{ .ArrayStride = .{1515 try self.spv.decorate(result_id, .{ .ArrayStride = .{
1516 .array_stride = @intCast(elem_ty.abiSize(zcu)),1516 .array_stride = @intCast(elem_ty.abiSize(zcu)),
1517 } });1517 } });
...@@ -1645,7 +1645,7 @@ const NavGen = struct {...@@ -1645,7 +1645,7 @@ const NavGen = struct {
1645 continue;1645 continue;
1646 }1646 }
16471647
1648 if (self.spv.hasFeature(.Shader)) {1648 if (self.spv.hasFeature(.shader)) {
1649 try self.spv.decorateMember(result_id, index, .{ .Offset = .{1649 try self.spv.decorateMember(result_id, index, .{ .Offset = .{
1650 .byte_offset = @intCast(ty.structFieldOffset(field_index, zcu)),1650 .byte_offset = @intCast(ty.structFieldOffset(field_index, zcu)),
1651 } });1651 } });
...@@ -1748,10 +1748,10 @@ const NavGen = struct {...@@ -1748,10 +1748,10 @@ const NavGen = struct {
17481748
1749 fn spvStorageClass(self: *NavGen, as: std.builtin.AddressSpace) StorageClass {1749 fn spvStorageClass(self: *NavGen, as: std.builtin.AddressSpace) StorageClass {
1750 return switch (as) {1750 return switch (as) {
1751 .generic => if (self.spv.hasFeature(.GenericPointer)) .Generic else .Function,1751 .generic => if (self.spv.hasFeature(.generic_pointer)) .Generic else .Function,
1752 .shared => .Workgroup,1752 .shared => .Workgroup,
1753 .local => .Function,1753 .local => .Function,
1754 .global => if (self.spv.hasFeature(.Shader)) .PhysicalStorageBuffer else .CrossWorkgroup,1754 .global => if (self.spv.hasFeature(.shader)) .PhysicalStorageBuffer else .CrossWorkgroup,
1755 .constant => .UniformConstant,1755 .constant => .UniformConstant,
1756 .push_constant => .PushConstant,1756 .push_constant => .PushConstant,
1757 .input => .Input,1757 .input => .Input,
...@@ -2461,7 +2461,7 @@ const NavGen = struct {...@@ -2461,7 +2461,7 @@ const NavGen = struct {
2461 // TODO: These instructions don't seem to be working2461 // TODO: These instructions don't seem to be working
2462 // properly for LLVM-based backends on OpenCL for 8- and2462 // properly for LLVM-based backends on OpenCL for 8- and
2463 // 16-component vectors.2463 // 16-component vectors.
2464 .i_abs => if (self.spv.hasFeature(.Vector16) and v.components() >= 8) v.unroll() else v,2464 .i_abs => if (self.spv.hasFeature(.vector16) and v.components() >= 8) v.unroll() else v,
2465 else => v,2465 else => v,
2466 };2466 };
2467 };2467 };
...@@ -3650,7 +3650,7 @@ const NavGen = struct {...@@ -3650,7 +3650,7 @@ const NavGen = struct {
3650 // depending on the result type. Do that when3650 // depending on the result type. Do that when
3651 // bitCast is implemented for vectors.3651 // bitCast is implemented for vectors.
3652 // This is only relevant for Vulkan3652 // This is only relevant for Vulkan
3653 assert(self.spv.hasFeature(.Kernel)); // TODO3653 assert(self.spv.hasFeature(.kernel)); // TODO
36543654
3655 return try self.normalize(abs_value, self.arithmeticTypeInfo(result_ty));3655 return try self.normalize(abs_value, self.arithmeticTypeInfo(result_ty));
3656 },3656 },
...@@ -3968,7 +3968,7 @@ const NavGen = struct {...@@ -3968,7 +3968,7 @@ const NavGen = struct {
3968 .float, .bool => unreachable,3968 .float, .bool => unreachable,
3969 }3969 }
39703970
3971 assert(self.spv.hasFeature(.Kernel)); // TODO3971 assert(self.spv.hasFeature(.kernel)); // TODO
39723972
3973 const count = try self.buildUnary(op, operand);3973 const count = try self.buildUnary(op, operand);
39743974
...@@ -4204,7 +4204,7 @@ const NavGen = struct {...@@ -4204,7 +4204,7 @@ const NavGen = struct {
4204 defer self.gpa.free(ids);4204 defer self.gpa.free(ids);
42054205
4206 const result_id = self.spv.allocId();4206 const result_id = self.spv.allocId();
4207 if (self.spv.hasFeature(.Kernel)) {4207 if (self.spv.hasFeature(.kernel)) {
4208 try self.func.body.emit(self.spv.gpa, .OpInBoundsPtrAccessChain, .{4208 try self.func.body.emit(self.spv.gpa, .OpInBoundsPtrAccessChain, .{
4209 .id_result_type = result_ty_id,4209 .id_result_type = result_ty_id,
4210 .id_result = result_id,4210 .id_result = result_id,
...@@ -5290,7 +5290,7 @@ const NavGen = struct {...@@ -5290,7 +5290,7 @@ const NavGen = struct {
5290 .initializer = options.initializer,5290 .initializer = options.initializer,
5291 });5291 });
52925292
5293 if (self.spv.hasFeature(.Shader)) return var_id;5293 if (self.spv.hasFeature(.shader)) return var_id;
52945294
5295 switch (options.storage_class) {5295 switch (options.storage_class) {
5296 .Generic => {5296 .Generic => {
src/codegen/spirv/Assembler.zig+10
...@@ -274,6 +274,16 @@ fn processInstruction(self: *Assembler) !void {...@@ -274,6 +274,16 @@ fn processInstruction(self: *Assembler) !void {
274 .OpEntryPoint => {274 .OpEntryPoint => {
275 return self.fail(0, "cannot export entry points via OpEntryPoint, export the kernel using callconv(.Kernel)", .{});275 return self.fail(0, "cannot export entry points via OpEntryPoint, export the kernel using callconv(.Kernel)", .{});
276 },276 },
277 .OpCapability => {
278 try self.spv.addCapability(@enumFromInt(self.inst.operands.items[0].value));
279 return;
280 },
281 .OpExtension => {
282 const ext_name_offset = self.inst.operands.items[0].string;
283 const ext_name = std.mem.sliceTo(self.inst.string_bytes.items[ext_name_offset..], 0);
284 try self.spv.addExtension(ext_name);
285 return;
286 },
277 .OpExtInstImport => blk: {287 .OpExtInstImport => blk: {
278 const set_name_offset = self.inst.operands.items[1].string;288 const set_name_offset = self.inst.operands.items[1].string;
279 const set_name = std.mem.sliceTo(self.inst.string_bytes.items[set_name_offset..], 0);289 const set_name = std.mem.sliceTo(self.inst.string_bytes.items[set_name_offset..], 0);
src/codegen/spirv/Module.zig+74-9
...@@ -183,8 +183,11 @@ cache: struct {...@@ -183,8 +183,11 @@ cache: struct {
183 array_types: std.AutoHashMapUnmanaged(struct { IdRef, IdRef }, IdRef) = .empty,183 array_types: std.AutoHashMapUnmanaged(struct { IdRef, IdRef }, IdRef) = .empty,
184 function_types: DeepHashMap(struct { IdRef, []const IdRef }, IdRef) = .empty,184 function_types: DeepHashMap(struct { IdRef, []const IdRef }, IdRef) = .empty,
185185
186 builtins: std.AutoHashMapUnmanaged(struct { IdRef, spec.BuiltIn }, Decl.Index) = .empty,186 capabilities: std.AutoHashMapUnmanaged(spec.Capability, void) = .empty,
187 extensions: std.StringHashMapUnmanaged(void) = .empty,
188 extended_instruction_set: std.AutoHashMapUnmanaged(spec.InstructionSet, IdRef) = .empty,
187 decorations: std.AutoHashMapUnmanaged(struct { IdRef, spec.Decoration }, void) = .empty,189 decorations: std.AutoHashMapUnmanaged(struct { IdRef, spec.Decoration }, void) = .empty,
190 builtins: std.AutoHashMapUnmanaged(struct { IdRef, spec.BuiltIn }, Decl.Index) = .empty,
188191
189 bool_const: [2]?IdRef = .{ null, null },192 bool_const: [2]?IdRef = .{ null, null },
190} = .{},193} = .{},
...@@ -199,9 +202,6 @@ decl_deps: std.ArrayListUnmanaged(Decl.Index) = .empty,...@@ -199,9 +202,6 @@ decl_deps: std.ArrayListUnmanaged(Decl.Index) = .empty,
199/// The list of entry points that should be exported from this module.202/// The list of entry points that should be exported from this module.
200entry_points: std.ArrayListUnmanaged(EntryPoint) = .empty,203entry_points: std.ArrayListUnmanaged(EntryPoint) = .empty,
201204
202/// The list of extended instruction sets that should be imported.
203extended_instruction_set: std.AutoHashMapUnmanaged(spec.InstructionSet, IdRef) = .empty,
204
205pub fn init(gpa: Allocator, target: std.Target) Module {205pub fn init(gpa: Allocator, target: std.Target) Module {
206 const version_minor: u8 = blk: {206 const version_minor: u8 = blk: {
207 // Prefer higher versions207 // Prefer higher versions
...@@ -242,15 +242,16 @@ pub fn deinit(self: *Module) void {...@@ -242,15 +242,16 @@ pub fn deinit(self: *Module) void {
242 self.cache.vector_types.deinit(self.gpa);242 self.cache.vector_types.deinit(self.gpa);
243 self.cache.array_types.deinit(self.gpa);243 self.cache.array_types.deinit(self.gpa);
244 self.cache.function_types.deinit(self.gpa);244 self.cache.function_types.deinit(self.gpa);
245 self.cache.builtins.deinit(self.gpa);245 self.cache.capabilities.deinit(self.gpa);
246 self.cache.extensions.deinit(self.gpa);
247 self.cache.extended_instruction_set.deinit(self.gpa);
246 self.cache.decorations.deinit(self.gpa);248 self.cache.decorations.deinit(self.gpa);
249 self.cache.builtins.deinit(self.gpa);
247250
248 self.decls.deinit(self.gpa);251 self.decls.deinit(self.gpa);
249 self.decl_deps.deinit(self.gpa);252 self.decl_deps.deinit(self.gpa);
250
251 self.entry_points.deinit(self.gpa);253 self.entry_points.deinit(self.gpa);
252254
253 self.extended_instruction_set.deinit(self.gpa);
254 self.arena.deinit();255 self.arena.deinit();
255256
256 self.* = undefined;257 self.* = undefined;
...@@ -339,9 +340,61 @@ fn entryPoints(self: *Module) !Section {...@@ -339,9 +340,61 @@ fn entryPoints(self: *Module) !Section {
339}340}
340341
341pub fn finalize(self: *Module, a: Allocator) ![]Word {342pub fn finalize(self: *Module, a: Allocator) ![]Word {
343 // Emit capabilities and extensions
344 for (std.Target.spirv.all_features) |feature| {
345 if (self.target.cpu.features.isEnabled(feature.index)) {
346 const feature_tag: std.Target.spirv.Feature = @enumFromInt(feature.index);
347 switch (feature_tag) {
348 .v1_0, .v1_1, .v1_2, .v1_3, .v1_4, .v1_5, .v1_6 => {},
349 .int8 => try self.addCapability(.Int8),
350 .int16 => try self.addCapability(.Int16),
351 .int64 => try self.addCapability(.Int64),
352 .float16 => try self.addCapability(.Float16),
353 .float64 => try self.addCapability(.Float64),
354 .addresses => if (self.hasFeature(.shader)) {
355 try self.addCapability(.PhysicalStorageBufferAddresses);
356 try self.addExtension("SPV_KHR_physical_storage_buffer");
357 } else {
358 try self.addCapability(.Addresses);
359 },
360 .matrix => try self.addCapability(.Matrix),
361 .kernel => try self.addCapability(.Kernel),
362 .generic_pointer => try self.addCapability(.GenericPointer),
363 .vector16 => try self.addCapability(.Vector16),
364 .shader => try self.addCapability(.Shader),
365 }
366 }
367 }
368
369 // Emit memory model
370 const addressing_model: spec.AddressingModel = blk: {
371 if (self.hasFeature(.shader)) {
372 break :blk switch (self.target.cpu.arch) {
373 .spirv32 => .Logical, // TODO: I don't think this will ever be implemented.
374 .spirv64 => .PhysicalStorageBuffer64,
375 else => unreachable,
376 };
377 } else if (self.hasFeature(.kernel)) {
378 break :blk switch (self.target.cpu.arch) {
379 .spirv32 => .Physical32,
380 .spirv64 => .Physical64,
381 else => unreachable,
382 };
383 }
384
385 unreachable;
386 };
387 try self.sections.memory_model.emit(self.gpa, .OpMemoryModel, .{
388 .addressing_model = addressing_model,
389 .memory_model = switch (self.target.os.tag) {
390 .opencl => .OpenCL,
391 .vulkan, .opengl => .GLSL450,
392 else => unreachable,
393 },
394 });
395
342 // See SPIR-V Spec section 2.3, "Physical Layout of a SPIR-V Module and Instruction"396 // See SPIR-V Spec section 2.3, "Physical Layout of a SPIR-V Module and Instruction"
343 // TODO: Audit calls to allocId() in this function to make it idempotent.397 // TODO: Audit calls to allocId() in this function to make it idempotent.
344
345 var entry_points = try self.entryPoints();398 var entry_points = try self.entryPoints();
346 defer entry_points.deinit(self.gpa);399 defer entry_points.deinit(self.gpa);
347400
...@@ -405,11 +458,23 @@ pub fn addFunction(self: *Module, decl_index: Decl.Index, func: Fn) !void {...@@ -405,11 +458,23 @@ pub fn addFunction(self: *Module, decl_index: Decl.Index, func: Fn) !void {
405 try self.declareDeclDeps(decl_index, func.decl_deps.keys());458 try self.declareDeclDeps(decl_index, func.decl_deps.keys());
406}459}
407460
461pub fn addCapability(self: *Module, cap: spec.Capability) !void {
462 const entry = try self.cache.capabilities.getOrPut(self.gpa, cap);
463 if (entry.found_existing) return;
464 try self.sections.capabilities.emit(self.gpa, .OpCapability, .{ .capability = cap });
465}
466
467pub fn addExtension(self: *Module, ext: []const u8) !void {
468 const entry = try self.cache.extensions.getOrPut(self.gpa, ext);
469 if (entry.found_existing) return;
470 try self.sections.extensions.emit(self.gpa, .OpExtension, .{ .name = ext });
471}
472
408/// Imports or returns the existing id of an extended instruction set473/// Imports or returns the existing id of an extended instruction set
409pub fn importInstructionSet(self: *Module, set: spec.InstructionSet) !IdRef {474pub fn importInstructionSet(self: *Module, set: spec.InstructionSet) !IdRef {
410 assert(set != .core);475 assert(set != .core);
411476
412 const gop = try self.extended_instruction_set.getOrPut(self.gpa, set);477 const gop = try self.cache.extended_instruction_set.getOrPut(self.gpa, set);
413 if (gop.found_existing) return gop.value_ptr.*;478 if (gop.found_existing) return gop.value_ptr.*;
414479
415 const result_id = self.allocId();480 const result_id = self.allocId();
src/link/SpirV.zig-66
...@@ -232,13 +232,9 @@ pub fn flushModule(...@@ -232,13 +232,9 @@ pub fn flushModule(
232 const diags = &comp.link_diags;232 const diags = &comp.link_diags;
233 const gpa = comp.gpa;233 const gpa = comp.gpa;
234234
235 try writeCapabilities(spv);
236 try writeMemoryModel(spv);
237
238 // We need to export the list of error names somewhere so that we can pretty-print them in the235 // We need to export the list of error names somewhere so that we can pretty-print them in the
239 // executor. This is not really an important thing though, so we can just dump it in any old236 // executor. This is not really an important thing though, so we can just dump it in any old
240 // nonsemantic instruction. For now, just put it in OpSourceExtension with a special name.237 // nonsemantic instruction. For now, just put it in OpSourceExtension with a special name.
241
242 var error_info = std.ArrayList(u8).init(self.object.gpa);238 var error_info = std.ArrayList(u8).init(self.object.gpa);
243 defer error_info.deinit();239 defer error_info.deinit();
244240
...@@ -297,65 +293,3 @@ fn linkModule(self: *SpirV, a: Allocator, module: []Word, progress: std.Progress...@@ -297,65 +293,3 @@ fn linkModule(self: *SpirV, a: Allocator, module: []Word, progress: std.Progress
297293
298 return binary.finalize(a);294 return binary.finalize(a);
299}295}
300
301fn writeCapabilities(spv: *SpvModule) !void {
302 var caps: std.ArrayList(spec.Capability) = .init(spv.gpa);
303 var extensions: std.ArrayList([]const u8) = .init(spv.gpa);
304 defer {
305 caps.deinit();
306 extensions.deinit();
307 }
308
309 // Currently all spirv target features name are mapped to a Capability or an Extension.
310 // Except for versions which we ignore.
311 for (std.Target.spirv.all_features, 0..) |_, i| {
312 if (spv.target.cpu.features.isEnabled(@intCast(i))) {
313 const feature: std.Target.spirv.Feature = @enumFromInt(i);
314 const name = @tagName(feature);
315 if (std.meta.stringToEnum(spec.Capability, name)) |cap| {
316 try caps.append(cap);
317 } else if (std.mem.startsWith(u8, name, "SPV_")) {
318 try extensions.append(name);
319 }
320 }
321 }
322
323 for (caps.items) |cap| {
324 try spv.sections.capabilities.emit(spv.gpa, .OpCapability, .{
325 .capability = cap,
326 });
327 }
328
329 for (extensions.items) |ext| {
330 try spv.sections.extensions.emit(spv.gpa, .OpExtension, .{ .name = ext });
331 }
332}
333
334fn writeMemoryModel(spv: *SpvModule) !void {
335 const addressing_model: spec.AddressingModel = blk: {
336 if (spv.hasFeature(.Shader)) {
337 break :blk switch (spv.target.cpu.arch) {
338 .spirv32 => .Logical, // TODO: I don't think this will ever be implemented.
339 .spirv64 => .PhysicalStorageBuffer64,
340 else => unreachable,
341 };
342 } else if (spv.hasFeature(.Kernel)) {
343 break :blk switch (spv.target.cpu.arch) {
344 .spirv32 => .Physical32,
345 .spirv64 => .Physical64,
346 else => unreachable,
347 };
348 }
349
350 unreachable;
351 };
352 const memory_model: spec.MemoryModel = switch (spv.target.os.tag) {
353 .opencl => .OpenCL,
354 .vulkan, .opengl => .GLSL450,
355 else => unreachable,
356 };
357 try spv.sections.memory_model.emit(spv.gpa, .OpMemoryModel, .{
358 .addressing_model = addressing_model,
359 .memory_model = memory_model,
360 });
361}
test/standalone/build.zig-1
...@@ -43,7 +43,6 @@ pub fn build(b: *std.Build) void {...@@ -43,7 +43,6 @@ pub fn build(b: *std.Build) void {
43 "../../tools/update_clang_options.zig",43 "../../tools/update_clang_options.zig",
44 "../../tools/update_cpu_features.zig",44 "../../tools/update_cpu_features.zig",
45 "../../tools/update_glibc.zig",45 "../../tools/update_glibc.zig",
46 "../../tools/update_spirv_features.zig",
47 }) |tool_src_path| {46 }) |tool_src_path| {
48 const tool = b.addTest(.{47 const tool = b.addTest(.{
49 .name = std.fs.path.stem(tool_src_path),48 .name = std.fs.path.stem(tool_src_path),
tools/update_cpu_features.zig-7
...@@ -1072,13 +1072,6 @@ const targets = [_]ArchTarget{...@@ -1072,13 +1072,6 @@ const targets = [_]ArchTarget{
1072 .td_name = "Sparc",1072 .td_name = "Sparc",
1073 },1073 },
1074 },1074 },
1075 // TODO: merge tools/update_spirv_features.zig into this script
1076 //.{
1077 // .zig_name = "spirv",
1078 // .llvm = .{
1079 // .name = "SPIRV",
1080 // },
1081 //},
1082 .{1075 .{
1083 .zig_name = "s390x",1076 .zig_name = "s390x",
1084 .llvm = .{1077 .llvm = .{
tools/update_spirv_features.zig deleted-361
...@@ -1,361 +0,0 @@
1//! This tool generates SPIR-V features from the grammar files in the SPIRV-Headers
2//! (https://github.com/KhronosGroup/SPIRV-Headers/) and SPIRV-Registry (https://github.com/KhronosGroup/SPIRV-Registry/)
3//! repositories. Currently it only generates a basic feature set definition consisting of versions, extensions and capabilities.
4//! There is a lot left to be desired, as currently dependencies of extensions and dependencies on extensions aren't generated.
5//! This is because there are some peculiarities in the SPIR-V registries:
6//! - Capabilities may depend on multiple extensions, which cannot be modelled yet by std.Target.
7//! - Extension dependencies are not documented in a machine-readable manner.
8//! - Note that the grammar spec also contains definitions from extensions which aren't actually official. Most of these seem to be
9//! from an intel project (https://github.com/intel/llvm/, https://github.com/intel/llvm/tree/sycl/sycl/doc/extensions/SPIRV),
10//! and so ONLY extensions in the SPIRV-Registry should be included.
11
12const std = @import("std");
13const fs = std.fs;
14const Allocator = std.mem.Allocator;
15const g = @import("spirv/grammar.zig");
16
17const Version = struct {
18 major: u32,
19 minor: u32,
20
21 fn parse(str: []const u8) !Version {
22 var it = std.mem.splitScalar(u8, str, '.');
23
24 const major = it.first();
25 const minor = it.next() orelse return error.InvalidVersion;
26
27 if (it.next() != null) return error.InvalidVersion;
28
29 return Version{
30 .major = std.fmt.parseInt(u32, major, 10) catch return error.InvalidVersion,
31 .minor = std.fmt.parseInt(u32, minor, 10) catch return error.InvalidVersion,
32 };
33 }
34
35 fn eql(a: Version, b: Version) bool {
36 return a.major == b.major and a.minor == b.minor;
37 }
38
39 fn lessThan(ctx: void, a: Version, b: Version) bool {
40 _ = ctx;
41 return if (a.major == b.major)
42 a.minor < b.minor
43 else
44 a.major < b.major;
45 }
46};
47
48pub fn main() !void {
49 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
50 defer arena.deinit();
51 const allocator = arena.allocator();
52
53 const args = try std.process.argsAlloc(allocator);
54
55 if (args.len <= 1) {
56 usageAndExit(std.io.getStdErr(), args[0], 1);
57 }
58 if (std.mem.eql(u8, args[1], "--help")) {
59 usageAndExit(std.io.getStdErr(), args[0], 0);
60 }
61 if (args.len != 3) {
62 usageAndExit(std.io.getStdErr(), args[0], 1);
63 }
64
65 const spirv_headers_root = args[1];
66 const spirv_registry_root = args[2];
67
68 if (std.mem.startsWith(u8, spirv_headers_root, "-") or std.mem.startsWith(u8, spirv_registry_root, "-")) {
69 usageAndExit(std.io.getStdErr(), args[0], 1);
70 }
71
72 // Required for json parsing.
73 @setEvalBranchQuota(10000);
74
75 const registry_path = try fs.path.join(allocator, &.{ spirv_headers_root, "include", "spirv", "unified1", "spirv.core.grammar.json" });
76 const registry_json = try std.fs.cwd().readFileAlloc(allocator, registry_path, std.math.maxInt(usize));
77 var scanner = std.json.Scanner.initCompleteInput(allocator, registry_json);
78 var diagnostics = std.json.Diagnostics{};
79 scanner.enableDiagnostics(&diagnostics);
80 const registry = std.json.parseFromTokenSourceLeaky(g.CoreRegistry, allocator, &scanner, .{ .ignore_unknown_fields = true }) catch |err| {
81 std.debug.print("line,col: {},{}\n", .{ diagnostics.getLine(), diagnostics.getColumn() });
82 return err;
83 };
84
85 const capabilities = for (registry.operand_kinds) |opkind| {
86 if (std.mem.eql(u8, opkind.kind, "Capability"))
87 break opkind.enumerants orelse return error.InvalidRegistry;
88 } else return error.InvalidRegistry;
89
90 const extensions = try gather_extensions(allocator, spirv_registry_root);
91 const versions = try gatherVersions(allocator, registry);
92
93 var bw = std.io.bufferedWriter(std.io.getStdOut().writer());
94 const w = bw.writer();
95
96 try w.writeAll(
97 \\//! This file is auto-generated by tools/update_spirv_features.zig.
98 \\//! TODO: Dependencies of capabilities on extensions.
99 \\//! TODO: Dependencies of extensions on extensions.
100 \\//! TODO: Dependencies of extensions on versions.
101 \\
102 \\const std = @import("../std.zig");
103 \\const CpuFeature = std.Target.Cpu.Feature;
104 \\const CpuModel = std.Target.Cpu.Model;
105 \\
106 \\pub const Feature = enum {
107 \\
108 );
109
110 for (versions) |ver| {
111 try w.print(" v{}_{},\n", .{ ver.major, ver.minor });
112 }
113
114 for (extensions) |ext| {
115 try w.print(" {p},\n", .{std.zig.fmtId(ext)});
116 }
117
118 for (capabilities) |cap| {
119 try w.print(" {p},\n", .{std.zig.fmtId(cap.enumerant)});
120 }
121
122 try w.writeAll(
123 \\};
124 \\
125 \\pub const featureSet = CpuFeature.FeatureSetFns(Feature).featureSet;
126 \\pub const featureSetHas = CpuFeature.FeatureSetFns(Feature).featureSetHas;
127 \\pub const featureSetHasAny = CpuFeature.FeatureSetFns(Feature).featureSetHasAny;
128 \\pub const featureSetHasAll = CpuFeature.FeatureSetFns(Feature).featureSetHasAll;
129 \\
130 \\pub const all_features = blk: {
131 \\ @setEvalBranchQuota(2000);
132 \\ const len = @typeInfo(Feature).@"enum".fields.len;
133 \\ std.debug.assert(len <= CpuFeature.Set.needed_bit_count);
134 \\ var result: [len]CpuFeature = undefined;
135 \\
136 );
137
138 for (versions, 0..) |ver, i| {
139 try w.print(
140 \\ result[@intFromEnum(Feature.v{0}_{1})] = .{{
141 \\ .llvm_name = null,
142 \\ .description = "SPIR-V version {0}.{1}",
143 \\
144 , .{ ver.major, ver.minor });
145
146 if (i == 0) {
147 try w.writeAll(
148 \\ .dependencies = featureSet(&[_]Feature{}),
149 \\ };
150 \\
151 );
152 } else {
153 try w.print(
154 \\ .dependencies = featureSet(&[_]Feature{{
155 \\ .v{}_{},
156 \\ }}),
157 \\ }};
158 \\
159 , .{ versions[i - 1].major, versions[i - 1].minor });
160 }
161 }
162
163 // TODO: Extension dependencies.
164 for (extensions) |ext| {
165 try w.print(
166 \\ result[@intFromEnum(Feature.{p_})] = .{{
167 \\ .llvm_name = null,
168 \\ .description = "SPIR-V extension {s}",
169 \\ .dependencies = featureSet(&[_]Feature{{}}),
170 \\ }};
171 \\
172 , .{
173 std.zig.fmtId(ext),
174 ext,
175 });
176 }
177
178 // TODO: Capability extension dependencies.
179 for (capabilities) |cap| {
180 try w.print(
181 \\ result[@intFromEnum(Feature.{p_})] = .{{
182 \\ .llvm_name = null,
183 \\ .description = "Enable SPIR-V capability {s}",
184 \\ .dependencies = featureSet(&[_]Feature{{
185 \\
186 , .{
187 std.zig.fmtId(cap.enumerant),
188 cap.enumerant,
189 });
190
191 if (cap.version) |ver_str| blk: {
192 if (std.mem.eql(u8, ver_str, "None")) break :blk;
193
194 const ver = try Version.parse(ver_str);
195 try w.print(" .v{}_{},\n", .{ ver.major, ver.minor });
196 }
197
198 for (cap.capabilities) |cap_dep| {
199 try w.print(" .{p_},\n", .{std.zig.fmtId(cap_dep)});
200 }
201
202 try w.writeAll(
203 \\ }),
204 \\ };
205 \\
206 );
207 }
208
209 try w.writeAll(
210 \\ const ti = @typeInfo(Feature);
211 \\ for (&result, 0..) |*elem, i| {
212 \\ elem.index = i;
213 \\ elem.name = ti.@"enum".fields[i].name;
214 \\ }
215 \\ break :blk result;
216 \\};
217 \\
218 \\pub const cpu = struct {
219 \\ pub const generic: CpuModel = .{
220 \\ .name = "generic",
221 \\ .llvm_name = "generic",
222 \\ .features = featureSet(&[_]Feature{ .v1_0 }),
223 \\ };
224 \\
225 \\ pub const vulkan_v1_2: CpuModel = .{
226 \\ .name = "vulkan_v1_2",
227 \\ .llvm_name = null,
228 \\ .features = featureSet(&[_]Feature{
229 \\ .v1_5,
230 \\ .Shader,
231 \\ .PhysicalStorageBufferAddresses,
232 \\ .VariablePointers,
233 \\ .VariablePointersStorageBuffer,
234 \\ .SPV_KHR_physical_storage_buffer,
235 \\ }),
236 \\ };
237 \\
238 \\ pub const opencl_v2: CpuModel = .{
239 \\ .name = "opencl_v2",
240 \\ .llvm_name = null,
241 \\ .features = featureSet(&[_]Feature{
242 \\ .v1_2,
243 \\ .Kernel,
244 \\ .Addresses,
245 \\ .GenericPointer,
246 \\ }),
247 \\ };
248 \\};
249 );
250
251 try bw.flush();
252}
253
254/// SPIRV-Registry should hold all extensions currently registered for SPIR-V.
255/// The *.grammar.json in SPIRV-Headers should have most of these as well, but with this we're sure to get only the actually
256/// registered ones.
257/// TODO: Unfortunately, neither repository contains a machine-readable list of extension dependencies.
258fn gather_extensions(allocator: Allocator, spirv_registry_root: []const u8) ![]const []const u8 {
259 const extensions_path = try fs.path.join(allocator, &.{ spirv_registry_root, "extensions" });
260 var extensions_dir = try fs.cwd().openDir(extensions_path, .{ .iterate = true });
261 defer extensions_dir.close();
262
263 var extensions = std.ArrayList([]const u8).init(allocator);
264
265 var vendor_it = extensions_dir.iterate();
266 while (try vendor_it.next()) |vendor_entry| {
267 std.debug.assert(vendor_entry.kind == .directory); // If this fails, the structure of SPIRV-Registry has changed.
268
269 const vendor_dir = try extensions_dir.openDir(vendor_entry.name, .{ .iterate = true });
270 var ext_it = vendor_dir.iterate();
271 while (try ext_it.next()) |ext_entry| {
272 // There is both a HTML and asciidoc version of every spec (as well as some other directories),
273 // we need just the name, but to avoid duplicates here we will just skip anything thats not asciidoc.
274 if (!std.mem.endsWith(u8, ext_entry.name, ".asciidoc"))
275 continue;
276
277 // Unfortunately, some extension filenames are incorrect, so we need to look for the string in the 'Name Strings' section.
278 // This has the following format:
279 // ```
280 // Name Strings
281 // ------------
282 //
283 // SPV_EXT_name
284 // ```
285 // OR
286 // ```
287 // == Name Strings
288 //
289 // SPV_EXT_name
290 // ```
291
292 const ext_spec = try vendor_dir.readFileAlloc(allocator, ext_entry.name, std.math.maxInt(usize));
293 const name_strings = "Name Strings";
294
295 const name_strings_offset = std.mem.indexOf(u8, ext_spec, name_strings) orelse return error.InvalidRegistry;
296
297 // As the specs are inconsistent on this next part, just skip any newlines/minuses
298 var ext_start = name_strings_offset + name_strings.len + 1;
299 while (std.ascii.isWhitespace(ext_spec[ext_start]) or ext_spec[ext_start] == '-') {
300 ext_start += 1;
301 }
302
303 const ext_end = std.mem.indexOfScalarPos(u8, ext_spec, ext_start, '\n') orelse return error.InvalidRegistry;
304 const ext = std.mem.trim(u8, ext_spec[ext_start..ext_end], &std.ascii.whitespace);
305
306 // Ignore invalid/incomplete extensions
307 if (std.mem.eql(u8, ext, "{extension_name}")) continue;
308
309 std.debug.assert(std.mem.startsWith(u8, ext, "SPV_")); // Sanity check, all extensions should have a name like SPV_VENDOR_extension.
310
311 try extensions.append(try allocator.dupe(u8, ext));
312 }
313 }
314
315 return extensions.items;
316}
317
318fn insertVersion(versions: *std.ArrayList(Version), version: ?[]const u8) !void {
319 const ver_str = version orelse return;
320 if (std.mem.eql(u8, ver_str, "None")) return;
321
322 const ver = try Version.parse(ver_str);
323 for (versions.items) |existing_ver| {
324 if (ver.eql(existing_ver)) return;
325 }
326
327 try versions.append(ver);
328}
329
330fn gatherVersions(allocator: Allocator, registry: g.CoreRegistry) ![]const Version {
331 // Expected number of versions is small
332 var versions = std.ArrayList(Version).init(allocator);
333
334 for (registry.instructions) |inst| {
335 try insertVersion(&versions, inst.version);
336 }
337
338 for (registry.operand_kinds) |opkind| {
339 const enumerants = opkind.enumerants orelse continue;
340 for (enumerants) |enumerant| {
341 try insertVersion(&versions, enumerant.version);
342 }
343 }
344
345 std.mem.sort(Version, versions.items, {}, Version.lessThan);
346
347 return versions.items;
348}
349
350fn usageAndExit(file: fs.File, arg0: []const u8, code: u8) noreturn {
351 file.writer().print(
352 \\Usage: {s} /path/git/SPIRV-Headers /path/git/SPIRV-Registry
353 \\
354 \\Prints to stdout Zig code which can be used to replace the file lib/std/target/spirv.zig.
355 \\
356 \\SPIRV-Headers can be cloned from https://github.com/KhronosGroup/SPIRV-Headers,
357 \\SPIRV-Registry can be cloned from https://github.com/KhronosGroup/SPIRV-Registry.
358 \\
359 , .{arg0}) catch std.process.exit(1);
360 std.process.exit(code);
361}