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