import java.io.*; | |
import java.util.*; | |
public class GenerateGL { | |
static void copy(String filename, PrintStream out) throws IOException { | |
BufferedReader br = new BufferedReader(new FileReader(filename)); | |
String s; | |
while ((s = br.readLine()) != null) { | |
out.println(s); | |
} | |
} | |
private static void emit(int version, boolean ext, boolean pack, | |
CodeEmitter emitter, | |
BufferedReader specReader, | |
PrintStream glStream, | |
PrintStream glImplStream, | |
PrintStream cStream) throws Exception { | |
String s = null; | |
int counter = 0; | |
while ((s = specReader.readLine()) != null) { | |
if (s.trim().startsWith("//")) { | |
continue; | |
} | |
CFunc cfunc = CFunc.parseCFunc(s); | |
String fname = cfunc.getName(); | |
File f = new File("stubs/" + fname + | |
".java-1" + version + "-if"); | |
if (f.exists()) { | |
System.out.println("Special-casing function " + fname); | |
copy("stubs/" + fname + | |
".java-1" + version + "-if", glStream); | |
copy("stubs/" + fname + ".java-impl", glImplStream); | |
copy("stubs/" + fname + ".cpp", cStream); | |
// Register native function names | |
// This should be improved to require fewer discrete files | |
String filename = "stubs/" + fname + ".nativeReg"; | |
BufferedReader br = | |
new BufferedReader(new FileReader(filename)); | |
String nfunc; | |
while ((nfunc = br.readLine()) != null) { | |
emitter.addNativeRegistration(nfunc); | |
} | |
} else { | |
emitter.setVersion(version, ext, pack); | |
emitter.emitCode(cfunc, s); | |
} | |
} | |
} | |
public static void main(String[] args) throws Exception { | |
String classPathName = "com/google/android/gles_jni/GLImpl"; | |
boolean useContextPointer = true; | |
int aidx = 0; | |
while (args[aidx].charAt(0) == '-') { | |
switch (args[aidx].charAt(1)) { | |
case 'c': | |
useContextPointer = false; | |
break; | |
default: | |
System.err.println("Unknown flag: " + args[aidx]); | |
System.exit(1); | |
} | |
aidx++; | |
} | |
System.out.println("useContextPointer = " + useContextPointer); | |
BufferedReader spec10Reader = | |
new BufferedReader(new FileReader(args[aidx++])); | |
BufferedReader spec10ExtReader = | |
new BufferedReader(new FileReader(args[aidx++])); | |
BufferedReader spec11Reader = | |
new BufferedReader(new FileReader(args[aidx++])); | |
BufferedReader spec11ExtReader = | |
new BufferedReader(new FileReader(args[aidx++])); | |
BufferedReader spec11ExtPackReader = | |
new BufferedReader(new FileReader(args[aidx++])); | |
BufferedReader checksReader = | |
new BufferedReader(new FileReader(args[aidx++])); | |
String gl10Filename = "javax/microedition/khronos/opengles/GL10.java"; | |
String gl10ExtFilename = | |
"javax/microedition/khronos/opengles/GL10Ext.java"; | |
String gl11Filename = "javax/microedition/khronos/opengles/GL11.java"; | |
String gl11ExtFilename = | |
"javax/microedition/khronos/opengles/GL11Ext.java"; | |
String gl11ExtPackFilename = | |
"javax/microedition/khronos/opengles/GL11ExtensionPack.java"; | |
String glImplFilename = "com/google/android/gles_jni/GLImpl.java"; | |
String cFilename = "com_google_android_gles_jni_GLImpl.cpp"; | |
PrintStream gl10Stream = | |
new PrintStream(new FileOutputStream("out/" + gl10Filename)); | |
PrintStream gl10ExtStream = | |
new PrintStream(new FileOutputStream("out/" + gl10ExtFilename)); | |
PrintStream gl11Stream = | |
new PrintStream(new FileOutputStream("out/" + gl11Filename)); | |
PrintStream gl11ExtStream = | |
new PrintStream(new FileOutputStream("out/" + gl11ExtFilename)); | |
PrintStream gl11ExtPackStream = | |
new PrintStream(new FileOutputStream("out/" + gl11ExtPackFilename)); | |
PrintStream glImplStream = | |
new PrintStream(new FileOutputStream("out/" + glImplFilename)); | |
PrintStream cStream = | |
new PrintStream(new FileOutputStream("out/" + cFilename)); | |
ParameterChecker checker = new ParameterChecker(checksReader); | |
CodeEmitter emitter = | |
new JniCodeEmitter(classPathName, | |
checker, | |
gl10Stream, gl10ExtStream, | |
gl11Stream, gl11ExtStream, gl11ExtPackStream, | |
glImplStream, cStream, | |
useContextPointer); | |
gl10Stream.println("/* //device/java/android/" + gl10Filename); | |
gl10ExtStream.println("/* //device/java/android/" + gl10ExtFilename); | |
gl11Stream.println("/* //device/java/android/" + gl11Filename); | |
gl11ExtStream.println("/* //device/java/android/" + gl11ExtFilename); | |
gl11ExtPackStream.println("/* //device/java/android/" + | |
gl11ExtPackFilename); | |
glImplStream.println("/* //device/java/android/" + glImplFilename); | |
cStream.println("/* //device/libs/android_runtime/" + cFilename); | |
copy("stubs/GL10Header.java-if", gl10Stream); | |
copy("stubs/GL10ExtHeader.java-if", gl10ExtStream); | |
copy("stubs/GL11Header.java-if", gl11Stream); | |
copy("stubs/GL11ExtHeader.java-if", gl11ExtStream); | |
copy("stubs/GL11ExtensionPackHeader.java-if", gl11ExtPackStream); | |
copy("stubs/GLImplHeader.java-impl", glImplStream); | |
copy("stubs/GLCHeader.cpp", cStream); | |
emit(0, false, false, | |
emitter, spec10Reader, gl10Stream, glImplStream, cStream); | |
emit(0, true, false, | |
emitter, spec10ExtReader, gl10ExtStream, glImplStream, cStream); | |
emit(1, false, false, | |
emitter, spec11Reader, gl11Stream, glImplStream, cStream); | |
emit(1, true, false, | |
emitter, spec11ExtReader, gl11ExtStream, glImplStream, cStream); | |
emit(1, true, true, | |
emitter, spec11ExtPackReader, gl11ExtPackStream, glImplStream, | |
cStream); | |
emitter.emitNativeRegistration(); | |
gl10Stream.println("}"); | |
gl10ExtStream.println("}"); | |
gl11Stream.println("}"); | |
gl11ExtStream.println("}"); | |
gl11ExtPackStream.println("}"); | |
glImplStream.println("}"); | |
} | |
} |