]> git.tdb.fi Git - libs/gl.git/blobdiff - scripts/extgen.py
Be smarter when detecting the core version of extensions
[libs/gl.git] / scripts / extgen.py
index 0ea8b8ee3c7ac8355b3d85ba1db6a62890bb976e..7526b271d39e72b042598a64fb81c82420f40712 100755 (executable)
@@ -33,6 +33,7 @@ if sys.argv[i].startswith("gl"):
 target_ext = sys.argv[i]
 backport_ext = None
 out_base = None
+ignore_things = []
 if target_ext.endswith(".glext"):
        fn = target_ext
        target_ext = None
@@ -49,6 +50,8 @@ if target_ext.endswith(".glext"):
                        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:
@@ -221,6 +224,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 +325,30 @@ enums = filter(is_relevant, enums)
 enums.sort(key=(lambda e: e.value))
 
 # Some final preparations for creating the files
+core_version_candidates = {}
 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
 
        # 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 backport_ext:
        if backport_ext=="none":
                backport_ext = None
@@ -492,11 +510,21 @@ if core_version:
 if source_ext and source_ext!=backport_ext:
        out.write("\tif(is_supported(\"GL_%s\"))\n\t{\n"%(source_ext.name))
        for f in funcs:
-               s = f
                if f.sources:
-                       s = f.sources[0]
-               if target_api in s.supported_apis:
-                       out.write("\t\t%s = reinterpret_cast<%s>(GET_PROC_ADDRESS(%s));\n"%(f.name, f.typedef, s.name))
+                       src = None
+                       for s in f.sources:
+                               if s.name.endswith(source_ext.ext_type):
+                                       src = s
+                                       break
+                       if not src:
+                               src = f.sources[0]
+               else:
+                       src = f
+
+               if target_api in src.supported_apis:
+                       if not src.name.endswith(source_ext.ext_type):
+                               print "Warning: %s does not match extension type %s"%(src.name, source_ext.ext_type)
+                       out.write("\t\t%s = reinterpret_cast<%s>(GET_PROC_ADDRESS(%s));\n"%(f.name, f.typedef, src.name))
        out.write("\t\treturn Extension::EXTENSION;\n")
        out.write("\t}\n")
 out.write("\treturn Extension::UNSUPPORTED;\n")