diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/vulkaninfo_generator.py | 410 |
1 files changed, 232 insertions, 178 deletions
diff --git a/scripts/vulkaninfo_generator.py b/scripts/vulkaninfo_generator.py index aabfac9b..2131acd6 100644 --- a/scripts/vulkaninfo_generator.py +++ b/scripts/vulkaninfo_generator.py @@ -58,15 +58,11 @@ license_header = ''' ''' custom_formaters = ''' -std::ostream &operator<<(std::ostream &o, VkConformanceVersionKHR &c) { +std::ostream &operator<<(std::ostream &o, VkConformanceVersion &c) { return o << std::to_string(c.major) << "." << std::to_string(c.minor) << "." << std::to_string(c.subminor) << "." << std::to_string(c.patch); } -std::string VkExtent3DString(VkExtent3D e) { - return std::string("(") + std::to_string(e.width) + ", " + std::to_string(e.height) + ", " + std::to_string(e.depth) + ")"; -} - template <typename T> std::string to_hex_str(T i) { std::stringstream stream; @@ -92,19 +88,17 @@ flags_to_gen = ['VkSurfaceTransformFlagsKHR', 'VkCompositeAlphaFlagsKHR', 'VkDeviceGroupPresentModeFlagsKHR', 'VkFormatFeatureFlags', 'VkMemoryPropertyFlags', 'VkMemoryHeapFlags'] flags_strings_to_gen = ['VkQueueFlags'] +struct_short_versions_to_gen = ['VkExtent3D'] + struct_comparisons_to_gen = ['VkSurfaceFormatKHR', 'VkSurfaceFormat2KHR', 'VkSurfaceCapabilitiesKHR', 'VkSurfaceCapabilities2KHR', 'VkSurfaceCapabilities2EXT'] # iostream or custom outputter handles these types predefined_types = ['char', 'VkBool32', 'uint32_t', 'uint8_t', 'int32_t', - 'float', 'uint64_t', 'size_t', 'VkDeviceSize', 'VkConformanceVersionKHR'] -# need list of venders to blacklist vendor extensions -vendor_abbreviations = ['_IMG', '_AMD', '_AMDX', '_ARM', '_FSL', '_BRCM', '_NXP', '_NV', '_NVX', '_VIV', '_VSI', '_KDAB', - '_ANDROID', '_CHROMIUM', '_FUCHSIA', '_GGP', '_GOOGLE', '_QCOM', '_LUNARG', '_SAMSUNG', '_SEC', '_TIZEN', - '_RENDERDOC', '_NN', '_MVK', '_KHX', '_MESA', '_INTEL'] + 'float', 'uint64_t', 'size_t', 'VkDeviceSize', 'VkConformanceVersion'] # Types that need pNext Chains built. 'extends' is the xml tag used in the structextends member. 'type' can be device, instance, or both -EXTENSION_CATEGORIES = {'phys_device_props2': {'extends': 'VkPhysicalDeviceProperties2', 'type': 'device'}, +EXTENSION_CATEGORIES = {'phys_device_props2': {'extends': 'VkPhysicalDeviceProperties2', 'type': 'both'}, 'phys_device_mem_props2': {'extends': 'VkPhysicalDeviceMemoryProperties2', 'type': 'device'}, 'phys_device_features2': {'extends': 'VkPhysicalDeviceFeatures2,VkDeviceCreateInfo', 'type': 'device'}, 'surface_capabilities2': {'extends': 'VkSurfaceCapabilities2KHR', 'type': 'both'}, @@ -172,40 +166,49 @@ class VulkanInfoGenerator(OutputGenerator): self.constants = OrderedDict() + self.types_to_gen = set() + self.extension_sets = OrderedDict() for ext_cat in EXTENSION_CATEGORIES.keys(): self.extension_sets[ext_cat] = set() - self.enums = set() - self.flags = set() - self.bitmasks = set() - self.structures = set() - self.structs_to_comp = set() - self.all_structures = set() - - self.types_to_gen = set() + self.enums = [] + self.flags = [] + self.bitmasks = [] + self.all_structures = [] + self.aliases = OrderedDict() self.extFuncs = OrderedDict() self.extTypes = OrderedDict() + self.vendor_abbreviations = [] + self.vulkan_versions = [] + def beginFile(self, genOpts): gen.OutputGenerator.beginFile(self, genOpts) - root = self.registry.reg - for node in self.registry.reg.findall('enums'): if node.get('name') == 'API Constants': for item in node.findall('enum'): self.constants[item.get('name')] = item.get('value') - for node in root.find('extensions').findall('extension'): + for node in self.registry.reg.find('extensions').findall('extension'): ext = VulkanExtension(node) for item in ext.vktypes: self.extTypes[item] = ext for item in ext.vkfuncs: self.extFuncs[item] = ext + # need list of venders to blacklist vendor extensions + for tag in self.registry.reg.find('tags'): + if tag.get("name") not in ["KHR", "EXT"]: + self.vendor_abbreviations.append("_" + tag.get('name')) + + for ver in self.registry.reg.findall('feature'): + self.vulkan_versions.append(VulkanVersion(ver)) + def endFile(self): + # gather the types that are needed to generate types_to_gen = set() for s in enums_to_gen: types_to_gen.add(s) @@ -213,83 +216,72 @@ class VulkanInfoGenerator(OutputGenerator): for f in flags_to_gen: types_to_gen.add(f) - types_to_gen = types_to_gen.union(GatherTypesToGen(self.structures)) - for key, value in EXTENSION_CATEGORIES.items(): + types_to_gen = types_to_gen.union( + GatherTypesToGen(self.all_structures, structures_to_gen)) + for key in EXTENSION_CATEGORIES.keys(): types_to_gen = types_to_gen.union( - GatherTypesToGen(self.extension_sets[key])) + GatherTypesToGen(self.all_structures, self.extension_sets[key])) + + names_of_structures_to_gen = set() + for s in self.all_structures: + if s.name in types_to_gen: + names_of_structures_to_gen.add(s.name) structs_to_comp = set() for s in struct_comparisons_to_gen: structs_to_comp.add(s) structs_to_comp = structs_to_comp.union( - GatherTypesToGen(self.structs_to_comp)) - - self.enums = sorted(self.enums, key=operator.attrgetter('name')) - self.flags = sorted(self.flags, key=operator.attrgetter('name')) - self.bitmasks = sorted(self.bitmasks, key=operator.attrgetter('name')) - self.structures = sorted( - self.structures, key=operator.attrgetter('name')) - self.all_structures = sorted( - self.all_structures, key=operator.attrgetter('name')) + GatherTypesToGen(self.all_structures, struct_comparisons_to_gen)) for key, value in self.extension_sets.items(): - self.extension_sets[key] = sorted( - value, key=operator.attrgetter('name')) + self.extension_sets[key] = sorted(value) + + alias_versions = {} + for version in self.vulkan_versions: + for aliased_type, aliases in self.aliases.items(): + for alias in aliases: + if alias in version.names: + alias_versions[alias] = version.minorVersion + # print the types gathered out = '' out += license_header + "\n" out += "#include \"vulkaninfo.h\"\n" out += "#include \"outputprinter.h\"\n" out += custom_formaters - for e in self.enums: - if e.name in types_to_gen: - out += PrintEnumToString(e, self) - out += PrintEnum(e, self) - - for f in self.flags: - if f.name in types_to_gen: - for b in self.bitmasks: - if b.name == f.enum: - out += PrintFlags(f, b, self) - out += PrintBitMask(b, f.name, self) - - if f.name in flags_strings_to_gen: - for b in self.bitmasks: - if b.name == f.enum: - out += PrintBitMaskToString(b, f.name, self) - - # find all structures needed to dump the requested structures - structure_names = set() - for s in self.all_structures: - if s.name in types_to_gen: - structure_names.add(s.name) + for enum in (e for e in self.enums if e.name in types_to_gen): + out += PrintEnumToString(enum, self) + out += PrintEnum(enum, self) - for s in self.all_structures: - if s.name in types_to_gen: - out += PrintForwardDeclaration(s, self) + for flag in self.flags: + if flag.name in types_to_gen: + for bitmask in (b for b in self.bitmasks if b.name == flag.enum): + out += PrintFlags(flag, bitmask, self) + out += PrintBitMask(bitmask, flag.name, self) - for s in self.all_structures: - if s.name in types_to_gen: - out += PrintStructure(s, structure_names, self) + if flag.name in flags_strings_to_gen: + for bitmask in (b for b in self.bitmasks if b.name == flag.enum): + out += PrintBitMaskToString(bitmask, flag.name, self) + + for s in (x for x in self.all_structures if x.name in types_to_gen): + out += PrintStructure(s, types_to_gen, names_of_structures_to_gen) out += "pNextChainInfos get_chain_infos() {\n" out += " pNextChainInfos infos;\n" - for key, value in EXTENSION_CATEGORIES.items(): - out += PrintChainBuilders(key, self.extension_sets[key]) + for key in EXTENSION_CATEGORIES.keys(): + out += PrintChainBuilders(key, + self.extension_sets[key], self.all_structures) out += " return infos;\n}\n" for key, value in EXTENSION_CATEGORIES.items(): out += PrintChainIterator(key, - self.extension_sets[key], value.get('type')) + self.extension_sets[key], self.all_structures, value.get('type'), self.extTypes, self.aliases, self.vulkan_versions) - for s in self.all_structures: - if s.name in structs_to_comp: - out += PrintStructComparisonForwardDef(s) - - for s in self.all_structures: - if s.name in structs_to_comp: - out += PrintStructComparison(s) + for s in (x for x in self.all_structures if x.name in structs_to_comp): + out += PrintStructComparison(s) + for s in (x for x in self.all_structures if x.name in struct_short_versions_to_gen): + out += PrintStructShort(s) gen.write(out, file=self.outFile) @@ -307,35 +299,35 @@ class VulkanInfoGenerator(OutputGenerator): gen.OutputGenerator.genGroup(self, groupinfo, groupName, alias) if alias is not None: + if alias in self.aliases.keys(): + self.aliases[alias].append(groupName) + else: + self.aliases[alias] = [groupName, ] return if groupinfo.elem.get('type') == 'bitmask': - self.bitmasks.add(VulkanBitmask(groupinfo.elem)) + self.bitmasks.append(VulkanBitmask(groupinfo.elem)) elif groupinfo.elem.get('type') == 'enum': - self.enums.add(VulkanEnum(groupinfo.elem)) + self.enums.append(VulkanEnum(groupinfo.elem)) def genType(self, typeinfo, name, alias): gen.OutputGenerator.genType(self, typeinfo, name, alias) if alias is not None: + if alias in self.aliases.keys(): + self.aliases[alias].append(name) + else: + self.aliases[alias] = [name, ] return if typeinfo.elem.get('category') == 'bitmask': - self.flags.add(VulkanFlags(typeinfo.elem)) - - if typeinfo.elem.get('category') == 'struct' and name in structures_to_gen: - self.structures.add(VulkanStructure( - name, typeinfo.elem, self.constants, self.extTypes)) - - if typeinfo.elem.get('category') == 'struct' and name in struct_comparisons_to_gen: - self.structs_to_comp.add(VulkanStructure( - name, typeinfo.elem, self.constants, self.extTypes)) + self.flags.append(VulkanFlags(typeinfo.elem)) if typeinfo.elem.get('category') == 'struct': - self.all_structures.add(VulkanStructure( + self.all_structures.append(VulkanStructure( name, typeinfo.elem, self.constants, self.extTypes)) - for vendor in vendor_abbreviations: + for vendor in self.vendor_abbreviations: for node in typeinfo.elem.findall('member'): if(node.get('values') is not None): if(node.get('values').find(vendor)) != -1: @@ -343,16 +335,15 @@ class VulkanInfoGenerator(OutputGenerator): for key, value in EXTENSION_CATEGORIES.items(): if typeinfo.elem.get('structextends') == value.get('extends'): - self.extension_sets[key].add(VulkanStructure( - name, typeinfo.elem, self.constants, self.extTypes)) + self.extension_sets[key].add(name) -def GatherTypesToGen(structures): +def GatherTypesToGen(structure_list, structures): types = set() added_stuff = True # repeat until no new types are added while added_stuff == True: added_stuff = False - for s in structures: + for s in (x for x in structure_list if x.name in structures): size = len(types) types.add(s.name) if len(types) != size: @@ -386,87 +377,88 @@ def AddGuardFooter(obj): return "" -def PrintEnumToString(e, gen): +def PrintEnumToString(enum, gen): out = '' - out += AddGuardHeader(GetExtension(e.name, gen)) + out += AddGuardHeader(GetExtension(enum.name, gen)) - out += "static const char *" + e.name + "String(" + e.name + " value) {\n" + out += "static const char *" + enum.name + \ + "String(" + enum.name + " value) {\n" out += " switch (value) {\n" - for v in e.options: + for v in enum.options: out += " case (" + str(v.value) + \ "): return \"" + v.name[3:] + "\";\n" - out += " default: return \"UNKNOWN_" + e.name + "\";\n" + out += " default: return \"UNKNOWN_" + enum.name + "\";\n" out += " }\n}\n" - out += AddGuardFooter(GetExtension(e.name, gen)) + out += AddGuardFooter(GetExtension(enum.name, gen)) return out -def PrintEnum(e, gen): +def PrintEnum(enum, gen): out = '' - out += AddGuardHeader(GetExtension(e.name, gen)) - out += "void Dump" + e.name + \ + out += AddGuardHeader(GetExtension(enum.name, gen)) + out += "void Dump" + enum.name + \ "(Printer &p, std::string name, " + \ - e.name + " value, int width = 0) {\n" + enum.name + " value, int width = 0) {\n" out += " if (p.Type() == OutputType::json) {\n" out += " p.PrintKeyValue(name, value, width);\n" out += " return;\n" out += " } else {\n" out += " p.PrintKeyValue(name, " + \ - e.name + "String(value), width);\n }\n" + enum.name + "String(value), width);\n }\n" out += "}\n" - out += AddGuardFooter(GetExtension(e.name, gen)) + out += AddGuardFooter(GetExtension(enum.name, gen)) return out -def PrintFlags(f, b, gen): +def PrintFlags(flag, bitmask, gen): out = '' - out += AddGuardHeader(GetExtension(f.name, gen)) + out += AddGuardHeader(GetExtension(flag.name, gen)) - out += "void Dump" + f.name + \ + out += "void Dump" + flag.name + \ "(Printer &p, std::string name, " + \ - f.enum + " value, int width = 0) {\n" + flag.enum + " value, int width = 0) {\n" out += " if (value == 0) p.PrintElement(\"None\");\n" - for v in b.options: + for v in bitmask.options: out += " if (" + str(v.value) + \ " & value) p.SetAsType().PrintElement(\"" + \ str(v.name[3:]) + "\");\n" out += "}\n" - out += AddGuardFooter(GetExtension(f.name, gen)) + out += AddGuardFooter(GetExtension(flag.name, gen)) return out -def PrintBitMask(b, name, gen): +def PrintBitMask(bitmask, name, gen): out = '' - out += AddGuardHeader(GetExtension(b.name, gen)) + out += AddGuardHeader(GetExtension(bitmask.name, gen)) out += "void Dump" + name + \ "(Printer &p, std::string name, " + name + " value, int width = 0) {\n" out += " if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }\n" out += " p.ObjectStart(name);\n" out += " Dump" + name + \ - "(p, name, static_cast<" + b.name + ">(value), width);\n" + "(p, name, static_cast<" + bitmask.name + ">(value), width);\n" out += " p.ObjectEnd();\n" out += "}\n" - out += "void Dump" + b.name + \ + out += "void Dump" + bitmask.name + \ "(Printer &p, std::string name, " + \ - b.name + " value, int width = 0) {\n" + bitmask.name + " value, int width = 0) {\n" out += " if (p.Type() == OutputType::json) { p.PrintKeyValue(name, value); return; }\n" out += " p.ObjectStart(name);\n" out += " Dump" + name + "(p, name, value, width);\n" out += " p.ObjectEnd();\n" out += "}\n" - out += AddGuardFooter(GetExtension(b.name, gen)) + out += AddGuardFooter(GetExtension(bitmask.name, gen)) return out -def PrintBitMaskToString(b, name, gen): +def PrintBitMaskToString(bitmask, name, gen): out = '' - out += AddGuardHeader(GetExtension(b.name, gen)) + out += AddGuardHeader(GetExtension(bitmask.name, gen)) out += "std::string " + name + \ "String(" + name + " value, int width = 0) {\n" out += " std::string out;\n" out += " bool is_first = true;\n" - for v in b.options: + for v in bitmask.options: out += " if (" + str(v.value) + " & value) {\n" out += " if (is_first) { is_first = false; } else { out += \" | \"; }\n" out += " out += \"" + \ @@ -474,24 +466,16 @@ def PrintBitMaskToString(b, name, gen): out += " }\n" out += " return out;\n" out += "}\n" - out += AddGuardFooter(GetExtension(b.name, gen)) + out += AddGuardFooter(GetExtension(bitmask.name, gen)) return out -def PrintForwardDeclaration(struct, gen): - out = '' - out += AddGuardHeader(struct) - out += "void Dump" + struct.name + \ - "(Printer &p, std::string name, " + struct.name + " &obj);\n" - out += AddGuardFooter(struct) - - return out - - -def PrintStructure(struct, structure_names, gen): +def PrintStructure(struct, types_to_gen, structure_names): + if len(struct.members) == 0: + return "" out = '' out += AddGuardHeader(struct) - max_key_len = len(struct.members[0].name) + max_key_len = 0 for v in struct.members: if v.arrayLength is not None: if len(v.name) + len(v.arrayLength) + 2 > max_key_len: @@ -542,7 +526,7 @@ def PrintStructure(struct, structure_names, gen): "\", obj."+v.arrayLength+");\n" out += " for (uint32_t i = 0; i < obj." + \ v.arrayLength+"; i++) {\n" - if v.typeID in structure_names: + if v.typeID in types_to_gen: out += " if (obj." + v.name + " != nullptr) {\n" out += " p.SetElementIndex(i);\n" out += " Dump" + v.typeID + \ @@ -561,13 +545,14 @@ def PrintStructure(struct, structure_names, gen): out += " p.PrintKeyValue(\"" + v.name + "\", obj." + \ v.name + ", " + str(max_key_len) + ");\n" elif v.name not in ['sType', 'pNext']: - if v.typeID in structure_names: - out += " Dump" + v.typeID + \ - "(p, \"" + v.name + "\", obj." + v.name + ");\n" - else: + # if it is an enum/flag/bitmask, add the calculated width + if v.typeID not in structure_names: out += " Dump" + v.typeID + \ "(p, \"" + v.name + "\", obj." + \ v.name + ", " + str(max_key_len) + ");\n" + else: + out += " Dump" + v.typeID + \ + "(p, \"" + v.name + "\", obj." + v.name + ");\n" out += " p.ObjectEnd();\n" out += "}\n" @@ -576,21 +561,44 @@ def PrintStructure(struct, structure_names, gen): return out -def PrintChainBuilders(listName, structures): +def PrintStructShort(struct): + out = '' + out += AddGuardHeader(struct) + out += "std::ostream &operator<<(std::ostream &o, " + \ + struct.name + " &obj) {\n" + out += " return o << \"(\" << " + + first = True + for v in struct.members: + if first: + first = False + out += "obj." + v.name + " << " + else: + out += "\',\' << obj." + v.name + " << " + out += "\")\";\n" + out += "}\n" + out += AddGuardFooter(struct) + return out + + +def PrintChainBuilders(listName, structures, all_structures): + sorted_structures = sorted( + all_structures, key=operator.attrgetter('name')) + out = '' out += " infos." + listName + " = {\n" - for s in structures: - out += AddGuardHeader(s) - if s.sTypeName is not None: - out += " {" + s.sTypeName + ", sizeof(" + s.name + ")},\n" - out += AddGuardFooter(s) + for s in sorted_structures: + if s.name in structures: + out += AddGuardHeader(s) + if s.sTypeName is not None: + out += " {" + s.sTypeName + \ + ", sizeof(" + s.name + ")},\n" + out += AddGuardFooter(s) out += " };\n" return out -def PrintChainIterator(listName, structures, checkExtLoc): - sorted_structures = sorted(structures, key=operator.attrgetter("name")) - +def PrintChainIterator(listName, structures, all_structures, checkExtLoc, extTypes, aliases, versions): out = '' out += "void chain_iterator_" + listName + "(Printer &p, " if checkExtLoc == "device": @@ -599,48 +607,72 @@ def PrintChainIterator(listName, structures, checkExtLoc): out += "AppInstance &inst" elif checkExtLoc == "both": out += "AppInstance &inst, AppGpu &gpu" - out += ", void * place) {\n" + out += ", void * place, VulkanVersion version) {\n" out += " while (place) {\n" out += " struct VkStructureHeader *structure = (struct VkStructureHeader *)place;\n" out += " p.SetSubHeader();\n" - for s in sorted_structures: - out += AddGuardHeader(s) - if s.sTypeName is not None: - if s.extNameStr is not None: - out += " if (structure->sType == " + \ - s.sTypeName + " &&\n" - if s.extType == "device": - out += " gpu.CheckPhysicalDeviceExtensionIncluded(" + \ - s.extNameStr + ")) {\n" - elif s.extType == "instance": - out += " inst.CheckExtensionEnabled(" + \ - s.extNameStr + ")) {\n" - - else: - out += " if (structure->sType == " + \ - s.sTypeName + ") {\n" + for s in all_structures: + if s.sTypeName is None: + continue + extNameStr = None + extType = None + for k, e in extTypes.items(): + if k == s.name or (s.name in aliases.keys() and k in aliases[s.name]): + if e.extNameStr is not None: + extNameStr = e.extNameStr + if e.type is not None: + extType = e.type + break + version = None + oldVersionName = None + for v in versions: + if s.name in v.names: + version = v.minorVersion + if s.name in aliases.keys(): + for alias in aliases[s.name]: + oldVersionName = alias + + if s.name in structures: + out += AddGuardHeader(s) + out += " if (structure->sType == " + s.sTypeName + has_version = version is not None + has_extNameStr = extNameStr is not None or s.name in aliases.keys() + + if has_version or has_extNameStr: + out += " && \n (" + if has_extNameStr: + if extType == "device": + out += "gpu.CheckPhysicalDeviceExtensionIncluded(" + \ + extNameStr + ")" + elif extType == "instance": + out += "inst.CheckExtensionEnabled(" + extNameStr + ")" + if has_version and extType is not None: + out += " ||\n " + if has_version: + out += "version.minor >= " + str(version) + out += ")" + out += ") {\n" out += " " + s.name + "* props = " + \ "("+s.name+"*)structure;\n" - out += " Dump" + s.name + \ - "(p, \"" + s.name + "\", *props);\n" + + out += " Dump" + s.name + "(p, " + if s.name in aliases.keys() and version is not None: + out += "version.minor >= " + version + " ?\"" + \ + s.name + "\":\"" + oldVersionName + "\"" + else: + out += "\"" + s.name + "\"" + out += ", *props);\n" out += " p.AddNewline();\n" out += " }\n" - out += AddGuardFooter(s) + out += AddGuardFooter(s) out += " place = structure->pNext;\n" out += " }\n" out += "}\n" return out -def PrintStructComparisonForwardDef(structure): - out = '' - out += "bool operator==(const " + structure.name + \ - " & a, const " + structure.name + " b);\n" - return out - - def PrintStructComparison(structure): out = '' out += "bool operator==(const " + structure.name + \ @@ -834,8 +866,8 @@ class VulkanStructure: self.members = [] self.guard = None self.sTypeName = None - self.extNameStr = None - self.extType = None + self.extendsStruct = rootNode.get('structextends') + for node in rootNode.findall('member'): if(node.get('values') is not None): self.sTypeName = node.get('values') @@ -846,10 +878,6 @@ class VulkanStructure: if k == self.name: if e.guard is not None: self.guard = e.guard - if e.extNameStr is not None: - self.extNameStr = e.extNameStr - if e.type is not None: - self.extType = e.type class VulkanExtension: @@ -865,6 +893,15 @@ class VulkanExtension: self.vkfuncs = [] self.constants = {} self.enumValues = {} + self.version = 0 + self.node = rootNode + + promotedto = rootNode.get('promotedto') + if promotedto != None: + # get last char of VK_VERSION_1_1 or VK_VERSION_1_2 + minorVersion = promotedto[-1:] + if minorVersion.isdigit(): + self.version = minorVersion for req in rootNode.findall('require'): for ty in req.findall('type'): @@ -895,3 +932,20 @@ class VulkanExtension: self.enumValues[base] = (name, enumValue) else: self.constants[name] = value + + +class VulkanVersion: + def __init__(self, rootNode): + self.name = rootNode.get('name') + version_str = rootNode.get('number').split('.') + self.majorVersion = version_str[0] + self.minorVersion = version_str[1] + self.names = set() + + for req in rootNode.findall('require'): + for ty in req.findall('type'): + self.names.add(ty.get('name')) + for func in req.findall('command'): + self.names.add(func.get('name')) + for enum in req.findall('enum'): + self.names.add(enum.get('name')) |
