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