diff --git a/lib/std/Target/spirv.zig b/lib/std/Target/spirv.zig index ecd3c056cf329c5c392807d19b18ba6dd36d361b..c988b645b8fc697e73c111cae74989303c8e5c53 100644 --- a/lib/std/Target/spirv.zig +++ b/lib/std/Target/spirv.zig @@ -6,7 +6,6 @@ const CpuModel = std.Target.Cpu.Model; pub const Feature = enum { abort_khr, - addresses, arithmetic_fence_ext, atomic_float16add_ext, atomic_float16min_max_ext, @@ -87,8 +86,6 @@ pub const Feature = enum { int64image_ext, int8, interpolation_function, - kernel, - linkage, literal_sampler, long_vector_ext, matrix, @@ -98,7 +95,6 @@ pub const Feature = enum { multi_viewport, named_barrier, opt_none_ext, - physical_storage_buffer_addresses, pipe_storage, pipes, poison_freeze_khr, @@ -121,7 +117,6 @@ pub const Feature = enum { sampled_image_array_dynamic_indexing, sampled_image_array_non_uniform_indexing, sampled_rect, - shader, shader64bit_indexing_ext, shader_clock_khr, shader_invocation_reorder_ext, @@ -172,7 +167,6 @@ pub const Feature = enum { SPV_KHR_fragment_shading_rate, SPV_KHR_integer_dot_product, SPV_KHR_multiview, - SPV_KHR_physical_storage_buffer, SPV_KHR_poison_freeze, SPV_KHR_post_depth_coverage, SPV_KHR_quad_control, @@ -253,22 +247,15 @@ pub const all_features = blk: { var result: [len]CpuFeature = undefined; result[@intFromEnum(Feature.abort_khr)] = .{ .llvm_name = null, - .description = "Enable abort_khr Capability.", + .description = "Enable abort_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_abort, .v1_0, }), }; - result[@intFromEnum(Feature.addresses)] = .{ - .llvm_name = null, - .description = "Enable addresses Capability.", - .dependencies = featureSet(&[_]Feature{ - .v1_0, - }), - }; result[@intFromEnum(Feature.arithmetic_fence_ext)] = .{ .llvm_name = null, - .description = "Enable arithmetic_fence_ext Capability.", + .description = "Enable arithmetic_fence_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_arithmetic_fence, .v1_0, @@ -276,7 +263,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.atomic_float16add_ext)] = .{ .llvm_name = null, - .description = "Enable atomic_float16add_ext Capability.", + .description = "Enable atomic_float16add_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_atomic_float16_add, .v1_0, @@ -284,7 +271,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.atomic_float16min_max_ext)] = .{ .llvm_name = null, - .description = "Enable atomic_float16min_max_ext Capability.", + .description = "Enable atomic_float16min_max_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_atomic_float_min_max, .v1_0, @@ -292,7 +279,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.atomic_float32add_ext)] = .{ .llvm_name = null, - .description = "Enable atomic_float32add_ext Capability.", + .description = "Enable atomic_float32add_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_atomic_float_add, .v1_0, @@ -300,7 +287,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.atomic_float32min_max_ext)] = .{ .llvm_name = null, - .description = "Enable atomic_float32min_max_ext Capability.", + .description = "Enable atomic_float32min_max_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_atomic_float_min_max, .v1_0, @@ -308,7 +295,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.atomic_float64add_ext)] = .{ .llvm_name = null, - .description = "Enable atomic_float64add_ext Capability.", + .description = "Enable atomic_float64add_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_atomic_float_add, .v1_0, @@ -316,7 +303,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.atomic_float64min_max_ext)] = .{ .llvm_name = null, - .description = "Enable atomic_float64min_max_ext Capability.", + .description = "Enable atomic_float64min_max_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_atomic_float_min_max, .v1_0, @@ -324,14 +311,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.atomic_storage)] = .{ .llvm_name = null, - .description = "Enable atomic_storage Capability.", + .description = "Enable atomic_storage capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.atomic_storage_ops)] = .{ .llvm_name = null, - .description = "Enable atomic_storage_ops Capability.", + .description = "Enable atomic_storage_ops capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_shader_atomic_counter_ops, .v1_0, @@ -339,7 +326,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.b_float16cooperative_matrix_khr)] = .{ .llvm_name = null, - .description = "Enable b_float16cooperative_matrix_khr Capability.", + .description = "Enable b_float16cooperative_matrix_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_bfloat16, .v1_0, @@ -347,7 +334,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.b_float16dot_product_khr)] = .{ .llvm_name = null, - .description = "Enable b_float16dot_product_khr Capability.", + .description = "Enable b_float16dot_product_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_bfloat16, .v1_0, @@ -355,7 +342,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.b_float16type_khr)] = .{ .llvm_name = null, - .description = "Enable b_float16type_khr Capability.", + .description = "Enable b_float16type_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_bfloat16, .v1_0, @@ -363,7 +350,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.bit_instructions)] = .{ .llvm_name = null, - .description = "Enable bit_instructions Capability.", + .description = "Enable bit_instructions capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_bit_instructions, .v1_0, @@ -371,14 +358,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.clip_distance)] = .{ .llvm_name = null, - .description = "Enable clip_distance Capability.", + .description = "Enable clip_distance capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.compute_derivative_group_linear_khr)] = .{ .llvm_name = null, - .description = "Enable compute_derivative_group_linear_khr Capability.", + .description = "Enable compute_derivative_group_linear_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_compute_shader_derivatives, .v1_0, @@ -386,7 +373,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.compute_derivative_group_quads_khr)] = .{ .llvm_name = null, - .description = "Enable compute_derivative_group_quads_khr Capability.", + .description = "Enable compute_derivative_group_quads_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_compute_shader_derivatives, .v1_0, @@ -394,7 +381,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.constant_data_khr)] = .{ .llvm_name = null, - .description = "Enable constant_data_khr Capability.", + .description = "Enable constant_data_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_constant_data, .v1_0, @@ -402,7 +389,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.cooperative_matrix_khr)] = .{ .llvm_name = null, - .description = "Enable cooperative_matrix_khr Capability.", + .description = "Enable cooperative_matrix_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_cooperative_matrix, .v1_0, @@ -410,14 +397,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.cull_distance)] = .{ .llvm_name = null, - .description = "Enable cull_distance Capability.", + .description = "Enable cull_distance capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.demote_to_helper_invocation)] = .{ .llvm_name = null, - .description = "Enable demote_to_helper_invocation Capability.", + .description = "Enable demote_to_helper_invocation capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_demote_to_helper_invocation, .v1_6, @@ -425,7 +412,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.denorm_flush_to_zero)] = .{ .llvm_name = null, - .description = "Enable denorm_flush_to_zero Capability.", + .description = "Enable denorm_flush_to_zero capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_float_controls, .v1_4, @@ -433,7 +420,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.denorm_preserve)] = .{ .llvm_name = null, - .description = "Enable denorm_preserve Capability.", + .description = "Enable denorm_preserve capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_float_controls, .v1_4, @@ -441,14 +428,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.derivative_control)] = .{ .llvm_name = null, - .description = "Enable derivative_control Capability.", + .description = "Enable derivative_control capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.descriptor_heap_ext)] = .{ .llvm_name = null, - .description = "Enable descriptor_heap_ext Capability.", + .description = "Enable descriptor_heap_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_heap, .v1_0, @@ -456,14 +443,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.device_enqueue)] = .{ .llvm_name = null, - .description = "Enable device_enqueue Capability.", + .description = "Enable device_enqueue capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.device_group)] = .{ .llvm_name = null, - .description = "Enable device_group Capability.", + .description = "Enable device_group capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_device_group, .v1_3, @@ -471,7 +458,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.dot_product)] = .{ .llvm_name = null, - .description = "Enable dot_product Capability.", + .description = "Enable dot_product capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_integer_dot_product, .v1_6, @@ -479,7 +466,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.dot_product_input4x8bit)] = .{ .llvm_name = null, - .description = "Enable dot_product_input4x8bit Capability.", + .description = "Enable dot_product_input4x8bit capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_integer_dot_product, .v1_6, @@ -487,7 +474,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.dot_product_input4x8bit_packed)] = .{ .llvm_name = null, - .description = "Enable dot_product_input4x8bit_packed Capability.", + .description = "Enable dot_product_input4x8bit_packed capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_integer_dot_product, .v1_6, @@ -495,7 +482,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.dot_product_input_all)] = .{ .llvm_name = null, - .description = "Enable dot_product_input_all Capability.", + .description = "Enable dot_product_input_all capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_integer_dot_product, .v1_6, @@ -503,7 +490,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.draw_parameters)] = .{ .llvm_name = null, - .description = "Enable draw_parameters Capability.", + .description = "Enable draw_parameters capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_shader_draw_parameters, .v1_3, @@ -511,7 +498,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.expect_assume_khr)] = .{ .llvm_name = null, - .description = "Enable expect_assume_khr Capability.", + .description = "Enable expect_assume_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_expect_assume, .v1_0, @@ -519,28 +506,28 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.float16)] = .{ .llvm_name = null, - .description = "Enable float16 Capability.", + .description = "Enable float16 capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.float16buffer)] = .{ .llvm_name = null, - .description = "Enable float16buffer Capability.", + .description = "Enable float16buffer capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.float64)] = .{ .llvm_name = null, - .description = "Enable float64 Capability.", + .description = "Enable float64 capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.float8cooperative_matrix_ext)] = .{ .llvm_name = null, - .description = "Enable float8cooperative_matrix_ext Capability.", + .description = "Enable float8cooperative_matrix_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_float8, .v1_0, @@ -548,7 +535,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.float8ext)] = .{ .llvm_name = null, - .description = "Enable float8ext Capability.", + .description = "Enable float8ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_float8, .v1_0, @@ -556,7 +543,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.float_controls2)] = .{ .llvm_name = null, - .description = "Enable float_controls2 Capability.", + .description = "Enable float_controls2 capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_float_controls2, .v1_0, @@ -564,7 +551,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.fmakhr)] = .{ .llvm_name = null, - .description = "Enable fmakhr Capability.", + .description = "Enable fmakhr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_fma, .v1_0, @@ -572,7 +559,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.fragment_barycentric_khr)] = .{ .llvm_name = null, - .description = "Enable fragment_barycentric_khr Capability.", + .description = "Enable fragment_barycentric_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_fragment_shader_barycentric, .v1_0, @@ -580,7 +567,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.fragment_density_ext)] = .{ .llvm_name = null, - .description = "Enable fragment_density_ext Capability.", + .description = "Enable fragment_density_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_fragment_invocation_density, .v1_0, @@ -588,7 +575,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.fragment_fully_covered_ext)] = .{ .llvm_name = null, - .description = "Enable fragment_fully_covered_ext Capability.", + .description = "Enable fragment_fully_covered_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_fragment_fully_covered, .v1_0, @@ -596,7 +583,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.fragment_shader_pixel_interlock_ext)] = .{ .llvm_name = null, - .description = "Enable fragment_shader_pixel_interlock_ext Capability.", + .description = "Enable fragment_shader_pixel_interlock_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_fragment_shader_interlock, .v1_0, @@ -604,7 +591,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.fragment_shader_sample_interlock_ext)] = .{ .llvm_name = null, - .description = "Enable fragment_shader_sample_interlock_ext Capability.", + .description = "Enable fragment_shader_sample_interlock_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_fragment_shader_interlock, .v1_0, @@ -612,7 +599,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.fragment_shader_shading_rate_interlock_ext)] = .{ .llvm_name = null, - .description = "Enable fragment_shader_shading_rate_interlock_ext Capability.", + .description = "Enable fragment_shader_shading_rate_interlock_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_fragment_shader_interlock, .v1_0, @@ -620,7 +607,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.fragment_shading_rate_khr)] = .{ .llvm_name = null, - .description = "Enable fragment_shading_rate_khr Capability.", + .description = "Enable fragment_shading_rate_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_fragment_shading_rate, .v1_0, @@ -628,63 +615,63 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.generic_pointer)] = .{ .llvm_name = null, - .description = "Enable generic_pointer Capability.", + .description = "Enable generic_pointer capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.geometry)] = .{ .llvm_name = null, - .description = "Enable geometry Capability.", + .description = "Enable geometry capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.geometry_point_size)] = .{ .llvm_name = null, - .description = "Enable geometry_point_size Capability.", + .description = "Enable geometry_point_size capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.geometry_streams)] = .{ .llvm_name = null, - .description = "Enable geometry_streams Capability.", + .description = "Enable geometry_streams capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.group_non_uniform)] = .{ .llvm_name = null, - .description = "Enable group_non_uniform Capability.", + .description = "Enable group_non_uniform capability", .dependencies = featureSet(&[_]Feature{ .v1_3, }), }; result[@intFromEnum(Feature.group_non_uniform_arithmetic)] = .{ .llvm_name = null, - .description = "Enable group_non_uniform_arithmetic Capability.", + .description = "Enable group_non_uniform_arithmetic capability", .dependencies = featureSet(&[_]Feature{ .v1_3, }), }; result[@intFromEnum(Feature.group_non_uniform_ballot)] = .{ .llvm_name = null, - .description = "Enable group_non_uniform_ballot Capability.", + .description = "Enable group_non_uniform_ballot capability", .dependencies = featureSet(&[_]Feature{ .v1_3, }), }; result[@intFromEnum(Feature.group_non_uniform_clustered)] = .{ .llvm_name = null, - .description = "Enable group_non_uniform_clustered Capability.", + .description = "Enable group_non_uniform_clustered capability", .dependencies = featureSet(&[_]Feature{ .v1_3, }), }; result[@intFromEnum(Feature.group_non_uniform_partitioned_ext)] = .{ .llvm_name = null, - .description = "Enable group_non_uniform_partitioned_ext Capability.", + .description = "Enable group_non_uniform_partitioned_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_subgroup_partitioned, .v1_0, @@ -692,14 +679,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.group_non_uniform_quad)] = .{ .llvm_name = null, - .description = "Enable group_non_uniform_quad Capability.", + .description = "Enable group_non_uniform_quad capability", .dependencies = featureSet(&[_]Feature{ .v1_3, }), }; result[@intFromEnum(Feature.group_non_uniform_rotate_khr)] = .{ .llvm_name = null, - .description = "Enable group_non_uniform_rotate_khr Capability.", + .description = "Enable group_non_uniform_rotate_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_subgroup_rotate, .v1_0, @@ -707,28 +694,28 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.group_non_uniform_shuffle)] = .{ .llvm_name = null, - .description = "Enable group_non_uniform_shuffle Capability.", + .description = "Enable group_non_uniform_shuffle capability", .dependencies = featureSet(&[_]Feature{ .v1_3, }), }; result[@intFromEnum(Feature.group_non_uniform_shuffle_relative)] = .{ .llvm_name = null, - .description = "Enable group_non_uniform_shuffle_relative Capability.", + .description = "Enable group_non_uniform_shuffle_relative capability", .dependencies = featureSet(&[_]Feature{ .v1_3, }), }; result[@intFromEnum(Feature.group_non_uniform_vote)] = .{ .llvm_name = null, - .description = "Enable group_non_uniform_vote Capability.", + .description = "Enable group_non_uniform_vote capability", .dependencies = featureSet(&[_]Feature{ .v1_3, }), }; result[@intFromEnum(Feature.group_uniform_arithmetic_khr)] = .{ .llvm_name = null, - .description = "Enable group_uniform_arithmetic_khr Capability.", + .description = "Enable group_uniform_arithmetic_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_uniform_group_instructions, .v1_0, @@ -736,84 +723,84 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.groups)] = .{ .llvm_name = null, - .description = "Enable groups Capability.", + .description = "Enable groups capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.image_basic)] = .{ .llvm_name = null, - .description = "Enable image_basic Capability.", + .description = "Enable image_basic capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.image_buffer)] = .{ .llvm_name = null, - .description = "Enable image_buffer Capability.", + .description = "Enable image_buffer capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.image_cube_array)] = .{ .llvm_name = null, - .description = "Enable image_cube_array Capability.", + .description = "Enable image_cube_array capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.image_gather_extended)] = .{ .llvm_name = null, - .description = "Enable image_gather_extended Capability.", + .description = "Enable image_gather_extended capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.image_mipmap)] = .{ .llvm_name = null, - .description = "Enable image_mipmap Capability.", + .description = "Enable image_mipmap capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.image_ms_array)] = .{ .llvm_name = null, - .description = "Enable image_ms_array Capability.", + .description = "Enable image_ms_array capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.image_query)] = .{ .llvm_name = null, - .description = "Enable image_query Capability.", + .description = "Enable image_query capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.image_read_write)] = .{ .llvm_name = null, - .description = "Enable image_read_write Capability.", + .description = "Enable image_read_write capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.image_rect)] = .{ .llvm_name = null, - .description = "Enable image_rect Capability.", + .description = "Enable image_rect capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.input_attachment)] = .{ .llvm_name = null, - .description = "Enable input_attachment Capability.", + .description = "Enable input_attachment capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.input_attachment_array_dynamic_indexing)] = .{ .llvm_name = null, - .description = "Enable input_attachment_array_dynamic_indexing Capability.", + .description = "Enable input_attachment_array_dynamic_indexing capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_indexing, .v1_5, @@ -821,7 +808,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.input_attachment_array_non_uniform_indexing)] = .{ .llvm_name = null, - .description = "Enable input_attachment_array_non_uniform_indexing Capability.", + .description = "Enable input_attachment_array_non_uniform_indexing capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_indexing, .v1_5, @@ -829,28 +816,28 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.int16)] = .{ .llvm_name = null, - .description = "Enable int16 Capability.", + .description = "Enable int16 capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.int64)] = .{ .llvm_name = null, - .description = "Enable int64 Capability.", + .description = "Enable int64 capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.int64atomics)] = .{ .llvm_name = null, - .description = "Enable int64atomics Capability.", + .description = "Enable int64atomics capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.int64image_ext)] = .{ .llvm_name = null, - .description = "Enable int64image_ext Capability.", + .description = "Enable int64image_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_image_int64, .v1_0, @@ -858,42 +845,28 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.int8)] = .{ .llvm_name = null, - .description = "Enable int8 Capability.", + .description = "Enable int8 capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.interpolation_function)] = .{ .llvm_name = null, - .description = "Enable interpolation_function Capability.", - .dependencies = featureSet(&[_]Feature{ - .v1_0, - }), - }; - result[@intFromEnum(Feature.kernel)] = .{ - .llvm_name = null, - .description = "Enable kernel Capability.", - .dependencies = featureSet(&[_]Feature{ - .v1_0, - }), - }; - result[@intFromEnum(Feature.linkage)] = .{ - .llvm_name = null, - .description = "Enable linkage Capability.", + .description = "Enable interpolation_function capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.literal_sampler)] = .{ .llvm_name = null, - .description = "Enable literal_sampler Capability.", + .description = "Enable literal_sampler capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.long_vector_ext)] = .{ .llvm_name = null, - .description = "Enable long_vector_ext Capability.", + .description = "Enable long_vector_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_long_vector, .v1_0, @@ -901,14 +874,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.matrix)] = .{ .llvm_name = null, - .description = "Enable matrix Capability.", + .description = "Enable matrix capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.mesh_shading_ext)] = .{ .llvm_name = null, - .description = "Enable mesh_shading_ext Capability.", + .description = "Enable mesh_shading_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_mesh_shader, .v1_0, @@ -916,14 +889,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.min_lod)] = .{ .llvm_name = null, - .description = "Enable min_lod Capability.", + .description = "Enable min_lod capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.multi_view)] = .{ .llvm_name = null, - .description = "Enable multi_view Capability.", + .description = "Enable multi_view capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_multiview, .v1_3, @@ -931,52 +904,43 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.multi_viewport)] = .{ .llvm_name = null, - .description = "Enable multi_viewport Capability.", + .description = "Enable multi_viewport capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.named_barrier)] = .{ .llvm_name = null, - .description = "Enable named_barrier Capability.", + .description = "Enable named_barrier capability", .dependencies = featureSet(&[_]Feature{ .v1_1, }), }; result[@intFromEnum(Feature.opt_none_ext)] = .{ .llvm_name = null, - .description = "Enable opt_none_ext Capability.", + .description = "Enable opt_none_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_optnone, .v1_0, }), }; - result[@intFromEnum(Feature.physical_storage_buffer_addresses)] = .{ - .llvm_name = null, - .description = "Enable physical_storage_buffer_addresses Capability.", - .dependencies = featureSet(&[_]Feature{ - .SPV_EXT_physical_storage_buffer, - .SPV_KHR_physical_storage_buffer, - .v1_5, - }), - }; result[@intFromEnum(Feature.pipe_storage)] = .{ .llvm_name = null, - .description = "Enable pipe_storage Capability.", + .description = "Enable pipe_storage capability", .dependencies = featureSet(&[_]Feature{ .v1_1, }), }; result[@intFromEnum(Feature.pipes)] = .{ .llvm_name = null, - .description = "Enable pipes Capability.", + .description = "Enable pipes capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.poison_freeze_khr)] = .{ .llvm_name = null, - .description = "Enable poison_freeze_khr Capability.", + .description = "Enable poison_freeze_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_poison_freeze, .v1_0, @@ -984,7 +948,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.quad_control_khr)] = .{ .llvm_name = null, - .description = "Enable quad_control_khr Capability.", + .description = "Enable quad_control_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_quad_control, .v1_0, @@ -992,7 +956,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.ray_cull_mask_khr)] = .{ .llvm_name = null, - .description = "Enable ray_cull_mask_khr Capability.", + .description = "Enable ray_cull_mask_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_ray_cull_mask, .v1_0, @@ -1000,7 +964,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.ray_query_khr)] = .{ .llvm_name = null, - .description = "Enable ray_query_khr Capability.", + .description = "Enable ray_query_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_ray_query, .v1_0, @@ -1008,7 +972,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.ray_query_position_fetch_khr)] = .{ .llvm_name = null, - .description = "Enable ray_query_position_fetch_khr Capability.", + .description = "Enable ray_query_position_fetch_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_ray_tracing_position_fetch, .v1_0, @@ -1016,7 +980,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.ray_query_provisional_khr)] = .{ .llvm_name = null, - .description = "Enable ray_query_provisional_khr Capability.", + .description = "Enable ray_query_provisional_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_ray_query, .v1_0, @@ -1024,7 +988,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.ray_tracing_khr)] = .{ .llvm_name = null, - .description = "Enable ray_tracing_khr Capability.", + .description = "Enable ray_tracing_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_ray_tracing, .v1_0, @@ -1032,7 +996,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.ray_tracing_opacity_micromap_ext)] = .{ .llvm_name = null, - .description = "Enable ray_tracing_opacity_micromap_ext Capability.", + .description = "Enable ray_tracing_opacity_micromap_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_opacity_micromap, .v1_0, @@ -1040,7 +1004,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.ray_tracing_position_fetch_khr)] = .{ .llvm_name = null, - .description = "Enable ray_tracing_position_fetch_khr Capability.", + .description = "Enable ray_tracing_position_fetch_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_ray_tracing_position_fetch, .v1_0, @@ -1048,7 +1012,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.ray_tracing_provisional_khr)] = .{ .llvm_name = null, - .description = "Enable ray_tracing_provisional_khr Capability.", + .description = "Enable ray_tracing_provisional_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_ray_tracing, .v1_0, @@ -1056,7 +1020,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.ray_traversal_primitive_culling_khr)] = .{ .llvm_name = null, - .description = "Enable ray_traversal_primitive_culling_khr Capability.", + .description = "Enable ray_traversal_primitive_culling_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_ray_query, .SPV_KHR_ray_tracing, @@ -1065,7 +1029,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.replicated_composites_ext)] = .{ .llvm_name = null, - .description = "Enable replicated_composites_ext Capability.", + .description = "Enable replicated_composites_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_replicated_composites, .v1_0, @@ -1073,7 +1037,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.runtime_descriptor_array)] = .{ .llvm_name = null, - .description = "Enable runtime_descriptor_array Capability.", + .description = "Enable runtime_descriptor_array capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_indexing, .v1_5, @@ -1081,7 +1045,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.sample_mask_post_depth_coverage)] = .{ .llvm_name = null, - .description = "Enable sample_mask_post_depth_coverage Capability.", + .description = "Enable sample_mask_post_depth_coverage capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_post_depth_coverage, .v1_0, @@ -1089,35 +1053,35 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.sample_rate_shading)] = .{ .llvm_name = null, - .description = "Enable sample_rate_shading Capability.", + .description = "Enable sample_rate_shading capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.sampled_buffer)] = .{ .llvm_name = null, - .description = "Enable sampled_buffer Capability.", + .description = "Enable sampled_buffer capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.sampled_cube_array)] = .{ .llvm_name = null, - .description = "Enable sampled_cube_array Capability.", + .description = "Enable sampled_cube_array capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.sampled_image_array_dynamic_indexing)] = .{ .llvm_name = null, - .description = "Enable sampled_image_array_dynamic_indexing Capability.", + .description = "Enable sampled_image_array_dynamic_indexing capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.sampled_image_array_non_uniform_indexing)] = .{ .llvm_name = null, - .description = "Enable sampled_image_array_non_uniform_indexing Capability.", + .description = "Enable sampled_image_array_non_uniform_indexing capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_indexing, .v1_5, @@ -1125,21 +1089,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.sampled_rect)] = .{ .llvm_name = null, - .description = "Enable sampled_rect Capability.", - .dependencies = featureSet(&[_]Feature{ - .v1_0, - }), - }; - result[@intFromEnum(Feature.shader)] = .{ - .llvm_name = null, - .description = "Enable shader Capability.", + .description = "Enable sampled_rect capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.shader64bit_indexing_ext)] = .{ .llvm_name = null, - .description = "Enable shader64bit_indexing_ext Capability.", + .description = "Enable shader64bit_indexing_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_64bit_indexing, .v1_0, @@ -1147,7 +1104,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.shader_clock_khr)] = .{ .llvm_name = null, - .description = "Enable shader_clock_khr Capability.", + .description = "Enable shader_clock_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_shader_clock, .v1_0, @@ -1155,7 +1112,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.shader_invocation_reorder_ext)] = .{ .llvm_name = null, - .description = "Enable shader_invocation_reorder_ext Capability.", + .description = "Enable shader_invocation_reorder_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_invocation_reorder, .v1_0, @@ -1163,14 +1120,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.shader_layer)] = .{ .llvm_name = null, - .description = "Enable shader_layer Capability.", + .description = "Enable shader_layer capability", .dependencies = featureSet(&[_]Feature{ .v1_5, }), }; result[@intFromEnum(Feature.shader_non_uniform)] = .{ .llvm_name = null, - .description = "Enable shader_non_uniform Capability.", + .description = "Enable shader_non_uniform capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_indexing, .v1_5, @@ -1178,14 +1135,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.shader_viewport_index)] = .{ .llvm_name = null, - .description = "Enable shader_viewport_index Capability.", + .description = "Enable shader_viewport_index capability", .dependencies = featureSet(&[_]Feature{ .v1_5, }), }; result[@intFromEnum(Feature.shader_viewport_index_layer_ext)] = .{ .llvm_name = null, - .description = "Enable shader_viewport_index_layer_ext Capability.", + .description = "Enable shader_viewport_index_layer_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_viewport_index_layer, .v1_0, @@ -1193,7 +1150,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.signed_zero_inf_nan_preserve)] = .{ .llvm_name = null, - .description = "Enable signed_zero_inf_nan_preserve Capability.", + .description = "Enable signed_zero_inf_nan_preserve capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_float_controls, .v1_4, @@ -1201,314 +1158,309 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.sparse_residency)] = .{ .llvm_name = null, - .description = "Enable sparse_residency Capability.", + .description = "Enable sparse_residency capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.SPV_EXT_arithmetic_fence)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_arithmetic_fence Extension.", + .description = "Enable SPV_EXT_arithmetic_fence extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_demote_to_helper_invocation)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_demote_to_helper_invocation Extension.", + .description = "Enable SPV_EXT_demote_to_helper_invocation extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_descriptor_heap)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_descriptor_heap Extension.", + .description = "Enable SPV_EXT_descriptor_heap extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_descriptor_indexing)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_descriptor_indexing Extension.", + .description = "Enable SPV_EXT_descriptor_indexing extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_float8)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_float8 Extension.", + .description = "Enable SPV_EXT_float8 extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_fragment_fully_covered)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_fragment_fully_covered Extension.", + .description = "Enable SPV_EXT_fragment_fully_covered extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_fragment_invocation_density)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_fragment_invocation_density Extension.", + .description = "Enable SPV_EXT_fragment_invocation_density extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_fragment_shader_interlock)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_fragment_shader_interlock Extension.", + .description = "Enable SPV_EXT_fragment_shader_interlock extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_long_vector)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_long_vector Extension.", + .description = "Enable SPV_EXT_long_vector extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_mesh_shader)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_mesh_shader Extension.", + .description = "Enable SPV_EXT_mesh_shader extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_opacity_micromap)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_opacity_micromap Extension.", + .description = "Enable SPV_EXT_opacity_micromap extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_optnone)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_optnone Extension.", + .description = "Enable SPV_EXT_optnone extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_physical_storage_buffer)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_physical_storage_buffer Extension.", + .description = "Enable SPV_EXT_physical_storage_buffer extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_replicated_composites)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_replicated_composites Extension.", + .description = "Enable SPV_EXT_replicated_composites extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_shader_64bit_indexing)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_shader_64bit_indexing Extension.", + .description = "Enable SPV_EXT_shader_64bit_indexing extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float16_add)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_shader_atomic_float16_add Extension.", + .description = "Enable SPV_EXT_shader_atomic_float16_add extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float_add)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_shader_atomic_float_add Extension.", + .description = "Enable SPV_EXT_shader_atomic_float_add extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float_min_max)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_shader_atomic_float_min_max Extension.", + .description = "Enable SPV_EXT_shader_atomic_float_min_max extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_shader_image_int64)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_shader_image_int64 Extension.", + .description = "Enable SPV_EXT_shader_image_int64 extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_shader_invocation_reorder)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_shader_invocation_reorder Extension.", + .description = "Enable SPV_EXT_shader_invocation_reorder extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_shader_stencil_export)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_shader_stencil_export Extension.", + .description = "Enable SPV_EXT_shader_stencil_export extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_shader_subgroup_partitioned)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_shader_subgroup_partitioned Extension.", + .description = "Enable SPV_EXT_shader_subgroup_partitioned extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_shader_tile_image)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_shader_tile_image Extension.", + .description = "Enable SPV_EXT_shader_tile_image extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_EXT_shader_viewport_index_layer)] = .{ .llvm_name = null, - .description = "Enable SPV_EXT_shader_viewport_index_layer Extension.", + .description = "Enable SPV_EXT_shader_viewport_index_layer extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_16bit_storage)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_16bit_storage Extension.", + .description = "Enable SPV_KHR_16bit_storage extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_8bit_storage)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_8bit_storage Extension.", + .description = "Enable SPV_KHR_8bit_storage extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_abort)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_abort Extension.", + .description = "Enable SPV_KHR_abort extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_bfloat16)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_bfloat16 Extension.", + .description = "Enable SPV_KHR_bfloat16 extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_bit_instructions)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_bit_instructions Extension.", + .description = "Enable SPV_KHR_bit_instructions extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_compute_shader_derivatives)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_compute_shader_derivatives Extension.", + .description = "Enable SPV_KHR_compute_shader_derivatives extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_constant_data)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_constant_data Extension.", + .description = "Enable SPV_KHR_constant_data extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_cooperative_matrix)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_cooperative_matrix Extension.", + .description = "Enable SPV_KHR_cooperative_matrix extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_device_group)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_device_group Extension.", + .description = "Enable SPV_KHR_device_group extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_expect_assume)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_expect_assume Extension.", + .description = "Enable SPV_KHR_expect_assume extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_float_controls)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_float_controls Extension.", + .description = "Enable SPV_KHR_float_controls extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_float_controls2)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_float_controls2 Extension.", + .description = "Enable SPV_KHR_float_controls2 extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_fma)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_fma Extension.", + .description = "Enable SPV_KHR_fma extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_fragment_shader_barycentric)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_fragment_shader_barycentric Extension.", + .description = "Enable SPV_KHR_fragment_shader_barycentric extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_fragment_shading_rate)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_fragment_shading_rate Extension.", + .description = "Enable SPV_KHR_fragment_shading_rate extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_integer_dot_product)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_integer_dot_product Extension.", + .description = "Enable SPV_KHR_integer_dot_product extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_multiview)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_multiview Extension.", - .dependencies = featureSet(&[_]Feature{}), - }; - result[@intFromEnum(Feature.SPV_KHR_physical_storage_buffer)] = .{ - .llvm_name = null, - .description = "Enable SPV_KHR_physical_storage_buffer Extension.", + .description = "Enable SPV_KHR_multiview extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_poison_freeze)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_poison_freeze Extension.", + .description = "Enable SPV_KHR_poison_freeze extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_post_depth_coverage)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_post_depth_coverage Extension.", + .description = "Enable SPV_KHR_post_depth_coverage extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_quad_control)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_quad_control Extension.", + .description = "Enable SPV_KHR_quad_control extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_ray_cull_mask)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_ray_cull_mask Extension.", + .description = "Enable SPV_KHR_ray_cull_mask extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_ray_query)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_ray_query Extension.", + .description = "Enable SPV_KHR_ray_query extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_ray_tracing)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_ray_tracing Extension.", + .description = "Enable SPV_KHR_ray_tracing extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_ray_tracing_position_fetch)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_ray_tracing_position_fetch Extension.", + .description = "Enable SPV_KHR_ray_tracing_position_fetch extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_shader_atomic_counter_ops)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_shader_atomic_counter_ops Extension.", + .description = "Enable SPV_KHR_shader_atomic_counter_ops extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_shader_ballot)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_shader_ballot Extension.", + .description = "Enable SPV_KHR_shader_ballot extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_shader_clock)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_shader_clock Extension.", + .description = "Enable SPV_KHR_shader_clock extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_shader_draw_parameters)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_shader_draw_parameters Extension.", + .description = "Enable SPV_KHR_shader_draw_parameters extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_subgroup_rotate)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_subgroup_rotate Extension.", + .description = "Enable SPV_KHR_subgroup_rotate extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_subgroup_vote)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_subgroup_vote Extension.", + .description = "Enable SPV_KHR_subgroup_vote extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_uniform_group_instructions)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_uniform_group_instructions Extension.", + .description = "Enable SPV_KHR_uniform_group_instructions extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_untyped_pointers)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_untyped_pointers Extension.", + .description = "Enable SPV_KHR_untyped_pointers extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_variable_pointers)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_variable_pointers Extension.", + .description = "Enable SPV_KHR_variable_pointers extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_vulkan_memory_model)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_vulkan_memory_model Extension.", + .description = "Enable SPV_KHR_vulkan_memory_model extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.SPV_KHR_workgroup_memory_explicit_layout)] = .{ .llvm_name = null, - .description = "Enable SPV_KHR_workgroup_memory_explicit_layout Extension.", + .description = "Enable SPV_KHR_workgroup_memory_explicit_layout extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.stencil_export_ext)] = .{ .llvm_name = null, - .description = "Enable stencil_export_ext Capability.", + .description = "Enable stencil_export_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_stencil_export, .v1_0, @@ -1516,7 +1468,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.storage_buffer16bit_access)] = .{ .llvm_name = null, - .description = "Enable storage_buffer16bit_access Capability.", + .description = "Enable storage_buffer16bit_access capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_16bit_storage, .v1_3, @@ -1524,7 +1476,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.storage_buffer8bit_access)] = .{ .llvm_name = null, - .description = "Enable storage_buffer8bit_access Capability.", + .description = "Enable storage_buffer8bit_access capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_8bit_storage, .v1_5, @@ -1532,14 +1484,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.storage_buffer_array_dynamic_indexing)] = .{ .llvm_name = null, - .description = "Enable storage_buffer_array_dynamic_indexing Capability.", + .description = "Enable storage_buffer_array_dynamic_indexing capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.storage_buffer_array_non_uniform_indexing)] = .{ .llvm_name = null, - .description = "Enable storage_buffer_array_non_uniform_indexing Capability.", + .description = "Enable storage_buffer_array_non_uniform_indexing capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_indexing, .v1_5, @@ -1547,14 +1499,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.storage_image_array_dynamic_indexing)] = .{ .llvm_name = null, - .description = "Enable storage_image_array_dynamic_indexing Capability.", + .description = "Enable storage_image_array_dynamic_indexing capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.storage_image_array_non_uniform_indexing)] = .{ .llvm_name = null, - .description = "Enable storage_image_array_non_uniform_indexing Capability.", + .description = "Enable storage_image_array_non_uniform_indexing capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_indexing, .v1_5, @@ -1562,35 +1514,35 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.storage_image_extended_formats)] = .{ .llvm_name = null, - .description = "Enable storage_image_extended_formats Capability.", + .description = "Enable storage_image_extended_formats capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.storage_image_multisample)] = .{ .llvm_name = null, - .description = "Enable storage_image_multisample Capability.", + .description = "Enable storage_image_multisample capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.storage_image_read_without_format)] = .{ .llvm_name = null, - .description = "Enable storage_image_read_without_format Capability.", + .description = "Enable storage_image_read_without_format capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.storage_image_write_without_format)] = .{ .llvm_name = null, - .description = "Enable storage_image_write_without_format Capability.", + .description = "Enable storage_image_write_without_format capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.storage_input_output16)] = .{ .llvm_name = null, - .description = "Enable storage_input_output16 Capability.", + .description = "Enable storage_input_output16 capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_16bit_storage, .v1_3, @@ -1598,7 +1550,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.storage_push_constant16)] = .{ .llvm_name = null, - .description = "Enable storage_push_constant16 Capability.", + .description = "Enable storage_push_constant16 capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_16bit_storage, .v1_3, @@ -1606,7 +1558,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.storage_push_constant8)] = .{ .llvm_name = null, - .description = "Enable storage_push_constant8 Capability.", + .description = "Enable storage_push_constant8 capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_8bit_storage, .v1_5, @@ -1614,7 +1566,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.storage_texel_buffer_array_dynamic_indexing)] = .{ .llvm_name = null, - .description = "Enable storage_texel_buffer_array_dynamic_indexing Capability.", + .description = "Enable storage_texel_buffer_array_dynamic_indexing capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_indexing, .v1_5, @@ -1622,7 +1574,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.storage_texel_buffer_array_non_uniform_indexing)] = .{ .llvm_name = null, - .description = "Enable storage_texel_buffer_array_non_uniform_indexing Capability.", + .description = "Enable storage_texel_buffer_array_non_uniform_indexing capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_indexing, .v1_5, @@ -1630,7 +1582,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.subgroup_ballot_khr)] = .{ .llvm_name = null, - .description = "Enable subgroup_ballot_khr Capability.", + .description = "Enable subgroup_ballot_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_shader_ballot, .v1_0, @@ -1638,14 +1590,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.subgroup_dispatch)] = .{ .llvm_name = null, - .description = "Enable subgroup_dispatch Capability.", + .description = "Enable subgroup_dispatch capability", .dependencies = featureSet(&[_]Feature{ .v1_1, }), }; result[@intFromEnum(Feature.subgroup_vote_khr)] = .{ .llvm_name = null, - .description = "Enable subgroup_vote_khr Capability.", + .description = "Enable subgroup_vote_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_subgroup_vote, .v1_0, @@ -1653,21 +1605,21 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.tessellation)] = .{ .llvm_name = null, - .description = "Enable tessellation Capability.", + .description = "Enable tessellation capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.tessellation_point_size)] = .{ .llvm_name = null, - .description = "Enable tessellation_point_size Capability.", + .description = "Enable tessellation_point_size capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.tile_image_color_read_access_ext)] = .{ .llvm_name = null, - .description = "Enable tile_image_color_read_access_ext Capability.", + .description = "Enable tile_image_color_read_access_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_tile_image, .v1_0, @@ -1675,7 +1627,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.tile_image_depth_read_access_ext)] = .{ .llvm_name = null, - .description = "Enable tile_image_depth_read_access_ext Capability.", + .description = "Enable tile_image_depth_read_access_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_tile_image, .v1_0, @@ -1683,7 +1635,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.tile_image_stencil_read_access_ext)] = .{ .llvm_name = null, - .description = "Enable tile_image_stencil_read_access_ext Capability.", + .description = "Enable tile_image_stencil_read_access_ext capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_shader_tile_image, .v1_0, @@ -1691,14 +1643,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.transform_feedback)] = .{ .llvm_name = null, - .description = "Enable transform_feedback Capability.", + .description = "Enable transform_feedback capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.uniform_and_storage_buffer16bit_access)] = .{ .llvm_name = null, - .description = "Enable uniform_and_storage_buffer16bit_access Capability.", + .description = "Enable uniform_and_storage_buffer16bit_access capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_16bit_storage, .v1_3, @@ -1706,7 +1658,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.uniform_and_storage_buffer8bit_access)] = .{ .llvm_name = null, - .description = "Enable uniform_and_storage_buffer8bit_access Capability.", + .description = "Enable uniform_and_storage_buffer8bit_access capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_8bit_storage, .v1_5, @@ -1714,14 +1666,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.uniform_buffer_array_dynamic_indexing)] = .{ .llvm_name = null, - .description = "Enable uniform_buffer_array_dynamic_indexing Capability.", + .description = "Enable uniform_buffer_array_dynamic_indexing capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.uniform_buffer_array_non_uniform_indexing)] = .{ .llvm_name = null, - .description = "Enable uniform_buffer_array_non_uniform_indexing Capability.", + .description = "Enable uniform_buffer_array_non_uniform_indexing capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_indexing, .v1_5, @@ -1729,14 +1681,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.uniform_decoration)] = .{ .llvm_name = null, - .description = "Enable uniform_decoration Capability.", + .description = "Enable uniform_decoration capability", .dependencies = featureSet(&[_]Feature{ .v1_6, }), }; result[@intFromEnum(Feature.uniform_texel_buffer_array_dynamic_indexing)] = .{ .llvm_name = null, - .description = "Enable uniform_texel_buffer_array_dynamic_indexing Capability.", + .description = "Enable uniform_texel_buffer_array_dynamic_indexing capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_indexing, .v1_5, @@ -1744,7 +1696,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.uniform_texel_buffer_array_non_uniform_indexing)] = .{ .llvm_name = null, - .description = "Enable uniform_texel_buffer_array_non_uniform_indexing Capability.", + .description = "Enable uniform_texel_buffer_array_non_uniform_indexing capability", .dependencies = featureSet(&[_]Feature{ .SPV_EXT_descriptor_indexing, .v1_5, @@ -1752,7 +1704,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.untyped_pointers_khr)] = .{ .llvm_name = null, - .description = "Enable untyped_pointers_khr Capability.", + .description = "Enable untyped_pointers_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_untyped_pointers, .v1_0, @@ -1760,54 +1712,54 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.v1_0)] = .{ .llvm_name = null, - .description = "Enable v1_0 Extension.", + .description = "Enable v1_0 extension", .dependencies = featureSet(&[_]Feature{}), }; result[@intFromEnum(Feature.v1_1)] = .{ .llvm_name = null, - .description = "Enable v1_1 Extension.", + .description = "Enable v1_1 extension", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.v1_2)] = .{ .llvm_name = null, - .description = "Enable v1_2 Extension.", + .description = "Enable v1_2 extension", .dependencies = featureSet(&[_]Feature{ .v1_1, }), }; result[@intFromEnum(Feature.v1_3)] = .{ .llvm_name = null, - .description = "Enable v1_3 Extension.", + .description = "Enable v1_3 extension", .dependencies = featureSet(&[_]Feature{ .v1_2, }), }; result[@intFromEnum(Feature.v1_4)] = .{ .llvm_name = null, - .description = "Enable v1_4 Extension.", + .description = "Enable v1_4 extension", .dependencies = featureSet(&[_]Feature{ .v1_3, }), }; result[@intFromEnum(Feature.v1_5)] = .{ .llvm_name = null, - .description = "Enable v1_5 Extension.", + .description = "Enable v1_5 extension", .dependencies = featureSet(&[_]Feature{ .v1_4, }), }; result[@intFromEnum(Feature.v1_6)] = .{ .llvm_name = null, - .description = "Enable v1_6 Extension.", + .description = "Enable v1_6 extension", .dependencies = featureSet(&[_]Feature{ .v1_5, }), }; result[@intFromEnum(Feature.variable_pointers)] = .{ .llvm_name = null, - .description = "Enable variable_pointers Capability.", + .description = "Enable variable_pointers capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_variable_pointers, .v1_3, @@ -1815,7 +1767,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.variable_pointers_storage_buffer)] = .{ .llvm_name = null, - .description = "Enable variable_pointers_storage_buffer Capability.", + .description = "Enable variable_pointers_storage_buffer capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_variable_pointers, .v1_3, @@ -1823,14 +1775,14 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.vector16)] = .{ .llvm_name = null, - .description = "Enable vector16 Capability.", + .description = "Enable vector16 capability", .dependencies = featureSet(&[_]Feature{ .v1_0, }), }; result[@intFromEnum(Feature.vulkan_memory_model)] = .{ .llvm_name = null, - .description = "Enable vulkan_memory_model Capability.", + .description = "Enable vulkan_memory_model capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_vulkan_memory_model, .v1_5, @@ -1838,7 +1790,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.vulkan_memory_model_device_scope)] = .{ .llvm_name = null, - .description = "Enable vulkan_memory_model_device_scope Capability.", + .description = "Enable vulkan_memory_model_device_scope capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_vulkan_memory_model, .v1_5, @@ -1846,7 +1798,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.workgroup_memory_explicit_layout16bit_access_khr)] = .{ .llvm_name = null, - .description = "Enable workgroup_memory_explicit_layout16bit_access_khr Capability.", + .description = "Enable workgroup_memory_explicit_layout16bit_access_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_workgroup_memory_explicit_layout, .v1_0, @@ -1854,7 +1806,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.workgroup_memory_explicit_layout8bit_access_khr)] = .{ .llvm_name = null, - .description = "Enable workgroup_memory_explicit_layout8bit_access_khr Capability.", + .description = "Enable workgroup_memory_explicit_layout8bit_access_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_workgroup_memory_explicit_layout, .v1_0, @@ -1862,7 +1814,7 @@ pub const all_features = blk: { }; result[@intFromEnum(Feature.workgroup_memory_explicit_layout_khr)] = .{ .llvm_name = null, - .description = "Enable workgroup_memory_explicit_layout_khr Capability.", + .description = "Enable workgroup_memory_explicit_layout_khr capability", .dependencies = featureSet(&[_]Feature{ .SPV_KHR_workgroup_memory_explicit_layout, .v1_0, diff --git a/src/InternPool.zig b/src/InternPool.zig index fc4c4ebec11646d461ebc585cb7fcaa85e99371e..792b7636a46f0cf40686efe14bc490ef7d68f1f9 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -2148,12 +2148,26 @@ pub const Key = union(enum) { }; pub const SpirvType = extern struct { - /// A `spirv_reify` instruction. - zir_index: TrackedInst.Index, - /// Always 0. - padding: u32 = 0, - /// A hash of this type's attributes generated by Sema. - type_hash: u64, + /// If tag is `.image`, this is the sampled type or `.none` if `usage` is `.storage`. + /// If tag is `.sampled_image`, this is the image type. + /// If tag is `.runtime_array`, this is the element type. + /// Otherwise this is `.none`. + ty: Index, + flags: Flags, + + pub const Flags = packed struct(u32) { + tag: @typeInfo(std.lang.Type.Spirv).@"union".tag_type.?, + // Image type flags + usage: @typeInfo(std.lang.Type.Spirv.Image.Usage).@"union".tag_type.?, + format: std.lang.Type.Spirv.Image.Format, + dim: std.lang.Type.Spirv.Image.Dimensionality, + depth: std.lang.Type.Spirv.Image.Depth, + access: std.lang.Type.Spirv.Image.Access, + is_arrayed: bool, + is_multisampled: bool, + + _: u16 = 0, + }; }; pub const FuncType = struct { @@ -5054,6 +5068,7 @@ pub const Tag = enum(u8) { const EnumTag = Key.EnumTag; const Union = Key.Union; const TypePointer = Key.PtrType; + const TypeSpirv = Key.SpirvType; const struct_packed_encoding = .{ .summary = .@"{.payload.name%summary#\"}", @@ -5266,7 +5281,7 @@ pub const Tag = enum(u8) { }, .type_enum_explicit = enum_explicit_encoding, .type_enum_nonexhaustive = enum_explicit_encoding, - .type_spirv = .{ .summary = .@"{.payload.name%summary#\"}", .payload = Tag.TypeSpirv }, + .type_spirv = .{ .payload = Tag.TypeSpirv }, .type_opaque = .{ .summary = .@"{.payload.name%summary#\"}", .payload = TypeOpaque, @@ -5723,34 +5738,6 @@ pub const Tag = enum(u8) { name_nav: Nav.Index.Optional, namespace: NamespaceIndex, }; - - /// Trailing: - /// 0. type_hash: PackedU64 - pub const TypeSpirv = struct { - name: NullTerminatedString, - /// The index of the `reify_spirv_type` instruction. - zir_index: TrackedInst.Index, - /// If tag is `.image`, this is the sampled type or `.none` if `usage` is `.storage`. - /// If tag is `.sampled_image`, this is the image type. - /// If tag is `.runtime_array`, this is the element type. - /// Otherwise this is `.none`. - ty: Index, - flags: Flags, - - pub const Flags = packed struct(u32) { - tag: @typeInfo(std.lang.Type.Spirv).@"union".tag_type.?, - // Image type flags - usage: @typeInfo(std.lang.Type.Spirv.Image.Usage).@"union".tag_type.?, - format: std.lang.Type.Spirv.Image.Format, - dim: std.lang.Type.Spirv.Image.Dimensionality, - depth: std.lang.Type.Spirv.Image.Depth, - access: std.lang.Type.Spirv.Image.Access, - is_arrayed: bool, - is_multisampled: bool, - - _: u16 = 0, - }; - }; }; /// Differentiates between user-provided and compiler-generated backing types for packed and tagged types. @@ -6634,11 +6621,10 @@ pub fn indexToKey(ip: *const InternPool, index: Index) Key { }; } }, .type_spirv => .{ .spirv_type = ns: { - const extra_list = unwrapped_index.getExtra(ip); - const extra = extraDataTrail(extra_list, Tag.TypeSpirv, data); + const extra = extraData(unwrapped_index.getExtra(ip), Tag.TypeSpirv, data); break :ns .{ - .zir_index = extra.data.zir_index, - .type_hash = extraData(extra_list, PackedU64, extra.end).get(), + .ty = extra.ty, + .flags = extra.flags, }; } }, .type_opaque => .{ .opaque_type = ns: { @@ -8794,15 +8780,11 @@ pub fn getReifiedSpirvType( gpa: Allocator, io: Io, tid: Zcu.PerThread.Id, - ini: struct { - zir_index: TrackedInst.Index, - type_hash: u64, - type_spirv: Tag.TypeSpirv, - }, + type_spirv: Key.SpirvType, ) Allocator.Error!Index { var gop = try ip.getOrPutKey(gpa, io, tid, .{ .spirv_type = .{ - .zir_index = ini.zir_index, - .type_hash = ini.type_hash, + .ty = type_spirv.ty, + .flags = type_spirv.flags, } }); defer gop.deinit(); if (gop == .existing) return gop.existing; @@ -8812,11 +8794,8 @@ pub fn getReifiedSpirvType( const extra = local.getMutableExtra(gpa, io); try items.ensureUnusedCapacity(1); - try extra.ensureUnusedCapacity(@typeInfo(Tag.TypeSpirv).@"struct".field_names.len + - 2 // type_hash: PackedU64 - ); - const extra_index = addExtraAssumeCapacity(extra, ini.type_spirv); - _ = addExtraAssumeCapacity(extra, PackedU64.init(ini.type_hash)); + try extra.ensureUnusedCapacity(@typeInfo(Tag.TypeSpirv).@"struct".field_names.len); + const extra_index = addExtraAssumeCapacity(extra, type_spirv); items.appendAssumeCapacity(.{ .tag = .type_spirv, .data = extra_index }); return gop.put(); @@ -10711,7 +10690,7 @@ fn dumpStatsFallible(ip: *const InternPool, w: *Io.Writer, arena: Allocator) !vo .type_optional => 0, .type_anyframe => 0, .type_error_union => @sizeOf(Key.ErrorUnionType), - .type_spirv => @sizeOf(Tag.TypeSpirv) + @sizeOf(PackedU64), + .type_spirv => @sizeOf(Tag.TypeSpirv), .type_anyerror_union => 0, .type_error_set => b: { const info = extraData(extra_list, Tag.ErrorSet, data); diff --git a/src/Sema.zig b/src/Sema.zig index 2c1d69b23e071c3c2bdaff4a19ed9f5ba0684daa..835b95acb0768371855adc76ab7c7eb144bd933f 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -8629,6 +8629,20 @@ fn checkParamType( if (param_is_noalias and !param_ty.isGenericPoison() and !param_ty.isPtrAtRuntime(zcu) and !param_ty.isSliceAtRuntime(zcu)) { return sema.fail(block, param_src, "non-pointer parameter declared noalias", .{}); } + switch (target.os.tag) { + .vulkan, .opengl => if (cc != .@"inline" and param_ty.isPtrAtRuntime(zcu)) { + switch (param_ty.ptrAddressSpace(zcu)) { + .input, .output => |as| return sema.failWithOwnedErrorMsg(block, msg: { + const msg = try sema.errMsg(param_src, "function parameter cannot be a pointer in '{s}' address space", .{@tagName(as)}); + errdefer msg.destroy(sema.gpa); + try sema.errNote(param_src, msg, "mark the function as 'inline' so the parameter is substituted at call sites", .{}); + break :msg msg; + }), + else => {}, + } + }, + else => {}, + } } fn checkReturnTypeAndCallConv( @@ -20530,23 +20544,9 @@ fn zirReifySpirvType( return sema.failWithUseOfUndef(block, operand_src, null); } - // TODO: use a longer hash! - var hasher = std.hash.Wyhash.init(0); - std.hash.autoHash(&hasher, union_val.tag); - - const name = try ip.getOrPutStringFmt( - gpa, - io, - pt.tid, - "{f}__SpirvType_{d}", - .{ block.type_name_ctx.fmt(ip), @intFromEnum(inst) }, - .no_embedded_nulls, - ); const tag = try sema.interpretStdLangType(block, src, .fromInterned(union_val.tag), @typeInfo(std.lang.Type.Spirv).@"union".tag_type.?); - const ip_data: InternPool.Tag.TypeSpirv = switch (tag) { + const ip_data: InternPool.Key.SpirvType = switch (tag) { .sampler => .{ - .name = name, - .zir_index = tracked_inst, .ty = .none, .flags = .{ .tag = .sampler, @@ -20640,20 +20640,9 @@ fn zirReifySpirvType( else => {}, } - std.hash.autoHash(&hasher, usage_tag); - std.hash.autoHash(&hasher, format); - std.hash.autoHash(&hasher, dim); - std.hash.autoHash(&hasher, depth); - std.hash.autoHash(&hasher, access); - std.hash.autoHash(&hasher, arrayed); - std.hash.autoHash(&hasher, multisampled); - break :ip_data .{ - .name = name, - .zir_index = tracked_inst, .ty = blk: { const sampled_type = usage_val.unionPayload(zcu).toType(); - std.hash.autoHash(&hasher, sampled_type.toIntern()); if (target.os.tag != .opencl and sampled_type.toIntern() == .void_type) { return sema.fail(block, operand_src, "'void' type for '{t}' field is only valid under the 'opencl' os", .{usage_tag}); @@ -20726,10 +20715,7 @@ fn zirReifySpirvType( if (image_info.usage != .sampled) { return sema.fail(block, operand_src, "'sampled_image' element must be an image with 'usage = .sampled'", .{}); } - std.hash.autoHash(&hasher, union_val.val); break :blk .{ - .name = name, - .zir_index = tracked_inst, .ty = union_val.val, .flags = .{ .tag = tag, @@ -20754,10 +20740,7 @@ fn zirReifySpirvType( { return sema.fail(block, operand_src, "'runtime_array' of 'runtime_array' is not allowed under the 'vulkan' os", .{}); } - std.hash.autoHash(&hasher, union_val.val); break :blk .{ - .name = name, - .zir_index = tracked_inst, .ty = union_val.val, .flags = .{ .tag = tag, @@ -20773,11 +20756,7 @@ fn zirReifySpirvType( }, }; - return .fromIntern(try ip.getReifiedSpirvType(gpa, io, pt.tid, .{ - .zir_index = tracked_inst, - .type_hash = hasher.final(), - .type_spirv = ip_data, - })); + return .fromIntern(try ip.getReifiedSpirvType(gpa, io, pt.tid, ip_data)); } fn resolveVaListRef(sema: *Sema, block: *Block, src: LazySrcLoc, zir_ref: Zir.Inst.Ref) CompileError!Air.Inst.Ref { @@ -24966,12 +24945,28 @@ fn zirBuiltinExtern( } if (options.decoration) |decoration| switch (decoration) { - .flat => if (ptr_info.flags.address_space != .input) { - return sema.fail(block, options_src, "'flat' decoration requires 'input' address space", .{}); + .flat => switch (ptr_info.flags.address_space) { + .input, .output => {}, + else => return sema.fail(block, options_src, "\"flat\" decoration requires \"input\" or \"output\" address space", .{}), }, .location, .descriptor => {}, }; + switch (zcu.getTarget().os.tag) { + .vulkan, .opengl => switch (ptr_info.flags.address_space) { + .storage_buffer, .uniform, .push_constant => if (ptr_info.flags.size != .one) { + return sema.failWithOwnedErrorMsg(block, msg: { + const msg = try sema.errMsg(ty_src, "extern in '{s}' address space must be a single-item pointer to a struct", .{@tagName(ptr_info.flags.address_space)}); + errdefer msg.destroy(sema.gpa); + try sema.errNote(ty_src, msg, "wrap the element type in a struct containing a runtime-sized array", .{}); + break :msg msg; + }); + }, + else => {}, + }, + else => {}, + } + // TODO: error for threadlocal functions, non-const functions, etc const extern_val = try pt.getExtern(.{ diff --git a/src/Sema/type_resolution.zig b/src/Sema/type_resolution.zig index aabb8cfe2e3a48a7ee3830a3bcfbebe124faa950..116ee444f05dc2c575f6b2481378c8f11c8d9fd0 100644 --- a/src/Sema/type_resolution.zig +++ b/src/Sema/type_resolution.zig @@ -87,12 +87,15 @@ fn ensureLayoutResolvedInner(sema: *Sema, ty: Type, orig_ty: Type, reason: *cons .ptr_type, .anyframe_type, .simple_type, - .spirv_type, .opaque_type, .error_set_type, .inferred_error_set_type, => {}, + .spirv_type => if (ty.isSpirvRuntimeArray(zcu)) { + return ensureLayoutResolvedInner(sema, ty.childType(zcu), orig_ty, reason); + }, + .func_type => |func_type| { for (func_type.param_types.get(ip)) |param_ty| { try ensureLayoutResolvedInner(sema, .fromInterned(param_ty), orig_ty, reason); diff --git a/src/Type.zig b/src/Type.zig index 7c45eda413906fc41865d3392eba198e73e1cdcf..e648e48dd3c0e44ff49d743463b3400c4cc192f4 100644 --- a/src/Type.zig +++ b/src/Type.zig @@ -619,8 +619,21 @@ pub fn print(ty: Type, writer: *std.Io.Writer, pt: Zcu.PerThread, ctx: ?*Compari try writer.print("{f}", .{name.fmt(ip)}); }, .spirv_type => { - const name = ip.loadSpirvType(ty.toIntern()).name; - try writer.print("{f}", .{name.fmt(ip)}); + const info = ip.loadSpirvType(ty.toIntern()); + switch (info.flags.tag) { + .sampler => try writer.writeAll("@SpirvType(.sampler)"), + .image => try writer.writeAll("@SpirvType(.image)"), + .sampled_image => { + try writer.writeAll("@SpirvType(.sampled_image, "); + try print(Type.fromInterned(info.ty), writer, pt, ctx); + try writer.writeAll(")"); + }, + .runtime_array => { + try writer.writeAll("@SpirvType(.runtime_array, "); + try print(Type.fromInterned(info.ty), writer, pt, ctx); + try writer.writeAll(")"); + }, + } }, .func_type => |fn_info| { if (fn_info.is_noinline) { diff --git a/src/codegen/spirv/CodeGen.zig b/src/codegen/spirv/CodeGen.zig index dd8567c8ef4f18a1aa8e8a7b7110ddeb9b2b0d79..329ea763adde6ae390cfa0c6626aa740b9593338 100644 --- a/src/codegen/spirv/CodeGen.zig +++ b/src/codegen/spirv/CodeGen.zig @@ -17,6 +17,8 @@ uav_link: std.AutoHashMapUnmanaged(struct { InternPool.Index, spec.StorageClass entry_points: std.array_hash_map.Auto(Id, EntryPoint) = .empty, error_buffer: ?Decl.Index = null, struct_types: std.array_hash_map.Custom(StructType, Id, StructType.HashContext, true) = .empty, +/// SPIR-V ids of OpVariables whose pointee is a Block struct +block_var_ids: std.AutoHashMapUnmanaged(Id, void) = .empty, builtins: std.AutoHashMapUnmanaged(struct { spec.BuiltIn, spec.StorageClass }, Decl.Index) = .empty, sections: struct { // Module layout, according to SPIR-V Spec section 2.4, "Logical Layout of a Module". @@ -181,6 +183,7 @@ pub fn deinit(cg: *CodeGen) void { cg.sections.functions.deinit(gpa); cg.struct_types.deinit(gpa); + cg.block_var_ids.deinit(gpa); cg.builtins.deinit(gpa); cg.decls.deinit(gpa); @@ -587,6 +590,71 @@ pub fn structType( return result_id; } +/// Returns the layout-decorated variant of `ty` for use inside a Vulkan/OpenGL +/// interface block. Vulkan forbids nested Block decorations, so recursive calls +/// always pass `false`. +/// +/// This is distinct from `resolveType` because SPIR-V forbids such decorations +/// on the pointee of a Function-scope variable. +pub fn layoutType(cg: *CodeGen, ty: Type, is_block_root: bool) Error!Id { + const gpa = cg.gpa; + const zcu = cg.zcu; + const ip = &zcu.intern_pool; + + const result_id: Id = switch (ty.zigTypeTag(zcu)) { + .@"struct" => id: { + const struct_type = ip.loadStructType(ty.toIntern()); + if (struct_type.layout == .@"packed") return cg.resolveType(ty, .indirect); + + var member_types: std.ArrayList(Id) = .empty; + defer member_types.deinit(gpa); + const id = cg.allocId(); + if (is_block_root) try cg.decorate(id, .block); + var it = struct_type.iterateRuntimeOrder(ip); + while (it.next()) |field_index| { + const field_ty: Type = .fromInterned(struct_type.field_types.get(ip)[field_index]); + if (!field_ty.hasRuntimeBits(zcu)) continue; + try cg.decorateMember(id, @intCast(member_types.items.len), .{ .offset = .{ + .byte_offset = @intCast(ty.structFieldOffset(field_index, zcu)), + } }); + try member_types.append(gpa, try cg.layoutType(field_ty, false)); + } + try cg.sections.globals.emit(gpa, .OpTypeStruct, .{ + .id_result = id, + .id_ref = member_types.items, + }); + break :id id; + }, + .array => id: { + const elem_ty = ty.childType(zcu); + const elem_ty_id = try cg.layoutType(elem_ty, false); + const total_len = std.math.cast(u32, ty.arrayLenIncludingSentinel(zcu)) orelse + return cg.fail("array type of {} elements is too large", .{ty.arrayLenIncludingSentinel(zcu)}); + const id = try cg.arrayType(try cg.constInt(.u32, total_len), elem_ty_id); + if (elem_ty.hasRuntimeBits(zcu)) try cg.decorate(id, .{ + .array_stride = .{ .array_stride = @intCast(elem_ty.abiSize(zcu)) }, + }); + break :id id; + }, + .spirv => if (ty.isSpirvRuntimeArray(zcu)) id: { + const elem_ty = ty.childType(zcu); + const elem_ty_id = try cg.layoutType(elem_ty, false); + const id = cg.allocId(); + try cg.sections.globals.emit(gpa, .OpTypeRuntimeArray, .{ + .id_result = id, + .element_type = elem_ty_id, + }); + if (elem_ty.hasRuntimeBits(zcu)) try cg.decorate(id, .{ + .array_stride = .{ .array_stride = @intCast(elem_ty.abiSize(zcu)) }, + }); + break :id id; + } else return cg.resolveType(ty, .indirect), + else => return cg.resolveType(ty, .indirect), + }; + + return result_id; +} + pub fn functionType(cg: *CodeGen, return_ty_id: Id, param_type_ids: []const Id) !Id { const result_id = cg.allocId(); try cg.sections.globals.emit(cg.gpa, .OpTypeFunction, .{ @@ -806,7 +874,8 @@ pub fn genNav(cg: *CodeGen, do_codegen: bool) Error!void { const storage_class = cg.storageClass(nav.resolved.?.@"addrspace"); assert(storage_class != .generic); // These should be instance globals - const ty_id = try cg.resolveType(ty, .indirect); + const as = nav.resolved.?.@"addrspace"; + const ty_id = try cg.pointeeType(as, ty, true); const ptr_ty_id = try cg.ptrType(ty_id, storage_class); try cg.sections.globals.emit(gpa, .OpVariable, .{ @@ -819,15 +888,14 @@ pub fn genNav(cg: *CodeGen, do_codegen: bool) Error!void { .vulkan, .opengl => { switch (storage_class) { .uniform, .push_constant, .storage_buffer, .physical_storage_buffer => { - if (ty.zigTypeTag(zcu) == .@"struct" and storage_class != .physical_storage_buffer) { - try cg.decorate(ty_id, .block); - } - if (ty.hasRuntimeBits(zcu)) { try cg.decorate(ptr_ty_id, .{ .array_stride = .{ .array_stride = @intCast(ty.abiSize(zcu)) }, }); - try cg.decorateLayout(ty, ty_id); + if (!cg.needsLayout(as, ty)) try cg.decorateLayout(ty, ty_id); + } + if (key.is_const and storage_class == .storage_buffer) { + try cg.decorate(result_id, .non_writable); } }, else => {}, @@ -1815,6 +1883,9 @@ fn derivePtr(cg: *CodeGen, derivation: Value.PointerDeriveStep) !Id { const nav_ty_id = try cg.resolveType(nav_ty, .indirect); const decl_ptr_ty_id = try cg.ptrType(nav_ty_id, storage_class); + if (nav_ty.zigTypeTag(zcu) == .@"struct" and cg.needsLayout(nav.resolved.?.@"addrspace", nav_ty)) { + try cg.block_var_ids.put(gpa, spv_decl.result_id, {}); + } if (decl_ptr_ty_id == ty_id) return spv_decl.result_id; switch (target.os.tag) { .vulkan, .opengl => return spv_decl.result_id, @@ -1879,7 +1950,6 @@ fn derivePtr(cg: *CodeGen, derivation: Value.PointerDeriveStep) !Id { .offset_and_cast => |oac| { const parent_ptr_id = try cg.derivePtr(oac.parent.*); const parent_ptr_ty = try oac.parent.ptrType(pt); - const result_ty_id = try cg.resolveType(oac.new_ptr_ty, .direct); if (oac.new_ptr_ty.ptrInfo(zcu).flags.vector_index != .none) { return parent_ptr_id; @@ -1890,19 +1960,36 @@ fn derivePtr(cg: *CodeGen, derivation: Value.PointerDeriveStep) !Id { var cur = parent_ptr_ty.childType(zcu); const dst_child = oac.new_ptr_ty.childType(zcu); while (cur.toIntern() != dst_child.toIntern()) { - if (cur.zigTypeTag(zcu) == .array) { - cur = cur.childType(zcu); - depth += 1; - } else break; + switch (cur.zigTypeTag(zcu)) { + .array => { + cur = cur.childType(zcu); + depth += 1; + }, + .@"struct" => { + if (cur.structFieldCount(zcu) == 0) break; + if (cur.structFieldOffset(0, zcu) != 0) break; + cur = cur.fieldType(0, zcu); + depth += 1; + }, + else => break, + } } - if (depth > 0 and cur.toIntern() == dst_child.toIntern()) { - const scratch_top = cg.id_scratch.items.len; - defer cg.id_scratch.shrinkRetainingCapacity(scratch_top); - const zero = try cg.constInt(.u32, 0); - const ids = try cg.id_scratch.addManyAsSlice(gpa, depth); - @memset(ids, zero); - return cg.accessChainId(result_ty_id, parent_ptr_id, ids); + if (cur.toIntern() == dst_child.toIntern()) { + if (depth != 0) { + const as = oac.new_ptr_ty.ptrAddressSpace(zcu); + const child_ty_id = try cg.pointeeType(as, dst_child, false); + const result_ty_id = try cg.ptrType(child_ty_id, cg.storageClass(as)); + const scratch_top = cg.id_scratch.items.len; + defer cg.id_scratch.shrinkRetainingCapacity(scratch_top); + const zero = try cg.constInt(.u32, 0); + const ids = try cg.id_scratch.addManyAsSlice(gpa, depth); + @memset(ids, zero); + return cg.accessChainId(result_ty_id, parent_ptr_id, ids); + } else { + return parent_ptr_id; + } } + const result_ty_id = try cg.resolveType(oac.new_ptr_ty, .direct); if (target.os.tag == .opencl) { const result_ptr_id = cg.allocId(); try cg.body.emit(gpa, .OpBitcast, .{ @@ -4075,33 +4162,77 @@ fn extractVectorComponent(cg: *CodeGen, result_ty: Type, vector_id: Id, field: u const MemoryOptions = struct { is_volatile: bool = false, + ptr_address_space: std.lang.AddressSpace = .generic, }; +/// Returns true if a pointee at address space must use the +/// layout-decorated variant rather than the bare type. +fn needsLayout(cg: *CodeGen, as: std.lang.AddressSpace, pointee_ty: Type) bool { + const target = cg.zcu.getTarget(); + if (target.os.tag != .vulkan and target.os.tag != .opengl) return false; + switch (as) { + .uniform, .push_constant, .storage_buffer => {}, + else => return false, + } + return switch (pointee_ty.zigTypeTag(cg.zcu)) { + .@"struct", .array => true, + .spirv => pointee_ty.isSpirvRuntimeArray(cg.zcu), + else => false, + }; +} + +fn pointeeType(cg: *CodeGen, as: std.lang.AddressSpace, ty: Type, is_block_root: bool) !Id { + return if (cg.needsLayout(as, ty)) + cg.layoutType(ty, is_block_root) + else + cg.resolveType(ty, .indirect); +} + +fn convertLayout(cg: *CodeGen, dst_ty_id: Id, src_id: Id, src_ty_id: Id) !Id { + if (dst_ty_id == src_ty_id) return src_id; + const id = cg.allocId(); + try cg.body.emit(cg.gpa, .OpCopyLogical, .{ + .id_result_type = dst_ty_id, + .id_result = id, + .operand = src_id, + }); + return id; +} + fn load(cg: *CodeGen, value_ty: Type, ptr_id: Id, options: MemoryOptions) !Id { const zcu = cg.zcu; const alignment: u32 = @intCast(value_ty.abiAlignment(zcu).toByteUnits().?); - const indirect_value_ty_id = try cg.resolveType(value_ty, .indirect); - const result_id = cg.allocId(); - const access: spec.MemoryAccess.Extended = .{ - .@"volatile" = options.is_volatile, - .aligned = .{ .literal_integer = alignment }, - }; + const bare_ty_id = try cg.resolveType(value_ty, .indirect); + const load_ty_id = if (cg.needsLayout(options.ptr_address_space, value_ty)) + try cg.layoutType(value_ty, cg.block_var_ids.contains(ptr_id)) + else + bare_ty_id; + const loaded_id = cg.allocId(); try cg.body.emit(cg.gpa, .OpLoad, .{ - .id_result_type = indirect_value_ty_id, - .id_result = result_id, + .id_result_type = load_ty_id, + .id_result = loaded_id, .pointer = ptr_id, - .memory_access = access, + .memory_access = .{ + .@"volatile" = options.is_volatile, + .aligned = .{ .literal_integer = alignment }, + }, }); + const result_id = try cg.convertLayout(bare_ty_id, loaded_id, load_ty_id); return try cg.convertToDirect(value_ty, result_id); } fn store(cg: *CodeGen, value_ty: Type, ptr_id: Id, value_id: Id, options: MemoryOptions) !void { - const indirect_value_id = try cg.convertToIndirect(value_ty, value_id); - const access: spec.MemoryAccess.Extended = .{ .@"volatile" = options.is_volatile }; + const bare_value_id = try cg.convertToIndirect(value_ty, value_id); + const bare_ty_id = try cg.resolveType(value_ty, .indirect); + const store_ty_id = if (cg.needsLayout(options.ptr_address_space, value_ty)) + try cg.layoutType(value_ty, cg.block_var_ids.contains(ptr_id)) + else + bare_ty_id; + const object_id = try cg.convertLayout(store_ty_id, bare_value_id, bare_ty_id); try cg.body.emit(cg.gpa, .OpStore, .{ .pointer = ptr_id, - .object = indirect_value_id, - .memory_access = access, + .object = object_id, + .memory_access = .{ .@"volatile" = options.is_volatile }, }); } @@ -5499,6 +5630,8 @@ fn ptrAccessChain( }); }, .vulkan, .opengl => { + assert(target.cpu.has(.spirv, .variable_pointers) or + target.cpu.has(.spirv, .variable_pointers_storage_buffer)); try cg.body.emit(gpa, .OpPtrAccessChain, .{ .id_result_type = result_ty_id, .id_result = result_id, @@ -5514,23 +5647,18 @@ fn ptrAccessChain( fn ptrAdd(cg: *CodeGen, result_ty: Type, ptr_ty: Type, ptr_id: Id, offset_id: Id) !Id { const zcu = cg.zcu; - const result_ty_id = try cg.resolveType(result_ty, .direct); - - switch (ptr_ty.ptrSize(zcu)) { - .one => { - // Pointer to array - // TODO: Is this correct? - return try cg.accessChainId(result_ty_id, ptr_id, &.{offset_id}); - }, - .c, .many => { - return try cg.ptrAccessChain(result_ty_id, ptr_id, offset_id, &.{}); - }, - .slice => { + const as = result_ty.ptrAddressSpace(zcu); + const child_ty_id = try cg.pointeeType(as, result_ty.childType(zcu), false); + const result_ty_id = try cg.ptrType(child_ty_id, cg.storageClass(as)); + return switch (ptr_ty.ptrSize(zcu)) { + .one => cg.accessChainId(result_ty_id, ptr_id, &.{offset_id}), + .c, .many => cg.ptrAccessChain(result_ty_id, ptr_id, offset_id, &.{}), + .slice => blk: { // TODO: This is probably incorrect. A slice should be returned here, though this is what llvm does. const slice_ptr_id = try cg.extractField(result_ty, ptr_id, 0); - return try cg.ptrAccessChain(result_ty_id, slice_ptr_id, offset_id, &.{}); + break :blk cg.ptrAccessChain(result_ty_id, slice_ptr_id, offset_id, &.{}); }, - } + }; } fn airPtrAdd(cg: *CodeGen, inst: Air.Inst.Index) !?Id { @@ -6476,16 +6604,16 @@ fn airSliceElemVal(cg: *CodeGen, inst: Air.Inst.Index) !?Id { fn ptrElemPtr(cg: *CodeGen, ptr_ty: Type, ptr_id: Id, index_id: Id) !Id { const zcu = cg.zcu; // Construct new pointer type for the resulting pointer - const elem_ty = ptr_ty.indexableElem(zcu); - const elem_ty_id = try cg.resolveType(elem_ty, .indirect); - const elem_ptr_ty_id = try cg.ptrType(elem_ty_id, cg.storageClass(ptr_ty.ptrAddressSpace(zcu))); + const as = ptr_ty.ptrAddressSpace(zcu); + const elem_ty_id = try cg.pointeeType(as, ptr_ty.indexableElem(zcu), false); + const elem_ptr_ty_id = try cg.ptrType(elem_ty_id, cg.storageClass(as)); if (ptr_ty.isSinglePointer(zcu)) { // Pointer-to-array. In this case, the resulting pointer is not of the same type // as the ptr_ty (we want a *T, not a *[N]T), and hence we need to use accessChain. - return try cg.accessChainId(elem_ptr_ty_id, ptr_id, &.{index_id}); + return cg.accessChainId(elem_ptr_ty_id, ptr_id, &.{index_id}); } else { // Resulting pointer type is the same as the ptr_ty, so use ptrAccessChain - return try cg.ptrAccessChain(elem_ptr_ty_id, ptr_id, index_id, &.{}); + return cg.ptrAccessChain(elem_ptr_ty_id, ptr_id, index_id, &.{}); } } @@ -7369,7 +7497,10 @@ fn airLoad(cg: *CodeGen, inst: Air.Inst.Index) !?Id { break :ptr_id try cg.accessChain(elem_ptr_ty_id, operand_ptr_id, &.{@intFromEnum(index)}); }, }; - return try cg.load(elem_ty, ptr_id, .{ .is_volatile = ptr_info.flags.is_volatile }); + return try cg.load(elem_ty, ptr_id, .{ + .is_volatile = ptr_info.flags.is_volatile, + .ptr_address_space = ptr_info.flags.address_space, + }); } fn airStore(cg: *CodeGen, inst: Air.Inst.Index) !void { @@ -7441,7 +7572,10 @@ fn airStore(cg: *CodeGen, inst: Air.Inst.Index) !void { }, }; - try cg.store(elem_ty, ptr_id, value_id, .{ .is_volatile = ptr_info.flags.is_volatile }); + try cg.store(elem_ty, ptr_id, value_id, .{ + .is_volatile = ptr_info.flags.is_volatile, + .ptr_address_space = ptr_info.flags.address_space, + }); } fn airRet(cg: *CodeGen, inst: Air.Inst.Index) !void { diff --git a/src/link/SpirV.zig b/src/link/SpirV.zig index e6cdabd133e641406bfd0ef96328e9fe8e07469a..be2e2e47ec30e6fb699cf175d17994d392f34da5 100644 --- a/src/link/SpirV.zig +++ b/src/link/SpirV.zig @@ -628,14 +628,18 @@ fn emitPreamble( if (has_linkage) caps.insert(.linkage); inline for (@typeInfo(spec.Capability).@"enum".field_names) |cap_name| { - if (target.cpu.has(.spirv, @field(std.Target.spirv.Feature, cap_name))) - caps.insert(@field(spec.Capability, cap_name)); + if (@hasField(std.Target.spirv.Feature, cap_name)) { + if (target.cpu.has(.spirv, @field(std.Target.spirv.Feature, cap_name))) + caps.insert(@field(spec.Capability, cap_name)); + } } inline for (@typeInfo(spec.Extension).@"enum".field_names) |ext_name| { switch (@field(spec.Extension, ext_name)) { .v1_0, .v1_1, .v1_2, .v1_3, .v1_4, .v1_5, .v1_6 => {}, - else => if (target.cpu.has(.spirv, @field(std.Target.spirv.Feature, ext_name))) - try exts.put(gpa, ext_name, {}), + else => if (@hasField(std.Target.spirv.Feature, ext_name)) { + if (target.cpu.has(.spirv, @field(std.Target.spirv.Feature, ext_name))) + try exts.put(gpa, ext_name, {}); + }, } } diff --git a/test/behavior/spirv.zig b/test/behavior/spirv.zig index 6d11032959e665ed26063894e494cd7084f953e4..7bb632b483297fa1e058d6e1940b09cc883a107b 100644 --- a/test/behavior/spirv.zig +++ b/test/behavior/spirv.zig @@ -1,3 +1,6 @@ +const std = @import("std"); +const expect = std.testing.expect; + const Sampler = @SpirvType(.sampler); const Image = @SpirvType(.{ .image = .{ .usage = .{ .sampled = u32 }, @@ -45,3 +48,29 @@ test "@SpirvType" { _ = storage_image; _ = runtime_array; } + +test "@SpirvType equality" { + try expect(@SpirvType(.sampler) == Sampler); + try expect(@SpirvType(.{ .runtime_array = u32 }) == RuntimeArray); + try expect(@SpirvType(.{ .sampled_image = Image }) == SampledImage); + try expect(@SpirvType(.{ .image = .{ + .usage = .{ .sampled = u32 }, + .format = .unknown, + .dim = .@"2d", + .depth = .unknown, + .arrayed = false, + .multisampled = false, + .access = .unknown, + } }) == Image); + try expect(@SpirvType(.{ .image = .{ + .usage = .{ .sampled = u32 }, + .format = .unknown, + .dim = .@"3d", + .depth = .unknown, + .arrayed = false, + .multisampled = false, + .access = .unknown, + } }) != Image); + try expect(@SpirvType(.{ .runtime_array = u32 }) != @SpirvType(.{ .runtime_array = u8 })); + try expect(@SpirvType(.sampler) != @SpirvType(.{ .runtime_array = u32 })); +} diff --git a/test/cases/compile_errors/extern_spirv_decoration_validation.zig b/test/cases/compile_errors/extern_spirv_decoration_validation.zig index ea51feb3b931f5d6a93d8640a9a8819251bb3cfc..ae64963849857b2ba6b95f45b33c179b6700870b 100644 --- a/test/cases/compile_errors/extern_spirv_decoration_validation.zig +++ b/test/cases/compile_errors/extern_spirv_decoration_validation.zig @@ -1,4 +1,4 @@ -const x = @extern(*addrspace(.output) u32, .{ +const x = @extern(*addrspace(.push_constant) u32, .{ .name = "x", .decoration = .{ .flat = 0 }, }); @@ -10,4 +10,4 @@ comptime { // backend=selfhosted // target=spirv32-vulkan // -// :1:45: error: 'flat' decoration requires 'input' address space +// :1:45: error: "flat" decoration requires "input" or "output" address space diff --git a/test/cases/compile_errors/extern_spirv_storage_buffer_must_be_single_pointer.zig b/test/cases/compile_errors/extern_spirv_storage_buffer_must_be_single_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..3b8ac3c8338afff5ca93773f973d399fd6c51d1b --- /dev/null +++ b/test/cases/compile_errors/extern_spirv_storage_buffer_must_be_single_pointer.zig @@ -0,0 +1,25 @@ +const a = @extern([*]addrspace(.storage_buffer) u32, .{ + .name = "a", + .decoration = .{ .descriptor = .{ .set = 0, .binding = 0 } }, +}); +const b = @extern([]addrspace(.uniform) u32, .{ + .name = "b", + .decoration = .{ .descriptor = .{ .set = 0, .binding = 1 } }, +}); +const c = @extern([*c]addrspace(.push_constant) u32, .{ .name = "c" }); +comptime { + _ = a; + _ = b; + _ = c; +} + +// error +// backend=selfhosted +// target=spirv32-vulkan +// +// :1:19: error: extern in 'storage_buffer' address space must be a single-item pointer to a struct +// :1:19: note: wrap the element type in a struct containing a runtime-sized array +// :5:19: error: extern in 'uniform' address space must be a single-item pointer to a struct +// :5:19: note: wrap the element type in a struct containing a runtime-sized array +// :9:19: error: extern in 'push_constant' address space must be a single-item pointer to a struct +// :9:19: note: wrap the element type in a struct containing a runtime-sized array diff --git a/tools/update_cpu_features.zig b/tools/update_cpu_features.zig index 7ee0fb9af538dc8aec13ec7cd98ac7d471f13299..f7b4de724bedebd4c770ce15b161ef1774c3c4e9 100644 --- a/tools/update_cpu_features.zig +++ b/tools/update_cpu_features.zig @@ -50,19 +50,29 @@ const ArchTarget = struct { branch_quota: ?usize = null, }; -const spirv_extra_features = blk: { - const caps_info = @typeInfo(spirv_spec.Capability).@"enum"; - const exts_info = @typeInfo(spirv_spec.Extension).@"enum"; - const caps_len = caps_info.field_names.len; - const exts_len = exts_info.field_names.len; +const spirv_omitted_capabilities = [_][]const u8{ + "shader", // implied by Vulkan/OpenGL targets + "kernel", // implied by OpenCL/AMDHSA targets + "addresses", // implied by OpenCL/AMDHSA targets + "physical_storage_buffer_addresses", // implied by spirv64-vulkan + "linkage", // automatically emitted when externs need linkage decorations +}; +const spirv_omitted_extensions = [_][]const u8{ + "SPV_KHR_physical_storage_buffer", // paired with physical_storage_buffer_addresses +}; - var features: [caps_len + exts_len]Feature = undefined; - for ( - caps_info.field_names, - caps_info.field_values, - features[0..caps_len], - ) |name, value, *feature| { - feature.* = .{ +const spirv_extra_features: []const Feature = blk: { + @setEvalBranchQuota(15_000); + var features: []const Feature = &.{}; + + cap: for ( + @typeInfo(spirv_spec.Capability).@"enum".field_names, + @typeInfo(spirv_spec.Capability).@"enum".field_values, + ) |name, value| { + for (spirv_omitted_capabilities) |omitted| { + if (std.mem.eql(u8, omitted, name)) continue :cap; + } + features = features ++ &[_]Feature{.{ .zig_name = name, .desc = "Enable " ++ name ++ " capability", .deps = &struct { @@ -73,11 +83,14 @@ const spirv_extra_features = blk: { break :inner out; }; }.deps, - }; + }}; } - for (exts_info.field_names, features[caps_len..]) |name, *feature| { - feature.* = .{ + ext: for (@typeInfo(spirv_spec.Extension).@"enum".field_names) |name| { + for (spirv_omitted_extensions) |omitted| { + if (std.mem.eql(u8, omitted, name)) continue :ext; + } + features = features ++ &[_]Feature{.{ .zig_name = name, .desc = "Enable " ++ name ++ " extension", .deps = if (std.mem.eql(u8, name, "v1_6")) @@ -94,7 +107,7 @@ const spirv_extra_features = blk: { &.{"v1_0"} else &.{}, - }; + }}; } break :blk features; @@ -1494,7 +1507,7 @@ const targets = [_]ArchTarget{ .td_name = "SPIRV", }, .branch_quota = 2000, - .extra_features = &spirv_extra_features, + .extra_features = spirv_extra_features, .extra_cpus = &.{ .{ .llvm_name = null,