+ def add_enum_provider(self, name, priority):
+ value = self.string_to_int[name]
+
+ # We don't want the weird GL_SKIP_COMPONENTS1_NV enums.
+ if value < 0:
+ return
+ # We don't want the 64-bit GL_TIMEOUT_IGNORED "enums"
+ if value > 0xffffffff:
+ return
+
+ # We don't want bitfields in the enum-to-string table --
+ # individual bits have so many names, it's pointless. Note
+ # that we check for power-of-two, since some getters have
+ # "_BITS" in their name, but none have a power-of-two enum
+ # number.
+ if not (value & (value - 1)) and '_BIT' in name:
+ return
+
+ # Also drop the GL_*_ATTRIB_BITS bitmasks.
+ if value == 0xffffffff:
+ return
+
+ if value in self.enum_table:
+ (n, p) = self.enum_table[value]
+ if priority < p:
+ self.enum_table[value] = (name, priority)
+ else:
+ self.enum_table[value] = (name, priority)
+
+ def process_extension(self, extension):
+ if extension.get('name').startswith('GL_ARB_'):
+ extension_prio = 400
+ elif extension.get('name').startswith('GL_EXT_'):
+ extension_prio = 600
+ else:
+ extension_prio = 800
+
+ for enum in extension.findall('require/enum'):
+ self.add_enum_provider(enum.get('name'), extension_prio)
+
+ def process_enums(self, xml):
+ # First, process the XML entries that define the hex values
+ # for all of the enum names.
+ for enum in xml.findall('enums/enum'):
+ name = enum.get('name')
+ value = int(enum.get('value'), base=16)
+
+ # If the same name ever maps to multiple values, that can
+ # confuse us. GL_ACTIVE_PROGRAM_EXT is OK to lose because
+ # we choose GL_ACTIVE PROGRAM instead.
+ if name in self.string_to_int and name != "GL_ACTIVE_PROGRAM_EXT":
+ print("#error Renumbering {0} from {1} to {2}".format(name, self.string_to_int[name], value))
+
+ self.string_to_int[name] = value
+
+ # Now, process all of the API versions and extensions that
+ # provide enums, so we can decide what name to call any hex
+ # value.
+ for feature in xml.findall('feature'):
+ feature_name = feature.get('name')
+
+ # When an enum gets renamed in a newer version (generally
+ # because of some generalization of the functionality),
+ # prefer the newer name. Also, prefer desktop GL names to
+ # ES.
+ m = re.match('GL_VERSION_([0-9])_([0-9])', feature_name)
+ if m:
+ feature_prio = 100 - int(m.group(1) + m.group(2))
+ else:
+ m = re.match('GL_ES_VERSION_([0-9])_([0-9])', feature_name)
+ if m:
+ feature_prio = 200 - int(m.group(1) + m.group(2))
+ else:
+ feature_prio = 200
+
+ for enum in feature.findall('require/enum'):
+ self.add_enum_provider(enum.get('name'), feature_prio)
+
+ for extension in xml.findall('extensions/extension'):
+ self.process_extension(extension)