115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2006 The Android Open Source Project
315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License.
615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at
715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software
1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and
1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License.
1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */
161c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
171c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.io.BufferedReader;
181c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.io.File;
191c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.io.FileOutputStream;
201c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.io.FileReader;
211c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.io.IOException;
221c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.io.PrintStream;
231c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
241c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichpublic class GenerateGL {
251c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
261c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    static void copy(String filename, PrintStream out) throws IOException {
271c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        BufferedReader br = new BufferedReader(new FileReader(filename));
281c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        String s;
291c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        while ((s = br.readLine()) != null) {
301c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            out.println(s);
311c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        }
321c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
331c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
341c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    private static void emit(int version, boolean ext, boolean pack,
351c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                             CodeEmitter emitter,
361c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                             BufferedReader specReader,
371c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                             PrintStream glStream,
381c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                             PrintStream glImplStream,
391c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                             PrintStream cStream) throws Exception {
401c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        String s = null;
411c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        while ((s = specReader.readLine()) != null) {
421c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            if (s.trim().startsWith("//")) {
431c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                continue;
441c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            }
451c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
461c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            CFunc cfunc = CFunc.parseCFunc(s);
471c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
481c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            String fname = cfunc.getName();
491c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            File f = new File("stubs/jsr239/" + fname +
501c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                              ".java-1" + version + "-if");
511c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            if (f.exists()) {
521c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                System.out.println("Special-casing function " + fname);
531c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                copy("stubs/jsr239/" + fname +
541c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                     ".java-1" + version + "-if", glStream);
551c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                copy("stubs/jsr239/" + fname + ".java-impl", glImplStream);
561c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                copy("stubs/jsr239/" + fname + ".cpp", cStream);
571c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
581c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                // Register native function names
591c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                // This should be improved to require fewer discrete files
601c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                String filename = "stubs/jsr239/" + fname + ".nativeReg";
611c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                BufferedReader br =
621c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                    new BufferedReader(new FileReader(filename));
631c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                String nfunc;
641c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                while ((nfunc = br.readLine()) != null) {
651c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                    emitter.addNativeRegistration(nfunc);
661c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                }
671c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            } else {
681c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                emitter.setVersion(version, ext, pack);
691c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                emitter.emitCode(cfunc, s);
701c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            }
711c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        }
721c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
731c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
741c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public static void main(String[] args) throws Exception {
751c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        String classPathName = "com/google/android/gles_jni/GLImpl";
761c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        boolean useContextPointer = true;
771c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
781c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        int aidx = 0;
791c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        while (args[aidx].charAt(0) == '-') {
801c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            switch (args[aidx].charAt(1)) {
811c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            case 'c':
821c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                useContextPointer = false;
831c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                break;
841c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
851c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            default:
861c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                System.err.println("Unknown flag: " + args[aidx]);
871c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                System.exit(1);
881c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            }
891c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
901c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            aidx++;
911c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        }
921c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
931c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        System.out.println("useContextPointer = " + useContextPointer);
941c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
951c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        BufferedReader spec10Reader =
961c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new BufferedReader(new FileReader(args[aidx++]));
971c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        BufferedReader spec10ExtReader =
981c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new BufferedReader(new FileReader(args[aidx++]));
991c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        BufferedReader spec11Reader =
1001c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new BufferedReader(new FileReader(args[aidx++]));
1011c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        BufferedReader spec11ExtReader =
1021c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new BufferedReader(new FileReader(args[aidx++]));
1031c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        BufferedReader spec11ExtPackReader =
1041c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new BufferedReader(new FileReader(args[aidx++]));
1051c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        BufferedReader checksReader =
1061c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new BufferedReader(new FileReader(args[aidx++]));
1071c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1081c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        String gl10Filename = "javax/microedition/khronos/opengles/GL10.java";
1091c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        String gl10ExtFilename =
1101c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            "javax/microedition/khronos/opengles/GL10Ext.java";
1111c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        String gl11Filename = "javax/microedition/khronos/opengles/GL11.java";
1121c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        String gl11ExtFilename =
1131c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            "javax/microedition/khronos/opengles/GL11Ext.java";
1141c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        String gl11ExtPackFilename =
1151c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            "javax/microedition/khronos/opengles/GL11ExtensionPack.java";
1161c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        String glImplFilename = "com/google/android/gles_jni/GLImpl.java";
1171c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        String cFilename = "com_google_android_gles_jni_GLImpl.cpp";
1181c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1191c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        PrintStream gl10Stream =
1201c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new PrintStream(new FileOutputStream("out/" + gl10Filename));
1211c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        PrintStream gl10ExtStream =
1221c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new PrintStream(new FileOutputStream("out/" + gl10ExtFilename));
1231c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        PrintStream gl11Stream =
1241c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new PrintStream(new FileOutputStream("out/" + gl11Filename));
1251c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        PrintStream gl11ExtStream =
1261c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new PrintStream(new FileOutputStream("out/" + gl11ExtFilename));
1271c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        PrintStream gl11ExtPackStream =
1281c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new PrintStream(new FileOutputStream("out/" + gl11ExtPackFilename));
1291c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        PrintStream glImplStream =
1301c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new PrintStream(new FileOutputStream("out/" + glImplFilename));
1311c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        PrintStream cStream =
1321c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new PrintStream(new FileOutputStream("out/" + cFilename));
1331c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1341c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        ParameterChecker checker = new ParameterChecker(checksReader);
1351c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1361c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        CodeEmitter emitter =
1371c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new Jsr239CodeEmitter(classPathName,
1381c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                               checker,
1391c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                               gl10Stream, gl10ExtStream,
1401c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                               gl11Stream, gl11ExtStream, gl11ExtPackStream,
1411c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                               glImplStream, cStream,
1421c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                               useContextPointer);
1431c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1441c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        gl10Stream.println("/* //device/java/android/" + gl10Filename);
1451c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        gl10ExtStream.println("/* //device/java/android/" + gl10ExtFilename);
1461c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        gl11Stream.println("/* //device/java/android/" + gl11Filename);
1471c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        gl11ExtStream.println("/* //device/java/android/" + gl11ExtFilename);
1481c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        gl11ExtPackStream.println("/* //device/java/android/" +
1491c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            gl11ExtPackFilename);
1501c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        glImplStream.println("/* //device/java/android/" + glImplFilename);
1511c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        cStream.println("/* //device/libs/android_runtime/" + cFilename);
1521c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1531c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        copy("stubs/jsr239/GL10Header.java-if", gl10Stream);
1541c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        copy("stubs/jsr239/GL10ExtHeader.java-if", gl10ExtStream);
1551c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        copy("stubs/jsr239/GL11Header.java-if", gl11Stream);
1561c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        copy("stubs/jsr239/GL11ExtHeader.java-if", gl11ExtStream);
1571c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        copy("stubs/jsr239/GL11ExtensionPackHeader.java-if", gl11ExtPackStream);
1581c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        copy("stubs/jsr239/GLImplHeader.java-impl", glImplStream);
1591c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        copy("stubs/jsr239/GLCHeader.cpp", cStream);
1601c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1611c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        emit(0, false, false,
1621c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich             emitter, spec10Reader, gl10Stream, glImplStream, cStream);
1631c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        emit(0, true, false,
1641c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich             emitter, spec10ExtReader, gl10ExtStream, glImplStream, cStream);
1651c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        emit(1, false, false,
1661c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich             emitter, spec11Reader, gl11Stream, glImplStream, cStream);
1671c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        emit(1, true, false,
1681c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich             emitter, spec11ExtReader, gl11ExtStream, glImplStream, cStream);
1691c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        emit(1, true, true,
1701c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich             emitter, spec11ExtPackReader, gl11ExtPackStream, glImplStream,
1711c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich             cStream);
1721c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1731c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        emitter.emitNativeRegistration();
1741c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
1751c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        gl10Stream.println("}");
1761c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        gl10ExtStream.println("}");
1771c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        gl11Stream.println("}");
1781c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        gl11ExtStream.println("}");
1791c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        gl11ExtPackStream.println("}");
1801c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        glImplStream.println("}");
1811c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1821c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich}
183