authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-07-01 10:19:26+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-07-01 10:19:26+02:00
log426de8e4b21676599fbdbb0cae6f724718a8a076
tree0f307740120d36f28a1a8a7c0f8cd6b3dd289706
parent15f00d1756f1503da29151cef5213858f6667f4f
parentae4fc20de3543370e8a27989c5957e34f4638676

Merge pull request 'SPIR-V: miscellaneous changes' (#35974) from spirv-fixes into master

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/35974 Reviewed-by: Ali Cheraghi <alichraghi@noreply.codeberg.org>

11 files changed, 593 insertions(+), 446 deletions(-)

lib/std/Target/spirv.zig+228-276
......@@ -6,7 +6,6 @@ const CpuModel = std.Target.Cpu.Model;
66
77pub const Feature = enum {
88 abort_khr,
9 addresses,
109 arithmetic_fence_ext,
1110 atomic_float16add_ext,
1211 atomic_float16min_max_ext,
......@@ -87,8 +86,6 @@ pub const Feature = enum {
8786 int64image_ext,
8887 int8,
8988 interpolation_function,
90 kernel,
91 linkage,
9289 literal_sampler,
9390 long_vector_ext,
9491 matrix,
......@@ -98,7 +95,6 @@ pub const Feature = enum {
9895 multi_viewport,
9996 named_barrier,
10097 opt_none_ext,
101 physical_storage_buffer_addresses,
10298 pipe_storage,
10399 pipes,
104100 poison_freeze_khr,
......@@ -121,7 +117,6 @@ pub const Feature = enum {
121117 sampled_image_array_dynamic_indexing,
122118 sampled_image_array_non_uniform_indexing,
123119 sampled_rect,
124 shader,
125120 shader64bit_indexing_ext,
126121 shader_clock_khr,
127122 shader_invocation_reorder_ext,
......@@ -172,7 +167,6 @@ pub const Feature = enum {
172167 SPV_KHR_fragment_shading_rate,
173168 SPV_KHR_integer_dot_product,
174169 SPV_KHR_multiview,
175 SPV_KHR_physical_storage_buffer,
176170 SPV_KHR_poison_freeze,
177171 SPV_KHR_post_depth_coverage,
178172 SPV_KHR_quad_control,
......@@ -253,22 +247,15 @@ pub const all_features = blk: {
253247 var result: [len]CpuFeature = undefined;
254248 result[@intFromEnum(Feature.abort_khr)] = .{
255249 .llvm_name = null,
256 .description = "Enable abort_khr Capability.",
250 .description = "Enable abort_khr capability",
257251 .dependencies = featureSet(&[_]Feature{
258252 .SPV_KHR_abort,
259253 .v1_0,
260254 }),
261255 };
262 result[@intFromEnum(Feature.addresses)] = .{
263 .llvm_name = null,
264 .description = "Enable addresses Capability.",
265 .dependencies = featureSet(&[_]Feature{
266 .v1_0,
267 }),
268 };
269256 result[@intFromEnum(Feature.arithmetic_fence_ext)] = .{
270257 .llvm_name = null,
271 .description = "Enable arithmetic_fence_ext Capability.",
258 .description = "Enable arithmetic_fence_ext capability",
272259 .dependencies = featureSet(&[_]Feature{
273260 .SPV_EXT_arithmetic_fence,
274261 .v1_0,
......@@ -276,7 +263,7 @@ pub const all_features = blk: {
276263 };
277264 result[@intFromEnum(Feature.atomic_float16add_ext)] = .{
278265 .llvm_name = null,
279 .description = "Enable atomic_float16add_ext Capability.",
266 .description = "Enable atomic_float16add_ext capability",
280267 .dependencies = featureSet(&[_]Feature{
281268 .SPV_EXT_shader_atomic_float16_add,
282269 .v1_0,
......@@ -284,7 +271,7 @@ pub const all_features = blk: {
284271 };
285272 result[@intFromEnum(Feature.atomic_float16min_max_ext)] = .{
286273 .llvm_name = null,
287 .description = "Enable atomic_float16min_max_ext Capability.",
274 .description = "Enable atomic_float16min_max_ext capability",
288275 .dependencies = featureSet(&[_]Feature{
289276 .SPV_EXT_shader_atomic_float_min_max,
290277 .v1_0,
......@@ -292,7 +279,7 @@ pub const all_features = blk: {
292279 };
293280 result[@intFromEnum(Feature.atomic_float32add_ext)] = .{
294281 .llvm_name = null,
295 .description = "Enable atomic_float32add_ext Capability.",
282 .description = "Enable atomic_float32add_ext capability",
296283 .dependencies = featureSet(&[_]Feature{
297284 .SPV_EXT_shader_atomic_float_add,
298285 .v1_0,
......@@ -300,7 +287,7 @@ pub const all_features = blk: {
300287 };
301288 result[@intFromEnum(Feature.atomic_float32min_max_ext)] = .{
302289 .llvm_name = null,
303 .description = "Enable atomic_float32min_max_ext Capability.",
290 .description = "Enable atomic_float32min_max_ext capability",
304291 .dependencies = featureSet(&[_]Feature{
305292 .SPV_EXT_shader_atomic_float_min_max,
306293 .v1_0,
......@@ -308,7 +295,7 @@ pub const all_features = blk: {
308295 };
309296 result[@intFromEnum(Feature.atomic_float64add_ext)] = .{
310297 .llvm_name = null,
311 .description = "Enable atomic_float64add_ext Capability.",
298 .description = "Enable atomic_float64add_ext capability",
312299 .dependencies = featureSet(&[_]Feature{
313300 .SPV_EXT_shader_atomic_float_add,
314301 .v1_0,
......@@ -316,7 +303,7 @@ pub const all_features = blk: {
316303 };
317304 result[@intFromEnum(Feature.atomic_float64min_max_ext)] = .{
318305 .llvm_name = null,
319 .description = "Enable atomic_float64min_max_ext Capability.",
306 .description = "Enable atomic_float64min_max_ext capability",
320307 .dependencies = featureSet(&[_]Feature{
321308 .SPV_EXT_shader_atomic_float_min_max,
322309 .v1_0,
......@@ -324,14 +311,14 @@ pub const all_features = blk: {
324311 };
325312 result[@intFromEnum(Feature.atomic_storage)] = .{
326313 .llvm_name = null,
327 .description = "Enable atomic_storage Capability.",
314 .description = "Enable atomic_storage capability",
328315 .dependencies = featureSet(&[_]Feature{
329316 .v1_0,
330317 }),
331318 };
332319 result[@intFromEnum(Feature.atomic_storage_ops)] = .{
333320 .llvm_name = null,
334 .description = "Enable atomic_storage_ops Capability.",
321 .description = "Enable atomic_storage_ops capability",
335322 .dependencies = featureSet(&[_]Feature{
336323 .SPV_KHR_shader_atomic_counter_ops,
337324 .v1_0,
......@@ -339,7 +326,7 @@ pub const all_features = blk: {
339326 };
340327 result[@intFromEnum(Feature.b_float16cooperative_matrix_khr)] = .{
341328 .llvm_name = null,
342 .description = "Enable b_float16cooperative_matrix_khr Capability.",
329 .description = "Enable b_float16cooperative_matrix_khr capability",
343330 .dependencies = featureSet(&[_]Feature{
344331 .SPV_KHR_bfloat16,
345332 .v1_0,
......@@ -347,7 +334,7 @@ pub const all_features = blk: {
347334 };
348335 result[@intFromEnum(Feature.b_float16dot_product_khr)] = .{
349336 .llvm_name = null,
350 .description = "Enable b_float16dot_product_khr Capability.",
337 .description = "Enable b_float16dot_product_khr capability",
351338 .dependencies = featureSet(&[_]Feature{
352339 .SPV_KHR_bfloat16,
353340 .v1_0,
......@@ -355,7 +342,7 @@ pub const all_features = blk: {
355342 };
356343 result[@intFromEnum(Feature.b_float16type_khr)] = .{
357344 .llvm_name = null,
358 .description = "Enable b_float16type_khr Capability.",
345 .description = "Enable b_float16type_khr capability",
359346 .dependencies = featureSet(&[_]Feature{
360347 .SPV_KHR_bfloat16,
361348 .v1_0,
......@@ -363,7 +350,7 @@ pub const all_features = blk: {
363350 };
364351 result[@intFromEnum(Feature.bit_instructions)] = .{
365352 .llvm_name = null,
366 .description = "Enable bit_instructions Capability.",
353 .description = "Enable bit_instructions capability",
367354 .dependencies = featureSet(&[_]Feature{
368355 .SPV_KHR_bit_instructions,
369356 .v1_0,
......@@ -371,14 +358,14 @@ pub const all_features = blk: {
371358 };
372359 result[@intFromEnum(Feature.clip_distance)] = .{
373360 .llvm_name = null,
374 .description = "Enable clip_distance Capability.",
361 .description = "Enable clip_distance capability",
375362 .dependencies = featureSet(&[_]Feature{
376363 .v1_0,
377364 }),
378365 };
379366 result[@intFromEnum(Feature.compute_derivative_group_linear_khr)] = .{
380367 .llvm_name = null,
381 .description = "Enable compute_derivative_group_linear_khr Capability.",
368 .description = "Enable compute_derivative_group_linear_khr capability",
382369 .dependencies = featureSet(&[_]Feature{
383370 .SPV_KHR_compute_shader_derivatives,
384371 .v1_0,
......@@ -386,7 +373,7 @@ pub const all_features = blk: {
386373 };
387374 result[@intFromEnum(Feature.compute_derivative_group_quads_khr)] = .{
388375 .llvm_name = null,
389 .description = "Enable compute_derivative_group_quads_khr Capability.",
376 .description = "Enable compute_derivative_group_quads_khr capability",
390377 .dependencies = featureSet(&[_]Feature{
391378 .SPV_KHR_compute_shader_derivatives,
392379 .v1_0,
......@@ -394,7 +381,7 @@ pub const all_features = blk: {
394381 };
395382 result[@intFromEnum(Feature.constant_data_khr)] = .{
396383 .llvm_name = null,
397 .description = "Enable constant_data_khr Capability.",
384 .description = "Enable constant_data_khr capability",
398385 .dependencies = featureSet(&[_]Feature{
399386 .SPV_KHR_constant_data,
400387 .v1_0,
......@@ -402,7 +389,7 @@ pub const all_features = blk: {
402389 };
403390 result[@intFromEnum(Feature.cooperative_matrix_khr)] = .{
404391 .llvm_name = null,
405 .description = "Enable cooperative_matrix_khr Capability.",
392 .description = "Enable cooperative_matrix_khr capability",
406393 .dependencies = featureSet(&[_]Feature{
407394 .SPV_KHR_cooperative_matrix,
408395 .v1_0,
......@@ -410,14 +397,14 @@ pub const all_features = blk: {
410397 };
411398 result[@intFromEnum(Feature.cull_distance)] = .{
412399 .llvm_name = null,
413 .description = "Enable cull_distance Capability.",
400 .description = "Enable cull_distance capability",
414401 .dependencies = featureSet(&[_]Feature{
415402 .v1_0,
416403 }),
417404 };
418405 result[@intFromEnum(Feature.demote_to_helper_invocation)] = .{
419406 .llvm_name = null,
420 .description = "Enable demote_to_helper_invocation Capability.",
407 .description = "Enable demote_to_helper_invocation capability",
421408 .dependencies = featureSet(&[_]Feature{
422409 .SPV_EXT_demote_to_helper_invocation,
423410 .v1_6,
......@@ -425,7 +412,7 @@ pub const all_features = blk: {
425412 };
426413 result[@intFromEnum(Feature.denorm_flush_to_zero)] = .{
427414 .llvm_name = null,
428 .description = "Enable denorm_flush_to_zero Capability.",
415 .description = "Enable denorm_flush_to_zero capability",
429416 .dependencies = featureSet(&[_]Feature{
430417 .SPV_KHR_float_controls,
431418 .v1_4,
......@@ -433,7 +420,7 @@ pub const all_features = blk: {
433420 };
434421 result[@intFromEnum(Feature.denorm_preserve)] = .{
435422 .llvm_name = null,
436 .description = "Enable denorm_preserve Capability.",
423 .description = "Enable denorm_preserve capability",
437424 .dependencies = featureSet(&[_]Feature{
438425 .SPV_KHR_float_controls,
439426 .v1_4,
......@@ -441,14 +428,14 @@ pub const all_features = blk: {
441428 };
442429 result[@intFromEnum(Feature.derivative_control)] = .{
443430 .llvm_name = null,
444 .description = "Enable derivative_control Capability.",
431 .description = "Enable derivative_control capability",
445432 .dependencies = featureSet(&[_]Feature{
446433 .v1_0,
447434 }),
448435 };
449436 result[@intFromEnum(Feature.descriptor_heap_ext)] = .{
450437 .llvm_name = null,
451 .description = "Enable descriptor_heap_ext Capability.",
438 .description = "Enable descriptor_heap_ext capability",
452439 .dependencies = featureSet(&[_]Feature{
453440 .SPV_EXT_descriptor_heap,
454441 .v1_0,
......@@ -456,14 +443,14 @@ pub const all_features = blk: {
456443 };
457444 result[@intFromEnum(Feature.device_enqueue)] = .{
458445 .llvm_name = null,
459 .description = "Enable device_enqueue Capability.",
446 .description = "Enable device_enqueue capability",
460447 .dependencies = featureSet(&[_]Feature{
461448 .v1_0,
462449 }),
463450 };
464451 result[@intFromEnum(Feature.device_group)] = .{
465452 .llvm_name = null,
466 .description = "Enable device_group Capability.",
453 .description = "Enable device_group capability",
467454 .dependencies = featureSet(&[_]Feature{
468455 .SPV_KHR_device_group,
469456 .v1_3,
......@@ -471,7 +458,7 @@ pub const all_features = blk: {
471458 };
472459 result[@intFromEnum(Feature.dot_product)] = .{
473460 .llvm_name = null,
474 .description = "Enable dot_product Capability.",
461 .description = "Enable dot_product capability",
475462 .dependencies = featureSet(&[_]Feature{
476463 .SPV_KHR_integer_dot_product,
477464 .v1_6,
......@@ -479,7 +466,7 @@ pub const all_features = blk: {
479466 };
480467 result[@intFromEnum(Feature.dot_product_input4x8bit)] = .{
481468 .llvm_name = null,
482 .description = "Enable dot_product_input4x8bit Capability.",
469 .description = "Enable dot_product_input4x8bit capability",
483470 .dependencies = featureSet(&[_]Feature{
484471 .SPV_KHR_integer_dot_product,
485472 .v1_6,
......@@ -487,7 +474,7 @@ pub const all_features = blk: {
487474 };
488475 result[@intFromEnum(Feature.dot_product_input4x8bit_packed)] = .{
489476 .llvm_name = null,
490 .description = "Enable dot_product_input4x8bit_packed Capability.",
477 .description = "Enable dot_product_input4x8bit_packed capability",
491478 .dependencies = featureSet(&[_]Feature{
492479 .SPV_KHR_integer_dot_product,
493480 .v1_6,
......@@ -495,7 +482,7 @@ pub const all_features = blk: {
495482 };
496483 result[@intFromEnum(Feature.dot_product_input_all)] = .{
497484 .llvm_name = null,
498 .description = "Enable dot_product_input_all Capability.",
485 .description = "Enable dot_product_input_all capability",
499486 .dependencies = featureSet(&[_]Feature{
500487 .SPV_KHR_integer_dot_product,
501488 .v1_6,
......@@ -503,7 +490,7 @@ pub const all_features = blk: {
503490 };
504491 result[@intFromEnum(Feature.draw_parameters)] = .{
505492 .llvm_name = null,
506 .description = "Enable draw_parameters Capability.",
493 .description = "Enable draw_parameters capability",
507494 .dependencies = featureSet(&[_]Feature{
508495 .SPV_KHR_shader_draw_parameters,
509496 .v1_3,
......@@ -511,7 +498,7 @@ pub const all_features = blk: {
511498 };
512499 result[@intFromEnum(Feature.expect_assume_khr)] = .{
513500 .llvm_name = null,
514 .description = "Enable expect_assume_khr Capability.",
501 .description = "Enable expect_assume_khr capability",
515502 .dependencies = featureSet(&[_]Feature{
516503 .SPV_KHR_expect_assume,
517504 .v1_0,
......@@ -519,28 +506,28 @@ pub const all_features = blk: {
519506 };
520507 result[@intFromEnum(Feature.float16)] = .{
521508 .llvm_name = null,
522 .description = "Enable float16 Capability.",
509 .description = "Enable float16 capability",
523510 .dependencies = featureSet(&[_]Feature{
524511 .v1_0,
525512 }),
526513 };
527514 result[@intFromEnum(Feature.float16buffer)] = .{
528515 .llvm_name = null,
529 .description = "Enable float16buffer Capability.",
516 .description = "Enable float16buffer capability",
530517 .dependencies = featureSet(&[_]Feature{
531518 .v1_0,
532519 }),
533520 };
534521 result[@intFromEnum(Feature.float64)] = .{
535522 .llvm_name = null,
536 .description = "Enable float64 Capability.",
523 .description = "Enable float64 capability",
537524 .dependencies = featureSet(&[_]Feature{
538525 .v1_0,
539526 }),
540527 };
541528 result[@intFromEnum(Feature.float8cooperative_matrix_ext)] = .{
542529 .llvm_name = null,
543 .description = "Enable float8cooperative_matrix_ext Capability.",
530 .description = "Enable float8cooperative_matrix_ext capability",
544531 .dependencies = featureSet(&[_]Feature{
545532 .SPV_EXT_float8,
546533 .v1_0,
......@@ -548,7 +535,7 @@ pub const all_features = blk: {
548535 };
549536 result[@intFromEnum(Feature.float8ext)] = .{
550537 .llvm_name = null,
551 .description = "Enable float8ext Capability.",
538 .description = "Enable float8ext capability",
552539 .dependencies = featureSet(&[_]Feature{
553540 .SPV_EXT_float8,
554541 .v1_0,
......@@ -556,7 +543,7 @@ pub const all_features = blk: {
556543 };
557544 result[@intFromEnum(Feature.float_controls2)] = .{
558545 .llvm_name = null,
559 .description = "Enable float_controls2 Capability.",
546 .description = "Enable float_controls2 capability",
560547 .dependencies = featureSet(&[_]Feature{
561548 .SPV_KHR_float_controls2,
562549 .v1_0,
......@@ -564,7 +551,7 @@ pub const all_features = blk: {
564551 };
565552 result[@intFromEnum(Feature.fmakhr)] = .{
566553 .llvm_name = null,
567 .description = "Enable fmakhr Capability.",
554 .description = "Enable fmakhr capability",
568555 .dependencies = featureSet(&[_]Feature{
569556 .SPV_KHR_fma,
570557 .v1_0,
......@@ -572,7 +559,7 @@ pub const all_features = blk: {
572559 };
573560 result[@intFromEnum(Feature.fragment_barycentric_khr)] = .{
574561 .llvm_name = null,
575 .description = "Enable fragment_barycentric_khr Capability.",
562 .description = "Enable fragment_barycentric_khr capability",
576563 .dependencies = featureSet(&[_]Feature{
577564 .SPV_KHR_fragment_shader_barycentric,
578565 .v1_0,
......@@ -580,7 +567,7 @@ pub const all_features = blk: {
580567 };
581568 result[@intFromEnum(Feature.fragment_density_ext)] = .{
582569 .llvm_name = null,
583 .description = "Enable fragment_density_ext Capability.",
570 .description = "Enable fragment_density_ext capability",
584571 .dependencies = featureSet(&[_]Feature{
585572 .SPV_EXT_fragment_invocation_density,
586573 .v1_0,
......@@ -588,7 +575,7 @@ pub const all_features = blk: {
588575 };
589576 result[@intFromEnum(Feature.fragment_fully_covered_ext)] = .{
590577 .llvm_name = null,
591 .description = "Enable fragment_fully_covered_ext Capability.",
578 .description = "Enable fragment_fully_covered_ext capability",
592579 .dependencies = featureSet(&[_]Feature{
593580 .SPV_EXT_fragment_fully_covered,
594581 .v1_0,
......@@ -596,7 +583,7 @@ pub const all_features = blk: {
596583 };
597584 result[@intFromEnum(Feature.fragment_shader_pixel_interlock_ext)] = .{
598585 .llvm_name = null,
599 .description = "Enable fragment_shader_pixel_interlock_ext Capability.",
586 .description = "Enable fragment_shader_pixel_interlock_ext capability",
600587 .dependencies = featureSet(&[_]Feature{
601588 .SPV_EXT_fragment_shader_interlock,
602589 .v1_0,
......@@ -604,7 +591,7 @@ pub const all_features = blk: {
604591 };
605592 result[@intFromEnum(Feature.fragment_shader_sample_interlock_ext)] = .{
606593 .llvm_name = null,
607 .description = "Enable fragment_shader_sample_interlock_ext Capability.",
594 .description = "Enable fragment_shader_sample_interlock_ext capability",
608595 .dependencies = featureSet(&[_]Feature{
609596 .SPV_EXT_fragment_shader_interlock,
610597 .v1_0,
......@@ -612,7 +599,7 @@ pub const all_features = blk: {
612599 };
613600 result[@intFromEnum(Feature.fragment_shader_shading_rate_interlock_ext)] = .{
614601 .llvm_name = null,
615 .description = "Enable fragment_shader_shading_rate_interlock_ext Capability.",
602 .description = "Enable fragment_shader_shading_rate_interlock_ext capability",
616603 .dependencies = featureSet(&[_]Feature{
617604 .SPV_EXT_fragment_shader_interlock,
618605 .v1_0,
......@@ -620,7 +607,7 @@ pub const all_features = blk: {
620607 };
621608 result[@intFromEnum(Feature.fragment_shading_rate_khr)] = .{
622609 .llvm_name = null,
623 .description = "Enable fragment_shading_rate_khr Capability.",
610 .description = "Enable fragment_shading_rate_khr capability",
624611 .dependencies = featureSet(&[_]Feature{
625612 .SPV_KHR_fragment_shading_rate,
626613 .v1_0,
......@@ -628,63 +615,63 @@ pub const all_features = blk: {
628615 };
629616 result[@intFromEnum(Feature.generic_pointer)] = .{
630617 .llvm_name = null,
631 .description = "Enable generic_pointer Capability.",
618 .description = "Enable generic_pointer capability",
632619 .dependencies = featureSet(&[_]Feature{
633620 .v1_0,
634621 }),
635622 };
636623 result[@intFromEnum(Feature.geometry)] = .{
637624 .llvm_name = null,
638 .description = "Enable geometry Capability.",
625 .description = "Enable geometry capability",
639626 .dependencies = featureSet(&[_]Feature{
640627 .v1_0,
641628 }),
642629 };
643630 result[@intFromEnum(Feature.geometry_point_size)] = .{
644631 .llvm_name = null,
645 .description = "Enable geometry_point_size Capability.",
632 .description = "Enable geometry_point_size capability",
646633 .dependencies = featureSet(&[_]Feature{
647634 .v1_0,
648635 }),
649636 };
650637 result[@intFromEnum(Feature.geometry_streams)] = .{
651638 .llvm_name = null,
652 .description = "Enable geometry_streams Capability.",
639 .description = "Enable geometry_streams capability",
653640 .dependencies = featureSet(&[_]Feature{
654641 .v1_0,
655642 }),
656643 };
657644 result[@intFromEnum(Feature.group_non_uniform)] = .{
658645 .llvm_name = null,
659 .description = "Enable group_non_uniform Capability.",
646 .description = "Enable group_non_uniform capability",
660647 .dependencies = featureSet(&[_]Feature{
661648 .v1_3,
662649 }),
663650 };
664651 result[@intFromEnum(Feature.group_non_uniform_arithmetic)] = .{
665652 .llvm_name = null,
666 .description = "Enable group_non_uniform_arithmetic Capability.",
653 .description = "Enable group_non_uniform_arithmetic capability",
667654 .dependencies = featureSet(&[_]Feature{
668655 .v1_3,
669656 }),
670657 };
671658 result[@intFromEnum(Feature.group_non_uniform_ballot)] = .{
672659 .llvm_name = null,
673 .description = "Enable group_non_uniform_ballot Capability.",
660 .description = "Enable group_non_uniform_ballot capability",
674661 .dependencies = featureSet(&[_]Feature{
675662 .v1_3,
676663 }),
677664 };
678665 result[@intFromEnum(Feature.group_non_uniform_clustered)] = .{
679666 .llvm_name = null,
680 .description = "Enable group_non_uniform_clustered Capability.",
667 .description = "Enable group_non_uniform_clustered capability",
681668 .dependencies = featureSet(&[_]Feature{
682669 .v1_3,
683670 }),
684671 };
685672 result[@intFromEnum(Feature.group_non_uniform_partitioned_ext)] = .{
686673 .llvm_name = null,
687 .description = "Enable group_non_uniform_partitioned_ext Capability.",
674 .description = "Enable group_non_uniform_partitioned_ext capability",
688675 .dependencies = featureSet(&[_]Feature{
689676 .SPV_EXT_shader_subgroup_partitioned,
690677 .v1_0,
......@@ -692,14 +679,14 @@ pub const all_features = blk: {
692679 };
693680 result[@intFromEnum(Feature.group_non_uniform_quad)] = .{
694681 .llvm_name = null,
695 .description = "Enable group_non_uniform_quad Capability.",
682 .description = "Enable group_non_uniform_quad capability",
696683 .dependencies = featureSet(&[_]Feature{
697684 .v1_3,
698685 }),
699686 };
700687 result[@intFromEnum(Feature.group_non_uniform_rotate_khr)] = .{
701688 .llvm_name = null,
702 .description = "Enable group_non_uniform_rotate_khr Capability.",
689 .description = "Enable group_non_uniform_rotate_khr capability",
703690 .dependencies = featureSet(&[_]Feature{
704691 .SPV_KHR_subgroup_rotate,
705692 .v1_0,
......@@ -707,28 +694,28 @@ pub const all_features = blk: {
707694 };
708695 result[@intFromEnum(Feature.group_non_uniform_shuffle)] = .{
709696 .llvm_name = null,
710 .description = "Enable group_non_uniform_shuffle Capability.",
697 .description = "Enable group_non_uniform_shuffle capability",
711698 .dependencies = featureSet(&[_]Feature{
712699 .v1_3,
713700 }),
714701 };
715702 result[@intFromEnum(Feature.group_non_uniform_shuffle_relative)] = .{
716703 .llvm_name = null,
717 .description = "Enable group_non_uniform_shuffle_relative Capability.",
704 .description = "Enable group_non_uniform_shuffle_relative capability",
718705 .dependencies = featureSet(&[_]Feature{
719706 .v1_3,
720707 }),
721708 };
722709 result[@intFromEnum(Feature.group_non_uniform_vote)] = .{
723710 .llvm_name = null,
724 .description = "Enable group_non_uniform_vote Capability.",
711 .description = "Enable group_non_uniform_vote capability",
725712 .dependencies = featureSet(&[_]Feature{
726713 .v1_3,
727714 }),
728715 };
729716 result[@intFromEnum(Feature.group_uniform_arithmetic_khr)] = .{
730717 .llvm_name = null,
731 .description = "Enable group_uniform_arithmetic_khr Capability.",
718 .description = "Enable group_uniform_arithmetic_khr capability",
732719 .dependencies = featureSet(&[_]Feature{
733720 .SPV_KHR_uniform_group_instructions,
734721 .v1_0,
......@@ -736,84 +723,84 @@ pub const all_features = blk: {
736723 };
737724 result[@intFromEnum(Feature.groups)] = .{
738725 .llvm_name = null,
739 .description = "Enable groups Capability.",
726 .description = "Enable groups capability",
740727 .dependencies = featureSet(&[_]Feature{
741728 .v1_0,
742729 }),
743730 };
744731 result[@intFromEnum(Feature.image_basic)] = .{
745732 .llvm_name = null,
746 .description = "Enable image_basic Capability.",
733 .description = "Enable image_basic capability",
747734 .dependencies = featureSet(&[_]Feature{
748735 .v1_0,
749736 }),
750737 };
751738 result[@intFromEnum(Feature.image_buffer)] = .{
752739 .llvm_name = null,
753 .description = "Enable image_buffer Capability.",
740 .description = "Enable image_buffer capability",
754741 .dependencies = featureSet(&[_]Feature{
755742 .v1_0,
756743 }),
757744 };
758745 result[@intFromEnum(Feature.image_cube_array)] = .{
759746 .llvm_name = null,
760 .description = "Enable image_cube_array Capability.",
747 .description = "Enable image_cube_array capability",
761748 .dependencies = featureSet(&[_]Feature{
762749 .v1_0,
763750 }),
764751 };
765752 result[@intFromEnum(Feature.image_gather_extended)] = .{
766753 .llvm_name = null,
767 .description = "Enable image_gather_extended Capability.",
754 .description = "Enable image_gather_extended capability",
768755 .dependencies = featureSet(&[_]Feature{
769756 .v1_0,
770757 }),
771758 };
772759 result[@intFromEnum(Feature.image_mipmap)] = .{
773760 .llvm_name = null,
774 .description = "Enable image_mipmap Capability.",
761 .description = "Enable image_mipmap capability",
775762 .dependencies = featureSet(&[_]Feature{
776763 .v1_0,
777764 }),
778765 };
779766 result[@intFromEnum(Feature.image_ms_array)] = .{
780767 .llvm_name = null,
781 .description = "Enable image_ms_array Capability.",
768 .description = "Enable image_ms_array capability",
782769 .dependencies = featureSet(&[_]Feature{
783770 .v1_0,
784771 }),
785772 };
786773 result[@intFromEnum(Feature.image_query)] = .{
787774 .llvm_name = null,
788 .description = "Enable image_query Capability.",
775 .description = "Enable image_query capability",
789776 .dependencies = featureSet(&[_]Feature{
790777 .v1_0,
791778 }),
792779 };
793780 result[@intFromEnum(Feature.image_read_write)] = .{
794781 .llvm_name = null,
795 .description = "Enable image_read_write Capability.",
782 .description = "Enable image_read_write capability",
796783 .dependencies = featureSet(&[_]Feature{
797784 .v1_0,
798785 }),
799786 };
800787 result[@intFromEnum(Feature.image_rect)] = .{
801788 .llvm_name = null,
802 .description = "Enable image_rect Capability.",
789 .description = "Enable image_rect capability",
803790 .dependencies = featureSet(&[_]Feature{
804791 .v1_0,
805792 }),
806793 };
807794 result[@intFromEnum(Feature.input_attachment)] = .{
808795 .llvm_name = null,
809 .description = "Enable input_attachment Capability.",
796 .description = "Enable input_attachment capability",
810797 .dependencies = featureSet(&[_]Feature{
811798 .v1_0,
812799 }),
813800 };
814801 result[@intFromEnum(Feature.input_attachment_array_dynamic_indexing)] = .{
815802 .llvm_name = null,
816 .description = "Enable input_attachment_array_dynamic_indexing Capability.",
803 .description = "Enable input_attachment_array_dynamic_indexing capability",
817804 .dependencies = featureSet(&[_]Feature{
818805 .SPV_EXT_descriptor_indexing,
819806 .v1_5,
......@@ -821,7 +808,7 @@ pub const all_features = blk: {
821808 };
822809 result[@intFromEnum(Feature.input_attachment_array_non_uniform_indexing)] = .{
823810 .llvm_name = null,
824 .description = "Enable input_attachment_array_non_uniform_indexing Capability.",
811 .description = "Enable input_attachment_array_non_uniform_indexing capability",
825812 .dependencies = featureSet(&[_]Feature{
826813 .SPV_EXT_descriptor_indexing,
827814 .v1_5,
......@@ -829,28 +816,28 @@ pub const all_features = blk: {
829816 };
830817 result[@intFromEnum(Feature.int16)] = .{
831818 .llvm_name = null,
832 .description = "Enable int16 Capability.",
819 .description = "Enable int16 capability",
833820 .dependencies = featureSet(&[_]Feature{
834821 .v1_0,
835822 }),
836823 };
837824 result[@intFromEnum(Feature.int64)] = .{
838825 .llvm_name = null,
839 .description = "Enable int64 Capability.",
826 .description = "Enable int64 capability",
840827 .dependencies = featureSet(&[_]Feature{
841828 .v1_0,
842829 }),
843830 };
844831 result[@intFromEnum(Feature.int64atomics)] = .{
845832 .llvm_name = null,
846 .description = "Enable int64atomics Capability.",
833 .description = "Enable int64atomics capability",
847834 .dependencies = featureSet(&[_]Feature{
848835 .v1_0,
849836 }),
850837 };
851838 result[@intFromEnum(Feature.int64image_ext)] = .{
852839 .llvm_name = null,
853 .description = "Enable int64image_ext Capability.",
840 .description = "Enable int64image_ext capability",
854841 .dependencies = featureSet(&[_]Feature{
855842 .SPV_EXT_shader_image_int64,
856843 .v1_0,
......@@ -858,42 +845,28 @@ pub const all_features = blk: {
858845 };
859846 result[@intFromEnum(Feature.int8)] = .{
860847 .llvm_name = null,
861 .description = "Enable int8 Capability.",
848 .description = "Enable int8 capability",
862849 .dependencies = featureSet(&[_]Feature{
863850 .v1_0,
864851 }),
865852 };
866853 result[@intFromEnum(Feature.interpolation_function)] = .{
867854 .llvm_name = null,
868 .description = "Enable interpolation_function Capability.",
869 .dependencies = featureSet(&[_]Feature{
870 .v1_0,
871 }),
872 };
873 result[@intFromEnum(Feature.kernel)] = .{
874 .llvm_name = null,
875 .description = "Enable kernel Capability.",
876 .dependencies = featureSet(&[_]Feature{
877 .v1_0,
878 }),
879 };
880 result[@intFromEnum(Feature.linkage)] = .{
881 .llvm_name = null,
882 .description = "Enable linkage Capability.",
855 .description = "Enable interpolation_function capability",
883856 .dependencies = featureSet(&[_]Feature{
884857 .v1_0,
885858 }),
886859 };
887860 result[@intFromEnum(Feature.literal_sampler)] = .{
888861 .llvm_name = null,
889 .description = "Enable literal_sampler Capability.",
862 .description = "Enable literal_sampler capability",
890863 .dependencies = featureSet(&[_]Feature{
891864 .v1_0,
892865 }),
893866 };
894867 result[@intFromEnum(Feature.long_vector_ext)] = .{
895868 .llvm_name = null,
896 .description = "Enable long_vector_ext Capability.",
869 .description = "Enable long_vector_ext capability",
897870 .dependencies = featureSet(&[_]Feature{
898871 .SPV_EXT_long_vector,
899872 .v1_0,
......@@ -901,14 +874,14 @@ pub const all_features = blk: {
901874 };
902875 result[@intFromEnum(Feature.matrix)] = .{
903876 .llvm_name = null,
904 .description = "Enable matrix Capability.",
877 .description = "Enable matrix capability",
905878 .dependencies = featureSet(&[_]Feature{
906879 .v1_0,
907880 }),
908881 };
909882 result[@intFromEnum(Feature.mesh_shading_ext)] = .{
910883 .llvm_name = null,
911 .description = "Enable mesh_shading_ext Capability.",
884 .description = "Enable mesh_shading_ext capability",
912885 .dependencies = featureSet(&[_]Feature{
913886 .SPV_EXT_mesh_shader,
914887 .v1_0,
......@@ -916,14 +889,14 @@ pub const all_features = blk: {
916889 };
917890 result[@intFromEnum(Feature.min_lod)] = .{
918891 .llvm_name = null,
919 .description = "Enable min_lod Capability.",
892 .description = "Enable min_lod capability",
920893 .dependencies = featureSet(&[_]Feature{
921894 .v1_0,
922895 }),
923896 };
924897 result[@intFromEnum(Feature.multi_view)] = .{
925898 .llvm_name = null,
926 .description = "Enable multi_view Capability.",
899 .description = "Enable multi_view capability",
927900 .dependencies = featureSet(&[_]Feature{
928901 .SPV_KHR_multiview,
929902 .v1_3,
......@@ -931,52 +904,43 @@ pub const all_features = blk: {
931904 };
932905 result[@intFromEnum(Feature.multi_viewport)] = .{
933906 .llvm_name = null,
934 .description = "Enable multi_viewport Capability.",
907 .description = "Enable multi_viewport capability",
935908 .dependencies = featureSet(&[_]Feature{
936909 .v1_0,
937910 }),
938911 };
939912 result[@intFromEnum(Feature.named_barrier)] = .{
940913 .llvm_name = null,
941 .description = "Enable named_barrier Capability.",
914 .description = "Enable named_barrier capability",
942915 .dependencies = featureSet(&[_]Feature{
943916 .v1_1,
944917 }),
945918 };
946919 result[@intFromEnum(Feature.opt_none_ext)] = .{
947920 .llvm_name = null,
948 .description = "Enable opt_none_ext Capability.",
921 .description = "Enable opt_none_ext capability",
949922 .dependencies = featureSet(&[_]Feature{
950923 .SPV_EXT_optnone,
951924 .v1_0,
952925 }),
953926 };
954 result[@intFromEnum(Feature.physical_storage_buffer_addresses)] = .{
955 .llvm_name = null,
956 .description = "Enable physical_storage_buffer_addresses Capability.",
957 .dependencies = featureSet(&[_]Feature{
958 .SPV_EXT_physical_storage_buffer,
959 .SPV_KHR_physical_storage_buffer,
960 .v1_5,
961 }),
962 };
963927 result[@intFromEnum(Feature.pipe_storage)] = .{
964928 .llvm_name = null,
965 .description = "Enable pipe_storage Capability.",
929 .description = "Enable pipe_storage capability",
966930 .dependencies = featureSet(&[_]Feature{
967931 .v1_1,
968932 }),
969933 };
970934 result[@intFromEnum(Feature.pipes)] = .{
971935 .llvm_name = null,
972 .description = "Enable pipes Capability.",
936 .description = "Enable pipes capability",
973937 .dependencies = featureSet(&[_]Feature{
974938 .v1_0,
975939 }),
976940 };
977941 result[@intFromEnum(Feature.poison_freeze_khr)] = .{
978942 .llvm_name = null,
979 .description = "Enable poison_freeze_khr Capability.",
943 .description = "Enable poison_freeze_khr capability",
980944 .dependencies = featureSet(&[_]Feature{
981945 .SPV_KHR_poison_freeze,
982946 .v1_0,
......@@ -984,7 +948,7 @@ pub const all_features = blk: {
984948 };
985949 result[@intFromEnum(Feature.quad_control_khr)] = .{
986950 .llvm_name = null,
987 .description = "Enable quad_control_khr Capability.",
951 .description = "Enable quad_control_khr capability",
988952 .dependencies = featureSet(&[_]Feature{
989953 .SPV_KHR_quad_control,
990954 .v1_0,
......@@ -992,7 +956,7 @@ pub const all_features = blk: {
992956 };
993957 result[@intFromEnum(Feature.ray_cull_mask_khr)] = .{
994958 .llvm_name = null,
995 .description = "Enable ray_cull_mask_khr Capability.",
959 .description = "Enable ray_cull_mask_khr capability",
996960 .dependencies = featureSet(&[_]Feature{
997961 .SPV_KHR_ray_cull_mask,
998962 .v1_0,
......@@ -1000,7 +964,7 @@ pub const all_features = blk: {
1000964 };
1001965 result[@intFromEnum(Feature.ray_query_khr)] = .{
1002966 .llvm_name = null,
1003 .description = "Enable ray_query_khr Capability.",
967 .description = "Enable ray_query_khr capability",
1004968 .dependencies = featureSet(&[_]Feature{
1005969 .SPV_KHR_ray_query,
1006970 .v1_0,
......@@ -1008,7 +972,7 @@ pub const all_features = blk: {
1008972 };
1009973 result[@intFromEnum(Feature.ray_query_position_fetch_khr)] = .{
1010974 .llvm_name = null,
1011 .description = "Enable ray_query_position_fetch_khr Capability.",
975 .description = "Enable ray_query_position_fetch_khr capability",
1012976 .dependencies = featureSet(&[_]Feature{
1013977 .SPV_KHR_ray_tracing_position_fetch,
1014978 .v1_0,
......@@ -1016,7 +980,7 @@ pub const all_features = blk: {
1016980 };
1017981 result[@intFromEnum(Feature.ray_query_provisional_khr)] = .{
1018982 .llvm_name = null,
1019 .description = "Enable ray_query_provisional_khr Capability.",
983 .description = "Enable ray_query_provisional_khr capability",
1020984 .dependencies = featureSet(&[_]Feature{
1021985 .SPV_KHR_ray_query,
1022986 .v1_0,
......@@ -1024,7 +988,7 @@ pub const all_features = blk: {
1024988 };
1025989 result[@intFromEnum(Feature.ray_tracing_khr)] = .{
1026990 .llvm_name = null,
1027 .description = "Enable ray_tracing_khr Capability.",
991 .description = "Enable ray_tracing_khr capability",
1028992 .dependencies = featureSet(&[_]Feature{
1029993 .SPV_KHR_ray_tracing,
1030994 .v1_0,
......@@ -1032,7 +996,7 @@ pub const all_features = blk: {
1032996 };
1033997 result[@intFromEnum(Feature.ray_tracing_opacity_micromap_ext)] = .{
1034998 .llvm_name = null,
1035 .description = "Enable ray_tracing_opacity_micromap_ext Capability.",
999 .description = "Enable ray_tracing_opacity_micromap_ext capability",
10361000 .dependencies = featureSet(&[_]Feature{
10371001 .SPV_EXT_opacity_micromap,
10381002 .v1_0,
......@@ -1040,7 +1004,7 @@ pub const all_features = blk: {
10401004 };
10411005 result[@intFromEnum(Feature.ray_tracing_position_fetch_khr)] = .{
10421006 .llvm_name = null,
1043 .description = "Enable ray_tracing_position_fetch_khr Capability.",
1007 .description = "Enable ray_tracing_position_fetch_khr capability",
10441008 .dependencies = featureSet(&[_]Feature{
10451009 .SPV_KHR_ray_tracing_position_fetch,
10461010 .v1_0,
......@@ -1048,7 +1012,7 @@ pub const all_features = blk: {
10481012 };
10491013 result[@intFromEnum(Feature.ray_tracing_provisional_khr)] = .{
10501014 .llvm_name = null,
1051 .description = "Enable ray_tracing_provisional_khr Capability.",
1015 .description = "Enable ray_tracing_provisional_khr capability",
10521016 .dependencies = featureSet(&[_]Feature{
10531017 .SPV_KHR_ray_tracing,
10541018 .v1_0,
......@@ -1056,7 +1020,7 @@ pub const all_features = blk: {
10561020 };
10571021 result[@intFromEnum(Feature.ray_traversal_primitive_culling_khr)] = .{
10581022 .llvm_name = null,
1059 .description = "Enable ray_traversal_primitive_culling_khr Capability.",
1023 .description = "Enable ray_traversal_primitive_culling_khr capability",
10601024 .dependencies = featureSet(&[_]Feature{
10611025 .SPV_KHR_ray_query,
10621026 .SPV_KHR_ray_tracing,
......@@ -1065,7 +1029,7 @@ pub const all_features = blk: {
10651029 };
10661030 result[@intFromEnum(Feature.replicated_composites_ext)] = .{
10671031 .llvm_name = null,
1068 .description = "Enable replicated_composites_ext Capability.",
1032 .description = "Enable replicated_composites_ext capability",
10691033 .dependencies = featureSet(&[_]Feature{
10701034 .SPV_EXT_replicated_composites,
10711035 .v1_0,
......@@ -1073,7 +1037,7 @@ pub const all_features = blk: {
10731037 };
10741038 result[@intFromEnum(Feature.runtime_descriptor_array)] = .{
10751039 .llvm_name = null,
1076 .description = "Enable runtime_descriptor_array Capability.",
1040 .description = "Enable runtime_descriptor_array capability",
10771041 .dependencies = featureSet(&[_]Feature{
10781042 .SPV_EXT_descriptor_indexing,
10791043 .v1_5,
......@@ -1081,7 +1045,7 @@ pub const all_features = blk: {
10811045 };
10821046 result[@intFromEnum(Feature.sample_mask_post_depth_coverage)] = .{
10831047 .llvm_name = null,
1084 .description = "Enable sample_mask_post_depth_coverage Capability.",
1048 .description = "Enable sample_mask_post_depth_coverage capability",
10851049 .dependencies = featureSet(&[_]Feature{
10861050 .SPV_KHR_post_depth_coverage,
10871051 .v1_0,
......@@ -1089,35 +1053,35 @@ pub const all_features = blk: {
10891053 };
10901054 result[@intFromEnum(Feature.sample_rate_shading)] = .{
10911055 .llvm_name = null,
1092 .description = "Enable sample_rate_shading Capability.",
1056 .description = "Enable sample_rate_shading capability",
10931057 .dependencies = featureSet(&[_]Feature{
10941058 .v1_0,
10951059 }),
10961060 };
10971061 result[@intFromEnum(Feature.sampled_buffer)] = .{
10981062 .llvm_name = null,
1099 .description = "Enable sampled_buffer Capability.",
1063 .description = "Enable sampled_buffer capability",
11001064 .dependencies = featureSet(&[_]Feature{
11011065 .v1_0,
11021066 }),
11031067 };
11041068 result[@intFromEnum(Feature.sampled_cube_array)] = .{
11051069 .llvm_name = null,
1106 .description = "Enable sampled_cube_array Capability.",
1070 .description = "Enable sampled_cube_array capability",
11071071 .dependencies = featureSet(&[_]Feature{
11081072 .v1_0,
11091073 }),
11101074 };
11111075 result[@intFromEnum(Feature.sampled_image_array_dynamic_indexing)] = .{
11121076 .llvm_name = null,
1113 .description = "Enable sampled_image_array_dynamic_indexing Capability.",
1077 .description = "Enable sampled_image_array_dynamic_indexing capability",
11141078 .dependencies = featureSet(&[_]Feature{
11151079 .v1_0,
11161080 }),
11171081 };
11181082 result[@intFromEnum(Feature.sampled_image_array_non_uniform_indexing)] = .{
11191083 .llvm_name = null,
1120 .description = "Enable sampled_image_array_non_uniform_indexing Capability.",
1084 .description = "Enable sampled_image_array_non_uniform_indexing capability",
11211085 .dependencies = featureSet(&[_]Feature{
11221086 .SPV_EXT_descriptor_indexing,
11231087 .v1_5,
......@@ -1125,21 +1089,14 @@ pub const all_features = blk: {
11251089 };
11261090 result[@intFromEnum(Feature.sampled_rect)] = .{
11271091 .llvm_name = null,
1128 .description = "Enable sampled_rect Capability.",
1129 .dependencies = featureSet(&[_]Feature{
1130 .v1_0,
1131 }),
1132 };
1133 result[@intFromEnum(Feature.shader)] = .{
1134 .llvm_name = null,
1135 .description = "Enable shader Capability.",
1092 .description = "Enable sampled_rect capability",
11361093 .dependencies = featureSet(&[_]Feature{
11371094 .v1_0,
11381095 }),
11391096 };
11401097 result[@intFromEnum(Feature.shader64bit_indexing_ext)] = .{
11411098 .llvm_name = null,
1142 .description = "Enable shader64bit_indexing_ext Capability.",
1099 .description = "Enable shader64bit_indexing_ext capability",
11431100 .dependencies = featureSet(&[_]Feature{
11441101 .SPV_EXT_shader_64bit_indexing,
11451102 .v1_0,
......@@ -1147,7 +1104,7 @@ pub const all_features = blk: {
11471104 };
11481105 result[@intFromEnum(Feature.shader_clock_khr)] = .{
11491106 .llvm_name = null,
1150 .description = "Enable shader_clock_khr Capability.",
1107 .description = "Enable shader_clock_khr capability",
11511108 .dependencies = featureSet(&[_]Feature{
11521109 .SPV_KHR_shader_clock,
11531110 .v1_0,
......@@ -1155,7 +1112,7 @@ pub const all_features = blk: {
11551112 };
11561113 result[@intFromEnum(Feature.shader_invocation_reorder_ext)] = .{
11571114 .llvm_name = null,
1158 .description = "Enable shader_invocation_reorder_ext Capability.",
1115 .description = "Enable shader_invocation_reorder_ext capability",
11591116 .dependencies = featureSet(&[_]Feature{
11601117 .SPV_EXT_shader_invocation_reorder,
11611118 .v1_0,
......@@ -1163,14 +1120,14 @@ pub const all_features = blk: {
11631120 };
11641121 result[@intFromEnum(Feature.shader_layer)] = .{
11651122 .llvm_name = null,
1166 .description = "Enable shader_layer Capability.",
1123 .description = "Enable shader_layer capability",
11671124 .dependencies = featureSet(&[_]Feature{
11681125 .v1_5,
11691126 }),
11701127 };
11711128 result[@intFromEnum(Feature.shader_non_uniform)] = .{
11721129 .llvm_name = null,
1173 .description = "Enable shader_non_uniform Capability.",
1130 .description = "Enable shader_non_uniform capability",
11741131 .dependencies = featureSet(&[_]Feature{
11751132 .SPV_EXT_descriptor_indexing,
11761133 .v1_5,
......@@ -1178,14 +1135,14 @@ pub const all_features = blk: {
11781135 };
11791136 result[@intFromEnum(Feature.shader_viewport_index)] = .{
11801137 .llvm_name = null,
1181 .description = "Enable shader_viewport_index Capability.",
1138 .description = "Enable shader_viewport_index capability",
11821139 .dependencies = featureSet(&[_]Feature{
11831140 .v1_5,
11841141 }),
11851142 };
11861143 result[@intFromEnum(Feature.shader_viewport_index_layer_ext)] = .{
11871144 .llvm_name = null,
1188 .description = "Enable shader_viewport_index_layer_ext Capability.",
1145 .description = "Enable shader_viewport_index_layer_ext capability",
11891146 .dependencies = featureSet(&[_]Feature{
11901147 .SPV_EXT_shader_viewport_index_layer,
11911148 .v1_0,
......@@ -1193,7 +1150,7 @@ pub const all_features = blk: {
11931150 };
11941151 result[@intFromEnum(Feature.signed_zero_inf_nan_preserve)] = .{
11951152 .llvm_name = null,
1196 .description = "Enable signed_zero_inf_nan_preserve Capability.",
1153 .description = "Enable signed_zero_inf_nan_preserve capability",
11971154 .dependencies = featureSet(&[_]Feature{
11981155 .SPV_KHR_float_controls,
11991156 .v1_4,
......@@ -1201,314 +1158,309 @@ pub const all_features = blk: {
12011158 };
12021159 result[@intFromEnum(Feature.sparse_residency)] = .{
12031160 .llvm_name = null,
1204 .description = "Enable sparse_residency Capability.",
1161 .description = "Enable sparse_residency capability",
12051162 .dependencies = featureSet(&[_]Feature{
12061163 .v1_0,
12071164 }),
12081165 };
12091166 result[@intFromEnum(Feature.SPV_EXT_arithmetic_fence)] = .{
12101167 .llvm_name = null,
1211 .description = "Enable SPV_EXT_arithmetic_fence Extension.",
1168 .description = "Enable SPV_EXT_arithmetic_fence extension",
12121169 .dependencies = featureSet(&[_]Feature{}),
12131170 };
12141171 result[@intFromEnum(Feature.SPV_EXT_demote_to_helper_invocation)] = .{
12151172 .llvm_name = null,
1216 .description = "Enable SPV_EXT_demote_to_helper_invocation Extension.",
1173 .description = "Enable SPV_EXT_demote_to_helper_invocation extension",
12171174 .dependencies = featureSet(&[_]Feature{}),
12181175 };
12191176 result[@intFromEnum(Feature.SPV_EXT_descriptor_heap)] = .{
12201177 .llvm_name = null,
1221 .description = "Enable SPV_EXT_descriptor_heap Extension.",
1178 .description = "Enable SPV_EXT_descriptor_heap extension",
12221179 .dependencies = featureSet(&[_]Feature{}),
12231180 };
12241181 result[@intFromEnum(Feature.SPV_EXT_descriptor_indexing)] = .{
12251182 .llvm_name = null,
1226 .description = "Enable SPV_EXT_descriptor_indexing Extension.",
1183 .description = "Enable SPV_EXT_descriptor_indexing extension",
12271184 .dependencies = featureSet(&[_]Feature{}),
12281185 };
12291186 result[@intFromEnum(Feature.SPV_EXT_float8)] = .{
12301187 .llvm_name = null,
1231 .description = "Enable SPV_EXT_float8 Extension.",
1188 .description = "Enable SPV_EXT_float8 extension",
12321189 .dependencies = featureSet(&[_]Feature{}),
12331190 };
12341191 result[@intFromEnum(Feature.SPV_EXT_fragment_fully_covered)] = .{
12351192 .llvm_name = null,
1236 .description = "Enable SPV_EXT_fragment_fully_covered Extension.",
1193 .description = "Enable SPV_EXT_fragment_fully_covered extension",
12371194 .dependencies = featureSet(&[_]Feature{}),
12381195 };
12391196 result[@intFromEnum(Feature.SPV_EXT_fragment_invocation_density)] = .{
12401197 .llvm_name = null,
1241 .description = "Enable SPV_EXT_fragment_invocation_density Extension.",
1198 .description = "Enable SPV_EXT_fragment_invocation_density extension",
12421199 .dependencies = featureSet(&[_]Feature{}),
12431200 };
12441201 result[@intFromEnum(Feature.SPV_EXT_fragment_shader_interlock)] = .{
12451202 .llvm_name = null,
1246 .description = "Enable SPV_EXT_fragment_shader_interlock Extension.",
1203 .description = "Enable SPV_EXT_fragment_shader_interlock extension",
12471204 .dependencies = featureSet(&[_]Feature{}),
12481205 };
12491206 result[@intFromEnum(Feature.SPV_EXT_long_vector)] = .{
12501207 .llvm_name = null,
1251 .description = "Enable SPV_EXT_long_vector Extension.",
1208 .description = "Enable SPV_EXT_long_vector extension",
12521209 .dependencies = featureSet(&[_]Feature{}),
12531210 };
12541211 result[@intFromEnum(Feature.SPV_EXT_mesh_shader)] = .{
12551212 .llvm_name = null,
1256 .description = "Enable SPV_EXT_mesh_shader Extension.",
1213 .description = "Enable SPV_EXT_mesh_shader extension",
12571214 .dependencies = featureSet(&[_]Feature{}),
12581215 };
12591216 result[@intFromEnum(Feature.SPV_EXT_opacity_micromap)] = .{
12601217 .llvm_name = null,
1261 .description = "Enable SPV_EXT_opacity_micromap Extension.",
1218 .description = "Enable SPV_EXT_opacity_micromap extension",
12621219 .dependencies = featureSet(&[_]Feature{}),
12631220 };
12641221 result[@intFromEnum(Feature.SPV_EXT_optnone)] = .{
12651222 .llvm_name = null,
1266 .description = "Enable SPV_EXT_optnone Extension.",
1223 .description = "Enable SPV_EXT_optnone extension",
12671224 .dependencies = featureSet(&[_]Feature{}),
12681225 };
12691226 result[@intFromEnum(Feature.SPV_EXT_physical_storage_buffer)] = .{
12701227 .llvm_name = null,
1271 .description = "Enable SPV_EXT_physical_storage_buffer Extension.",
1228 .description = "Enable SPV_EXT_physical_storage_buffer extension",
12721229 .dependencies = featureSet(&[_]Feature{}),
12731230 };
12741231 result[@intFromEnum(Feature.SPV_EXT_replicated_composites)] = .{
12751232 .llvm_name = null,
1276 .description = "Enable SPV_EXT_replicated_composites Extension.",
1233 .description = "Enable SPV_EXT_replicated_composites extension",
12771234 .dependencies = featureSet(&[_]Feature{}),
12781235 };
12791236 result[@intFromEnum(Feature.SPV_EXT_shader_64bit_indexing)] = .{
12801237 .llvm_name = null,
1281 .description = "Enable SPV_EXT_shader_64bit_indexing Extension.",
1238 .description = "Enable SPV_EXT_shader_64bit_indexing extension",
12821239 .dependencies = featureSet(&[_]Feature{}),
12831240 };
12841241 result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float16_add)] = .{
12851242 .llvm_name = null,
1286 .description = "Enable SPV_EXT_shader_atomic_float16_add Extension.",
1243 .description = "Enable SPV_EXT_shader_atomic_float16_add extension",
12871244 .dependencies = featureSet(&[_]Feature{}),
12881245 };
12891246 result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float_add)] = .{
12901247 .llvm_name = null,
1291 .description = "Enable SPV_EXT_shader_atomic_float_add Extension.",
1248 .description = "Enable SPV_EXT_shader_atomic_float_add extension",
12921249 .dependencies = featureSet(&[_]Feature{}),
12931250 };
12941251 result[@intFromEnum(Feature.SPV_EXT_shader_atomic_float_min_max)] = .{
12951252 .llvm_name = null,
1296 .description = "Enable SPV_EXT_shader_atomic_float_min_max Extension.",
1253 .description = "Enable SPV_EXT_shader_atomic_float_min_max extension",
12971254 .dependencies = featureSet(&[_]Feature{}),
12981255 };
12991256 result[@intFromEnum(Feature.SPV_EXT_shader_image_int64)] = .{
13001257 .llvm_name = null,
1301 .description = "Enable SPV_EXT_shader_image_int64 Extension.",
1258 .description = "Enable SPV_EXT_shader_image_int64 extension",
13021259 .dependencies = featureSet(&[_]Feature{}),
13031260 };
13041261 result[@intFromEnum(Feature.SPV_EXT_shader_invocation_reorder)] = .{
13051262 .llvm_name = null,
1306 .description = "Enable SPV_EXT_shader_invocation_reorder Extension.",
1263 .description = "Enable SPV_EXT_shader_invocation_reorder extension",
13071264 .dependencies = featureSet(&[_]Feature{}),
13081265 };
13091266 result[@intFromEnum(Feature.SPV_EXT_shader_stencil_export)] = .{
13101267 .llvm_name = null,
1311 .description = "Enable SPV_EXT_shader_stencil_export Extension.",
1268 .description = "Enable SPV_EXT_shader_stencil_export extension",
13121269 .dependencies = featureSet(&[_]Feature{}),
13131270 };
13141271 result[@intFromEnum(Feature.SPV_EXT_shader_subgroup_partitioned)] = .{
13151272 .llvm_name = null,
1316 .description = "Enable SPV_EXT_shader_subgroup_partitioned Extension.",
1273 .description = "Enable SPV_EXT_shader_subgroup_partitioned extension",
13171274 .dependencies = featureSet(&[_]Feature{}),
13181275 };
13191276 result[@intFromEnum(Feature.SPV_EXT_shader_tile_image)] = .{
13201277 .llvm_name = null,
1321 .description = "Enable SPV_EXT_shader_tile_image Extension.",
1278 .description = "Enable SPV_EXT_shader_tile_image extension",
13221279 .dependencies = featureSet(&[_]Feature{}),
13231280 };
13241281 result[@intFromEnum(Feature.SPV_EXT_shader_viewport_index_layer)] = .{
13251282 .llvm_name = null,
1326 .description = "Enable SPV_EXT_shader_viewport_index_layer Extension.",
1283 .description = "Enable SPV_EXT_shader_viewport_index_layer extension",
13271284 .dependencies = featureSet(&[_]Feature{}),
13281285 };
13291286 result[@intFromEnum(Feature.SPV_KHR_16bit_storage)] = .{
13301287 .llvm_name = null,
1331 .description = "Enable SPV_KHR_16bit_storage Extension.",
1288 .description = "Enable SPV_KHR_16bit_storage extension",
13321289 .dependencies = featureSet(&[_]Feature{}),
13331290 };
13341291 result[@intFromEnum(Feature.SPV_KHR_8bit_storage)] = .{
13351292 .llvm_name = null,
1336 .description = "Enable SPV_KHR_8bit_storage Extension.",
1293 .description = "Enable SPV_KHR_8bit_storage extension",
13371294 .dependencies = featureSet(&[_]Feature{}),
13381295 };
13391296 result[@intFromEnum(Feature.SPV_KHR_abort)] = .{
13401297 .llvm_name = null,
1341 .description = "Enable SPV_KHR_abort Extension.",
1298 .description = "Enable SPV_KHR_abort extension",
13421299 .dependencies = featureSet(&[_]Feature{}),
13431300 };
13441301 result[@intFromEnum(Feature.SPV_KHR_bfloat16)] = .{
13451302 .llvm_name = null,
1346 .description = "Enable SPV_KHR_bfloat16 Extension.",
1303 .description = "Enable SPV_KHR_bfloat16 extension",
13471304 .dependencies = featureSet(&[_]Feature{}),
13481305 };
13491306 result[@intFromEnum(Feature.SPV_KHR_bit_instructions)] = .{
13501307 .llvm_name = null,
1351 .description = "Enable SPV_KHR_bit_instructions Extension.",
1308 .description = "Enable SPV_KHR_bit_instructions extension",
13521309 .dependencies = featureSet(&[_]Feature{}),
13531310 };
13541311 result[@intFromEnum(Feature.SPV_KHR_compute_shader_derivatives)] = .{
13551312 .llvm_name = null,
1356 .description = "Enable SPV_KHR_compute_shader_derivatives Extension.",
1313 .description = "Enable SPV_KHR_compute_shader_derivatives extension",
13571314 .dependencies = featureSet(&[_]Feature{}),
13581315 };
13591316 result[@intFromEnum(Feature.SPV_KHR_constant_data)] = .{
13601317 .llvm_name = null,
1361 .description = "Enable SPV_KHR_constant_data Extension.",
1318 .description = "Enable SPV_KHR_constant_data extension",
13621319 .dependencies = featureSet(&[_]Feature{}),
13631320 };
13641321 result[@intFromEnum(Feature.SPV_KHR_cooperative_matrix)] = .{
13651322 .llvm_name = null,
1366 .description = "Enable SPV_KHR_cooperative_matrix Extension.",
1323 .description = "Enable SPV_KHR_cooperative_matrix extension",
13671324 .dependencies = featureSet(&[_]Feature{}),
13681325 };
13691326 result[@intFromEnum(Feature.SPV_KHR_device_group)] = .{
13701327 .llvm_name = null,
1371 .description = "Enable SPV_KHR_device_group Extension.",
1328 .description = "Enable SPV_KHR_device_group extension",
13721329 .dependencies = featureSet(&[_]Feature{}),
13731330 };
13741331 result[@intFromEnum(Feature.SPV_KHR_expect_assume)] = .{
13751332 .llvm_name = null,
1376 .description = "Enable SPV_KHR_expect_assume Extension.",
1333 .description = "Enable SPV_KHR_expect_assume extension",
13771334 .dependencies = featureSet(&[_]Feature{}),
13781335 };
13791336 result[@intFromEnum(Feature.SPV_KHR_float_controls)] = .{
13801337 .llvm_name = null,
1381 .description = "Enable SPV_KHR_float_controls Extension.",
1338 .description = "Enable SPV_KHR_float_controls extension",
13821339 .dependencies = featureSet(&[_]Feature{}),
13831340 };
13841341 result[@intFromEnum(Feature.SPV_KHR_float_controls2)] = .{
13851342 .llvm_name = null,
1386 .description = "Enable SPV_KHR_float_controls2 Extension.",
1343 .description = "Enable SPV_KHR_float_controls2 extension",
13871344 .dependencies = featureSet(&[_]Feature{}),
13881345 };
13891346 result[@intFromEnum(Feature.SPV_KHR_fma)] = .{
13901347 .llvm_name = null,
1391 .description = "Enable SPV_KHR_fma Extension.",
1348 .description = "Enable SPV_KHR_fma extension",
13921349 .dependencies = featureSet(&[_]Feature{}),
13931350 };
13941351 result[@intFromEnum(Feature.SPV_KHR_fragment_shader_barycentric)] = .{
13951352 .llvm_name = null,
1396 .description = "Enable SPV_KHR_fragment_shader_barycentric Extension.",
1353 .description = "Enable SPV_KHR_fragment_shader_barycentric extension",
13971354 .dependencies = featureSet(&[_]Feature{}),
13981355 };
13991356 result[@intFromEnum(Feature.SPV_KHR_fragment_shading_rate)] = .{
14001357 .llvm_name = null,
1401 .description = "Enable SPV_KHR_fragment_shading_rate Extension.",
1358 .description = "Enable SPV_KHR_fragment_shading_rate extension",
14021359 .dependencies = featureSet(&[_]Feature{}),
14031360 };
14041361 result[@intFromEnum(Feature.SPV_KHR_integer_dot_product)] = .{
14051362 .llvm_name = null,
1406 .description = "Enable SPV_KHR_integer_dot_product Extension.",
1363 .description = "Enable SPV_KHR_integer_dot_product extension",
14071364 .dependencies = featureSet(&[_]Feature{}),
14081365 };
14091366 result[@intFromEnum(Feature.SPV_KHR_multiview)] = .{
14101367 .llvm_name = null,
1411 .description = "Enable SPV_KHR_multiview Extension.",
1412 .dependencies = featureSet(&[_]Feature{}),
1413 };
1414 result[@intFromEnum(Feature.SPV_KHR_physical_storage_buffer)] = .{
1415 .llvm_name = null,
1416 .description = "Enable SPV_KHR_physical_storage_buffer Extension.",
1368 .description = "Enable SPV_KHR_multiview extension",
14171369 .dependencies = featureSet(&[_]Feature{}),
14181370 };
14191371 result[@intFromEnum(Feature.SPV_KHR_poison_freeze)] = .{
14201372 .llvm_name = null,
1421 .description = "Enable SPV_KHR_poison_freeze Extension.",
1373 .description = "Enable SPV_KHR_poison_freeze extension",
14221374 .dependencies = featureSet(&[_]Feature{}),
14231375 };
14241376 result[@intFromEnum(Feature.SPV_KHR_post_depth_coverage)] = .{
14251377 .llvm_name = null,
1426 .description = "Enable SPV_KHR_post_depth_coverage Extension.",
1378 .description = "Enable SPV_KHR_post_depth_coverage extension",
14271379 .dependencies = featureSet(&[_]Feature{}),
14281380 };
14291381 result[@intFromEnum(Feature.SPV_KHR_quad_control)] = .{
14301382 .llvm_name = null,
1431 .description = "Enable SPV_KHR_quad_control Extension.",
1383 .description = "Enable SPV_KHR_quad_control extension",
14321384 .dependencies = featureSet(&[_]Feature{}),
14331385 };
14341386 result[@intFromEnum(Feature.SPV_KHR_ray_cull_mask)] = .{
14351387 .llvm_name = null,
1436 .description = "Enable SPV_KHR_ray_cull_mask Extension.",
1388 .description = "Enable SPV_KHR_ray_cull_mask extension",
14371389 .dependencies = featureSet(&[_]Feature{}),
14381390 };
14391391 result[@intFromEnum(Feature.SPV_KHR_ray_query)] = .{
14401392 .llvm_name = null,
1441 .description = "Enable SPV_KHR_ray_query Extension.",
1393 .description = "Enable SPV_KHR_ray_query extension",
14421394 .dependencies = featureSet(&[_]Feature{}),
14431395 };
14441396 result[@intFromEnum(Feature.SPV_KHR_ray_tracing)] = .{
14451397 .llvm_name = null,
1446 .description = "Enable SPV_KHR_ray_tracing Extension.",
1398 .description = "Enable SPV_KHR_ray_tracing extension",
14471399 .dependencies = featureSet(&[_]Feature{}),
14481400 };
14491401 result[@intFromEnum(Feature.SPV_KHR_ray_tracing_position_fetch)] = .{
14501402 .llvm_name = null,
1451 .description = "Enable SPV_KHR_ray_tracing_position_fetch Extension.",
1403 .description = "Enable SPV_KHR_ray_tracing_position_fetch extension",
14521404 .dependencies = featureSet(&[_]Feature{}),
14531405 };
14541406 result[@intFromEnum(Feature.SPV_KHR_shader_atomic_counter_ops)] = .{
14551407 .llvm_name = null,
1456 .description = "Enable SPV_KHR_shader_atomic_counter_ops Extension.",
1408 .description = "Enable SPV_KHR_shader_atomic_counter_ops extension",
14571409 .dependencies = featureSet(&[_]Feature{}),
14581410 };
14591411 result[@intFromEnum(Feature.SPV_KHR_shader_ballot)] = .{
14601412 .llvm_name = null,
1461 .description = "Enable SPV_KHR_shader_ballot Extension.",
1413 .description = "Enable SPV_KHR_shader_ballot extension",
14621414 .dependencies = featureSet(&[_]Feature{}),
14631415 };
14641416 result[@intFromEnum(Feature.SPV_KHR_shader_clock)] = .{
14651417 .llvm_name = null,
1466 .description = "Enable SPV_KHR_shader_clock Extension.",
1418 .description = "Enable SPV_KHR_shader_clock extension",
14671419 .dependencies = featureSet(&[_]Feature{}),
14681420 };
14691421 result[@intFromEnum(Feature.SPV_KHR_shader_draw_parameters)] = .{
14701422 .llvm_name = null,
1471 .description = "Enable SPV_KHR_shader_draw_parameters Extension.",
1423 .description = "Enable SPV_KHR_shader_draw_parameters extension",
14721424 .dependencies = featureSet(&[_]Feature{}),
14731425 };
14741426 result[@intFromEnum(Feature.SPV_KHR_subgroup_rotate)] = .{
14751427 .llvm_name = null,
1476 .description = "Enable SPV_KHR_subgroup_rotate Extension.",
1428 .description = "Enable SPV_KHR_subgroup_rotate extension",
14771429 .dependencies = featureSet(&[_]Feature{}),
14781430 };
14791431 result[@intFromEnum(Feature.SPV_KHR_subgroup_vote)] = .{
14801432 .llvm_name = null,
1481 .description = "Enable SPV_KHR_subgroup_vote Extension.",
1433 .description = "Enable SPV_KHR_subgroup_vote extension",
14821434 .dependencies = featureSet(&[_]Feature{}),
14831435 };
14841436 result[@intFromEnum(Feature.SPV_KHR_uniform_group_instructions)] = .{
14851437 .llvm_name = null,
1486 .description = "Enable SPV_KHR_uniform_group_instructions Extension.",
1438 .description = "Enable SPV_KHR_uniform_group_instructions extension",
14871439 .dependencies = featureSet(&[_]Feature{}),
14881440 };
14891441 result[@intFromEnum(Feature.SPV_KHR_untyped_pointers)] = .{
14901442 .llvm_name = null,
1491 .description = "Enable SPV_KHR_untyped_pointers Extension.",
1443 .description = "Enable SPV_KHR_untyped_pointers extension",
14921444 .dependencies = featureSet(&[_]Feature{}),
14931445 };
14941446 result[@intFromEnum(Feature.SPV_KHR_variable_pointers)] = .{
14951447 .llvm_name = null,
1496 .description = "Enable SPV_KHR_variable_pointers Extension.",
1448 .description = "Enable SPV_KHR_variable_pointers extension",
14971449 .dependencies = featureSet(&[_]Feature{}),
14981450 };
14991451 result[@intFromEnum(Feature.SPV_KHR_vulkan_memory_model)] = .{
15001452 .llvm_name = null,
1501 .description = "Enable SPV_KHR_vulkan_memory_model Extension.",
1453 .description = "Enable SPV_KHR_vulkan_memory_model extension",
15021454 .dependencies = featureSet(&[_]Feature{}),
15031455 };
15041456 result[@intFromEnum(Feature.SPV_KHR_workgroup_memory_explicit_layout)] = .{
15051457 .llvm_name = null,
1506 .description = "Enable SPV_KHR_workgroup_memory_explicit_layout Extension.",
1458 .description = "Enable SPV_KHR_workgroup_memory_explicit_layout extension",
15071459 .dependencies = featureSet(&[_]Feature{}),
15081460 };
15091461 result[@intFromEnum(Feature.stencil_export_ext)] = .{
15101462 .llvm_name = null,
1511 .description = "Enable stencil_export_ext Capability.",
1463 .description = "Enable stencil_export_ext capability",
15121464 .dependencies = featureSet(&[_]Feature{
15131465 .SPV_EXT_shader_stencil_export,
15141466 .v1_0,
......@@ -1516,7 +1468,7 @@ pub const all_features = blk: {
15161468 };
15171469 result[@intFromEnum(Feature.storage_buffer16bit_access)] = .{
15181470 .llvm_name = null,
1519 .description = "Enable storage_buffer16bit_access Capability.",
1471 .description = "Enable storage_buffer16bit_access capability",
15201472 .dependencies = featureSet(&[_]Feature{
15211473 .SPV_KHR_16bit_storage,
15221474 .v1_3,
......@@ -1524,7 +1476,7 @@ pub const all_features = blk: {
15241476 };
15251477 result[@intFromEnum(Feature.storage_buffer8bit_access)] = .{
15261478 .llvm_name = null,
1527 .description = "Enable storage_buffer8bit_access Capability.",
1479 .description = "Enable storage_buffer8bit_access capability",
15281480 .dependencies = featureSet(&[_]Feature{
15291481 .SPV_KHR_8bit_storage,
15301482 .v1_5,
......@@ -1532,14 +1484,14 @@ pub const all_features = blk: {
15321484 };
15331485 result[@intFromEnum(Feature.storage_buffer_array_dynamic_indexing)] = .{
15341486 .llvm_name = null,
1535 .description = "Enable storage_buffer_array_dynamic_indexing Capability.",
1487 .description = "Enable storage_buffer_array_dynamic_indexing capability",
15361488 .dependencies = featureSet(&[_]Feature{
15371489 .v1_0,
15381490 }),
15391491 };
15401492 result[@intFromEnum(Feature.storage_buffer_array_non_uniform_indexing)] = .{
15411493 .llvm_name = null,
1542 .description = "Enable storage_buffer_array_non_uniform_indexing Capability.",
1494 .description = "Enable storage_buffer_array_non_uniform_indexing capability",
15431495 .dependencies = featureSet(&[_]Feature{
15441496 .SPV_EXT_descriptor_indexing,
15451497 .v1_5,
......@@ -1547,14 +1499,14 @@ pub const all_features = blk: {
15471499 };
15481500 result[@intFromEnum(Feature.storage_image_array_dynamic_indexing)] = .{
15491501 .llvm_name = null,
1550 .description = "Enable storage_image_array_dynamic_indexing Capability.",
1502 .description = "Enable storage_image_array_dynamic_indexing capability",
15511503 .dependencies = featureSet(&[_]Feature{
15521504 .v1_0,
15531505 }),
15541506 };
15551507 result[@intFromEnum(Feature.storage_image_array_non_uniform_indexing)] = .{
15561508 .llvm_name = null,
1557 .description = "Enable storage_image_array_non_uniform_indexing Capability.",
1509 .description = "Enable storage_image_array_non_uniform_indexing capability",
15581510 .dependencies = featureSet(&[_]Feature{
15591511 .SPV_EXT_descriptor_indexing,
15601512 .v1_5,
......@@ -1562,35 +1514,35 @@ pub const all_features = blk: {
15621514 };
15631515 result[@intFromEnum(Feature.storage_image_extended_formats)] = .{
15641516 .llvm_name = null,
1565 .description = "Enable storage_image_extended_formats Capability.",
1517 .description = "Enable storage_image_extended_formats capability",
15661518 .dependencies = featureSet(&[_]Feature{
15671519 .v1_0,
15681520 }),
15691521 };
15701522 result[@intFromEnum(Feature.storage_image_multisample)] = .{
15711523 .llvm_name = null,
1572 .description = "Enable storage_image_multisample Capability.",
1524 .description = "Enable storage_image_multisample capability",
15731525 .dependencies = featureSet(&[_]Feature{
15741526 .v1_0,
15751527 }),
15761528 };
15771529 result[@intFromEnum(Feature.storage_image_read_without_format)] = .{
15781530 .llvm_name = null,
1579 .description = "Enable storage_image_read_without_format Capability.",
1531 .description = "Enable storage_image_read_without_format capability",
15801532 .dependencies = featureSet(&[_]Feature{
15811533 .v1_0,
15821534 }),
15831535 };
15841536 result[@intFromEnum(Feature.storage_image_write_without_format)] = .{
15851537 .llvm_name = null,
1586 .description = "Enable storage_image_write_without_format Capability.",
1538 .description = "Enable storage_image_write_without_format capability",
15871539 .dependencies = featureSet(&[_]Feature{
15881540 .v1_0,
15891541 }),
15901542 };
15911543 result[@intFromEnum(Feature.storage_input_output16)] = .{
15921544 .llvm_name = null,
1593 .description = "Enable storage_input_output16 Capability.",
1545 .description = "Enable storage_input_output16 capability",
15941546 .dependencies = featureSet(&[_]Feature{
15951547 .SPV_KHR_16bit_storage,
15961548 .v1_3,
......@@ -1598,7 +1550,7 @@ pub const all_features = blk: {
15981550 };
15991551 result[@intFromEnum(Feature.storage_push_constant16)] = .{
16001552 .llvm_name = null,
1601 .description = "Enable storage_push_constant16 Capability.",
1553 .description = "Enable storage_push_constant16 capability",
16021554 .dependencies = featureSet(&[_]Feature{
16031555 .SPV_KHR_16bit_storage,
16041556 .v1_3,
......@@ -1606,7 +1558,7 @@ pub const all_features = blk: {
16061558 };
16071559 result[@intFromEnum(Feature.storage_push_constant8)] = .{
16081560 .llvm_name = null,
1609 .description = "Enable storage_push_constant8 Capability.",
1561 .description = "Enable storage_push_constant8 capability",
16101562 .dependencies = featureSet(&[_]Feature{
16111563 .SPV_KHR_8bit_storage,
16121564 .v1_5,
......@@ -1614,7 +1566,7 @@ pub const all_features = blk: {
16141566 };
16151567 result[@intFromEnum(Feature.storage_texel_buffer_array_dynamic_indexing)] = .{
16161568 .llvm_name = null,
1617 .description = "Enable storage_texel_buffer_array_dynamic_indexing Capability.",
1569 .description = "Enable storage_texel_buffer_array_dynamic_indexing capability",
16181570 .dependencies = featureSet(&[_]Feature{
16191571 .SPV_EXT_descriptor_indexing,
16201572 .v1_5,
......@@ -1622,7 +1574,7 @@ pub const all_features = blk: {
16221574 };
16231575 result[@intFromEnum(Feature.storage_texel_buffer_array_non_uniform_indexing)] = .{
16241576 .llvm_name = null,
1625 .description = "Enable storage_texel_buffer_array_non_uniform_indexing Capability.",
1577 .description = "Enable storage_texel_buffer_array_non_uniform_indexing capability",
16261578 .dependencies = featureSet(&[_]Feature{
16271579 .SPV_EXT_descriptor_indexing,
16281580 .v1_5,
......@@ -1630,7 +1582,7 @@ pub const all_features = blk: {
16301582 };
16311583 result[@intFromEnum(Feature.subgroup_ballot_khr)] = .{
16321584 .llvm_name = null,
1633 .description = "Enable subgroup_ballot_khr Capability.",
1585 .description = "Enable subgroup_ballot_khr capability",
16341586 .dependencies = featureSet(&[_]Feature{
16351587 .SPV_KHR_shader_ballot,
16361588 .v1_0,
......@@ -1638,14 +1590,14 @@ pub const all_features = blk: {
16381590 };
16391591 result[@intFromEnum(Feature.subgroup_dispatch)] = .{
16401592 .llvm_name = null,
1641 .description = "Enable subgroup_dispatch Capability.",
1593 .description = "Enable subgroup_dispatch capability",
16421594 .dependencies = featureSet(&[_]Feature{
16431595 .v1_1,
16441596 }),
16451597 };
16461598 result[@intFromEnum(Feature.subgroup_vote_khr)] = .{
16471599 .llvm_name = null,
1648 .description = "Enable subgroup_vote_khr Capability.",
1600 .description = "Enable subgroup_vote_khr capability",
16491601 .dependencies = featureSet(&[_]Feature{
16501602 .SPV_KHR_subgroup_vote,
16511603 .v1_0,
......@@ -1653,21 +1605,21 @@ pub const all_features = blk: {
16531605 };
16541606 result[@intFromEnum(Feature.tessellation)] = .{
16551607 .llvm_name = null,
1656 .description = "Enable tessellation Capability.",
1608 .description = "Enable tessellation capability",
16571609 .dependencies = featureSet(&[_]Feature{
16581610 .v1_0,
16591611 }),
16601612 };
16611613 result[@intFromEnum(Feature.tessellation_point_size)] = .{
16621614 .llvm_name = null,
1663 .description = "Enable tessellation_point_size Capability.",
1615 .description = "Enable tessellation_point_size capability",
16641616 .dependencies = featureSet(&[_]Feature{
16651617 .v1_0,
16661618 }),
16671619 };
16681620 result[@intFromEnum(Feature.tile_image_color_read_access_ext)] = .{
16691621 .llvm_name = null,
1670 .description = "Enable tile_image_color_read_access_ext Capability.",
1622 .description = "Enable tile_image_color_read_access_ext capability",
16711623 .dependencies = featureSet(&[_]Feature{
16721624 .SPV_EXT_shader_tile_image,
16731625 .v1_0,
......@@ -1675,7 +1627,7 @@ pub const all_features = blk: {
16751627 };
16761628 result[@intFromEnum(Feature.tile_image_depth_read_access_ext)] = .{
16771629 .llvm_name = null,
1678 .description = "Enable tile_image_depth_read_access_ext Capability.",
1630 .description = "Enable tile_image_depth_read_access_ext capability",
16791631 .dependencies = featureSet(&[_]Feature{
16801632 .SPV_EXT_shader_tile_image,
16811633 .v1_0,
......@@ -1683,7 +1635,7 @@ pub const all_features = blk: {
16831635 };
16841636 result[@intFromEnum(Feature.tile_image_stencil_read_access_ext)] = .{
16851637 .llvm_name = null,
1686 .description = "Enable tile_image_stencil_read_access_ext Capability.",
1638 .description = "Enable tile_image_stencil_read_access_ext capability",
16871639 .dependencies = featureSet(&[_]Feature{
16881640 .SPV_EXT_shader_tile_image,
16891641 .v1_0,
......@@ -1691,14 +1643,14 @@ pub const all_features = blk: {
16911643 };
16921644 result[@intFromEnum(Feature.transform_feedback)] = .{
16931645 .llvm_name = null,
1694 .description = "Enable transform_feedback Capability.",
1646 .description = "Enable transform_feedback capability",
16951647 .dependencies = featureSet(&[_]Feature{
16961648 .v1_0,
16971649 }),
16981650 };
16991651 result[@intFromEnum(Feature.uniform_and_storage_buffer16bit_access)] = .{
17001652 .llvm_name = null,
1701 .description = "Enable uniform_and_storage_buffer16bit_access Capability.",
1653 .description = "Enable uniform_and_storage_buffer16bit_access capability",
17021654 .dependencies = featureSet(&[_]Feature{
17031655 .SPV_KHR_16bit_storage,
17041656 .v1_3,
......@@ -1706,7 +1658,7 @@ pub const all_features = blk: {
17061658 };
17071659 result[@intFromEnum(Feature.uniform_and_storage_buffer8bit_access)] = .{
17081660 .llvm_name = null,
1709 .description = "Enable uniform_and_storage_buffer8bit_access Capability.",
1661 .description = "Enable uniform_and_storage_buffer8bit_access capability",
17101662 .dependencies = featureSet(&[_]Feature{
17111663 .SPV_KHR_8bit_storage,
17121664 .v1_5,
......@@ -1714,14 +1666,14 @@ pub const all_features = blk: {
17141666 };
17151667 result[@intFromEnum(Feature.uniform_buffer_array_dynamic_indexing)] = .{
17161668 .llvm_name = null,
1717 .description = "Enable uniform_buffer_array_dynamic_indexing Capability.",
1669 .description = "Enable uniform_buffer_array_dynamic_indexing capability",
17181670 .dependencies = featureSet(&[_]Feature{
17191671 .v1_0,
17201672 }),
17211673 };
17221674 result[@intFromEnum(Feature.uniform_buffer_array_non_uniform_indexing)] = .{
17231675 .llvm_name = null,
1724 .description = "Enable uniform_buffer_array_non_uniform_indexing Capability.",
1676 .description = "Enable uniform_buffer_array_non_uniform_indexing capability",
17251677 .dependencies = featureSet(&[_]Feature{
17261678 .SPV_EXT_descriptor_indexing,
17271679 .v1_5,
......@@ -1729,14 +1681,14 @@ pub const all_features = blk: {
17291681 };
17301682 result[@intFromEnum(Feature.uniform_decoration)] = .{
17311683 .llvm_name = null,
1732 .description = "Enable uniform_decoration Capability.",
1684 .description = "Enable uniform_decoration capability",
17331685 .dependencies = featureSet(&[_]Feature{
17341686 .v1_6,
17351687 }),
17361688 };
17371689 result[@intFromEnum(Feature.uniform_texel_buffer_array_dynamic_indexing)] = .{
17381690 .llvm_name = null,
1739 .description = "Enable uniform_texel_buffer_array_dynamic_indexing Capability.",
1691 .description = "Enable uniform_texel_buffer_array_dynamic_indexing capability",
17401692 .dependencies = featureSet(&[_]Feature{
17411693 .SPV_EXT_descriptor_indexing,
17421694 .v1_5,
......@@ -1744,7 +1696,7 @@ pub const all_features = blk: {
17441696 };
17451697 result[@intFromEnum(Feature.uniform_texel_buffer_array_non_uniform_indexing)] = .{
17461698 .llvm_name = null,
1747 .description = "Enable uniform_texel_buffer_array_non_uniform_indexing Capability.",
1699 .description = "Enable uniform_texel_buffer_array_non_uniform_indexing capability",
17481700 .dependencies = featureSet(&[_]Feature{
17491701 .SPV_EXT_descriptor_indexing,
17501702 .v1_5,
......@@ -1752,7 +1704,7 @@ pub const all_features = blk: {
17521704 };
17531705 result[@intFromEnum(Feature.untyped_pointers_khr)] = .{
17541706 .llvm_name = null,
1755 .description = "Enable untyped_pointers_khr Capability.",
1707 .description = "Enable untyped_pointers_khr capability",
17561708 .dependencies = featureSet(&[_]Feature{
17571709 .SPV_KHR_untyped_pointers,
17581710 .v1_0,
......@@ -1760,54 +1712,54 @@ pub const all_features = blk: {
17601712 };
17611713 result[@intFromEnum(Feature.v1_0)] = .{
17621714 .llvm_name = null,
1763 .description = "Enable v1_0 Extension.",
1715 .description = "Enable v1_0 extension",
17641716 .dependencies = featureSet(&[_]Feature{}),
17651717 };
17661718 result[@intFromEnum(Feature.v1_1)] = .{
17671719 .llvm_name = null,
1768 .description = "Enable v1_1 Extension.",
1720 .description = "Enable v1_1 extension",
17691721 .dependencies = featureSet(&[_]Feature{
17701722 .v1_0,
17711723 }),
17721724 };
17731725 result[@intFromEnum(Feature.v1_2)] = .{
17741726 .llvm_name = null,
1775 .description = "Enable v1_2 Extension.",
1727 .description = "Enable v1_2 extension",
17761728 .dependencies = featureSet(&[_]Feature{
17771729 .v1_1,
17781730 }),
17791731 };
17801732 result[@intFromEnum(Feature.v1_3)] = .{
17811733 .llvm_name = null,
1782 .description = "Enable v1_3 Extension.",
1734 .description = "Enable v1_3 extension",
17831735 .dependencies = featureSet(&[_]Feature{
17841736 .v1_2,
17851737 }),
17861738 };
17871739 result[@intFromEnum(Feature.v1_4)] = .{
17881740 .llvm_name = null,
1789 .description = "Enable v1_4 Extension.",
1741 .description = "Enable v1_4 extension",
17901742 .dependencies = featureSet(&[_]Feature{
17911743 .v1_3,
17921744 }),
17931745 };
17941746 result[@intFromEnum(Feature.v1_5)] = .{
17951747 .llvm_name = null,
1796 .description = "Enable v1_5 Extension.",
1748 .description = "Enable v1_5 extension",
17971749 .dependencies = featureSet(&[_]Feature{
17981750 .v1_4,
17991751 }),
18001752 };
18011753 result[@intFromEnum(Feature.v1_6)] = .{
18021754 .llvm_name = null,
1803 .description = "Enable v1_6 Extension.",
1755 .description = "Enable v1_6 extension",
18041756 .dependencies = featureSet(&[_]Feature{
18051757 .v1_5,
18061758 }),
18071759 };
18081760 result[@intFromEnum(Feature.variable_pointers)] = .{
18091761 .llvm_name = null,
1810 .description = "Enable variable_pointers Capability.",
1762 .description = "Enable variable_pointers capability",
18111763 .dependencies = featureSet(&[_]Feature{
18121764 .SPV_KHR_variable_pointers,
18131765 .v1_3,
......@@ -1815,7 +1767,7 @@ pub const all_features = blk: {
18151767 };
18161768 result[@intFromEnum(Feature.variable_pointers_storage_buffer)] = .{
18171769 .llvm_name = null,
1818 .description = "Enable variable_pointers_storage_buffer Capability.",
1770 .description = "Enable variable_pointers_storage_buffer capability",
18191771 .dependencies = featureSet(&[_]Feature{
18201772 .SPV_KHR_variable_pointers,
18211773 .v1_3,
......@@ -1823,14 +1775,14 @@ pub const all_features = blk: {
18231775 };
18241776 result[@intFromEnum(Feature.vector16)] = .{
18251777 .llvm_name = null,
1826 .description = "Enable vector16 Capability.",
1778 .description = "Enable vector16 capability",
18271779 .dependencies = featureSet(&[_]Feature{
18281780 .v1_0,
18291781 }),
18301782 };
18311783 result[@intFromEnum(Feature.vulkan_memory_model)] = .{
18321784 .llvm_name = null,
1833 .description = "Enable vulkan_memory_model Capability.",
1785 .description = "Enable vulkan_memory_model capability",
18341786 .dependencies = featureSet(&[_]Feature{
18351787 .SPV_KHR_vulkan_memory_model,
18361788 .v1_5,
......@@ -1838,7 +1790,7 @@ pub const all_features = blk: {
18381790 };
18391791 result[@intFromEnum(Feature.vulkan_memory_model_device_scope)] = .{
18401792 .llvm_name = null,
1841 .description = "Enable vulkan_memory_model_device_scope Capability.",
1793 .description = "Enable vulkan_memory_model_device_scope capability",
18421794 .dependencies = featureSet(&[_]Feature{
18431795 .SPV_KHR_vulkan_memory_model,
18441796 .v1_5,
......@@ -1846,7 +1798,7 @@ pub const all_features = blk: {
18461798 };
18471799 result[@intFromEnum(Feature.workgroup_memory_explicit_layout16bit_access_khr)] = .{
18481800 .llvm_name = null,
1849 .description = "Enable workgroup_memory_explicit_layout16bit_access_khr Capability.",
1801 .description = "Enable workgroup_memory_explicit_layout16bit_access_khr capability",
18501802 .dependencies = featureSet(&[_]Feature{
18511803 .SPV_KHR_workgroup_memory_explicit_layout,
18521804 .v1_0,
......@@ -1854,7 +1806,7 @@ pub const all_features = blk: {
18541806 };
18551807 result[@intFromEnum(Feature.workgroup_memory_explicit_layout8bit_access_khr)] = .{
18561808 .llvm_name = null,
1857 .description = "Enable workgroup_memory_explicit_layout8bit_access_khr Capability.",
1809 .description = "Enable workgroup_memory_explicit_layout8bit_access_khr capability",
18581810 .dependencies = featureSet(&[_]Feature{
18591811 .SPV_KHR_workgroup_memory_explicit_layout,
18601812 .v1_0,
......@@ -1862,7 +1814,7 @@ pub const all_features = blk: {
18621814 };
18631815 result[@intFromEnum(Feature.workgroup_memory_explicit_layout_khr)] = .{
18641816 .llvm_name = null,
1865 .description = "Enable workgroup_memory_explicit_layout_khr Capability.",
1817 .description = "Enable workgroup_memory_explicit_layout_khr capability",
18661818 .dependencies = featureSet(&[_]Feature{
18671819 .SPV_KHR_workgroup_memory_explicit_layout,
18681820 .v1_0,
src/InternPool.zig+31-52
......@@ -2148,12 +2148,26 @@ pub const Key = union(enum) {
21482148 };
21492149
21502150 pub const SpirvType = extern struct {
2151 /// A `spirv_reify` instruction.
2152 zir_index: TrackedInst.Index,
2153 /// Always 0.
2154 padding: u32 = 0,
2155 /// A hash of this type's attributes generated by Sema.
2156 type_hash: u64,
2151 /// If tag is `.image`, this is the sampled type or `.none` if `usage` is `.storage`.
2152 /// If tag is `.sampled_image`, this is the image type.
2153 /// If tag is `.runtime_array`, this is the element type.
2154 /// Otherwise this is `.none`.
2155 ty: Index,
2156 flags: Flags,
2157
2158 pub const Flags = packed struct(u32) {
2159 tag: @typeInfo(std.lang.Type.Spirv).@"union".tag_type.?,
2160 // Image type flags
2161 usage: @typeInfo(std.lang.Type.Spirv.Image.Usage).@"union".tag_type.?,
2162 format: std.lang.Type.Spirv.Image.Format,
2163 dim: std.lang.Type.Spirv.Image.Dimensionality,
2164 depth: std.lang.Type.Spirv.Image.Depth,
2165 access: std.lang.Type.Spirv.Image.Access,
2166 is_arrayed: bool,
2167 is_multisampled: bool,
2168
2169 _: u16 = 0,
2170 };
21572171 };
21582172
21592173 pub const FuncType = struct {
......@@ -5054,6 +5068,7 @@ pub const Tag = enum(u8) {
50545068 const EnumTag = Key.EnumTag;
50555069 const Union = Key.Union;
50565070 const TypePointer = Key.PtrType;
5071 const TypeSpirv = Key.SpirvType;
50575072
50585073 const struct_packed_encoding = .{
50595074 .summary = .@"{.payload.name%summary#\"}",
......@@ -5266,7 +5281,7 @@ pub const Tag = enum(u8) {
52665281 },
52675282 .type_enum_explicit = enum_explicit_encoding,
52685283 .type_enum_nonexhaustive = enum_explicit_encoding,
5269 .type_spirv = .{ .summary = .@"{.payload.name%summary#\"}", .payload = Tag.TypeSpirv },
5284 .type_spirv = .{ .payload = Tag.TypeSpirv },
52705285 .type_opaque = .{
52715286 .summary = .@"{.payload.name%summary#\"}",
52725287 .payload = TypeOpaque,
......@@ -5723,34 +5738,6 @@ pub const Tag = enum(u8) {
57235738 name_nav: Nav.Index.Optional,
57245739 namespace: NamespaceIndex,
57255740 };
5726
5727 /// Trailing:
5728 /// 0. type_hash: PackedU64
5729 pub const TypeSpirv = struct {
5730 name: NullTerminatedString,
5731 /// The index of the `reify_spirv_type` instruction.
5732 zir_index: TrackedInst.Index,
5733 /// If tag is `.image`, this is the sampled type or `.none` if `usage` is `.storage`.
5734 /// If tag is `.sampled_image`, this is the image type.
5735 /// If tag is `.runtime_array`, this is the element type.
5736 /// Otherwise this is `.none`.
5737 ty: Index,
5738 flags: Flags,
5739
5740 pub const Flags = packed struct(u32) {
5741 tag: @typeInfo(std.lang.Type.Spirv).@"union".tag_type.?,
5742 // Image type flags
5743 usage: @typeInfo(std.lang.Type.Spirv.Image.Usage).@"union".tag_type.?,
5744 format: std.lang.Type.Spirv.Image.Format,
5745 dim: std.lang.Type.Spirv.Image.Dimensionality,
5746 depth: std.lang.Type.Spirv.Image.Depth,
5747 access: std.lang.Type.Spirv.Image.Access,
5748 is_arrayed: bool,
5749 is_multisampled: bool,
5750
5751 _: u16 = 0,
5752 };
5753 };
57545741};
57555742
57565743/// 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 {
66346621 };
66356622 } },
66366623 .type_spirv => .{ .spirv_type = ns: {
6637 const extra_list = unwrapped_index.getExtra(ip);
6638 const extra = extraDataTrail(extra_list, Tag.TypeSpirv, data);
6624 const extra = extraData(unwrapped_index.getExtra(ip), Tag.TypeSpirv, data);
66396625 break :ns .{
6640 .zir_index = extra.data.zir_index,
6641 .type_hash = extraData(extra_list, PackedU64, extra.end).get(),
6626 .ty = extra.ty,
6627 .flags = extra.flags,
66426628 };
66436629 } },
66446630 .type_opaque => .{ .opaque_type = ns: {
......@@ -8794,15 +8780,11 @@ pub fn getReifiedSpirvType(
87948780 gpa: Allocator,
87958781 io: Io,
87968782 tid: Zcu.PerThread.Id,
8797 ini: struct {
8798 zir_index: TrackedInst.Index,
8799 type_hash: u64,
8800 type_spirv: Tag.TypeSpirv,
8801 },
8783 type_spirv: Key.SpirvType,
88028784) Allocator.Error!Index {
88038785 var gop = try ip.getOrPutKey(gpa, io, tid, .{ .spirv_type = .{
8804 .zir_index = ini.zir_index,
8805 .type_hash = ini.type_hash,
8786 .ty = type_spirv.ty,
8787 .flags = type_spirv.flags,
88068788 } });
88078789 defer gop.deinit();
88088790 if (gop == .existing) return gop.existing;
......@@ -8812,11 +8794,8 @@ pub fn getReifiedSpirvType(
88128794 const extra = local.getMutableExtra(gpa, io);
88138795 try items.ensureUnusedCapacity(1);
88148796
8815 try extra.ensureUnusedCapacity(@typeInfo(Tag.TypeSpirv).@"struct".field_names.len +
8816 2 // type_hash: PackedU64
8817 );
8818 const extra_index = addExtraAssumeCapacity(extra, ini.type_spirv);
8819 _ = addExtraAssumeCapacity(extra, PackedU64.init(ini.type_hash));
8797 try extra.ensureUnusedCapacity(@typeInfo(Tag.TypeSpirv).@"struct".field_names.len);
8798 const extra_index = addExtraAssumeCapacity(extra, type_spirv);
88208799
88218800 items.appendAssumeCapacity(.{ .tag = .type_spirv, .data = extra_index });
88228801 return gop.put();
......@@ -10711,7 +10690,7 @@ fn dumpStatsFallible(ip: *const InternPool, w: *Io.Writer, arena: Allocator) !vo
1071110690 .type_optional => 0,
1071210691 .type_anyframe => 0,
1071310692 .type_error_union => @sizeOf(Key.ErrorUnionType),
10714 .type_spirv => @sizeOf(Tag.TypeSpirv) + @sizeOf(PackedU64),
10693 .type_spirv => @sizeOf(Tag.TypeSpirv),
1071510694 .type_anyerror_union => 0,
1071610695 .type_error_set => b: {
1071710696 const info = extraData(extra_list, Tag.ErrorSet, data);
src/Sema.zig+34-39
......@@ -8629,6 +8629,20 @@ fn checkParamType(
86298629 if (param_is_noalias and !param_ty.isGenericPoison() and !param_ty.isPtrAtRuntime(zcu) and !param_ty.isSliceAtRuntime(zcu)) {
86308630 return sema.fail(block, param_src, "non-pointer parameter declared noalias", .{});
86318631 }
8632 switch (target.os.tag) {
8633 .vulkan, .opengl => if (cc != .@"inline" and param_ty.isPtrAtRuntime(zcu)) {
8634 switch (param_ty.ptrAddressSpace(zcu)) {
8635 .input, .output => |as| return sema.failWithOwnedErrorMsg(block, msg: {
8636 const msg = try sema.errMsg(param_src, "function parameter cannot be a pointer in '{s}' address space", .{@tagName(as)});
8637 errdefer msg.destroy(sema.gpa);
8638 try sema.errNote(param_src, msg, "mark the function as 'inline' so the parameter is substituted at call sites", .{});
8639 break :msg msg;
8640 }),
8641 else => {},
8642 }
8643 },
8644 else => {},
8645 }
86328646}
86338647
86348648fn checkReturnTypeAndCallConv(
......@@ -20530,23 +20544,9 @@ fn zirReifySpirvType(
2053020544 return sema.failWithUseOfUndef(block, operand_src, null);
2053120545 }
2053220546
20533 // TODO: use a longer hash!
20534 var hasher = std.hash.Wyhash.init(0);
20535 std.hash.autoHash(&hasher, union_val.tag);
20536
20537 const name = try ip.getOrPutStringFmt(
20538 gpa,
20539 io,
20540 pt.tid,
20541 "{f}__SpirvType_{d}",
20542 .{ block.type_name_ctx.fmt(ip), @intFromEnum(inst) },
20543 .no_embedded_nulls,
20544 );
2054520547 const tag = try sema.interpretStdLangType(block, src, .fromInterned(union_val.tag), @typeInfo(std.lang.Type.Spirv).@"union".tag_type.?);
20546 const ip_data: InternPool.Tag.TypeSpirv = switch (tag) {
20548 const ip_data: InternPool.Key.SpirvType = switch (tag) {
2054720549 .sampler => .{
20548 .name = name,
20549 .zir_index = tracked_inst,
2055020550 .ty = .none,
2055120551 .flags = .{
2055220552 .tag = .sampler,
......@@ -20640,20 +20640,9 @@ fn zirReifySpirvType(
2064020640 else => {},
2064120641 }
2064220642
20643 std.hash.autoHash(&hasher, usage_tag);
20644 std.hash.autoHash(&hasher, format);
20645 std.hash.autoHash(&hasher, dim);
20646 std.hash.autoHash(&hasher, depth);
20647 std.hash.autoHash(&hasher, access);
20648 std.hash.autoHash(&hasher, arrayed);
20649 std.hash.autoHash(&hasher, multisampled);
20650
2065120643 break :ip_data .{
20652 .name = name,
20653 .zir_index = tracked_inst,
2065420644 .ty = blk: {
2065520645 const sampled_type = usage_val.unionPayload(zcu).toType();
20656 std.hash.autoHash(&hasher, sampled_type.toIntern());
2065720646
2065820647 if (target.os.tag != .opencl and sampled_type.toIntern() == .void_type) {
2065920648 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(
2072620715 if (image_info.usage != .sampled) {
2072720716 return sema.fail(block, operand_src, "'sampled_image' element must be an image with 'usage = .sampled'", .{});
2072820717 }
20729 std.hash.autoHash(&hasher, union_val.val);
2073020718 break :blk .{
20731 .name = name,
20732 .zir_index = tracked_inst,
2073320719 .ty = union_val.val,
2073420720 .flags = .{
2073520721 .tag = tag,
......@@ -20754,10 +20740,7 @@ fn zirReifySpirvType(
2075420740 {
2075520741 return sema.fail(block, operand_src, "'runtime_array' of 'runtime_array' is not allowed under the 'vulkan' os", .{});
2075620742 }
20757 std.hash.autoHash(&hasher, union_val.val);
2075820743 break :blk .{
20759 .name = name,
20760 .zir_index = tracked_inst,
2076120744 .ty = union_val.val,
2076220745 .flags = .{
2076320746 .tag = tag,
......@@ -20773,11 +20756,7 @@ fn zirReifySpirvType(
2077320756 },
2077420757 };
2077520758
20776 return .fromIntern(try ip.getReifiedSpirvType(gpa, io, pt.tid, .{
20777 .zir_index = tracked_inst,
20778 .type_hash = hasher.final(),
20779 .type_spirv = ip_data,
20780 }));
20759 return .fromIntern(try ip.getReifiedSpirvType(gpa, io, pt.tid, ip_data));
2078120760}
2078220761
2078320762fn resolveVaListRef(sema: *Sema, block: *Block, src: LazySrcLoc, zir_ref: Zir.Inst.Ref) CompileError!Air.Inst.Ref {
......@@ -24966,12 +24945,28 @@ fn zirBuiltinExtern(
2496624945 }
2496724946
2496824947 if (options.decoration) |decoration| switch (decoration) {
24969 .flat => if (ptr_info.flags.address_space != .input) {
24970 return sema.fail(block, options_src, "'flat' decoration requires 'input' address space", .{});
24948 .flat => switch (ptr_info.flags.address_space) {
24949 .input, .output => {},
24950 else => return sema.fail(block, options_src, "\"flat\" decoration requires \"input\" or \"output\" address space", .{}),
2497124951 },
2497224952 .location, .descriptor => {},
2497324953 };
2497424954
24955 switch (zcu.getTarget().os.tag) {
24956 .vulkan, .opengl => switch (ptr_info.flags.address_space) {
24957 .storage_buffer, .uniform, .push_constant => if (ptr_info.flags.size != .one) {
24958 return sema.failWithOwnedErrorMsg(block, msg: {
24959 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)});
24960 errdefer msg.destroy(sema.gpa);
24961 try sema.errNote(ty_src, msg, "wrap the element type in a struct containing a runtime-sized array", .{});
24962 break :msg msg;
24963 });
24964 },
24965 else => {},
24966 },
24967 else => {},
24968 }
24969
2497524970 // TODO: error for threadlocal functions, non-const functions, etc
2497624971
2497724972 const extern_val = try pt.getExtern(.{
src/Sema/type_resolution.zig+4-1
......@@ -87,12 +87,15 @@ fn ensureLayoutResolvedInner(sema: *Sema, ty: Type, orig_ty: Type, reason: *cons
8787 .ptr_type,
8888 .anyframe_type,
8989 .simple_type,
90 .spirv_type,
9190 .opaque_type,
9291 .error_set_type,
9392 .inferred_error_set_type,
9493 => {},
9594
95 .spirv_type => if (ty.isSpirvRuntimeArray(zcu)) {
96 return ensureLayoutResolvedInner(sema, ty.childType(zcu), orig_ty, reason);
97 },
98
9699 .func_type => |func_type| {
97100 for (func_type.param_types.get(ip)) |param_ty| {
98101 try ensureLayoutResolvedInner(sema, .fromInterned(param_ty), orig_ty, reason);
src/Type.zig+15-2
......@@ -619,8 +619,21 @@ pub fn print(ty: Type, writer: *std.Io.Writer, pt: Zcu.PerThread, ctx: ?*Compari
619619 try writer.print("{f}", .{name.fmt(ip)});
620620 },
621621 .spirv_type => {
622 const name = ip.loadSpirvType(ty.toIntern()).name;
623 try writer.print("{f}", .{name.fmt(ip)});
622 const info = ip.loadSpirvType(ty.toIntern());
623 switch (info.flags.tag) {
624 .sampler => try writer.writeAll("@SpirvType(.sampler)"),
625 .image => try writer.writeAll("@SpirvType(.image)"),
626 .sampled_image => {
627 try writer.writeAll("@SpirvType(.sampled_image, ");
628 try print(Type.fromInterned(info.ty), writer, pt, ctx);
629 try writer.writeAll(")");
630 },
631 .runtime_array => {
632 try writer.writeAll("@SpirvType(.runtime_array, ");
633 try print(Type.fromInterned(info.ty), writer, pt, ctx);
634 try writer.writeAll(")");
635 },
636 }
624637 },
625638 .func_type => |fn_info| {
626639 if (fn_info.is_noinline) {
src/codegen/spirv/CodeGen.zig+186-52
......@@ -17,6 +17,8 @@ uav_link: std.AutoHashMapUnmanaged(struct { InternPool.Index, spec.StorageClass
1717entry_points: std.array_hash_map.Auto(Id, EntryPoint) = .empty,
1818error_buffer: ?Decl.Index = null,
1919struct_types: std.array_hash_map.Custom(StructType, Id, StructType.HashContext, true) = .empty,
20/// SPIR-V ids of OpVariables whose pointee is a Block struct
21block_var_ids: std.AutoHashMapUnmanaged(Id, void) = .empty,
2022builtins: std.AutoHashMapUnmanaged(struct { spec.BuiltIn, spec.StorageClass }, Decl.Index) = .empty,
2123sections: struct {
2224 // 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 {
181183 cg.sections.functions.deinit(gpa);
182184
183185 cg.struct_types.deinit(gpa);
186 cg.block_var_ids.deinit(gpa);
184187 cg.builtins.deinit(gpa);
185188
186189 cg.decls.deinit(gpa);
......@@ -587,6 +590,71 @@ pub fn structType(
587590 return result_id;
588591}
589592
593/// Returns the layout-decorated variant of `ty` for use inside a Vulkan/OpenGL
594/// interface block. Vulkan forbids nested Block decorations, so recursive calls
595/// always pass `false`.
596///
597/// This is distinct from `resolveType` because SPIR-V forbids such decorations
598/// on the pointee of a Function-scope variable.
599pub fn layoutType(cg: *CodeGen, ty: Type, is_block_root: bool) Error!Id {
600 const gpa = cg.gpa;
601 const zcu = cg.zcu;
602 const ip = &zcu.intern_pool;
603
604 const result_id: Id = switch (ty.zigTypeTag(zcu)) {
605 .@"struct" => id: {
606 const struct_type = ip.loadStructType(ty.toIntern());
607 if (struct_type.layout == .@"packed") return cg.resolveType(ty, .indirect);
608
609 var member_types: std.ArrayList(Id) = .empty;
610 defer member_types.deinit(gpa);
611 const id = cg.allocId();
612 if (is_block_root) try cg.decorate(id, .block);
613 var it = struct_type.iterateRuntimeOrder(ip);
614 while (it.next()) |field_index| {
615 const field_ty: Type = .fromInterned(struct_type.field_types.get(ip)[field_index]);
616 if (!field_ty.hasRuntimeBits(zcu)) continue;
617 try cg.decorateMember(id, @intCast(member_types.items.len), .{ .offset = .{
618 .byte_offset = @intCast(ty.structFieldOffset(field_index, zcu)),
619 } });
620 try member_types.append(gpa, try cg.layoutType(field_ty, false));
621 }
622 try cg.sections.globals.emit(gpa, .OpTypeStruct, .{
623 .id_result = id,
624 .id_ref = member_types.items,
625 });
626 break :id id;
627 },
628 .array => id: {
629 const elem_ty = ty.childType(zcu);
630 const elem_ty_id = try cg.layoutType(elem_ty, false);
631 const total_len = std.math.cast(u32, ty.arrayLenIncludingSentinel(zcu)) orelse
632 return cg.fail("array type of {} elements is too large", .{ty.arrayLenIncludingSentinel(zcu)});
633 const id = try cg.arrayType(try cg.constInt(.u32, total_len), elem_ty_id);
634 if (elem_ty.hasRuntimeBits(zcu)) try cg.decorate(id, .{
635 .array_stride = .{ .array_stride = @intCast(elem_ty.abiSize(zcu)) },
636 });
637 break :id id;
638 },
639 .spirv => if (ty.isSpirvRuntimeArray(zcu)) id: {
640 const elem_ty = ty.childType(zcu);
641 const elem_ty_id = try cg.layoutType(elem_ty, false);
642 const id = cg.allocId();
643 try cg.sections.globals.emit(gpa, .OpTypeRuntimeArray, .{
644 .id_result = id,
645 .element_type = elem_ty_id,
646 });
647 if (elem_ty.hasRuntimeBits(zcu)) try cg.decorate(id, .{
648 .array_stride = .{ .array_stride = @intCast(elem_ty.abiSize(zcu)) },
649 });
650 break :id id;
651 } else return cg.resolveType(ty, .indirect),
652 else => return cg.resolveType(ty, .indirect),
653 };
654
655 return result_id;
656}
657
590658pub fn functionType(cg: *CodeGen, return_ty_id: Id, param_type_ids: []const Id) !Id {
591659 const result_id = cg.allocId();
592660 try cg.sections.globals.emit(cg.gpa, .OpTypeFunction, .{
......@@ -806,7 +874,8 @@ pub fn genNav(cg: *CodeGen, do_codegen: bool) Error!void {
806874 const storage_class = cg.storageClass(nav.resolved.?.@"addrspace");
807875 assert(storage_class != .generic); // These should be instance globals
808876
809 const ty_id = try cg.resolveType(ty, .indirect);
877 const as = nav.resolved.?.@"addrspace";
878 const ty_id = try cg.pointeeType(as, ty, true);
810879 const ptr_ty_id = try cg.ptrType(ty_id, storage_class);
811880
812881 try cg.sections.globals.emit(gpa, .OpVariable, .{
......@@ -819,15 +888,14 @@ pub fn genNav(cg: *CodeGen, do_codegen: bool) Error!void {
819888 .vulkan, .opengl => {
820889 switch (storage_class) {
821890 .uniform, .push_constant, .storage_buffer, .physical_storage_buffer => {
822 if (ty.zigTypeTag(zcu) == .@"struct" and storage_class != .physical_storage_buffer) {
823 try cg.decorate(ty_id, .block);
824 }
825
826891 if (ty.hasRuntimeBits(zcu)) {
827892 try cg.decorate(ptr_ty_id, .{
828893 .array_stride = .{ .array_stride = @intCast(ty.abiSize(zcu)) },
829894 });
830 try cg.decorateLayout(ty, ty_id);
895 if (!cg.needsLayout(as, ty)) try cg.decorateLayout(ty, ty_id);
896 }
897 if (key.is_const and storage_class == .storage_buffer) {
898 try cg.decorate(result_id, .non_writable);
831899 }
832900 },
833901 else => {},
......@@ -1815,6 +1883,9 @@ fn derivePtr(cg: *CodeGen, derivation: Value.PointerDeriveStep) !Id {
18151883
18161884 const nav_ty_id = try cg.resolveType(nav_ty, .indirect);
18171885 const decl_ptr_ty_id = try cg.ptrType(nav_ty_id, storage_class);
1886 if (nav_ty.zigTypeTag(zcu) == .@"struct" and cg.needsLayout(nav.resolved.?.@"addrspace", nav_ty)) {
1887 try cg.block_var_ids.put(gpa, spv_decl.result_id, {});
1888 }
18181889 if (decl_ptr_ty_id == ty_id) return spv_decl.result_id;
18191890 switch (target.os.tag) {
18201891 .vulkan, .opengl => return spv_decl.result_id,
......@@ -1879,7 +1950,6 @@ fn derivePtr(cg: *CodeGen, derivation: Value.PointerDeriveStep) !Id {
18791950 .offset_and_cast => |oac| {
18801951 const parent_ptr_id = try cg.derivePtr(oac.parent.*);
18811952 const parent_ptr_ty = try oac.parent.ptrType(pt);
1882 const result_ty_id = try cg.resolveType(oac.new_ptr_ty, .direct);
18831953
18841954 if (oac.new_ptr_ty.ptrInfo(zcu).flags.vector_index != .none) {
18851955 return parent_ptr_id;
......@@ -1890,19 +1960,36 @@ fn derivePtr(cg: *CodeGen, derivation: Value.PointerDeriveStep) !Id {
18901960 var cur = parent_ptr_ty.childType(zcu);
18911961 const dst_child = oac.new_ptr_ty.childType(zcu);
18921962 while (cur.toIntern() != dst_child.toIntern()) {
1893 if (cur.zigTypeTag(zcu) == .array) {
1894 cur = cur.childType(zcu);
1895 depth += 1;
1896 } else break;
1963 switch (cur.zigTypeTag(zcu)) {
1964 .array => {
1965 cur = cur.childType(zcu);
1966 depth += 1;
1967 },
1968 .@"struct" => {
1969 if (cur.structFieldCount(zcu) == 0) break;
1970 if (cur.structFieldOffset(0, zcu) != 0) break;
1971 cur = cur.fieldType(0, zcu);
1972 depth += 1;
1973 },
1974 else => break,
1975 }
18971976 }
1898 if (depth > 0 and cur.toIntern() == dst_child.toIntern()) {
1899 const scratch_top = cg.id_scratch.items.len;
1900 defer cg.id_scratch.shrinkRetainingCapacity(scratch_top);
1901 const zero = try cg.constInt(.u32, 0);
1902 const ids = try cg.id_scratch.addManyAsSlice(gpa, depth);
1903 @memset(ids, zero);
1904 return cg.accessChainId(result_ty_id, parent_ptr_id, ids);
1977 if (cur.toIntern() == dst_child.toIntern()) {
1978 if (depth != 0) {
1979 const as = oac.new_ptr_ty.ptrAddressSpace(zcu);
1980 const child_ty_id = try cg.pointeeType(as, dst_child, false);
1981 const result_ty_id = try cg.ptrType(child_ty_id, cg.storageClass(as));
1982 const scratch_top = cg.id_scratch.items.len;
1983 defer cg.id_scratch.shrinkRetainingCapacity(scratch_top);
1984 const zero = try cg.constInt(.u32, 0);
1985 const ids = try cg.id_scratch.addManyAsSlice(gpa, depth);
1986 @memset(ids, zero);
1987 return cg.accessChainId(result_ty_id, parent_ptr_id, ids);
1988 } else {
1989 return parent_ptr_id;
1990 }
19051991 }
1992 const result_ty_id = try cg.resolveType(oac.new_ptr_ty, .direct);
19061993 if (target.os.tag == .opencl) {
19071994 const result_ptr_id = cg.allocId();
19081995 try cg.body.emit(gpa, .OpBitcast, .{
......@@ -4075,33 +4162,77 @@ fn extractVectorComponent(cg: *CodeGen, result_ty: Type, vector_id: Id, field: u
40754162
40764163const MemoryOptions = struct {
40774164 is_volatile: bool = false,
4165 ptr_address_space: std.lang.AddressSpace = .generic,
40784166};
40794167
4168/// Returns true if a pointee at address space must use the
4169/// layout-decorated variant rather than the bare type.
4170fn needsLayout(cg: *CodeGen, as: std.lang.AddressSpace, pointee_ty: Type) bool {
4171 const target = cg.zcu.getTarget();
4172 if (target.os.tag != .vulkan and target.os.tag != .opengl) return false;
4173 switch (as) {
4174 .uniform, .push_constant, .storage_buffer => {},
4175 else => return false,
4176 }
4177 return switch (pointee_ty.zigTypeTag(cg.zcu)) {
4178 .@"struct", .array => true,
4179 .spirv => pointee_ty.isSpirvRuntimeArray(cg.zcu),
4180 else => false,
4181 };
4182}
4183
4184fn pointeeType(cg: *CodeGen, as: std.lang.AddressSpace, ty: Type, is_block_root: bool) !Id {
4185 return if (cg.needsLayout(as, ty))
4186 cg.layoutType(ty, is_block_root)
4187 else
4188 cg.resolveType(ty, .indirect);
4189}
4190
4191fn convertLayout(cg: *CodeGen, dst_ty_id: Id, src_id: Id, src_ty_id: Id) !Id {
4192 if (dst_ty_id == src_ty_id) return src_id;
4193 const id = cg.allocId();
4194 try cg.body.emit(cg.gpa, .OpCopyLogical, .{
4195 .id_result_type = dst_ty_id,
4196 .id_result = id,
4197 .operand = src_id,
4198 });
4199 return id;
4200}
4201
40804202fn load(cg: *CodeGen, value_ty: Type, ptr_id: Id, options: MemoryOptions) !Id {
40814203 const zcu = cg.zcu;
40824204 const alignment: u32 = @intCast(value_ty.abiAlignment(zcu).toByteUnits().?);
4083 const indirect_value_ty_id = try cg.resolveType(value_ty, .indirect);
4084 const result_id = cg.allocId();
4085 const access: spec.MemoryAccess.Extended = .{
4086 .@"volatile" = options.is_volatile,
4087 .aligned = .{ .literal_integer = alignment },
4088 };
4205 const bare_ty_id = try cg.resolveType(value_ty, .indirect);
4206 const load_ty_id = if (cg.needsLayout(options.ptr_address_space, value_ty))
4207 try cg.layoutType(value_ty, cg.block_var_ids.contains(ptr_id))
4208 else
4209 bare_ty_id;
4210 const loaded_id = cg.allocId();
40894211 try cg.body.emit(cg.gpa, .OpLoad, .{
4090 .id_result_type = indirect_value_ty_id,
4091 .id_result = result_id,
4212 .id_result_type = load_ty_id,
4213 .id_result = loaded_id,
40924214 .pointer = ptr_id,
4093 .memory_access = access,
4215 .memory_access = .{
4216 .@"volatile" = options.is_volatile,
4217 .aligned = .{ .literal_integer = alignment },
4218 },
40944219 });
4220 const result_id = try cg.convertLayout(bare_ty_id, loaded_id, load_ty_id);
40954221 return try cg.convertToDirect(value_ty, result_id);
40964222}
40974223
40984224fn store(cg: *CodeGen, value_ty: Type, ptr_id: Id, value_id: Id, options: MemoryOptions) !void {
4099 const indirect_value_id = try cg.convertToIndirect(value_ty, value_id);
4100 const access: spec.MemoryAccess.Extended = .{ .@"volatile" = options.is_volatile };
4225 const bare_value_id = try cg.convertToIndirect(value_ty, value_id);
4226 const bare_ty_id = try cg.resolveType(value_ty, .indirect);
4227 const store_ty_id = if (cg.needsLayout(options.ptr_address_space, value_ty))
4228 try cg.layoutType(value_ty, cg.block_var_ids.contains(ptr_id))
4229 else
4230 bare_ty_id;
4231 const object_id = try cg.convertLayout(store_ty_id, bare_value_id, bare_ty_id);
41014232 try cg.body.emit(cg.gpa, .OpStore, .{
41024233 .pointer = ptr_id,
4103 .object = indirect_value_id,
4104 .memory_access = access,
4234 .object = object_id,
4235 .memory_access = .{ .@"volatile" = options.is_volatile },
41054236 });
41064237}
41074238
......@@ -5499,6 +5630,8 @@ fn ptrAccessChain(
54995630 });
55005631 },
55015632 .vulkan, .opengl => {
5633 assert(target.cpu.has(.spirv, .variable_pointers) or
5634 target.cpu.has(.spirv, .variable_pointers_storage_buffer));
55025635 try cg.body.emit(gpa, .OpPtrAccessChain, .{
55035636 .id_result_type = result_ty_id,
55045637 .id_result = result_id,
......@@ -5514,23 +5647,18 @@ fn ptrAccessChain(
55145647
55155648fn ptrAdd(cg: *CodeGen, result_ty: Type, ptr_ty: Type, ptr_id: Id, offset_id: Id) !Id {
55165649 const zcu = cg.zcu;
5517 const result_ty_id = try cg.resolveType(result_ty, .direct);
5518
5519 switch (ptr_ty.ptrSize(zcu)) {
5520 .one => {
5521 // Pointer to array
5522 // TODO: Is this correct?
5523 return try cg.accessChainId(result_ty_id, ptr_id, &.{offset_id});
5524 },
5525 .c, .many => {
5526 return try cg.ptrAccessChain(result_ty_id, ptr_id, offset_id, &.{});
5527 },
5528 .slice => {
5650 const as = result_ty.ptrAddressSpace(zcu);
5651 const child_ty_id = try cg.pointeeType(as, result_ty.childType(zcu), false);
5652 const result_ty_id = try cg.ptrType(child_ty_id, cg.storageClass(as));
5653 return switch (ptr_ty.ptrSize(zcu)) {
5654 .one => cg.accessChainId(result_ty_id, ptr_id, &.{offset_id}),
5655 .c, .many => cg.ptrAccessChain(result_ty_id, ptr_id, offset_id, &.{}),
5656 .slice => blk: {
55295657 // TODO: This is probably incorrect. A slice should be returned here, though this is what llvm does.
55305658 const slice_ptr_id = try cg.extractField(result_ty, ptr_id, 0);
5531 return try cg.ptrAccessChain(result_ty_id, slice_ptr_id, offset_id, &.{});
5659 break :blk cg.ptrAccessChain(result_ty_id, slice_ptr_id, offset_id, &.{});
55325660 },
5533 }
5661 };
55345662}
55355663
55365664fn airPtrAdd(cg: *CodeGen, inst: Air.Inst.Index) !?Id {
......@@ -6476,16 +6604,16 @@ fn airSliceElemVal(cg: *CodeGen, inst: Air.Inst.Index) !?Id {
64766604fn ptrElemPtr(cg: *CodeGen, ptr_ty: Type, ptr_id: Id, index_id: Id) !Id {
64776605 const zcu = cg.zcu;
64786606 // Construct new pointer type for the resulting pointer
6479 const elem_ty = ptr_ty.indexableElem(zcu);
6480 const elem_ty_id = try cg.resolveType(elem_ty, .indirect);
6481 const elem_ptr_ty_id = try cg.ptrType(elem_ty_id, cg.storageClass(ptr_ty.ptrAddressSpace(zcu)));
6607 const as = ptr_ty.ptrAddressSpace(zcu);
6608 const elem_ty_id = try cg.pointeeType(as, ptr_ty.indexableElem(zcu), false);
6609 const elem_ptr_ty_id = try cg.ptrType(elem_ty_id, cg.storageClass(as));
64826610 if (ptr_ty.isSinglePointer(zcu)) {
64836611 // Pointer-to-array. In this case, the resulting pointer is not of the same type
64846612 // as the ptr_ty (we want a *T, not a *[N]T), and hence we need to use accessChain.
6485 return try cg.accessChainId(elem_ptr_ty_id, ptr_id, &.{index_id});
6613 return cg.accessChainId(elem_ptr_ty_id, ptr_id, &.{index_id});
64866614 } else {
64876615 // Resulting pointer type is the same as the ptr_ty, so use ptrAccessChain
6488 return try cg.ptrAccessChain(elem_ptr_ty_id, ptr_id, index_id, &.{});
6616 return cg.ptrAccessChain(elem_ptr_ty_id, ptr_id, index_id, &.{});
64896617 }
64906618}
64916619
......@@ -7369,7 +7497,10 @@ fn airLoad(cg: *CodeGen, inst: Air.Inst.Index) !?Id {
73697497 break :ptr_id try cg.accessChain(elem_ptr_ty_id, operand_ptr_id, &.{@intFromEnum(index)});
73707498 },
73717499 };
7372 return try cg.load(elem_ty, ptr_id, .{ .is_volatile = ptr_info.flags.is_volatile });
7500 return try cg.load(elem_ty, ptr_id, .{
7501 .is_volatile = ptr_info.flags.is_volatile,
7502 .ptr_address_space = ptr_info.flags.address_space,
7503 });
73737504}
73747505
73757506fn airStore(cg: *CodeGen, inst: Air.Inst.Index) !void {
......@@ -7441,7 +7572,10 @@ fn airStore(cg: *CodeGen, inst: Air.Inst.Index) !void {
74417572 },
74427573 };
74437574
7444 try cg.store(elem_ty, ptr_id, value_id, .{ .is_volatile = ptr_info.flags.is_volatile });
7575 try cg.store(elem_ty, ptr_id, value_id, .{
7576 .is_volatile = ptr_info.flags.is_volatile,
7577 .ptr_address_space = ptr_info.flags.address_space,
7578 });
74457579}
74467580
74477581fn airRet(cg: *CodeGen, inst: Air.Inst.Index) !void {
src/link/SpirV.zig+8-4
......@@ -628,14 +628,18 @@ fn emitPreamble(
628628 if (has_linkage) caps.insert(.linkage);
629629
630630 inline for (@typeInfo(spec.Capability).@"enum".field_names) |cap_name| {
631 if (target.cpu.has(.spirv, @field(std.Target.spirv.Feature, cap_name)))
632 caps.insert(@field(spec.Capability, cap_name));
631 if (@hasField(std.Target.spirv.Feature, cap_name)) {
632 if (target.cpu.has(.spirv, @field(std.Target.spirv.Feature, cap_name)))
633 caps.insert(@field(spec.Capability, cap_name));
634 }
633635 }
634636 inline for (@typeInfo(spec.Extension).@"enum".field_names) |ext_name| {
635637 switch (@field(spec.Extension, ext_name)) {
636638 .v1_0, .v1_1, .v1_2, .v1_3, .v1_4, .v1_5, .v1_6 => {},
637 else => if (target.cpu.has(.spirv, @field(std.Target.spirv.Feature, ext_name)))
638 try exts.put(gpa, ext_name, {}),
639 else => if (@hasField(std.Target.spirv.Feature, ext_name)) {
640 if (target.cpu.has(.spirv, @field(std.Target.spirv.Feature, ext_name)))
641 try exts.put(gpa, ext_name, {});
642 },
639643 }
640644 }
641645
test/behavior/spirv.zig+29
......@@ -1,3 +1,6 @@
1const std = @import("std");
2const expect = std.testing.expect;
3
14const Sampler = @SpirvType(.sampler);
25const Image = @SpirvType(.{ .image = .{
36 .usage = .{ .sampled = u32 },
......@@ -45,3 +48,29 @@ test "@SpirvType" {
4548 _ = storage_image;
4649 _ = runtime_array;
4750}
51
52test "@SpirvType equality" {
53 try expect(@SpirvType(.sampler) == Sampler);
54 try expect(@SpirvType(.{ .runtime_array = u32 }) == RuntimeArray);
55 try expect(@SpirvType(.{ .sampled_image = Image }) == SampledImage);
56 try expect(@SpirvType(.{ .image = .{
57 .usage = .{ .sampled = u32 },
58 .format = .unknown,
59 .dim = .@"2d",
60 .depth = .unknown,
61 .arrayed = false,
62 .multisampled = false,
63 .access = .unknown,
64 } }) == Image);
65 try expect(@SpirvType(.{ .image = .{
66 .usage = .{ .sampled = u32 },
67 .format = .unknown,
68 .dim = .@"3d",
69 .depth = .unknown,
70 .arrayed = false,
71 .multisampled = false,
72 .access = .unknown,
73 } }) != Image);
74 try expect(@SpirvType(.{ .runtime_array = u32 }) != @SpirvType(.{ .runtime_array = u8 }));
75 try expect(@SpirvType(.sampler) != @SpirvType(.{ .runtime_array = u32 }));
76}
test/cases/compile_errors/extern_spirv_decoration_validation.zig+2-2
......@@ -1,4 +1,4 @@
1const x = @extern(*addrspace(.output) u32, .{
1const x = @extern(*addrspace(.push_constant) u32, .{
22 .name = "x",
33 .decoration = .{ .flat = 0 },
44});
......@@ -10,4 +10,4 @@ comptime {
1010// backend=selfhosted
1111// target=spirv32-vulkan
1212//
13// :1:45: error: 'flat' decoration requires 'input' address space
13// :1:45: error: "flat" decoration requires "input" or "output" address space
test/cases/compile_errors/extern_spirv_storage_buffer_must_be_single_pointer.zig created+25
......@@ -0,0 +1,25 @@
1const a = @extern([*]addrspace(.storage_buffer) u32, .{
2 .name = "a",
3 .decoration = .{ .descriptor = .{ .set = 0, .binding = 0 } },
4});
5const b = @extern([]addrspace(.uniform) u32, .{
6 .name = "b",
7 .decoration = .{ .descriptor = .{ .set = 0, .binding = 1 } },
8});
9const c = @extern([*c]addrspace(.push_constant) u32, .{ .name = "c" });
10comptime {
11 _ = a;
12 _ = b;
13 _ = c;
14}
15
16// error
17// backend=selfhosted
18// target=spirv32-vulkan
19//
20// :1:19: error: extern in 'storage_buffer' address space must be a single-item pointer to a struct
21// :1:19: note: wrap the element type in a struct containing a runtime-sized array
22// :5:19: error: extern in 'uniform' address space must be a single-item pointer to a struct
23// :5:19: note: wrap the element type in a struct containing a runtime-sized array
24// :9:19: error: extern in 'push_constant' address space must be a single-item pointer to a struct
25// :9:19: note: wrap the element type in a struct containing a runtime-sized array
tools/update_cpu_features.zig+31-18
......@@ -50,19 +50,29 @@ const ArchTarget = struct {
5050 branch_quota: ?usize = null,
5151};
5252
53const spirv_extra_features = blk: {
54 const caps_info = @typeInfo(spirv_spec.Capability).@"enum";
55 const exts_info = @typeInfo(spirv_spec.Extension).@"enum";
56 const caps_len = caps_info.field_names.len;
57 const exts_len = exts_info.field_names.len;
58
59 var features: [caps_len + exts_len]Feature = undefined;
60 for (
61 caps_info.field_names,
62 caps_info.field_values,
63 features[0..caps_len],
64 ) |name, value, *feature| {
65 feature.* = .{
53const spirv_omitted_capabilities = [_][]const u8{
54 "shader", // implied by Vulkan/OpenGL targets
55 "kernel", // implied by OpenCL/AMDHSA targets
56 "addresses", // implied by OpenCL/AMDHSA targets
57 "physical_storage_buffer_addresses", // implied by spirv64-vulkan
58 "linkage", // automatically emitted when externs need linkage decorations
59};
60const spirv_omitted_extensions = [_][]const u8{
61 "SPV_KHR_physical_storage_buffer", // paired with physical_storage_buffer_addresses
62};
63
64const spirv_extra_features: []const Feature = blk: {
65 @setEvalBranchQuota(15_000);
66 var features: []const Feature = &.{};
67
68 cap: for (
69 @typeInfo(spirv_spec.Capability).@"enum".field_names,
70 @typeInfo(spirv_spec.Capability).@"enum".field_values,
71 ) |name, value| {
72 for (spirv_omitted_capabilities) |omitted| {
73 if (std.mem.eql(u8, omitted, name)) continue :cap;
74 }
75 features = features ++ &[_]Feature{.{
6676 .zig_name = name,
6777 .desc = "Enable " ++ name ++ " capability",
6878 .deps = &struct {
......@@ -73,11 +83,14 @@ const spirv_extra_features = blk: {
7383 break :inner out;
7484 };
7585 }.deps,
76 };
86 }};
7787 }
7888
79 for (exts_info.field_names, features[caps_len..]) |name, *feature| {
80 feature.* = .{
89 ext: for (@typeInfo(spirv_spec.Extension).@"enum".field_names) |name| {
90 for (spirv_omitted_extensions) |omitted| {
91 if (std.mem.eql(u8, omitted, name)) continue :ext;
92 }
93 features = features ++ &[_]Feature{.{
8194 .zig_name = name,
8295 .desc = "Enable " ++ name ++ " extension",
8396 .deps = if (std.mem.eql(u8, name, "v1_6"))
......@@ -94,7 +107,7 @@ const spirv_extra_features = blk: {
94107 &.{"v1_0"}
95108 else
96109 &.{},
97 };
110 }};
98111 }
99112
100113 break :blk features;
......@@ -1494,7 +1507,7 @@ const targets = [_]ArchTarget{
14941507 .td_name = "SPIRV",
14951508 },
14961509 .branch_quota = 2000,
1497 .extra_features = &spirv_extra_features,
1510 .extra_features = spirv_extra_features,
14981511 .extra_cpus = &.{
14991512 .{
15001513 .llvm_name = null,