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}
300
301impl Default for TypeSpec {
302    fn default() -> Self {
303        TypeSpec::None
304    }
305}
306
307#[derive(Debug, Clone, PartialEq, Eq, Default)]
308#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
309#[non_exhaustive]
310pub struct TypeCode {
311    pub code: String,
312
313    #[cfg_attr(
314        feature = "serialize",
315        serde(default, skip_serializing_if = "is_default")
316    )]
317    pub markup: Vec<TypeCodeMarkup>,
318}
319
320#[derive(Debug, Clone, PartialEq, Eq)]
321#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
322#[non_exhaustive]
323pub enum TypeCodeMarkup {
324    Name(String),
325    Type(String),
326    ApiEntry(String),
327}
328
329/// A member of a type definition, i.e. a struct member.
330#[derive(Debug, Clone, PartialEq, Eq)]
331#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
332#[non_exhaustive]
333pub enum TypeMember {
334    /// Human-readable comment.
335    Comment(String),
336
337    /// A structure field definition.
338    Definition(TypeMemberDefinition),
339}
340
341#[derive(Debug, Clone, PartialEq, Eq, Default)]
342#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
343#[non_exhaustive]
344pub struct TypeMemberDefinition {
345    #[cfg_attr(
346        feature = "serialize",
347        serde(default, skip_serializing_if = "is_default")
348    )]
349    pub len: Option<String>,
350
351    #[cfg_attr(
352        feature = "serialize",
353        serde(default, skip_serializing_if = "is_default")
354    )]
355    pub altlen: Option<String>,
356
357    #[cfg_attr(
358        feature = "serialize",
359        serde(default, skip_serializing_if = "is_default")
360    )]
361    pub externsync: Option<String>,
362
363    #[cfg_attr(
364        feature = "serialize",
365        serde(default, skip_serializing_if = "is_default")
366    )]
367    pub optional: Option<String>,
368
369    #[cfg_attr(
370        feature = "serialize",
371        serde(default, skip_serializing_if = "is_default")
372    )]
373    pub selector: Option<String>,
374
375    #[cfg_attr(
376        feature = "serialize",
377        serde(default, skip_serializing_if = "is_default")
378    )]
379    pub selection: Option<String>,
380
381    #[cfg_attr(
382        feature = "serialize",
383        serde(default, skip_serializing_if = "is_default")
384    )]
385    pub noautovalidity: Option<String>,
386
387    #[cfg_attr(
388        feature = "serialize",
389        serde(default, skip_serializing_if = "is_default")
390    )]
391    pub validextensionstructs: Option<String>,
392
393    #[cfg_attr(
394        feature = "serialize",
395        serde(default, skip_serializing_if = "is_default")
396    )]
397    pub values: Option<String>,
398
399    #[cfg_attr(
400        feature = "serialize",
401        serde(default, skip_serializing_if = "is_default")
402    )]
403    pub limittype: Option<String>,
404
405    #[cfg_attr(
406        feature = "serialize",
407        serde(default, skip_serializing_if = "is_default")
408    )]
409    pub objecttype: Option<String>,
410
411    #[cfg_attr(
412        feature = "serialize",
413        serde(default, skip_serializing_if = "is_default")
414    )]
415    pub deprecated: Option<String>,
416
417    #[cfg_attr(
418        feature = "serialize",
419        serde(default, skip_serializing_if = "is_default")
420    )]
421    pub api: Option<String>,
422
423    #[cfg_attr(
424        feature = "serialize",
425        serde(default, skip_serializing_if = "is_default")
426    )]
427    pub code: String,
428
429    #[cfg_attr(
430        feature = "serialize",
431        serde(default, skip_serializing_if = "is_default")
432    )]
433    pub markup: Vec<TypeMemberMarkup>,
434
435    #[cfg_attr(
436        feature = "serialize",
437        serde(default, skip_serializing_if = "is_default")
438    )]
439    pub featurelink: Option<String>,
440}
441
442#[derive(Debug, Clone, PartialEq, Eq)]
443#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
444#[non_exhaustive]
445pub enum TypeMemberMarkup {
446    Name(String),
447    Type(String),
448    Enum(String),
449    Comment(String),
450}
451
452#[derive(Debug, Clone, PartialEq, Eq, Default)]
453#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
454#[non_exhaustive]
455pub struct Enums {
456    #[cfg_attr(
457        feature = "serialize",
458        serde(default, skip_serializing_if = "is_default")
459    )]
460    pub name: Option<String>,
461
462    #[cfg_attr(
463        feature = "serialize",
464        serde(default, skip_serializing_if = "is_default")
465    )]
466    pub kind: Option<String>,
467
468    #[cfg_attr(
469        feature = "serialize",
470        serde(default, skip_serializing_if = "is_default")
471    )]
472    pub start: Option<i64>,
473
474    #[cfg_attr(
475        feature = "serialize",
476        serde(default, skip_serializing_if = "is_default")
477    )]
478    pub end: Option<i64>,
479
480    #[cfg_attr(
481        feature = "serialize",
482        serde(default, skip_serializing_if = "is_default")
483    )]
484    pub vendor: Option<String>,
485
486    #[cfg_attr(
487        feature = "serialize",
488        serde(default, skip_serializing_if = "is_default")
489    )]
490    pub comment: Option<String>,
491
492    #[cfg_attr(
493        feature = "serialize",
494        serde(default, skip_serializing_if = "is_default")
495    )]
496    pub children: Vec<EnumsChild>,
497
498    #[cfg_attr(
499        feature = "serialize",
500        serde(default, skip_serializing_if = "is_default")
501    )]
502    pub bitwidth: Option<u32>,
503}
504
505/// An item which forms an enum.
506#[derive(Debug, Clone, PartialEq, Eq)]
507#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
508#[non_exhaustive]
509pub enum EnumsChild {
510    /// Actual named enum.
511    Enum(Enum),
512
513    /// An unused range of enum values.
514    Unused(Unused),
515
516    /// Human-readable comment.
517    Comment(String),
518}
519
520/// An unused range of enum values.
521#[derive(Debug, Clone, PartialEq, Eq, Default)]
522#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
523#[non_exhaustive]
524pub struct Unused {
525    /// Beginning of the range.
526    pub start: i64,
527
528    /// Ending value of the range, if any.
529    #[cfg_attr(
530        feature = "serialize",
531        serde(default, skip_serializing_if = "is_default")
532    )]
533    pub end: Option<i64>,
534
535    /// Vendor who reserved this range.
536    #[cfg_attr(
537        feature = "serialize",
538        serde(default, skip_serializing_if = "is_default")
539    )]
540    pub vendor: Option<String>,
541
542    /// Human-readable description.
543    #[cfg_attr(
544        feature = "serialize",
545        serde(default, skip_serializing_if = "is_default")
546    )]
547    pub comment: Option<String>,
548}
549
550/// An item of an enumeration type.
551#[derive(Debug, Clone, PartialEq, Eq, Default)]
552#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
553#[non_exhaustive]
554pub struct Enum {
555    /// Name of this enum.
556    pub name: String,
557
558    /// Human-readable description.
559    #[cfg_attr(
560        feature = "serialize",
561        serde(default, skip_serializing_if = "is_default")
562    )]
563    pub comment: Option<String>,
564
565    #[cfg_attr(
566        feature = "serialize",
567        serde(default, skip_serializing_if = "is_default")
568    )]
569    pub type_suffix: Option<String>,
570
571    #[cfg_attr(
572        feature = "serialize",
573        serde(default, skip_serializing_if = "is_default")
574    )]
575    pub api: Option<String>,
576
577    #[cfg_attr(
578        feature = "serialize",
579        serde(default, skip_serializing_if = "is_default")
580    )]
581    pub protect: Option<String>,
582
583    #[cfg_attr(
584        feature = "serialize",
585        serde(default, skip_serializing_if = "is_default")
586    )]
587    pub deprecated: Option<String>,
588
589    #[cfg_attr(
590        feature = "serialize",
591        serde(default, skip_serializing_if = "is_default")
592    )]
593    pub spec: EnumSpec,
594}
595
596/// An enum specifier, which assigns a value to the enum.
597#[derive(Debug, Clone, PartialEq, Eq)]
598#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
599#[non_exhaustive]
600pub enum EnumSpec {
601    None,
602
603    Alias {
604        alias: String,
605
606        #[cfg_attr(
607            feature = "serialize",
608            serde(default, skip_serializing_if = "is_default")
609        )]
610        extends: Option<String>,
611    },
612
613    Offset {
614        offset: i64,
615
616        #[cfg_attr(
617            feature = "serialize",
618            serde(default, skip_serializing_if = "is_default")
619        )]
620        extends: String,
621
622        #[cfg_attr(
623            feature = "serialize",
624            serde(default, skip_serializing_if = "is_default")
625        )]
626        extnumber: Option<i64>,
627
628        #[cfg_attr(
629            feature = "serialize",
630            serde(default, skip_serializing_if = "is_default")
631        )]
632        dir: bool,
633    },
634
635    /// Indicates an enum which is a bit flag.
636    Bitpos {
637        /// The bit to be set.
638        bitpos: i64,
639
640        /// Which structure this enum extends.
641        #[cfg_attr(
642            feature = "serialize",
643            serde(default, skip_serializing_if = "is_default")
644        )]
645        extends: Option<String>,
646    },
647
648    /// An enum value.
649    Value {
650        /// Hard coded value for an enum.
651        value: String, // rnc says this is an Integer, but validates it as text, and that's what it sometimes really is.
652
653        /// Which structure this enum extends.
654        #[cfg_attr(
655            feature = "serialize",
656            serde(default, skip_serializing_if = "is_default")
657        )]
658        extends: Option<String>,
659    },
660}
661
662impl Default for EnumSpec {
663    fn default() -> Self {
664        EnumSpec::None
665    }
666}
667
668pub type Commands = CommentedChildren<Command>;
669
670/// A command is just a Vulkan function.
671#[derive(Debug, Clone, PartialEq, Eq)]
672#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
673#[non_exhaustive]
674pub enum Command {
675    /// Indicates this function is an alias for another one.
676    Alias { name: String, alias: String },
677
678    /// Defines a new Vulkan function.
679    Definition(CommandDefinition),
680}
681
682#[derive(Debug, Clone, PartialEq, Eq, Default)]
683#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
684#[non_exhaustive]
685pub struct CommandDefinition {
686    #[cfg_attr(
687        feature = "serialize",
688        serde(default, skip_serializing_if = "is_default")
689    )]
690    pub tasks: Option<String>,
691
692    #[cfg_attr(
693        feature = "serialize",
694        serde(default, skip_serializing_if = "is_default")
695    )]
696    pub queues: Option<String>,
697
698    #[cfg_attr(
699        feature = "serialize",
700        serde(default, skip_serializing_if = "is_default")
701    )]
702    pub successcodes: Option<String>,
703
704    #[cfg_attr(
705        feature = "serialize",
706        serde(default, skip_serializing_if = "is_default")
707    )]
708    pub errorcodes: Option<String>,
709
710    #[cfg_attr(
711        feature = "serialize",
712        serde(default, skip_serializing_if = "is_default")
713    )]
714    pub renderpass: Option<String>,
715
716    #[cfg_attr(
717        feature = "serialize",
718        serde(default, skip_serializing_if = "is_default")
719    )]
720    pub videocoding: Option<String>,
721
722    #[cfg_attr(
723        feature = "serialize",
724        serde(default, skip_serializing_if = "is_default")
725    )]
726    pub conditionalrendering: Option<bool>,
727
728    #[cfg_attr(
729        feature = "serialize",
730        serde(default, skip_serializing_if = "is_default")
731    )]
732    pub cmdbufferlevel: Option<String>,
733
734    #[cfg_attr(
735        feature = "serialize",
736        serde(default, skip_serializing_if = "is_default")
737    )]
738    pub allownoqueues: Option<String>,
739
740    #[cfg_attr(
741        feature = "serialize",
742        serde(default, skip_serializing_if = "is_default")
743    )]
744    pub pipeline: Option<String>,
745
746    #[cfg_attr(
747        feature = "serialize",
748        serde(default, skip_serializing_if = "is_default")
749    )]
750    pub comment: Option<String>,
751
752    #[cfg_attr(
753        feature = "serialize",
754        serde(default, skip_serializing_if = "is_default")
755    )]
756    pub proto: NameWithType,
757
758    #[cfg_attr(
759        feature = "serialize",
760        serde(default, skip_serializing_if = "is_default")
761    )]
762    pub params: Vec<CommandParam>,
763
764    #[cfg_attr(
765        feature = "serialize",
766        serde(default, skip_serializing_if = "is_default")
767    )]
768    pub alias: Option<String>,
769
770    #[cfg_attr(
771        feature = "serialize",
772        serde(default, skip_serializing_if = "is_default")
773    )]
774    pub description: Option<String>,
775
776    #[cfg_attr(
777        feature = "serialize",
778        serde(default, skip_serializing_if = "is_default")
779    )]
780    pub implicitexternsyncparams: Vec<String>,
781
782    #[cfg_attr(
783        feature = "serialize",
784        serde(default, skip_serializing_if = "is_default")
785    )]
786    pub api: Option<String>,
787
788    #[cfg_attr(
789        feature = "serialize",
790        serde(default, skip_serializing_if = "is_default")
791    )]
792    pub export: Option<String>,
793
794    #[cfg_attr(
795        feature = "serialize",
796        serde(default, skip_serializing_if = "is_default")
797    )]
798    pub code: String,
799}
800
801/// Parameter for this Vulkan function.
802#[derive(Debug, Clone, PartialEq, Eq, Default)]
803#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
804#[non_exhaustive]
805pub struct CommandParam {
806    /// The expression which indicates the length of this array.
807    #[cfg_attr(
808        feature = "serialize",
809        serde(default, skip_serializing_if = "is_default")
810    )]
811    pub len: Option<String>,
812
813    /// Alternate description of the length of this parameter.
814    #[cfg_attr(
815        feature = "serialize",
816        serde(default, skip_serializing_if = "is_default")
817    )]
818    pub altlen: Option<String>,
819
820    /// Whether this parameter must be externally synchronised by the app.
821    #[cfg_attr(
822        feature = "serialize",
823        serde(default, skip_serializing_if = "is_default")
824    )]
825    pub externsync: Option<String>,
826
827    /// Whether this parameter must have a non-null value.
828    #[cfg_attr(
829        feature = "serialize",
830        serde(default, skip_serializing_if = "is_default")
831    )]
832    pub optional: Option<String>,
833
834    /// Disables automatic validity language being generated for this item.
835    #[cfg_attr(
836        feature = "serialize",
837        serde(default, skip_serializing_if = "is_default")
838    )]
839    pub noautovalidity: Option<String>,
840
841    #[cfg_attr(
842        feature = "serialize",
843        serde(default, skip_serializing_if = "is_default")
844    )]
845    pub objecttype: Option<String>,
846
847    /// The definition of this parameter.
848    #[cfg_attr(
849        feature = "serialize",
850        serde(default, skip_serializing_if = "is_default")
851    )]
852    pub definition: NameWithType,
853
854    /// only applicable for parameters which are pointers to `VkBaseInStructure` or
855    /// `VkBaseOutStructure` types, used as abstract placeholders. Specifies a list of structures
856    /// which may be passed in place of the parameter, or anywhere in the `pNext` chain of the
857    /// parameter.
858    #[cfg_attr(
859        feature = "serialize",
860        serde(default, skip_serializing_if = "is_default")
861    )]
862    pub validstructs: Vec<String>,
863
864    #[cfg_attr(
865        feature = "serialize",
866        serde(default, skip_serializing_if = "is_default")
867    )]
868    pub stride: Option<String>,
869
870    #[cfg_attr(
871        feature = "serialize",
872        serde(default, skip_serializing_if = "is_default")
873    )]
874    pub api: Option<String>,
875}
876
877#[derive(Debug, Clone, PartialEq, Eq, Default)]
878#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
879#[non_exhaustive]
880pub struct Feature {
881    #[cfg_attr(
882        feature = "serialize",
883        serde(default, skip_serializing_if = "is_default")
884    )]
885    pub api: String,
886
887    #[cfg_attr(
888        feature = "serialize",
889        serde(default, skip_serializing_if = "is_default")
890    )]
891    pub apitype: Option<String>,
892
893    #[cfg_attr(
894        feature = "serialize",
895        serde(default, skip_serializing_if = "is_default")
896    )]
897    pub name: String,
898
899    #[cfg_attr(
900        feature = "serialize",
901        serde(default, skip_serializing_if = "is_default")
902    )]
903    pub number: Option<String>,
904
905    #[cfg_attr(
906        feature = "serialize",
907        serde(default, skip_serializing_if = "is_default")
908    )]
909    pub depends: Option<String>,
910
911    #[cfg_attr(
912        feature = "serialize",
913        serde(default, skip_serializing_if = "is_default")
914    )]
915    pub protect: Option<String>,
916
917    #[cfg_attr(
918        feature = "serialize",
919        serde(default, skip_serializing_if = "is_default")
920    )]
921    pub comment: Option<String>,
922
923    #[cfg_attr(
924        feature = "serialize",
925        serde(default, skip_serializing_if = "is_default")
926    )]
927    pub children: Vec<FeatureChild>,
928}
929
930pub type FeatureChild = ExtensionChild;
931
932pub type Extensions = CommentedChildren<Extension>;
933
934#[derive(Debug, Clone, PartialEq, Eq, Default)]
935#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
936#[non_exhaustive]
937pub struct Extension {
938    /// Name of the extension.
939    pub name: String,
940
941    /// Human-readable description.
942    #[cfg_attr(
943        feature = "serialize",
944        serde(default, skip_serializing_if = "is_default")
945    )]
946    pub comment: Option<String>,
947
948    /// The unique index of this extension.
949    #[cfg_attr(
950        feature = "serialize",
951        serde(default, skip_serializing_if = "is_default")
952    )]
953    pub number: Option<i64>,
954
955    #[cfg_attr(
956        feature = "serialize",
957        serde(default, skip_serializing_if = "is_default")
958    )]
959    pub protect: Option<String>,
960
961    /// Which platform it works with, if any.
962    #[cfg_attr(
963        feature = "serialize",
964        serde(default, skip_serializing_if = "is_default")
965    )]
966    pub platform: Option<String>,
967
968    /// Tag name of the author.
969    #[cfg_attr(
970        feature = "serialize",
971        serde(default, skip_serializing_if = "is_default")
972    )]
973    pub author: Option<String>,
974
975    /// Contact information for extension author(s).
976    #[cfg_attr(
977        feature = "serialize",
978        serde(default, skip_serializing_if = "is_default")
979    )]
980    pub contact: Option<String>,
981
982    /// The level at which the extension applies (instance / device).
983    #[cfg_attr(
984        feature = "serialize",
985        serde(default, skip_serializing_if = "is_default")
986    )]
987    pub ext_type: Option<String>,
988
989    #[cfg_attr(
990        feature = "serialize",
991        serde(default, skip_serializing_if = "is_default")
992    )]
993    pub requires: Option<String>,
994
995    #[cfg_attr(
996        feature = "serialize",
997        serde(default, skip_serializing_if = "is_default")
998    )]
999    pub requires_core: Option<String>,
1000
1001    #[cfg_attr(
1002        feature = "serialize",
1003        serde(default, skip_serializing_if = "is_default")
1004    )]
1005    pub supported: Option<String>, // mk:TODO StringGroup?
1006
1007    #[cfg_attr(
1008        feature = "serialize",
1009        serde(default, skip_serializing_if = "is_default")
1010    )]
1011    pub ratified: Option<String>,
1012
1013    #[cfg_attr(
1014        feature = "serialize",
1015        serde(default, skip_serializing_if = "is_default")
1016    )]
1017    pub deprecatedby: Option<String>,
1018
1019    /// Whether this extension was promoted to core, and in which version.
1020    #[cfg_attr(
1021        feature = "serialize",
1022        serde(default, skip_serializing_if = "is_default")
1023    )]
1024    pub promotedto: Option<String>,
1025
1026    #[cfg_attr(
1027        feature = "serialize",
1028        serde(default, skip_serializing_if = "is_default")
1029    )]
1030    pub obsoletedby: Option<String>,
1031
1032    /// 'true' if this extension is released provisionally
1033    #[cfg_attr(
1034        feature = "serialize",
1035        serde(default, skip_serializing_if = "is_default")
1036    )]
1037    pub provisional: bool,
1038
1039    /// The items which make up this extension.
1040    #[cfg_attr(
1041        feature = "serialize",
1042        serde(default, skip_serializing_if = "is_default")
1043    )]
1044    pub specialuse: Option<String>,
1045
1046    /// Relative sortorder
1047    #[cfg_attr(
1048        feature = "serialize",
1049        serde(default, skip_serializing_if = "is_default")
1050    )]
1051    pub sortorder: Option<i64>,
1052
1053    #[cfg_attr(
1054        feature = "serialize",
1055        serde(default, skip_serializing_if = "is_default")
1056    )]
1057    pub depends: Option<String>,
1058
1059    #[cfg_attr(
1060        feature = "serialize",
1061        serde(default, skip_serializing_if = "is_default")
1062    )]
1063    pub nofeatures: bool,
1064
1065    /// The items which make up this extension.
1066    #[cfg_attr(
1067        feature = "serialize",
1068        serde(default, skip_serializing_if = "is_default")
1069    )]
1070    pub children: Vec<ExtensionChild>,
1071}
1072
1073/// A part of an extension declaration.
1074///
1075/// Extensions either include functionality from the spec, or remove some functionality.
1076#[derive(Debug, Clone, PartialEq, Eq)]
1077#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1078#[non_exhaustive]
1079pub enum ExtensionChild {
1080    /// Indicates the items which this extension requires to work.
1081    Require {
1082        #[cfg_attr(
1083            feature = "serialize",
1084            serde(default, skip_serializing_if = "is_default")
1085        )]
1086        api: Option<String>,
1087
1088        #[cfg_attr(
1089            feature = "serialize",
1090            serde(default, skip_serializing_if = "is_default")
1091        )]
1092        profile: Option<String>,
1093
1094        /// The extension which provides these required items, if any.
1095        #[cfg_attr(
1096            feature = "serialize",
1097            serde(default, skip_serializing_if = "is_default")
1098        )]
1099        extension: Option<String>,
1100
1101        #[cfg_attr(
1102            feature = "serialize",
1103            serde(default, skip_serializing_if = "is_default")
1104        )]
1105        feature: Option<String>,
1106
1107        #[cfg_attr(
1108            feature = "serialize",
1109            serde(default, skip_serializing_if = "is_default")
1110        )]
1111        comment: Option<String>,
1112
1113        #[cfg_attr(
1114            feature = "serialize",
1115            serde(default, skip_serializing_if = "is_default")
1116        )]
1117        depends: Option<String>,
1118
1119        /// The items which form this require block.
1120        items: Vec<InterfaceItem>,
1121    },
1122
1123    Deprecate {
1124        #[cfg_attr(
1125            feature = "serialize",
1126            serde(default, skip_serializing_if = "is_default")
1127        )]
1128        api: Option<String>,
1129
1130        #[cfg_attr(
1131            feature = "serialize",
1132            serde(default, skip_serializing_if = "is_default")
1133        )]
1134        profile: Option<String>,
1135
1136        #[cfg_attr(
1137            feature = "serialize",
1138            serde(default, skip_serializing_if = "is_default")
1139        )]
1140        comment: Option<String>,
1141
1142        #[cfg_attr(
1143            feature = "serialize",
1144            serde(default, skip_serializing_if = "is_default")
1145        )]
1146        explanationlink: String,
1147
1148        items: Vec<InterfaceItem>,
1149    },
1150
1151    /// Indicates the items this extension removes.
1152    Remove {
1153        #[cfg_attr(
1154            feature = "serialize",
1155            serde(default, skip_serializing_if = "is_default")
1156        )]
1157        api: Option<String>,
1158
1159        #[cfg_attr(
1160            feature = "serialize",
1161            serde(default, skip_serializing_if = "is_default")
1162        )]
1163        profile: Option<String>,
1164
1165        #[cfg_attr(
1166            feature = "serialize",
1167            serde(default, skip_serializing_if = "is_default")
1168        )]
1169        comment: Option<String>,
1170
1171        #[cfg_attr(
1172            feature = "serialize",
1173            serde(default, skip_serializing_if = "is_default")
1174        )]
1175        reasonlink: Option<String>,
1176
1177        #[cfg_attr(
1178            feature = "serialize",
1179            serde(default, skip_serializing_if = "is_default")
1180        )]
1181        items: Vec<InterfaceItem>,
1182    },
1183}
1184
1185/// An interface item is a function or an enum which makes up a Vulkan interface.
1186///
1187/// This structure is used by extensions to express dependencies or include functionality.
1188#[derive(Debug, Clone, PartialEq, Eq)]
1189#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1190#[non_exhaustive]
1191pub enum InterfaceItem {
1192    Comment(String),
1193
1194    Type {
1195        name: String,
1196
1197        #[cfg_attr(
1198            feature = "serialize",
1199            serde(default, skip_serializing_if = "is_default")
1200        )]
1201        comment: Option<String>,
1202    },
1203
1204    Enum(Enum),
1205
1206    Command {
1207        name: String,
1208
1209        #[cfg_attr(
1210            feature = "serialize",
1211            serde(default, skip_serializing_if = "is_default")
1212        )]
1213        comment: Option<String>,
1214    },
1215
1216    Feature {
1217        name: String,
1218
1219        struct_: String,
1220
1221        #[cfg_attr(
1222            feature = "serialize",
1223            serde(default, skip_serializing_if = "is_default")
1224        )]
1225        comment: Option<String>,
1226    },
1227}
1228
1229pub type Formats = CommentedChildren<Format>;
1230
1231#[derive(Debug, Clone, PartialEq, Eq, Default)]
1232#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1233#[non_exhaustive]
1234pub struct Format {
1235    pub name: String,
1236    pub class: String,
1237    pub blockSize: u8,
1238    pub texelsPerBlock: u8,
1239
1240    #[cfg_attr(
1241        feature = "serialize",
1242        serde(default, skip_serializing_if = "is_default")
1243    )]
1244    pub blockExtent: Option<String>,
1245
1246    #[cfg_attr(
1247        feature = "serialize",
1248        serde(default, skip_serializing_if = "is_default")
1249    )]
1250    pub packed: Option<u8>,
1251
1252    #[cfg_attr(
1253        feature = "serialize",
1254        serde(default, skip_serializing_if = "is_default")
1255    )]
1256    pub compressed: Option<String>,
1257
1258    #[cfg_attr(
1259        feature = "serialize",
1260        serde(default, skip_serializing_if = "is_default")
1261    )]
1262    pub chroma: Option<String>,
1263
1264    pub children: Vec<FormatChild>,
1265}
1266
1267#[derive(Debug, Clone, PartialEq, Eq)]
1268#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1269#[non_exhaustive]
1270pub enum FormatChild {
1271    #[non_exhaustive]
1272    Component {
1273        name: String,
1274        bits: String,
1275        numericFormat: String,
1276        #[cfg_attr(
1277            feature = "serialize",
1278            serde(default, skip_serializing_if = "is_default")
1279        )]
1280        planeIndex: Option<u8>,
1281    },
1282
1283    #[non_exhaustive]
1284    Plane {
1285        index: u8,
1286        widthDivisor: u8,
1287        heightDivisor: u8,
1288        compatible: String,
1289    },
1290
1291    #[non_exhaustive]
1292    SpirvImageFormat { name: String },
1293}
1294
1295#[derive(Debug, Clone, PartialEq, Eq, Default)]
1296#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1297#[non_exhaustive]
1298pub struct NameWithType {
1299    #[cfg_attr(
1300        feature = "serialize",
1301        serde(default, skip_serializing_if = "is_default")
1302    )]
1303    pub type_name: Option<String>,
1304
1305    #[cfg_attr(
1306        feature = "serialize",
1307        serde(default, skip_serializing_if = "is_default")
1308    )]
1309    pub name: String,
1310
1311    #[cfg_attr(
1312        feature = "serialize",
1313        serde(default, skip_serializing_if = "is_default")
1314    )]
1315    pub code: String,
1316}
1317
1318#[derive(Debug, Clone, PartialEq, Eq, Default)]
1319#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1320#[non_exhaustive]
1321pub struct CommentedChildren<T> {
1322    #[cfg_attr(
1323        feature = "serialize",
1324        serde(default, skip_serializing_if = "is_default")
1325    )]
1326    pub comment: Option<String>,
1327
1328    pub children: Vec<T>,
1329}
1330
1331#[derive(Debug, Clone, PartialEq, Eq, Default)]
1332#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1333#[non_exhaustive]
1334pub struct SpirvExtOrCap {
1335    #[cfg_attr(
1336        feature = "serialize",
1337        serde(default, skip_serializing_if = "is_default")
1338    )]
1339    pub name: String,
1340
1341    #[cfg_attr(
1342        feature = "serialize",
1343        serde(default, skip_serializing_if = "is_default")
1344    )]
1345    pub enables: Vec<Enable>,
1346}
1347
1348pub type SpirvExtension = SpirvExtOrCap;
1349pub type SpirvExtensions = CommentedChildren<SpirvExtension>;
1350
1351pub type SpirvCapability = SpirvExtOrCap;
1352pub type SpirvCapabilities = CommentedChildren<SpirvCapability>;
1353
1354#[derive(Debug, Clone, PartialEq, Eq)]
1355#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1356#[non_exhaustive]
1357pub enum SyncChild {
1358    Stage(SyncStage),
1359    Access(SyncAccess),
1360    Pipeline(SyncPipeline),
1361}
1362
1363pub type Sync = CommentedChildren<SyncChild>;
1364
1365#[derive(Debug, Clone, PartialEq, Eq, Default)]
1366#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1367#[non_exhaustive]
1368pub struct SyncSupport {
1369    pub queues: Option<String>,
1370    pub stage: Option<String>,
1371}
1372
1373#[derive(Debug, Clone, PartialEq, Eq, Default)]
1374#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1375#[non_exhaustive]
1376pub struct SyncEquivalent {
1377    pub stage: Option<String>,
1378    pub access: Option<String>,
1379}
1380
1381#[derive(Debug, Clone, PartialEq, Eq, Default)]
1382#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1383#[non_exhaustive]
1384pub struct SyncStage {
1385    pub name: String,
1386    pub alias: Option<String>,
1387    pub syncsupport: Option<SyncSupport>,
1388    pub syncequivalent: Option<SyncEquivalent>,
1389}
1390
1391#[derive(Debug, Clone, PartialEq, Eq, Default)]
1392#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1393#[non_exhaustive]
1394pub struct SyncAccess {
1395    pub name: String,
1396    pub alias: Option<String>,
1397    pub comment: Option<String>,
1398    pub syncsupport: Option<SyncSupport>,
1399    pub syncequivalent: Option<SyncEquivalent>,
1400}
1401
1402#[derive(Debug, Clone, PartialEq, Eq, Default)]
1403#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1404#[non_exhaustive]
1405pub struct SyncPipeline {
1406    pub name: String,
1407    pub depends: Option<String>,
1408    pub children: Vec<SyncPipelineStage>,
1409}
1410
1411#[derive(Debug, Clone, PartialEq, Eq, Default)]
1412#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1413#[non_exhaustive]
1414pub struct SyncPipelineStage {
1415    pub order: Option<String>,
1416    pub before: Option<String>,
1417    pub after: Option<String>,
1418    pub text: String,
1419}
1420
1421pub type VideoCodecs = CommentedChildren<VideoCodec>;
1422
1423#[derive(Debug, Clone, PartialEq, Eq, Default)]
1424#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1425#[non_exhaustive]
1426pub struct VideoCodec {
1427    pub comment: Option<String>,
1428    pub name: String,
1429    pub extend: Option<String>,
1430    pub value: Option<String>,
1431    pub children: Vec<VideoCodecChild>,
1432}
1433
1434#[derive(Debug, Clone, PartialEq, Eq)]
1435#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1436#[non_exhaustive]
1437pub enum VideoCodecChild {
1438    Profiles(VideoProfiles),
1439    Capabilities(VideoCapabilities),
1440    Format(VideoFormat),
1441}
1442
1443#[derive(Debug, Clone, PartialEq, Eq, Default)]
1444#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1445#[non_exhaustive]
1446pub struct VideoProfiles {
1447    pub comment: Option<String>,
1448    pub struct_: String,
1449    pub children: Vec<VideoProfileMember>,
1450}
1451
1452#[derive(Debug, Clone, PartialEq, Eq, Default)]
1453#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1454#[non_exhaustive]
1455pub struct VideoProfileMember {
1456    pub comment: Option<String>,
1457    pub name: String,
1458    pub children: Vec<VideoProfile>,
1459}
1460
1461#[derive(Debug, Clone, PartialEq, Eq, Default)]
1462#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1463#[non_exhaustive]
1464pub struct VideoProfile {
1465    pub comment: Option<String>,
1466    pub name: String,
1467    pub value: String,
1468}
1469
1470#[derive(Debug, Clone, PartialEq, Eq, Default)]
1471#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1472#[non_exhaustive]
1473pub struct VideoCapabilities {
1474    pub comment: Option<String>,
1475    pub struct_: String,
1476}
1477
1478#[derive(Debug, Clone, PartialEq, Eq, Default)]
1479#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1480#[non_exhaustive]
1481pub struct VideoFormat {
1482    pub comment: Option<String>,
1483    pub name: Option<String>,
1484    pub usage: Option<String>,
1485    pub extend: Option<String>,
1486    pub children: Vec<VideoFormatChild>,
1487}
1488
1489#[derive(Debug, Clone, PartialEq, Eq)]
1490#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1491#[non_exhaustive]
1492pub enum VideoFormatChild {
1493    RequireCapabilities(VideoRequireCapabilities),
1494    FormatProperties(VideoFormatProperties),
1495}
1496
1497#[derive(Debug, Clone, PartialEq, Eq, Default)]
1498#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1499#[non_exhaustive]
1500pub struct VideoFormatProperties {
1501    pub comment: Option<String>,
1502    pub struct_: String,
1503}
1504
1505#[derive(Debug, Clone, PartialEq, Eq, Default)]
1506#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1507#[non_exhaustive]
1508pub struct VideoRequireCapabilities {
1509    pub comment: Option<String>,
1510    pub struct_: String,
1511    pub member: String,
1512    pub value: String,
1513}
1514
1515#[derive(Debug, Clone, PartialEq, Eq)]
1516#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1517#[non_exhaustive]
1518pub enum Enable {
1519    Version(String),
1520    Extension(String),
1521    Feature(FeatureEnable),
1522    Property(PropertyEnable),
1523}
1524
1525#[derive(Debug, Clone, PartialEq, Eq, Default)]
1526#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1527#[non_exhaustive]
1528pub struct FeatureEnable {
1529    #[cfg_attr(
1530        feature = "serialize",
1531        serde(default, skip_serializing_if = "is_default")
1532    )]
1533    pub struct_: String,
1534
1535    #[cfg_attr(
1536        feature = "serialize",
1537        serde(default, skip_serializing_if = "is_default")
1538    )]
1539    pub feature: String,
1540
1541    #[cfg_attr(
1542        feature = "serialize",
1543        serde(default, skip_serializing_if = "is_default")
1544    )]
1545    pub requires: Option<String>,
1546
1547    #[cfg_attr(
1548        feature = "serialize",
1549        serde(default, skip_serializing_if = "is_default")
1550    )]
1551    pub alias: Option<String>,
1552}
1553
1554#[derive(Debug, Clone, PartialEq, Eq, Default)]
1555#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
1556#[non_exhaustive]
1557pub struct PropertyEnable {
1558    #[cfg_attr(
1559        feature = "serialize",
1560        serde(default, skip_serializing_if = "is_default")
1561    )]
1562    pub property: String,
1563
1564    #[cfg_attr(
1565        feature = "serialize",
1566        serde(default, skip_serializing_if = "is_default")
1567    )]
1568    pub member: String,
1569
1570    #[cfg_attr(
1571        feature = "serialize",
1572        serde(default, skip_serializing_if = "is_default")
1573    )]
1574    pub value: String,
1575
1576    #[cfg_attr(
1577        feature = "serialize",
1578        serde(default, skip_serializing_if = "is_default")
1579    )]
1580    pub requires: Option<String>,
1581}
1582
1583#[cfg(feature = "serialize")]
1584fn is_default<T: Default + Eq>(v: &T) -> bool {
1585    v.eq(&T::default())
1586}