115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/* 215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2009 The Android Open Source Project 315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License. 615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at 715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * http://www.apache.org/licenses/LICENSE-2.0 915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * 1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software 1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and 1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License. 1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */ 161c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 171c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.io.BufferedReader; 181c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.io.File; 191c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.io.FileOutputStream; 201c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.io.FileReader; 211c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.io.IOException; 221c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichimport java.io.PrintStream; 231c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 241c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevichpublic class GenerateGLES { 251c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 261c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich static void copy(String filename, PrintStream out) throws IOException { 271c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich BufferedReader br = new BufferedReader(new FileReader(filename)); 281c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String s; 291c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich while ((s = br.readLine()) != null) { 301c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich out.println(s); 311c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 321c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 331c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 341c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich private static void emit(GLESCodeEmitter emitter, 351c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich BufferedReader specReader, 361c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich PrintStream glStream, 371c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich PrintStream cStream) throws Exception { 381c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String s = null; 391c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich while ((s = specReader.readLine()) != null) { 401c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (s.trim().startsWith("//")) { 411c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich continue; 421c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 431c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 441c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich CFunc cfunc = CFunc.parseCFunc(s); 451c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 461c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String fname = cfunc.getName(); 471c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String stubRoot = "stubs/gles11/" + fname; 481c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String javaPath = stubRoot + ".java"; 491c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich File f = new File(javaPath); 501c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich if (f.exists()) { 511c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich System.out.println("Special-casing function " + fname); 521c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich copy(javaPath, glStream); 531c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich copy(stubRoot + ".cpp", cStream); 541c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 551c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich // Register native function names 561c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich // This should be improved to require fewer discrete files 571c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String filename = stubRoot + ".nativeReg"; 581c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich BufferedReader br = 591c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich new BufferedReader(new FileReader(filename)); 601c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String nfunc; 611c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich while ((nfunc = br.readLine()) != null) { 621c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich emitter.addNativeRegistration(nfunc); 631c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 641c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } else { 651c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich emitter.emitCode(cfunc, s); 661c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 671c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 681c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 691c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 701c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich public static void main(String[] args) throws Exception { 711c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich int aidx = 0; 721c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich while ((aidx < args.length) && (args[aidx].charAt(0) == '-')) { 731c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich switch (args[aidx].charAt(1)) { 741c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich default: 751c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich System.err.println("Unknown flag: " + args[aidx]); 761c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich System.exit(1); 771c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 781c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 791c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich aidx++; 801c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 811c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 821c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich BufferedReader checksReader = 831c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich new BufferedReader(new FileReader("specs/gles11/checks.spec")); 841c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich ParameterChecker checker = new ParameterChecker(checksReader); 851c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich 861c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich // Generate files 871c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich for(String suffix: new String[] {"GLES10", "GLES10Ext", 88560814f6b11abe83ff0c4ed18cac015c276b3181Jack Palevich "GLES11", "GLES11Ext", "GLES20"}) 891c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich { 901c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich BufferedReader spec11Reader = 911c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich new BufferedReader(new FileReader("specs/gles11/" 921c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich + suffix + ".spec")); 931c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String gl11Filename = "android/opengl/" + suffix + ".java"; 941c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich String gl11cFilename = "android_opengl_" + suffix + ".cpp"; 951c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich PrintStream gl11Stream = 961c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich new PrintStream(new FileOutputStream("out/" + gl11Filename)); 971c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich PrintStream gl11cStream = 981c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich new PrintStream(new FileOutputStream("out/" + gl11cFilename)); 991c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich gl11Stream.println("/*"); 1001c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich gl11cStream.println("/*"); 1011c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich copy("stubs/gles11/" + suffix + "Header.java-if", gl11Stream); 1021c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich copy("stubs/gles11/" + suffix + "cHeader.cpp", gl11cStream); 1031c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich GLESCodeEmitter emitter = new GLESCodeEmitter( 1041c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich "android/opengl/" + suffix, 1051c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich checker, gl11Stream, gl11cStream); 1061c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich emit(emitter, spec11Reader, gl11Stream, gl11cStream); 1071c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich emitter.emitNativeRegistration("register_android_opengl_jni_" 1081c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich + suffix); 1091c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich gl11Stream.println("}"); 1101c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich gl11Stream.close(); 1111c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich gl11cStream.close(); 1121c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1131c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich } 1141c4907ee77392afb768c2f088e0dedbe4239f6fbJack Palevich} 115