X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=genwrap.py;h=c388f7c2856243549201cfad75d32ee276ada26d;hb=c6b2f7585d51164dc32f4dd2a05855913e464c58;hp=35e343952c26f8f7be422e235b66cb1b145e1771;hpb=9d1825d591a7261b1cff620ba535d333352984bf;p=gldbg.git diff --git a/genwrap.py b/genwrap.py index 35e3439..c388f7c 100755 --- a/genwrap.py +++ b/genwrap.py @@ -39,7 +39,7 @@ for line in open("gl.spec"): s = parts[5][1:-1] if s.isdigit(): p[3] = int(s) - elif s=="": + elif s=="" or (len(parts)>=7 and parts[6]=="retained"): p[3] = "~" else: p[3] = s @@ -64,18 +64,18 @@ fmtmap = {"GLenum":"%#x", "GLushort":"%u", "GLuint":"%u", "GLsizei":"%i", - "GLfloat":"%f", - "GLclampf":"%f", - "GLdouble":"%lf", - "GLclampd":"%lf", + "GLfloat":"%g", + "GLclampf":"%g", + "GLdouble":"%lg", + "GLclampd":"%lg", "const GLubyte *":"%s", "GLchar *":"%s", "GLcharARB *":"%s", "GLvoid*":"%p", - "GLsizeiptr":"%p", - "GLsizeiptrARB":"%p", - "GLintptr":"%p", - "GLintptrARB":"%p", + "GLsizeiptr":"%d", + "GLsizeiptrARB":"%d", + "GLintptr":"%d", + "GLintptrARB":"%d", "GLhandleARB":"%i", "GLhalfNV":"%#x", "GLuint64EXT":"%lld"} @@ -161,7 +161,7 @@ def getfmt(param): else: return (fmtmap[ptype], param[0]) -def getwrite(func, param): +def getrwinfo(func, param): ptype = basetype(param[1], param[3]!=0) if param[3]: if type(param[3])==int: @@ -170,28 +170,24 @@ def getwrite(func, param): size = compsize(func, param[3][9:-1], ptype) if not size: print "Compsize '%s' for function '%s' failed"%(param[3][9:-1], func[0]) - return ("pointer", None) - elif param[3]=="~" and (param[2]=="charARB" or param[2]=="Char"): - return ("string", None) + return ("pointer", None, "void **") + elif param[3]=="~": + if param[2]=="charARB" or param[2]=="Char": + return ("string", None, "const unsigned char **") + else: + return ("pointer", None, "void **") else: s = getparam(func, param[3].split('*')[0]) - if s and (s[2]=="SizeI" or s[2].endswith("Int32")) and s[3]==0: + if s and (s[2]=="SizeI" or s[2].endswith("Int32") or s[2].startswith("BufferSize")) and s[3]==0: size = "%s*sizeof(%s)"%(param[3], ptype) if func[0].startswith("Uniform") and func[0][8]!='u' and func[0][7].isdigit(): size += "*%s"%func[0][7] else: print "Could not determine size for array parameter '%s[%s]' of function '%s'"%(param[0], param[3], func[0]) - return ("pointer", None) - return ("data", size) + return ("pointer", None, "void **") + return ("data", size, "const void **") else: - return (iomap[ptype], None) - -def getread(func, param): - ptype = basetype(param[1], param[3]!=0) - if param[3]: - return ("data", "(const void **)") - else: - return (iomap[ptype], "") + return (iomap[ptype], None, None) # Write out function enums @@ -207,9 +203,9 @@ out.close() # Write out wrapper functions for transmitting side -out = open(os.path.join(outdir, "glwrap.funcs"), "w"); +out = open(os.path.join(outdir, "glwrap.funcs"), "w") for f in funcs: - out.write("%s GLAPIENTRY gl%s(%s)\n{\n"%(f[1], f[0], ", ".join("%s %s"%(p[1], p[0]) for p in f[2]))) + out.write("%s APIENTRY gl%s(%s)\n{\n"%(f[1], f[0], ", ".join("%s %s"%(p[1], p[0]) for p in f[2]))) out.write("\tstatic %s (*orig)(%s) = NULL;\n"%(f[1], ", ".join(p[1] for p in f[2]))) if f[1]!="void": @@ -225,7 +221,7 @@ for f in funcs: if f[1]!="void": out.write("\twrite_%s(ret);\n"%iomap[f[1]]) for p in f[2]: - (t, s) = getwrite(f, p) + (t, s, c) = getrwinfo(f, p) out.write("\twrite_%s(%s"%(t, p[0])) if s: out.write(", %s"%s) @@ -254,17 +250,21 @@ out.write("} GlDecoder;\n") out = open(os.path.join(outdir, "gldecoder.funcs"), "w") for f in funcs: - out.write("static unsigned decode_%s(GlDecoder *dec, const char *data, unsigned len)\n{\n"%(f[0])) + out.write("static unsigned decode_%s(GlDecoder *dec, const char *data)\n{\n"%(f[0])) out.write("\tunsigned pos = 0;\n") if f[1]!="void": out.write("\t%s ret;\n"%f[1]) for p in f[2]: out.write("\t%s arg_%s;\n"%(p[1], p[0])) if f[1]!="void": - out.write("\tpos += read_%s(&ret, data+pos, len);\n"%iomap[f[1]]) + out.write("\tpos += read_%s(&ret, data+pos);\n"%iomap[f[1]]) for p in f[2]: - (t, c) = getread(f, p) - out.write("\tpos += read_%s(%s&arg_%s, data+pos, len-pos);\n"%(t, c, p[0])) + (t, s, c) = getrwinfo(f, p) + if c: + c="(%s)"%c + else: + c="" + out.write("\tpos += read_%s(%s&arg_%s, data+pos);\n"%(t, c, p[0])) out.write("\tif(dec->%s)\n"%f[0]) out.write("\t\tdec->%s(dec->user_data"%f[0]) if f[1]!="void": @@ -275,20 +275,16 @@ for f in funcs: out.write("\treturn pos;\n") out.write("}\n\n") -out.write("""unsigned gldecoder_decode(GlDecoder *dec, const char *data, unsigned len) +out.write("""static int decode_func(GlDecoder *dec, short func, const char *data) { - unsigned pos = 0; - short func; - - pos += read_short(&func, data, len); switch(func) { """) for f in funcs: - out.write("\t\tcase FUNC_%s: pos += decode_%s(dec, data+pos, len); break;\n"%(f[0].upper(), f[0])) + out.write("\t\tcase FUNC_%s: return decode_%s(dec, data);\n"%(f[0].upper(), f[0])) out.write(""" } - return pos; + return -1; } """) out.close()