1bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root/*
2bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Copyright (C) 2009 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 GenerateGLES {
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(GLESCodeEmitter emitter,
35412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                             BufferedReader specReader,
36412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                             PrintStream glStream,
37412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                             PrintStream cStream) throws Exception {
38412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        String s = null;
39412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        while ((s = specReader.readLine()) != null) {
40412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            if (s.trim().startsWith("//")) {
41412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                continue;
42412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
43412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
44412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            CFunc cfunc = CFunc.parseCFunc(s);
45412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
46412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            String fname = cfunc.getName();
47412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            String stubRoot = "stubs/gles11/" + fname;
48412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            String javaPath = stubRoot + ".java";
49412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            File f = new File(javaPath);
50412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            if (f.exists()) {
51412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                System.out.println("Special-casing function " + fname);
52412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                copy(javaPath, glStream);
53412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                copy(stubRoot + ".cpp", cStream);
54412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
55412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                // Register native function names
56412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                // This should be improved to require fewer discrete files
57412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                String filename = stubRoot + ".nativeReg";
58412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                BufferedReader br =
59412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                    new BufferedReader(new FileReader(filename));
60412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                String nfunc;
61412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                while ((nfunc = br.readLine()) != null) {
62412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                    emitter.addNativeRegistration(nfunc);
63412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                }
64412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            } else {
65412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                emitter.emitCode(cfunc, s);
66412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
67412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
68412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
69412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
70412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    public static void main(String[] args) throws Exception {
71412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        int aidx = 0;
72412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        while ((aidx < args.length) && (args[aidx].charAt(0) == '-')) {
73412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            switch (args[aidx].charAt(1)) {
74412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            default:
75412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                System.err.println("Unknown flag: " + args[aidx]);
76412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                System.exit(1);
77412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            }
78412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
79412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            aidx++;
80412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
81412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
82412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        BufferedReader checksReader =
83412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            new BufferedReader(new FileReader("specs/gles11/checks.spec"));
84412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        ParameterChecker checker = new ParameterChecker(checksReader);
85412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich
86412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        // Generate files
87412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        for(String suffix: new String[] {"GLES10", "GLES10Ext",
8850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                "GLES11", "GLES11Ext", "GLES20"})
89412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        {
90412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            BufferedReader spec11Reader =
91412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                new BufferedReader(new FileReader("specs/gles11/"
92412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                        + suffix + ".spec"));
93412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            String gl11Filename = "android/opengl/" + suffix + ".java";
94412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            String gl11cFilename = "android_opengl_" + suffix + ".cpp";
95412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            PrintStream gl11Stream =
96412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                new PrintStream(new FileOutputStream("out/" + gl11Filename));
97412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            PrintStream gl11cStream =
98412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                new PrintStream(new FileOutputStream("out/" + gl11cFilename));
99412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            gl11Stream.println("/*");
100412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            gl11cStream.println("/*");
101412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            copy("stubs/gles11/" + suffix + "Header.java-if", gl11Stream);
102412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            copy("stubs/gles11/" + suffix + "cHeader.cpp", gl11cStream);
103412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            GLESCodeEmitter emitter = new GLESCodeEmitter(
104412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                    "android/opengl/" + suffix,
105412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                    checker, gl11Stream, gl11cStream);
106412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            emit(emitter, spec11Reader, gl11Stream, gl11cStream);
107412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            emitter.emitNativeRegistration("register_android_opengl_jni_"
108412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich                    + suffix);
109412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            gl11Stream.println("}");
110412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            gl11Stream.close();
111412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich            gl11cStream.close();
112412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich        }
113412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich    }
114412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich}
115