1bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root/*
2bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Copyright (C) 2006 The Android Open Source Project
3bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
4bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * you may not use this file except in compliance with the License.
6bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * You may obtain a copy of the License at
7bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
8bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
10bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Unless required by applicable law or agreed to in writing, software
11bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * See the License for the specific language governing permissions and
14bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * limitations under the License.
15bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root */
16412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
17412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichimport java.io.BufferedReader;
18412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichimport java.io.File;
19412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichimport java.io.FileOutputStream;
20412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichimport java.io.FileReader;
21412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichimport java.io.IOException;
22412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichimport java.io.PrintStream;
23412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
24412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevichpublic class GenerateGL {
25412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
26412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    static void copy(String filename, PrintStream out) throws IOException {
27412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        BufferedReader br = new BufferedReader(new FileReader(filename));
28412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        String s;
29412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        while ((s = br.readLine()) != null) {
30412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            out.println(s);
31412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
32412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
33412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
34412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    private static void emit(int version, boolean ext, boolean pack,
35412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                             CodeEmitter emitter,
36412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                             BufferedReader specReader,
37412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                             PrintStream glStream,
38412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                             PrintStream glImplStream,
39412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                             PrintStream cStream) throws Exception {
40412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        String s = null;
41412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        while ((s = specReader.readLine()) != null) {
42412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            if (s.trim().startsWith("//")) {
43412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                continue;
44412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
45412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
46412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            CFunc cfunc = CFunc.parseCFunc(s);
47412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
48412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            String fname = cfunc.getName();
49412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            File f = new File("stubs/jsr239/" + fname +
50412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                              ".java-1" + version + "-if");
51412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            if (f.exists()) {
52412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                System.out.println("Special-casing function " + fname);
53412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                copy("stubs/jsr239/" + fname +
54412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                     ".java-1" + version + "-if", glStream);
55412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                copy("stubs/jsr239/" + fname + ".java-impl", glImplStream);
56412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                copy("stubs/jsr239/" + fname + ".cpp", cStream);
57412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
58412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                // Register native function names
59412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                // This should be improved to require fewer discrete files
60412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                String filename = "stubs/jsr239/" + fname + ".nativeReg";
61412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                BufferedReader br =
62412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                    new BufferedReader(new FileReader(filename));
63412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                String nfunc;
64412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                while ((nfunc = br.readLine()) != null) {
65412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                    emitter.addNativeRegistration(nfunc);
66412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                }
67412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            } else {
68412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                emitter.setVersion(version, ext, pack);
69412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                emitter.emitCode(cfunc, s);
70412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
71412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
72412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
73412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
74412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public static void main(String[] args) throws Exception {
75412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        String classPathName = "com/google/android/gles_jni/GLImpl";
76412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        boolean useContextPointer = true;
77412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
78412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        int aidx = 0;
79412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        while (args[aidx].charAt(0) == '-') {
80412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            switch (args[aidx].charAt(1)) {
81412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            case 'c':
82412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                useContextPointer = false;
83412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                break;
84412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
85412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            default:
86412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                System.err.println("Unknown flag: " + args[aidx]);
87412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                System.exit(1);
88412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
89412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
90412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            aidx++;
91412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
92412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
93412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        System.out.println("useContextPointer = " + useContextPointer);
94412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
95412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        BufferedReader spec10Reader =
96412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new BufferedReader(new FileReader(args[aidx++]));
97412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        BufferedReader spec10ExtReader =
98412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new BufferedReader(new FileReader(args[aidx++]));
99412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        BufferedReader spec11Reader =
100412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new BufferedReader(new FileReader(args[aidx++]));
101412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        BufferedReader spec11ExtReader =
102412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new BufferedReader(new FileReader(args[aidx++]));
103412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        BufferedReader spec11ExtPackReader =
104412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new BufferedReader(new FileReader(args[aidx++]));
105412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        BufferedReader checksReader =
106412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new BufferedReader(new FileReader(args[aidx++]));
107412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
108412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        String gl10Filename = "javax/microedition/khronos/opengles/GL10.java";
109412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        String gl10ExtFilename =
110412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            "javax/microedition/khronos/opengles/GL10Ext.java";
111412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        String gl11Filename = "javax/microedition/khronos/opengles/GL11.java";
112412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        String gl11ExtFilename =
113412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            "javax/microedition/khronos/opengles/GL11Ext.java";
114412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        String gl11ExtPackFilename =
115412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            "javax/microedition/khronos/opengles/GL11ExtensionPack.java";
116412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        String glImplFilename = "com/google/android/gles_jni/GLImpl.java";
117412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        String cFilename = "com_google_android_gles_jni_GLImpl.cpp";
118412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
119412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        PrintStream gl10Stream =
120412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new PrintStream(new FileOutputStream("out/" + gl10Filename));
121412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        PrintStream gl10ExtStream =
122412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new PrintStream(new FileOutputStream("out/" + gl10ExtFilename));
123412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        PrintStream gl11Stream =
124412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new PrintStream(new FileOutputStream("out/" + gl11Filename));
125412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        PrintStream gl11ExtStream =
126412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new PrintStream(new FileOutputStream("out/" + gl11ExtFilename));
127412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        PrintStream gl11ExtPackStream =
128412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new PrintStream(new FileOutputStream("out/" + gl11ExtPackFilename));
129412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        PrintStream glImplStream =
130412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new PrintStream(new FileOutputStream("out/" + glImplFilename));
131412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        PrintStream cStream =
132412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new PrintStream(new FileOutputStream("out/" + cFilename));
133412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
134412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        ParameterChecker checker = new ParameterChecker(checksReader);
135412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
136412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        CodeEmitter emitter =
137412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new Jsr239CodeEmitter(classPathName,
138412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                               checker,
139412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                               gl10Stream, gl10ExtStream,
140412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                               gl11Stream, gl11ExtStream, gl11ExtPackStream,
141412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                               glImplStream, cStream,
142412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                               useContextPointer);
143412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
144412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        gl10Stream.println("/* //device/java/android/" + gl10Filename);
145412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        gl10ExtStream.println("/* //device/java/android/" + gl10ExtFilename);
146412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        gl11Stream.println("/* //device/java/android/" + gl11Filename);
147412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        gl11ExtStream.println("/* //device/java/android/" + gl11ExtFilename);
148412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        gl11ExtPackStream.println("/* //device/java/android/" +
149412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            gl11ExtPackFilename);
150412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        glImplStream.println("/* //device/java/android/" + glImplFilename);
151412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        cStream.println("/* //device/libs/android_runtime/" + cFilename);
152412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
153412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        copy("stubs/jsr239/GL10Header.java-if", gl10Stream);
154412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        copy("stubs/jsr239/GL10ExtHeader.java-if", gl10ExtStream);
155412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        copy("stubs/jsr239/GL11Header.java-if", gl11Stream);
156412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        copy("stubs/jsr239/GL11ExtHeader.java-if", gl11ExtStream);
157412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        copy("stubs/jsr239/GL11ExtensionPackHeader.java-if", gl11ExtPackStream);
158412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        copy("stubs/jsr239/GLImplHeader.java-impl", glImplStream);
159412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        copy("stubs/jsr239/GLCHeader.cpp", cStream);
160412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
161412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        emit(0, false, false,
162412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich             emitter, spec10Reader, gl10Stream, glImplStream, cStream);
163412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        emit(0, true, false,
164412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich             emitter, spec10ExtReader, gl10ExtStream, glImplStream, cStream);
165412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        emit(1, false, false,
166412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich             emitter, spec11Reader, gl11Stream, glImplStream, cStream);
167412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        emit(1, true, false,
168412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich             emitter, spec11ExtReader, gl11ExtStream, glImplStream, cStream);
169412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        emit(1, true, true,
170412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich             emitter, spec11ExtPackReader, gl11ExtPackStream, glImplStream,
171412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich             cStream);
172412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
173412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        emitter.emitNativeRegistration();
174412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
175412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        gl10Stream.println("}");
176412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        gl10ExtStream.println("}");
177412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        gl11Stream.println("}");
178412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        gl11ExtStream.println("}");
179412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        gl11ExtPackStream.println("}");
180412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        glImplStream.println("}");
181412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
182412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich}
183