145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/*
2baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray * Copyright (C) 2013 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 java.io.File;
2045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.lang.reflect.Field;
21d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murrayimport java.lang.reflect.Method;
22a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murrayimport java.util.concurrent.locks.ReentrantReadWriteLock;
2329f8636ee81c93588204e54273df97d8326b103cMiao Wangimport java.util.ArrayList;
2429f8636ee81c93588204e54273df97d8326b103cMiao Wangimport java.nio.ByteBuffer;
2545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2645d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.Context;
2745d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.pm.ApplicationInfo;
2845d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.pm.PackageManager;
2945d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.res.AssetManager;
3045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.graphics.Bitmap;
3145d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.graphics.BitmapFactory;
3245d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.os.Process;
3345d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.util.Log;
3445d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.view.Surface;
3545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
3645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/**
37032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * This class provides access to a RenderScript context, which controls RenderScript
38032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * initialization, resource management, and teardown. An instance of the RenderScript
39032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * class must be created before any other RS objects can be created.
4045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
4145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * <div class="special reference">
4245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * <h3>Developer Guides</h3>
43032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * <p>For more information about creating an application that uses RenderScript, read the
44032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
4545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * </div>
4645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams **/
4745d443665f5ce7efa934706a89883f0cc87f3513Jason Samspublic class RenderScript {
4845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static final String LOG_TAG = "RenderScript_jni";
4945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static final boolean DEBUG  = false;
5045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    @SuppressWarnings({"UnusedDeclaration", "deprecation"})
5145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static final boolean LOG_ENABLED = false;
520860d1d49cae4f0d7a0cd541a02ced1b05a952f1Miao Wang    static final int SUPPORT_LIB_API = 23;
53d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang    static final int SUPPORT_LIB_VERSION = 2301;
5445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
554516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    static private ArrayList<RenderScript> mProcessContextList = new ArrayList<RenderScript>();
564516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    private boolean mIsProcessContext = false;
5789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    private boolean mEnableMultiInput = false;
5829f8636ee81c93588204e54273df97d8326b103cMiao Wang    private int mDispatchAPILevel = 0;
5989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
604516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    private int mContextFlags = 0;
614516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    private int mContextSdkVersion = 0;
624516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
6345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    private Context mApplicationContext;
64ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    private String mNativeLibDir;
65a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
66d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang    static private String mBlackList = "";
67d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     /**
68d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     * Sets the blackList of Models to only use support lib runtime.
69d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     * Should be used before context create.
70d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     *
71d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     * @param blackList User provided black list string.
72d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     *
73d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     * Format: "(MANUFACTURER1:PRODUCT1:MODEL1), (MANUFACTURER2:PRODUCT2:MODEL2)..."
74d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     * e.g. : To Blacklist Nexus 7(2013) and Nexus 5.
75d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     *        mBlackList = "(asus:razor:Nexus 7), (LGE:hammerhead:Nexus 5)";
76d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     */
77d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang    static public void setBlackList(String blackList) {
78d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang        if (blackList != null) {
79d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang            mBlackList = blackList;
80d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang        }
81d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang    }
82d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     /**
83d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     * Force using support lib runtime.
84d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     * Should be used before context create.
85d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     *
86d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang     */
87d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang    static public void forceCompat() {
88d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang        sNative = 0;
89d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang    }
9045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /*
9145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * We use a class initializer to allow the native code to cache some
9245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * field offsets.
9345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
9445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
9545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static boolean sInitialized;
96d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray    static boolean sUseGCHooks;
97d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray    static Object sRuntime;
98d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray    static Method registerNativeAllocation;
99d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray    static Method registerNativeFree;
100d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray
1015ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray    static Object lock = new Object();
10245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
10345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    // Non-threadsafe functions.
104d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang    native boolean nLoadSO(boolean useNative, int deviceApi, String libPath);
105dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    native boolean nLoadIOSO();
106bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long nDeviceCreate();
107bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void nDeviceDestroy(long dev);
108bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void nDeviceSetConfig(long dev, int param, int value);
109bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native int nContextGetUserMessage(long con, int[] data);
110bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native String nContextGetErrorMessage(long con);
111bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native int  nContextPeekMessage(long con, int[] subID);
112bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void nContextInitToClient(long con);
113bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void nContextDeinitToClient(long con);
11445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
115470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    static private int sNative = -1;
116a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray    static private int sSdkVersion = -1;
117dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    static private boolean useIOlib = false;
1186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    static private boolean useNative;
119a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray
1204516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    /*
1214516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * Context creation flag that specifies a normal context.
1224516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * RenderScript Support lib only support normal context.
1234516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     */
1244516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    public static final int CREATE_FLAG_NONE = 0x0000;
1254516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
12629f8636ee81c93588204e54273df97d8326b103cMiao Wang    int getDispatchAPILevel() {
12729f8636ee81c93588204e54273df97d8326b103cMiao Wang        return mDispatchAPILevel;
12829f8636ee81c93588204e54273df97d8326b103cMiao Wang    }
1294516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
1306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    boolean isUseNative() {
1316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return useNative;
1326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
133bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    /*
134bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang     * Detect the bitness of the VM to allow FieldPacker to do the right thing.
135bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang     */
136bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    static native int rsnSystemGetPointerSize();
137bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    static int sPointerSize;
138bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
139257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    /**
140257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines     * Determines whether or not we should be thunking into the native
141257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines     * RenderScript layer or actually using the compatibility library.
142257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines     */
143470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang    static private boolean setupNative(int sdkVersion, Context ctx) {
1447c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wang        // if targetSdkVersion is higher than the device api version, always use compat mode.
1457c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wang        // Workaround for KK
1467c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wang        if (android.os.Build.VERSION.SDK_INT < sdkVersion &&
1477c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wang            android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
1487c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wang            sNative = 0;
1497c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wang        }
1507c0de6383be18a1dae1297c54c56f3d9afbeaaadMiao Wang
151470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        if (sNative == -1) {
152cf24a427a60bf21755c6493623a1014105849b5bTim Murray
153cf24a427a60bf21755c6493623a1014105849b5bTim Murray            // get the value of the debug.rs.forcecompat property
154cf24a427a60bf21755c6493623a1014105849b5bTim Murray            int forcecompat = 0;
155cf24a427a60bf21755c6493623a1014105849b5bTim Murray            try {
156cf24a427a60bf21755c6493623a1014105849b5bTim Murray                Class<?> sysprop = Class.forName("android.os.SystemProperties");
157cf24a427a60bf21755c6493623a1014105849b5bTim Murray                Class[] signature = {String.class, Integer.TYPE};
158cf24a427a60bf21755c6493623a1014105849b5bTim Murray                Method getint = sysprop.getDeclaredMethod("getInt", signature);
159cf24a427a60bf21755c6493623a1014105849b5bTim Murray                Object[] args = {"debug.rs.forcecompat", new Integer(0)};
160cf24a427a60bf21755c6493623a1014105849b5bTim Murray                forcecompat = ((java.lang.Integer)getint.invoke(null, args)).intValue();
161cf24a427a60bf21755c6493623a1014105849b5bTim Murray            } catch (Exception e) {
162cf24a427a60bf21755c6493623a1014105849b5bTim Murray
163cf24a427a60bf21755c6493623a1014105849b5bTim Murray            }
164cf24a427a60bf21755c6493623a1014105849b5bTim Murray
165470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang            if ((android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
166cf24a427a60bf21755c6493623a1014105849b5bTim Murray                     && forcecompat == 0) {
167470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang                sNative = 1;
168257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines            } else {
169470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang                sNative = 0;
1706f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray            }
1716f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray
1726f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray
173470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang            if (sNative == 1) {
1746f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray                // Workarounds that may disable thunking go here
175c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                ApplicationInfo info;
1766f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray                try {
1776f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray                    info = ctx.getPackageManager().getApplicationInfo(ctx.getPackageName(),
1786f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray                                                                      PackageManager.GET_META_DATA);
1796f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray                } catch (PackageManager.NameNotFoundException e) {
1806f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray                    // assume no workarounds needed
181c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                    return true;
1826f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray                }
183c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                long minorVersion = 0;
1846f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray
185c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                // load minorID from reflection
186c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                try {
187c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                    Class<?> javaRS = Class.forName("android.renderscript.RenderScript");
188c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                    Method getMinorID = javaRS.getDeclaredMethod("getMinorID");
189c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                    minorVersion = ((java.lang.Long)getMinorID.invoke(null)).longValue();
190c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                } catch (Exception e) {
191c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                    // minor version remains 0 on devices with no possible WARs
192c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                }
1936f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray
194c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                if (info.metaData != null) {
195c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                    // asynchronous teardown: minor version 1+
196c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                    if (info.metaData.getBoolean("com.android.support.v8.renderscript.EnableAsyncTeardown") == true) {
197c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                        if (minorVersion == 0) {
198c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                            sNative = 0;
199812a493746c6cc3ab238603ff35984650f9171f2Miao Wang                        }
200c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                    }
201812a493746c6cc3ab238603ff35984650f9171f2Miao Wang
202c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                    // blur issues on some drivers with 4.4
203c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                    if (info.metaData.getBoolean("com.android.support.v8.renderscript.EnableBlurWorkaround") == true) {
204c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                        if (android.os.Build.VERSION.SDK_INT <= 19) {
205c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                            //android.util.Log.e("rs", "war on");
206c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                            sNative = 0;
2077aa657fc5d15695da401e2a3f370fa99e89131c6Jason Sams                        }
2087aa657fc5d15695da401e2a3f370fa99e89131c6Jason Sams                    }
2096f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray                }
210c65969bb29c1d46c047747e15a57efa89cee8bfeMiao Wang                // end of workarounds
211257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines            }
212257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        }
2136f021a9f436db28896e022f36bce9a4d4ca4d48aTim Murray
214470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        if (sNative == 1) {
215d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang            // check against the blacklist
216d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang            if (mBlackList.length() > 0) {
217d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang                String deviceInfo = '(' +
218d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang                                    android.os.Build.MANUFACTURER +
219d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang                                    ':' +
220d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang                                    android.os.Build.PRODUCT +
221d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang                                    ':' +
222d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang                                    android.os.Build.MODEL +
223d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang                                    ')';
224d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang                if (mBlackList.contains(deviceInfo)) {
225d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang                    sNative = 0;
226d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang                    return false;
227d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang                }
228d3286ffd33132199d2d94d6f709153a82db02f8fMiao Wang            }
229257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines            return true;
230257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        }
231257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        return false;
232257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
233257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines
23445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
23545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Name of the file that holds the object cache.
23645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
23745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    private static final String CACHE_PATH = "com.android.renderscript.cache";
23845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static String mCachePath;
23945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
24045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     /**
24145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Sets the directory to use as a persistent storage for the
24245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * renderscript object file cache.
24345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
24445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @hide
24545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param cacheDir A directory the current process can write to
24645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
24745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static void setupDiskCache(File cacheDir) {
24845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        File f = new File(cacheDir, CACHE_PATH);
24945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mCachePath = f.getAbsolutePath();
25045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        f.mkdirs();
25145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
25245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
253032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines    /**
254032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * ContextType specifies the specific type of context to be created.
255032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     *
256032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     */
25738f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    public enum ContextType {
258032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
259032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * NORMAL context, this is the default and what shipping apps should
260032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * use.
261032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
26238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        NORMAL (0),
263032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines
264032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
265032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * DEBUG context, perform extra runtime checks to validate the
266032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * kernels and APIs are being used as intended.  Get and SetElementAt
267032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * will be bounds checked in this mode.
268032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
26938f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        DEBUG (1),
270032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines
271032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
272032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * PROFILE context, Intended to be used once the first time an
273032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * application is run on a new device.  This mode allows the runtime to
274032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * do additional testing and performance tuning.
275032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
27638f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        PROFILE (2);
27738f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams
27838f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        int mID;
27938f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        ContextType(int id) {
28038f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams            mID = id;
28138f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        }
28238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    }
28345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2844516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    ContextType mContextType;
28545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    // Methods below are wrapped to protect the non-threadsafe
28645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    // lockless fifo.
287470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang
288ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    native long  rsnContextCreate(long dev, int ver, int sdkVer, int contextType, String nativeLibDir);
289ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang    synchronized long nContextCreate(long dev, int ver, int sdkVer, int contextType, String nativeLibDir) {
290ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang        return rsnContextCreate(dev, ver, sdkVer, contextType, nativeLibDir);
29145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
292bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnContextDestroy(long con);
29345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nContextDestroy() {
29445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
295a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray
296a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray        // take teardown lock
297a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray        // teardown lock can only be taken when no objects are being destroyed
298a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray        ReentrantReadWriteLock.WriteLock wlock = mRWLock.writeLock();
299a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray        wlock.lock();
300a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray
301bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        long curCon = mContext;
302a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray        // context is considered dead as of this point
303a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray        mContext = 0;
304a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray
305a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray        wlock.unlock();
306a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray        rsnContextDestroy(curCon);
30745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
308bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnContextSetPriority(long con, int p);
30945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nContextSetPriority(int p) {
31045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
31145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnContextSetPriority(mContext, p);
31245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
313bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnContextDump(long con, int bits);
31445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nContextDump(int bits) {
31545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
31645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnContextDump(mContext, bits);
31745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
318bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnContextFinish(long con);
31945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nContextFinish() {
32045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
32145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnContextFinish(mContext);
32245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
32345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
324bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnContextSendMessage(long con, int id, int[] data);
325dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines    synchronized void nContextSendMessage(int id, int[] data) {
326dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        validate();
327dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        rsnContextSendMessage(mContext, id, data);
328dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines    }
329dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines
330a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray    // nObjDestroy is explicitly _not_ synchronous to prevent crashes in finalizers
331bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnObjDestroy(long con, long id);
332bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    void nObjDestroy(long id) {
33345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // There is a race condition here.  The calling code may be run
33445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // by the gc while teardown is occuring.  This protects againts
33545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // deleting dead objects.
33645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (mContext != 0) {
33745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rsnObjDestroy(mContext, id);
33845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
33945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
34045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
341bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long  rsnElementCreate(long con, long type, int kind, boolean norm, int vecSize);
342bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nElementCreate(long type, int kind, boolean norm, int vecSize) {
34345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
34445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnElementCreate(mContext, type, kind, norm, vecSize);
34545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
346bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long  rsnElementCreate2(long con, long[] elements, String[] names, int[] arraySizes);
347bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nElementCreate2(long[] elements, String[] names, int[] arraySizes) {
34845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
34945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnElementCreate2(mContext, elements, names, arraySizes);
35045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
351bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnElementGetNativeData(long con, long id, int[] elementData);
352bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nElementGetNativeData(long id, int[] elementData) {
35345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
35445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnElementGetNativeData(mContext, id, elementData);
35545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
356bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnElementGetSubElements(long con, long id,
357bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                         long[] IDs, String[] names, int[] arraySizes);
358bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nElementGetSubElements(long id, long[] IDs, String[] names, int[] arraySizes) {
35945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
36045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnElementGetSubElements(mContext, id, IDs, names, arraySizes);
36145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
36245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
363bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long rsnTypeCreate(long con, long eid, int x, int y, int z, boolean mips, boolean faces, int yuv);
364bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nTypeCreate(long eid, int x, int y, int z, boolean mips, boolean faces, int yuv) {
36545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
3665d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams        return rsnTypeCreate(mContext, eid, x, y, z, mips, faces, yuv);
36745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
368bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang
369bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnTypeGetNativeData(long con, long id, long[] typeData);
370bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nTypeGetNativeData(long id, long[] typeData) {
37145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
37245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnTypeGetNativeData(mContext, id, typeData);
37345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
37445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
375bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long  rsnAllocationCreateTyped(long con, long type, int mip, int usage, long pointer);
376bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nAllocationCreateTyped(long type, int mip, int usage, long pointer) {
37745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
37845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer);
37945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
380bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long  rsnAllocationCreateFromBitmap(long con, long type, int mip, Bitmap bmp, int usage);
381bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nAllocationCreateFromBitmap(long type, int mip, Bitmap bmp, int usage) {
38245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
38345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
38445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
3855d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams
386bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long  rsnAllocationCreateBitmapBackedAllocation(long con, long type, int mip, Bitmap bmp, int usage);
387bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nAllocationCreateBitmapBackedAllocation(long type, int mip, Bitmap bmp, int usage) {
3889c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        validate();
3899c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        return rsnAllocationCreateBitmapBackedAllocation(mContext, type, mip, bmp, usage);
3909c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray    }
3915d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams
3925d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams
393bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long  rsnAllocationCubeCreateFromBitmap(long con, long type, int mip, Bitmap bmp, int usage);
394bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nAllocationCubeCreateFromBitmap(long type, int mip, Bitmap bmp, int usage) {
39545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
39645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
39745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
398bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long  rsnAllocationCreateBitmapRef(long con, long type, Bitmap bmp);
399bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nAllocationCreateBitmapRef(long type, Bitmap bmp) {
40045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
40145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnAllocationCreateBitmapRef(mContext, type, bmp);
40245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
403bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long  rsnAllocationCreateFromAssetStream(long con, int mips, int assetStream, int usage);
404bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
40545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
40645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
40745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
40845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
409bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void  rsnAllocationCopyToBitmap(long con, long alloc, Bitmap bmp);
410bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationCopyToBitmap(long alloc, Bitmap bmp) {
41145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
41245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationCopyToBitmap(mContext, alloc, bmp);
41345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
41445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
41545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
416bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnAllocationSyncAll(long con, long alloc, int src);
417bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationSyncAll(long alloc, int src) {
41845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
41945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationSyncAll(mContext, alloc, src);
42045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
421dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
422bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnAllocationSetSurface(long con, long alloc, Surface sur);
423bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationSetSurface(long alloc, Surface sur) {
424dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        validate();
425dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        rsnAllocationSetSurface(mContext, alloc, sur);
426dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    }
427dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
428bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnAllocationIoSend(long con, long alloc);
429bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationIoSend(long alloc) {
4309c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        validate();
4319c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        rsnAllocationIoSend(mContext, alloc);
4329c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray    }
433bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnAllocationIoReceive(long con, long alloc);
434bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationIoReceive(long alloc) {
4359c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        validate();
4369c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        rsnAllocationIoReceive(mContext, alloc);
4379c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray    }
43829f8636ee81c93588204e54273df97d8326b103cMiao Wang    native ByteBuffer rsnAllocationGetByteBuffer(long con, long alloc, int xBytesSize, int dimY, int dimZ);
43929f8636ee81c93588204e54273df97d8326b103cMiao Wang    synchronized ByteBuffer nAllocationGetByteBuffer(long alloc, int xBytesSize, int dimY, int dimZ) {
44029f8636ee81c93588204e54273df97d8326b103cMiao Wang        validate();
44129f8636ee81c93588204e54273df97d8326b103cMiao Wang        return rsnAllocationGetByteBuffer(mContext, alloc, xBytesSize, dimY, dimZ);
44229f8636ee81c93588204e54273df97d8326b103cMiao Wang    }
44329f8636ee81c93588204e54273df97d8326b103cMiao Wang    native long rsnAllocationGetStride(long con, long alloc);
44429f8636ee81c93588204e54273df97d8326b103cMiao Wang    synchronized long nAllocationGetStride(long alloc) {
44529f8636ee81c93588204e54273df97d8326b103cMiao Wang        validate();
44629f8636ee81c93588204e54273df97d8326b103cMiao Wang        return rsnAllocationGetStride(mContext, alloc);
44729f8636ee81c93588204e54273df97d8326b103cMiao Wang    }
44845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
449bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnAllocationGenerateMipmaps(long con, long alloc);
450bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationGenerateMipmaps(long alloc) {
45145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
45245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationGenerateMipmaps(mContext, alloc);
45345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
454bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void  rsnAllocationCopyFromBitmap(long con, long alloc, Bitmap bmp);
455bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationCopyFromBitmap(long alloc, Bitmap bmp) {
45645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
45745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
45845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
45945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
4608352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
4612e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    native void rsnAllocationData1D(long con, long id, int off, int mip, int count, Object d, int sizeBytes, int dt,
4622e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                    int mSize, boolean usePadding);
4632e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    synchronized void nAllocationData1D(long id, int off, int mip, int count, Object d, int sizeBytes, Element.DataType dt,
4642e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                        int mSize, boolean usePadding) {
46545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
4662e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID, mSize, usePadding);
46745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
46845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
469244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    native void rsnAllocationElementData1D(long con,long id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes);
470bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationElementData1D(long id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes) {
47145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
47245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationElementData1D(mContext, id, xoff, mip, compIdx, d, sizeBytes);
47345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
474244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    /*
475244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    native void rsnAllocationElementData(long con,long id, int xoff, int yoff, int zoff, int mip, int compIdx, byte[] d, int sizeBytes);
476244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    synchronized void nAllocationElementData(long id, int xoff, int yoff, int zoff, int mip, int compIdx, byte[] d, int sizeBytes) {
477244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang        validate();
478244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang        rsnAllocationElementData(mContext, id, xoff, yoff, zoff, mip, compIdx, d, sizeBytes);
479244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    }
480244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    */
48145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
482bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnAllocationData2D(long con,
483bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                    long dstAlloc, int dstXoff, int dstYoff,
48445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                    int dstMip, int dstFace,
48545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                    int width, int height,
486bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                    long srcAlloc, int srcXoff, int srcYoff,
48745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                    int srcMip, int srcFace);
488bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationData2D(long dstAlloc, int dstXoff, int dstYoff,
48945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                        int dstMip, int dstFace,
49045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                        int width, int height,
491bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                        long srcAlloc, int srcXoff, int srcYoff,
49245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                        int srcMip, int srcFace) {
49345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
49445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationData2D(mContext,
49545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                            dstAlloc, dstXoff, dstYoff,
49645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                            dstMip, dstFace,
49745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                            width, height,
49845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                            srcAlloc, srcXoff, srcYoff,
49945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                            srcMip, srcFace);
50045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
50145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
5028352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face,
5032e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                    int w, int h, Object d, int sizeBytes, int dt,
5042e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                    int mSize, boolean usePadding);
5058352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face,
5062e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                        int w, int h, Object d, int sizeBytes, Element.DataType dt,
5072e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                        int mSize, boolean usePadding) {
50845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
5092e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID, mSize, usePadding);
510bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    }
5118352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
512bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face, Bitmap b);
513bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face, Bitmap b) {
51445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
51545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
51645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
51745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
518bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnAllocationData3D(long con,
519bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                    long dstAlloc, int dstXoff, int dstYoff, int dstZoff,
520302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                    int dstMip,
521302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                    int width, int height, int depth,
522bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                    long srcAlloc, int srcXoff, int srcYoff, int srcZoff,
523302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                    int srcMip);
524bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationData3D(long dstAlloc, int dstXoff, int dstYoff, int dstZoff,
525302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                        int dstMip,
526302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                        int width, int height, int depth,
527bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                                        long srcAlloc, int srcXoff, int srcYoff, int srcZoff,
528302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                        int srcMip) {
529302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams        validate();
530302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams        rsnAllocationData3D(mContext,
531302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                            dstAlloc, dstXoff, dstYoff, dstZoff,
532302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                            dstMip, width, height, depth,
533302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                            srcAlloc, srcXoff, srcYoff, srcZoff, srcMip);
534302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    }
535302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams
536302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams
5378352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    native void rsnAllocationData3D(long con, long id, int xoff, int yoff, int zoff, int mip,
5382e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                    int w, int h, int depth, Object d, int sizeBytes, int dt,
5392e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                    int mSize, boolean usePadding);
5408352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    synchronized void nAllocationData3D(long id, int xoff, int yoff, int zoff, int mip,
5412e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                        int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt,
5422e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                        int mSize, boolean usePadding) {
54345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
5442e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes,
5452e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                            dt.mID, mSize, usePadding);
54645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
5478352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
5482e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    native void rsnAllocationRead(long con, long id, Object d, int dt, int mSize, boolean usePadding);
5492e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang    synchronized void nAllocationRead(long id, Object d, Element.DataType dt, int mSize, boolean usePadding) {
55045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
5512e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        rsnAllocationRead(mContext, id, d, dt.mID, mSize, usePadding);
55245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
5538352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
5548352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    native void rsnAllocationRead1D(long con, long id, int off, int mip, int count, Object d,
5552e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                    int sizeBytes, int dt, int mSize, boolean usePadding);
5568352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    synchronized void nAllocationRead1D(long id, int off, int mip, int count, Object d,
5572e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                        int sizeBytes, Element.DataType dt, int mSize, boolean usePadding) {
55845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
5592e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        rsnAllocationRead1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID, mSize, usePadding);
56045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
56129f8636ee81c93588204e54273df97d8326b103cMiao Wang
562244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    /*
563244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    native void rsnAllocationElementRead(long con,long id, int xoff, int yoff, int zoff,
5643bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                                         int mip, int compIdx, byte[] d, int sizeBytes);
565244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    synchronized void nAllocationElementRead(long id, int xoff, int yoff, int zoff,
5663bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang                                             int mip, int compIdx, byte[] d, int sizeBytes) {
567244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang        validate();
5683bc17a5878f014a61d67e38901f310fd77aeaeacMiao Wang        rsnAllocationElementRead(mContext, id, xoff, yoff, zoff, mip, compIdx, d, sizeBytes);
569244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    }
570244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    */
5718352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
5728352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    native void rsnAllocationRead2D(long con, long id, int xoff, int yoff, int mip, int face,
5732e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                    int w, int h, Object d, int sizeBytes, int dt,
5742e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                    int mSize, boolean usePadding);
5758352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang    synchronized void nAllocationRead2D(long id, int xoff, int yoff, int mip, int face,
5762e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                        int w, int h, Object d, int sizeBytes, Element.DataType dt,
5772e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                        int mSize, boolean usePadding) {
57845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
5792e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        rsnAllocationRead2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID, mSize, usePadding);
58045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
5818352bdceb7f0030593db04a06ba8caebf81eaeeaMiao Wang
582244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    /*
583244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    native void rsnAllocationRead3D(long con, long id, int xoff, int yoff, int zoff, int mip,
5842e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                    int w, int h, int depth, Object d, int sizeBytes, int dt,
5852e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                    int mSize, boolean usePadding);
586244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    synchronized void nAllocationRead3D(long id, int xoff, int yoff, int zoff, int mip,
5872e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                        int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt,
5882e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang                                        int mSize, boolean usePadding) {
589244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang        validate();
5902e1cfff791e07a1caa8cb5ece86e8627f4be8b3fMiao Wang        rsnAllocationRead3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes, dt.mID, mSize, usePadding);
591244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    }
592244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang    */
593244b72fe088a6393f37dea49ff89cf9df738a492Miao Wang
594bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long  rsnAllocationGetType(long con, long id);
595bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nAllocationGetType(long id) {
59645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
59745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnAllocationGetType(mContext, id);
59845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
59945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
600bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnAllocationResize1D(long con, long id, int dimX);
601bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationResize1D(long id, int dimX) {
60245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
60345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationResize1D(mContext, id, dimX);
60445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
605bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnAllocationResize2D(long con, long id, int dimX, int dimY);
606bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nAllocationResize2D(long id, int dimX, int dimY) {
60745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
60845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationResize2D(mContext, id, dimX, dimY);
60945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
61045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
6116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptBindAllocation(long con, long script, long alloc, int slot, boolean mUseInc);
6126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nScriptBindAllocation(long script, long alloc, int slot, boolean mUseInc) {
61345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
6146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
6156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
6166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
6176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
6186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnScriptBindAllocation(curCon, script, alloc, slot, mUseInc);
61945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
6206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptSetTimeZone(long con, long script, byte[] timeZone, boolean mUseInc);
6216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nScriptSetTimeZone(long script, byte[] timeZone, boolean mUseInc) {
62245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
6236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
6246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
6256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
6266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
6276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnScriptSetTimeZone(curCon, script, timeZone, mUseInc);
62845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
6296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptInvoke(long con, long id, int slot, boolean mUseInc);
6306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nScriptInvoke(long id, int slot, boolean mUseInc) {
63145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
6326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
6336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
6346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
6356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
6366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnScriptInvoke(curCon, id, slot, mUseInc);
63745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
6386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptForEach(long con, long incCon, long id, int slot, long ain, long aout, byte[] params, boolean mUseInc);
6396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptForEach(long con, long incCon, long id, int slot, long ain, long aout, boolean mUseInc);
6406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptForEachClipped(long con, long incCon, long id, int slot, long ain, long aout, byte[] params,
6416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                        int xstart, int xend, int ystart, int yend, int zstart, int zend, boolean mUseInc);
6426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptForEachClipped(long con, long incCon, long id, int slot, long ain, long aout,
6436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                        int xstart, int xend, int ystart, int yend, int zstart, int zend, boolean mUseInc);
6446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nScriptForEach(long id, int slot, long ain, long aout, byte[] params, boolean mUseInc) {
64545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
64645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (params == null) {
6476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            rsnScriptForEach(mContext, mIncCon, id, slot, ain, aout, mUseInc);
64845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        } else {
6496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            rsnScriptForEach(mContext, mIncCon, id, slot, ain, aout, params, mUseInc);
65045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
65145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
652dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines
653bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nScriptForEachClipped(long id, int slot, long ain, long aout, byte[] params,
6546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                            int xstart, int xend, int ystart, int yend, int zstart, int zend, boolean mUseInc) {
655e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        validate();
656dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        if (params == null) {
6576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            rsnScriptForEachClipped(mContext, mIncCon, id, slot, ain, aout, xstart, xend, ystart, yend, zstart, zend, mUseInc);
658dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        } else {
6596f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            rsnScriptForEachClipped(mContext, mIncCon, id, slot, ain, aout, params, xstart, xend, ystart, yend, zstart, zend, mUseInc);
660dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        }
661e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray    }
662e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray
66389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    native void rsnScriptForEach(long con, long id, int slot, long[] ains,
66489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                                 long aout, byte[] params, int[] limits);
66589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
66689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    synchronized void nScriptForEach(long id, int slot, long[] ains, long aout,
66789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                                     byte[] params, int[] limits) {
66889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (!mEnableMultiInput) {
66989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            Log.e(LOG_TAG, "Multi-input kernels are not supported, please change targetSdkVersion to >= 23");
67089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            throw new RSRuntimeException("Multi-input kernels are not supported before API 23)");
67189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
67289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        validate();
67389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        rsnScriptForEach(mContext, id, slot, ains, aout, params, limits);
67489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
67589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
6762141e9b9d98b6f4e2f4124f9b67a7819e8d40a4cDavid Gross    native void rsnScriptReduce(long con, long id, int slot, long[] ains,
6772141e9b9d98b6f4e2f4124f9b67a7819e8d40a4cDavid Gross                                long aout, int[] limits);
6782141e9b9d98b6f4e2f4124f9b67a7819e8d40a4cDavid Gross    synchronized void nScriptReduce(long id, int slot, long ains[], long aout,
6792141e9b9d98b6f4e2f4124f9b67a7819e8d40a4cDavid Gross                                    int[] limits) {
680f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        validate();
6812141e9b9d98b6f4e2f4124f9b67a7819e8d40a4cDavid Gross        rsnScriptReduce(mContext, id, slot, ains, aout, limits);
682f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross    }
683f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross
6846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptInvokeV(long con, long id, int slot, byte[] params, boolean mUseInc);
6856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nScriptInvokeV(long id, int slot, byte[] params, boolean mUseInc) {
68645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
6876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
6886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
6896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
6906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
6916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnScriptInvokeV(curCon, id, slot, params, mUseInc);
69245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
6936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptSetVarI(long con, long id, int slot, int val, boolean mUseInc);
6946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nScriptSetVarI(long id, int slot, int val, boolean mUseInc) {
69545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
6966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
6976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
6986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
6996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
7006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnScriptSetVarI(curCon, id, slot, val, mUseInc);
70145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
7026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptSetVarJ(long con, long id, int slot, long val, boolean mUseInc);
7036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nScriptSetVarJ(long id, int slot, long val, boolean mUseInc) {
70445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
7056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
7066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
7076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
7086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
7096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnScriptSetVarJ(curCon, id, slot, val, mUseInc);
71045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
7116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptSetVarF(long con, long id, int slot, float val, boolean mUseInc);
7126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nScriptSetVarF(long id, int slot, float val, boolean mUseInc) {
71345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
7146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
7156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
7166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
7176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
7186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnScriptSetVarF(curCon, id, slot, val, mUseInc);
71945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
7206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptSetVarD(long con, long id, int slot, double val, boolean mUseInc);
7216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nScriptSetVarD(long id, int slot, double val, boolean mUseInc) {
72245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
7236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
7246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
7256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
7266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
7276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnScriptSetVarD(curCon, id, slot, val, mUseInc);
72845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
7296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptSetVarV(long con, long id, int slot, byte[] val, boolean mUseInc);
7306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nScriptSetVarV(long id, int slot, byte[] val, boolean mUseInc) {
73145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
7326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
7336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
7346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
7356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
7366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnScriptSetVarV(curCon, id, slot, val, mUseInc);
73745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
738bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnScriptSetVarVE(long con, long id, int slot, byte[] val,
7396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                  long e, int[] dims, boolean mUseInc);
740bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nScriptSetVarVE(long id, int slot, byte[] val,
7416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                                      long e, int[] dims, boolean mUseInc) {
74245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
7436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
7446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
7456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
7466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
7476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnScriptSetVarVE(curCon, id, slot, val, e, dims, mUseInc);
74845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
7496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnScriptSetVarObj(long con, long id, int slot, long val, boolean mUseInc);
7506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nScriptSetVarObj(long id, int slot, long val, boolean mUseInc) {
75145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
7526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
7536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
7546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
7556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
7566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnScriptSetVarObj(curCon, id, slot, val, mUseInc);
75745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
75845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
759bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long  rsnScriptCCreate(long con, String resName, String cacheDir,
76045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                 byte[] script, int length);
761bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
76245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
76345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
76445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
76545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
7666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native long  rsnScriptIntrinsicCreate(long con, int id, long eid, boolean mUseInc);
7676f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized long nScriptIntrinsicCreate(int id, long eid, boolean mUseInc) {
768a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
7696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
7700860d1d49cae4f0d7a0cd541a02ced1b05a952f1Miao Wang            if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
7710860d1d49cae4f0d7a0cd541a02ced1b05a952f1Miao Wang                Log.e(LOG_TAG, "Incremental Intrinsics are not supported, please change targetSdkVersion to >= 21");
7720860d1d49cae4f0d7a0cd541a02ced1b05a952f1Miao Wang                throw new RSRuntimeException("Incremental Intrinsics are not supported before Lollipop (API 21)");
7730860d1d49cae4f0d7a0cd541a02ced1b05a952f1Miao Wang            }
7740860d1d49cae4f0d7a0cd541a02ced1b05a952f1Miao Wang
7756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            if (!mIncLoaded) {
7766f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                try {
7776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                    System.loadLibrary("RSSupport");
7786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                } catch (UnsatisfiedLinkError e) {
7796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                    Log.e(LOG_TAG, "Error loading RS Compat library for Incremental Intrinsic Support: " + e);
7806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                    throw new RSRuntimeException("Error loading RS Compat library for Incremental Intrinsic Support: " + e);
7816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                }
782d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                if (!nIncLoadSO(SUPPORT_LIB_API, mNativeLibDir + "/libRSSupport.so")) {
7836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                    throw new RSRuntimeException("Error loading libRSSupport library for Incremental Intrinsic Support");
7846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                }
7856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                mIncLoaded = true;
7866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            }
7876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            if (mIncCon == 0) {
7886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                //Create a dummy compat context (synchronous).
789eb884da1d4352bcfefe50fb1eb76af04c1ade893Yang Ni                long device = nIncDeviceCreate();
790eb884da1d4352bcfefe50fb1eb76af04c1ade893Yang Ni                mIncCon = nIncContextCreate(device, 0, 0, 0);
7916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            }
7926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            return rsnScriptIntrinsicCreate(mIncCon, id, eid, mUseInc);
7936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        } else {
7946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            return rsnScriptIntrinsicCreate(mContext, id, eid, mUseInc);
7956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
796a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
797a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
7986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native long  rsnScriptKernelIDCreate(long con, long sid, int slot, int sig, boolean mUseInc);
7996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized long nScriptKernelIDCreate(long sid, int slot, int sig, boolean mUseInc) {
800a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
8016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
8026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
8036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
8046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
8056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return rsnScriptKernelIDCreate(curCon, sid, slot, sig, mUseInc);
806a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
807a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
808086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    native long  rsnScriptInvokeIDCreate(long con, long sid, int slot);
809086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    synchronized long nScriptInvokeIDCreate(long sid, int slot) {
810086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        validate();
811086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        return rsnScriptInvokeIDCreate(mContext, sid, slot);
812086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    }
813086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni
8146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native long  rsnScriptFieldIDCreate(long con, long sid, int slot, boolean mUseInc);
8156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized long nScriptFieldIDCreate(long sid, int slot, boolean mUseInc) {
816a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
8176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mContext;
8186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseInc) {
8196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            curCon = mIncCon;
8206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
8216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return rsnScriptFieldIDCreate(curCon, sid, slot, mUseInc);
822a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
823a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
824bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long  rsnScriptGroupCreate(long con, long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types);
825bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nScriptGroupCreate(long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types) {
826a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
827a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        return rsnScriptGroupCreate(mContext, kernels, src, dstk, dstf, types);
828a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
829a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
830bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnScriptGroupSetInput(long con, long group, long kernel, long alloc);
831bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nScriptGroupSetInput(long group, long kernel, long alloc) {
832a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
833a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        rsnScriptGroupSetInput(mContext, group, kernel, alloc);
834a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
835a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
836bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnScriptGroupSetOutput(long con, long group, long kernel, long alloc);
837bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nScriptGroupSetOutput(long group, long kernel, long alloc) {
838a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
839a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        rsnScriptGroupSetOutput(mContext, group, kernel, alloc);
840a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
841a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
842bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native void rsnScriptGroupExecute(long con, long group);
843bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized void nScriptGroupExecute(long group) {
844a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
845a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        rsnScriptGroupExecute(mContext, group);
846a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
847a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
848bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    native long  rsnSamplerCreate(long con, int magFilter, int minFilter,
84945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                 int wrapS, int wrapT, int wrapR, float aniso);
850bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    synchronized long nSamplerCreate(int magFilter, int minFilter,
85145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                 int wrapS, int wrapT, int wrapR, float aniso) {
85245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
85345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
85445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
85545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
856b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang// entry points for ScriptGroup2
857b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    native long rsnClosureCreate(long con, long kernelID, long returnValue,
858b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        long[] fieldIDs, long[] values, int[] sizes, long[] depClosures,
859b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        long[] depFieldIDs);
860b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    synchronized long nClosureCreate(long kernelID, long returnValue,
861b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        long[] fieldIDs, long[] values, int[] sizes, long[] depClosures,
862b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        long[] depFieldIDs) {
863b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      validate();
864b7a5e4de32a9042b582373377a15c6d8bfbe41beYang Ni      long c = rsnClosureCreate(mContext, kernelID, returnValue, fieldIDs, values,
865b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang          sizes, depClosures, depFieldIDs);
866b7a5e4de32a9042b582373377a15c6d8bfbe41beYang Ni      if (c == 0) {
867b7a5e4de32a9042b582373377a15c6d8bfbe41beYang Ni          throw new RSRuntimeException("Failed creating closure.");
868b7a5e4de32a9042b582373377a15c6d8bfbe41beYang Ni      }
869b7a5e4de32a9042b582373377a15c6d8bfbe41beYang Ni      return c;
870b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    }
871b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
872b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    native long rsnInvokeClosureCreate(long con, long invokeID, byte[] params,
873b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        long[] fieldIDs, long[] values, int[] sizes);
874b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    synchronized long nInvokeClosureCreate(long invokeID, byte[] params,
875b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        long[] fieldIDs, long[] values, int[] sizes) {
876b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      validate();
877b7a5e4de32a9042b582373377a15c6d8bfbe41beYang Ni      long c = rsnInvokeClosureCreate(mContext, invokeID, params, fieldIDs,
878b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang          values, sizes);
879b7a5e4de32a9042b582373377a15c6d8bfbe41beYang Ni      if (c == 0) {
880b7a5e4de32a9042b582373377a15c6d8bfbe41beYang Ni          throw new RSRuntimeException("Failed creating closure.");
881b7a5e4de32a9042b582373377a15c6d8bfbe41beYang Ni      }
882b7a5e4de32a9042b582373377a15c6d8bfbe41beYang Ni      return c;
883b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    }
884b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
885b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    native void rsnClosureSetArg(long con, long closureID, int index,
886b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      long value, int size);
887b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    synchronized void nClosureSetArg(long closureID, int index, long value,
888b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        int size) {
889b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      validate();
890b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      rsnClosureSetArg(mContext, closureID, index, value, size);
891b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    }
892b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
893b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    native void rsnClosureSetGlobal(long con, long closureID, long fieldID,
894b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        long value, int size);
895b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    // Does this have to be synchronized?
896b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    synchronized void nClosureSetGlobal(long closureID, long fieldID,
897b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang        long value, int size) {
898b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      validate(); // TODO: is this necessary?
899b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      rsnClosureSetGlobal(mContext, closureID, fieldID, value, size);
900b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    }
901b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
9020ed9e1d4e82c6b45ca6bced0e24245d9d232e9d4Miao Wang    native long rsnScriptGroup2Create(long con, String name, String cachePath,
9030ed9e1d4e82c6b45ca6bced0e24245d9d232e9d4Miao Wang                                      long[] closures);
9040ed9e1d4e82c6b45ca6bced0e24245d9d232e9d4Miao Wang    synchronized long nScriptGroup2Create(String name, String cachePath,
9050ed9e1d4e82c6b45ca6bced0e24245d9d232e9d4Miao Wang                                          long[] closures) {
906b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      validate();
9070ed9e1d4e82c6b45ca6bced0e24245d9d232e9d4Miao Wang      return rsnScriptGroup2Create(mContext, name, cachePath, closures);
908b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    }
909b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
910b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    native void rsnScriptGroup2Execute(long con, long groupID);
911b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    synchronized void nScriptGroup2Execute(long groupID) {
912b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      validate();
913b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang      rsnScriptGroup2Execute(mContext, groupID);
914b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang    }
915b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
9168919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    native void rsnScriptIntrinsicBLAS_Single(long con, long incCon, long id, int func, int TransA,
9178919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                              int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
9188919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                              float alpha, long A, long B, float beta, long C, int incX, int incY,
9198919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                              int KL, int KU, boolean mUseInc);
9208919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    synchronized void nScriptIntrinsicBLAS_Single(long id, int func, int TransA,
9218919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                                  int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
9228919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                                  float alpha, long A, long B, float beta, long C, int incX, int incY,
9238919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                                  int KL, int KU, boolean mUseInc) {
9248919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        validate();
9258919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        rsnScriptIntrinsicBLAS_Single(mContext, mIncCon, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alpha, A, B, beta, C, incX, incY, KL, KU, mUseInc);
9268919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
9278919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
9288919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    native void rsnScriptIntrinsicBLAS_Double(long con, long incCon, long id, int func, int TransA,
9298919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                              int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
9308919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                              double alpha, long A, long B, double beta, long C, int incX, int incY,
9318919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                              int KL, int KU, boolean mUseInc);
9328919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    synchronized void nScriptIntrinsicBLAS_Double(long id, int func, int TransA,
9338919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                                  int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
9348919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                                  double alpha, long A, long B, double beta, long C, int incX, int incY,
9358919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                                  int KL, int KU, boolean mUseInc) {
9368919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        validate();
9378919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        rsnScriptIntrinsicBLAS_Double(mContext, mIncCon, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alpha, A, B, beta, C, incX, incY, KL, KU, mUseInc);
9388919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
9398919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
9408919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    native void rsnScriptIntrinsicBLAS_Complex(long con, long incCon, long id, int func, int TransA,
9418919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                               int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
9428919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                               float alphaX, float alphaY, long A, long B, float betaX, float betaY, long C, int incX, int incY,
9438919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                               int KL, int KU, boolean mUseInc);
9448919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    synchronized void nScriptIntrinsicBLAS_Complex(long id, int func, int TransA,
9458919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                                   int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
9468919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                                   float alphaX, float alphaY, long A, long B, float betaX, float betaY, long C, int incX, int incY,
9478919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                                   int KL, int KU, boolean mUseInc) {
9488919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        validate();
9498919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        rsnScriptIntrinsicBLAS_Complex(mContext, mIncCon, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alphaX, alphaY, A, B, betaX, betaY, C, incX, incY, KL, KU, mUseInc);
9508919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
9518919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
9528919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    native void rsnScriptIntrinsicBLAS_Z(long con, long incCon, long id, int func, int TransA,
9538919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                         int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
9548919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                         double alphaX, double alphaY, long A, long B, double betaX, double betaY, long C, int incX, int incY,
9558919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                         int KL, int KU, boolean mUseInc);
9568919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    synchronized void nScriptIntrinsicBLAS_Z(long id, int func, int TransA,
9578919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                             int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
9588919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                             double alphaX, double alphaY, long A, long B, double betaX, double betaY, long C, int incX, int incY,
9598919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                             int KL, int KU, boolean mUseInc) {
9608919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        validate();
9618919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        rsnScriptIntrinsicBLAS_Z(mContext, mIncCon, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alphaX, alphaY, A, B, betaX, betaY, C, incX, incY, KL, KU, mUseInc);
9628919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
9638919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang
9648919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    native void rsnScriptIntrinsicBLAS_BNNM(long con, long incCon, long id, int M, int N, int K,
9658919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                             long A, int a_offset, long B, int b_offset, long C, int c_offset,
9668919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                             int c_mult_int, boolean mUseInc);
9678919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    synchronized void nScriptIntrinsicBLAS_BNNM(long id, int M, int N, int K,
9688919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                             long A, int a_offset, long B, int b_offset, long C, int c_offset,
9698919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang                                             int c_mult_int, boolean mUseInc) {
9708919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        validate();
9718919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang        rsnScriptIntrinsicBLAS_BNNM(mContext, mIncCon, id, M, N, K, A, a_offset, B, b_offset, C, c_offset, c_mult_int, mUseInc);
9728919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    }
973b1c365bfb0566142c49375f09f2b8289182f1f47Miao Wang
9746f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang// Additional Entry points For inc libRSSupport
9756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
976d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang    native boolean nIncLoadSO(int deviceApi, String libPath);
9776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native long nIncDeviceCreate();
9786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void nIncDeviceDestroy(long dev);
9796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    // Methods below are wrapped to protect the non-threadsafe
9806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    // lockless fifo.
9816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native long  rsnIncContextCreate(long dev, int ver, int sdkVer, int contextType);
9826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized long nIncContextCreate(long dev, int ver, int sdkVer, int contextType) {
9836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return rsnIncContextCreate(dev, ver, sdkVer, contextType);
9846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
9856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnIncContextDestroy(long con);
9866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nIncContextDestroy() {
9876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        validate();
9886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
9896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        // take teardown lock
9906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        // teardown lock can only be taken when no objects are being destroyed
9916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        ReentrantReadWriteLock.WriteLock wlock = mRWLock.writeLock();
9926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        wlock.lock();
9936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
9946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long curCon = mIncCon;
9956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        // context is considered dead as of this point
9966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mIncCon = 0;
9976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
9986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        wlock.unlock();
9996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnIncContextDestroy(curCon);
10006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
100145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
10026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnIncContextFinish(long con);
10036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized void nIncContextFinish() {
10046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        validate();
10056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        rsnIncContextFinish(mIncCon);
10066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
100745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
10086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native void rsnIncObjDestroy(long con, long id);
10096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    void nIncObjDestroy(long id) {
10106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        // There is a race condition here.  The calling code may be run
10116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        // by the gc while teardown is occuring.  This protects againts
10126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        // deleting dead objects.
10136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mIncCon != 0) {
10146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            rsnIncObjDestroy(mIncCon, id);
10156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
10166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
10176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native long  rsnIncElementCreate(long con, long type, int kind, boolean norm, int vecSize);
10186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized long nIncElementCreate(long type, int kind, boolean norm, int vecSize) {
10196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        validate();
10206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return rsnIncElementCreate(mIncCon, type, kind, norm, vecSize);
10216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
10226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    native long rsnIncTypeCreate(long con, long eid, int x, int y, int z, boolean mips, boolean faces, int yuv);
10236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    synchronized long nIncTypeCreate(long eid, int x, int y, int z, boolean mips, boolean faces, int yuv) {
10246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        validate();
10256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return rsnIncTypeCreate(mIncCon, eid, x, y, z, mips, faces, yuv);
10266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
102794ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang    native long  rsnIncAllocationCreateTyped(long con, long incCon, long alloc, long type, int xBytesSize);
102894ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang    synchronized long nIncAllocationCreateTyped(long alloc, long type, int xBytesSize) {
10296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        validate();
103094ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang        return rsnIncAllocationCreateTyped(mContext, mIncCon, alloc, type, xBytesSize);
10316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1032a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray
1033bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    long     mContext;
10342c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang    private boolean mDestroyed = false;
10356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    //Dummy device & context for Inc Support Lib
10366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    long     mIncCon;
10376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    //indicator of whether inc support lib has been loaded or not.
10386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    boolean  mIncLoaded;
1039a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray    ReentrantReadWriteLock mRWLock;
104045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    @SuppressWarnings({"FieldCanBeLocal"})
104145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    MessageThread mMessageThread;
104245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
104345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_U8;
104445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_I8;
104545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_U16;
104645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_I16;
104745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_U32;
104845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_I32;
104945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_U64;
105045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_I64;
105145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_F32;
105245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_F64;
105345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_BOOLEAN;
105445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
105545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_ELEMENT;
105645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_TYPE;
105745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_ALLOCATION;
105845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_SAMPLER;
105945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_SCRIPT;
106045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
106145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_A_8;
106245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_RGB_565;
106345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_RGB_888;
106445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_RGBA_5551;
106545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_RGBA_4444;
106645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_RGBA_8888;
106745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
106845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_FLOAT_2;
106945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_FLOAT_3;
107045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_FLOAT_4;
107145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
107245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_DOUBLE_2;
107345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_DOUBLE_3;
107445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_DOUBLE_4;
107545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
107645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_UCHAR_2;
107745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_UCHAR_3;
107845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_UCHAR_4;
107945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
108045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_CHAR_2;
108145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_CHAR_3;
108245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_CHAR_4;
108345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
108445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_USHORT_2;
108545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_USHORT_3;
108645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_USHORT_4;
108745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
108845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_SHORT_2;
108945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_SHORT_3;
109045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_SHORT_4;
109145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
109245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_UINT_2;
109345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_UINT_3;
109445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_UINT_4;
109545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
109645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_INT_2;
109745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_INT_3;
109845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_INT_4;
109945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
110045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_ULONG_2;
110145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_ULONG_3;
110245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_ULONG_4;
110345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
110445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_LONG_2;
110545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_LONG_3;
110645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_LONG_4;
110745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
110845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_MATRIX_4X4;
110945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_MATRIX_3X3;
111045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_MATRIX_2X2;
111145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
111245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Sampler mSampler_CLAMP_NEAREST;
111345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Sampler mSampler_CLAMP_LINEAR;
111445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
111545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Sampler mSampler_WRAP_NEAREST;
111645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Sampler mSampler_WRAP_LINEAR;
111745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
1118e79f94bf70aebfc9bc42a857ec5b89ba1b95ba27Tim Murray    Sampler mSampler_MIRRORED_REPEAT_NEAREST;
1119e79f94bf70aebfc9bc42a857ec5b89ba1b95ba27Tim Murray    Sampler mSampler_MIRRORED_REPEAT_LINEAR;
1120e79f94bf70aebfc9bc42a857ec5b89ba1b95ba27Tim Murray    Sampler mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
1121e79f94bf70aebfc9bc42a857ec5b89ba1b95ba27Tim Murray
112245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
112345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    ///////////////////////////////////////////////////////////////////////////////////
112445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    //
112545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
112645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
1127032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * The base class from which an application should derive in order
1128032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * to receive RS messages from scripts. When a script calls {@code
1129032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * rsSendToClient}, the data fields will be filled, and the run
1130032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * method will be called on a separate thread.  This will occur
1131032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * some time after {@code rsSendToClient} completes in the script,
1132032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * as {@code rsSendToClient} is asynchronous. Message handlers are
1133032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * not guaranteed to have completed when {@link
11342192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines     * android.support.v8.renderscript.RenderScript#finish} returns.
113545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
113645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
113745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static class RSMessageHandler implements Runnable {
113845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected int[] mData;
113945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected int mID;
114045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected int mLength;
114145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public void run() {
114245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
114345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
114445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
1145032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * If an application is expecting messages, it should set this
1146032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * field to an instance of {@link RSMessageHandler}.  This
1147032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * instance will receive all the user messages sent from {@code
1148032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * sendToClient} by scripts from this context.
114945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
115045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
115145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    RSMessageHandler mMessageCallback = null;
115245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
115345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setMessageHandler(RSMessageHandler msg) {
115445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMessageCallback = msg;
115545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
115645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public RSMessageHandler getMessageHandler() {
115745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mMessageCallback;
115845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
115945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
116045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
1161032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Place a message into the message queue to be sent back to the message
1162032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * handler once all previous commands have been executed.
1163032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     *
1164dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines     * @param id
1165dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines     * @param data
1166dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines     */
1167dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines    public void sendMessage(int id, int[] data) {
1168dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        nContextSendMessage(id, data);
1169dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines    }
1170dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines
1171dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines    /**
1172032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * The runtime error handler base class.  An application should derive from this class
1173032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * if it wishes to install an error handler.  When errors occur at runtime,
1174032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * the fields in this class will be filled, and the run method will be called.
117545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
117645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
117745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static class RSErrorHandler implements Runnable {
117845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected String mErrorMessage;
117945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected int mErrorNum;
118045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public void run() {
118145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
118245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
118345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
118445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
118545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Application Error handler.  All runtime errors will be dispatched to the
118645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * instance of RSAsyncError set here.  If this field is null a
1187032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * {@link RSRuntimeException} will instead be thrown with details about the error.
118845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * This will cause program termaination.
118945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
119045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
119145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    RSErrorHandler mErrorCallback = null;
119245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
119345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setErrorHandler(RSErrorHandler msg) {
119445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mErrorCallback = msg;
119545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
119645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public RSErrorHandler getErrorHandler() {
119745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mErrorCallback;
119845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
119945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
120045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
1201032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * RenderScript worker thread priority enumeration.  The default value is
1202032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * NORMAL.  Applications wishing to do background processing should set
1203032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * their priority to LOW to avoid starving forground processes.
120445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
120545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public enum Priority {
120645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        LOW (Process.THREAD_PRIORITY_BACKGROUND + (5 * Process.THREAD_PRIORITY_LESS_FAVORABLE)),
120745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        NORMAL (Process.THREAD_PRIORITY_DISPLAY);
120845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
120945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int mID;
121045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        Priority(int id) {
121145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mID = id;
121245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
121345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
121445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
121589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    void validateObject(BaseObj o) {
121689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (o != null) {
121789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            if (o.mRS != this) {
121889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                throw new RSIllegalArgumentException("Attempting to use an object across contexts.");
121989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            }
122089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
122189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
122289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
122345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    void validate() {
122445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (mContext == 0) {
122545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSInvalidStateException("Calling RS with no Context active.");
122645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
122745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
122845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1229dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    /**
1230dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang     * check if IO support lib is available.
1231dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang     */
1232dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    boolean usingIO() {
1233dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        return useIOlib;
1234dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang    }
123545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
123645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Change the priority of the worker threads for this context.
123745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
123845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param p New priority to be set.
123945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
124045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setPriority(Priority p) {
124145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
124245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        nContextSetPriority(p.mID);
124345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
124445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
124545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static class MessageThread extends Thread {
124645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        RenderScript mRS;
124745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        boolean mRun = true;
124845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int[] mAuxData = new int[2];
124945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
125045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
125145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
125245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
125345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
125445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
12556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        static final int RS_MESSAGE_TO_CLIENT_USER = 4;
125626a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung        static final int RS_ERROR_FATAL_DEBUG = 0x800;
125745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
125845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
125945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        MessageThread(RenderScript rs) {
126045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            super("RSMessageThread");
126145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mRS = rs;
126245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
126345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
126445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
126545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public void run() {
126645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            // This function is a temporary solution.  The final solution will
126745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            // used typed allocations where the message id is the type indicator.
126845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            int[] rbuf = new int[16];
126945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mRS.nContextInitToClient(mRS.mContext);
127045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            while(mRun) {
127145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                rbuf[0] = 0;
127245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
127345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                int size = mAuxData[1];
127445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                int subID = mAuxData[0];
127545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
127645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                if (msg == RS_MESSAGE_TO_CLIENT_USER) {
127745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    if ((size>>2) >= rbuf.length) {
127845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        rbuf = new int[(size + 3) >> 2];
127945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    }
128045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
128145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        RS_MESSAGE_TO_CLIENT_USER) {
1282032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines                        throw new RSDriverException("Error processing message from RenderScript.");
128345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    }
128445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
128545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    if(mRS.mMessageCallback != null) {
128645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mMessageCallback.mData = rbuf;
128745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mMessageCallback.mID = subID;
128845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mMessageCallback.mLength = size;
128945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mMessageCallback.run();
129045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    } else {
129145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
129245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    }
129345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    continue;
129445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                }
129545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
129645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
129745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    String e = mRS.nContextGetErrorMessage(mRS.mContext);
129845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
129926a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                    // Copied from java/android/renderscript/RenderScript.java
130026a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                    // Throw RSRuntimeException under the following conditions:
130126a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                    //
130226a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                    // 1) It is an unknown fatal error.
130326a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                    // 2) It is a debug fatal error, and we are not in a
130426a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                    //    debug context.
130526a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                    // 3) It is a debug fatal error, and we do not have an
130626a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                    //    error callback.
130726a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                    if (subID >= RS_ERROR_FATAL_UNKNOWN ||
130826a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                        (subID >= RS_ERROR_FATAL_DEBUG &&
130926a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                         (mRS.mContextType != ContextType.DEBUG ||
131026a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                          mRS.mErrorCallback == null))) {
131126a3718d02d4a35be8a2a5f325d7242f8684d79dI-Jui (Ray) Sung                        android.util.Log.e(LOG_TAG, "fatal RS error, " + e);
131245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
131345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    }
131445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
131545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    if(mRS.mErrorCallback != null) {
131645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mErrorCallback.mErrorMessage = e;
131745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mErrorCallback.mErrorNum = subID;
131845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mErrorCallback.run();
131945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    } else {
1320dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines                        android.util.Log.e(LOG_TAG, "non fatal RS error, " + e);
132145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        // Do not throw here. In these cases, we do not have
132245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        // a fatal error.
132345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    }
132445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    continue;
132545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                }
132645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
132745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                // 2: teardown.
132845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                // But we want to avoid starving other threads during
132945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                // teardown by yielding until the next line in the destructor
133045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                // can execute to set mRun = false
133145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                try {
133245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    sleep(1, 0);
133345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                } catch(InterruptedException e) {
133445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                }
133545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
133690fbed82b44c96f1e51db4dacb00d2b3f6affbdfTim Murray            //Log.d(LOG_TAG, "MessageThread exiting.");
133745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
133845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
133945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
134045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    RenderScript(Context ctx) {
13414516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        mContextType = ContextType.NORMAL;
134245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (ctx != null) {
134345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mApplicationContext = ctx.getApplicationContext();
1344d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang            // Only set mNativeLibDir for API 9+.
134526e769df4464efe5855588a8c9631d4617501374Kirill Grouchnikov            mNativeLibDir = mApplicationContext.getApplicationInfo().nativeLibraryDir;
134645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
13476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mIncCon = 0;
13486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mIncLoaded = false;
1349a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray        mRWLock = new ReentrantReadWriteLock();
135045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
135145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
135245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
135345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Gets the application context associated with the RenderScript context.
135445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
135545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return The application context.
135645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
135745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public final Context getApplicationContext() {
135845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mApplicationContext;
135945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
136045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
136145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
1362032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Create a RenderScript context.
136345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
136445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param ctx The context.
136545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return RenderScript
136645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
13674516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    private static RenderScript internalCreate(Context ctx, int sdkVersion, ContextType ct, int flags) {
136845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        RenderScript rs = new RenderScript(ctx);
136945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1370a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray        if (sSdkVersion == -1) {
1371a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray            sSdkVersion = sdkVersion;
1372a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray        } else if (sSdkVersion != sdkVersion) {
1373a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray            throw new RSRuntimeException("Can't have two contexts with different SDK versions in support lib");
1374a33549e51d1ba585a349bbf7b49cd32dbca0def3Tim Murray        }
13756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        useNative = setupNative(sSdkVersion, ctx);
13765ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray        synchronized(lock) {
13775ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray            if (sInitialized == false) {
13785ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                try {
1379d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    Class<?> vm_runtime = Class.forName("dalvik.system.VMRuntime");
1380d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    Method get_runtime = vm_runtime.getDeclaredMethod("getRuntime");
1381d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    sRuntime = get_runtime.invoke(null);
1382d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    registerNativeAllocation = vm_runtime.getDeclaredMethod("registerNativeAllocation", Integer.TYPE);
1383d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    registerNativeFree = vm_runtime.getDeclaredMethod("registerNativeFree", Integer.TYPE);
1384d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    sUseGCHooks = true;
1385d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                } catch (Exception e) {
1386d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    Log.e(LOG_TAG, "No GC methods");
1387d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    sUseGCHooks = false;
1388d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                }
1389d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                try {
139039334625723d623af10c4a7f7a1bcc6ab6c4d787Yang Ni                    // For API 9 - 22, always use the absolute path of librsjni.so
139139334625723d623af10c4a7f7a1bcc6ab6c4d787Yang Ni                    // http://b/25226912
139239334625723d623af10c4a7f7a1bcc6ab6c4d787Yang Ni                    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M &&
139339334625723d623af10c4a7f7a1bcc6ab6c4d787Yang Ni                        rs.mNativeLibDir != null) {
1394d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                        System.load(rs.mNativeLibDir + "/librsjni.so");
1395d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                    } else {
1396d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                        System.loadLibrary("rsjni");
1397d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                    }
13985ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                    sInitialized = true;
1399bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang                    sPointerSize = rsnSystemGetPointerSize();
14005ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                } catch (UnsatisfiedLinkError e) {
14015ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                    Log.e(LOG_TAG, "Error loading RS jni library: " + e);
1402d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                    throw new RSRuntimeException("Error loading RS jni library: " + e + " Support lib API: " + SUPPORT_LIB_VERSION);
14035ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                }
14045ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray            }
14055ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray        }
1406ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
1407470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        if (useNative) {
1408470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang            android.util.Log.v(LOG_TAG, "RS native mode");
1409470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        } else {
1410470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang            android.util.Log.v(LOG_TAG, "RS compat mode");
1411470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        }
1412dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang
1413dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
1414dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang            useIOlib = true;
1415dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        }
14160860d1d49cae4f0d7a0cd541a02ced1b05a952f1Miao Wang
1417562ca66a3fa525fe97006f3a55e2ce0746dadc7eMiao Wang        // The target API level used to init dispatchTable.
14180860d1d49cae4f0d7a0cd541a02ced1b05a952f1Miao Wang        int dispatchAPI = sdkVersion;
14190860d1d49cae4f0d7a0cd541a02ced1b05a952f1Miao Wang        if (sdkVersion < android.os.Build.VERSION.SDK_INT) {
14200860d1d49cae4f0d7a0cd541a02ced1b05a952f1Miao Wang            // If the device API is higher than target API level, init dispatch table based on device API.
14210860d1d49cae4f0d7a0cd541a02ced1b05a952f1Miao Wang            dispatchAPI = android.os.Build.VERSION.SDK_INT;
14220860d1d49cae4f0d7a0cd541a02ced1b05a952f1Miao Wang        }
142389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
1424d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        String rssupportPath = null;
142539334625723d623af10c4a7f7a1bcc6ab6c4d787Yang Ni        // For API 9 - 22, always use the absolute path of libRSSupport.so
142639334625723d623af10c4a7f7a1bcc6ab6c4d787Yang Ni        // http://b/25226912
142739334625723d623af10c4a7f7a1bcc6ab6c4d787Yang Ni        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M &&
142839334625723d623af10c4a7f7a1bcc6ab6c4d787Yang Ni            rs.mNativeLibDir != null) {
1429d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang            rssupportPath = rs.mNativeLibDir + "/libRSSupport.so";
1430d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        }
1431d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang        if (!rs.nLoadSO(useNative, dispatchAPI, rssupportPath)) {
1432470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang            if (useNative) {
1433470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang                android.util.Log.v(LOG_TAG, "Unable to load libRS.so, falling back to compat mode");
14346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                useNative = false;
1435470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang            }
143632a07c00686e1d763681c9a2ebc2b268b1b94a0cMiao Wang            try {
143739334625723d623af10c4a7f7a1bcc6ab6c4d787Yang Ni                if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.M &&
143839334625723d623af10c4a7f7a1bcc6ab6c4d787Yang Ni                    rs.mNativeLibDir != null) {
1439d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                    System.load(rssupportPath);
1440d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                } else {
1441d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                    System.loadLibrary("RSSupport");
1442d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                }
144332a07c00686e1d763681c9a2ebc2b268b1b94a0cMiao Wang            } catch (UnsatisfiedLinkError e) {
1444d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                Log.e(LOG_TAG, "Error loading RS Compat library: " + e + " Support lib version: " + SUPPORT_LIB_VERSION);
1445d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                throw new RSRuntimeException("Error loading RS Compat library: " + e + " Support lib version: " + SUPPORT_LIB_VERSION);
144632a07c00686e1d763681c9a2ebc2b268b1b94a0cMiao Wang            }
1447d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang            if (!rs.nLoadSO(false, dispatchAPI, rssupportPath)) {
1448d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                Log.e(LOG_TAG, "Error loading RS Compat library: nLoadSO() failed; Support lib version: " + SUPPORT_LIB_VERSION);
1449d3fdb27e85cd38ffacd963bced1f91a9297a68d8Miao Wang                throw new RSRuntimeException("Error loading libRSSupport library, Support lib version: " + SUPPORT_LIB_VERSION);
1450470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang            }
1451470b3b5b70ec71042d30004747c625ca76c4007aMiao Wang        }
1452baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray
1453dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        if (useIOlib) {
1454c7d910e04869852f199f24f626eb8df4a0169f58Miao Wang            try {
1455c7d910e04869852f199f24f626eb8df4a0169f58Miao Wang                System.loadLibrary("RSSupportIO");
1456c7d910e04869852f199f24f626eb8df4a0169f58Miao Wang            } catch (UnsatisfiedLinkError e) {
1457c7d910e04869852f199f24f626eb8df4a0169f58Miao Wang                useIOlib = false;
1458c7d910e04869852f199f24f626eb8df4a0169f58Miao Wang            }
1459c7d910e04869852f199f24f626eb8df4a0169f58Miao Wang            if (!useIOlib || !rs.nLoadIOSO()) {
1460dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang                android.util.Log.v(LOG_TAG, "Unable to load libRSSupportIO.so, USAGE_IO not supported");
1461dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang                useIOlib = false;
1462dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang            }
1463dd12e72228ea20b7fdea4dbf32c88291aef6d552Miao Wang        }
1464ecccf940f72679f7602c52b0b4bcb245acdad55bMiao Wang
1465562ca66a3fa525fe97006f3a55e2ce0746dadc7eMiao Wang        // For old APIs with dlopen bug, need to load blas lib in Java first.
1466562ca66a3fa525fe97006f3a55e2ce0746dadc7eMiao Wang        // Only try load to blasV8 when the desired API level includes IntrinsicBLAS.
1467562ca66a3fa525fe97006f3a55e2ce0746dadc7eMiao Wang        if (dispatchAPI >= 23) {
146889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            // Enable multi-input kernels only when diapatchAPI is M+.
146989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            rs.mEnableMultiInput = true;
1470562ca66a3fa525fe97006f3a55e2ce0746dadc7eMiao Wang            try {
1471562ca66a3fa525fe97006f3a55e2ce0746dadc7eMiao Wang                System.loadLibrary("blasV8");
1472562ca66a3fa525fe97006f3a55e2ce0746dadc7eMiao Wang            } catch (UnsatisfiedLinkError e) {
1473562ca66a3fa525fe97006f3a55e2ce0746dadc7eMiao Wang                Log.v(LOG_TAG, "Unable to load BLAS lib, ONLY BNNM will be supported: " + e);
1474562ca66a3fa525fe97006f3a55e2ce0746dadc7eMiao Wang            }
1475562ca66a3fa525fe97006f3a55e2ce0746dadc7eMiao Wang        }
1476562ca66a3fa525fe97006f3a55e2ce0746dadc7eMiao Wang
1477eb884da1d4352bcfefe50fb1eb76af04c1ade893Yang Ni        long device = rs.nDeviceCreate();
1478eb884da1d4352bcfefe50fb1eb76af04c1ade893Yang Ni        rs.mContext = rs.nContextCreate(device, 0, sdkVersion, ct.mID, rs.mNativeLibDir);
14794516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        rs.mContextType = ct;
14804516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        rs.mContextFlags = flags;
14814516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        rs.mContextSdkVersion = sdkVersion;
148229f8636ee81c93588204e54273df97d8326b103cMiao Wang        rs.mDispatchAPILevel = dispatchAPI;
148345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (rs.mContext == 0) {
148445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSDriverException("Failed to create RS context.");
148545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
148645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rs.mMessageThread = new MessageThread(rs);
148745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rs.mMessageThread.start();
148813e357047ba2bf81bf44000a623464b1287aafe7Jason Sams        return rs;
148945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
149045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
149145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
1492032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Create a RenderScript context.
149345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
14944516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * See documentation for @create for details
14954516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
149645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param ctx The context.
149745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return RenderScript
149845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
149945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static RenderScript create(Context ctx) {
150038f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        return create(ctx, ContextType.NORMAL);
150138f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    }
150238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams
150338f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    /**
15044516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * calls create(ctx, ct, CREATE_FLAG_NONE)
150538f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     *
15064516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * See documentation for @create for details
150738f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     *
150838f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     * @param ctx The context.
1509032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * @param ct The type of context to be created.
151038f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     * @return RenderScript
151138f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     */
151238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    public static RenderScript create(Context ctx, ContextType ct) {
15134516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        return create(ctx, ct, CREATE_FLAG_NONE);
15144516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    }
15154516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
15164516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    /**
15174516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * Gets or creates a RenderScript context of the specified type.
15184516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
15194516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * The returned context will be cached for future reuse within
15204516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * the process. When an application is finished using
15214516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * RenderScript it should call releaseAllContexts()
15224516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
15234516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * A process context is a context designed for easy creation and
15244516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * lifecycle management.  Multiple calls to this function will
15254516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * return the same object provided they are called with the same
15264516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * options.  This allows it to be used any time a RenderScript
15274516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * context is needed.
15284516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
15294516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
15304516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @param ctx The context.
15314516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @param ct The type of context to be created.
15324516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @param flags The OR of the CREATE_FLAG_* options desired
15334516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @return RenderScript
15344516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     */
15354516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    public static RenderScript create(Context ctx, ContextType ct, int flags) {
153645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int v = ctx.getApplicationInfo().targetSdkVersion;
15374516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        return create(ctx, v, ct, flags);
15384516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    }
15394516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
15404516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    /**
15414516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * calls create(ctx, sdkVersion, ContextType.NORMAL, CREATE_FLAG_NONE)
15424516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
15434516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * Used by the RenderScriptThunker to maintain backward compatibility.
15444516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
15454516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @hide
15464516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @param ctx The context.
15474516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @param sdkVersion The target SDK Version.
15484516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @return RenderScript
15494516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     */
15504516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    public static RenderScript create(Context ctx, int sdkVersion) {
15514516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        return create(ctx, sdkVersion, ContextType.NORMAL, CREATE_FLAG_NONE);
15524516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    }
15534516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
15544516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
15554516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    /**
15564516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * calls create(ctx, sdkVersion, ct, CREATE_FLAG_NONE)
15574516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * Create a RenderScript context.
15584516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
15594516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @hide
15604516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @param ctx The context.
15614516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @return RenderScript
15624516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     */
15634516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    public static RenderScript create(Context ctx, int sdkVersion, ContextType ct) {
15644516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        return create(ctx, sdkVersion, ct, CREATE_FLAG_NONE);
15654516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    }
15664516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
15674516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     /**
15684516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * Gets or creates a RenderScript context of the specified type.
15694516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
15704516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @param ctx The context.
15714516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @param ct The type of context to be created.
15724516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @param sdkVersion The target SDK Version.
15734516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @param flags The OR of the CREATE_FLAG_* options desired
15744516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @return RenderScript
15754516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     */
15764516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    public static RenderScript create(Context ctx, int sdkVersion, ContextType ct, int flags) {
15774516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        synchronized (mProcessContextList) {
15784516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang            for (RenderScript prs : mProcessContextList) {
15794516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang                if ((prs.mContextType == ct) &&
15804516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang                    (prs.mContextFlags == flags) &&
15814516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang                    (prs.mContextSdkVersion == sdkVersion)) {
15824516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
15834516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang                    return prs;
15844516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang                }
15854516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang            }
15864516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
15874516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang            RenderScript prs = internalCreate(ctx, sdkVersion, ct, flags);
15884516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang            prs.mIsProcessContext = true;
15894516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang            mProcessContextList.add(prs);
15904516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang            return prs;
15914516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        }
15924516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    }
15934516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
15944516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    /**
15954516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
15964516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * Releases all the process contexts.  This is the same as
15974516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * calling .destroy() on each unique context retreived with
15984516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * create(...). If no contexts have been created this
15994516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * function does nothing.
16004516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
16014516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * Typically you call this when your application is losing focus
16024516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * and will not be using a context for some time.
16034516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
16044516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * This has no effect on a context created with
16054516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * createMultiContext()
16064516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     */
16074516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    public static void releaseAllContexts() {
16084516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        ArrayList<RenderScript> oldList;
16094516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        synchronized (mProcessContextList) {
16104516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang            oldList = mProcessContextList;
16114516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang            mProcessContextList = new ArrayList<RenderScript>();
16124516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        }
16134516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
16144516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        for (RenderScript prs : oldList) {
16154516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang            prs.mIsProcessContext = false;
16164516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang            prs.destroy();
16174516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        }
16184516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        oldList.clear();
16194516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    }
16204516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
16214516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
16224516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang
16234516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    /**
16244516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * Create a RenderScript context.
16254516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
16264516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * This is an advanced function intended for applications which
16274516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * need to create more than one RenderScript context to be used
16284516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * at the same time.
16294516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
16304516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * If you need a single context please use create()
16314516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     *
16324516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @param ctx The context.
16334516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     * @return RenderScript
16344516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang     */
16354516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang    public static RenderScript createMultiContext(Context ctx, ContextType ct, int flags, int API_number) {
16364516dfbd01d3c1e20b35e15b7649baad6710873fMiao Wang        return internalCreate(ctx, API_number, ct, flags);
163745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
163845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
163945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
164045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Print the currently available debugging information about the state of
164145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * the RS context to the log.
164245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
164345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
164445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void contextDump() {
164545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
164645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        nContextDump(0);
164745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
164845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
164945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
1650032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Wait for any pending asynchronous opeations (such as copies to a RS
1651032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * allocation or RS script executions) to complete.
165245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
165345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
165445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void finish() {
165545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        nContextFinish();
165645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
165745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
16582c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang    private void helpDestroy() {
16592c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang        boolean shouldDestroy = false;
16602c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang        synchronized(this) {
16612c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            if (!mDestroyed) {
16622c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                shouldDestroy = true;
16632c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                mDestroyed = true;
16642c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            }
16652c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang        }
16662c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang
16672c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang        if (shouldDestroy) {
16682c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            nContextFinish();
16692c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            if (mIncCon != 0) {
16702c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                nIncContextFinish();
16712c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                nIncContextDestroy();
16722c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                mIncCon = 0;
16732c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            }
16742c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            nContextDeinitToClient(mContext);
16752c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            mMessageThread.mRun = false;
16762c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            // Interrupt mMessageThread so it gets to see immediately that mRun is false
16772c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            // and exit rightaway.
16782c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            mMessageThread.interrupt();
16792c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang
16802c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            // Wait for mMessageThread to join.  Try in a loop, in case this thread gets interrupted
16812c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            // during the wait.  If interrupted, set the "interrupted" status of the current thread.
16822c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            boolean hasJoined = false, interrupted = false;
16832c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            while (!hasJoined) {
16842c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                try {
16852c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                    mMessageThread.join();
16862c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                    hasJoined = true;
16872c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                } catch (InterruptedException e) {
16882c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                    interrupted = true;
16892c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                }
16902c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            }
16912c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            if (interrupted) {
16922c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                Log.v(LOG_TAG, "Interrupted during wait for MessageThread to join");
16932c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang                Thread.currentThread().interrupt();
16942c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            }
16952c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang
16962c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang            nContextDestroy();
16972c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang        }
16982c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang    }
16992c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang
17002c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang    @Override
17012c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang    protected void finalize() throws Throwable {
17022c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang        helpDestroy();
17032c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang        super.finalize();
17042c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang    }
17052c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang
170645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
1707032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Destroys this RenderScript context.  Once this function is called,
1708032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * using this context or any objects belonging to this context is
1709032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * illegal.
171045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
1711f23c77a9fd354294cfae9fa43728f3668057f17eMiao Wang     * This function is a NOP if the context was created
1712f23c77a9fd354294cfae9fa43728f3668057f17eMiao Wang     * with create().  Please use releaseAllContexts() to clean up
1713f23c77a9fd354294cfae9fa43728f3668057f17eMiao Wang     * contexts created with the create function.
171445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
171545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void destroy() {
1716f23c77a9fd354294cfae9fa43728f3668057f17eMiao Wang        if (mIsProcessContext) {
1717f23c77a9fd354294cfae9fa43728f3668057f17eMiao Wang            // users cannot destroy a process context
1718f23c77a9fd354294cfae9fa43728f3668057f17eMiao Wang            return;
1719f23c77a9fd354294cfae9fa43728f3668057f17eMiao Wang        }
172045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
17212c356237a56c03574f76bc1a4b9935c5aa2513deMiao Wang        helpDestroy();
172245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
172345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
172445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    boolean isAlive() {
172545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mContext != 0;
172645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
172745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1728bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    long safeID(BaseObj o) {
172945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(o != null) {
173045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return o.getID(this);
173145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
173245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return 0;
173345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
173445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams}
1735