示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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
                    }
                }
            }
        }
示例#4
0
        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);
        }