166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer/*
266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * Copyright 2012 The Android Open Source Project
366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer *
466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * Licensed under the Apache License, Version 2.0 (the "License");
566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * you may not use this file except in compliance with the License.
666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * You may obtain a copy of the License at
766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer *
866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer *      http://www.apache.org/licenses/LICENSE-2.0
966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer *
1066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * Unless required by applicable law or agreed to in writing, software
1166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * distributed under the License is distributed on an "AS IS" BASIS,
1266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * See the License for the specific language governing permissions and
1466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer * limitations under the License.
1566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer */
1666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferimport java.io.BufferedReader;
1866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferimport java.io.File;
1966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferimport java.io.FileOutputStream;
2066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferimport java.io.FileReader;
2166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferimport java.io.IOException;
2266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferimport java.io.PrintStream;
2366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
2466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshoferpublic class GenerateEGL {
2566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
2666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    private static void copy(String filename, PrintStream out) throws IOException {
2766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        BufferedReader br = new BufferedReader(new FileReader(filename));
2866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String s;
2966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        while ((s = br.readLine()) != null) {
3066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(s);
3166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
3266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
3366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
3466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    private static void emit(EGLCodeEmitter emitter,
3566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                             BufferedReader specReader,
3666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                             PrintStream glStream,
3766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                             PrintStream cStream) throws Exception {
3866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String s = null;
3966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        while ((s = specReader.readLine()) != null) {
4066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            if (s.trim().startsWith("//")) {
4166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                continue;
4266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
4366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
4466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            CFunc cfunc = CFunc.parseCFunc(s);
4566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
4666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            String fname = cfunc.getName();
4766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            String stubRoot = "stubs/egl/" + fname;
4866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            String javaPath = stubRoot + ".java";
4966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            File f = new File(javaPath);
5066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            if (f.exists()) {
5166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                System.out.println("Special-casing function " + fname);
5266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                copy(javaPath, glStream);
5366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                copy(stubRoot + ".cpp", cStream);
5466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
5566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                // Register native function names
5666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                // This should be improved to require fewer discrete files
5766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String filename = stubRoot + ".nativeReg";
5866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                BufferedReader br =
5966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    new BufferedReader(new FileReader(filename));
6066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String nfunc;
6166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                while ((nfunc = br.readLine()) != null) {
6266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    emitter.addNativeRegistration(nfunc);
6366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
6466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            } else {
6566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                emitter.emitCode(cfunc, s);
6666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
6766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
6866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
6966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
7066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    public static void main(String[] args) throws Exception {
7166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int aidx = 0;
7266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        while ((aidx < args.length) && (args[aidx].charAt(0) == '-')) {
7366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            switch (args[aidx].charAt(1)) {
7466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            default:
7566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                System.err.println("Unknown flag: " + args[aidx]);
7666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                System.exit(1);
7766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
7866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
7966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            aidx++;
8066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
8166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
8266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        BufferedReader checksReader =
8366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            new BufferedReader(new FileReader("specs/egl/checks.spec"));
8466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        ParameterChecker checker = new ParameterChecker(checksReader);
8566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
8666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
87c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall        for(String suffix: new String[] {"EGL14", "EGLExt"}) {
88c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            BufferedReader specReader = new BufferedReader(new FileReader(
89c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall                    "specs/egl/" + suffix + ".spec"));
90c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            String egljFilename = "android/opengl/" + suffix + ".java";
91c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            String eglcFilename = "android_opengl_" + suffix + ".cpp";
92c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            PrintStream egljStream =
93c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall                new PrintStream(new FileOutputStream("out/" + egljFilename));
94c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            PrintStream eglcStream =
95c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall                new PrintStream(new FileOutputStream("out/" + eglcFilename));
96c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            copy("stubs/egl/" + suffix + "Header.java-if", egljStream);
97c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            copy("stubs/egl/" + suffix + "cHeader.cpp", eglcStream);
98c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            EGLCodeEmitter emitter = new EGLCodeEmitter(
99c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall                    "android/opengl/" + suffix,
100c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall                    checker, egljStream, eglcStream);
101c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            emit(emitter, specReader, egljStream, eglcStream);
102c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            emitter.emitNativeRegistration(
103c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall                    "register_android_opengl_jni_" + suffix);
104c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            egljStream.println("}");
105c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            egljStream.close();
106c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall            eglcStream.close();
107c86393510c8747519fe34e5aa38ce5218593c19cJesse Hall        }
10866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
10966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer}
110