198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/*
298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Copyright (C) 2012 The Android Open Source Project
398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License.
698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at
798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software
1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and
1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License.
1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */
1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript;
1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.io.File;
2098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.lang.reflect.Field;
2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.content.Context;
2398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.content.pm.ApplicationInfo;
2498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.content.pm.PackageManager;
2598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.content.res.AssetManager;
2698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.graphics.Bitmap;
2798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.graphics.BitmapFactory;
2898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.os.Process;
2998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.Log;
3098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.view.Surface;
3198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
3298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
3398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
3498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/**
3598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Renderscript base master class.  An instance of this class creates native
3698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * worker threads for processing commands from this object.  This base class
3798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * does not provide any extended capabilities beyond simple data processing.
3898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * For extended capabilities use derived classes such as RenderScriptGL.
3998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
4098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <div class="special reference">
4198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <h3>Developer Guides</h3>
4298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <p>For more information about creating an application that uses Renderscript, read the
4398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * <a href="{@docRoot}guide/topics/graphics/renderscript.html">Renderscript</a> developer guide.</p>
4498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * </div>
4598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/
4698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class RenderScript {
4798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static final String LOG_TAG = "RenderScript_jni";
4898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static final boolean DEBUG  = false;
4998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    @SuppressWarnings({"UnusedDeclaration", "deprecation"})
5098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static final boolean LOG_ENABLED = false;
5198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
5298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private Context mApplicationContext;
5398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean mUseNativeRS;
5498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
55ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    static class NRS {
56ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        android.renderscript.RenderScript mRS;
57ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
58ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        android.renderscript.RenderScript getRS() {
59ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            return mRS;
60ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
61ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
62ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    NRS mNRS;
63ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
6498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /*
6598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * We use a class initializer to allow the native code to cache some
6698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * field offsets.
6798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
6898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
6998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static boolean sInitialized;
7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native static void _nInit();
7198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
7398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static {
7498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        sInitialized = false;
7598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        try {
7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            System.loadLibrary("rsjni");
7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            _nInit();
7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            sInitialized = true;
7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        } catch (UnsatisfiedLinkError e) {
8098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            Log.e(LOG_TAG, "Error loading RS jni library: " + e);
8198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSRuntimeException("Error loading RS jni library: " + e);
8298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
8398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    // Non-threadsafe functions.
8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  nDeviceCreate();
8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void nDeviceDestroy(int dev);
8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void nDeviceSetConfig(int dev, int param, int value);
8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int nContextGetUserMessage(int con, int[] data);
9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native String nContextGetErrorMessage(int con);
9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  nContextPeekMessage(int con, int[] subID);
9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void nContextInitToClient(int con);
9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void nContextDeinitToClient(int con);
9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Name of the file that holds the object cache.
9798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
9898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    private static final String CACHE_PATH = "com.android.renderscript.cache";
9998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static String mCachePath;
10098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
10198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     /**
10298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Sets the directory to use as a persistent storage for the
10398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * renderscript object file cache.
10498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
10598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @hide
10698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param cacheDir A directory the current process can write to
10798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
10898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static void setupDiskCache(File cacheDir) {
10998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        File f = new File(cacheDir, CACHE_PATH);
11098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mCachePath = f.getAbsolutePath();
11198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        f.mkdirs();
11298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
11398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
11498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
11598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    // Methods below are wrapped to protect the non-threadsafe
11698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    // lockless fifo.
11798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  rsnContextCreate(int dev, int ver, int sdkVer);
11898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized int nContextCreate(int dev, int ver, int sdkVer) {
11998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rsnContextCreate(dev, ver, sdkVer);
12098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
12198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnContextDestroy(int con);
12298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nContextDestroy() {
12398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
12498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnContextDestroy(mContext);
12598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
12698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnContextSetPriority(int con, int p);
12798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nContextSetPriority(int p) {
12898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
12998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnContextSetPriority(mContext, p);
13098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
13198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnContextDump(int con, int bits);
13298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nContextDump(int bits) {
13398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
13498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnContextDump(mContext, bits);
13598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
13698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnContextFinish(int con);
13798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nContextFinish() {
13898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
13998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnContextFinish(mContext);
14098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
14198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
14298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnObjDestroy(int con, int id);
14398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nObjDestroy(int id) {
14498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // There is a race condition here.  The calling code may be run
14598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // by the gc while teardown is occuring.  This protects againts
14698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        // deleting dead objects.
14798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mContext != 0) {
14898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rsnObjDestroy(mContext, id);
14998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
15098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
15198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
15298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize);
15398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) {
15498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
15598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rsnElementCreate(mContext, type, kind, norm, vecSize);
15698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
15798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  rsnElementCreate2(int con, int[] elements, String[] names, int[] arraySizes);
15898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized int nElementCreate2(int[] elements, String[] names, int[] arraySizes) {
15998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
16098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rsnElementCreate2(mContext, elements, names, arraySizes);
16198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
16298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnElementGetNativeData(int con, int id, int[] elementData);
16398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nElementGetNativeData(int id, int[] elementData) {
16498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
16598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnElementGetNativeData(mContext, id, elementData);
16698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
16798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnElementGetSubElements(int con, int id,
16898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                         int[] IDs, String[] names, int[] arraySizes);
16998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nElementGetSubElements(int id, int[] IDs, String[] names, int[] arraySizes) {
17098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
17198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnElementGetSubElements(mContext, id, IDs, names, arraySizes);
17298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
17398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
17498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int rsnTypeCreate(int con, int eid, int x, int y, int z, boolean mips, boolean faces);
17598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized int nTypeCreate(int eid, int x, int y, int z, boolean mips, boolean faces) {
17698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
17798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rsnTypeCreate(mContext, eid, x, y, z, mips, faces);
17898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
17998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnTypeGetNativeData(int con, int id, int[] typeData);
18098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nTypeGetNativeData(int id, int[] typeData) {
18198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
18298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnTypeGetNativeData(mContext, id, typeData);
18398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
18498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
18598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  rsnAllocationCreateTyped(int con, int type, int mip, int usage, int pointer);
18698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized int nAllocationCreateTyped(int type, int mip, int usage, int pointer) {
18798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
18898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer);
18998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
19098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  rsnAllocationCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
19198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized int nAllocationCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
19298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
19398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
19498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
19598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  rsnAllocationCubeCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
19698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized int nAllocationCubeCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
19798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
19898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
19998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
20098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp);
20198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) {
20298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
20398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rsnAllocationCreateBitmapRef(mContext, type, bmp);
20498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
20598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  rsnAllocationCreateFromAssetStream(int con, int mips, int assetStream, int usage);
20698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized int nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
20798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
20898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
20998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
21098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
21198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void  rsnAllocationCopyToBitmap(int con, int alloc, Bitmap bmp);
21298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationCopyToBitmap(int alloc, Bitmap bmp) {
21398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
21498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationCopyToBitmap(mContext, alloc, bmp);
21598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
21698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
21798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
21898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationSyncAll(int con, int alloc, int src);
21998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationSyncAll(int alloc, int src) {
22098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
22198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationSyncAll(mContext, alloc, src);
22298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
22398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
22498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
22598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationGenerateMipmaps(int con, int alloc);
22698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationGenerateMipmaps(int alloc) {
22798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
22898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationGenerateMipmaps(mContext, alloc);
22998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
23098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void  rsnAllocationCopyFromBitmap(int con, int alloc, Bitmap bmp);
23198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationCopyFromBitmap(int alloc, Bitmap bmp) {
23298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
23398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
23498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
23598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
23698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
23798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationData1D(int con, int id, int off, int mip, int count, int[] d, int sizeBytes);
23898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationData1D(int id, int off, int mip, int count, int[] d, int sizeBytes) {
23998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
24098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
24198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
24298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationData1D(int con, int id, int off, int mip, int count, short[] d, int sizeBytes);
24398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationData1D(int id, int off, int mip, int count, short[] d, int sizeBytes) {
24498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
24598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
24698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
24798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationData1D(int con, int id, int off, int mip, int count, byte[] d, int sizeBytes);
24898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationData1D(int id, int off, int mip, int count, byte[] d, int sizeBytes) {
24998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
25098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
25198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
25298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationData1D(int con, int id, int off, int mip, int count, float[] d, int sizeBytes);
25398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationData1D(int id, int off, int mip, int count, float[] d, int sizeBytes) {
25498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
25598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
25698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
25798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
25898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationElementData1D(int con, int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes);
25998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationElementData1D(int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes) {
26098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
26198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationElementData1D(mContext, id, xoff, mip, compIdx, d, sizeBytes);
26298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
26398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
26498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationData2D(int con,
26598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                    int dstAlloc, int dstXoff, int dstYoff,
26698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                    int dstMip, int dstFace,
26798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                    int width, int height,
26898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                    int srcAlloc, int srcXoff, int srcYoff,
26998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                    int srcMip, int srcFace);
27098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationData2D(int dstAlloc, int dstXoff, int dstYoff,
27198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                        int dstMip, int dstFace,
27298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                        int width, int height,
27398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                        int srcAlloc, int srcXoff, int srcYoff,
27498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                        int srcMip, int srcFace) {
27598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
27698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationData2D(mContext,
27798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                            dstAlloc, dstXoff, dstYoff,
27898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                            dstMip, dstFace,
27998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                            width, height,
28098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                            srcAlloc, srcXoff, srcYoff,
28198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                            srcMip, srcFace);
28298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
28398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
28498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes);
28598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes) {
28698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
28798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
28898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
28998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes);
29098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes) {
29198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
29298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
29398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
29498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes);
29598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes) {
29698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
29798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
29898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
29998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes);
30098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes) {
30198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
30298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
30398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
30498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, Bitmap b);
30598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, Bitmap b) {
30698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
30798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
30898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
30998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
31098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationRead(int con, int id, byte[] d);
31198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationRead(int id, byte[] d) {
31298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
31398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationRead(mContext, id, d);
31498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
31598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationRead(int con, int id, short[] d);
31698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationRead(int id, short[] d) {
31798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
31898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationRead(mContext, id, d);
31998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
32098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationRead(int con, int id, int[] d);
32198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationRead(int id, int[] d) {
32298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
32398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationRead(mContext, id, d);
32498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
32598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationRead(int con, int id, float[] d);
32698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationRead(int id, float[] d) {
32798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
32898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationRead(mContext, id, d);
32998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
33098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  rsnAllocationGetType(int con, int id);
33198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized int nAllocationGetType(int id) {
33298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
33398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rsnAllocationGetType(mContext, id);
33498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
33598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
33698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationResize1D(int con, int id, int dimX);
33798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationResize1D(int id, int dimX) {
33898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
33998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationResize1D(mContext, id, dimX);
34098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
34198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnAllocationResize2D(int con, int id, int dimX, int dimY);
34298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nAllocationResize2D(int id, int dimX, int dimY) {
34398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
34498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnAllocationResize2D(mContext, id, dimX, dimY);
34598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
34698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
34798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptBindAllocation(int con, int script, int alloc, int slot);
34898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nScriptBindAllocation(int script, int alloc, int slot) {
34998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
35098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnScriptBindAllocation(mContext, script, alloc, slot);
35198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
35298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone);
35398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nScriptSetTimeZone(int script, byte[] timeZone) {
35498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
35598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnScriptSetTimeZone(mContext, script, timeZone);
35698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
35798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptInvoke(int con, int id, int slot);
35898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nScriptInvoke(int id, int slot) {
35998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
36098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnScriptInvoke(mContext, id, slot);
36198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
36298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptForEach(int con, int id, int slot, int ain, int aout, byte[] params);
36398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptForEach(int con, int id, int slot, int ain, int aout);
36498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nScriptForEach(int id, int slot, int ain, int aout, byte[] params) {
36598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
36698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (params == null) {
36798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rsnScriptForEach(mContext, id, slot, ain, aout);
36898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        } else {
36998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            rsnScriptForEach(mContext, id, slot, ain, aout, params);
37098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
37198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
37298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptInvokeV(int con, int id, int slot, byte[] params);
37398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nScriptInvokeV(int id, int slot, byte[] params) {
37498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
37598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnScriptInvokeV(mContext, id, slot, params);
37698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
37798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptSetVarI(int con, int id, int slot, int val);
37898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nScriptSetVarI(int id, int slot, int val) {
37998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
38098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnScriptSetVarI(mContext, id, slot, val);
38198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
38298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptSetVarJ(int con, int id, int slot, long val);
38398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nScriptSetVarJ(int id, int slot, long val) {
38498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
38598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnScriptSetVarJ(mContext, id, slot, val);
38698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
38798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptSetVarF(int con, int id, int slot, float val);
38898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nScriptSetVarF(int id, int slot, float val) {
38998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
39098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnScriptSetVarF(mContext, id, slot, val);
39198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
39298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptSetVarD(int con, int id, int slot, double val);
39398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nScriptSetVarD(int id, int slot, double val) {
39498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
39598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnScriptSetVarD(mContext, id, slot, val);
39698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
39798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptSetVarV(int con, int id, int slot, byte[] val);
39898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nScriptSetVarV(int id, int slot, byte[] val) {
39998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
40098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnScriptSetVarV(mContext, id, slot, val);
40198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
40298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptSetVarVE(int con, int id, int slot, byte[] val,
40398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                  int e, int[] dims);
40498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nScriptSetVarVE(int id, int slot, byte[] val,
40598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                      int e, int[] dims) {
40698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
40798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnScriptSetVarVE(mContext, id, slot, val, e, dims);
40898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
40998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native void rsnScriptSetVarObj(int con, int id, int slot, int val);
41098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized void nScriptSetVarObj(int id, int slot, int val) {
41198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
41298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rsnScriptSetVarObj(mContext, id, slot, val);
41398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
41498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
41598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  rsnScriptCCreate(int con, String resName, String cacheDir,
41698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                 byte[] script, int length);
41798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized int nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
41898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
41998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
42098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
42198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
422ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    native int  rsnScriptIntrinsicCreate(int con, int id, int eid);
423ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    synchronized int nScriptIntrinsicCreate(int id, int eid) {
424ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        validate();
425ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        return rsnScriptIntrinsicCreate(mContext, id, eid);
426ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
427ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
428ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    native int  rsnScriptKernelIDCreate(int con, int sid, int slot, int sig);
429ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    synchronized int nScriptKernelIDCreate(int sid, int slot, int sig) {
430ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        validate();
431ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        return rsnScriptKernelIDCreate(mContext, sid, slot, sig);
432ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
433ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
434ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    native int  rsnScriptFieldIDCreate(int con, int sid, int slot);
435ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    synchronized int nScriptFieldIDCreate(int sid, int slot) {
436ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        validate();
437ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        return rsnScriptFieldIDCreate(mContext, sid, slot);
438ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
439ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
440ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    native int  rsnScriptGroupCreate(int con, int[] kernels, int[] src, int[] dstk, int[] dstf, int[] types);
441ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    synchronized int nScriptGroupCreate(int[] kernels, int[] src, int[] dstk, int[] dstf, int[] types) {
442ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        validate();
443ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        return rsnScriptGroupCreate(mContext, kernels, src, dstk, dstf, types);
444ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
445ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
446ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    native void rsnScriptGroupSetInput(int con, int group, int kernel, int alloc);
447ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    synchronized void nScriptGroupSetInput(int group, int kernel, int alloc) {
448ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        validate();
449ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        rsnScriptGroupSetInput(mContext, group, kernel, alloc);
450ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
451ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
452ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    native void rsnScriptGroupSetOutput(int con, int group, int kernel, int alloc);
453ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    synchronized void nScriptGroupSetOutput(int group, int kernel, int alloc) {
454ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        validate();
455ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        rsnScriptGroupSetOutput(mContext, group, kernel, alloc);
456ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
457ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
458ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    native void rsnScriptGroupExecute(int con, int group);
459ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    synchronized void nScriptGroupExecute(int group) {
460ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        validate();
461ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        rsnScriptGroupExecute(mContext, group);
462ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
463ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
46498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    native int  rsnSamplerCreate(int con, int magFilter, int minFilter,
46598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                 int wrapS, int wrapT, int wrapR, float aniso);
46698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    synchronized int nSamplerCreate(int magFilter, int minFilter,
46798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                                 int wrapS, int wrapT, int wrapR, float aniso) {
46898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
46998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
47098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
47198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
47298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
47398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
47498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int     mDev;
47598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int     mContext;
47698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    @SuppressWarnings({"FieldCanBeLocal"})
47798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    MessageThread mMessageThread;
47898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
47998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_U8;
48098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_I8;
48198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_U16;
48298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_I16;
48398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_U32;
48498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_I32;
48598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_U64;
48698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_I64;
48798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_F32;
48898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_F64;
48998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_BOOLEAN;
49098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
49198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_ELEMENT;
49298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_TYPE;
49398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_ALLOCATION;
49498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_SAMPLER;
49598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_SCRIPT;
49698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
49798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_A_8;
49898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_RGB_565;
49998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_RGB_888;
50098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_RGBA_5551;
50198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_RGBA_4444;
50298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_RGBA_8888;
50398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
50498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_FLOAT_2;
50598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_FLOAT_3;
50698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_FLOAT_4;
50798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
50898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_DOUBLE_2;
50998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_DOUBLE_3;
51098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_DOUBLE_4;
51198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
51298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_UCHAR_2;
51398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_UCHAR_3;
51498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_UCHAR_4;
51598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
51698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_CHAR_2;
51798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_CHAR_3;
51898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_CHAR_4;
51998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
52098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_USHORT_2;
52198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_USHORT_3;
52298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_USHORT_4;
52398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
52498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_SHORT_2;
52598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_SHORT_3;
52698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_SHORT_4;
52798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
52898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_UINT_2;
52998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_UINT_3;
53098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_UINT_4;
53198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
53298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_INT_2;
53398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_INT_3;
53498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_INT_4;
53598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
53698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_ULONG_2;
53798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_ULONG_3;
53898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_ULONG_4;
53998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
54098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_LONG_2;
54198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_LONG_3;
54298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_LONG_4;
54398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
54498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_MATRIX_4X4;
54598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_MATRIX_3X3;
54698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Element mElement_MATRIX_2X2;
54798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
54898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Sampler mSampler_CLAMP_NEAREST;
54998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Sampler mSampler_CLAMP_LINEAR;
55098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
55198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Sampler mSampler_WRAP_NEAREST;
55298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Sampler mSampler_WRAP_LINEAR;
55398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
55498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
55598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    ///////////////////////////////////////////////////////////////////////////////////
55698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    //
55798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
55898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
55998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Base class application should derive from for handling RS messages
56098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * coming from their scripts.  When a script calls sendToClient the data
56198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * fields will be filled in and then the run method called by a message
56298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * handling thread.  This will occur some time after sendToClient completes
56398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * in the script.
56498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
56598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
56698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static class RSMessageHandler implements Runnable {
56798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        protected int[] mData;
56898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        protected int mID;
56998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        protected int mLength;
57098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public void run() {
57198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
57298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
57398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
57498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * If an application is expecting messages it should set this field to an
57598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * instance of RSMessage.  This instance will receive all the user messages
57698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * sent from sendToClient by scripts from this context.
57798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
57898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
57998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    RSMessageHandler mMessageCallback = null;
58098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
58198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setMessageHandler(RSMessageHandler msg) {
58298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMessageCallback = msg;
58398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
58498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public RSMessageHandler getMessageHandler() {
58598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mMessageCallback;
58698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
58798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
58898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
58998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Runtime error base class.  An application should derive from this class
59098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * if it wishes to install an error handler.  When errors occur at runtime
59198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * the fields in this class will be filled and the run method called.
59298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
59398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
59498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static class RSErrorHandler implements Runnable {
59598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        protected String mErrorMessage;
59698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        protected int mErrorNum;
59798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public void run() {
59898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
59998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
60098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
60198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
60298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Application Error handler.  All runtime errors will be dispatched to the
60398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * instance of RSAsyncError set here.  If this field is null a
60498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * RSRuntimeException will instead be thrown with details about the error.
60598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * This will cause program termaination.
60698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
60798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
60898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    RSErrorHandler mErrorCallback = null;
60998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
61098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setErrorHandler(RSErrorHandler msg) {
61198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mErrorCallback = msg;
61298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
61398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public RSErrorHandler getErrorHandler() {
61498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mErrorCallback;
61598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
61698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
61798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
61898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * RenderScript worker threads priority enumeration.  The default value is
61998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * NORMAL.  Applications wishing to do background processing such as
62098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * wallpapers should set their priority to LOW to avoid starving forground
62198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * processes.
62298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
62398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public enum Priority {
62498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        LOW (Process.THREAD_PRIORITY_BACKGROUND + (5 * Process.THREAD_PRIORITY_LESS_FAVORABLE)),
62598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        NORMAL (Process.THREAD_PRIORITY_DISPLAY);
62698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
62798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int mID;
62898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Priority(int id) {
62998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mID = id;
63098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
63198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
63298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
63398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    void validate() {
63498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (mContext == 0) {
63598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSInvalidStateException("Calling RS with no Context active.");
63698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
63798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
63898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
63998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
64098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
64198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Change the priority of the worker threads for this context.
64298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
64398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param p New priority to be set.
64498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
64598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setPriority(Priority p) {
64698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
64798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        nContextSetPriority(p.mID);
64898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
64998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
65098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    static class MessageThread extends Thread {
65198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RenderScript mRS;
65298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        boolean mRun = true;
65398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int[] mAuxData = new int[2];
65498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
65598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
65698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
65798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
65898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
65998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        static final int RS_MESSAGE_TO_CLIENT_USER = 4;
66098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
66198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
66298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
66398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        MessageThread(RenderScript rs) {
66498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            super("RSMessageThread");
66598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mRS = rs;
66698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
66798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
66898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
66998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public void run() {
67098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            // This function is a temporary solution.  The final solution will
67198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            // used typed allocations where the message id is the type indicator.
67298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            int[] rbuf = new int[16];
67398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mRS.nContextInitToClient(mRS.mContext);
67498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            while(mRun) {
67598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                rbuf[0] = 0;
67698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
67798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                int size = mAuxData[1];
67898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                int subID = mAuxData[0];
67998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
68098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                if (msg == RS_MESSAGE_TO_CLIENT_USER) {
68198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    if ((size>>2) >= rbuf.length) {
68298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        rbuf = new int[(size + 3) >> 2];
68398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    }
68498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
68598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        RS_MESSAGE_TO_CLIENT_USER) {
68698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        throw new RSDriverException("Error processing message from Renderscript.");
68798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    }
68898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
68998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    if(mRS.mMessageCallback != null) {
69098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        mRS.mMessageCallback.mData = rbuf;
69198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        mRS.mMessageCallback.mID = subID;
69298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        mRS.mMessageCallback.mLength = size;
69398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        mRS.mMessageCallback.run();
69498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    } else {
69598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
69698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    }
69798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    continue;
69898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
69998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
70098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
70198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    String e = mRS.nContextGetErrorMessage(mRS.mContext);
70298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
70398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    if (subID >= RS_ERROR_FATAL_UNKNOWN) {
70498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
70598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    }
70698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
70798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    if(mRS.mErrorCallback != null) {
70898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        mRS.mErrorCallback.mErrorMessage = e;
70998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        mRS.mErrorCallback.mErrorNum = subID;
71098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        mRS.mErrorCallback.run();
71198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    } else {
71298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        // Do not throw here. In these cases, we do not have
71398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                        // a fatal error.
71498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    }
71598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    continue;
71698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
71798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
71898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                // 2: teardown.
71998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                // But we want to avoid starving other threads during
72098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                // teardown by yielding until the next line in the destructor
72198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                // can execute to set mRun = false
72298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                try {
72398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                    sleep(1, 0);
72498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                } catch(InterruptedException e) {
72598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                }
72698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            }
72798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            Log.d(LOG_TAG, "MessageThread exiting.");
72898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
72998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
73098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
73198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    RenderScript(Context ctx) {
73298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (ctx != null) {
73398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mApplicationContext = ctx.getApplicationContext();
73498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
73598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
73698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
73798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
73898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Gets the application context associated with the RenderScript context.
73998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
74098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return The application context.
74198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
74298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public final Context getApplicationContext() {
74398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mApplicationContext;
74498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
74598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
74698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
74798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Create a basic RenderScript context.
74898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
74998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @hide
75098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param ctx The context.
75198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return RenderScript
75298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
75398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static RenderScript create(Context ctx, int sdkVersion) {
75498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RenderScript rs = new RenderScript(ctx);
75598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
75698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rs.mDev = rs.nDeviceCreate();
75798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rs.mContext = rs.nContextCreate(rs.mDev, 0, sdkVersion);
75898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (rs.mContext == 0) {
75998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSDriverException("Failed to create RS context.");
76098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
76198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rs.mMessageThread = new MessageThread(rs);
76298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        rs.mMessageThread.start();
76398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return rs;
76498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
76598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
76698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
76798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Create a basic RenderScript context.
76898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
76998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param ctx The context.
77098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @return RenderScript
77198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
77298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static RenderScript create(Context ctx) {
77398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        int v = ctx.getApplicationInfo().targetSdkVersion;
77498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return create(ctx, v);
77598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
77698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
77798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
77898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Print the currently available debugging information about the state of
77998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * the RS context to the log.
78098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
78198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
78298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void contextDump() {
78398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
78498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        nContextDump(0);
78598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
78698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
78798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
78898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Wait for any commands in the fifo between the java bindings and native to
78998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * be processed.
79098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
79198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
79298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void finish() {
79398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        nContextFinish();
79498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
79598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
79698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
79798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Destroy this renderscript context.  Once this function is called its no
79898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * longer legal to use this or any objects created by this context.
79998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
80098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
80198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void destroy() {
80298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        validate();
80398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        nContextDeinitToClient(mContext);
80498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mMessageThread.mRun = false;
80598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        try {
80698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mMessageThread.join();
80798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        } catch(InterruptedException e) {
80898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
80998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
81098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        nContextDestroy();
81198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mContext = 0;
81298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
81398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        nDeviceDestroy(mDev);
81498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        mDev = 0;
81598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
81698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
81798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    boolean isAlive() {
81898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return mContext != 0;
81998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
82098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
82198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    int safeID(BaseObj o) {
82298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if(o != null) {
82398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return o.getID(this);
82498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
82598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        return 0;
82698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
82798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams}
828