1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17import java.io.BufferedReader;
18import java.io.File;
19import java.io.FileOutputStream;
20import java.io.FileReader;
21import java.io.IOException;
22import java.io.PrintStream;
23
24public class GenerateGL {
25
26    static void copy(String filename, PrintStream out) throws IOException {
27        BufferedReader br = new BufferedReader(new FileReader(filename));
28        String s;
29        while ((s = br.readLine()) != null) {
30            out.println(s);
31        }
32    }
33
34    private static void emit(int version, boolean ext, boolean pack,
35                             CodeEmitter emitter,
36                             BufferedReader specReader,
37                             PrintStream glStream,
38                             PrintStream glImplStream,
39                             PrintStream cStream) throws Exception {
40        String s = null;
41        while ((s = specReader.readLine()) != null) {
42            if (s.trim().startsWith("//")) {
43                continue;
44            }
45
46            CFunc cfunc = CFunc.parseCFunc(s);
47
48            String fname = cfunc.getName();
49            File f = new File("stubs/jsr239/" + fname +
50                              ".java-1" + version + "-if");
51            if (f.exists()) {
52                System.out.println("Special-casing function " + fname);
53                copy("stubs/jsr239/" + fname +
54                     ".java-1" + version + "-if", glStream);
55                copy("stubs/jsr239/" + fname + ".java-impl", glImplStream);
56                copy("stubs/jsr239/" + fname + ".cpp", cStream);
57
58                // Register native function names
59                // This should be improved to require fewer discrete files
60                String filename = "stubs/jsr239/" + fname + ".nativeReg";
61                BufferedReader br =
62                    new BufferedReader(new FileReader(filename));
63                String nfunc;
64                while ((nfunc = br.readLine()) != null) {
65                    emitter.addNativeRegistration(nfunc);
66                }
67            } else {
68                emitter.setVersion(version, ext, pack);
69                emitter.emitCode(cfunc, s);
70            }
71        }
72    }
73
74    public static void main(String[] args) throws Exception {
75        String classPathName = "com/google/android/gles_jni/GLImpl";
76        boolean useContextPointer = true;
77
78        int aidx = 0;
79        while (args[aidx].charAt(0) == '-') {
80            switch (args[aidx].charAt(1)) {
81            case 'c':
82                useContextPointer = false;
83                break;
84
85            default:
86                System.err.println("Unknown flag: " + args[aidx]);
87                System.exit(1);
88            }
89
90            aidx++;
91        }
92
93        System.out.println("useContextPointer = " + useContextPointer);
94
95        BufferedReader spec10Reader =
96            new BufferedReader(new FileReader(args[aidx++]));
97        BufferedReader spec10ExtReader =
98            new BufferedReader(new FileReader(args[aidx++]));
99        BufferedReader spec11Reader =
100            new BufferedReader(new FileReader(args[aidx++]));
101        BufferedReader spec11ExtReader =
102            new BufferedReader(new FileReader(args[aidx++]));
103        BufferedReader spec11ExtPackReader =
104            new BufferedReader(new FileReader(args[aidx++]));
105        BufferedReader checksReader =
106            new BufferedReader(new FileReader(args[aidx++]));
107
108        String gl10Filename = "javax/microedition/khronos/opengles/GL10.java";
109        String gl10ExtFilename =
110            "javax/microedition/khronos/opengles/GL10Ext.java";
111        String gl11Filename = "javax/microedition/khronos/opengles/GL11.java";
112        String gl11ExtFilename =
113            "javax/microedition/khronos/opengles/GL11Ext.java";
114        String gl11ExtPackFilename =
115            "javax/microedition/khronos/opengles/GL11ExtensionPack.java";
116        String glImplFilename = "com/google/android/gles_jni/GLImpl.java";
117        String cFilename = "com_google_android_gles_jni_GLImpl.cpp";
118
119        PrintStream gl10Stream =
120            new PrintStream(new FileOutputStream("out/" + gl10Filename));
121        PrintStream gl10ExtStream =
122            new PrintStream(new FileOutputStream("out/" + gl10ExtFilename));
123        PrintStream gl11Stream =
124            new PrintStream(new FileOutputStream("out/" + gl11Filename));
125        PrintStream gl11ExtStream =
126            new PrintStream(new FileOutputStream("out/" + gl11ExtFilename));
127        PrintStream gl11ExtPackStream =
128            new PrintStream(new FileOutputStream("out/" + gl11ExtPackFilename));
129        PrintStream glImplStream =
130            new PrintStream(new FileOutputStream("out/" + glImplFilename));
131        PrintStream cStream =
132            new PrintStream(new FileOutputStream("out/" + cFilename));
133
134        ParameterChecker checker = new ParameterChecker(checksReader);
135
136        CodeEmitter emitter =
137            new Jsr239CodeEmitter(classPathName,
138                               checker,
139                               gl10Stream, gl10ExtStream,
140                               gl11Stream, gl11ExtStream, gl11ExtPackStream,
141                               glImplStream, cStream,
142                               useContextPointer);
143
144        gl10Stream.println("/* //device/java/android/" + gl10Filename);
145        gl10ExtStream.println("/* //device/java/android/" + gl10ExtFilename);
146        gl11Stream.println("/* //device/java/android/" + gl11Filename);
147        gl11ExtStream.println("/* //device/java/android/" + gl11ExtFilename);
148        gl11ExtPackStream.println("/* //device/java/android/" +
149            gl11ExtPackFilename);
150        glImplStream.println("/* //device/java/android/" + glImplFilename);
151        cStream.println("/* //device/libs/android_runtime/" + cFilename);
152
153        copy("stubs/jsr239/GL10Header.java-if", gl10Stream);
154        copy("stubs/jsr239/GL10ExtHeader.java-if", gl10ExtStream);
155        copy("stubs/jsr239/GL11Header.java-if", gl11Stream);
156        copy("stubs/jsr239/GL11ExtHeader.java-if", gl11ExtStream);
157        copy("stubs/jsr239/GL11ExtensionPackHeader.java-if", gl11ExtPackStream);
158        copy("stubs/jsr239/GLImplHeader.java-impl", glImplStream);
159        copy("stubs/jsr239/GLCHeader.cpp", cStream);
160
161        emit(0, false, false,
162             emitter, spec10Reader, gl10Stream, glImplStream, cStream);
163        emit(0, true, false,
164             emitter, spec10ExtReader, gl10ExtStream, glImplStream, cStream);
165        emit(1, false, false,
166             emitter, spec11Reader, gl11Stream, glImplStream, cStream);
167        emit(1, true, false,
168             emitter, spec11ExtReader, gl11ExtStream, glImplStream, cStream);
169        emit(1, true, true,
170             emitter, spec11ExtPackReader, gl11ExtPackStream, glImplStream,
171             cStream);
172
173        emitter.emitNativeRegistration();
174
175        gl10Stream.println("}");
176        gl10ExtStream.println("}");
177        gl11Stream.println("}");
178        gl11ExtStream.println("}");
179        gl11ExtPackStream.println("}");
180        glImplStream.println("}");
181    }
182}
183