vk_parse/
types.rs

1#![allow(non_snake_case)]
2
3#[cfg(feature = "serialize")]
4use serde::{Deserialize, Serialize};
5
6/// Errors from which parser cannot recover.
7#[derive(Debug)]
8#[non_exhaustive]
9pub enum FatalError {
10    MissingRegistryElement,
11    IoError(std::io::Error),
12}
13
14impl From<std::io::Error> for FatalError {
15    fn from(v: std::io::Error) -> FatalError {
16        FatalError::IoError(v)
17    }
18}
19
20/// Errors from which parser can recover. How much information will be missing
21/// in the resulting Registry depends on the type of error and situation in
22/// which it occurs. For example, unrecognized attribute will simply be skipped
23/// without affecting anything around it, while unrecognized element will have
24/// all of its contents skipped.
25#[derive(Debug, PartialEq, Eq)]
26#[non_exhaustive]
27pub enum Error {
28    UnexpectedElement {
29        xpath: String,
30        name: String,
31    },
32    UnexpectedAttribute {
33        xpath: String,
34        name: String,
35    }, // "Missing attribute '{}' on element '{}'."
36    UnexpectedAttributeValue {
37        xpath: String,
38        name: String,
39        value: String,
40    },
41    MissingElement {
42        xpath: String,
43        name: String,
44    },
45    MissingAttribute {
46        xpath: String,
47        name: String,
48    },
49    SchemaViolation {
50        xpath: String,
51        desc: String,
52    },
53    ParseIntError {
54        xpath: String,
55        text: String,
56        error: std::num::ParseIntError,
57    },
58    Internal {
59        desc: &'static str,
60    },
61}
62
63/// Rust structure representing the Vulkan registry.
64///
65/// The registry contains all the information contained in a certain version
66/// of the Vulkan specification, stored within a programmer-accessible format.
67#[derive(Debug, Clone, PartialEq, Eq, Default)]
68#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
69pub struct Registry(pub Vec<RegistryChild>);
70
71/// An element of the Vulkan registry.
72#[derive(Debug, Clone, PartialEq, Eq)]
73#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
74#[non_exhaustive]
75pub enum RegistryChild {
76    /// Comments are human-readable strings which contain registry meta-data.
77    Comment(String),
78
79    /// IDs of all known Vulkan vendors.
80    VendorIds(VendorIds),
81
82    /// List of supported Vulkan platforms.
83    Platforms(Platforms),
84
85    /// Known extension tags.
86    Tags(Tags),
87
88    /// Type definitions.
89    ///
90    /// Unlike OpenGL, Vulkan is a strongly-typed API.
91    Types(Types),
92
93    /// Enum definitions.
94    Enums(Enums),
95
96    /// Commands are the Vulkan API's name for functions.
97    Commands(Commands),
98
99    /// Feature level of the API, such as Vulkan 1.0 or 1.1
100    Feature(Feature),
101
102    /// Container for all published Vulkan specification extensions.
103    Extensions(Extensions),
104
105    Formats(Formats),
106
107    SpirvExtensions(SpirvExtensions),
108
109    SpirvCapabilities(SpirvCapabilities),
110
111    Sync(Sync),
112
113    VideoCodecs(VideoCodecs),
114}
115
116pub type VendorIds = CommentedChildren<VendorId>;
117
118/// Unique identifier for a Vulkan vendor.
119///
120/// Note: in newer versions of the Vulkan spec (1.1.79 and later), this tag is
121/// not used, instead it has been replaced by the `VKVendorId` enum.
122#[derive(Debug, Clone, PartialEq, Eq, Default)]
123#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
124#[non_exhaustive]
125pub struct VendorId {
126    /// Name of the vendor.
127    pub name: String,
128
129    /// The unique ID.
130    pub id: u32,
131
132    /// Human-readable description.
133    #[cfg_attr(
134        feature = "serialize",
135        serde(default, skip_serializing_if = "is_default")
136    )]
137    pub comment: Option<String>,
138}
139
140pub type Platforms = CommentedChildren<Platform>;
141
142/// A platform refers to a windowing system which Vulkan can use.
143///
144/// Most operating systems will have only one corresponding platform,
145/// but Linux has multiple (XCB, Wayland, etc.)
146///
147/// Used in versions 1.1.70 and later.
148#[derive(Debug, Clone, PartialEq, Eq, Default)]
149#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
150#[non_exhaustive]
151pub struct Platform {
152    /// Short identifier.
153    pub name: String,
154
155    /// C macro name which is used to guard platform-specific definitions.
156    pub protect: String,
157
158    /// Human readable description of the platform.
159    #[cfg_attr(
160        feature = "serialize",
161        serde(default, skip_serializing_if = "is_default")
162    )]
163    pub comment: Option<String>,
164}
165
166pub type Tags = CommentedChildren<Tag>;
167
168/// Tags are the little suffixes attached to extension names or items, indicating the author.
169///
170/// Some examples:
171/// - KHR for Khronos extensions
172/// - EXT for multi-vendor extensions
173#[derive(Debug, Clone, PartialEq, Eq, Default)]
174#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
175#[non_exhaustive]
176pub struct Tag {
177    /// The name of the tag, e.g. "KHR".
178    pub name: String,
179    /// Author of the extensions associated with the tag, e.g. "Khronos".
180    pub author: String,
181    /// Contact information for the extension author(s).
182    pub contact: String,
183}
184
185pub type Types = CommentedChildren<TypesChild>;
186
187/// An item making up a type definition.
188#[derive(Debug, Clone, PartialEq, Eq)]
189#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
190#[non_exhaustive]
191pub enum TypesChild {
192    Type(Type),
193    Comment(String),
194}
195
196#[derive(Debug, Clone, PartialEq, Eq, Default)]
197#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
198#[non_exhaustive]
199pub struct Type {
200    #[cfg_attr(
201        feature = "serialize",
202        serde(default, skip_serializing_if = "is_default")
203    )]
204    pub name: Option<String>,
205
206    #[cfg_attr(
207        feature = "serialize",
208        serde(default, skip_serializing_if = "is_default")
209    )]
210    pub alias: Option<String>,
211
212    #[cfg_attr(
213        feature = "serialize",
214        serde(default, skip_serializing_if = "is_default")
215    )]
216    pub api: Option<String>,
217
218    #[cfg_attr(
219        feature = "serialize",
220        serde(default, skip_serializing_if = "is_default")
221    )]
222    pub requires: Option<String>,
223
224    #[cfg_attr(
225        feature = "serialize",
226        serde(default, skip_serializing_if = "is_default")
227    )]
228    pub category: Option<String>,
229
230    #[cfg_attr(
231        feature = "serialize",
232        serde(default, skip_serializing_if = "is_default")
233    )]
234    pub comment: Option<String>,
235
236    #[cfg_attr(
237        feature = "serialize",
238        serde(default, skip_serializing_if = "is_default")
239    )]
240    pub parent: Option<String>,
241
242    #[cfg_attr(
243        feature = "serialize",
244        serde(default, skip_serializing_if = "is_default")
245    )]
246    pub returnedonly: Option<String>,
247
248    #[cfg_attr(
249        feature = "serialize",
250        serde(default, skip_serializing_if = "is_default")
251    )]
252    pub structextends: Option<String>,
253
254    #[cfg_attr(
255        feature = "serialize",
256        serde(default, skip_serializing_if = "is_default")
257    )]
258    pub allowduplicate: Option<String>,
259
260    #[cfg_attr(
261        feature = "serialize",
262        serde(default, skip_serializing_if = "is_default")
263    )]
264    pub objtypeenum: Option<String>,
265
266    #[cfg_attr(
267        feature = "serialize",
268        serde(default, skip_serializing_if = "is_default")
269    )]
270    pub requiredlimittype: Option<String>,
271
272    #[cfg_attr(
273        feature = "serialize",
274        serde(default, skip_serializing_if = "is_default")
275    )]
276    pub bitvalues: Option<String>,
277
278    #[cfg_attr(
279        feature = "serialize",
280        serde(default, skip_serializing_if = "is_default")
281    )]
282    pub spec: TypeSpec,
283
284    #[cfg_attr(
285        feature = "serialize",
286        serde(default, skip_serializing_if = "is_default")
287    )]
288    pub deprecated: Option<String>,
289}
290
291/// The contents of a type definition.
292#[derive(Debug, Clone, PartialEq, Eq)]
293#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
294#[non_exhaustive]
295pub enum TypeSpec {
296    None,
297    Code(TypeCode),
298    Members(Vec<TypeMember>),
299    Funcpointer(FuncpointerCode),
300}
301
302impl Default for TypeSpec {
303    fn default() -> Self {
304        TypeSpec::None
305    }
306}
307
308#[derive(Debug, Clone, PartialEq, Eq, Default)]
309#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
310#[non_exhaustive]
311pub struct TypeCode {
312    pub code: String,
313
314    #[cfg_attr(
315        feature = "serialize",
316        serde(default, skip_serializing_if = "is_default")
317    )]
318    pub markup: Vec<TypeCodeMarkup>,
319}
320
321#[derive(Debug, Clone, PartialEq, Eq)]
322#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
323#[non_exhaustive]
324pub enum TypeCodeMarkup {
325    Name(String),
326    Type(String),
327    ApiEntry(String),
328}
329
330#[derive(Debug, Clone, PartialEq, Eq, Default)]
331#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
332#[non_exhaustive]
333pub struct FuncpointerCode {
334    // Compatibility with pre-1.4.339
335    pub code: String,
336
337    // Compatibility with pre-1.4.339
338    #[cfg_attr(
339        feature = "serialize",
340        serde(default, skip_serializing_if = "is_default")
341    )]
342    pub markup: Vec<TypeCodeMarkup>,
343
344    pub proto: FuncpointerProtoMarkup,
345
346    #[cfg_attr(
347        feature = "serialize",
348        serde(default, skip_serializing_if = "is_default")
349    )]
350    pub params: Vec<FuncpointerParamMarkup>,
351}
352
353pub type FuncpointerProtoMarkup = NameWithType;
354
355// According to schema, `param` can have a bunch of attributes not present on
356// proto. However, in current version of the xml, those are not used, so parsing
357// both into same type. User code should use these aliases to ensure
358// compatibility when they need to become distinct types. At that point, it might
359// become the same thing as CommandParam.
360pub type FuncpointerParamMarkup = NameWithType;
361
362/// A member of a type definition, i.e. a struct member.
363#[derive(Debug, Clone, PartialEq, Eq)]
364#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
365#[non_exhaustive]
366pub enum TypeMember {
367    /// Human-readable comment.
368    Comment(String),
369
370    /// A structure field definition.
371    Definition(TypeMemberDefinition),
372}
373
374#[derive(Debug, Clone, PartialEq, Eq, Default)]
375#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
376#[non_exhaustive]
377pub struct TypeMemberDefinition {
378    #[cfg_attr(
379        feature = "serialize",
380        serde(default, skip_serializing_if = "is_default")
381    )]
382    pub len: Option<String>,
383
384    #[cfg_attr(
385        feature = "serialize",
386        serde(default, skip_serializing_if = "is_default")
387    )]
388    pub altlen: Option<String>,
389
390    #[cfg_attr(
391        feature = "serialize",
392        serde(default, skip_serializing_if = "is_default")
393    )]
394    pub externsync: Option<String>,
395
396    #[cfg_attr(
397        feature = "serialize",
398        serde(default, skip_serializing_if = "is_default")
399    )]
400    pub optional: Option<String>,
401
402    #[cfg_attr(
403        feature = "serialize",
404        serde(default, skip_serializing_if = "is_default")
405    )]
406    pub selector: Option<String>,
407
408    #[cfg_attr(
409        feature = "serialize",
410        serde(default, skip_serializing_if = "is_default")
411    )]
412    pub selection: Option<String>,
413
414    #[cfg_attr(
415        feature = "serialize",
416        serde(default, skip_serializing_if = "is_default")
417    )]
418    pub noautovalidity: Option<String>,
419
420    #[cfg_attr(
421        feature = "serialize",
422        serde(default, skip_serializing_if = "is_default")
423    )]
424    pub validextensionstructs: Option<String>,
425
426    #[cfg_attr(
427        feature = "serialize",
428        serde(default, skip_serializing_if = "is_default")
429    )]
430    pub values: Option<String>,
431
432    #[cfg_attr(
433        feature = "serialize",
434        serde(default, skip_serializing_if = "is_default")
435    )]
436    pub limittype: Option<String>,
437
438    #[cfg_attr(
439        feature = "serialize",
440        serde(default, skip_serializing_if = "is_default")
441    )]
442    pub objecttype: Option<String>,
443
444    #[cfg_attr(
445        feature = "serialize",
446        serde(default, skip_serializing_if = "is_default")
447    )]
448    pub deprecated: Option<String>,
449
450    #[cfg_attr(
451        feature = "serialize",
452        serde(default, skip_serializing_if = "is_default")
453    )]
454    pub api: Option<String>,
455
456    #[cfg_attr(
457        feature = "serialize",
458        serde(default, skip_serializing_if = "is_default")
459    )]
460    pub code: String,
461
462    #[cfg_attr(
463        feature = "serialize",
464        serde(default, skip_serializing_if = "is_default")
465    )]
466    pub markup: Vec<TypeMemberMarkup>,
467
468    #[cfg_attr(
469        feature = "serialize",
470        serde(default, skip_serializing_if = "is_default")
471    )]
472    pub featurelink: Option<String>,
473}
474
475#[derive(Debug, Clone, PartialEq, Eq)]
476#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
477#[non_exhaustive]
478pub enum TypeMemberMarkup {
479    Name(String),
480    Type(String),
481    Enum(String),
482    Comment(String),
483}
484
485#[derive(Debug, Clone, PartialEq, Eq, Default)]
486#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
487#[non_exhaustive]
488pub struct Enums {
489    #[cfg_attr(
490        feature = "serialize",
491        serde(default, skip_serializing_if = "is_default")
492    )]
493    pub name: Option<String>,
494
495    #[cfg_attr(
496        feature = "serialize",
497        serde(default, skip_serializing_if = "is_default")
498    )]
499    pub kind: Option<String>,
500
501    #[cfg_attr(
502        feature = "serialize",
503        serde(default, skip_serializing_if = "is_default")
504    )]
505    pub start: Option<i64>,
506
507    #[cfg_attr(
508        feature = "serialize",
509        serde(default, skip_serializing_if = "is_default")
510    )]
511    pub end: Option<i64>,
512
513    #[cfg_attr(
514        feature = "serialize",
515        serde(default, skip_serializing_if = "is_default")
516    )]
517    pub vendor: Option<String>,
518
519    #[cfg_attr(
520        feature = "serialize",
521        serde(default, skip_serializing_if = "is_default")
522    )]
523    pub comment: Option<String>,
524
525    #[cfg_attr(
526        feature = "serialize",
527        serde(default, skip_serializing_if = "is_default")
528    )]
529    pub children: Vec<EnumsChild>,
530
531    #[cfg_attr(
532        feature = "serialize",
533        serde(default, skip_serializing_if = "is_default")
534    )]
535    pub bitwidth: Option<u32>,
536}
537
538/// An item which forms an enum.
539#[derive(Debug, Clone, PartialEq, Eq)]
540#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
541#[non_exhaustive]
542pub enum EnumsChild {
543    /// Actual named enum.
544    Enum(Enum),
545
546    /// An unused range of enum values.
547    Unused(Unused),
548
549    /// Human-readable comment.
550    Comment(String),
551}
552
553/// An unused range of enum values.
554#[derive(Debug, Clone, PartialEq, Eq, Default)]
555#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
556#[non_exhaustive]
557pub struct Unused {
558    /// Beginning of the range.
559    pub start: i64,
560
561    /// Ending value of the range, if any.
562    #[cfg_attr(
563        feature = "serialize",
564        serde(default, skip_serializing_if = "is_default")
565    )]
566    pub end: Option<i64>,
567
568    /// Vendor who reserved this range.
569    #[cfg_attr(
570        feature = "serialize",
571        serde(default, skip_serializing_if = "is_default")
572    )]
573    pub vendor: Option<String>,
574
575    /// Human-readable description.
576    #[cfg_attr(
577        feature = "serialize",
578        serde(default, skip_serializing_if = "is_default")
579    )]
580    pub comment: Option<String>,
581}
582
583/// An item of an enumeration type.
584#[derive(Debug, Clone, PartialEq, Eq, Default)]
585#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
586#[non_exhaustive]
587pub struct Enum {
588    /// Name of this enum.
589    pub name: String,
590
591    /// Human-readable description.
592    #[cfg_attr(
593        feature = "serialize",
594        serde(default, skip_serializing_if = "is_default")
595    )]
596    pub comment: Option<String>,
597
598    #[cfg_attr(
599        feature = "serialize",
600        serde(default, skip_serializing_if = "is_default")
601    )]
602    pub type_suffix: Option<String>,
603
604    #[cfg_attr(
605        feature = "serialize",
606        serde(default, skip_serializing_if = "is_default")
607    )]
608    pub api: Option<String>,
609
610    #[cfg_attr(
611        feature = "serialize",
612        serde(default, skip_serializing_if = "is_default")
613    )]
614    pub protect: Option<String>,
615
616    #[cfg_attr(
617        feature = "serialize",
618        serde(default, skip_serializing_if = "is_default")
619    )]
620    pub deprecated: Option<String>,
621
622    #[cfg_attr(
623        feature = "serialize",
624        serde(default, skip_serializing_if = "is_default")
625    )]
626    pub spec: EnumSpec,
627}
628
629/// An enum specifier, which assigns a value to the enum.
630#[derive(Debug, Clone, PartialEq, Eq)]
631#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
632#[non_exhaustive]
633pub enum EnumSpec {
634    None,
635
636    Alias {
637        alias: String,
638
639        #[cfg_attr(
640            feature = "serialize",
641            serde(default, skip_serializing_if = "is_default")
642        )]
643        extends: Option<String>,
644    },
645
646    Offset {
647        offset: i64,
648
649        #[cfg_attr(
650            feature = "serialize",
651            serde(default, skip_serializing_if = "is_default")
652        )]
653        extends: String,
654
655        #[cfg_attr(
656            feature = "serialize",
657            serde(default, skip_serializing_if = "is_default")
658        )]
659        extnumber: Option<i64>,
660
661        #[cfg_attr(
662            feature = "serialize",
663            serde(default, skip_serializing_if = "is_default")
664        )]
665        dir: bool,
666    },
667
668    /// Indicates an enum which is a bit flag.
669    Bitpos {
670        /// The bit to be set.
671        bitpos: i64,
672
673        /// Which structure this enum extends.
674        #[cfg_attr(
675            feature = "serialize",
676            serde(default, skip_serializing_if = "is_default")
677        )]
678        extends: Option<String>,
679    },
680
681    /// An enum value.
682    Value {
683        /// Hard coded value for an enum.
684        value: String, // rnc says this is an Integer, but validates it as text, and that's what it sometimes really is.
685
686        /// Which structure this enum extends.
687        #[cfg_attr(
688            feature = "serialize",
689            serde(default, skip_serializing_if = "is_default")
690        )]
691        extends: Option<String>,
692    },
693}
694
695impl Default for EnumSpec {
696    fn default() -> Self {
697        EnumSpec::None
698    }
699}
700
701pub type Commands = CommentedChildren<Command>;
702
703/// A command is just a Vulkan function.
704#[derive(Debug, Clone, PartialEq, Eq)]
705#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
706#[non_exhaustive]
707pub enum Command {
708    /// Indicates this function is an alias for another one.
709    Alias { name: String, alias: String },
710
711    /// Defines a new Vulkan function.
712    Definition(CommandDefinition),
713}
714
715#[derive(Debug, Clone, PartialEq, Eq, Default)]
716#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
717#[non_exhaustive]
718pub struct CommandDefinition {
719    #[cfg_attr(
720        feature = "serialize",
721        serde(default, skip_serializing_if = "is_default")
722    )]
723    pub tasks: Option<String>,
724
725    #[cfg_attr(
726        feature = "serialize",
727        serde(default, skip_serializing_if = "is_default")
728    )]
729    pub queues: Option<String>,
730
731    #[cfg_attr(
732        feature = "serialize",
733        serde(default, skip_serializing_if = "is_default")
734    )]
735    pub successcodes: Option<String>,
736
737    #[cfg_attr(
738        feature = "serialize",
739        serde(default, skip_serializing_if = "is_default")
740    )]
741    pub errorcodes: Option<String>,
742
743    #[cfg_attr(
744        feature = "serialize",
745        serde(default, skip_serializing_if = "is_default")
746    )]
747    pub renderpass: Option<String>,
748
749    #[cfg_attr(
750        feature = "serialize",
751        serde(default, skip_serializing_if = "is_default")
752    )]
753    pub videocoding: Option<String>,
754
755    #[cfg_attr(
756        feature = "serialize",
757        serde(default, skip_serializing_if = "is_default")
758    )]
759    pub conditionalrendering: Option<bool>,
760
761    #[cfg_attr(
762        feature = "serialize",
763        serde(default, skip_serializing_if = "is_default")
764    )]
765    pub cmdbufferlevel: Option<String>,
766
767    #[cfg_attr(
768        feature = "serialize",
769        serde(default, skip_serializing_if = "is_default")
770    )]
771    pub allownoqueues: Option<String>,
772
773    #[cfg_attr(
774        feature = "serialize",
775        serde(default, skip_serializing_if = "is_default")
776    )]
777    pub pipeline: Option<String>,
778
779    #[cfg_attr(
780        feature = "serialize",
781        serde(default, skip_serializing_if = "is_default")
782    )]
783    pub comment: Option<String>,
784
785    #[cfg_attr(
786        feature = "serialize",
787        serde(default, skip_serializing_if = "is_default")
788    )]
789    pub proto: NameWithType,
790
791    #[cfg_attr(
792        feature = "serialize",
793        serde(default, skip_serializing_if = "is_default")
794    )]
795    pub params: Vec<CommandParam>,
796
797    #[cfg_attr(
798        feature = "serialize",
799        serde(default, skip_serializing_if = "is_default")
800    )]
801    pub alias: Option<String>,
802
803    #[cfg_attr(
804        feature = "serialize",
805        serde(default, skip_serializing_if = "is_default")
806    )]
807    pub description: Option<String>,
808
809    #[cfg_attr(
810        feature = "serialize",
811        serde(default, skip_serializing_if = "is_default")
812    )]
813    pub implicitexternsyncparams: Vec<String>,
814
815    #[cfg_attr(
816        feature = "serialize",
817        serde(default, skip_serializing_if = "is_default")
818    )]
819    pub api: Option<String>,
820
821    #[cfg_attr(
822        feature = "serialize",
823        serde(default, skip_serializing_if = "is_default")
824    )]
825    pub export: Option<String>,
826
827    #[cfg_attr(
828        feature = "serialize",
829        serde(default, skip_serializing_if = "is_default")
830    )]
831    pub code: String,
832}
833
834/// Parameter for this Vulkan function.
835#[derive(Debug, Clone, PartialEq, Eq, Default)]
836#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
837#[non_exhaustive]
838pub struct CommandParam {
839    /// The expression which indicates the length of this array.
840    #[cfg_attr(
841        feature = "serialize",
842        serde(default, skip_serializing_if = "is_default")
843    )]
844    pub len: Option<String>,
845
846    /// Alternate description of the length of this parameter.
847    #[cfg_attr(
848        feature = "serialize",
849        serde(default, skip_serializing_if = "is_default")
850    )]
851    pub altlen: Option<String>,
852
853    /// Whether this parameter must be externally synchronised by the app.
854    #[cfg_attr(
855        feature = "serialize",
856        serde(default, skip_serializing_if = "is_default")
857    )]
858    pub externsync: Option<String>,
859
860    /// Whether this parameter must have a non-null value.
861    #[cfg_attr(
862        feature = "serialize",
863        serde(default, skip_serializing_if = "is_default")
864    )]
865    pub optional: Option<String>,
866
867    /// Disables automatic validity language being generated for this item.
868    #[cfg_attr(
869        feature = "serialize",
870        serde(default, skip_serializing_if = "is_default")
871    )]
872    pub noautovalidity: Option<String>,
873
874    #[cfg_attr(
875        feature = "serialize",
876        serde(default, skip_serializing_if = "is_default")
877    )]
878    pub objecttype: Option<String>,
879
880    /// The definition of this parameter.
881    #[cfg_attr(
882        feature = "serialize",
883        serde(default, skip_serializing_if = "is_default")
884    )]
885    pub definition: NameWithType,
886
887    /// only applicable for parameters which are pointers to `VkBaseInStructure` or
888    /// `VkBaseOutStructure` types, used as abstract placeholders. Specifies a list of structures
889    /// which may be passed in place of the parameter, or anywhere in the `pNext` chain of the
890    /// parameter.
891    #[cfg_attr(
892        feature = "serialize",
893        serde(default, skip_serializing_if = "is_default")
894    )]
895    pub validstructs: Vec<String>,
896
897    #[cfg_attr(
898        feature = "serialize",
899        serde(default, skip_serializing_if = "is_default")
900    )]
901    pub stride: Option<String>,
902
903    #[cfg_attr(
904        feature = "serialize",
905        serde(default, skip_serializing_if = "is_default")
906    )]
907    pub api: Option<String>,
908}
909
910#[derive(Debug, Clone, PartialEq, Eq, Default)]
911#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
912#[non_exhaustive]
913pub struct Feature {
914    #[cfg_attr(
915        feature = "serialize",
916        serde(default, skip_serializing_if = "is_default")
917    )]
918    pub api: String,
919
920    #[cfg_attr(
921        feature = "serialize",
922        serde(default, skip_serializing_if = "is_default")
923    )]
924    pub apitype: Option<String>,
925
926    #[cfg_attr(
927        feature = "serialize",
928        serde(default, skip_serializing_if = "is_default")
929    )]
930    pub name: String,
931
932    #[cfg_attr(
933        feature = "serialize",
934        serde(default, skip_serializing_if = "is_default")
935    )]
936    pub number: Option<String>,
937
938    #[cfg_attr(
939        feature = "serialize",
940        serde(default, skip_serializing_if = "is_default")
941    )]
942    pub depends: Option<String>,
943
944    #[cfg_attr(
945        feature = "serialize",
946        serde(default, skip_serializing_if = "is_default")
947    )]
948    pub protect: Option<String>,
949
950    #[cfg_attr(
951        feature = "serialize",
952        serde(default, skip_serializing_if = "is_default")
953    )]
954    pub comment: Option<String>,
955
956    #[cfg_attr(
957        feature = "serialize",
958        serde(default, skip_serializing_if = "is_default")
959    )]
960    pub children: Vec<FeatureChild>,
961}
962
963pub type FeatureChild = ExtensionChild;
964
965pub type Extensions = CommentedChildren<Extension>;
966
967#[derive(Debug, Clone, PartialEq, Eq, Default)]
968#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
969#[non_exhaustive]
970pub struct Extension {
971    /// Name of the extension.
972    pub name: String,
973
974    /// Human-readable description.
975    #[cfg_attr(
976        feature = "serialize",
977        serde(default, skip_serializing_if = "is_default")
978    )]
979    pub comment: Option<String>,
980
981    /// The unique index of this extension.
982    #[cfg_attr(
983        feature = "serialize",
984        serde(default, skip_serializing_if = "is_default")
985    )]
986    pub number: Option<i64>,
987
988    #[cfg_attr(
989        feature = "serialize",
990        serde(default, skip_serializing_if = "is_default")
991    )]
992    pub protect: Option<String>,
993
994    /// Which platform it works with, if any.
995    #[cfg_attr(
996        feature = "serialize",
997        serde(default, skip_serializing_if = "is_default")
998    )]
999    pub platform: Option<String>,
1000
1001    /// Tag name of the author.
1002    #[cfg_attr(
1003        feature = "serialize",
1004        serde(default, skip_serializing_if = "is_default")
1005    )]
1006    pub author: Option<String>,
1007
1008    /// Contact information for extension author(s).
1009    #[cfg_attr(
1010        feature = "serialize",
1011        serde(default, skip_serializing_if = "is_default")
1012    )]
1013    pub contact: Option<String>,
1014
1015    /// The level at which the extension applies (instance / device).
1016    #[cfg_attr(
1017        feature = "serialize",
1018        serde(default, skip_serializing_if = "is_default")
1019    )]
1020    pub ext_type: Option<String>,
1021
1022    #[cfg_attr(
1023        feature = "serialize",
1024        serde(default, skip_serializing_if = "is_default")
1025    )]
1026    pub requires: Option<String>,
1027
1028    #[cfg_attr(
1029        feature = "serialize",
1030        serde(default, skip_serializing_if = "is_default")
1031    )]
1032    pub requires_core: Option<String>,
1033
1034    #[cfg_attr(
1035        feature = "serialize",
1036        serde(default, skip_serializing_if = "is_default")
1037    )]
1038    pub supported: Option<String>, // mk:TODO StringGroup?
1039
1040    #[cfg_attr(
1041        feature = "serialize",
1042        serde(default, skip_serializing_if = "is_default")
1043    )]
1044    pub ratified: Option<String>,
1045
1046    #[cfg_attr(
1047        feature = "serialize",
1048        serde(default, skip_serializing_if = "is_default")
1049    )]
1050    pub deprecatedby: Option<String>,
1051
1052    /// Whether this extension was promoted to core, and in which version.
1053    #[cfg_attr(
1054        feature = "serialize",
1055        serde(default, skip_serializing_if = "is_default")
1056    )]
1057    pub promotedto: Option<String>,
1058
1059    #[cfg_attr(
1060        feature = "serialize",
1061        serde(default, skip_serializing_if = "is_default")
1062    )]
1063    pub obsoletedby: Option<String>,
1064
1065    /// 'true' if this extension is released provisionally
1066    #[cfg_attr(
1067        feature = "serialize",
1068        serde(default, skip_serializing_if = "is_default")
1069    )]
1070    pub provisional: bool,
1071
1072    /// The items which make up this extension.
1073    #[cfg_attr(
1074        feature = "serialize",
1075        serde(default, skip_serializing_if = "is_default")
1076    )]
1077    pub specialuse: Option<String>,
1078
1079    /// Relative sortorder
1080    #[cfg_attr(
1081        feature = "serialize",
1082        serde(default, skip_serializing_if = "is_default")
1083    )]
1084    pub sortorder: Option<i64>,
1085
1086    #[cfg_attr(
1087        feature = "serialize",
1088        serde(default, skip_serializing_if = "is_default")
1089    )]
1090    pub depends: Option<String>,
1091
1092    #[cfg_attr(
1093        feature = "serialize",
1094        serde(default, skip_serializing_if = "is_default")
1095    )]
1096    pub nofeatures: bool,
1097
1098    /// The items which make up this extension.
1099    #[cfg_attr(
1100        feature = "serialize",
1101        serde(default, skip_serializing_if = "is_default")
1102    )]
1103    pub children: Vec<ExtensionChild>,
1104}
1105
1106/// A part of an extension declaration.
1107///
1108/// Extensions either include functionality from the spec, or remove some functionality.
1109#[derive(Debug, Clone, PartialEq, Eq)]
1110#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1111#[non_exhaustive]
1112pub enum ExtensionChild {
1113    /// Indicates the items which this extension requires to work.
1114    Require {
1115        #[cfg_attr(
1116            feature = "serialize",
1117            serde(default, skip_serializing_if = "is_default")
1118        )]
1119        api: Option<String>,
1120
1121        #[cfg_attr(
1122            feature = "serialize",
1123            serde(default, skip_serializing_if = "is_default")
1124        )]
1125        profile: Option<String>,
1126
1127        /// The extension which provides these required items, if any.
1128        #[cfg_attr(
1129            feature = "serialize",
1130            serde(default, skip_serializing_if = "is_default")
1131        )]
1132        extension: Option<String>,
1133
1134        #[cfg_attr(
1135            feature = "serialize",
1136            serde(default, skip_serializing_if = "is_default")
1137        )]
1138        feature: Option<String>,
1139
1140        #[cfg_attr(
1141            feature = "serialize",
1142            serde(default, skip_serializing_if = "is_default")
1143        )]
1144        comment: Option<String>,
1145
1146        #[cfg_attr(
1147            feature = "serialize",
1148            serde(default, skip_serializing_if = "is_default")
1149        )]
1150        depends: Option<String>,
1151
1152        /// The items which form this require block.
1153        items: Vec<InterfaceItem>,
1154    },
1155
1156    Deprecate {
1157        #[cfg_attr(
1158            feature = "serialize",
1159            serde(default, skip_serializing_if = "is_default")
1160        )]
1161        api: Option<String>,
1162
1163        #[cfg_attr(
1164            feature = "serialize",
1165            serde(default, skip_serializing_if = "is_default")
1166        )]
1167        profile: Option<String>,
1168
1169        #[cfg_attr(
1170            feature = "serialize",
1171            serde(default, skip_serializing_if = "is_default")
1172        )]
1173        comment: Option<String>,
1174
1175        #[cfg_attr(
1176            feature = "serialize",
1177            serde(default, skip_serializing_if = "is_default")
1178        )]
1179        explanationlink: String,
1180
1181        items: Vec<InterfaceItem>,
1182    },
1183
1184    /// Indicates the items this extension removes.
1185    Remove {
1186        #[cfg_attr(
1187            feature = "serialize",
1188            serde(default, skip_serializing_if = "is_default")
1189        )]
1190        api: Option<String>,
1191
1192        #[cfg_attr(
1193            feature = "serialize",
1194            serde(default, skip_serializing_if = "is_default")
1195        )]
1196        profile: Option<String>,
1197
1198        #[cfg_attr(
1199            feature = "serialize",
1200            serde(default, skip_serializing_if = "is_default")
1201        )]
1202        comment: Option<String>,
1203
1204        #[cfg_attr(
1205            feature = "serialize",
1206            serde(default, skip_serializing_if = "is_default")
1207        )]
1208        reasonlink: Option<String>,
1209
1210        #[cfg_attr(
1211            feature = "serialize",
1212            serde(default, skip_serializing_if = "is_default")
1213        )]
1214        items: Vec<InterfaceItem>,
1215    },
1216}
1217
1218/// An interface item is a function or an enum which makes up a Vulkan interface.
1219///
1220/// This structure is used by extensions to express dependencies or include functionality.
1221#[derive(Debug, Clone, PartialEq, Eq)]
1222#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1223#[non_exhaustive]
1224pub enum InterfaceItem {
1225    Comment(String),
1226
1227    Type {
1228        name: String,
1229
1230        #[cfg_attr(
1231            feature = "serialize",
1232            serde(default, skip_serializing_if = "is_default")
1233        )]
1234        comment: Option<String>,
1235    },
1236
1237    Enum(Enum),
1238
1239    Command {
1240        name: String,
1241
1242        #[cfg_attr(
1243            feature = "serialize",
1244            serde(default, skip_serializing_if = "is_default")
1245        )]
1246        comment: Option<String>,
1247    },
1248
1249    Feature {
1250        name: String,
1251
1252        struct_: String,
1253
1254        #[cfg_attr(
1255            feature = "serialize",
1256            serde(default, skip_serializing_if = "is_default")
1257        )]
1258        comment: Option<String>,
1259    },
1260}
1261
1262pub type Formats = CommentedChildren<Format>;
1263
1264#[derive(Debug, Clone, PartialEq, Eq, Default)]
1265#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1266#[non_exhaustive]
1267pub struct Format {
1268    pub name: String,
1269    pub class: String,
1270    pub blockSize: u8,
1271    pub texelsPerBlock: u8,
1272
1273    #[cfg_attr(
1274        feature = "serialize",
1275        serde(default, skip_serializing_if = "is_default")
1276    )]
1277    pub blockExtent: Option<String>,
1278
1279    #[cfg_attr(
1280        feature = "serialize",
1281        serde(default, skip_serializing_if = "is_default")
1282    )]
1283    pub packed: Option<u8>,
1284
1285    #[cfg_attr(
1286        feature = "serialize",
1287        serde(default, skip_serializing_if = "is_default")
1288    )]
1289    pub compressed: Option<String>,
1290
1291    #[cfg_attr(
1292        feature = "serialize",
1293        serde(default, skip_serializing_if = "is_default")
1294    )]
1295    pub chroma: Option<String>,
1296
1297    pub children: Vec<FormatChild>,
1298}
1299
1300#[derive(Debug, Clone, PartialEq, Eq)]
1301#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1302#[non_exhaustive]
1303pub enum FormatChild {
1304    #[non_exhaustive]
1305    Component {
1306        name: String,
1307        bits: String,
1308        numericFormat: String,
1309        #[cfg_attr(
1310            feature = "serialize",
1311            serde(default, skip_serializing_if = "is_default")
1312        )]
1313        planeIndex: Option<u8>,
1314    },
1315
1316    #[non_exhaustive]
1317    Plane {
1318        index: u8,
1319        widthDivisor: u8,
1320        heightDivisor: u8,
1321        compatible: String,
1322    },
1323
1324    #[non_exhaustive]
1325    SpirvImageFormat { name: String },
1326}
1327
1328#[derive(Debug, Clone, PartialEq, Eq, Default)]
1329#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1330#[non_exhaustive]
1331pub struct NameWithType {
1332    #[cfg_attr(
1333        feature = "serialize",
1334        serde(default, skip_serializing_if = "is_default")
1335    )]
1336    pub type_name: Option<String>,
1337
1338    #[cfg_attr(
1339        feature = "serialize",
1340        serde(default, skip_serializing_if = "is_default")
1341    )]
1342    pub name: String,
1343
1344    #[cfg_attr(
1345        feature = "serialize",
1346        serde(default, skip_serializing_if = "is_default")
1347    )]
1348    pub code: String,
1349}
1350
1351#[derive(Debug, Clone, PartialEq, Eq, Default)]
1352#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1353#[non_exhaustive]
1354pub struct CommentedChildren<T> {
1355    #[cfg_attr(
1356        feature = "serialize",
1357        serde(default, skip_serializing_if = "is_default")
1358    )]
1359    pub comment: Option<String>,
1360
1361    pub children: Vec<T>,
1362}
1363
1364#[derive(Debug, Clone, PartialEq, Eq, Default)]
1365#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1366#[non_exhaustive]
1367pub struct SpirvExtOrCap {
1368    #[cfg_attr(
1369        feature = "serialize",
1370        serde(default, skip_serializing_if = "is_default")
1371    )]
1372    pub name: String,
1373
1374    #[cfg_attr(
1375        feature = "serialize",
1376        serde(default, skip_serializing_if = "is_default")
1377    )]
1378    pub enables: Vec<Enable>,
1379}
1380
1381pub type SpirvExtension = SpirvExtOrCap;
1382pub type SpirvExtensions = CommentedChildren<SpirvExtension>;
1383
1384pub type SpirvCapability = SpirvExtOrCap;
1385pub type SpirvCapabilities = CommentedChildren<SpirvCapability>;
1386
1387#[derive(Debug, Clone, PartialEq, Eq)]
1388#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1389#[non_exhaustive]
1390pub enum SyncChild {
1391    Stage(SyncStage),
1392    Access(SyncAccess),
1393    Pipeline(SyncPipeline),
1394}
1395
1396pub type Sync = CommentedChildren<SyncChild>;
1397
1398#[derive(Debug, Clone, PartialEq, Eq, Default)]
1399#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1400#[non_exhaustive]
1401pub struct SyncSupport {
1402    pub queues: Option<String>,
1403    pub stage: Option<String>,
1404}
1405
1406#[derive(Debug, Clone, PartialEq, Eq, Default)]
1407#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1408#[non_exhaustive]
1409pub struct SyncEquivalent {
1410    pub stage: Option<String>,
1411    pub access: Option<String>,
1412}
1413
1414#[derive(Debug, Clone, PartialEq, Eq, Default)]
1415#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1416#[non_exhaustive]
1417pub struct SyncStage {
1418    pub name: String,
1419    pub alias: Option<String>,
1420    pub syncsupport: Option<SyncSupport>,
1421    pub syncequivalent: Option<SyncEquivalent>,
1422}
1423
1424#[derive(Debug, Clone, PartialEq, Eq, Default)]
1425#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1426#[non_exhaustive]
1427pub struct SyncAccess {
1428    pub name: String,
1429    pub alias: Option<String>,
1430    pub comment: Option<String>,
1431    pub syncsupport: Option<SyncSupport>,
1432    pub syncequivalent: Option<SyncEquivalent>,
1433}
1434
1435#[derive(Debug, Clone, PartialEq, Eq, Default)]
1436#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1437#[non_exhaustive]
1438pub struct SyncPipeline {
1439    pub name: String,
1440    pub depends: Option<String>,
1441    pub children: Vec<SyncPipelineStage>,
1442}
1443
1444#[derive(Debug, Clone, PartialEq, Eq, Default)]
1445#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1446#[non_exhaustive]
1447pub struct SyncPipelineStage {
1448    pub order: Option<String>,
1449    pub before: Option<String>,
1450    pub after: Option<String>,
1451    pub text: String,
1452}
1453
1454pub type VideoCodecs = CommentedChildren<VideoCodec>;
1455
1456#[derive(Debug, Clone, PartialEq, Eq, Default)]
1457#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1458#[non_exhaustive]
1459pub struct VideoCodec {
1460    pub comment: Option<String>,
1461    pub name: String,
1462    pub extend: Option<String>,
1463    pub value: Option<String>,
1464    pub children: Vec<VideoCodecChild>,
1465}
1466
1467#[derive(Debug, Clone, PartialEq, Eq)]
1468#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1469#[non_exhaustive]
1470pub enum VideoCodecChild {
1471    Profiles(VideoProfiles),
1472    Capabilities(VideoCapabilities),
1473    Format(VideoFormat),
1474}
1475
1476#[derive(Debug, Clone, PartialEq, Eq, Default)]
1477#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1478#[non_exhaustive]
1479pub struct VideoProfiles {
1480    pub comment: Option<String>,
1481    pub struct_: String,
1482    pub children: Vec<VideoProfileMember>,
1483}
1484
1485#[derive(Debug, Clone, PartialEq, Eq, Default)]
1486#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1487#[non_exhaustive]
1488pub struct VideoProfileMember {
1489    pub comment: Option<String>,
1490    pub name: String,
1491    pub children: Vec<VideoProfile>,
1492}
1493
1494#[derive(Debug, Clone, PartialEq, Eq, Default)]
1495#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1496#[non_exhaustive]
1497pub struct VideoProfile {
1498    pub comment: Option<String>,
1499    pub name: String,
1500    pub value: String,
1501}
1502
1503#[derive(Debug, Clone, PartialEq, Eq, Default)]
1504#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1505#[non_exhaustive]
1506pub struct VideoCapabilities {
1507    pub comment: Option<String>,
1508    pub struct_: String,
1509}
1510
1511#[derive(Debug, Clone, PartialEq, Eq, Default)]
1512#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1513#[non_exhaustive]
1514pub struct VideoFormat {
1515    pub comment: Option<String>,
1516    pub name: Option<String>,
1517    pub usage: Option<String>,
1518    pub extend: Option<String>,
1519    pub children: Vec<VideoFormatChild>,
1520}
1521
1522#[derive(Debug, Clone, PartialEq, Eq)]
1523#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1524#[non_exhaustive]
1525pub enum VideoFormatChild {
1526    RequireCapabilities(VideoRequireCapabilities),
1527    FormatProperties(VideoFormatProperties),
1528}
1529
1530#[derive(Debug, Clone, PartialEq, Eq, Default)]
1531#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1532#[non_exhaustive]
1533pub struct VideoFormatProperties {
1534    pub comment: Option<String>,
1535    pub struct_: String,
1536}
1537
1538#[derive(Debug, Clone, PartialEq, Eq, Default)]
1539#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1540#[non_exhaustive]
1541pub struct VideoRequireCapabilities {
1542    pub comment: Option<String>,
1543    pub struct_: String,
1544    pub member: String,
1545    pub value: String,
1546}
1547
1548#[derive(Debug, Clone, PartialEq, Eq)]
1549#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1550#[non_exhaustive]
1551pub enum Enable {
1552    Version(String),
1553    Extension(String),
1554    Feature(FeatureEnable),
1555    Property(PropertyEnable),
1556}
1557
1558#[derive(Debug, Clone, PartialEq, Eq, Default)]
1559#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1560#[non_exhaustive]
1561pub struct FeatureEnable {
1562    #[cfg_attr(
1563        feature = "serialize",
1564        serde(default, skip_serializing_if = "is_default")
1565    )]
1566    pub struct_: String,
1567
1568    #[cfg_attr(
1569        feature = "serialize",
1570        serde(default, skip_serializing_if = "is_default")
1571    )]
1572    pub feature: String,
1573
1574    #[cfg_attr(
1575        feature = "serialize",
1576        serde(default, skip_serializing_if = "is_default")
1577    )]
1578    pub requires: Option<String>,
1579
1580    #[cfg_attr(
1581        feature = "serialize",
1582        serde(default, skip_serializing_if = "is_default")
1583    )]
1584    pub alias: Option<String>,
1585}
1586
1587#[derive(Debug, Clone, PartialEq, Eq, Default)]
1588#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1589#[non_exhaustive]
1590pub struct PropertyEnable {
1591    #[cfg_attr(
1592        feature = "serialize",
1593        serde(default, skip_serializing_if = "is_default")
1594    )]
1595    pub property: String,
1596
1597    #[cfg_attr(
1598        feature = "serialize",
1599        serde(default, skip_serializing_if = "is_default")
1600    )]
1601    pub member: String,
1602
1603    #[cfg_attr(
1604        feature = "serialize",
1605        serde(default, skip_serializing_if = "is_default")
1606    )]
1607    pub value: String,
1608
1609    #[cfg_attr(
1610        feature = "serialize",
1611        serde(default, skip_serializing_if = "is_default")
1612    )]
1613    pub requires: Option<String>,
1614}
1615
1616#[cfg(feature = "serialize")]
1617fn is_default<T: Default + Eq>(v: &T) -> bool {
1618    v.eq(&T::default())
1619}