GenerateGL.java revision 6cbca50b6a438151a6c5f4dbdccc7057c19b73fa
1
2import java.io.BufferedReader;
3import java.io.File;
4import java.io.FileOutputStream;
5import java.io.FileReader;
6import java.io.IOException;
7import java.io.PrintStream;
8
9public class GenerateGL {
10
11    static void copy(String filename, PrintStream out) throws IOException {
12        BufferedReader br = new BufferedReader(new FileReader(filename));
13        String s;
14        while ((s = br.readLine()) != null) {
15            out.println(s);
16        }
17    }
18
19    private static void emit(int version, boolean ext, boolean pack,
20                             CodeEmitter emitter,
21                             BufferedReader specReader,
22                             PrintStream glStream,
23                             PrintStream glImplStream,
24                             PrintStream cStream) throws Exception {
25        String s = null;
26        int counter = 0;
27        while ((s = specReader.readLine()) != null) {
28            if (s.trim().startsWith("//")) {
29                continue;
30            }
31
32            CFunc cfunc = CFunc.parseCFunc(s);
33
34            String fname = cfunc.getName();
35            File f = new File("stubs/" + fname +
36                              ".java-1" + version + "-if");
37            if (f.exists()) {
38                System.out.println("Special-casing function " + fname);
39                copy("stubs/" + fname +
40                     ".java-1" + version + "-if", glStream);
41                copy("stubs/" + fname + ".java-impl", glImplStream);
42                copy("stubs/" + fname + ".cpp", cStream);
43
44                // Register native function names
45                // This should be improved to require fewer discrete files
46                String filename = "stubs/" + fname + ".nativeReg";
47                BufferedReader br =
48                    new BufferedReader(new FileReader(filename));
49                String nfunc;
50                while ((nfunc = br.readLine()) != null) {
51                    emitter.addNativeRegistration(nfunc);
52                }
53            } else {
54                emitter.setVersion(version, ext, pack);
55                emitter.emitCode(cfunc, s);
56            }
57        }
58    }
59
60    public static void main(String[] args) throws Exception {
61        String classPathName = "com/google/android/gles_jni/GLImpl";
62        boolean useContextPointer = true;
63
64        int aidx = 0;
65        while (args[aidx].charAt(0) == '-') {
66            switch (args[aidx].charAt(1)) {
67            case 'c':
68                useContextPointer = false;
69                break;
70
71            default:
72                System.err.println("Unknown flag: " + args[aidx]);
73                System.exit(1);
74            }
75
76            aidx++;
77        }
78
79        System.out.println("useContextPointer = " + useContextPointer);
80
81        BufferedReader spec10Reader =
82            new BufferedReader(new FileReader(args[aidx++]));
83        BufferedReader spec10ExtReader =
84            new BufferedReader(new FileReader(args[aidx++]));
85        BufferedReader spec11Reader =
86            new BufferedReader(new FileReader(args[aidx++]));
87        BufferedReader spec11ExtReader =
88            new BufferedReader(new FileReader(args[aidx++]));
89        BufferedReader spec11ExtPackReader =
90            new BufferedReader(new FileReader(args[aidx++]));
91        BufferedReader checksReader =
92            new BufferedReader(new FileReader(args[aidx++]));
93
94        String gl10Filename = "javax/microedition/khronos/opengles/GL10.java";
95        String gl10ExtFilename =
96            "javax/microedition/khronos/opengles/GL10Ext.java";
97        String gl11Filename = "javax/microedition/khronos/opengles/GL11.java";
98        String gl11ExtFilename =
99            "javax/microedition/khronos/opengles/GL11Ext.java";
100        String gl11ExtPackFilename =
101            "javax/microedition/khronos/opengles/GL11ExtensionPack.java";
102        String glImplFilename = "com/google/android/gles_jni/GLImpl.java";
103        String cFilename = "com_google_android_gles_jni_GLImpl.cpp";
104
105        PrintStream gl10Stream =
106            new PrintStream(new FileOutputStream("out/" + gl10Filename));
107        PrintStream gl10ExtStream =
108            new PrintStream(new FileOutputStream("out/" + gl10ExtFilename));
109        PrintStream gl11Stream =
110            new PrintStream(new FileOutputStream("out/" + gl11Filename));
111        PrintStream gl11ExtStream =
112            new PrintStream(new FileOutputStream("out/" + gl11ExtFilename));
113        PrintStream gl11ExtPackStream =
114            new PrintStream(new FileOutputStream("out/" + gl11ExtPackFilename));
115        PrintStream glImplStream =
116            new PrintStream(new FileOutputStream("out/" + glImplFilename));
117        PrintStream cStream =
118            new PrintStream(new FileOutputStream("out/" + cFilename));
119
120        ParameterChecker checker = new ParameterChecker(checksReader);
121
122        CodeEmitter emitter =
123            new JniCodeEmitter(classPathName,
124                               checker,
125                               gl10Stream, gl10ExtStream,
126                               gl11Stream, gl11ExtStream, gl11ExtPackStream,
127                               glImplStream, cStream,
128                               useContextPointer);
129
130        gl10Stream.println("/* //device/java/android/" + gl10Filename);
131        gl10ExtStream.println("/* //device/java/android/" + gl10ExtFilename);
132        gl11Stream.println("/* //device/java/android/" + gl11Filename);
133        gl11ExtStream.println("/* //device/java/android/" + gl11ExtFilename);
134        gl11ExtPackStream.println("/* //device/java/android/" +
135            gl11ExtPackFilename);
136        glImplStream.println("/* //device/java/android/" + glImplFilename);
137        cStream.println("/* //device/libs/android_runtime/" + cFilename);
138
139        copy("stubs/GL10Header.java-if", gl10Stream);
140        copy("stubs/GL10ExtHeader.java-if", gl10ExtStream);
141        copy("stubs/GL11Header.java-if", gl11Stream);
142        copy("stubs/GL11ExtHeader.java-if", gl11ExtStream);
143        copy("stubs/GL11ExtensionPackHeader.java-if", gl11ExtPackStream);
144        copy("stubs/GLImplHeader.java-impl", glImplStream);
145        copy("stubs/GLCHeader.cpp", cStream);
146
147        emit(0, false, false,
148             emitter, spec10Reader, gl10Stream, glImplStream, cStream);
149        emit(0, true, false,
150             emitter, spec10ExtReader, gl10ExtStream, glImplStream, cStream);
151        emit(1, false, false,
152             emitter, spec11Reader, gl11Stream, glImplStream, cStream);
153        emit(1, true, false,
154             emitter, spec11ExtReader, gl11ExtStream, glImplStream, cStream);
155        emit(1, true, true,
156             emitter, spec11ExtPackReader, gl11ExtPackStream, glImplStream,
157             cStream);
158
159        emitter.emitNativeRegistration();
160
161        gl10Stream.println("}");
162        gl10ExtStream.println("}");
163        gl11Stream.println("}");
164        gl11ExtStream.println("}");
165        gl11ExtPackStream.println("}");
166        glImplStream.println("}");
167    }
168}
169