public static StructureDefinition FromXML(XElement elem) { StructureDefinition s = new StructureDefinition(); s.Name = elem.Attribute("name").Value; s.IsReturnedOnly = elem.Attribute("returnedonly")?.Value == "true"; var members = elem.Elements("member"); foreach (var m in members) { s.Members.Add(Member.FromXML(m)); } return(s); }
public static int GetSizeInBytes(StructureDefinition s, VulkanVersion vulkanVersion) { int size = 0; foreach (var member in s.Members) { int multiply = 1; if (member.ElementCount > 0) { multiply = member.ElementCount; } size += Member.GetSizeInBytes(member, vulkanVersion) * multiply; } return(size); }
public static int GetSizeInBytes(Member m, VulkanVersion vulkanVersion) { if (m.ExplicityLayoutValue.HasValue) { return(m.ExplicityLayoutValue.Value / 8); } else { switch (m.Type) { case "int8_t": case "int8_t*": case "uint8_t": case "char": case "uint8_t*": case "char*": return(1); case "uint16_t": case "uint16_t*": case "int16_t": case "int16_t*": return(2); case "uint32_t": case "DWORD": case "uint32_t*": case "int32_t": case "int32_t*": case "size_t": case "float": case "float*": return(4); case "uint64_t": case "uint64_t*": case "int64_t": case "int64_t*": case "double": case "double*": case "void": return(8); case "VkBool32": return(4); case "VkExtent2D": case "VkOffset2D": return(8); case "VkRect2D": return(16); default: var @struct = vulkanVersion.Structs.Find(s => s.Name == m.Type); if (@struct != null) // structs { return(StructureDefinition.GetSizeInBytes(@struct, vulkanVersion)); } else { return(4); // enums } } } }
public static VulkanSpecification FromFile(string xmlFile) { XDocument file = XDocument.Load(xmlFile); VulkanSpecification spec = new VulkanSpecification(); var registry = file.Element("registry"); // Platforms var platforms = registry.Element("platforms").Elements("platform"); foreach (var platform in platforms) { spec.Platforms.Add(PlatformDefinition.FromXML(platform)); } // Tags var tags = registry.Element("tags").Elements("tag"); foreach (var tag in tags) { spec.Tags.Add(TagDefinition.FromXML(tag)); } // Constants var constants = (registry.Elements("enums").Where(e => e.Attribute("name").Value == "API Constants")).Elements("enum"); foreach (var c in constants) { spec.Constants.Add(ConstantDefinition.FromXML(c)); } // Enums var enums = registry.Elements("enums").Where(e => e.Attribute("type")?.Value == "enum" || e.Attribute("type")?.Value == "bitmask"); foreach (var e in enums) { spec.Enums.Add(EnumDefinition.FromXML(e)); } var types = registry.Elements("types"); // FuncPointers var funcPointers = types.Elements("type").Where(f => f.Attribute("category")?.Value == "funcpointer"); foreach (var func in funcPointers) { spec.FuncPointers.Add(FuncpointerDefinition.FromXML(func)); } // Alias spec.Alias = types.Elements("type").Where(a => a.Attribute("alias") != null) .ToDictionary( a => a.Attribute("name").Value, a => a.Attribute("alias").Value); // Command Alias var commandAlias = registry.Element("commands").Elements("command").Where(c => c.Attribute("alias") != null); foreach (var c in commandAlias) { spec.Alias.Add(c.Attribute("name").Value, c.Attribute("alias").Value); } // Structs var structs = types.Elements("type").Where(s => s.Attribute("category")?.Value == "struct" && s.Attribute("alias") == null); foreach (var s in structs) { spec.Structs.Add(StructureDefinition.FromXML(s)); } // Unions var unions = types.Elements("type").Where(u => u.Attribute("category")?.Value == "union"); foreach (var u in unions) { spec.Unions.Add(StructureDefinition.FromXML(u)); } // TypeDef var typeDefs = types.Elements("type").Where(t => t.Value.Contains("typedef") && t.Attribute("category")?.Value == "bitmask"); foreach (var type in typeDefs) { spec.TypeDefs.Add(TypedefDefinition.FromXML(type)); } // BaseTypes spec.BaseTypes = types.Elements("type").Where(bt => bt.Attribute("category")?.Value == "basetype") .ToDictionary( bt => bt.Element("name").Value, bt => bt.Element("type")?.Value); // Handles var handles = types.Elements("type").Where(h => h.Attribute("category")?.Value == "handle"); foreach (var h in handles) { spec.Handles.Add(HandleDefinition.FromXML(h)); } // Commands var commands = registry.Element("commands").Elements("command").Where(c => c.Attribute("alias") == null); foreach (var command in commands) { spec.Commands.Add(CommandDefinition.FromXML(command)); } // Features var features = registry.Elements("feature"); foreach (var feature in features) { spec.Features.Add(FeatureDefinition.FromXML(feature)); } // Extensions var extensions = registry.Element("extensions").Elements("extension"); foreach (var extension in extensions) { spec.Extensions.Add(ExtensionDefinition.FromXML(extension)); } return(spec); }