Home | History | Annotate | Download | only in renderscript
      1 /*
      2  * Copyright (C) 2008-2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.renderscript;
     18 
     19 import android.annotation.UnsupportedAppUsage;
     20 import android.content.Context;
     21 import android.content.res.AssetManager;
     22 import android.graphics.Bitmap;
     23 import android.graphics.SurfaceTexture;
     24 import android.os.SystemProperties;
     25 import android.os.Trace;
     26 import android.util.Log;
     27 import android.view.Surface;
     28 
     29 import java.io.File;
     30 import java.lang.reflect.Method;
     31 import java.nio.ByteBuffer;
     32 import java.util.ArrayList;
     33 import java.util.concurrent.locks.ReentrantReadWriteLock;
     34 
     35 // TODO: Clean up the whitespace that separates methods in this class.
     36 
     37 /**
     38  * This class provides access to a RenderScript context, which controls RenderScript
     39  * initialization, resource management, and teardown. An instance of the RenderScript
     40  * class must be created before any other RS objects can be created.
     41  *
     42  * <div class="special reference">
     43  * <h3>Developer Guides</h3>
     44  * <p>For more information about creating an application that uses RenderScript, read the
     45  * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
     46  * </div>
     47  **/
     48 public class RenderScript {
     49     static final long TRACE_TAG = Trace.TRACE_TAG_RS;
     50 
     51     static final String LOG_TAG = "RenderScript_jni";
     52     static final boolean DEBUG  = false;
     53     @SuppressWarnings({"UnusedDeclaration", "deprecation"})
     54     static final boolean LOG_ENABLED = false;
     55 
     56     static private ArrayList<RenderScript> mProcessContextList = new ArrayList<RenderScript>();
     57     private boolean mIsProcessContext = false;
     58     private int mContextFlags = 0;
     59     private int mContextSdkVersion = 0;
     60 
     61 
     62     private Context mApplicationContext;
     63 
     64     /*
     65      * We use a class initializer to allow the native code to cache some
     66      * field offsets.
     67      */
     68     @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"}) // TODO: now used locally; remove?
     69     static boolean sInitialized;
     70     native static void _nInit();
     71 
     72     static Object sRuntime;
     73     static Method registerNativeAllocation;
     74     static Method registerNativeFree;
     75 
     76     /*
     77      * Context creation flag that specifies a normal context.
     78     */
     79     public static final int CREATE_FLAG_NONE = 0x0000;
     80 
     81     /*
     82      * Context creation flag which specifies a context optimized for low
     83      * latency over peak performance. This is a hint and may have no effect
     84      * on some implementations.
     85     */
     86     public static final int CREATE_FLAG_LOW_LATENCY = 0x0002;
     87 
     88     /*
     89      * Context creation flag which specifies a context optimized for long
     90      * battery life over peak performance. This is a hint and may have no effect
     91      * on some implementations.
     92     */
     93     public static final int CREATE_FLAG_LOW_POWER = 0x0004;
     94 
     95     /**
     96      * @hide
     97      * Context creation flag which instructs the implementation to wait for
     98      * a debugger to be attached before continuing execution.
     99     */
    100     public static final int CREATE_FLAG_WAIT_FOR_ATTACH = 0x0008;
    101 
    102 
    103     /*
    104      * Detect the bitness of the VM to allow FieldPacker to do the right thing.
    105      */
    106     static native int rsnSystemGetPointerSize();
    107     @UnsupportedAppUsage
    108     static int sPointerSize;
    109 
    110     static {
    111         sInitialized = false;
    112         if (!SystemProperties.getBoolean("config.disable_renderscript", false)) {
    113             try {
    114                 Class<?> vm_runtime = Class.forName("dalvik.system.VMRuntime");
    115                 Method get_runtime = vm_runtime.getDeclaredMethod("getRuntime");
    116                 sRuntime = get_runtime.invoke(null);
    117                 registerNativeAllocation =
    118                         vm_runtime.getDeclaredMethod("registerNativeAllocation", Long.TYPE);
    119                 registerNativeFree = vm_runtime.getDeclaredMethod("registerNativeFree", Long.TYPE);
    120             } catch (Exception e) {
    121                 Log.e(LOG_TAG, "Error loading GC methods: " + e);
    122                 throw new RSRuntimeException("Error loading GC methods: " + e);
    123             }
    124             try {
    125                 System.loadLibrary("rs_jni");
    126                 _nInit();
    127                 sInitialized = true;
    128                 sPointerSize = rsnSystemGetPointerSize();
    129             } catch (UnsatisfiedLinkError e) {
    130                 Log.e(LOG_TAG, "Error loading RS jni library: " + e);
    131                 throw new RSRuntimeException("Error loading RS jni library: " + e);
    132             }
    133         }
    134     }
    135 
    136     // Non-threadsafe functions.
    137     native long  nDeviceCreate();
    138     native void nDeviceDestroy(long dev);
    139     native void nDeviceSetConfig(long dev, int param, int value);
    140     native int nContextGetUserMessage(long con, int[] data);
    141     native String nContextGetErrorMessage(long con);
    142     native int  nContextPeekMessage(long con, int[] subID);
    143     native void nContextInitToClient(long con);
    144     native void nContextDeinitToClient(long con);
    145 
    146     // this should be a monotonically increasing ID
    147     // used in conjunction with the API version of a device
    148     static final long sMinorVersion = 1;
    149 
    150     /**
    151      * @hide
    152      *
    153      * Only exist to be compatible with old version RenderScript Support lib.
    154      * Will eventually be removed.
    155      *
    156      * @return Always return 1
    157      *
    158      */
    159     @UnsupportedAppUsage
    160     public static long getMinorID() {
    161         return 1;
    162     }
    163 
    164 
    165     /**
    166      * Returns an identifier that can be used to identify a particular
    167      * minor version of RS.
    168      *
    169      * @return The minor RenderScript version number
    170      *
    171      */
    172     public static long getMinorVersion() {
    173         return sMinorVersion;
    174     }
    175 
    176     /**
    177      * ContextType specifies the specific type of context to be created.
    178      *
    179      */
    180     public enum ContextType {
    181         /**
    182          * NORMAL context, this is the default and what shipping apps should
    183          * use.
    184          */
    185         NORMAL (0),
    186 
    187         /**
    188          * DEBUG context, perform extra runtime checks to validate the
    189          * kernels and APIs are being used as intended.  Get and SetElementAt
    190          * will be bounds checked in this mode.
    191          */
    192         DEBUG (1),
    193 
    194         /**
    195          * PROFILE context, Intended to be used once the first time an
    196          * application is run on a new device.  This mode allows the runtime to
    197          * do additional testing and performance tuning.
    198          */
    199         PROFILE (2);
    200 
    201         int mID;
    202         ContextType(int id) {
    203             mID = id;
    204         }
    205     }
    206 
    207     ContextType mContextType;
    208     ReentrantReadWriteLock mRWLock;
    209 
    210     // Methods below are wrapped to protect the non-threadsafe
    211     // lockless fifo.
    212     native long  rsnContextCreateGL(long dev, int ver, int sdkVer,
    213                  int colorMin, int colorPref,
    214                  int alphaMin, int alphaPref,
    215                  int depthMin, int depthPref,
    216                  int stencilMin, int stencilPref,
    217                  int samplesMin, int samplesPref, float samplesQ, int dpi);
    218     synchronized long nContextCreateGL(long dev, int ver, int sdkVer,
    219                  int colorMin, int colorPref,
    220                  int alphaMin, int alphaPref,
    221                  int depthMin, int depthPref,
    222                  int stencilMin, int stencilPref,
    223                  int samplesMin, int samplesPref, float samplesQ, int dpi) {
    224         return rsnContextCreateGL(dev, ver, sdkVer, colorMin, colorPref,
    225                                   alphaMin, alphaPref, depthMin, depthPref,
    226                                   stencilMin, stencilPref,
    227                                   samplesMin, samplesPref, samplesQ, dpi);
    228     }
    229     native long  rsnContextCreate(long dev, int ver, int sdkVer, int contextType);
    230     synchronized long nContextCreate(long dev, int ver, int sdkVer, int contextType) {
    231         return rsnContextCreate(dev, ver, sdkVer, contextType);
    232     }
    233     native void rsnContextDestroy(long con);
    234     synchronized void nContextDestroy() {
    235         validate();
    236 
    237         // take teardown lock
    238         // teardown lock can only be taken when no objects are being destroyed
    239         ReentrantReadWriteLock.WriteLock wlock = mRWLock.writeLock();
    240         wlock.lock();
    241 
    242         long curCon = mContext;
    243         // context is considered dead as of this point
    244         mContext = 0;
    245 
    246         wlock.unlock();
    247         rsnContextDestroy(curCon);
    248     }
    249     native void rsnContextSetSurface(long con, int w, int h, Surface sur);
    250     synchronized void nContextSetSurface(int w, int h, Surface sur) {
    251         validate();
    252         rsnContextSetSurface(mContext, w, h, sur);
    253     }
    254     native void rsnContextSetSurfaceTexture(long con, int w, int h, SurfaceTexture sur);
    255     synchronized void nContextSetSurfaceTexture(int w, int h, SurfaceTexture sur) {
    256         validate();
    257         rsnContextSetSurfaceTexture(mContext, w, h, sur);
    258     }
    259     native void rsnContextSetPriority(long con, int p);
    260     synchronized void nContextSetPriority(int p) {
    261         validate();
    262         rsnContextSetPriority(mContext, p);
    263     }
    264     native void rsnContextSetCacheDir(long con, String cacheDir);
    265     synchronized void nContextSetCacheDir(String cacheDir) {
    266         validate();
    267         rsnContextSetCacheDir(mContext, cacheDir);
    268     }
    269     native void rsnContextDump(long con, int bits);
    270     synchronized void nContextDump(int bits) {
    271         validate();
    272         rsnContextDump(mContext, bits);
    273     }
    274     native void rsnContextFinish(long con);
    275     synchronized void nContextFinish() {
    276         validate();
    277         rsnContextFinish(mContext);
    278     }
    279 
    280     native void rsnContextSendMessage(long con, int id, int[] data);
    281     synchronized void nContextSendMessage(int id, int[] data) {
    282         validate();
    283         rsnContextSendMessage(mContext, id, data);
    284     }
    285 
    286     native void rsnContextBindRootScript(long con, long script);
    287     synchronized void nContextBindRootScript(long script) {
    288         validate();
    289         rsnContextBindRootScript(mContext, script);
    290     }
    291     native void rsnContextBindSampler(long con, int sampler, int slot);
    292     synchronized void nContextBindSampler(int sampler, int slot) {
    293         validate();
    294         rsnContextBindSampler(mContext, sampler, slot);
    295     }
    296     native void rsnContextBindProgramStore(long con, long pfs);
    297     synchronized void nContextBindProgramStore(long pfs) {
    298         validate();
    299         rsnContextBindProgramStore(mContext, pfs);
    300     }
    301     native void rsnContextBindProgramFragment(long con, long pf);
    302     synchronized void nContextBindProgramFragment(long pf) {
    303         validate();
    304         rsnContextBindProgramFragment(mContext, pf);
    305     }
    306     native void rsnContextBindProgramVertex(long con, long pv);
    307     synchronized void nContextBindProgramVertex(long pv) {
    308         validate();
    309         rsnContextBindProgramVertex(mContext, pv);
    310     }
    311     native void rsnContextBindProgramRaster(long con, long pr);
    312     synchronized void nContextBindProgramRaster(long pr) {
    313         validate();
    314         rsnContextBindProgramRaster(mContext, pr);
    315     }
    316     native void rsnContextPause(long con);
    317     synchronized void nContextPause() {
    318         validate();
    319         rsnContextPause(mContext);
    320     }
    321     native void rsnContextResume(long con);
    322     synchronized void nContextResume() {
    323         validate();
    324         rsnContextResume(mContext);
    325     }
    326 
    327     native long rsnClosureCreate(long con, long kernelID, long returnValue,
    328         long[] fieldIDs, long[] values, int[] sizes, long[] depClosures,
    329         long[] depFieldIDs);
    330     synchronized long nClosureCreate(long kernelID, long returnValue,
    331         long[] fieldIDs, long[] values, int[] sizes, long[] depClosures,
    332         long[] depFieldIDs) {
    333       validate();
    334       long c = rsnClosureCreate(mContext, kernelID, returnValue, fieldIDs, values,
    335           sizes, depClosures, depFieldIDs);
    336       if (c == 0) {
    337           throw new RSRuntimeException("Failed creating closure.");
    338       }
    339       return c;
    340     }
    341 
    342     native long rsnInvokeClosureCreate(long con, long invokeID, byte[] params,
    343         long[] fieldIDs, long[] values, int[] sizes);
    344     synchronized long nInvokeClosureCreate(long invokeID, byte[] params,
    345         long[] fieldIDs, long[] values, int[] sizes) {
    346       validate();
    347       long c = rsnInvokeClosureCreate(mContext, invokeID, params, fieldIDs,
    348           values, sizes);
    349       if (c == 0) {
    350           throw new RSRuntimeException("Failed creating closure.");
    351       }
    352       return c;
    353     }
    354 
    355     native void rsnClosureSetArg(long con, long closureID, int index,
    356       long value, int size);
    357     synchronized void nClosureSetArg(long closureID, int index, long value,
    358         int size) {
    359       validate();
    360       rsnClosureSetArg(mContext, closureID, index, value, size);
    361     }
    362 
    363     native void rsnClosureSetGlobal(long con, long closureID, long fieldID,
    364         long value, int size);
    365     // Does this have to be synchronized?
    366     synchronized void nClosureSetGlobal(long closureID, long fieldID,
    367         long value, int size) {
    368       validate(); // TODO: is this necessary?
    369       rsnClosureSetGlobal(mContext, closureID, fieldID, value, size);
    370     }
    371 
    372     native long rsnScriptGroup2Create(long con, String name, String cachePath,
    373                                       long[] closures);
    374     synchronized long nScriptGroup2Create(String name, String cachePath,
    375                                           long[] closures) {
    376       validate();
    377       long g = rsnScriptGroup2Create(mContext, name, cachePath, closures);
    378       if (g == 0) {
    379           throw new RSRuntimeException("Failed creating script group.");
    380       }
    381       return g;
    382     }
    383 
    384     native void rsnScriptGroup2Execute(long con, long groupID);
    385     synchronized void nScriptGroup2Execute(long groupID) {
    386       validate();
    387       rsnScriptGroup2Execute(mContext, groupID);
    388     }
    389 
    390     native void rsnAssignName(long con, long obj, byte[] name);
    391     synchronized void nAssignName(long obj, byte[] name) {
    392         validate();
    393         rsnAssignName(mContext, obj, name);
    394     }
    395     native String rsnGetName(long con, long obj);
    396     synchronized String nGetName(long obj) {
    397         validate();
    398         return rsnGetName(mContext, obj);
    399     }
    400 
    401     // nObjDestroy is explicitly _not_ synchronous to prevent crashes in finalizers
    402     native void rsnObjDestroy(long con, long id);
    403     void nObjDestroy(long id) {
    404         // There is a race condition here.  The calling code may be run
    405         // by the gc while teardown is occuring.  This protects againts
    406         // deleting dead objects.
    407         if (mContext != 0) {
    408             rsnObjDestroy(mContext, id);
    409         }
    410     }
    411 
    412     native long rsnElementCreate(long con, long type, int kind, boolean norm, int vecSize);
    413     synchronized long nElementCreate(long type, int kind, boolean norm, int vecSize) {
    414         validate();
    415         return rsnElementCreate(mContext, type, kind, norm, vecSize);
    416     }
    417     native long rsnElementCreate2(long con, long[] elements, String[] names, int[] arraySizes);
    418     synchronized long nElementCreate2(long[] elements, String[] names, int[] arraySizes) {
    419         validate();
    420         return rsnElementCreate2(mContext, elements, names, arraySizes);
    421     }
    422     native void rsnElementGetNativeData(long con, long id, int[] elementData);
    423     synchronized void nElementGetNativeData(long id, int[] elementData) {
    424         validate();
    425         rsnElementGetNativeData(mContext, id, elementData);
    426     }
    427     native void rsnElementGetSubElements(long con, long id,
    428                                          long[] IDs, String[] names, int[] arraySizes);
    429     synchronized void nElementGetSubElements(long id, long[] IDs, String[] names, int[] arraySizes) {
    430         validate();
    431         rsnElementGetSubElements(mContext, id, IDs, names, arraySizes);
    432     }
    433 
    434     native long rsnTypeCreate(long con, long eid, int x, int y, int z, boolean mips, boolean faces, int yuv);
    435     synchronized long nTypeCreate(long eid, int x, int y, int z, boolean mips, boolean faces, int yuv) {
    436         validate();
    437         return rsnTypeCreate(mContext, eid, x, y, z, mips, faces, yuv);
    438     }
    439     native void rsnTypeGetNativeData(long con, long id, long[] typeData);
    440     synchronized void nTypeGetNativeData(long id, long[] typeData) {
    441         validate();
    442         rsnTypeGetNativeData(mContext, id, typeData);
    443     }
    444 
    445     native long rsnAllocationCreateTyped(long con, long type, int mip, int usage, long pointer);
    446     synchronized long nAllocationCreateTyped(long type, int mip, int usage, long pointer) {
    447         validate();
    448         return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer);
    449     }
    450     native long rsnAllocationCreateFromBitmap(long con, long type, int mip, long bitmapHandle,
    451                 int usage);
    452     synchronized long nAllocationCreateFromBitmap(long type, int mip, Bitmap bmp, int usage) {
    453         validate();
    454         return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp.getNativeInstance(), usage);
    455     }
    456 
    457     native long rsnAllocationCreateBitmapBackedAllocation(long con, long type, int mip, long bitmapHandle,
    458                 int usage);
    459     synchronized long nAllocationCreateBitmapBackedAllocation(long type, int mip, Bitmap bmp,
    460                 int usage) {
    461         validate();
    462         return rsnAllocationCreateBitmapBackedAllocation(mContext, type, mip, bmp.getNativeInstance(),
    463                 usage);
    464     }
    465 
    466     native long rsnAllocationCubeCreateFromBitmap(long con, long type, int mip, long bitmapHandle,
    467                 int usage);
    468     synchronized long nAllocationCubeCreateFromBitmap(long type, int mip, Bitmap bmp, int usage) {
    469         validate();
    470         return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp.getNativeInstance(),
    471                 usage);
    472     }
    473     native long  rsnAllocationCreateBitmapRef(long con, long type, long bitmapHandle);
    474     synchronized long nAllocationCreateBitmapRef(long type, Bitmap bmp) {
    475         validate();
    476         return rsnAllocationCreateBitmapRef(mContext, type, bmp.getNativeInstance());
    477     }
    478     native long  rsnAllocationCreateFromAssetStream(long con, int mips, int assetStream, int usage);
    479     synchronized long nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
    480         validate();
    481         return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
    482     }
    483 
    484     native void  rsnAllocationCopyToBitmap(long con, long alloc, long bitmapHandle);
    485     synchronized void nAllocationCopyToBitmap(long alloc, Bitmap bmp) {
    486         validate();
    487         rsnAllocationCopyToBitmap(mContext, alloc, bmp.getNativeInstance());
    488     }
    489 
    490     native void rsnAllocationSyncAll(long con, long alloc, int src);
    491     synchronized void nAllocationSyncAll(long alloc, int src) {
    492         validate();
    493         rsnAllocationSyncAll(mContext, alloc, src);
    494     }
    495 
    496     native ByteBuffer rsnAllocationGetByteBuffer(long con, long alloc, long[] stride,
    497                 int xBytesSize, int dimY, int dimZ);
    498     synchronized ByteBuffer nAllocationGetByteBuffer(long alloc, long[] stride, int xBytesSize,
    499                 int dimY, int dimZ) {
    500         validate();
    501         return rsnAllocationGetByteBuffer(mContext, alloc, stride, xBytesSize, dimY, dimZ);
    502     }
    503 
    504     native void rsnAllocationSetupBufferQueue(long con, long alloc, int numAlloc);
    505     synchronized void nAllocationSetupBufferQueue(long alloc, int numAlloc) {
    506         validate();
    507         rsnAllocationSetupBufferQueue(mContext, alloc, numAlloc);
    508     }
    509     native void rsnAllocationShareBufferQueue(long con, long alloc1, long alloc2);
    510     synchronized void nAllocationShareBufferQueue(long alloc1, long alloc2) {
    511         validate();
    512         rsnAllocationShareBufferQueue(mContext, alloc1, alloc2);
    513     }
    514     native Surface rsnAllocationGetSurface(long con, long alloc);
    515     synchronized Surface nAllocationGetSurface(long alloc) {
    516         validate();
    517         return rsnAllocationGetSurface(mContext, alloc);
    518     }
    519     native void rsnAllocationSetSurface(long con, long alloc, Surface sur);
    520     synchronized void nAllocationSetSurface(long alloc, Surface sur) {
    521         validate();
    522         rsnAllocationSetSurface(mContext, alloc, sur);
    523     }
    524     native void rsnAllocationIoSend(long con, long alloc);
    525     synchronized void nAllocationIoSend(long alloc) {
    526         validate();
    527         rsnAllocationIoSend(mContext, alloc);
    528     }
    529     native long rsnAllocationIoReceive(long con, long alloc);
    530     synchronized long nAllocationIoReceive(long alloc) {
    531         validate();
    532         return rsnAllocationIoReceive(mContext, alloc);
    533     }
    534 
    535     native void rsnAllocationGenerateMipmaps(long con, long alloc);
    536     synchronized void nAllocationGenerateMipmaps(long alloc) {
    537         validate();
    538         rsnAllocationGenerateMipmaps(mContext, alloc);
    539     }
    540     native void  rsnAllocationCopyFromBitmap(long con, long alloc, long bitmapHandle);
    541     synchronized void nAllocationCopyFromBitmap(long alloc, Bitmap bmp) {
    542         validate();
    543         rsnAllocationCopyFromBitmap(mContext, alloc, bmp.getNativeInstance());
    544     }
    545 
    546 
    547     native void rsnAllocationData1D(long con, long id, int off, int mip, int count, Object d, int sizeBytes, int dt,
    548                                     int mSize, boolean usePadding);
    549     synchronized void nAllocationData1D(long id, int off, int mip, int count, Object d, int sizeBytes, Element.DataType dt,
    550                                         int mSize, boolean usePadding) {
    551         validate();
    552         rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID, mSize, usePadding);
    553     }
    554 
    555     native void rsnAllocationElementData(long con,long id, int xoff, int yoff, int zoff, int mip, int compIdx, byte[] d, int sizeBytes);
    556     synchronized void nAllocationElementData(long id, int xoff, int yoff, int zoff, int mip, int compIdx, byte[] d, int sizeBytes) {
    557         validate();
    558         rsnAllocationElementData(mContext, id, xoff, yoff, zoff, mip, compIdx, d, sizeBytes);
    559     }
    560 
    561     native void rsnAllocationData2D(long con,
    562                                     long dstAlloc, int dstXoff, int dstYoff,
    563                                     int dstMip, int dstFace,
    564                                     int width, int height,
    565                                     long srcAlloc, int srcXoff, int srcYoff,
    566                                     int srcMip, int srcFace);
    567     synchronized void nAllocationData2D(long dstAlloc, int dstXoff, int dstYoff,
    568                                         int dstMip, int dstFace,
    569                                         int width, int height,
    570                                         long srcAlloc, int srcXoff, int srcYoff,
    571                                         int srcMip, int srcFace) {
    572         validate();
    573         rsnAllocationData2D(mContext,
    574                             dstAlloc, dstXoff, dstYoff,
    575                             dstMip, dstFace,
    576                             width, height,
    577                             srcAlloc, srcXoff, srcYoff,
    578                             srcMip, srcFace);
    579     }
    580 
    581     native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face,
    582                                     int w, int h, Object d, int sizeBytes, int dt,
    583                                     int mSize, boolean usePadding);
    584     synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face,
    585                                         int w, int h, Object d, int sizeBytes, Element.DataType dt,
    586                                         int mSize, boolean usePadding) {
    587         validate();
    588         rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID, mSize, usePadding);
    589     }
    590 
    591     native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face, Bitmap b);
    592     synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face, Bitmap b) {
    593         validate();
    594         rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
    595     }
    596 
    597     native void rsnAllocationData3D(long con,
    598                                     long dstAlloc, int dstXoff, int dstYoff, int dstZoff,
    599                                     int dstMip,
    600                                     int width, int height, int depth,
    601                                     long srcAlloc, int srcXoff, int srcYoff, int srcZoff,
    602                                     int srcMip);
    603     synchronized void nAllocationData3D(long dstAlloc, int dstXoff, int dstYoff, int dstZoff,
    604                                         int dstMip,
    605                                         int width, int height, int depth,
    606                                         long srcAlloc, int srcXoff, int srcYoff, int srcZoff,
    607                                         int srcMip) {
    608         validate();
    609         rsnAllocationData3D(mContext,
    610                             dstAlloc, dstXoff, dstYoff, dstZoff,
    611                             dstMip, width, height, depth,
    612                             srcAlloc, srcXoff, srcYoff, srcZoff, srcMip);
    613     }
    614 
    615     native void rsnAllocationData3D(long con, long id, int xoff, int yoff, int zoff, int mip,
    616                                     int w, int h, int depth, Object d, int sizeBytes, int dt,
    617                                     int mSize, boolean usePadding);
    618     synchronized void nAllocationData3D(long id, int xoff, int yoff, int zoff, int mip,
    619                                         int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt,
    620                                         int mSize, boolean usePadding) {
    621         validate();
    622         rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes,
    623                             dt.mID, mSize, usePadding);
    624     }
    625 
    626     native void rsnAllocationRead(long con, long id, Object d, int dt, int mSize, boolean usePadding);
    627     synchronized void nAllocationRead(long id, Object d, Element.DataType dt, int mSize, boolean usePadding) {
    628         validate();
    629         rsnAllocationRead(mContext, id, d, dt.mID, mSize, usePadding);
    630     }
    631 
    632     native void rsnAllocationRead1D(long con, long id, int off, int mip, int count, Object d,
    633                                     int sizeBytes, int dt, int mSize, boolean usePadding);
    634     synchronized void nAllocationRead1D(long id, int off, int mip, int count, Object d,
    635                                         int sizeBytes, Element.DataType dt, int mSize, boolean usePadding) {
    636         validate();
    637         rsnAllocationRead1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID, mSize, usePadding);
    638     }
    639 
    640     native void rsnAllocationElementRead(long con,long id, int xoff, int yoff, int zoff,
    641                                          int mip, int compIdx, byte[] d, int sizeBytes);
    642     synchronized void nAllocationElementRead(long id, int xoff, int yoff, int zoff,
    643                                              int mip, int compIdx, byte[] d, int sizeBytes) {
    644         validate();
    645         rsnAllocationElementRead(mContext, id, xoff, yoff, zoff, mip, compIdx, d, sizeBytes);
    646     }
    647 
    648     native void rsnAllocationRead2D(long con, long id, int xoff, int yoff, int mip, int face,
    649                                     int w, int h, Object d, int sizeBytes, int dt,
    650                                     int mSize, boolean usePadding);
    651     synchronized void nAllocationRead2D(long id, int xoff, int yoff, int mip, int face,
    652                                         int w, int h, Object d, int sizeBytes, Element.DataType dt,
    653                                         int mSize, boolean usePadding) {
    654         validate();
    655         rsnAllocationRead2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID, mSize, usePadding);
    656     }
    657 
    658     native void rsnAllocationRead3D(long con, long id, int xoff, int yoff, int zoff, int mip,
    659                                     int w, int h, int depth, Object d, int sizeBytes, int dt,
    660                                     int mSize, boolean usePadding);
    661     synchronized void nAllocationRead3D(long id, int xoff, int yoff, int zoff, int mip,
    662                                         int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt,
    663                                         int mSize, boolean usePadding) {
    664         validate();
    665         rsnAllocationRead3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes, dt.mID, mSize, usePadding);
    666     }
    667 
    668     native long  rsnAllocationGetType(long con, long id);
    669     synchronized long nAllocationGetType(long id) {
    670         validate();
    671         return rsnAllocationGetType(mContext, id);
    672     }
    673 
    674     native void rsnAllocationResize1D(long con, long id, int dimX);
    675     synchronized void nAllocationResize1D(long id, int dimX) {
    676         validate();
    677         rsnAllocationResize1D(mContext, id, dimX);
    678     }
    679 
    680     native long  rsnAllocationAdapterCreate(long con, long allocId, long typeId);
    681     synchronized long nAllocationAdapterCreate(long allocId, long typeId) {
    682         validate();
    683         return rsnAllocationAdapterCreate(mContext, allocId, typeId);
    684     }
    685 
    686     native void  rsnAllocationAdapterOffset(long con, long id, int x, int y, int z,
    687                                             int mip, int face, int a1, int a2, int a3, int a4);
    688     synchronized void nAllocationAdapterOffset(long id, int x, int y, int z,
    689                                                int mip, int face, int a1, int a2, int a3, int a4) {
    690         validate();
    691         rsnAllocationAdapterOffset(mContext, id, x, y, z, mip, face, a1, a2, a3, a4);
    692     }
    693 
    694     native long rsnFileA3DCreateFromAssetStream(long con, long assetStream);
    695     synchronized long nFileA3DCreateFromAssetStream(long assetStream) {
    696         validate();
    697         return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
    698     }
    699     native long rsnFileA3DCreateFromFile(long con, String path);
    700     synchronized long nFileA3DCreateFromFile(String path) {
    701         validate();
    702         return rsnFileA3DCreateFromFile(mContext, path);
    703     }
    704     native long rsnFileA3DCreateFromAsset(long con, AssetManager mgr, String path);
    705     synchronized long nFileA3DCreateFromAsset(AssetManager mgr, String path) {
    706         validate();
    707         return rsnFileA3DCreateFromAsset(mContext, mgr, path);
    708     }
    709     native int  rsnFileA3DGetNumIndexEntries(long con, long fileA3D);
    710     synchronized int nFileA3DGetNumIndexEntries(long fileA3D) {
    711         validate();
    712         return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
    713     }
    714     native void rsnFileA3DGetIndexEntries(long con, long fileA3D, int numEntries, int[] IDs, String[] names);
    715     synchronized void nFileA3DGetIndexEntries(long fileA3D, int numEntries, int[] IDs, String[] names) {
    716         validate();
    717         rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
    718     }
    719     native long rsnFileA3DGetEntryByIndex(long con, long fileA3D, int index);
    720     synchronized long nFileA3DGetEntryByIndex(long fileA3D, int index) {
    721         validate();
    722         return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
    723     }
    724 
    725     native long rsnFontCreateFromFile(long con, String fileName, float size, int dpi);
    726     synchronized long nFontCreateFromFile(String fileName, float size, int dpi) {
    727         validate();
    728         return rsnFontCreateFromFile(mContext, fileName, size, dpi);
    729     }
    730     native long rsnFontCreateFromAssetStream(long con, String name, float size, int dpi, long assetStream);
    731     synchronized long nFontCreateFromAssetStream(String name, float size, int dpi, long assetStream) {
    732         validate();
    733         return rsnFontCreateFromAssetStream(mContext, name, size, dpi, assetStream);
    734     }
    735     native long rsnFontCreateFromAsset(long con, AssetManager mgr, String path, float size, int dpi);
    736     synchronized long nFontCreateFromAsset(AssetManager mgr, String path, float size, int dpi) {
    737         validate();
    738         return rsnFontCreateFromAsset(mContext, mgr, path, size, dpi);
    739     }
    740 
    741 
    742     native void rsnScriptBindAllocation(long con, long script, long alloc, int slot);
    743     synchronized void nScriptBindAllocation(long script, long alloc, int slot) {
    744         validate();
    745         rsnScriptBindAllocation(mContext, script, alloc, slot);
    746     }
    747     native void rsnScriptSetTimeZone(long con, long script, byte[] timeZone);
    748     synchronized void nScriptSetTimeZone(long script, byte[] timeZone) {
    749         validate();
    750         rsnScriptSetTimeZone(mContext, script, timeZone);
    751     }
    752     native void rsnScriptInvoke(long con, long id, int slot);
    753     synchronized void nScriptInvoke(long id, int slot) {
    754         validate();
    755         rsnScriptInvoke(mContext, id, slot);
    756     }
    757 
    758     native void rsnScriptForEach(long con, long id, int slot, long[] ains,
    759                                  long aout, byte[] params, int[] limits);
    760 
    761     synchronized void nScriptForEach(long id, int slot, long[] ains, long aout,
    762                                      byte[] params, int[] limits) {
    763         validate();
    764         rsnScriptForEach(mContext, id, slot, ains, aout, params, limits);
    765     }
    766 
    767     native void rsnScriptReduce(long con, long id, int slot, long[] ains,
    768                                 long aout, int[] limits);
    769     synchronized void nScriptReduce(long id, int slot, long ains[], long aout,
    770                                     int[] limits) {
    771         validate();
    772         rsnScriptReduce(mContext, id, slot, ains, aout, limits);
    773     }
    774 
    775     native void rsnScriptInvokeV(long con, long id, int slot, byte[] params);
    776     synchronized void nScriptInvokeV(long id, int slot, byte[] params) {
    777         validate();
    778         rsnScriptInvokeV(mContext, id, slot, params);
    779     }
    780 
    781     native void rsnScriptSetVarI(long con, long id, int slot, int val);
    782     synchronized void nScriptSetVarI(long id, int slot, int val) {
    783         validate();
    784         rsnScriptSetVarI(mContext, id, slot, val);
    785     }
    786     native int rsnScriptGetVarI(long con, long id, int slot);
    787     synchronized int nScriptGetVarI(long id, int slot) {
    788         validate();
    789         return rsnScriptGetVarI(mContext, id, slot);
    790     }
    791 
    792     native void rsnScriptSetVarJ(long con, long id, int slot, long val);
    793     synchronized void nScriptSetVarJ(long id, int slot, long val) {
    794         validate();
    795         rsnScriptSetVarJ(mContext, id, slot, val);
    796     }
    797     native long rsnScriptGetVarJ(long con, long id, int slot);
    798     synchronized long nScriptGetVarJ(long id, int slot) {
    799         validate();
    800         return rsnScriptGetVarJ(mContext, id, slot);
    801     }
    802 
    803     native void rsnScriptSetVarF(long con, long id, int slot, float val);
    804     synchronized void nScriptSetVarF(long id, int slot, float val) {
    805         validate();
    806         rsnScriptSetVarF(mContext, id, slot, val);
    807     }
    808     native float rsnScriptGetVarF(long con, long id, int slot);
    809     synchronized float nScriptGetVarF(long id, int slot) {
    810         validate();
    811         return rsnScriptGetVarF(mContext, id, slot);
    812     }
    813     native void rsnScriptSetVarD(long con, long id, int slot, double val);
    814     synchronized void nScriptSetVarD(long id, int slot, double val) {
    815         validate();
    816         rsnScriptSetVarD(mContext, id, slot, val);
    817     }
    818     native double rsnScriptGetVarD(long con, long id, int slot);
    819     synchronized double nScriptGetVarD(long id, int slot) {
    820         validate();
    821         return rsnScriptGetVarD(mContext, id, slot);
    822     }
    823     native void rsnScriptSetVarV(long con, long id, int slot, byte[] val);
    824     synchronized void nScriptSetVarV(long id, int slot, byte[] val) {
    825         validate();
    826         rsnScriptSetVarV(mContext, id, slot, val);
    827     }
    828     native void rsnScriptGetVarV(long con, long id, int slot, byte[] val);
    829     synchronized void nScriptGetVarV(long id, int slot, byte[] val) {
    830         validate();
    831         rsnScriptGetVarV(mContext, id, slot, val);
    832     }
    833     native void rsnScriptSetVarVE(long con, long id, int slot, byte[] val,
    834                                   long e, int[] dims);
    835     synchronized void nScriptSetVarVE(long id, int slot, byte[] val,
    836                                       long e, int[] dims) {
    837         validate();
    838         rsnScriptSetVarVE(mContext, id, slot, val, e, dims);
    839     }
    840     native void rsnScriptSetVarObj(long con, long id, int slot, long val);
    841     synchronized void nScriptSetVarObj(long id, int slot, long val) {
    842         validate();
    843         rsnScriptSetVarObj(mContext, id, slot, val);
    844     }
    845 
    846     native long rsnScriptCCreate(long con, String resName, String cacheDir,
    847                                  byte[] script, int length);
    848     @UnsupportedAppUsage
    849     synchronized long nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
    850         validate();
    851         return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
    852     }
    853 
    854     native long rsnScriptIntrinsicCreate(long con, int id, long eid);
    855     synchronized long nScriptIntrinsicCreate(int id, long eid) {
    856         validate();
    857         return rsnScriptIntrinsicCreate(mContext, id, eid);
    858     }
    859 
    860     native long  rsnScriptKernelIDCreate(long con, long sid, int slot, int sig);
    861     synchronized long nScriptKernelIDCreate(long sid, int slot, int sig) {
    862         validate();
    863         return rsnScriptKernelIDCreate(mContext, sid, slot, sig);
    864     }
    865 
    866     native long  rsnScriptInvokeIDCreate(long con, long sid, int slot);
    867     synchronized long nScriptInvokeIDCreate(long sid, int slot) {
    868         validate();
    869         return rsnScriptInvokeIDCreate(mContext, sid, slot);
    870     }
    871 
    872     native long  rsnScriptFieldIDCreate(long con, long sid, int slot);
    873     synchronized long nScriptFieldIDCreate(long sid, int slot) {
    874         validate();
    875         return rsnScriptFieldIDCreate(mContext, sid, slot);
    876     }
    877 
    878     native long rsnScriptGroupCreate(long con, long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types);
    879     synchronized long nScriptGroupCreate(long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types) {
    880         validate();
    881         return rsnScriptGroupCreate(mContext, kernels, src, dstk, dstf, types);
    882     }
    883 
    884     native void rsnScriptGroupSetInput(long con, long group, long kernel, long alloc);
    885     synchronized void nScriptGroupSetInput(long group, long kernel, long alloc) {
    886         validate();
    887         rsnScriptGroupSetInput(mContext, group, kernel, alloc);
    888     }
    889 
    890     native void rsnScriptGroupSetOutput(long con, long group, long kernel, long alloc);
    891     synchronized void nScriptGroupSetOutput(long group, long kernel, long alloc) {
    892         validate();
    893         rsnScriptGroupSetOutput(mContext, group, kernel, alloc);
    894     }
    895 
    896     native void rsnScriptGroupExecute(long con, long group);
    897     synchronized void nScriptGroupExecute(long group) {
    898         validate();
    899         rsnScriptGroupExecute(mContext, group);
    900     }
    901 
    902     native long  rsnSamplerCreate(long con, int magFilter, int minFilter,
    903                                  int wrapS, int wrapT, int wrapR, float aniso);
    904     synchronized long nSamplerCreate(int magFilter, int minFilter,
    905                                  int wrapS, int wrapT, int wrapR, float aniso) {
    906         validate();
    907         return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
    908     }
    909 
    910     native long rsnProgramStoreCreate(long con, boolean r, boolean g, boolean b, boolean a,
    911                                       boolean depthMask, boolean dither,
    912                                       int srcMode, int dstMode, int depthFunc);
    913     synchronized long nProgramStoreCreate(boolean r, boolean g, boolean b, boolean a,
    914                                          boolean depthMask, boolean dither,
    915                                          int srcMode, int dstMode, int depthFunc) {
    916         validate();
    917         return rsnProgramStoreCreate(mContext, r, g, b, a, depthMask, dither, srcMode,
    918                                      dstMode, depthFunc);
    919     }
    920 
    921     native long rsnProgramRasterCreate(long con, boolean pointSprite, int cullMode);
    922     synchronized long nProgramRasterCreate(boolean pointSprite, int cullMode) {
    923         validate();
    924         return rsnProgramRasterCreate(mContext, pointSprite, cullMode);
    925     }
    926 
    927     native void rsnProgramBindConstants(long con, long pv, int slot, long mID);
    928     synchronized void nProgramBindConstants(long pv, int slot, long mID) {
    929         validate();
    930         rsnProgramBindConstants(mContext, pv, slot, mID);
    931     }
    932     native void rsnProgramBindTexture(long con, long vpf, int slot, long a);
    933     synchronized void nProgramBindTexture(long vpf, int slot, long a) {
    934         validate();
    935         rsnProgramBindTexture(mContext, vpf, slot, a);
    936     }
    937     native void rsnProgramBindSampler(long con, long vpf, int slot, long s);
    938     synchronized void nProgramBindSampler(long vpf, int slot, long s) {
    939         validate();
    940         rsnProgramBindSampler(mContext, vpf, slot, s);
    941     }
    942     native long rsnProgramFragmentCreate(long con, String shader, String[] texNames, long[] params);
    943     synchronized long nProgramFragmentCreate(String shader, String[] texNames, long[] params) {
    944         validate();
    945         return rsnProgramFragmentCreate(mContext, shader, texNames, params);
    946     }
    947     native long rsnProgramVertexCreate(long con, String shader, String[] texNames, long[] params);
    948     synchronized long nProgramVertexCreate(String shader, String[] texNames, long[] params) {
    949         validate();
    950         return rsnProgramVertexCreate(mContext, shader, texNames, params);
    951     }
    952 
    953     native long rsnMeshCreate(long con, long[] vtx, long[] idx, int[] prim);
    954     synchronized long nMeshCreate(long[] vtx, long[] idx, int[] prim) {
    955         validate();
    956         return rsnMeshCreate(mContext, vtx, idx, prim);
    957     }
    958     native int  rsnMeshGetVertexBufferCount(long con, long id);
    959     synchronized int nMeshGetVertexBufferCount(long id) {
    960         validate();
    961         return rsnMeshGetVertexBufferCount(mContext, id);
    962     }
    963     native int  rsnMeshGetIndexCount(long con, long id);
    964     synchronized int nMeshGetIndexCount(long id) {
    965         validate();
    966         return rsnMeshGetIndexCount(mContext, id);
    967     }
    968     native void rsnMeshGetVertices(long con, long id, long[] vtxIds, int vtxIdCount);
    969     synchronized void nMeshGetVertices(long id, long[] vtxIds, int vtxIdCount) {
    970         validate();
    971         rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
    972     }
    973     native void rsnMeshGetIndices(long con, long id, long[] idxIds, int[] primitives, int vtxIdCount);
    974     synchronized void nMeshGetIndices(long id, long[] idxIds, int[] primitives, int vtxIdCount) {
    975         validate();
    976         rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
    977     }
    978 
    979     native void rsnScriptIntrinsicBLAS_Single(long con, long id, int func, int TransA,
    980                                               int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
    981                                               float alpha, long A, long B, float beta, long C, int incX, int incY,
    982                                               int KL, int KU);
    983     synchronized void nScriptIntrinsicBLAS_Single(long id, int func, int TransA,
    984                                                   int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
    985                                                   float alpha, long A, long B, float beta, long C, int incX, int incY,
    986                                                   int KL, int KU) {
    987         validate();
    988         rsnScriptIntrinsicBLAS_Single(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alpha, A, B, beta, C, incX, incY, KL, KU);
    989     }
    990 
    991     native void rsnScriptIntrinsicBLAS_Double(long con, long id, int func, int TransA,
    992                                               int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
    993                                               double alpha, long A, long B, double beta, long C, int incX, int incY,
    994                                               int KL, int KU);
    995     synchronized void nScriptIntrinsicBLAS_Double(long id, int func, int TransA,
    996                                                   int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
    997                                                   double alpha, long A, long B, double beta, long C, int incX, int incY,
    998                                                   int KL, int KU) {
    999         validate();
   1000         rsnScriptIntrinsicBLAS_Double(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alpha, A, B, beta, C, incX, incY, KL, KU);
   1001     }
   1002 
   1003     native void rsnScriptIntrinsicBLAS_Complex(long con, long id, int func, int TransA,
   1004                                                int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
   1005                                                float alphaX, float alphaY, long A, long B, float betaX, float betaY, long C, int incX, int incY,
   1006                                                int KL, int KU);
   1007     synchronized void nScriptIntrinsicBLAS_Complex(long id, int func, int TransA,
   1008                                                    int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
   1009                                                    float alphaX, float alphaY, long A, long B, float betaX, float betaY, long C, int incX, int incY,
   1010                                                    int KL, int KU) {
   1011         validate();
   1012         rsnScriptIntrinsicBLAS_Complex(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alphaX, alphaY, A, B, betaX, betaY, C, incX, incY, KL, KU);
   1013     }
   1014 
   1015     native void rsnScriptIntrinsicBLAS_Z(long con, long id, int func, int TransA,
   1016                                          int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
   1017                                          double alphaX, double alphaY, long A, long B, double betaX, double betaY, long C, int incX, int incY,
   1018                                          int KL, int KU);
   1019     synchronized void nScriptIntrinsicBLAS_Z(long id, int func, int TransA,
   1020                                              int TransB, int Side, int Uplo, int Diag, int M, int N, int K,
   1021                                              double alphaX, double alphaY, long A, long B, double betaX, double betaY, long C, int incX, int incY,
   1022                                              int KL, int KU) {
   1023         validate();
   1024         rsnScriptIntrinsicBLAS_Z(mContext, id, func, TransA, TransB, Side, Uplo, Diag, M, N, K, alphaX, alphaY, A, B, betaX, betaY, C, incX, incY, KL, KU);
   1025     }
   1026 
   1027     native void rsnScriptIntrinsicBLAS_BNNM(long con, long id, int M, int N, int K,
   1028                                              long A, int a_offset, long B, int b_offset, long C, int c_offset,
   1029                                              int c_mult_int);
   1030     synchronized void nScriptIntrinsicBLAS_BNNM(long id, int M, int N, int K,
   1031                                              long A, int a_offset, long B, int b_offset, long C, int c_offset,
   1032                                              int c_mult_int) {
   1033         validate();
   1034         rsnScriptIntrinsicBLAS_BNNM(mContext, id, M, N, K, A, a_offset, B, b_offset, C, c_offset, c_mult_int);
   1035     }
   1036 
   1037 
   1038 
   1039     long     mContext;
   1040     private boolean mDestroyed = false;
   1041 
   1042     @SuppressWarnings({"FieldCanBeLocal"})
   1043     MessageThread mMessageThread;
   1044 
   1045     volatile Element mElement_U8;
   1046     volatile Element mElement_I8;
   1047     volatile Element mElement_U16;
   1048     volatile Element mElement_I16;
   1049     volatile Element mElement_U32;
   1050     volatile Element mElement_I32;
   1051     volatile Element mElement_U64;
   1052     volatile Element mElement_I64;
   1053     volatile Element mElement_F16;
   1054     volatile Element mElement_F32;
   1055     volatile Element mElement_F64;
   1056     volatile Element mElement_BOOLEAN;
   1057 
   1058     volatile Element mElement_ELEMENT;
   1059     volatile Element mElement_TYPE;
   1060     volatile Element mElement_ALLOCATION;
   1061     volatile Element mElement_SAMPLER;
   1062     volatile Element mElement_SCRIPT;
   1063     volatile Element mElement_MESH;
   1064     volatile Element mElement_PROGRAM_FRAGMENT;
   1065     volatile Element mElement_PROGRAM_VERTEX;
   1066     volatile Element mElement_PROGRAM_RASTER;
   1067     volatile Element mElement_PROGRAM_STORE;
   1068     volatile Element mElement_FONT;
   1069 
   1070     volatile Element mElement_A_8;
   1071     volatile Element mElement_RGB_565;
   1072     volatile Element mElement_RGB_888;
   1073     volatile Element mElement_RGBA_5551;
   1074     volatile Element mElement_RGBA_4444;
   1075     volatile Element mElement_RGBA_8888;
   1076 
   1077     volatile Element mElement_HALF_2;
   1078     volatile Element mElement_HALF_3;
   1079     volatile Element mElement_HALF_4;
   1080 
   1081     volatile Element mElement_FLOAT_2;
   1082     volatile Element mElement_FLOAT_3;
   1083     volatile Element mElement_FLOAT_4;
   1084 
   1085     volatile Element mElement_DOUBLE_2;
   1086     volatile Element mElement_DOUBLE_3;
   1087     volatile Element mElement_DOUBLE_4;
   1088 
   1089     volatile Element mElement_UCHAR_2;
   1090     volatile Element mElement_UCHAR_3;
   1091     volatile Element mElement_UCHAR_4;
   1092 
   1093     volatile Element mElement_CHAR_2;
   1094     volatile Element mElement_CHAR_3;
   1095     volatile Element mElement_CHAR_4;
   1096 
   1097     volatile Element mElement_USHORT_2;
   1098     volatile Element mElement_USHORT_3;
   1099     volatile Element mElement_USHORT_4;
   1100 
   1101     volatile Element mElement_SHORT_2;
   1102     volatile Element mElement_SHORT_3;
   1103     volatile Element mElement_SHORT_4;
   1104 
   1105     volatile Element mElement_UINT_2;
   1106     volatile Element mElement_UINT_3;
   1107     volatile Element mElement_UINT_4;
   1108 
   1109     volatile Element mElement_INT_2;
   1110     volatile Element mElement_INT_3;
   1111     volatile Element mElement_INT_4;
   1112 
   1113     volatile Element mElement_ULONG_2;
   1114     volatile Element mElement_ULONG_3;
   1115     volatile Element mElement_ULONG_4;
   1116 
   1117     volatile Element mElement_LONG_2;
   1118     volatile Element mElement_LONG_3;
   1119     volatile Element mElement_LONG_4;
   1120 
   1121     volatile Element mElement_YUV;
   1122 
   1123     volatile Element mElement_MATRIX_4X4;
   1124     volatile Element mElement_MATRIX_3X3;
   1125     volatile Element mElement_MATRIX_2X2;
   1126 
   1127     volatile Sampler mSampler_CLAMP_NEAREST;
   1128     volatile Sampler mSampler_CLAMP_LINEAR;
   1129     volatile Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
   1130     volatile Sampler mSampler_WRAP_NEAREST;
   1131     volatile Sampler mSampler_WRAP_LINEAR;
   1132     volatile Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
   1133     volatile Sampler mSampler_MIRRORED_REPEAT_NEAREST;
   1134     volatile Sampler mSampler_MIRRORED_REPEAT_LINEAR;
   1135     volatile Sampler mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
   1136 
   1137     ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
   1138     ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
   1139     ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
   1140     ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
   1141 
   1142     ProgramRaster mProgramRaster_CULL_BACK;
   1143     ProgramRaster mProgramRaster_CULL_FRONT;
   1144     ProgramRaster mProgramRaster_CULL_NONE;
   1145 
   1146     ///////////////////////////////////////////////////////////////////////////////////
   1147     //
   1148 
   1149     /**
   1150      * The base class from which an application should derive in order
   1151      * to receive RS messages from scripts. When a script calls {@code
   1152      * rsSendToClient}, the data fields will be filled, and the run
   1153      * method will be called on a separate thread.  This will occur
   1154      * some time after {@code rsSendToClient} completes in the script,
   1155      * as {@code rsSendToClient} is asynchronous. Message handlers are
   1156      * not guaranteed to have completed when {@link
   1157      * android.renderscript.RenderScript#finish} returns.
   1158      *
   1159      */
   1160     public static class RSMessageHandler implements Runnable {
   1161         protected int[] mData;
   1162         protected int mID;
   1163         protected int mLength;
   1164         public void run() {
   1165         }
   1166     }
   1167     /**
   1168      * If an application is expecting messages, it should set this
   1169      * field to an instance of {@link RSMessageHandler}.  This
   1170      * instance will receive all the user messages sent from {@code
   1171      * sendToClient} by scripts from this context.
   1172      *
   1173      */
   1174     @UnsupportedAppUsage
   1175     RSMessageHandler mMessageCallback = null;
   1176 
   1177     public void setMessageHandler(RSMessageHandler msg) {
   1178         mMessageCallback = msg;
   1179     }
   1180     public RSMessageHandler getMessageHandler() {
   1181         return mMessageCallback;
   1182     }
   1183 
   1184     /**
   1185      * Place a message into the message queue to be sent back to the message
   1186      * handler once all previous commands have been executed.
   1187      *
   1188      * @param id
   1189      * @param data
   1190      */
   1191     public void sendMessage(int id, int[] data) {
   1192         nContextSendMessage(id, data);
   1193     }
   1194 
   1195     /**
   1196      * The runtime error handler base class.  An application should derive from this class
   1197      * if it wishes to install an error handler.  When errors occur at runtime,
   1198      * the fields in this class will be filled, and the run method will be called.
   1199      *
   1200      */
   1201     public static class RSErrorHandler implements Runnable {
   1202         protected String mErrorMessage;
   1203         protected int mErrorNum;
   1204         public void run() {
   1205         }
   1206     }
   1207 
   1208     /**
   1209      * Application Error handler.  All runtime errors will be dispatched to the
   1210      * instance of RSAsyncError set here.  If this field is null a
   1211      * {@link RSRuntimeException} will instead be thrown with details about the error.
   1212      * This will cause program termaination.
   1213      *
   1214      */
   1215     RSErrorHandler mErrorCallback = null;
   1216 
   1217     public void setErrorHandler(RSErrorHandler msg) {
   1218         mErrorCallback = msg;
   1219     }
   1220     public RSErrorHandler getErrorHandler() {
   1221         return mErrorCallback;
   1222     }
   1223 
   1224     /**
   1225      * RenderScript worker thread priority enumeration.  The default value is
   1226      * NORMAL.  Applications wishing to do background processing should set
   1227      * their priority to LOW to avoid starving forground processes.
   1228      */
   1229     public enum Priority {
   1230         // These values used to represent official thread priority values
   1231         // now they are simply enums to be used by the runtime side
   1232         LOW (15),
   1233         NORMAL (-8);
   1234 
   1235         int mID;
   1236         Priority(int id) {
   1237             mID = id;
   1238         }
   1239     }
   1240 
   1241     void validateObject(BaseObj o) {
   1242         if (o != null) {
   1243             if (o.mRS != this) {
   1244                 throw new RSIllegalArgumentException("Attempting to use an object across contexts.");
   1245             }
   1246         }
   1247     }
   1248 
   1249     @UnsupportedAppUsage
   1250     void validate() {
   1251         if (mContext == 0) {
   1252             throw new RSInvalidStateException("Calling RS with no Context active.");
   1253         }
   1254     }
   1255 
   1256 
   1257     /**
   1258      * Change the priority of the worker threads for this context.
   1259      *
   1260      * @param p New priority to be set.
   1261      */
   1262     public void setPriority(Priority p) {
   1263         validate();
   1264         nContextSetPriority(p.mID);
   1265     }
   1266 
   1267     static class MessageThread extends Thread {
   1268         RenderScript mRS;
   1269         boolean mRun = true;
   1270         int[] mAuxData = new int[2];
   1271 
   1272         static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
   1273         static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
   1274         static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
   1275         static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
   1276         static final int RS_MESSAGE_TO_CLIENT_USER = 4;
   1277         static final int RS_MESSAGE_TO_CLIENT_NEW_BUFFER = 5;
   1278 
   1279         static final int RS_ERROR_FATAL_DEBUG = 0x0800;
   1280         static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
   1281 
   1282         MessageThread(RenderScript rs) {
   1283             super("RSMessageThread");
   1284             mRS = rs;
   1285 
   1286         }
   1287 
   1288         public void run() {
   1289             // This function is a temporary solution.  The final solution will
   1290             // used typed allocations where the message id is the type indicator.
   1291             int[] rbuf = new int[16];
   1292             mRS.nContextInitToClient(mRS.mContext);
   1293             while(mRun) {
   1294                 rbuf[0] = 0;
   1295                 int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
   1296                 int size = mAuxData[1];
   1297                 int subID = mAuxData[0];
   1298 
   1299                 if (msg == RS_MESSAGE_TO_CLIENT_USER) {
   1300                     if ((size>>2) >= rbuf.length) {
   1301                         rbuf = new int[(size + 3) >> 2];
   1302                     }
   1303                     if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
   1304                         RS_MESSAGE_TO_CLIENT_USER) {
   1305                         throw new RSDriverException("Error processing message from RenderScript.");
   1306                     }
   1307 
   1308                     if(mRS.mMessageCallback != null) {
   1309                         mRS.mMessageCallback.mData = rbuf;
   1310                         mRS.mMessageCallback.mID = subID;
   1311                         mRS.mMessageCallback.mLength = size;
   1312                         mRS.mMessageCallback.run();
   1313                     } else {
   1314                         throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
   1315                     }
   1316                     continue;
   1317                 }
   1318 
   1319                 if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
   1320                     String e = mRS.nContextGetErrorMessage(mRS.mContext);
   1321 
   1322                     // Throw RSRuntimeException under the following conditions:
   1323                     //
   1324                     // 1) It is an unknown fatal error.
   1325                     // 2) It is a debug fatal error, and we are not in a
   1326                     //    debug context.
   1327                     // 3) It is a debug fatal error, and we do not have an
   1328                     //    error callback.
   1329                     if (subID >= RS_ERROR_FATAL_UNKNOWN ||
   1330                         (subID >= RS_ERROR_FATAL_DEBUG &&
   1331                          (mRS.mContextType != ContextType.DEBUG ||
   1332                           mRS.mErrorCallback == null))) {
   1333                         throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
   1334                     }
   1335 
   1336                     if(mRS.mErrorCallback != null) {
   1337                         mRS.mErrorCallback.mErrorMessage = e;
   1338                         mRS.mErrorCallback.mErrorNum = subID;
   1339                         mRS.mErrorCallback.run();
   1340                     } else {
   1341                         android.util.Log.e(LOG_TAG, "non fatal RS error, " + e);
   1342                         // Do not throw here. In these cases, we do not have
   1343                         // a fatal error.
   1344                     }
   1345                     continue;
   1346                 }
   1347 
   1348                 if (msg == RS_MESSAGE_TO_CLIENT_NEW_BUFFER) {
   1349                     if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
   1350                         RS_MESSAGE_TO_CLIENT_NEW_BUFFER) {
   1351                         throw new RSDriverException("Error processing message from RenderScript.");
   1352                     }
   1353                     long bufferID = ((long)rbuf[1] << 32L) + ((long)rbuf[0] & 0xffffffffL);
   1354                     Allocation.sendBufferNotification(bufferID);
   1355                     continue;
   1356                 }
   1357 
   1358                 // 2: teardown.
   1359                 // But we want to avoid starving other threads during
   1360                 // teardown by yielding until the next line in the destructor
   1361                 // can execute to set mRun = false
   1362                 try {
   1363                     sleep(1, 0);
   1364                 } catch(InterruptedException e) {
   1365                 }
   1366             }
   1367             //Log.d(LOG_TAG, "MessageThread exiting.");
   1368         }
   1369     }
   1370 
   1371     RenderScript(Context ctx) {
   1372         mContextType = ContextType.NORMAL;
   1373         if (ctx != null) {
   1374             mApplicationContext = ctx.getApplicationContext();
   1375         }
   1376         mRWLock = new ReentrantReadWriteLock();
   1377         try {
   1378             registerNativeAllocation.invoke(sRuntime, 4 * 1024 * 1024); // 4MB for GC sake
   1379         } catch (Exception e) {
   1380             Log.e(RenderScript.LOG_TAG, "Couldn't invoke registerNativeAllocation:" + e);
   1381             throw new RSRuntimeException("Couldn't invoke registerNativeAllocation:" + e);
   1382         }
   1383 
   1384     }
   1385 
   1386     /**
   1387      * Gets the application context associated with the RenderScript context.
   1388      *
   1389      * @return The application context.
   1390      */
   1391     public final Context getApplicationContext() {
   1392         return mApplicationContext;
   1393     }
   1394 
   1395     /**
   1396      * Name of the file that holds the object cache.
   1397      */
   1398     private static String mCachePath;
   1399 
   1400     /**
   1401      * Gets the path to the code cache.
   1402      */
   1403     static synchronized String getCachePath() {
   1404         if (mCachePath == null) {
   1405             final String CACHE_PATH = "com.android.renderscript.cache";
   1406             if (RenderScriptCacheDir.mCacheDir == null) {
   1407                 throw new RSRuntimeException("RenderScript code cache directory uninitialized.");
   1408             }
   1409             File f = new File(RenderScriptCacheDir.mCacheDir, CACHE_PATH);
   1410             mCachePath = f.getAbsolutePath();
   1411             f.mkdirs();
   1412         }
   1413         return mCachePath;
   1414     }
   1415 
   1416     /**
   1417      * Create a RenderScript context.
   1418      *
   1419      * @param ctx The context.
   1420      * @return RenderScript
   1421      */
   1422     private static RenderScript internalCreate(Context ctx, int sdkVersion, ContextType ct, int flags) {
   1423         if (!sInitialized) {
   1424             Log.e(LOG_TAG, "RenderScript.create() called when disabled; someone is likely to crash");
   1425             return null;
   1426         }
   1427 
   1428         if ((flags & ~(CREATE_FLAG_LOW_LATENCY | CREATE_FLAG_LOW_POWER |
   1429                        CREATE_FLAG_WAIT_FOR_ATTACH)) != 0) {
   1430             throw new RSIllegalArgumentException("Invalid flags passed.");
   1431         }
   1432 
   1433         RenderScript rs = new RenderScript(ctx);
   1434 
   1435         long device = rs.nDeviceCreate();
   1436         rs.mContext = rs.nContextCreate(device, flags, sdkVersion, ct.mID);
   1437         rs.mContextType = ct;
   1438         rs.mContextFlags = flags;
   1439         rs.mContextSdkVersion = sdkVersion;
   1440         if (rs.mContext == 0) {
   1441             throw new RSDriverException("Failed to create RS context.");
   1442         }
   1443 
   1444         // set up cache directory for entire context
   1445         rs.nContextSetCacheDir(RenderScript.getCachePath());
   1446 
   1447         rs.mMessageThread = new MessageThread(rs);
   1448         rs.mMessageThread.start();
   1449         return rs;
   1450     }
   1451 
   1452     /**
   1453      * calls create(ctx, ContextType.NORMAL, CREATE_FLAG_NONE)
   1454      *
   1455      * See documentation for @create for details
   1456      *
   1457      * @param ctx The context.
   1458      * @return RenderScript
   1459      */
   1460     public static RenderScript create(Context ctx) {
   1461         return create(ctx, ContextType.NORMAL);
   1462     }
   1463 
   1464     /**
   1465      * calls create(ctx, ct, CREATE_FLAG_NONE)
   1466      *
   1467      * See documentation for @create for details
   1468      *
   1469      * @param ctx The context.
   1470      * @param ct The type of context to be created.
   1471      * @return RenderScript
   1472      */
   1473     public static RenderScript create(Context ctx, ContextType ct) {
   1474         return create(ctx, ct, CREATE_FLAG_NONE);
   1475     }
   1476 
   1477 
   1478     /**
   1479      * Gets or creates a RenderScript context of the specified type.
   1480      *
   1481      * The returned context will be cached for future reuse within
   1482      * the process. When an application is finished using
   1483      * RenderScript it should call releaseAllContexts()
   1484      *
   1485      * A process context is a context designed for easy creation and
   1486      * lifecycle management.  Multiple calls to this function will
   1487      * return the same object provided they are called with the same
   1488      * options.  This allows it to be used any time a RenderScript
   1489      * context is needed.
   1490      *
   1491      * Prior to API 23 this always created a new context.
   1492      *
   1493      * @param ctx The context.
   1494      * @param ct The type of context to be created.
   1495      * @param flags The OR of the CREATE_FLAG_* options desired
   1496      * @return RenderScript
   1497      */
   1498     public static RenderScript create(Context ctx, ContextType ct, int flags) {
   1499         int v = ctx.getApplicationInfo().targetSdkVersion;
   1500         return create(ctx, v, ct, flags);
   1501     }
   1502 
   1503     /**
   1504      * calls create(ctx, sdkVersion, ContextType.NORMAL, CREATE_FLAG_NONE)
   1505      *
   1506      * Used by the RenderScriptThunker to maintain backward compatibility.
   1507      *
   1508      * @hide
   1509      * @param ctx The context.
   1510      * @param sdkVersion The target SDK Version.
   1511      * @return RenderScript
   1512      */
   1513     @UnsupportedAppUsage
   1514     public static RenderScript create(Context ctx, int sdkVersion) {
   1515         return create(ctx, sdkVersion, ContextType.NORMAL, CREATE_FLAG_NONE);
   1516     }
   1517 
   1518      /**
   1519      * Gets or creates a RenderScript context of the specified type.
   1520      *
   1521      * @param ctx The context.
   1522      * @param ct The type of context to be created.
   1523      * @param sdkVersion The target SDK Version.
   1524      * @param flags The OR of the CREATE_FLAG_* options desired
   1525      * @return RenderScript
   1526      */
   1527     @UnsupportedAppUsage
   1528     private static RenderScript create(Context ctx, int sdkVersion, ContextType ct, int flags) {
   1529         if (sdkVersion < 23) {
   1530             return internalCreate(ctx, sdkVersion, ct, flags);
   1531         }
   1532 
   1533         synchronized (mProcessContextList) {
   1534             for (RenderScript prs : mProcessContextList) {
   1535                 if ((prs.mContextType == ct) &&
   1536                     (prs.mContextFlags == flags) &&
   1537                     (prs.mContextSdkVersion == sdkVersion)) {
   1538 
   1539                     return prs;
   1540                 }
   1541             }
   1542 
   1543             RenderScript prs = internalCreate(ctx, sdkVersion, ct, flags);
   1544             prs.mIsProcessContext = true;
   1545             mProcessContextList.add(prs);
   1546             return prs;
   1547         }
   1548     }
   1549 
   1550     /**
   1551      * Releases all the process contexts.  This is the same as
   1552      * calling .destroy() on each unique context retreived with
   1553      * create(...). If no contexts have been created this
   1554      * function does nothing.
   1555      *
   1556      * Typically you call this when your application is losing focus
   1557      * and will not be using a context for some time.
   1558      *
   1559      * This has no effect on a context created with
   1560      * createMultiContext()
   1561      */
   1562     public static void releaseAllContexts() {
   1563         ArrayList<RenderScript> oldList;
   1564         synchronized (mProcessContextList) {
   1565             oldList = mProcessContextList;
   1566             mProcessContextList = new ArrayList<RenderScript>();
   1567         }
   1568 
   1569         for (RenderScript prs : oldList) {
   1570             prs.mIsProcessContext = false;
   1571             prs.destroy();
   1572         }
   1573         oldList.clear();
   1574     }
   1575 
   1576 
   1577 
   1578     /**
   1579      * Create a RenderScript context.
   1580      *
   1581      * This is an advanced function intended for applications which
   1582      * need to create more than one RenderScript context to be used
   1583      * at the same time.
   1584      *
   1585      * If you need a single context please use create()
   1586      *
   1587      * @param ctx The context.
   1588      * @return RenderScript
   1589      */
   1590     public static RenderScript createMultiContext(Context ctx, ContextType ct, int flags, int API_number) {
   1591         return internalCreate(ctx, API_number, ct, flags);
   1592     }
   1593 
   1594 
   1595     /**
   1596      * Print the currently available debugging information about the state of
   1597      * the RS context to the log.
   1598      *
   1599      */
   1600     public void contextDump() {
   1601         validate();
   1602         nContextDump(0);
   1603     }
   1604 
   1605     /**
   1606      * Wait for any pending asynchronous opeations (such as copies to a RS
   1607      * allocation or RS script executions) to complete.
   1608      *
   1609      */
   1610     public void finish() {
   1611         nContextFinish();
   1612     }
   1613 
   1614     private void helpDestroy() {
   1615         boolean shouldDestroy = false;
   1616         synchronized(this) {
   1617             if (!mDestroyed) {
   1618                 shouldDestroy = true;
   1619                 mDestroyed = true;
   1620             }
   1621         }
   1622 
   1623         if (shouldDestroy) {
   1624             nContextFinish();
   1625 
   1626             nContextDeinitToClient(mContext);
   1627             mMessageThread.mRun = false;
   1628             // Interrupt mMessageThread so it gets to see immediately that mRun is false
   1629             // and exit rightaway.
   1630             mMessageThread.interrupt();
   1631 
   1632             // Wait for mMessageThread to join.  Try in a loop, in case this thread gets interrupted
   1633             // during the wait.  If interrupted, set the "interrupted" status of the current thread.
   1634             boolean hasJoined = false, interrupted = false;
   1635             while (!hasJoined) {
   1636                 try {
   1637                     mMessageThread.join();
   1638                     hasJoined = true;
   1639                 } catch (InterruptedException e) {
   1640                     interrupted = true;
   1641                 }
   1642             }
   1643             if (interrupted) {
   1644                 Log.v(LOG_TAG, "Interrupted during wait for MessageThread to join");
   1645                 Thread.currentThread().interrupt();
   1646             }
   1647 
   1648             nContextDestroy();
   1649         }
   1650     }
   1651 
   1652     protected void finalize() throws Throwable {
   1653         helpDestroy();
   1654         super.finalize();
   1655     }
   1656 
   1657 
   1658     /**
   1659      * Destroys this RenderScript context.  Once this function is called,
   1660      * using this context or any objects belonging to this context is
   1661      * illegal.
   1662      *
   1663      * API 23+, this function is a NOP if the context was created
   1664      * with create().  Please use releaseAllContexts() to clean up
   1665      * contexts created with the create function.
   1666      *
   1667      */
   1668     public void destroy() {
   1669         if (mIsProcessContext) {
   1670             // users cannot destroy a process context
   1671             return;
   1672         }
   1673         validate();
   1674         helpDestroy();
   1675     }
   1676 
   1677     boolean isAlive() {
   1678         return mContext != 0;
   1679     }
   1680 
   1681     long safeID(BaseObj o) {
   1682         if(o != null) {
   1683             return o.getID(this);
   1684         }
   1685         return 0;
   1686     }
   1687 }
   1688