1bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root/* 2bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Copyright (C) 2006 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 GenerateGL { 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(int version, boolean ext, boolean pack, 35412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CodeEmitter emitter, 36412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich BufferedReader specReader, 37412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich PrintStream glStream, 38412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich PrintStream glImplStream, 39412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich PrintStream cStream) throws Exception { 40412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String s = null; 41412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich while ((s = specReader.readLine()) != null) { 42412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (s.trim().startsWith("//")) { 43412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich continue; 44412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 45412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 46412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CFunc cfunc = CFunc.parseCFunc(s); 47412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 48412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String fname = cfunc.getName(); 49412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich File f = new File("stubs/jsr239/" + fname + 50412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ".java-1" + version + "-if"); 51412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich if (f.exists()) { 52412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich System.out.println("Special-casing function " + fname); 53412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich copy("stubs/jsr239/" + fname + 54412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ".java-1" + version + "-if", glStream); 55412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich copy("stubs/jsr239/" + fname + ".java-impl", glImplStream); 56412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich copy("stubs/jsr239/" + fname + ".cpp", cStream); 57412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 58412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich // Register native function names 59412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich // This should be improved to require fewer discrete files 60412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String filename = "stubs/jsr239/" + fname + ".nativeReg"; 61412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich BufferedReader br = 62412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new BufferedReader(new FileReader(filename)); 63412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String nfunc; 64412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich while ((nfunc = br.readLine()) != null) { 65412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emitter.addNativeRegistration(nfunc); 66412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 67412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } else { 68412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emitter.setVersion(version, ext, pack); 69412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emitter.emitCode(cfunc, s); 70412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 71412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 72412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 73412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 74412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich public static void main(String[] args) throws Exception { 75412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String classPathName = "com/google/android/gles_jni/GLImpl"; 76412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich boolean useContextPointer = true; 77412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 78412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich int aidx = 0; 79412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich while (args[aidx].charAt(0) == '-') { 80412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich switch (args[aidx].charAt(1)) { 81412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich case 'c': 82412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich useContextPointer = false; 83412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich break; 84412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 85412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich default: 86412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich System.err.println("Unknown flag: " + args[aidx]); 87412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich System.exit(1); 88412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 89412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 90412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich aidx++; 91412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 92412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 93412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich System.out.println("useContextPointer = " + useContextPointer); 94412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 95412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich BufferedReader spec10Reader = 96412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new BufferedReader(new FileReader(args[aidx++])); 97412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich BufferedReader spec10ExtReader = 98412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new BufferedReader(new FileReader(args[aidx++])); 99412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich BufferedReader spec11Reader = 100412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new BufferedReader(new FileReader(args[aidx++])); 101412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich BufferedReader spec11ExtReader = 102412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new BufferedReader(new FileReader(args[aidx++])); 103412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich BufferedReader spec11ExtPackReader = 104412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new BufferedReader(new FileReader(args[aidx++])); 105412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich BufferedReader checksReader = 106412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new BufferedReader(new FileReader(args[aidx++])); 107412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 108412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String gl10Filename = "javax/microedition/khronos/opengles/GL10.java"; 109412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String gl10ExtFilename = 110412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich "javax/microedition/khronos/opengles/GL10Ext.java"; 111412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String gl11Filename = "javax/microedition/khronos/opengles/GL11.java"; 112412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String gl11ExtFilename = 113412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich "javax/microedition/khronos/opengles/GL11Ext.java"; 114412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String gl11ExtPackFilename = 115412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich "javax/microedition/khronos/opengles/GL11ExtensionPack.java"; 116412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String glImplFilename = "com/google/android/gles_jni/GLImpl.java"; 117412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich String cFilename = "com_google_android_gles_jni_GLImpl.cpp"; 118412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 119412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich PrintStream gl10Stream = 120412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new PrintStream(new FileOutputStream("out/" + gl10Filename)); 121412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich PrintStream gl10ExtStream = 122412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new PrintStream(new FileOutputStream("out/" + gl10ExtFilename)); 123412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich PrintStream gl11Stream = 124412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new PrintStream(new FileOutputStream("out/" + gl11Filename)); 125412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich PrintStream gl11ExtStream = 126412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new PrintStream(new FileOutputStream("out/" + gl11ExtFilename)); 127412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich PrintStream gl11ExtPackStream = 128412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new PrintStream(new FileOutputStream("out/" + gl11ExtPackFilename)); 129412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich PrintStream glImplStream = 130412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new PrintStream(new FileOutputStream("out/" + glImplFilename)); 131412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich PrintStream cStream = 132412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new PrintStream(new FileOutputStream("out/" + cFilename)); 133412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 134412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich ParameterChecker checker = new ParameterChecker(checksReader); 135412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 136412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich CodeEmitter emitter = 137412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich new Jsr239CodeEmitter(classPathName, 138412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich checker, 139412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl10Stream, gl10ExtStream, 140412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl11Stream, gl11ExtStream, gl11ExtPackStream, 141412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich glImplStream, cStream, 142412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich useContextPointer); 143412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 144412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl10Stream.println("/* //device/java/android/" + gl10Filename); 145412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl10ExtStream.println("/* //device/java/android/" + gl10ExtFilename); 146412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl11Stream.println("/* //device/java/android/" + gl11Filename); 147412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl11ExtStream.println("/* //device/java/android/" + gl11ExtFilename); 148412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl11ExtPackStream.println("/* //device/java/android/" + 149412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl11ExtPackFilename); 150412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich glImplStream.println("/* //device/java/android/" + glImplFilename); 151412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich cStream.println("/* //device/libs/android_runtime/" + cFilename); 152412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 153412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich copy("stubs/jsr239/GL10Header.java-if", gl10Stream); 154412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich copy("stubs/jsr239/GL10ExtHeader.java-if", gl10ExtStream); 155412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich copy("stubs/jsr239/GL11Header.java-if", gl11Stream); 156412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich copy("stubs/jsr239/GL11ExtHeader.java-if", gl11ExtStream); 157412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich copy("stubs/jsr239/GL11ExtensionPackHeader.java-if", gl11ExtPackStream); 158412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich copy("stubs/jsr239/GLImplHeader.java-impl", glImplStream); 159412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich copy("stubs/jsr239/GLCHeader.cpp", cStream); 160412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 161412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emit(0, false, false, 162412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emitter, spec10Reader, gl10Stream, glImplStream, cStream); 163412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emit(0, true, false, 164412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emitter, spec10ExtReader, gl10ExtStream, glImplStream, cStream); 165412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emit(1, false, false, 166412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emitter, spec11Reader, gl11Stream, glImplStream, cStream); 167412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emit(1, true, false, 168412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emitter, spec11ExtReader, gl11ExtStream, glImplStream, cStream); 169412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emit(1, true, true, 170412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emitter, spec11ExtPackReader, gl11ExtPackStream, glImplStream, 171412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich cStream); 172412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 173412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich emitter.emitNativeRegistration(); 174412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich 175412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl10Stream.println("}"); 176412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl10ExtStream.println("}"); 177412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl11Stream.println("}"); 178412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl11ExtStream.println("}"); 179412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich gl11ExtPackStream.println("}"); 180412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich glImplStream.println("}"); 181412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich } 182412f38f270b71bbc3214362eb58687cbf26d6df2Jack Palevich} 183