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