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