diff options
Diffstat (limited to 'registry/reg.py')
-rw-r--r-- | registry/reg.py | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/registry/reg.py b/registry/reg.py index fcc47ac..9715845 100644 --- a/registry/reg.py +++ b/registry/reg.py @@ -436,6 +436,12 @@ class Registry: self.cmddict = {} "dictionary of CmdInfo objects keyed by command name" + self.aliasdict = {} + "dictionary of type and command names mapped to their alias, such as VkFooKHR -> VkFoo" + + self.enumvaluedict = {} + "dictionary of enum values mapped to their type, such as VK_FOO_VALUE -> VkFoo" + self.apidict = {} "dictionary of FeatureInfo objects for `<feature>` elements keyed by API name" @@ -548,6 +554,22 @@ class Registry: """Specify a feature name regexp to break on when generating features.""" self.breakPat = re.compile(regexp) + def addEnumValue(self, enum, type_name): + """Track aliasing and map back from enum values to their type""" + # Record alias, if any + value = enum.get('name') + alias = enum.get('alias') + if alias: + self.aliasdict[value] = alias + # Map the value back to the type + if type_name in self.aliasdict: + type_name = self.aliasdict[type_name] + if value in self.enumvaluedict: + # Some times the same enum is defined by multiple extensions + assert(type_name == self.enumvaluedict[value]) + else: + self.enumvaluedict[value] = type_name + def parseTree(self): """Parse the registry Element, once created""" # This must be the Element for the root <registry> @@ -571,6 +593,9 @@ class Registry: else: stripNonmatchingAPIs(self.reg, self.genOpts.apiname, actuallyDelete = True) + self.aliasdict = {} + self.enumvaluedict = {} + # Create dictionary of registry types from toplevel <types> tags # and add 'name' attribute to each <type> tag (where missing) # based on its <name> element. @@ -581,13 +606,20 @@ class Registry: for type_elem in self.reg.findall('types/type'): # If the <type> does not already have a 'name' attribute, set # it from contents of its <name> tag. - if type_elem.get('name') is None: + name = type_elem.get('name') + if name is None: name_elem = type_elem.find('name') if name_elem is None or not name_elem.text: raise RuntimeError("Type without a name!") - type_elem.set('name', name_elem.text) + name = name_elem.text + type_elem.set('name', name) self.addElementInfo(type_elem, TypeInfo(type_elem), 'type', self.typedict) + # Record alias, if any + alias = type_elem.get('alias') + if alias: + self.aliasdict[name] = alias + # Create dictionary of registry enum groups from <enums> tags. # # Required <enums> attributes: 'name'. If no name is given, one is @@ -609,10 +641,14 @@ class Registry: self.enumdict = {} for enums in self.reg.findall('enums'): required = (enums.get('type') is not None) + type_name = enums.get('name') + # Enum values are defined only for the type that is not aliased to something else. + assert(type_name not in self.aliasdict) for enum in enums.findall('enum'): enumInfo = EnumInfo(enum) enumInfo.required = required self.addElementInfo(enum, enumInfo, 'enum', self.enumdict) + self.addEnumValue(enum, type_name) # Create dictionary of registry commands from <command> tags # and add 'name' attribute to each <command> tag (where missing) @@ -622,7 +658,7 @@ class Registry: # Required <command> attributes: 'name' or <proto><name> tag contents self.cmddict = {} # List of commands which alias others. Contains - # [ aliasName, element ] + # [ name, aliasName, element ] # for each alias cmdAlias = [] for cmd in self.reg.findall('commands/command'): @@ -639,6 +675,7 @@ class Registry: alias = cmd.get('alias') if alias: cmdAlias.append([name, alias, cmd]) + self.aliasdict[name] = alias # Now loop over aliases, injecting a copy of the aliased command's # Element with the aliased prototype name replaced with the command @@ -713,6 +750,7 @@ class Registry: if addEnumInfo: enumInfo = EnumInfo(enum) self.addElementInfo(enum, enumInfo, 'enum', self.enumdict) + self.addEnumValue(enum, groupName) sync_pipeline_stage_condition = dict() sync_access_condition = dict() @@ -791,6 +829,7 @@ class Registry: if addEnumInfo: enumInfo = EnumInfo(enum) self.addElementInfo(enum, enumInfo, 'enum', self.enumdict) + self.addEnumValue(enum, groupName) # Parse out all spirv tags in dictionaries # Use addElementInfo to catch duplicates |