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