]> git.tdb.fi Git - libs/gl.git/blobdiff - scripts/extgen.py
Detect deprecation versions for extensions
[libs/gl.git] / scripts / extgen.py
index fd239d7077de3344f998bd6ffab84f22007c01ac..e6edd42bf944aad566c811202873282dc730f072 100755 (executable)
@@ -32,7 +32,9 @@ if sys.argv[i].startswith("gl"):
 
 target_ext = sys.argv[i]
 backport_ext = None
+deprecated_version = None
 out_base = None
+ignore_things = []
 if target_ext.endswith(".glext"):
        fn = target_ext
        target_ext = None
@@ -45,10 +47,15 @@ if target_ext.endswith(".glext"):
                elif parts[0]=="core_version":
                        if parts[1]==target_api:
                                core_version = parts[2]
+               elif parts[0]=="deprecated":
+                       if parts[1]==target_api:
+                               deprecated_version = parts[2]
                elif parts[0]=="secondary":
                        secondary.append(parts[1])
                elif parts[0]=="backport":
                        backport_ext = parts[1]
+               elif parts[0]=="ignore":
+                       ignore_things.append(parts[1])
        if i+1<len(sys.argv):
                out_base = os.path.splitext(sys.argv[i+1])[0]
 else:
@@ -62,6 +69,9 @@ ext_type = target_ext.split('_')[0]
 if core_version:
        core_version = map(int, core_version.split('.'))
 
+if deprecated_version:
+       deprecated_version = map(int, deprecated_version.split('.'))
+
 if not out_base:
        out_base = target_ext.lower()
 
@@ -75,8 +85,10 @@ class Thing:
                self.name = name
                self.kind = kind
                self.version = None
+               self.deprecated_version = None
                self.extension = None
                self.supported_apis = {}
+               self.deprecated = {}
                self.aliases = []
                self.sources = []
 
@@ -190,8 +202,11 @@ def parse_feature(feat):
 
                        for t in itertools.chain(commands, enums):
                                name = t.getAttribute("name")
-                               if profile!="core" and name in things:
-                                       del things[name]
+                               if name in things:
+                                       if profile!="core":
+                                               del things[name]
+                                       else:
+                                               things[name].deprecated.setdefault(api, version)
 
 def parse_extension(ext):
        ext_name = ext.getAttribute("name")
@@ -221,6 +236,9 @@ def parse_extension(ext):
                enums = get_nested_elements(req, "enum")
                for t in itertools.chain(commands, enums):
                        name = t.getAttribute("name")
+                       if name in ignore_things:
+                               continue
+
                        thing = things.get(name)
                        if thing:
                                if thing.extension and extension.name!=target_ext:
@@ -319,18 +337,40 @@ enums = filter(is_relevant, enums)
 enums.sort(key=(lambda e: e.value))
 
 # Some final preparations for creating the files
+core_version_candidates = {}
+min_deprecated_version = [999, 0]
 backport_ext_candidates = []
 for t in itertools.chain(funcs, enums):
        if target_api in t.supported_apis and t.supported_apis[target_api]!="ext":
                t.version = t.supported_apis[target_api]
-       if not core_version:
-               core_version = t.version
+               if t.version:
+                       ver_tuple = tuple(t.version)
+                       core_version_candidates[ver_tuple] = core_version_candidates.get(ver_tuple, 0)+1
+
+       if target_api in t.deprecated:
+               t.deprecated_version = t.deprecated[target_api]
+               min_deprecated_version = min(min_deprecated_version, t.deprecated_version)
+       else:
+               min_deprecated_version = None
 
        # Things in backport extensions don't acquire an extension suffix
        if t.extension and not t.name.endswith(ext_type) and target_api in t.supported_apis:
                if t.extension not in backport_ext_candidates:
                        backport_ext_candidates.append(t.extension)
 
+if not core_version and core_version_candidates:
+       core_version_candidates = list((v, k) for k, v in core_version_candidates.items())
+       if len(core_version_candidates)>1:
+               core_version_candidates.sort(reverse=True)
+               if core_version_candidates[1][0]+1>=core_version_candidates[0][0]:
+                       ver0 = core_version_candidates[0][1]
+                       ver1 = core_version_candidates[1][1]
+                       print "Warning: multiple likely core version candidates: %d.%d %d.%d"%(ver0[0], ver0[1], ver1[0], ver1[1])
+       core_version = core_version_candidates[0][1]
+
+if not deprecated_version:
+       deprecated_version = min_deprecated_version
+
 if backport_ext:
        if backport_ext=="none":
                backport_ext = None
@@ -477,7 +517,14 @@ for f in funcs:
 
 out.write("\nExtension::SupportLevel init_%s()\n{\n"%target_ext.name.lower())
 if core_version:
-       out.write("\tif(is_version_at_least(%d, %d)"%tuple(core_version))
+       out.write("\tif(")
+       if deprecated_version and backport_ext:
+               out.write("(")
+       out.write("is_version_at_least(%d, %d)"%tuple(core_version))
+       if deprecated_version:
+               out.write(" && (get_gl_profile()!=CORE_PROFILE || !is_version_at_least(%d, %d))"%tuple(deprecated_version))
+               if backport_ext:
+                       out.write(")")
        if backport_ext:
                out.write(" || is_supported(\"GL_%s\")"%backport_ext.name)
        out.write(")\n\t{\n")