+ extensions = get_nested_elements(root, "extensions/extension")
+ for ext in extensions:
+ ext_name = ext.getAttribute("name")
+ if ext_name.startswith("GL_"):
+ ext_name = ext_name[3:]
+ supported = ext.getAttribute("supported").split('|')
+ if "gl" in supported:
+ commands = get_nested_elements(ext, "require/command")
+ enums = get_nested_elements(ext, "require/enum")
+ for t in itertools.chain(commands, enums):
+ name = t.getAttribute("name")
+ thing = things.get(name)
+ if thing:
+ thing.extension = ext_name
+
+parse_file("gl.xml")
+parse_file("gl.fixes.xml")
+
+### Additional processing ###
+
+# Find aliases for enums
+enums = [t for t in things.itervalues() if t.kind==Thing.ENUM]
+core_enums_by_value = dict((e.value, e) for e in enums if e.version)
+
+for e in enums:
+ if e.kind==t.ENUM and e.extension:
+ ce = core_enums_by_value.get(e.value)
+ if ce and ce!=e:
+ e.aliases.append(ce.name)
+
+# Create references from core things to their extension counterparts
+for t in things.itervalues():
+ if t.extension==ext or t.extension in secondary:
+ for a in t.aliases:
+ alias = things.get(a)
+ if alias:
+ alias.source = t
+
+def is_relevant(t):
+ # Unpromoted extension things are relevant
+ if t.extension==ext and not t.aliases:
+ return True
+
+ # Core things promoted from the extension are also relevant
+ if t.source:
+ e = t.source
+ if e.extension==ext or e.extension in secondary:
+ return True
+
+ return False
+
+funcs = [t for t in things.itervalues() if t.kind==Thing.FUNCTION and is_relevant(t)]
+funcs.sort(key=(lambda f: f.name))
+enums = [e for e in enums if is_relevant(e)]
+enums.sort(key=(lambda e: e.value))
+
+for t in itertools.chain(funcs, enums):
+ if not ver:
+ ver = t.version
+
+ # Things in backport extensions don't acquire an extension suffix
+ if t.extension and not t.name.endswith(exttype):
+ backport_ext = t.extension
+
+for f in funcs:
+ if f.source:
+ # Typedefs for early core functions are not available in all
+ # implementations
+ f.typedef = "PFN%sPROC"%f.source.name.upper()
+ else:
+ f.typedef = "PFN%sPROC"%f.name.upper()
+
+if ver:
+ ver = map(int, ver.split('.'))
+
+### Output ###
+
+out = file(out_base+".h", "w")