- if profile!="core" and name in things:
- del things[name]
-
-def parse_extension(ext):
- ext_name = ext.getAttribute("name")
- if ext_name.startswith("GL_"):
- ext_name = ext_name[3:]
-
- supported = ext.getAttribute("supported").split('|')
- if target_api not in supported and ext_name!=target_ext:
- return
-
- extension = extensions.get(ext_name)
- if not extension:
- extension = Extension(ext_name)
- extensions[ext_name] = extension
-
- extension.supported_apis = supported
-
- requires = get_nested_elements(ext, "require")
- for req in requires:
- api = req.getAttribute("api")
- if api:
- supported = [api]
- else:
- supported = extension.supported_apis
-
- commands = get_nested_elements(req, "command")
- enums = get_nested_elements(req, "enum")
- for t in itertools.chain(commands, enums):
- name = t.getAttribute("name")
- thing = things.get(name)
- if thing:
- if thing.extension and extension.name!=target_ext:
- if thing.extension.ext_type=="ARB" or thing.extension.name==target_ext:
- continue
- if thing.extension.ext_type=="EXT" and extension.ext_type!="ARB":
- continue
-
- thing.extension = extension
- for a in supported:
- thing.supported_apis.setdefault(a, "ext")
-
-def parse_file(fn):
- doc = xml.dom.minidom.parse(fn)
- root = doc.documentElement
-
- commands = get_nested_elements(root, "commands/command")
- for cmd in commands:
- parse_command(cmd)
-
- enums = get_nested_elements(root, "enums/enum")
- for en in enums:
- parse_enum(en)
-
- features = get_nested_elements(root, "feature")
- for feat in features:
- parse_feature(feat)
-
- extensions = get_nested_elements(root, "extensions/extension")
- for ext in extensions:
- parse_extension(ext)
-
-parse_file("gl.xml")
-parse_file("gl.fixes.xml")
-
-### Additional processing ###
-
-if target_ext in extensions:
- target_ext = extensions[target_ext]
-else:
- print "Extension %s not found"%target_ext
- sys.exit(1)
-
-# Find aliases for enums
-enums = [t for t in things.itervalues() if t.kind==Thing.ENUM]
-core_enums = [e for e in enums if any(v!="ext" for v in e.supported_apis.itervalues())]
-core_enums_by_value = dict((e.value, None) for e in core_enums)
-
-def get_key_api(things):
- common_apis = set(target_ext.supported_apis)
+ thing = self.things.get(name)
+ if thing:
+ if profile!="core":
+ if thing.name in api.core_things:
+ del api.core_things[thing.name]
+ for s in thing.api_support.itervalues():
+ for e in s.extensions:
+ del e.things[thing.name]
+ else:
+ supp = thing.get_or_create_api_support(api.name)
+ supp.deprecated_version = version
+
+ def parse_extension(self, ext):
+ ext_things_by_api = {}
+ requires = get_nested_elements(ext, "require")
+ for req in requires:
+ api = req.getAttribute("api")
+ ext_things = ext_things_by_api.setdefault(api, [])
+
+ commands = get_nested_elements(req, "command")
+ enums = get_nested_elements(req, "enum")
+ for t in itertools.chain(commands, enums):
+ name = t.getAttribute("name")
+ thing = self.things.get(name)
+ if thing:
+ ext_things.append(thing)
+
+ ext_name = ext.getAttribute("name")
+ if ext_name.startswith("GL_"):
+ ext_name = ext_name[3:]
+
+ common_things = ext_things_by_api.get("", [])
+ supported = ext.getAttribute("supported").split('|')
+ for s in supported:
+ api = self.apis.get(s)
+ if not api:
+ continue
+
+ ext = get_or_create(api.extensions, ext_name, Extension, api)
+ api_things = ext_things_by_api.get(s, [])
+ for t in itertools.chain(common_things, api_things):
+ ext.things[t.name] = t
+ t.get_or_create_api_support(api.name).extensions.append(ext)
+
+ def parse_file(self, fn):
+ doc = xml.dom.minidom.parse(fn)
+ root = doc.documentElement
+
+ commands = get_nested_elements(root, "commands/command")
+ for cmd in commands:
+ self.parse_command(cmd)
+
+ enums = get_nested_elements(root, "enums/enum")
+ for en in enums:
+ self.parse_enum(en)
+
+ features = get_nested_elements(root, "feature")
+ for feat in features:
+ self.parse_feature(feat)
+
+ extensions = get_nested_elements(root, "extensions/extension")
+ for ext in extensions:
+ self.parse_extension(ext)
+
+ def check_backport_extensions(self, api):
+ for e in api.extensions.itervalues():
+ e.backport = True
+ for t in e.things.itervalues():
+ if t.name.endswith(e.ext_type):
+ e.backport = False
+ break
+
+ def resolve_enum_aliases(self, api):
+ core_enums = filter((lambda t: t.kind==Thing.ENUM), api.core_things.itervalues())
+ core_enums_by_value = dict((e.value, None) for e in core_enums)
+
+ for e in api.extensions.itervalues():
+ ext_enums = filter((lambda t: t.kind==Thing.ENUM), e.things.itervalues())
+ enum_suffix = "_"+e.ext_type
+ for n in ext_enums:
+ if n.api_support[api.name].core_version:
+ continue
+
+ name = n.name
+ if name.endswith(enum_suffix):
+ name = name[:-len(enum_suffix)]
+ ce = api.core_things.get(name)
+ if not ce and n.value in core_enums_by_value:
+ if core_enums_by_value[n.value] is None:
+ core_enums_by_value[n.value] = filter((lambda e: e.value==n.value), core_enums)
+ for c in core_enums_by_value[n.value]:
+ if c.bitmask==n.bitmask:
+ ce = c
+ break
+ if ce and ce.value==n.value and ce.name not in n.aliases:
+ n.aliases.append(ce.name)
+
+ def resolve_sources(self, api):
+ for e in api.extensions.itervalues():
+ for t in e.things.itervalues():
+ for a in t.aliases:
+ # There are a few cases where a vendor function is aliased to
+ # an EXT or ARB function but those are rare and not relevant for
+ # our use
+ alias = api.core_things.get(a)
+ if alias:
+ sources = alias.api_support[api.name].sources
+ if t not in sources:
+ sources.append(t)
+
+ def sort_extensions(self):
+ for a in self.apis.itervalues():
+ e = a.extensions.get(self.target_ext_name)
+ if e:
+ e.preference = 3
+ for t in self.things.itervalues():
+ for s in t.api_support.itervalues():
+ s.extensions.sort(key=(lambda e: e.preference), reverse=True)
+
+ def finalize(self):
+ for a in self.apis.itervalues():
+ self.check_backport_extensions(a)
+ self.resolve_enum_aliases(a)
+ self.resolve_sources(a)
+ self.sort_extensions()
+
+
+def detect_core_version(host_api, things):
+ candidates = {}