10 for line in open("gl.tm"):
13 parts = [p.strip() for p in line.split(',')]
14 typemap[parts[0]] = parts[3]
15 typemap["void"] = "void"
17 def getparam(func, name):
24 for line in open("gl.spec"):
25 if line[0]=='#' or line.find(':')>=0:
27 elif line[0]=='\t' and cur_func:
29 if parts[0]=="return":
30 cur_func[1] = typemap[parts[1]]
31 elif parts[0]=="param":
32 p = getparam(cur_func, parts[1])
34 p[1] = typemap[parts[2]]
47 paren = line.find('(')
49 cparen = line.rfind(')')
51 args = line[paren+1:cparen].split(", ")
54 cur_func = [line[:paren], None, [[a, None, None, 0] for a in args]]
55 funcs.append(cur_func)
57 fmtmap = {"GLenum":"%#x",
71 "const GLubyte *":"%s",
83 iomap = {"GLenum":"int",
97 "const GLubyte *":"string",
99 "GLcharARB *":"string",
102 "GLsizeiptrARB":"int",
107 "GLuint64EXT":"longlong"}
109 def basetype(type, is_array):
110 if type.startswith("const "):
112 if is_array and type.endswith(" *"):
116 def compsize(func, size, ptype):
122 for c in size.split('/'):
123 p = getparam(func, c)
131 if cn.endswith(("EXT", "ARB", "SGI", "IBM", "ATI")):
133 elif cn.endswith("SGIX"):
135 elif cn.endswith(("NV", "HP")):
137 if cn.endswith("Type"):
138 res += "typesize(%s)"%p[0]
140 elif cn.endswith("Format"):
141 res += "formatsize(%s)"%p[0]
142 elif cn.endswith(("Parameter", "ParameterPName", "ParameterName")) or cn=="GetPName":
143 res += "paramsize(%s)"%p[0]
144 elif cn=="MapTarget":
145 res += "mapsize(%s)"%p[0]
146 elif (cn=="SizeI" or cn.endswith("Int32")) and p[3]==0:
151 res += "*sizeof(%s)"%ptype
155 ptype = basetype(param[1], param[3]!=0)
157 if type(param[3])==int:
158 return ("{%s}"%(", ".join([fmtmap[ptype]]*param[3])), ", ".join("%s[%d]"%(param[0], i) for i in range(param[3])))
160 return ("%p", param[0])
162 return (fmtmap[ptype], param[0])
164 def getwrite(func, param):
165 ptype = basetype(param[1], param[3]!=0)
167 if type(param[3])==int:
168 size = "%d*sizeof(%s)"%(param[3], ptype)
169 elif param[3].startswith("COMPSIZE("):
170 size = compsize(func, param[3][9:-1], ptype)
172 print "Compsize '%s' for function '%s' failed"%(param[3][9:-1], func[0])
173 return ("pointer", None)
174 elif param[3]=="~" and (param[2]=="charARB" or param[2]=="Char"):
175 return ("string", None)
177 s = getparam(func, param[3].split('*')[0])
178 if s and (s[2]=="SizeI" or s[2].endswith("Int32")) and s[3]==0:
179 size = "%s*sizeof(%s)"%(param[3], ptype)
180 if func[0].startswith("Uniform") and func[0][8]!='u' and func[0][7].isdigit():
181 size += "*%s"%func[0][7]
183 print "Could not determine size for array parameter '%s[%s]' of function '%s'"%(param[0], param[3], func[0])
184 return ("pointer", None)
185 return ("data", size)
187 return (iomap[ptype], None)
189 def getread(func, param):
190 ptype = basetype(param[1], param[3]!=0)
192 return ("data", "(const void **)")
194 return (iomap[ptype], "")
196 # Write out function enums
198 out = open(os.path.join(outdir, "functions.enum"), "w");
199 out.write("""enum Function
204 out.write("\tFUNC_%s,\n"%f[0].upper())
208 # Write out wrapper functions for transmitting side
210 out = open(os.path.join(outdir, "glwrap.funcs"), "w");
212 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])))
214 out.write("\tstatic %s (*orig)(%s) = NULL;\n"%(f[1], ", ".join(p[1] for p in f[2])))
216 out.write("\t%s ret;\n"%f[1])
217 out.write("\tif(!orig)\n\t\torig = glsym(\"gl%s\");\n"%f[0])
222 out.write("orig(%s);\n"%(", ".join(p[0] for p in f[2])))
224 out.write("\tbegin_packet(FUNC_%s);\n"%f[0].upper())
226 out.write("\twrite_%s(ret);\n"%iomap[f[1]])
228 (t, s) = getwrite(f, p)
229 out.write("\twrite_%s(%s"%(t, p[0]))
233 out.write("\tsend_packet();\n")
236 out.write("\treturn ret;\n")
240 # Write out decoder stuff
242 out = open(os.path.join(outdir, "gldecoder.struct"), "w")
243 out.write("typedef struct sGlDecoder\n{\n")
244 out.write("\tvoid *user_data;\n")
245 out.write("\tvoid (*destroy)(void *);\n")
247 out.write("\tvoid (*%s)(void *"%f[0])
249 out.write(", %s"%f[1])
251 out.write(", %s"%(", ".join(p[1] for p in f[2])))
253 out.write("} GlDecoder;\n")
255 out = open(os.path.join(outdir, "gldecoder.funcs"), "w")
257 out.write("static unsigned decode_%s(GlDecoder *dec, const char *data)\n{\n"%(f[0]))
258 out.write("\tunsigned pos = 0;\n")
260 out.write("\t%s ret;\n"%f[1])
262 out.write("\t%s arg_%s;\n"%(p[1], p[0]))
264 out.write("\tpos += read_%s(&ret, data+pos);\n"%iomap[f[1]])
266 (t, c) = getread(f, p)
267 out.write("\tpos += read_%s(%s&arg_%s, data+pos);\n"%(t, c, p[0]))
268 out.write("\tif(dec->%s)\n"%f[0])
269 out.write("\t\tdec->%s(dec->user_data"%f[0])
273 out.write(", %s"%(", ".join("arg_"+p[0] for p in f[2])))
275 out.write("\treturn pos;\n")
278 out.write("""static int decode_func(GlDecoder *dec, short func, const char *data)
284 out.write("\t\tcase FUNC_%s: return decode_%s(dec, data);\n"%(f[0].upper(), f[0]))
292 # Write out print stuff
294 out = open(os.path.join(outdir, "glprint.funcs"), "w")
296 out.write("static void print_%s(void *user_data"%f[0])
298 out.write(", %s ret"%f[1])
300 out.write(", %s"%(", ".join("%s %s"%(p[1], p[0]) for p in f[2])))
302 out.write("\tGlPrintData *gpd = (GlPrintData *)user_data;\n")
304 m = [getfmt(p) for p in f[2]]
305 out.write("\tsnprintf(gpd->buffer, gpd->bufsize, \"%s(%s)"%(f[0], ", ".join(p[0] for p in m)))
307 out.write(" = %s"%fmtmap[f[1]])
310 out.write(", %s"%(", ".join(p[1] for p in m)))
317 out.write("static void init_print(GlDecoder *dec)\n{\n")
319 out.write("\tdec->%s = print_%s;\n"%(f[0], f[0]))