145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/* 245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Copyright (C) 2012 The Android Open Source Project 345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * you may not use this file except in compliance with the License. 645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * You may obtain a copy of the License at 745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 1045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Unless required by applicable law or agreed to in writing, software 1145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * See the License for the specific language governing permissions and 1445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * limitations under the License. 1545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 1645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 1745d443665f5ce7efa934706a89883f0cc87f3513Jason Samspackage android.support.v8.renderscript; 1845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 1945d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.Context; 2045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.res.Resources; 2145d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.util.Log; 2245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 2345d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.io.File; 2445d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.io.IOException; 2545d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.io.InputStream; 2645d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.util.Map.Entry; 2745d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.util.HashMap; 2845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 2945d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.lang.reflect.Field; 3045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.lang.reflect.Modifier; 3145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 3245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/** 33032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * The superclass for all user-defined scripts. This is only 34032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * intended to be used by the generated derived classes. 3545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams **/ 3645d443665f5ce7efa934706a89883f0cc87f3513Jason Samspublic class ScriptC extends Script { 3745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams private static final String TAG = "ScriptC"; 3845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 3945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 4045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Only intended for use by the generated derived classes. 4145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 4245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param id 4345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param rs 4445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 45bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang protected ScriptC(long id, RenderScript rs) { 4645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams super(id, rs); 4745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 4845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 4945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 5045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Only intended for use by the generated derived classes. 5145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 5245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 5345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param rs 5445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param resources 5545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param resourceID 5645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 5745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams protected ScriptC(RenderScript rs, Resources resources, int resourceID) { 5845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams super(0, rs); 59bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang long id = internalCreate(rs, resources, resourceID); 6045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (id == 0) { 6145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams throw new RSRuntimeException("Loading of ScriptC script failed."); 6245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 6345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams setID(id); 6445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 6545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 66bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang /** 67bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang * Only intended for use by the generated derived classes. 68bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang * 69bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang * @param rs 70bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang * @param resName 71bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang * @param bitcode32 72bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang * @param bitcode64 73bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang */ 74bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang protected ScriptC(RenderScript rs, String resName, byte[] bitcode32, byte[] bitcode64) { 75bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang super(0, rs); 76bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang long id = 0; 77bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang if (RenderScript.sPointerSize == 4) { 78bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang id = internalStringCreate(rs, resName, bitcode32); 79bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang } else { 80bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang id = internalStringCreate(rs, resName, bitcode64); 81bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang } 82bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang if (id == 0) { 83bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang throw new RSRuntimeException("Loading of ScriptC script failed."); 84bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang } 85bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang setID(id); 86bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang } 8745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 88bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang private static synchronized long internalCreate(RenderScript rs, Resources resources, int resourceID) { 8945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams byte[] pgm; 9045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int pgmLength; 9145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams InputStream is = resources.openRawResource(resourceID); 9245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams try { 9345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams try { 9445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams pgm = new byte[1024]; 9545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams pgmLength = 0; 9645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams while(true) { 9745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int bytesLeft = pgm.length - pgmLength; 9845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (bytesLeft == 0) { 9945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams byte[] buf2 = new byte[pgm.length * 2]; 10045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams System.arraycopy(pgm, 0, buf2, 0, pgm.length); 10145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams pgm = buf2; 10245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams bytesLeft = pgm.length - pgmLength; 10345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 10445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int bytesRead = is.read(pgm, pgmLength, bytesLeft); 10545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (bytesRead <= 0) { 10645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams break; 10745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 10845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams pgmLength += bytesRead; 10945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 11045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } finally { 11145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams is.close(); 11245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 11345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } catch(IOException e) { 11445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams throw new Resources.NotFoundException(); 11545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 11645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 11745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams String resName = resources.getResourceEntryName(resourceID); 11845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams String cachePath = rs.getApplicationContext().getCacheDir().toString(); 11945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 12090fbed82b44c96f1e51db4dacb00d2b3f6affbdfTim Murray // Log.v(TAG, "Create script for resource = " + resName + ", " + pgmLength + ", " + pgm); 12190fbed82b44c96f1e51db4dacb00d2b3f6affbdfTim Murray //Log.v(TAG, " path = " + cachePath); 12245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return rs.nScriptCCreate(resName, cachePath, pgm, pgmLength); 12345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 124bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang 125bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang private static synchronized long internalStringCreate(RenderScript rs, String resName, byte[] bitcode) { 126bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang // Log.v(TAG, "Create script for resource = " + resName); 127bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang String cachePath = rs.getApplicationContext().getCacheDir().toString(); 128bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang return rs.nScriptCCreate(resName, cachePath, bitcode, bitcode.length); 129bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang } 130bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang 13145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams} 132