RenderScript.java revision d176abf6992ea9b34a01ba1e8b232ac4ac08db31
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;
2245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2345d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.Context;
2445d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.pm.ApplicationInfo;
2545d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.pm.PackageManager;
2645d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.res.AssetManager;
2745d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.graphics.Bitmap;
2845d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.graphics.BitmapFactory;
2945d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.os.Process;
3045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.util.Log;
3145d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.view.Surface;
3245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
33baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murrayimport android.os.SystemProperties;
3445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
3545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/**
36032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * This class provides access to a RenderScript context, which controls RenderScript
37032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * initialization, resource management, and teardown. An instance of the RenderScript
38032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * class must be created before any other RS objects can be created.
3945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
4045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * <div class="special reference">
4145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * <h3>Developer Guides</h3>
42032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * <p>For more information about creating an application that uses RenderScript, read the
43032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
4445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * </div>
4545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams **/
4645d443665f5ce7efa934706a89883f0cc87f3513Jason Samspublic class RenderScript {
4745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static final String LOG_TAG = "RenderScript_jni";
4845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static final boolean DEBUG  = false;
4945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    @SuppressWarnings({"UnusedDeclaration", "deprecation"})
5045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static final boolean LOG_ENABLED = false;
5145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
5245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    private Context mApplicationContext;
53a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
5445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /*
5545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * We use a class initializer to allow the native code to cache some
5645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * field offsets.
5745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
5845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
5945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static boolean sInitialized;
60d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray    static boolean sUseGCHooks;
61d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray    static Object sRuntime;
62d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray    static Method registerNativeAllocation;
63d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray    static Method registerNativeFree;
64d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray
655ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray    static Object lock = new Object();
6645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
6745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    // Non-threadsafe functions.
6845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int  nDeviceCreate();
6945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void nDeviceDestroy(int dev);
7045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void nDeviceSetConfig(int dev, int param, int value);
7145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int nContextGetUserMessage(int con, int[] data);
7245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native String nContextGetErrorMessage(int con);
7345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int  nContextPeekMessage(int con, int[] subID);
7445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void nContextInitToClient(int con);
7545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void nContextDeinitToClient(int con);
7645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
77baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray    static boolean isNative = false;
78baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray
79257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    private static int thunk = 0;
80257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    /**
81257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines     * Determines whether or not we should be thunking into the native
82257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines     * RenderScript layer or actually using the compatibility library.
83257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines     */
84257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    static boolean shouldThunk() {
85257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        if (thunk == 0) {
86257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2
87257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines                    && SystemProperties.getInt("debug.rs.forcecompat", 0) == 0) {
88257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines                thunk = 1;
89257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines            } else {
90257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines                thunk = -1;
91257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines            }
92257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        }
93257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        if (thunk == 1) {
94257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines            return true;
95257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        }
96257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        return false;
97257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines    }
98257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines
9945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
10045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Name of the file that holds the object cache.
10145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
10245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    private static final String CACHE_PATH = "com.android.renderscript.cache";
10345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static String mCachePath;
10445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
10545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     /**
10645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Sets the directory to use as a persistent storage for the
10745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * renderscript object file cache.
10845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
10945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @hide
11045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param cacheDir A directory the current process can write to
11145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
11245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static void setupDiskCache(File cacheDir) {
11345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        File f = new File(cacheDir, CACHE_PATH);
11445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mCachePath = f.getAbsolutePath();
11545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        f.mkdirs();
11645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
11745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
118032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines    /**
119032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * ContextType specifies the specific type of context to be created.
120032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     *
121032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     */
12238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    public enum ContextType {
123032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
124032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * NORMAL context, this is the default and what shipping apps should
125032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * use.
126032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
12738f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        NORMAL (0),
128032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines
129032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
130032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * DEBUG context, perform extra runtime checks to validate the
131032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * kernels and APIs are being used as intended.  Get and SetElementAt
132032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * will be bounds checked in this mode.
133032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
13438f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        DEBUG (1),
135032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines
136032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
137032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * PROFILE context, Intended to be used once the first time an
138032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * application is run on a new device.  This mode allows the runtime to
139032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * do additional testing and performance tuning.
140032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
14138f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        PROFILE (2);
14238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams
14338f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        int mID;
14438f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        ContextType(int id) {
14538f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams            mID = id;
14638f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        }
14738f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    }
14845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
14945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    // Methods below are wrapped to protect the non-threadsafe
15045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    // lockless fifo.
15138f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    native int  rsnContextCreate(int dev, int ver, int sdkVer, int contextType);
15238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    synchronized int nContextCreate(int dev, int ver, int sdkVer, int contextType) {
15338f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        return rsnContextCreate(dev, ver, sdkVer, contextType);
15445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
15545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnContextDestroy(int con);
15645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nContextDestroy() {
15745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
15845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnContextDestroy(mContext);
15945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
16045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnContextSetPriority(int con, int p);
16145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nContextSetPriority(int p) {
16245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
16345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnContextSetPriority(mContext, p);
16445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
16545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnContextDump(int con, int bits);
16645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nContextDump(int bits) {
16745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
16845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnContextDump(mContext, bits);
16945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
17045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnContextFinish(int con);
17145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nContextFinish() {
17245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
17345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnContextFinish(mContext);
17445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
17545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
176dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines    native void rsnContextSendMessage(int con, int id, int[] data);
177dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines    synchronized void nContextSendMessage(int id, int[] data) {
178dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        validate();
179dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        rsnContextSendMessage(mContext, id, data);
180dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines    }
181dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines
18245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnObjDestroy(int con, int id);
18345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nObjDestroy(int id) {
18445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // There is a race condition here.  The calling code may be run
18545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // by the gc while teardown is occuring.  This protects againts
18645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        // deleting dead objects.
18745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (mContext != 0) {
18845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rsnObjDestroy(mContext, id);
18945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
19045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
19145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
19245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int  rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize);
19345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) {
19445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
19545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnElementCreate(mContext, type, kind, norm, vecSize);
19645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
19745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int  rsnElementCreate2(int con, int[] elements, String[] names, int[] arraySizes);
19845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized int nElementCreate2(int[] elements, String[] names, int[] arraySizes) {
19945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
20045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnElementCreate2(mContext, elements, names, arraySizes);
20145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
20245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnElementGetNativeData(int con, int id, int[] elementData);
20345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nElementGetNativeData(int id, int[] elementData) {
20445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
20545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnElementGetNativeData(mContext, id, elementData);
20645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
20745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnElementGetSubElements(int con, int id,
20845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                         int[] IDs, String[] names, int[] arraySizes);
20945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nElementGetSubElements(int id, int[] IDs, String[] names, int[] arraySizes) {
21045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
21145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnElementGetSubElements(mContext, id, IDs, names, arraySizes);
21245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
21345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2145d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams    native int rsnTypeCreate(int con, int eid, int x, int y, int z, boolean mips, boolean faces, int yuv);
2155d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams    synchronized int nTypeCreate(int eid, int x, int y, int z, boolean mips, boolean faces, int yuv) {
21645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
2175d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams        return rsnTypeCreate(mContext, eid, x, y, z, mips, faces, yuv);
21845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
21945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnTypeGetNativeData(int con, int id, int[] typeData);
22045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nTypeGetNativeData(int id, int[] typeData) {
22145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
22245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnTypeGetNativeData(mContext, id, typeData);
22345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
22445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
22545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int  rsnAllocationCreateTyped(int con, int type, int mip, int usage, int pointer);
22645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized int nAllocationCreateTyped(int type, int mip, int usage, int pointer) {
22745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
22845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer);
22945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
23045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int  rsnAllocationCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
23145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized int nAllocationCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
23245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
23345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
23445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
2355d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams
2369c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray    native int  rsnAllocationCreateBitmapBackedAllocation(int con, int type, int mip, Bitmap bmp, int usage);
2379c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray    synchronized int nAllocationCreateBitmapBackedAllocation(int type, int mip, Bitmap bmp, int usage) {
2389c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        validate();
2399c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        return rsnAllocationCreateBitmapBackedAllocation(mContext, type, mip, bmp, usage);
2409c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray    }
2415d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams
2425d9bba7f40f2c313f1d1ea724db9a37c69ebd828Jason Sams
24345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int  rsnAllocationCubeCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
24445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized int nAllocationCubeCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
24545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
24645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
24745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
24845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int  rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp);
24945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) {
25045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
25145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnAllocationCreateBitmapRef(mContext, type, bmp);
25245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
25345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int  rsnAllocationCreateFromAssetStream(int con, int mips, int assetStream, int usage);
25445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized int nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
25545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
25645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
25745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
25845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
25945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void  rsnAllocationCopyToBitmap(int con, int alloc, Bitmap bmp);
26045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationCopyToBitmap(int alloc, Bitmap bmp) {
26145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
26245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationCopyToBitmap(mContext, alloc, bmp);
26345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
26445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
26545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
26645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationSyncAll(int con, int alloc, int src);
26745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationSyncAll(int alloc, int src) {
26845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
26945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationSyncAll(mContext, alloc, src);
27045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
2719c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray    native void rsnAllocationIoSend(int con, int alloc);
2729c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray    synchronized void nAllocationIoSend(int alloc) {
2739c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        validate();
2749c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        rsnAllocationIoSend(mContext, alloc);
2759c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray    }
2769c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray    native void rsnAllocationIoReceive(int con, int alloc);
2779c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray    synchronized void nAllocationIoReceive(int alloc) {
2789c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        validate();
2799c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray        rsnAllocationIoReceive(mContext, alloc);
2809c49e0a50bb720374cf9df2087ffd1ab3973f660Tim Murray    }
28145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
28245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
28345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationGenerateMipmaps(int con, int alloc);
28445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationGenerateMipmaps(int alloc) {
28545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
28645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationGenerateMipmaps(mContext, alloc);
28745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
28845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void  rsnAllocationCopyFromBitmap(int con, int alloc, Bitmap bmp);
28945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationCopyFromBitmap(int alloc, Bitmap bmp) {
29045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
29145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
29245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
29345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
29445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
29545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationData1D(int con, int id, int off, int mip, int count, int[] d, int sizeBytes);
29645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationData1D(int id, int off, int mip, int count, int[] d, int sizeBytes) {
29745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
29845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
29945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
30045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationData1D(int con, int id, int off, int mip, int count, short[] d, int sizeBytes);
30145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationData1D(int id, int off, int mip, int count, short[] d, int sizeBytes) {
30245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
30345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
30445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
30545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationData1D(int con, int id, int off, int mip, int count, byte[] d, int sizeBytes);
30645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationData1D(int id, int off, int mip, int count, byte[] d, int sizeBytes) {
30745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
30845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
30945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
31045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationData1D(int con, int id, int off, int mip, int count, float[] d, int sizeBytes);
31145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationData1D(int id, int off, int mip, int count, float[] d, int sizeBytes) {
31245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
31345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
31445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
31545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
31645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationElementData1D(int con, int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes);
31745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationElementData1D(int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes) {
31845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
31945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationElementData1D(mContext, id, xoff, mip, compIdx, d, sizeBytes);
32045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
32145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
32245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationData2D(int con,
32345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                    int dstAlloc, int dstXoff, int dstYoff,
32445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                    int dstMip, int dstFace,
32545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                    int width, int height,
32645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                    int srcAlloc, int srcXoff, int srcYoff,
32745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                    int srcMip, int srcFace);
32845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationData2D(int dstAlloc, int dstXoff, int dstYoff,
32945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                        int dstMip, int dstFace,
33045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                        int width, int height,
33145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                        int srcAlloc, int srcXoff, int srcYoff,
33245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                        int srcMip, int srcFace) {
33345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
33445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationData2D(mContext,
33545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                            dstAlloc, dstXoff, dstYoff,
33645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                            dstMip, dstFace,
33745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                            width, height,
33845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                            srcAlloc, srcXoff, srcYoff,
33945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                            srcMip, srcFace);
34045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
34145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
34245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes);
34345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes) {
34445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
34545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
34645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
34745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes);
34845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes) {
34945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
35045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
35145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
35245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes);
35345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes) {
35445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
35545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
35645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
35745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes);
35845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes) {
35945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
36045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
36145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
36245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, Bitmap b);
36345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, Bitmap b) {
36445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
36545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
36645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
36745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
368302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    native void rsnAllocationData3D(int con,
369302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                    int dstAlloc, int dstXoff, int dstYoff, int dstZoff,
370302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                    int dstMip,
371302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                    int width, int height, int depth,
372302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                    int srcAlloc, int srcXoff, int srcYoff, int srcZoff,
373302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                    int srcMip);
374302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    synchronized void nAllocationData3D(int dstAlloc, int dstXoff, int dstYoff, int dstZoff,
375302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                        int dstMip,
376302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                        int width, int height, int depth,
377302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                        int srcAlloc, int srcXoff, int srcYoff, int srcZoff,
378302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                                        int srcMip) {
379302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams        validate();
380302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams        rsnAllocationData3D(mContext,
381302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                            dstAlloc, dstXoff, dstYoff, dstZoff,
382302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                            dstMip, width, height, depth,
383302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams                            srcAlloc, srcXoff, srcYoff, srcZoff, srcMip);
384302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    }
385302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams
386302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, byte[] d, int sizeBytes);
387302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, byte[] d, int sizeBytes) {
388302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams        validate();
389302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams        rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
390302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    }
391302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, short[] d, int sizeBytes);
392302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, short[] d, int sizeBytes) {
393302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams        validate();
394302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams        rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
395302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    }
396302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, int[] d, int sizeBytes);
397302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, int[] d, int sizeBytes) {
398302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams        validate();
399302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams        rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
400302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    }
401302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, float[] d, int sizeBytes);
402302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, float[] d, int sizeBytes) {
403302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams        validate();
404302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams        rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
405302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams    }
406302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams
407302bdd023dfccd7c63c429be4b6edb46314b6293Jason Sams
40845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationRead(int con, int id, byte[] d);
40945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationRead(int id, byte[] d) {
41045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
41145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationRead(mContext, id, d);
41245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
41345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationRead(int con, int id, short[] d);
41445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationRead(int id, short[] d) {
41545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
41645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationRead(mContext, id, d);
41745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
41845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationRead(int con, int id, int[] d);
41945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationRead(int id, int[] d) {
42045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
42145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationRead(mContext, id, d);
42245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
42345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationRead(int con, int id, float[] d);
42445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationRead(int id, float[] d) {
42545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
42645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationRead(mContext, id, d);
42745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
42845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int  rsnAllocationGetType(int con, int id);
42945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized int nAllocationGetType(int id) {
43045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
43145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnAllocationGetType(mContext, id);
43245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
43345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
43445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationResize1D(int con, int id, int dimX);
43545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationResize1D(int id, int dimX) {
43645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
43745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationResize1D(mContext, id, dimX);
43845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
43945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnAllocationResize2D(int con, int id, int dimX, int dimY);
44045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nAllocationResize2D(int id, int dimX, int dimY) {
44145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
44245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnAllocationResize2D(mContext, id, dimX, dimY);
44345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
44445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
44545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptBindAllocation(int con, int script, int alloc, int slot);
44645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nScriptBindAllocation(int script, int alloc, int slot) {
44745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
44845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnScriptBindAllocation(mContext, script, alloc, slot);
44945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
45045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone);
45145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nScriptSetTimeZone(int script, byte[] timeZone) {
45245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
45345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnScriptSetTimeZone(mContext, script, timeZone);
45445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
45545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptInvoke(int con, int id, int slot);
45645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nScriptInvoke(int id, int slot) {
45745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
45845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnScriptInvoke(mContext, id, slot);
45945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
46045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptForEach(int con, int id, int slot, int ain, int aout, byte[] params);
46145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptForEach(int con, int id, int slot, int ain, int aout);
462e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray    native void rsnScriptForEachClipped(int con, int id, int slot, int ain, int aout, byte[] params,
463e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray                                        int xstart, int xend, int ystart, int yend, int zstart, int zend);
464dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines    native void rsnScriptForEachClipped(int con, int id, int slot, int ain, int aout,
465dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines                                        int xstart, int xend, int ystart, int yend, int zstart, int zend);
46645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nScriptForEach(int id, int slot, int ain, int aout, byte[] params) {
46745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
46845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (params == null) {
46945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rsnScriptForEach(mContext, id, slot, ain, aout);
47045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        } else {
47145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            rsnScriptForEach(mContext, id, slot, ain, aout, params);
47245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
47345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
474dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines
475e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray    synchronized void nScriptForEachClipped(int id, int slot, int ain, int aout, byte[] params,
476dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines                                            int xstart, int xend, int ystart, int yend, int zstart, int zend) {
477e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        validate();
478dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        if (params == null) {
479dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines            rsnScriptForEachClipped(mContext, id, slot, ain, aout, xstart, xend, ystart, yend, zstart, zend);
480dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        } else {
481dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines            rsnScriptForEachClipped(mContext, id, slot, ain, aout, params, xstart, xend, ystart, yend, zstart, zend);
482dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        }
483e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray    }
484e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray
48545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptInvokeV(int con, int id, int slot, byte[] params);
48645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nScriptInvokeV(int id, int slot, byte[] params) {
48745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
48845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnScriptInvokeV(mContext, id, slot, params);
48945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
49045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptSetVarI(int con, int id, int slot, int val);
49145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nScriptSetVarI(int id, int slot, int val) {
49245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
49345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnScriptSetVarI(mContext, id, slot, val);
49445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
49545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptSetVarJ(int con, int id, int slot, long val);
49645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nScriptSetVarJ(int id, int slot, long val) {
49745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
49845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnScriptSetVarJ(mContext, id, slot, val);
49945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
50045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptSetVarF(int con, int id, int slot, float val);
50145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nScriptSetVarF(int id, int slot, float val) {
50245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
50345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnScriptSetVarF(mContext, id, slot, val);
50445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
50545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptSetVarD(int con, int id, int slot, double val);
50645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nScriptSetVarD(int id, int slot, double val) {
50745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
50845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnScriptSetVarD(mContext, id, slot, val);
50945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
51045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptSetVarV(int con, int id, int slot, byte[] val);
51145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nScriptSetVarV(int id, int slot, byte[] val) {
51245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
51345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnScriptSetVarV(mContext, id, slot, val);
51445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
51545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptSetVarVE(int con, int id, int slot, byte[] val,
51645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                  int e, int[] dims);
51745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nScriptSetVarVE(int id, int slot, byte[] val,
51845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                      int e, int[] dims) {
51945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
52045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnScriptSetVarVE(mContext, id, slot, val, e, dims);
52145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
52245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native void rsnScriptSetVarObj(int con, int id, int slot, int val);
52345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized void nScriptSetVarObj(int id, int slot, int val) {
52445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
52545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rsnScriptSetVarObj(mContext, id, slot, val);
52645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
52745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
52845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int  rsnScriptCCreate(int con, String resName, String cacheDir,
52945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                 byte[] script, int length);
53045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized int nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
53145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
53245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
53345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
53445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
535a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    native int  rsnScriptIntrinsicCreate(int con, int id, int eid);
536a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    synchronized int nScriptIntrinsicCreate(int id, int eid) {
537a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
538a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        return rsnScriptIntrinsicCreate(mContext, id, eid);
539a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
540a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
541a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    native int  rsnScriptKernelIDCreate(int con, int sid, int slot, int sig);
542a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    synchronized int nScriptKernelIDCreate(int sid, int slot, int sig) {
543a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
544a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        return rsnScriptKernelIDCreate(mContext, sid, slot, sig);
545a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
546a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
547a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    native int  rsnScriptFieldIDCreate(int con, int sid, int slot);
548a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    synchronized int nScriptFieldIDCreate(int sid, int slot) {
549a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
550a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        return rsnScriptFieldIDCreate(mContext, sid, slot);
551a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
552a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
553a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    native int  rsnScriptGroupCreate(int con, int[] kernels, int[] src, int[] dstk, int[] dstf, int[] types);
554a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    synchronized int nScriptGroupCreate(int[] kernels, int[] src, int[] dstk, int[] dstf, int[] types) {
555a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
556a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        return rsnScriptGroupCreate(mContext, kernels, src, dstk, dstf, types);
557a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
558a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
559a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    native void rsnScriptGroupSetInput(int con, int group, int kernel, int alloc);
560a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    synchronized void nScriptGroupSetInput(int group, int kernel, int alloc) {
561a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
562a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        rsnScriptGroupSetInput(mContext, group, kernel, alloc);
563a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
564a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
565a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    native void rsnScriptGroupSetOutput(int con, int group, int kernel, int alloc);
566a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    synchronized void nScriptGroupSetOutput(int group, int kernel, int alloc) {
567a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
568a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        rsnScriptGroupSetOutput(mContext, group, kernel, alloc);
569a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
570a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
571a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    native void rsnScriptGroupExecute(int con, int group);
572a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    synchronized void nScriptGroupExecute(int group) {
573a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        validate();
574a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        rsnScriptGroupExecute(mContext, group);
575a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
576a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
57745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    native int  rsnSamplerCreate(int con, int magFilter, int minFilter,
57845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                 int wrapS, int wrapT, int wrapR, float aniso);
57945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    synchronized int nSamplerCreate(int magFilter, int minFilter,
58045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                                 int wrapS, int wrapT, int wrapR, float aniso) {
58145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
58245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
58345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
58445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
58545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
58645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
58745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    int     mDev;
58845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    int     mContext;
58945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    @SuppressWarnings({"FieldCanBeLocal"})
59045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    MessageThread mMessageThread;
59145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
59245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_U8;
59345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_I8;
59445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_U16;
59545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_I16;
59645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_U32;
59745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_I32;
59845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_U64;
59945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_I64;
60045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_F32;
60145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_F64;
60245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_BOOLEAN;
60345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
60445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_ELEMENT;
60545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_TYPE;
60645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_ALLOCATION;
60745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_SAMPLER;
60845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_SCRIPT;
60945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
61045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_A_8;
61145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_RGB_565;
61245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_RGB_888;
61345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_RGBA_5551;
61445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_RGBA_4444;
61545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_RGBA_8888;
61645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
61745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_FLOAT_2;
61845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_FLOAT_3;
61945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_FLOAT_4;
62045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
62145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_DOUBLE_2;
62245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_DOUBLE_3;
62345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_DOUBLE_4;
62445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
62545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_UCHAR_2;
62645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_UCHAR_3;
62745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_UCHAR_4;
62845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
62945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_CHAR_2;
63045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_CHAR_3;
63145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_CHAR_4;
63245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
63345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_USHORT_2;
63445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_USHORT_3;
63545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_USHORT_4;
63645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
63745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_SHORT_2;
63845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_SHORT_3;
63945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_SHORT_4;
64045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
64145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_UINT_2;
64245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_UINT_3;
64345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_UINT_4;
64445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
64545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_INT_2;
64645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_INT_3;
64745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_INT_4;
64845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
64945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_ULONG_2;
65045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_ULONG_3;
65145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_ULONG_4;
65245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
65345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_LONG_2;
65445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_LONG_3;
65545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_LONG_4;
65645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
65745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_MATRIX_4X4;
65845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_MATRIX_3X3;
65945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Element mElement_MATRIX_2X2;
66045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
66145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Sampler mSampler_CLAMP_NEAREST;
66245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Sampler mSampler_CLAMP_LINEAR;
66345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
66445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Sampler mSampler_WRAP_NEAREST;
66545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Sampler mSampler_WRAP_LINEAR;
66645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
667e79f94bf70aebfc9bc42a857ec5b89ba1b95ba27Tim Murray    Sampler mSampler_MIRRORED_REPEAT_NEAREST;
668e79f94bf70aebfc9bc42a857ec5b89ba1b95ba27Tim Murray    Sampler mSampler_MIRRORED_REPEAT_LINEAR;
669e79f94bf70aebfc9bc42a857ec5b89ba1b95ba27Tim Murray    Sampler mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
670e79f94bf70aebfc9bc42a857ec5b89ba1b95ba27Tim Murray
67145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
67245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    ///////////////////////////////////////////////////////////////////////////////////
67345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    //
67445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
67545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
676032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * The base class from which an application should derive in order
677032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * to receive RS messages from scripts. When a script calls {@code
678032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * rsSendToClient}, the data fields will be filled, and the run
679032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * method will be called on a separate thread.  This will occur
680032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * some time after {@code rsSendToClient} completes in the script,
681032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * as {@code rsSendToClient} is asynchronous. Message handlers are
682032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * not guaranteed to have completed when {@link
6832192d04dde96e02b9c908d3cc846c8c881ff54a1Stephen Hines     * android.support.v8.renderscript.RenderScript#finish} returns.
68445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
68545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
68645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static class RSMessageHandler implements Runnable {
68745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected int[] mData;
68845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected int mID;
68945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected int mLength;
69045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public void run() {
69145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
69245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
69345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
694032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * If an application is expecting messages, it should set this
695032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * field to an instance of {@link RSMessageHandler}.  This
696032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * instance will receive all the user messages sent from {@code
697032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * sendToClient} by scripts from this context.
69845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
69945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
70045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    RSMessageHandler mMessageCallback = null;
70145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
70245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setMessageHandler(RSMessageHandler msg) {
70345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMessageCallback = msg;
704baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        if (isNative) {
705baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            RenderScriptThunker rst = (RenderScriptThunker) this;
706baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            android.renderscript.RenderScript.RSMessageHandler newmsg =
707baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                new android.renderscript.RenderScript.RSMessageHandler() {
708baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                    public void run()  {
709baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                        mMessageCallback.mData = mData;
710baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                        mMessageCallback.mID = mID;
711baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                        mMessageCallback.mLength = mLength;
712baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                        mMessageCallback.run();
713baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                    }
714baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                };
715baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            rst.mN.setMessageHandler(newmsg);
716baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        }
71745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
71845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public RSMessageHandler getMessageHandler() {
71945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mMessageCallback;
72045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
72145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
72245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
723032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Place a message into the message queue to be sent back to the message
724032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * handler once all previous commands have been executed.
725032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     *
726dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines     * @hide
727dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines     *
728dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines     * @param id
729dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines     * @param data
730dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines     */
731dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines    public void sendMessage(int id, int[] data) {
732dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        nContextSendMessage(id, data);
733dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines    }
734dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines
735dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines    /**
736032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * The runtime error handler base class.  An application should derive from this class
737032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * if it wishes to install an error handler.  When errors occur at runtime,
738032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * the fields in this class will be filled, and the run method will be called.
73945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
74045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
74145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static class RSErrorHandler implements Runnable {
74245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected String mErrorMessage;
74345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected int mErrorNum;
74445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public void run() {
74545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
74645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
74745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
74845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
74945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Application Error handler.  All runtime errors will be dispatched to the
75045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * instance of RSAsyncError set here.  If this field is null a
751032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * {@link RSRuntimeException} will instead be thrown with details about the error.
75245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * This will cause program termaination.
75345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
75445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
75545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    RSErrorHandler mErrorCallback = null;
75645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
75745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setErrorHandler(RSErrorHandler msg) {
75845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mErrorCallback = msg;
759baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        if (isNative) {
760baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            RenderScriptThunker rst = (RenderScriptThunker) this;
761baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            android.renderscript.RenderScript.RSErrorHandler newmsg =
762baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                new android.renderscript.RenderScript.RSErrorHandler() {
763baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                    public void run()  {
764baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                        mErrorCallback.mErrorMessage = mErrorMessage;
765baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                        mErrorCallback.mErrorNum = mErrorNum;
766baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                        mErrorCallback.run();
767baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                    }
768baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray                };
769baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            rst.mN.setErrorHandler(newmsg);
770baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        }
77145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
77245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public RSErrorHandler getErrorHandler() {
77345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mErrorCallback;
77445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
77545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
77645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
777032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * RenderScript worker thread priority enumeration.  The default value is
778032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * NORMAL.  Applications wishing to do background processing should set
779032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * their priority to LOW to avoid starving forground processes.
78045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
78145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public enum Priority {
78245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        LOW (Process.THREAD_PRIORITY_BACKGROUND + (5 * Process.THREAD_PRIORITY_LESS_FAVORABLE)),
78345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        NORMAL (Process.THREAD_PRIORITY_DISPLAY);
78445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
78545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int mID;
78645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        Priority(int id) {
78745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mID = id;
78845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
78945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
79045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
79145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    void validate() {
79245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (mContext == 0) {
79345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSInvalidStateException("Calling RS with no Context active.");
79445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
79545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
79645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
79745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
79845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
79945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Change the priority of the worker threads for this context.
80045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
80145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param p New priority to be set.
80245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
80345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setPriority(Priority p) {
80445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
80545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        nContextSetPriority(p.mID);
80645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
80745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
80845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    static class MessageThread extends Thread {
80945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        RenderScript mRS;
81045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        boolean mRun = true;
81145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int[] mAuxData = new int[2];
81245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
81345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
81445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
81545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
81645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
81745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        static final int RS_MESSAGE_TO_CLIENT_USER = 4;
81845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
81945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
82045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
82145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        MessageThread(RenderScript rs) {
82245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            super("RSMessageThread");
82345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mRS = rs;
82445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
82545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
82645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
82745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public void run() {
82845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            // This function is a temporary solution.  The final solution will
82945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            // used typed allocations where the message id is the type indicator.
83045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            int[] rbuf = new int[16];
83145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mRS.nContextInitToClient(mRS.mContext);
83245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            while(mRun) {
83345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                rbuf[0] = 0;
83445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
83545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                int size = mAuxData[1];
83645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                int subID = mAuxData[0];
83745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
83845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                if (msg == RS_MESSAGE_TO_CLIENT_USER) {
83945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    if ((size>>2) >= rbuf.length) {
84045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        rbuf = new int[(size + 3) >> 2];
84145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    }
84245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
84345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        RS_MESSAGE_TO_CLIENT_USER) {
844032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines                        throw new RSDriverException("Error processing message from RenderScript.");
84545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    }
84645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
84745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    if(mRS.mMessageCallback != null) {
84845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mMessageCallback.mData = rbuf;
84945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mMessageCallback.mID = subID;
85045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mMessageCallback.mLength = size;
85145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mMessageCallback.run();
85245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    } else {
85345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
85445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    }
85545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    continue;
85645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                }
85745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
85845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
85945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    String e = mRS.nContextGetErrorMessage(mRS.mContext);
86045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
86145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    if (subID >= RS_ERROR_FATAL_UNKNOWN) {
86245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
86345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    }
86445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
86545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    if(mRS.mErrorCallback != null) {
86645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mErrorCallback.mErrorMessage = e;
86745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mErrorCallback.mErrorNum = subID;
86845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        mRS.mErrorCallback.run();
86945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    } else {
870dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines                        android.util.Log.e(LOG_TAG, "non fatal RS error, " + e);
87145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        // Do not throw here. In these cases, we do not have
87245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        // a fatal error.
87345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    }
87445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    continue;
87545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                }
87645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
87745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                // 2: teardown.
87845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                // But we want to avoid starving other threads during
87945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                // teardown by yielding until the next line in the destructor
88045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                // can execute to set mRun = false
88145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                try {
88245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    sleep(1, 0);
88345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                } catch(InterruptedException e) {
88445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                }
88545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
88690fbed82b44c96f1e51db4dacb00d2b3f6affbdfTim Murray            //Log.d(LOG_TAG, "MessageThread exiting.");
88745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
88845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
88945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
89045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    RenderScript(Context ctx) {
89145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (ctx != null) {
89245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mApplicationContext = ctx.getApplicationContext();
89345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
89445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
89545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
89645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
89745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Gets the application context associated with the RenderScript context.
89845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
89945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return The application context.
90045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
90145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public final Context getApplicationContext() {
90245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mApplicationContext;
90345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
90445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
90545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
90638f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     * @hide
90738f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     */
90838f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    public static RenderScript create(Context ctx, int sdkVersion) {
90938f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        return create(ctx, sdkVersion, ContextType.NORMAL);
91038f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    }
91138f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams
91238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    /**
913032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Create a RenderScript context.
91445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
91545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @hide
91645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param ctx The context.
91745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return RenderScript
91845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
91938f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    public static RenderScript create(Context ctx, int sdkVersion, ContextType ct) {
92045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        RenderScript rs = new RenderScript(ctx);
92145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
922257cecb5e24c9af71ba4d621887e88e46b0ac411Stephen Hines        if (shouldThunk()) {
923baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            android.util.Log.v(LOG_TAG, "RS native mode");
924baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            return RenderScriptThunker.create(ctx, sdkVersion);
925baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        }
9265ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray        synchronized(lock) {
9275ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray            if (sInitialized == false) {
9285ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                try {
929d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    Class<?> vm_runtime = Class.forName("dalvik.system.VMRuntime");
930d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    Method get_runtime = vm_runtime.getDeclaredMethod("getRuntime");
931d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    sRuntime = get_runtime.invoke(null);
932d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    registerNativeAllocation = vm_runtime.getDeclaredMethod("registerNativeAllocation", Integer.TYPE);
933d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    registerNativeFree = vm_runtime.getDeclaredMethod("registerNativeFree", Integer.TYPE);
934d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    sUseGCHooks = true;
935d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                } catch (Exception e) {
936d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    Log.e(LOG_TAG, "No GC methods");
937d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                    sUseGCHooks = false;
938d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                }
939d176abf6992ea9b34a01ba1e8b232ac4ac08db31Tim Murray                try {
9405ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                    System.loadLibrary("RSSupport");
9415ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                    System.loadLibrary("rsjni");
9425ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                    sInitialized = true;
9435ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                } catch (UnsatisfiedLinkError e) {
9445ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                    Log.e(LOG_TAG, "Error loading RS jni library: " + e);
9455ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                    throw new RSRuntimeException("Error loading RS jni library: " + e);
9465ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray                }
9475ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray            }
9485ed4a8e857b5e8a64ad87ccfafaa275b5ba8c36aTim Murray        }
949baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray
95013e357047ba2bf81bf44000a623464b1287aafe7Jason Sams        android.util.Log.v(LOG_TAG, "RS compat mode");
95145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rs.mDev = rs.nDeviceCreate();
95238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        rs.mContext = rs.nContextCreate(rs.mDev, 0, sdkVersion, ct.mID);
95345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (rs.mContext == 0) {
95445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSDriverException("Failed to create RS context.");
95545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
95645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rs.mMessageThread = new MessageThread(rs);
95745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        rs.mMessageThread.start();
95813e357047ba2bf81bf44000a623464b1287aafe7Jason Sams        return rs;
95945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
96045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
96145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
962032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Create a RenderScript context.
96345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
96445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param ctx The context.
96545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @return RenderScript
96645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
96745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static RenderScript create(Context ctx) {
96838f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        return create(ctx, ContextType.NORMAL);
96938f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    }
97038f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams
97138f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    /**
972032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Create a RenderScript context.
97338f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     *
97438f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     * @hide
97538f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     *
97638f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     * @param ctx The context.
977032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * @param ct The type of context to be created.
97838f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     * @return RenderScript
97938f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams     */
98038f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams    public static RenderScript create(Context ctx, ContextType ct) {
98145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int v = ctx.getApplicationInfo().targetSdkVersion;
98238f02dc6d04d04fff070e7f2146e728102dbe252Jason Sams        return create(ctx, v, ct);
98345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
98445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
98545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
98645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Print the currently available debugging information about the state of
98745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * the RS context to the log.
98845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
98945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
99045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void contextDump() {
99145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
99245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        nContextDump(0);
99345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
99445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
99545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
996032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Wait for any pending asynchronous opeations (such as copies to a RS
997032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * allocation or RS script executions) to complete.
99845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
99945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
100045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void finish() {
100145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        nContextFinish();
100245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
100345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
100445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
1005032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Destroys this RenderScript context.  Once this function is called,
1006032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * using this context or any objects belonging to this context is
1007032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * illegal.
100845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
100945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
101045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void destroy() {
101145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        validate();
101245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        nContextDeinitToClient(mContext);
101345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mMessageThread.mRun = false;
101445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        try {
101545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mMessageThread.join();
101645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        } catch(InterruptedException e) {
101745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
101845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
101945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        nContextDestroy();
102045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mContext = 0;
102145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
102245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        nDeviceDestroy(mDev);
102345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        mDev = 0;
102445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
102545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
102645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    boolean isAlive() {
102745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return mContext != 0;
102845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
102945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
103045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    int safeID(BaseObj o) {
103145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if(o != null) {
103245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return o.getID(this);
103345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
103445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return 0;
103545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
103645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams}
1037