115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2009 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 GenerateGLES {
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(GLESCodeEmitter emitter,
351c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                             BufferedReader specReader,
361c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                             PrintStream glStream,
371c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                             PrintStream cStream) throws Exception {
381c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        String s = null;
391c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        while ((s = specReader.readLine()) != null) {
401c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            if (s.trim().startsWith("//")) {
411c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                continue;
421c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            }
431c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
441c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            CFunc cfunc = CFunc.parseCFunc(s);
451c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
461c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            String fname = cfunc.getName();
471c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            String stubRoot = "stubs/gles11/" + fname;
481c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            String javaPath = stubRoot + ".java";
491c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            File f = new File(javaPath);
501c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            if (f.exists()) {
511c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                System.out.println("Special-casing function " + fname);
521c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                copy(javaPath, glStream);
531c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                copy(stubRoot + ".cpp", cStream);
541c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
551c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                // Register native function names
561c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                // This should be improved to require fewer discrete files
571c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                String filename = stubRoot + ".nativeReg";
581c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                BufferedReader br =
591c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                    new BufferedReader(new FileReader(filename));
601c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                String nfunc;
611c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                while ((nfunc = br.readLine()) != null) {
621c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                    emitter.addNativeRegistration(nfunc);
631c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                }
641c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            } else {
651c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                emitter.emitCode(cfunc, s);
661c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            }
671c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        }
681c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
691c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
701c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    public static void main(String[] args) throws Exception {
711c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        int aidx = 0;
721c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        while ((aidx < args.length) && (args[aidx].charAt(0) == '-')) {
731c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            switch (args[aidx].charAt(1)) {
741c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            default:
751c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                System.err.println("Unknown flag: " + args[aidx]);
761c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                System.exit(1);
771c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            }
781c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
791c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            aidx++;
801c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        }
811c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
821c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        BufferedReader checksReader =
831c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            new BufferedReader(new FileReader("specs/gles11/checks.spec"));
841c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        ParameterChecker checker = new ParameterChecker(checksReader);
851c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich
861c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        // Generate files
871c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        for(String suffix: new String[] {"GLES10", "GLES10Ext",
88560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich                "GLES11", "GLES11Ext", "GLES20"})
891c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        {
901c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            BufferedReader spec11Reader =
911c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                new BufferedReader(new FileReader("specs/gles11/"
921c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                        + suffix + ".spec"));
931c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            String gl11Filename = "android/opengl/" + suffix + ".java";
941c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            String gl11cFilename = "android_opengl_" + suffix + ".cpp";
951c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            PrintStream gl11Stream =
961c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                new PrintStream(new FileOutputStream("out/" + gl11Filename));
971c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            PrintStream gl11cStream =
981c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                new PrintStream(new FileOutputStream("out/" + gl11cFilename));
991c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            gl11Stream.println("/*");
1001c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            gl11cStream.println("/*");
1011c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            copy("stubs/gles11/" + suffix + "Header.java-if", gl11Stream);
1021c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            copy("stubs/gles11/" + suffix + "cHeader.cpp", gl11cStream);
1031c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            GLESCodeEmitter emitter = new GLESCodeEmitter(
1041c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                    "android/opengl/" + suffix,
1051c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                    checker, gl11Stream, gl11cStream);
1061c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            emit(emitter, spec11Reader, gl11Stream, gl11cStream);
1071c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            emitter.emitNativeRegistration("register_android_opengl_jni_"
1081c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich                    + suffix);
1091c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            gl11Stream.println("}");
1101c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            gl11Stream.close();
1111c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich            gl11cStream.close();
1121c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich        }
1131c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich    }
1141c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich}
115