Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2006 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 import java.io.BufferedReader;
     18 import java.io.File;
     19 import java.io.FileOutputStream;
     20 import java.io.FileReader;
     21 import java.io.IOException;
     22 import java.io.PrintStream;
     23 
     24 public class GenerateGL {
     25 
     26     static void copy(String filename, PrintStream out) throws IOException {
     27         BufferedReader br = new BufferedReader(new FileReader(filename));
     28         String s;
     29         while ((s = br.readLine()) != null) {
     30             out.println(s);
     31         }
     32     }
     33 
     34     private static void emit(int version, boolean ext, boolean pack,
     35                              CodeEmitter emitter,
     36                              BufferedReader specReader,
     37                              PrintStream glStream,
     38                              PrintStream glImplStream,
     39                              PrintStream cStream) throws Exception {
     40         String s = null;
     41         while ((s = specReader.readLine()) != null) {
     42             if (s.trim().startsWith("//")) {
     43                 continue;
     44             }
     45 
     46             CFunc cfunc = CFunc.parseCFunc(s);
     47 
     48             String fname = cfunc.getName();
     49             File f = new File("stubs/jsr239/" + fname +
     50                               ".java-1" + version + "-if");
     51             if (f.exists()) {
     52                 System.out.println("Special-casing function " + fname);
     53                 copy("stubs/jsr239/" + fname +
     54                      ".java-1" + version + "-if", glStream);
     55                 copy("stubs/jsr239/" + fname + ".java-impl", glImplStream);
     56                 copy("stubs/jsr239/" + fname + ".cpp", cStream);
     57 
     58                 // Register native function names
     59                 // This should be improved to require fewer discrete files
     60                 String filename = "stubs/jsr239/" + fname + ".nativeReg";
     61                 BufferedReader br =
     62                     new BufferedReader(new FileReader(filename));
     63                 String nfunc;
     64                 while ((nfunc = br.readLine()) != null) {
     65                     emitter.addNativeRegistration(nfunc);
     66                 }
     67             } else {
     68                 emitter.setVersion(version, ext, pack);
     69                 emitter.emitCode(cfunc, s);
     70             }
     71         }
     72     }
     73 
     74     public static void main(String[] args) throws Exception {
     75         String classPathName = "com/google/android/gles_jni/GLImpl";
     76         boolean useContextPointer = true;
     77 
     78         int aidx = 0;
     79         while (args[aidx].charAt(0) == '-') {
     80             switch (args[aidx].charAt(1)) {
     81             case 'c':
     82                 useContextPointer = false;
     83                 break;
     84 
     85             default:
     86                 System.err.println("Unknown flag: " + args[aidx]);
     87                 System.exit(1);
     88             }
     89 
     90             aidx++;
     91         }
     92 
     93         System.out.println("useContextPointer = " + useContextPointer);
     94 
     95         BufferedReader spec10Reader =
     96             new BufferedReader(new FileReader(args[aidx++]));
     97         BufferedReader spec10ExtReader =
     98             new BufferedReader(new FileReader(args[aidx++]));
     99         BufferedReader spec11Reader =
    100             new BufferedReader(new FileReader(args[aidx++]));
    101         BufferedReader spec11ExtReader =
    102             new BufferedReader(new FileReader(args[aidx++]));
    103         BufferedReader spec11ExtPackReader =
    104             new BufferedReader(new FileReader(args[aidx++]));
    105         BufferedReader checksReader =
    106             new BufferedReader(new FileReader(args[aidx++]));
    107 
    108         String gl10Filename = "javax/microedition/khronos/opengles/GL10.java";
    109         String gl10ExtFilename =
    110             "javax/microedition/khronos/opengles/GL10Ext.java";
    111         String gl11Filename = "javax/microedition/khronos/opengles/GL11.java";
    112         String gl11ExtFilename =
    113             "javax/microedition/khronos/opengles/GL11Ext.java";
    114         String gl11ExtPackFilename =
    115             "javax/microedition/khronos/opengles/GL11ExtensionPack.java";
    116         String glImplFilename = "com/google/android/gles_jni/GLImpl.java";
    117         String cFilename = "com_google_android_gles_jni_GLImpl.cpp";
    118 
    119         PrintStream gl10Stream =
    120             new PrintStream(new FileOutputStream("out/" + gl10Filename));
    121         PrintStream gl10ExtStream =
    122             new PrintStream(new FileOutputStream("out/" + gl10ExtFilename));
    123         PrintStream gl11Stream =
    124             new PrintStream(new FileOutputStream("out/" + gl11Filename));
    125         PrintStream gl11ExtStream =
    126             new PrintStream(new FileOutputStream("out/" + gl11ExtFilename));
    127         PrintStream gl11ExtPackStream =
    128             new PrintStream(new FileOutputStream("out/" + gl11ExtPackFilename));
    129         PrintStream glImplStream =
    130             new PrintStream(new FileOutputStream("out/" + glImplFilename));
    131         PrintStream cStream =
    132             new PrintStream(new FileOutputStream("out/" + cFilename));
    133 
    134         ParameterChecker checker = new ParameterChecker(checksReader);
    135 
    136         CodeEmitter emitter =
    137             new Jsr239CodeEmitter(classPathName,
    138                                checker,
    139                                gl10Stream, gl10ExtStream,
    140                                gl11Stream, gl11ExtStream, gl11ExtPackStream,
    141                                glImplStream, cStream,
    142                                useContextPointer);
    143 
    144         gl10Stream.println("/* //device/java/android/" + gl10Filename);
    145         gl10ExtStream.println("/* //device/java/android/" + gl10ExtFilename);
    146         gl11Stream.println("/* //device/java/android/" + gl11Filename);
    147         gl11ExtStream.println("/* //device/java/android/" + gl11ExtFilename);
    148         gl11ExtPackStream.println("/* //device/java/android/" +
    149             gl11ExtPackFilename);
    150         glImplStream.println("/* //device/java/android/" + glImplFilename);
    151         cStream.println("/* //device/libs/android_runtime/" + cFilename);
    152 
    153         copy("stubs/jsr239/GL10Header.java-if", gl10Stream);
    154         copy("stubs/jsr239/GL10ExtHeader.java-if", gl10ExtStream);
    155         copy("stubs/jsr239/GL11Header.java-if", gl11Stream);
    156         copy("stubs/jsr239/GL11ExtHeader.java-if", gl11ExtStream);
    157         copy("stubs/jsr239/GL11ExtensionPackHeader.java-if", gl11ExtPackStream);
    158         copy("stubs/jsr239/GLImplHeader.java-impl", glImplStream);
    159         copy("stubs/jsr239/GLCHeader.cpp", cStream);
    160 
    161         emit(0, false, false,
    162              emitter, spec10Reader, gl10Stream, glImplStream, cStream);
    163         emit(0, true, false,
    164              emitter, spec10ExtReader, gl10ExtStream, glImplStream, cStream);
    165         emit(1, false, false,
    166              emitter, spec11Reader, gl11Stream, glImplStream, cStream);
    167         emit(1, true, false,
    168              emitter, spec11ExtReader, gl11ExtStream, glImplStream, cStream);
    169         emit(1, true, true,
    170              emitter, spec11ExtPackReader, gl11ExtPackStream, glImplStream,
    171              cStream);
    172 
    173         emitter.emitNativeRegistration();
    174 
    175         gl10Stream.println("}");
    176         gl10ExtStream.println("}");
    177         gl11Stream.println("}");
    178         gl11ExtStream.println("}");
    179         gl11ExtPackStream.println("}");
    180         glImplStream.println("}");
    181     }
    182 }
    183