summaryrefslogtreecommitdiffstats
path: root/opengl/tools/glgen/src/GenerateEGL.java
blob: aaa748cb696a2c129f7b7f5415dd956813935d38 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
 * Copyright 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;

public class GenerateEGL {

    private static void copy(String filename, PrintStream out) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(filename));
        String s;
        while ((s = br.readLine()) != null) {
            out.println(s);
        }
    }

    private static void emit(EGLCodeEmitter emitter,
                             BufferedReader specReader,
                             PrintStream glStream,
                             PrintStream cStream) throws Exception {
        String s = null;
        while ((s = specReader.readLine()) != null) {
            if (s.trim().startsWith("//")) {
                continue;
            }

            CFunc cfunc = CFunc.parseCFunc(s);

            String fname = cfunc.getName();
            String stubRoot = "stubs/egl/" + fname;
            String javaPath = stubRoot + ".java";
            File f = new File(javaPath);
            if (f.exists()) {
                System.out.println("Special-casing function " + fname);
                copy(javaPath, glStream);
                copy(stubRoot + ".cpp", cStream);

                // Register native function names
                // This should be improved to require fewer discrete files
                String filename = stubRoot + ".nativeReg";
                BufferedReader br =
                    new BufferedReader(new FileReader(filename));
                String nfunc;
                while ((nfunc = br.readLine()) != null) {
                    emitter.addNativeRegistration(nfunc);
                }
            } else {
                emitter.emitCode(cfunc, s);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        int aidx = 0;
        while ((aidx < args.length) && (args[aidx].charAt(0) == '-')) {
            switch (args[aidx].charAt(1)) {
            default:
                System.err.println("Unknown flag: " + args[aidx]);
                System.exit(1);
            }

            aidx++;
        }

        BufferedReader checksReader =
            new BufferedReader(new FileReader("specs/egl/checks.spec"));
        ParameterChecker checker = new ParameterChecker(checksReader);


        BufferedReader specReader =
                new BufferedReader(new FileReader("specs/egl/EGL14.spec"));

        String egljFilename = "android/opengl/EGL14.java";
        String eglcFilename = "android_opengl_EGL14.cpp";
        PrintStream egljStream =
            new PrintStream(new FileOutputStream("out/" + egljFilename));
        PrintStream eglcStream =
            new PrintStream(new FileOutputStream("out/" + eglcFilename));
        egljStream.println("/*");
        eglcStream.println("/*");
        copy("stubs/egl/EGL14Header.java-if", egljStream);
        copy("stubs/egl/EGL14cHeader.cpp", eglcStream);
        EGLCodeEmitter emitter = new EGLCodeEmitter(
                "android/opengl/EGL14",
                checker, egljStream, eglcStream);
        emit(emitter, specReader, egljStream, eglcStream);
        emitter.emitNativeRegistration("register_android_opengl_jni_EGL14");
        egljStream.println("}");
        egljStream.close();
        eglcStream.close();
    }
}