X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=scripts%2Fextgen.py;h=ec57e2efb912fd9287185d7d5f0ab5bd9aa8609c;hb=89d3d10b75a42f86b224feb00b20283af66c0b01;hp=0bf6bd67aa19ad5bfd96a574c39147063e7e06e1;hpb=5d290d603f88cfd8c60a4305601677988353141f;p=libs%2Fgl.git diff --git a/scripts/extgen.py b/scripts/extgen.py index 0bf6bd67..ec57e2ef 100755 --- a/scripts/extgen.py +++ b/scripts/extgen.py @@ -4,13 +4,14 @@ import sys import os import xml.dom import xml.dom.minidom +import itertools ### Command line processing ### if len(sys.argv)<2: print """Usage: - extgen.py [] [ ...] - extgen.py [] + extgen.py [api] [] [ ...] + extgen.py [api] [] Reads gl.xml and generates files to use . Any promoted functions are exposed with their promoted names. If extensions are given, @@ -22,58 +23,100 @@ absent, the extension's lowercased name is used. Anything after the last dot in is removed and replaced with cpp and h.""" sys.exit(0) -ext = sys.argv[1] +target_api = "gl" + +i = 1 +if sys.argv[i].startswith("gl"): + target_api = sys.argv[i] + i += 1 + +target_ext = sys.argv[i] out_base = None -if ext.endswith(".glext"): - fn = ext - ext = None - ver = None +if target_ext.endswith(".glext"): + fn = target_ext + target_ext = None + core_version = None secondary = [] for line in open(fn): parts = line.split() if parts[0]=="extension": - ext = parts[1] + target_ext = parts[1] elif parts[0]=="core_version": - ver = parts[1] + if parts[1]==target_api: + core_version = parts[2] elif parts[0]=="secondary": secondary.append(parts[1]) - if len(sys.argv)>=3: - out_base = os.path.splitext(sys.argv[2])[0] + if i+178: + print label+unsupported + label = " "*len(label) + unsupported = "" + if unsupported: + unsupported += ", " + unsupported += t.name + if unsupported: + print label+unsupported ### Output ### out = file(out_base+".h", "w") -out.write("#ifndef MSP_GL_%s_\n"%ext.upper()) -out.write("#define MSP_GL_%s_\n"%ext.upper()) +out.write("#ifndef MSP_GL_%s_\n"%target_ext.name.upper()) +out.write("#define MSP_GL_%s_\n"%target_ext.name.upper()) out.write(""" #include @@ -196,14 +380,42 @@ out.write(""" namespace Msp { namespace GL { + """) -if funcs: - out.write("\n") -for f in funcs: - out.write("extern %s %s;\n"%(f.typedef, f.name)) +if funcs or enums: + if funcs: + for f in funcs: + out.write("typedef %s (APIENTRY *%s)(%s);\n"%(f.return_type, f.typedef, ", ".join(f.params))) + out.write("\n") + + if enums: + api_prefix = "GL" + if target_api=="gles2": + api_prefix = "GL_ES" + + enums_by_category = {} + for e in enums: + cat = None + if e.version: + cat = api_prefix+"_VERSION_"+"_".join(map(str, e.version)) + elif e.extension: + cat = "GL_"+e.extension.name + enums_by_category.setdefault(cat, []).append(e) + + for cat in sorted(enums_by_category.keys()): + if cat: + out.write("#ifndef %s\n"%cat) + for e in enums_by_category[cat]: + out.write("#define %s 0x%04X\n"%(e.name, e.value)) + if cat: + out.write("#endif\n") + out.write("\n") + + for f in funcs: + out.write("extern %s %s;\n"%(f.typedef, f.name)) -out.write("\nextern Extension %s;\n"%ext) +out.write("extern Extension %s;\n"%target_ext.name) out.write(""" } // namespace GL @@ -213,41 +425,59 @@ out.write(""" """) out = file(out_base+".cpp", "w") -out.write("#include \"%s.h\"\n"%ext.lower()) +out.write("#include \"%s.h\"\n"%target_ext.name.lower()) + +if funcs: + out.write(""" +#ifdef __APPLE__ +#define GET_PROC_ADDRESS(x) &::x +#else +#define GET_PROC_ADDRESS(x) get_proc_address(#x) +#endif +#ifdef WIN32 +#define GET_PROC_ADDRESS_1_1(x) &::x +#else +#define GET_PROC_ADDRESS_1_1(x) GET_PROC_ADDRESS(x) +#endif +""") out.write(""" namespace Msp { namespace GL { + """) -if funcs: - out.write("\n") for f in funcs: out.write("%s %s = 0;\n"%(f.typedef, f.name)) -out.write("\nExtension::SupportLevel init_%s()\n{\n"%ext.lower()) -if ver: - out.write("\tif(is_version_at_least(%d, %d)"%tuple(ver)) +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)) if backport_ext: - out.write(" || is_supported(\"GL_%s\")"%backport_ext) + out.write(" || is_supported(\"GL_%s\")"%backport_ext.name) out.write(")\n\t{\n") for f in funcs: - out.write("\t\t%s = reinterpret_cast<%s>(get_proc_address(\"%s\"));\n"%(f.name, f.typedef, f.name)) + if target_api in f.supported_apis: + gpa_suffix = "" + if f.version<=[1, 1]: + gpa_suffix = "_1_1" + out.write("\t\t%s = reinterpret_cast<%s>(GET_PROC_ADDRESS%s(%s));\n"%(f.name, f.typedef, gpa_suffix, f.name)) out.write("\t\treturn Extension::CORE;\n") out.write("\t}\n") -if ext!=backport_ext: - out.write("\tif(is_supported(\"GL_%s\"))\n\t{\n"%(ext)) +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: - n = f.name - if f.extfunc: - n = f.extfunc.name - out.write("\t\t%s = reinterpret_cast<%s>(get_proc_address(\"%s\"));\n"%(f.name, f.typedef, n)) + 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)) out.write("\t\treturn Extension::EXTENSION;\n") out.write("\t}\n") out.write("\treturn Extension::UNSUPPORTED;\n") out.write("}\n") -out.write("\nExtension %s(\"GL_%s\", init_%s);\n"%(ext, ext, ext.lower())) +out.write("\nExtension %s(\"GL_%s\", init_%s);\n"%(target_ext.name, target_ext.name, target_ext.name.lower())) out.write(""" } // namespace GL