8 extgen.py <extension> [<version>] [<secondary> ...]"
10 Reads gl.spec and generates files to use <extension>. Any promoted functions
11 are exposed with their promoted names. If <secondary> extensions are given,
12 any promoted functions from those are pulled in as well. <version> can be
13 given to override the version where <extension> was promoted to core."""
18 if ext.endswith(".glext"):
25 if parts[0]=="extension":
27 elif parts[0]=="core_version":
29 elif parts[0]=="secondary":
30 secondary.append(parts[1])
32 out_base = os.path.splitext(sys.argv[2])[0]
34 secondary = sys.argv[2:]
36 if secondary and secondary[0][0].isdigit():
37 ver = secondary.pop(0)
39 exttype = ext.split('_')[0]
43 out_base = ext.lower()
46 def __init__(self, name):
51 self.vectorequiv = None
60 if line[0]=='#' or line.find(':')>=0:
65 if parts[0]=="category":
66 cur_func.category = parts[1]
67 elif parts[0]=="vectorequiv":
68 cur_func.vectorequiv = parts[1]
69 elif parts[0]=="alias":
70 cur_func.aliases.append(parts[1])
71 elif parts[0]=="version":
72 cur_func.version = parts[1]
73 elif parts[0]=="delete":
74 del funcs[cur_func.name]
77 paren = line.find('(')
81 cur_func = funcs[name]
83 cur_func = Function(name)
84 funcs[name] = cur_func
87 parse_file("gl.spec.fixes")
89 for f in funcs.itervalues():
90 if f.category==ext or f.category in secondary:
91 if not f.aliases and f.vectorequiv:
92 for g in funcs.itervalues():
93 if g!=f and g.vectorequiv==f.vectorequiv and f.name.startswith(g.name):
94 f.aliases.append(g.name)
102 if f.category==ext and not f.aliases:
106 if e.category==ext or e.category in secondary:
110 funcs = [f for f in funcs.itervalues() if is_relevant(f)]
111 funcs.sort(key=(lambda f: f.name))
115 f.typedef = "PFNGL%sPROC"%f.extfunc.name.upper()
118 if not f.category.startswith("VERSION_"):
121 f.typedef = "PFNGL%sPROC"%f.name.upper()
122 if not f.name.endswith(exttype):
126 ver = map(int, ver.split('.'))
128 out = file(out_base+".h", "w")
129 out.write("#ifndef MSP_GL_%s_\n"%ext.upper())
130 out.write("#define MSP_GL_%s_\n"%ext.upper())
133 #include <msp/gl/extension.h>
134 #include <msp/gl/gl.h>
143 out.write("extern %s gl%s;\n"%(f.typedef, f.name))
145 out.write("\nextern Extension %s;\n"%ext)
154 out = file(out_base+".cpp", "w")
155 out.write("#include \"%s.h\"\n"%ext.lower())
165 out.write("%s gl%s = 0;\n"%(f.typedef, f.name))
167 out.write("\nExtension::SupportLevel init_%s()\n{\n"%ext.lower())
169 out.write("\tif(is_version_at_least(%d, %d)"%tuple(ver))
171 out.write(" || is_supported(\"GL_%s\")"%bp_ext)
172 out.write(")\n\t{\n")
174 out.write("\t\tgl%s = reinterpret_cast<%s>(get_proc_address(\"gl%s\"));\n"%(f.name, f.typedef, f.name))
175 out.write("\t\treturn Extension::CORE;\n")
178 out.write("\tif(is_supported(\"GL_%s\"))\n\t{\n"%(ext))
183 out.write("\t\tgl%s = reinterpret_cast<%s>(get_proc_address(\"gl%s\"));\n"%(f.name, f.typedef, n))
184 out.write("\t\treturn Extension::EXTENSION;\n")
186 out.write("\treturn Extension::UNSUPPORTED;\n")
189 out.write("\nExtension %s(\"GL_%s\", init_%s);\n"%(ext, ext, ext.lower()))