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.util.concurrent.locks.ReentrantReadWriteLock;
22 
23 import android.content.Context;
24 import android.content.res.AssetManager;
25 import android.graphics.Bitmap;
26 import android.graphics.SurfaceTexture;
27 import android.os.Process;
28 import android.util.Log;
29 import android.view.Surface;
30 import android.os.SystemProperties;
31 import android.os.Trace;
32 
33 /**
34  * This class provides access to a RenderScript context, which controls RenderScript
35  * initialization, resource management, and teardown. An instance of the RenderScript
36  * class must be created before any other RS objects can be created.
37  *
38  * <div class="special reference">
39  * <h3>Developer Guides</h3>
40  * <p>For more information about creating an application that uses RenderScript, read the
41  * <a href="{@docRoot}guide/topics/renderscript/index.html">RenderScript</a> developer guide.</p>
42  * </div>
43  **/
44 public class RenderScript {
45     static final long TRACE_TAG = Trace.TRACE_TAG_RS;
46 
47     static final String LOG_TAG = "RenderScript_jni";
48     static final boolean DEBUG  = false;
49     @SuppressWarnings({"UnusedDeclaration", "deprecation"})
50     static final boolean LOG_ENABLED = false;
51 
52     private Context mApplicationContext;
53 
54     /*
55      * We use a class initializer to allow the native code to cache some
56      * field offsets.
57      */
58     @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"}) // TODO: now used locally; remove?
59     static boolean sInitialized;
_nInit()60     native static void _nInit();
61 
62     static Object sRuntime;
63     static Method registerNativeAllocation;
64     static Method registerNativeFree;
65 
66     /*
67      * Context creation flag that specifies a normal context.
68     */
69     public static final int CREATE_FLAG_NONE = 0x0000;
70 
71     /*
72      * Context creation flag which specifies a context optimized for low
73      * latency over peak performance. This is a hint and may have no effect
74      * on some implementations.
75     */
76     public static final int CREATE_FLAG_LOW_LATENCY = 0x0002;
77 
78     /*
79      * Context creation flag which specifies a context optimized for long
80      * battery life over peak performance. This is a hint and may have no effect
81      * on some implementations.
82     */
83     public static final int CREATE_FLAG_LOW_POWER = 0x0004;
84 
85     /*
86      * Detect the bitness of the VM to allow FieldPacker to do the right thing.
87      */
rsnSystemGetPointerSize()88     static native int rsnSystemGetPointerSize();
89     static int sPointerSize;
90 
91     static {
92         sInitialized = false;
93         if (!SystemProperties.getBoolean("config.disable_renderscript", false)) {
94             try {
95                 Class<?> vm_runtime = Class.forName("dalvik.system.VMRuntime");
96                 Method get_runtime = vm_runtime.getDeclaredMethod("getRuntime");
97                 sRuntime = get_runtime.invoke(null);
98                 registerNativeAllocation = vm_runtime.getDeclaredMethod("registerNativeAllocation", Integer.TYPE);
99                 registerNativeFree = vm_runtime.getDeclaredMethod("registerNativeFree", Integer.TYPE);
100             } catch (Exception e) {
101                 Log.e(LOG_TAG, "Error loading GC methods: " + e);
102                 throw new RSRuntimeException("Error loading GC methods: " + e);
103             }
104             try {
105                 System.loadLibrary("rs_jni");
_nInit()106                 _nInit();
107                 sInitialized = true;
108                 sPointerSize = rsnSystemGetPointerSize();
109             } catch (UnsatisfiedLinkError e) {
110                 Log.e(LOG_TAG, "Error loading RS jni library: " + e);
111                 throw new RSRuntimeException("Error loading RS jni library: " + e);
112             }
113         }
114     }
115 
116     // Non-threadsafe functions.
nDeviceCreate()117     native long  nDeviceCreate();
nDeviceDestroy(long dev)118     native void nDeviceDestroy(long dev);
nDeviceSetConfig(long dev, int param, int value)119     native void nDeviceSetConfig(long dev, int param, int value);
nContextGetUserMessage(long con, int[] data)120     native int nContextGetUserMessage(long con, int[] data);
nContextGetErrorMessage(long con)121     native String nContextGetErrorMessage(long con);
nContextPeekMessage(long con, int[] subID)122     native int  nContextPeekMessage(long con, int[] subID);
nContextInitToClient(long con)123     native void nContextInitToClient(long con);
nContextDeinitToClient(long con)124     native void nContextDeinitToClient(long con);
125 
126     static File mCacheDir;
127 
128     // this should be a monotonically increasing ID
129     // used in conjunction with the API version of a device
130     static final long sMinorID = 1;
131 
132     /**
133      * Returns an identifier that can be used to identify a particular
134      * minor version of RS.
135      *
136      * @hide
137      */
getMinorID()138     public static long getMinorID() {
139         return sMinorID;
140     }
141 
142      /**
143      * Sets the directory to use as a persistent storage for the
144      * renderscript object file cache.
145      *
146      * @hide
147      * @param cacheDir A directory the current process can write to
148      */
setupDiskCache(File cacheDir)149     public static void setupDiskCache(File cacheDir) {
150         if (!sInitialized) {
151             Log.e(LOG_TAG, "RenderScript.setupDiskCache() called when disabled");
152             return;
153         }
154 
155         // Defer creation of cache path to nScriptCCreate().
156         mCacheDir = cacheDir;
157     }
158 
159     /**
160      * ContextType specifies the specific type of context to be created.
161      *
162      */
163     public enum ContextType {
164         /**
165          * NORMAL context, this is the default and what shipping apps should
166          * use.
167          */
168         NORMAL (0),
169 
170         /**
171          * DEBUG context, perform extra runtime checks to validate the
172          * kernels and APIs are being used as intended.  Get and SetElementAt
173          * will be bounds checked in this mode.
174          */
175         DEBUG (1),
176 
177         /**
178          * PROFILE context, Intended to be used once the first time an
179          * application is run on a new device.  This mode allows the runtime to
180          * do additional testing and performance tuning.
181          */
182         PROFILE (2);
183 
184         int mID;
ContextType(int id)185         ContextType(int id) {
186             mID = id;
187         }
188     }
189 
190     ContextType mContextType;
191     ReentrantReadWriteLock mRWLock;
192 
193     // Methods below are wrapped to protect the non-threadsafe
194     // 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)195     native long  rsnContextCreateGL(long dev, int ver, int sdkVer,
196                  int colorMin, int colorPref,
197                  int alphaMin, int alphaPref,
198                  int depthMin, int depthPref,
199                  int stencilMin, int stencilPref,
200                  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)201     synchronized long nContextCreateGL(long dev, int ver, int sdkVer,
202                  int colorMin, int colorPref,
203                  int alphaMin, int alphaPref,
204                  int depthMin, int depthPref,
205                  int stencilMin, int stencilPref,
206                  int samplesMin, int samplesPref, float samplesQ, int dpi) {
207         return rsnContextCreateGL(dev, ver, sdkVer, colorMin, colorPref,
208                                   alphaMin, alphaPref, depthMin, depthPref,
209                                   stencilMin, stencilPref,
210                                   samplesMin, samplesPref, samplesQ, dpi);
211     }
rsnContextCreate(long dev, int ver, int sdkVer, int contextType)212     native long  rsnContextCreate(long dev, int ver, int sdkVer, int contextType);
nContextCreate(long dev, int ver, int sdkVer, int contextType)213     synchronized long nContextCreate(long dev, int ver, int sdkVer, int contextType) {
214         return rsnContextCreate(dev, ver, sdkVer, contextType);
215     }
rsnContextDestroy(long con)216     native void rsnContextDestroy(long con);
nContextDestroy()217     synchronized void nContextDestroy() {
218         validate();
219 
220         // take teardown lock
221         // teardown lock can only be taken when no objects are being destroyed
222         ReentrantReadWriteLock.WriteLock wlock = mRWLock.writeLock();
223         wlock.lock();
224 
225         long curCon = mContext;
226         // context is considered dead as of this point
227         mContext = 0;
228 
229         wlock.unlock();
230         rsnContextDestroy(curCon);
231     }
rsnContextSetSurface(long con, int w, int h, Surface sur)232     native void rsnContextSetSurface(long con, int w, int h, Surface sur);
nContextSetSurface(int w, int h, Surface sur)233     synchronized void nContextSetSurface(int w, int h, Surface sur) {
234         validate();
235         rsnContextSetSurface(mContext, w, h, sur);
236     }
rsnContextSetSurfaceTexture(long con, int w, int h, SurfaceTexture sur)237     native void rsnContextSetSurfaceTexture(long con, int w, int h, SurfaceTexture sur);
nContextSetSurfaceTexture(int w, int h, SurfaceTexture sur)238     synchronized void nContextSetSurfaceTexture(int w, int h, SurfaceTexture sur) {
239         validate();
240         rsnContextSetSurfaceTexture(mContext, w, h, sur);
241     }
rsnContextSetPriority(long con, int p)242     native void rsnContextSetPriority(long con, int p);
nContextSetPriority(int p)243     synchronized void nContextSetPriority(int p) {
244         validate();
245         rsnContextSetPriority(mContext, p);
246     }
rsnContextDump(long con, int bits)247     native void rsnContextDump(long con, int bits);
nContextDump(int bits)248     synchronized void nContextDump(int bits) {
249         validate();
250         rsnContextDump(mContext, bits);
251     }
rsnContextFinish(long con)252     native void rsnContextFinish(long con);
nContextFinish()253     synchronized void nContextFinish() {
254         validate();
255         rsnContextFinish(mContext);
256     }
257 
rsnContextSendMessage(long con, int id, int[] data)258     native void rsnContextSendMessage(long con, int id, int[] data);
nContextSendMessage(int id, int[] data)259     synchronized void nContextSendMessage(int id, int[] data) {
260         validate();
261         rsnContextSendMessage(mContext, id, data);
262     }
263 
rsnContextBindRootScript(long con, long script)264     native void rsnContextBindRootScript(long con, long script);
nContextBindRootScript(long script)265     synchronized void nContextBindRootScript(long script) {
266         validate();
267         rsnContextBindRootScript(mContext, script);
268     }
rsnContextBindSampler(long con, int sampler, int slot)269     native void rsnContextBindSampler(long con, int sampler, int slot);
nContextBindSampler(int sampler, int slot)270     synchronized void nContextBindSampler(int sampler, int slot) {
271         validate();
272         rsnContextBindSampler(mContext, sampler, slot);
273     }
rsnContextBindProgramStore(long con, long pfs)274     native void rsnContextBindProgramStore(long con, long pfs);
nContextBindProgramStore(long pfs)275     synchronized void nContextBindProgramStore(long pfs) {
276         validate();
277         rsnContextBindProgramStore(mContext, pfs);
278     }
rsnContextBindProgramFragment(long con, long pf)279     native void rsnContextBindProgramFragment(long con, long pf);
nContextBindProgramFragment(long pf)280     synchronized void nContextBindProgramFragment(long pf) {
281         validate();
282         rsnContextBindProgramFragment(mContext, pf);
283     }
rsnContextBindProgramVertex(long con, long pv)284     native void rsnContextBindProgramVertex(long con, long pv);
nContextBindProgramVertex(long pv)285     synchronized void nContextBindProgramVertex(long pv) {
286         validate();
287         rsnContextBindProgramVertex(mContext, pv);
288     }
rsnContextBindProgramRaster(long con, long pr)289     native void rsnContextBindProgramRaster(long con, long pr);
nContextBindProgramRaster(long pr)290     synchronized void nContextBindProgramRaster(long pr) {
291         validate();
292         rsnContextBindProgramRaster(mContext, pr);
293     }
rsnContextPause(long con)294     native void rsnContextPause(long con);
nContextPause()295     synchronized void nContextPause() {
296         validate();
297         rsnContextPause(mContext);
298     }
rsnContextResume(long con)299     native void rsnContextResume(long con);
nContextResume()300     synchronized void nContextResume() {
301         validate();
302         rsnContextResume(mContext);
303     }
304 
rsnAssignName(long con, long obj, byte[] name)305     native void rsnAssignName(long con, long obj, byte[] name);
nAssignName(long obj, byte[] name)306     synchronized void nAssignName(long obj, byte[] name) {
307         validate();
308         rsnAssignName(mContext, obj, name);
309     }
rsnGetName(long con, long obj)310     native String rsnGetName(long con, long obj);
nGetName(long obj)311     synchronized String nGetName(long obj) {
312         validate();
313         return rsnGetName(mContext, obj);
314     }
315 
316     // nObjDestroy is explicitly _not_ synchronous to prevent crashes in finalizers
rsnObjDestroy(long con, long id)317     native void rsnObjDestroy(long con, long id);
nObjDestroy(long id)318     void nObjDestroy(long id) {
319         // There is a race condition here.  The calling code may be run
320         // by the gc while teardown is occuring.  This protects againts
321         // deleting dead objects.
322         if (mContext != 0) {
323             rsnObjDestroy(mContext, id);
324         }
325     }
326 
rsnElementCreate(long con, long type, int kind, boolean norm, int vecSize)327     native long rsnElementCreate(long con, long type, int kind, boolean norm, int vecSize);
nElementCreate(long type, int kind, boolean norm, int vecSize)328     synchronized long nElementCreate(long type, int kind, boolean norm, int vecSize) {
329         validate();
330         return rsnElementCreate(mContext, type, kind, norm, vecSize);
331     }
rsnElementCreate2(long con, long[] elements, String[] names, int[] arraySizes)332     native long rsnElementCreate2(long con, long[] elements, String[] names, int[] arraySizes);
nElementCreate2(long[] elements, String[] names, int[] arraySizes)333     synchronized long nElementCreate2(long[] elements, String[] names, int[] arraySizes) {
334         validate();
335         return rsnElementCreate2(mContext, elements, names, arraySizes);
336     }
rsnElementGetNativeData(long con, long id, int[] elementData)337     native void rsnElementGetNativeData(long con, long id, int[] elementData);
nElementGetNativeData(long id, int[] elementData)338     synchronized void nElementGetNativeData(long id, int[] elementData) {
339         validate();
340         rsnElementGetNativeData(mContext, id, elementData);
341     }
rsnElementGetSubElements(long con, long id, long[] IDs, String[] names, int[] arraySizes)342     native void rsnElementGetSubElements(long con, long id,
343                                          long[] IDs, String[] names, int[] arraySizes);
nElementGetSubElements(long id, long[] IDs, String[] names, int[] arraySizes)344     synchronized void nElementGetSubElements(long id, long[] IDs, String[] names, int[] arraySizes) {
345         validate();
346         rsnElementGetSubElements(mContext, id, IDs, names, arraySizes);
347     }
348 
rsnTypeCreate(long con, long eid, int x, int y, int z, boolean mips, boolean faces, int yuv)349     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)350     synchronized long nTypeCreate(long eid, int x, int y, int z, boolean mips, boolean faces, int yuv) {
351         validate();
352         return rsnTypeCreate(mContext, eid, x, y, z, mips, faces, yuv);
353     }
rsnTypeGetNativeData(long con, long id, long[] typeData)354     native void rsnTypeGetNativeData(long con, long id, long[] typeData);
nTypeGetNativeData(long id, long[] typeData)355     synchronized void nTypeGetNativeData(long id, long[] typeData) {
356         validate();
357         rsnTypeGetNativeData(mContext, id, typeData);
358     }
359 
rsnAllocationCreateTyped(long con, long type, int mip, int usage, long pointer)360     native long rsnAllocationCreateTyped(long con, long type, int mip, int usage, long pointer);
nAllocationCreateTyped(long type, int mip, int usage, long pointer)361     synchronized long nAllocationCreateTyped(long type, int mip, int usage, long pointer) {
362         validate();
363         return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer);
364     }
rsnAllocationCreateFromBitmap(long con, long type, int mip, Bitmap bmp, int usage)365     native long rsnAllocationCreateFromBitmap(long con, long type, int mip, Bitmap bmp, int usage);
nAllocationCreateFromBitmap(long type, int mip, Bitmap bmp, int usage)366     synchronized long nAllocationCreateFromBitmap(long type, int mip, Bitmap bmp, int usage) {
367         validate();
368         return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
369     }
370 
rsnAllocationCreateBitmapBackedAllocation(long con, long type, int mip, Bitmap bmp, int usage)371     native long rsnAllocationCreateBitmapBackedAllocation(long con, long type, int mip, Bitmap bmp, int usage);
nAllocationCreateBitmapBackedAllocation(long type, int mip, Bitmap bmp, int usage)372     synchronized long nAllocationCreateBitmapBackedAllocation(long type, int mip, Bitmap bmp, int usage) {
373         validate();
374         return rsnAllocationCreateBitmapBackedAllocation(mContext, type, mip, bmp, usage);
375     }
376 
rsnAllocationCubeCreateFromBitmap(long con, long type, int mip, Bitmap bmp, int usage)377     native long rsnAllocationCubeCreateFromBitmap(long con, long type, int mip, Bitmap bmp, int usage);
nAllocationCubeCreateFromBitmap(long type, int mip, Bitmap bmp, int usage)378     synchronized long nAllocationCubeCreateFromBitmap(long type, int mip, Bitmap bmp, int usage) {
379         validate();
380         return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
381     }
rsnAllocationCreateBitmapRef(long con, long type, Bitmap bmp)382     native long  rsnAllocationCreateBitmapRef(long con, long type, Bitmap bmp);
nAllocationCreateBitmapRef(long type, Bitmap bmp)383     synchronized long nAllocationCreateBitmapRef(long type, Bitmap bmp) {
384         validate();
385         return rsnAllocationCreateBitmapRef(mContext, type, bmp);
386     }
rsnAllocationCreateFromAssetStream(long con, int mips, int assetStream, int usage)387     native long  rsnAllocationCreateFromAssetStream(long con, int mips, int assetStream, int usage);
nAllocationCreateFromAssetStream(int mips, int assetStream, int usage)388     synchronized long nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
389         validate();
390         return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
391     }
392 
rsnAllocationCopyToBitmap(long con, long alloc, Bitmap bmp)393     native void  rsnAllocationCopyToBitmap(long con, long alloc, Bitmap bmp);
nAllocationCopyToBitmap(long alloc, Bitmap bmp)394     synchronized void nAllocationCopyToBitmap(long alloc, Bitmap bmp) {
395         validate();
396         rsnAllocationCopyToBitmap(mContext, alloc, bmp);
397     }
398 
399 
rsnAllocationSyncAll(long con, long alloc, int src)400     native void rsnAllocationSyncAll(long con, long alloc, int src);
nAllocationSyncAll(long alloc, int src)401     synchronized void nAllocationSyncAll(long alloc, int src) {
402         validate();
403         rsnAllocationSyncAll(mContext, alloc, src);
404     }
rsnAllocationGetSurface(long con, long alloc)405     native Surface rsnAllocationGetSurface(long con, long alloc);
nAllocationGetSurface(long alloc)406     synchronized Surface nAllocationGetSurface(long alloc) {
407         validate();
408         return rsnAllocationGetSurface(mContext, alloc);
409     }
rsnAllocationSetSurface(long con, long alloc, Surface sur)410     native void rsnAllocationSetSurface(long con, long alloc, Surface sur);
nAllocationSetSurface(long alloc, Surface sur)411     synchronized void nAllocationSetSurface(long alloc, Surface sur) {
412         validate();
413         rsnAllocationSetSurface(mContext, alloc, sur);
414     }
rsnAllocationIoSend(long con, long alloc)415     native void rsnAllocationIoSend(long con, long alloc);
nAllocationIoSend(long alloc)416     synchronized void nAllocationIoSend(long alloc) {
417         validate();
418         rsnAllocationIoSend(mContext, alloc);
419     }
rsnAllocationIoReceive(long con, long alloc)420     native void rsnAllocationIoReceive(long con, long alloc);
nAllocationIoReceive(long alloc)421     synchronized void nAllocationIoReceive(long alloc) {
422         validate();
423         rsnAllocationIoReceive(mContext, alloc);
424     }
425 
426 
rsnAllocationGenerateMipmaps(long con, long alloc)427     native void rsnAllocationGenerateMipmaps(long con, long alloc);
nAllocationGenerateMipmaps(long alloc)428     synchronized void nAllocationGenerateMipmaps(long alloc) {
429         validate();
430         rsnAllocationGenerateMipmaps(mContext, alloc);
431     }
rsnAllocationCopyFromBitmap(long con, long alloc, Bitmap bmp)432     native void  rsnAllocationCopyFromBitmap(long con, long alloc, Bitmap bmp);
nAllocationCopyFromBitmap(long alloc, Bitmap bmp)433     synchronized void nAllocationCopyFromBitmap(long alloc, Bitmap bmp) {
434         validate();
435         rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
436     }
437 
438 
rsnAllocationData1D(long con, long id, int off, int mip, int count, Object d, int sizeBytes, int dt)439     native void rsnAllocationData1D(long con, long id, int off, int mip, int count, Object d, int sizeBytes, int dt);
nAllocationData1D(long id, int off, int mip, int count, Object d, int sizeBytes, Element.DataType dt)440     synchronized void nAllocationData1D(long id, int off, int mip, int count, Object d, int sizeBytes, Element.DataType dt) {
441         validate();
442         rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID);
443     }
444 
rsnAllocationElementData1D(long con,long id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes)445     native void rsnAllocationElementData1D(long con,long id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes);
nAllocationElementData1D(long id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes)446     synchronized void nAllocationElementData1D(long id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes) {
447         validate();
448         rsnAllocationElementData1D(mContext, id, xoff, mip, compIdx, d, sizeBytes);
449     }
450 
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)451     native void rsnAllocationData2D(long con,
452                                     long dstAlloc, int dstXoff, int dstYoff,
453                                     int dstMip, int dstFace,
454                                     int width, int height,
455                                     long srcAlloc, int srcXoff, int srcYoff,
456                                     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)457     synchronized void nAllocationData2D(long dstAlloc, int dstXoff, int dstYoff,
458                                         int dstMip, int dstFace,
459                                         int width, int height,
460                                         long srcAlloc, int srcXoff, int srcYoff,
461                                         int srcMip, int srcFace) {
462         validate();
463         rsnAllocationData2D(mContext,
464                             dstAlloc, dstXoff, dstYoff,
465                             dstMip, dstFace,
466                             width, height,
467                             srcAlloc, srcXoff, srcYoff,
468                             srcMip, srcFace);
469     }
470 
rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face, int w, int h, Object d, int sizeBytes, int dt)471     native void rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face,
472                                     int w, int h, Object d, int sizeBytes, int dt);
nAllocationData2D(long id, int xoff, int yoff, int mip, int face, int w, int h, Object d, int sizeBytes, Element.DataType dt)473     synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face,
474                                         int w, int h, Object d, int sizeBytes, Element.DataType dt) {
475         validate();
476         rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID);
477     }
478 
rsnAllocationData2D(long con, long id, int xoff, int yoff, int mip, int face, Bitmap b)479     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)480     synchronized void nAllocationData2D(long id, int xoff, int yoff, int mip, int face, Bitmap b) {
481         validate();
482         rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
483     }
484 
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)485     native void rsnAllocationData3D(long con,
486                                     long dstAlloc, int dstXoff, int dstYoff, int dstZoff,
487                                     int dstMip,
488                                     int width, int height, int depth,
489                                     long srcAlloc, int srcXoff, int srcYoff, int srcZoff,
490                                     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)491     synchronized void nAllocationData3D(long dstAlloc, int dstXoff, int dstYoff, int dstZoff,
492                                         int dstMip,
493                                         int width, int height, int depth,
494                                         long srcAlloc, int srcXoff, int srcYoff, int srcZoff,
495                                         int srcMip) {
496         validate();
497         rsnAllocationData3D(mContext,
498                             dstAlloc, dstXoff, dstYoff, dstZoff,
499                             dstMip, width, height, depth,
500                             srcAlloc, srcXoff, srcYoff, srcZoff, srcMip);
501     }
502 
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)503     native void rsnAllocationData3D(long con, long id, int xoff, int yoff, int zoff, int mip,
504                                     int w, int h, int depth, Object d, int sizeBytes, int dt);
nAllocationData3D(long id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt)505     synchronized void nAllocationData3D(long id, int xoff, int yoff, int zoff, int mip,
506                                         int w, int h, int depth, Object d, int sizeBytes, Element.DataType dt) {
507         validate();
508         rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes, dt.mID);
509     }
510 
rsnAllocationRead(long con, long id, Object d, int dt)511     native void rsnAllocationRead(long con, long id, Object d, int dt);
nAllocationRead(long id, Object d, Element.DataType dt)512     synchronized void nAllocationRead(long id, Object d, Element.DataType dt) {
513         validate();
514         rsnAllocationRead(mContext, id, d, dt.mID);
515     }
516 
rsnAllocationRead1D(long con, long id, int off, int mip, int count, Object d, int sizeBytes, int dt)517     native void rsnAllocationRead1D(long con, long id, int off, int mip, int count, Object d,
518                                     int sizeBytes, int dt);
nAllocationRead1D(long id, int off, int mip, int count, Object d, int sizeBytes, Element.DataType dt)519     synchronized void nAllocationRead1D(long id, int off, int mip, int count, Object d,
520                                         int sizeBytes, Element.DataType dt) {
521         validate();
522         rsnAllocationRead1D(mContext, id, off, mip, count, d, sizeBytes, dt.mID);
523     }
524 
rsnAllocationRead2D(long con, long id, int xoff, int yoff, int mip, int face, int w, int h, Object d, int sizeBytes, int dt)525     native void rsnAllocationRead2D(long con, long id, int xoff, int yoff, int mip, int face,
526                                     int w, int h, Object d, int sizeBytes, int dt);
nAllocationRead2D(long id, int xoff, int yoff, int mip, int face, int w, int h, Object d, int sizeBytes, Element.DataType dt)527     synchronized void nAllocationRead2D(long id, int xoff, int yoff, int mip, int face,
528                                         int w, int h, Object d, int sizeBytes, Element.DataType dt) {
529         validate();
530         rsnAllocationRead2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes, dt.mID);
531     }
532 
rsnAllocationGetType(long con, long id)533     native long  rsnAllocationGetType(long con, long id);
nAllocationGetType(long id)534     synchronized long nAllocationGetType(long id) {
535         validate();
536         return rsnAllocationGetType(mContext, id);
537     }
538 
rsnAllocationResize1D(long con, long id, int dimX)539     native void rsnAllocationResize1D(long con, long id, int dimX);
nAllocationResize1D(long id, int dimX)540     synchronized void nAllocationResize1D(long id, int dimX) {
541         validate();
542         rsnAllocationResize1D(mContext, id, dimX);
543     }
544 
rsnFileA3DCreateFromAssetStream(long con, long assetStream)545     native long rsnFileA3DCreateFromAssetStream(long con, long assetStream);
nFileA3DCreateFromAssetStream(long assetStream)546     synchronized long nFileA3DCreateFromAssetStream(long assetStream) {
547         validate();
548         return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
549     }
rsnFileA3DCreateFromFile(long con, String path)550     native long rsnFileA3DCreateFromFile(long con, String path);
nFileA3DCreateFromFile(String path)551     synchronized long nFileA3DCreateFromFile(String path) {
552         validate();
553         return rsnFileA3DCreateFromFile(mContext, path);
554     }
rsnFileA3DCreateFromAsset(long con, AssetManager mgr, String path)555     native long rsnFileA3DCreateFromAsset(long con, AssetManager mgr, String path);
nFileA3DCreateFromAsset(AssetManager mgr, String path)556     synchronized long nFileA3DCreateFromAsset(AssetManager mgr, String path) {
557         validate();
558         return rsnFileA3DCreateFromAsset(mContext, mgr, path);
559     }
rsnFileA3DGetNumIndexEntries(long con, long fileA3D)560     native int  rsnFileA3DGetNumIndexEntries(long con, long fileA3D);
nFileA3DGetNumIndexEntries(long fileA3D)561     synchronized int nFileA3DGetNumIndexEntries(long fileA3D) {
562         validate();
563         return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
564     }
rsnFileA3DGetIndexEntries(long con, long fileA3D, int numEntries, int[] IDs, String[] names)565     native void rsnFileA3DGetIndexEntries(long con, long fileA3D, int numEntries, int[] IDs, String[] names);
nFileA3DGetIndexEntries(long fileA3D, int numEntries, int[] IDs, String[] names)566     synchronized void nFileA3DGetIndexEntries(long fileA3D, int numEntries, int[] IDs, String[] names) {
567         validate();
568         rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
569     }
rsnFileA3DGetEntryByIndex(long con, long fileA3D, int index)570     native long rsnFileA3DGetEntryByIndex(long con, long fileA3D, int index);
nFileA3DGetEntryByIndex(long fileA3D, int index)571     synchronized long nFileA3DGetEntryByIndex(long fileA3D, int index) {
572         validate();
573         return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
574     }
575 
rsnFontCreateFromFile(long con, String fileName, float size, int dpi)576     native long rsnFontCreateFromFile(long con, String fileName, float size, int dpi);
nFontCreateFromFile(String fileName, float size, int dpi)577     synchronized long nFontCreateFromFile(String fileName, float size, int dpi) {
578         validate();
579         return rsnFontCreateFromFile(mContext, fileName, size, dpi);
580     }
rsnFontCreateFromAssetStream(long con, String name, float size, int dpi, long assetStream)581     native long rsnFontCreateFromAssetStream(long con, String name, float size, int dpi, long assetStream);
nFontCreateFromAssetStream(String name, float size, int dpi, long assetStream)582     synchronized long nFontCreateFromAssetStream(String name, float size, int dpi, long assetStream) {
583         validate();
584         return rsnFontCreateFromAssetStream(mContext, name, size, dpi, assetStream);
585     }
rsnFontCreateFromAsset(long con, AssetManager mgr, String path, float size, int dpi)586     native long rsnFontCreateFromAsset(long con, AssetManager mgr, String path, float size, int dpi);
nFontCreateFromAsset(AssetManager mgr, String path, float size, int dpi)587     synchronized long nFontCreateFromAsset(AssetManager mgr, String path, float size, int dpi) {
588         validate();
589         return rsnFontCreateFromAsset(mContext, mgr, path, size, dpi);
590     }
591 
592 
rsnScriptBindAllocation(long con, long script, long alloc, int slot)593     native void rsnScriptBindAllocation(long con, long script, long alloc, int slot);
nScriptBindAllocation(long script, long alloc, int slot)594     synchronized void nScriptBindAllocation(long script, long alloc, int slot) {
595         validate();
596         rsnScriptBindAllocation(mContext, script, alloc, slot);
597     }
rsnScriptSetTimeZone(long con, long script, byte[] timeZone)598     native void rsnScriptSetTimeZone(long con, long script, byte[] timeZone);
nScriptSetTimeZone(long script, byte[] timeZone)599     synchronized void nScriptSetTimeZone(long script, byte[] timeZone) {
600         validate();
601         rsnScriptSetTimeZone(mContext, script, timeZone);
602     }
rsnScriptInvoke(long con, long id, int slot)603     native void rsnScriptInvoke(long con, long id, int slot);
nScriptInvoke(long id, int slot)604     synchronized void nScriptInvoke(long id, int slot) {
605         validate();
606         rsnScriptInvoke(mContext, id, slot);
607     }
rsnScriptForEach(long con, long id, int slot, long ain, long aout, byte[] params)608     native void rsnScriptForEach(long con, long id, int slot, long ain, long aout, byte[] params);
rsnScriptForEach(long con, long id, int slot, long ain, long aout)609     native void rsnScriptForEach(long con, long id, int slot, long ain, long aout);
rsnScriptForEachClipped(long con, long id, int slot, long ain, long aout, byte[] params, int xstart, int xend, int ystart, int yend, int zstart, int zend)610     native void rsnScriptForEachClipped(long con, long id, int slot, long ain, long aout, byte[] params,
611                                         int xstart, int xend, int ystart, int yend, int zstart, int zend);
rsnScriptForEachClipped(long con, long id, int slot, long ain, long aout, int xstart, int xend, int ystart, int yend, int zstart, int zend)612     native void rsnScriptForEachClipped(long con, long id, int slot, long ain, long aout,
613                                         int xstart, int xend, int ystart, int yend, int zstart, int zend);
nScriptForEach(long id, int slot, long ain, long aout, byte[] params)614     synchronized void nScriptForEach(long id, int slot, long ain, long aout, byte[] params) {
615         validate();
616         if (params == null) {
617             rsnScriptForEach(mContext, id, slot, ain, aout);
618         } else {
619             rsnScriptForEach(mContext, id, slot, ain, aout, params);
620         }
621     }
622 
nScriptForEachClipped(long id, int slot, long ain, long aout, byte[] params, int xstart, int xend, int ystart, int yend, int zstart, int zend)623     synchronized void nScriptForEachClipped(long id, int slot, long ain, long aout, byte[] params,
624                                             int xstart, int xend, int ystart, int yend, int zstart, int zend) {
625         validate();
626         if (params == null) {
627             rsnScriptForEachClipped(mContext, id, slot, ain, aout, xstart, xend, ystart, yend, zstart, zend);
628         } else {
629             rsnScriptForEachClipped(mContext, id, slot, ain, aout, params, xstart, xend, ystart, yend, zstart, zend);
630         }
631     }
632 
633     /**
634      * Multi-input code.
635      *
636      */
637 
638     // @hide
rsnScriptForEachMultiClipped(long con, long id, int slot, long[] ains, long aout, byte[] params, int xstart, int xend, int ystart, int yend, int zstart, int zend)639     native void rsnScriptForEachMultiClipped(long con, long id, int slot, long[] ains, long aout, byte[] params,
640                                              int xstart, int xend, int ystart, int yend, int zstart, int zend);
641     // @hide
rsnScriptForEachMultiClipped(long con, long id, int slot, long[] ains, long aout, int xstart, int xend, int ystart, int yend, int zstart, int zend)642     native void rsnScriptForEachMultiClipped(long con, long id, int slot, long[] ains, long aout,
643                                              int xstart, int xend, int ystart, int yend, int zstart, int zend);
644 
645     // @hide
nScriptForEachMultiClipped(long id, int slot, long[] ains, long aout, byte[] params, int xstart, int xend, int ystart, int yend, int zstart, int zend)646     synchronized void nScriptForEachMultiClipped(long id, int slot, long[] ains, long aout, byte[] params,
647                                                  int xstart, int xend, int ystart, int yend, int zstart, int zend) {
648         validate();
649         if (params == null) {
650             rsnScriptForEachMultiClipped(mContext, id, slot, ains, aout, xstart, xend, ystart, yend, zstart, zend);
651         } else {
652             rsnScriptForEachMultiClipped(mContext, id, slot, ains, aout, params, xstart, xend, ystart, yend, zstart, zend);
653         }
654     }
655 
rsnScriptInvokeV(long con, long id, int slot, byte[] params)656     native void rsnScriptInvokeV(long con, long id, int slot, byte[] params);
nScriptInvokeV(long id, int slot, byte[] params)657     synchronized void nScriptInvokeV(long id, int slot, byte[] params) {
658         validate();
659         rsnScriptInvokeV(mContext, id, slot, params);
660     }
661 
rsnScriptSetVarI(long con, long id, int slot, int val)662     native void rsnScriptSetVarI(long con, long id, int slot, int val);
nScriptSetVarI(long id, int slot, int val)663     synchronized void nScriptSetVarI(long id, int slot, int val) {
664         validate();
665         rsnScriptSetVarI(mContext, id, slot, val);
666     }
rsnScriptGetVarI(long con, long id, int slot)667     native int rsnScriptGetVarI(long con, long id, int slot);
nScriptGetVarI(long id, int slot)668     synchronized int nScriptGetVarI(long id, int slot) {
669         validate();
670         return rsnScriptGetVarI(mContext, id, slot);
671     }
672 
rsnScriptSetVarJ(long con, long id, int slot, long val)673     native void rsnScriptSetVarJ(long con, long id, int slot, long val);
nScriptSetVarJ(long id, int slot, long val)674     synchronized void nScriptSetVarJ(long id, int slot, long val) {
675         validate();
676         rsnScriptSetVarJ(mContext, id, slot, val);
677     }
rsnScriptGetVarJ(long con, long id, int slot)678     native long rsnScriptGetVarJ(long con, long id, int slot);
nScriptGetVarJ(long id, int slot)679     synchronized long nScriptGetVarJ(long id, int slot) {
680         validate();
681         return rsnScriptGetVarJ(mContext, id, slot);
682     }
683 
rsnScriptSetVarF(long con, long id, int slot, float val)684     native void rsnScriptSetVarF(long con, long id, int slot, float val);
nScriptSetVarF(long id, int slot, float val)685     synchronized void nScriptSetVarF(long id, int slot, float val) {
686         validate();
687         rsnScriptSetVarF(mContext, id, slot, val);
688     }
rsnScriptGetVarF(long con, long id, int slot)689     native float rsnScriptGetVarF(long con, long id, int slot);
nScriptGetVarF(long id, int slot)690     synchronized float nScriptGetVarF(long id, int slot) {
691         validate();
692         return rsnScriptGetVarF(mContext, id, slot);
693     }
rsnScriptSetVarD(long con, long id, int slot, double val)694     native void rsnScriptSetVarD(long con, long id, int slot, double val);
nScriptSetVarD(long id, int slot, double val)695     synchronized void nScriptSetVarD(long id, int slot, double val) {
696         validate();
697         rsnScriptSetVarD(mContext, id, slot, val);
698     }
rsnScriptGetVarD(long con, long id, int slot)699     native double rsnScriptGetVarD(long con, long id, int slot);
nScriptGetVarD(long id, int slot)700     synchronized double nScriptGetVarD(long id, int slot) {
701         validate();
702         return rsnScriptGetVarD(mContext, id, slot);
703     }
rsnScriptSetVarV(long con, long id, int slot, byte[] val)704     native void rsnScriptSetVarV(long con, long id, int slot, byte[] val);
nScriptSetVarV(long id, int slot, byte[] val)705     synchronized void nScriptSetVarV(long id, int slot, byte[] val) {
706         validate();
707         rsnScriptSetVarV(mContext, id, slot, val);
708     }
rsnScriptGetVarV(long con, long id, int slot, byte[] val)709     native void rsnScriptGetVarV(long con, long id, int slot, byte[] val);
nScriptGetVarV(long id, int slot, byte[] val)710     synchronized void nScriptGetVarV(long id, int slot, byte[] val) {
711         validate();
712         rsnScriptGetVarV(mContext, id, slot, val);
713     }
rsnScriptSetVarVE(long con, long id, int slot, byte[] val, long e, int[] dims)714     native void rsnScriptSetVarVE(long con, long id, int slot, byte[] val,
715                                   long e, int[] dims);
nScriptSetVarVE(long id, int slot, byte[] val, long e, int[] dims)716     synchronized void nScriptSetVarVE(long id, int slot, byte[] val,
717                                       long e, int[] dims) {
718         validate();
719         rsnScriptSetVarVE(mContext, id, slot, val, e, dims);
720     }
rsnScriptSetVarObj(long con, long id, int slot, long val)721     native void rsnScriptSetVarObj(long con, long id, int slot, long val);
nScriptSetVarObj(long id, int slot, long val)722     synchronized void nScriptSetVarObj(long id, int slot, long val) {
723         validate();
724         rsnScriptSetVarObj(mContext, id, slot, val);
725     }
726 
rsnScriptCCreate(long con, String resName, String cacheDir, byte[] script, int length)727     native long rsnScriptCCreate(long con, String resName, String cacheDir,
728                                  byte[] script, int length);
nScriptCCreate(String resName, String cacheDir, byte[] script, int length)729     synchronized long nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
730         validate();
731         return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
732     }
733 
rsnScriptIntrinsicCreate(long con, int id, long eid)734     native long rsnScriptIntrinsicCreate(long con, int id, long eid);
nScriptIntrinsicCreate(int id, long eid)735     synchronized long nScriptIntrinsicCreate(int id, long eid) {
736         validate();
737         return rsnScriptIntrinsicCreate(mContext, id, eid);
738     }
739 
rsnScriptKernelIDCreate(long con, long sid, int slot, int sig)740     native long  rsnScriptKernelIDCreate(long con, long sid, int slot, int sig);
nScriptKernelIDCreate(long sid, int slot, int sig)741     synchronized long nScriptKernelIDCreate(long sid, int slot, int sig) {
742         validate();
743         return rsnScriptKernelIDCreate(mContext, sid, slot, sig);
744     }
745 
rsnScriptFieldIDCreate(long con, long sid, int slot)746     native long  rsnScriptFieldIDCreate(long con, long sid, int slot);
nScriptFieldIDCreate(long sid, int slot)747     synchronized long nScriptFieldIDCreate(long sid, int slot) {
748         validate();
749         return rsnScriptFieldIDCreate(mContext, sid, slot);
750     }
751 
rsnScriptGroupCreate(long con, long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types)752     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)753     synchronized long nScriptGroupCreate(long[] kernels, long[] src, long[] dstk, long[] dstf, long[] types) {
754         validate();
755         return rsnScriptGroupCreate(mContext, kernels, src, dstk, dstf, types);
756     }
757 
rsnScriptGroupSetInput(long con, long group, long kernel, long alloc)758     native void rsnScriptGroupSetInput(long con, long group, long kernel, long alloc);
nScriptGroupSetInput(long group, long kernel, long alloc)759     synchronized void nScriptGroupSetInput(long group, long kernel, long alloc) {
760         validate();
761         rsnScriptGroupSetInput(mContext, group, kernel, alloc);
762     }
763 
rsnScriptGroupSetOutput(long con, long group, long kernel, long alloc)764     native void rsnScriptGroupSetOutput(long con, long group, long kernel, long alloc);
nScriptGroupSetOutput(long group, long kernel, long alloc)765     synchronized void nScriptGroupSetOutput(long group, long kernel, long alloc) {
766         validate();
767         rsnScriptGroupSetOutput(mContext, group, kernel, alloc);
768     }
769 
rsnScriptGroupExecute(long con, long group)770     native void rsnScriptGroupExecute(long con, long group);
nScriptGroupExecute(long group)771     synchronized void nScriptGroupExecute(long group) {
772         validate();
773         rsnScriptGroupExecute(mContext, group);
774     }
775 
rsnSamplerCreate(long con, int magFilter, int minFilter, int wrapS, int wrapT, int wrapR, float aniso)776     native long  rsnSamplerCreate(long con, int magFilter, int minFilter,
777                                  int wrapS, int wrapT, int wrapR, float aniso);
nSamplerCreate(int magFilter, int minFilter, int wrapS, int wrapT, int wrapR, float aniso)778     synchronized long nSamplerCreate(int magFilter, int minFilter,
779                                  int wrapS, int wrapT, int wrapR, float aniso) {
780         validate();
781         return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
782     }
783 
rsnProgramStoreCreate(long con, boolean r, boolean g, boolean b, boolean a, boolean depthMask, boolean dither, int srcMode, int dstMode, int depthFunc)784     native long rsnProgramStoreCreate(long con, boolean r, boolean g, boolean b, boolean a,
785                                       boolean depthMask, boolean dither,
786                                       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)787     synchronized long nProgramStoreCreate(boolean r, boolean g, boolean b, boolean a,
788                                          boolean depthMask, boolean dither,
789                                          int srcMode, int dstMode, int depthFunc) {
790         validate();
791         return rsnProgramStoreCreate(mContext, r, g, b, a, depthMask, dither, srcMode,
792                                      dstMode, depthFunc);
793     }
794 
rsnProgramRasterCreate(long con, boolean pointSprite, int cullMode)795     native long rsnProgramRasterCreate(long con, boolean pointSprite, int cullMode);
nProgramRasterCreate(boolean pointSprite, int cullMode)796     synchronized long nProgramRasterCreate(boolean pointSprite, int cullMode) {
797         validate();
798         return rsnProgramRasterCreate(mContext, pointSprite, cullMode);
799     }
800 
rsnProgramBindConstants(long con, long pv, int slot, long mID)801     native void rsnProgramBindConstants(long con, long pv, int slot, long mID);
nProgramBindConstants(long pv, int slot, long mID)802     synchronized void nProgramBindConstants(long pv, int slot, long mID) {
803         validate();
804         rsnProgramBindConstants(mContext, pv, slot, mID);
805     }
rsnProgramBindTexture(long con, long vpf, int slot, long a)806     native void rsnProgramBindTexture(long con, long vpf, int slot, long a);
nProgramBindTexture(long vpf, int slot, long a)807     synchronized void nProgramBindTexture(long vpf, int slot, long a) {
808         validate();
809         rsnProgramBindTexture(mContext, vpf, slot, a);
810     }
rsnProgramBindSampler(long con, long vpf, int slot, long s)811     native void rsnProgramBindSampler(long con, long vpf, int slot, long s);
nProgramBindSampler(long vpf, int slot, long s)812     synchronized void nProgramBindSampler(long vpf, int slot, long s) {
813         validate();
814         rsnProgramBindSampler(mContext, vpf, slot, s);
815     }
rsnProgramFragmentCreate(long con, String shader, String[] texNames, long[] params)816     native long rsnProgramFragmentCreate(long con, String shader, String[] texNames, long[] params);
nProgramFragmentCreate(String shader, String[] texNames, long[] params)817     synchronized long nProgramFragmentCreate(String shader, String[] texNames, long[] params) {
818         validate();
819         return rsnProgramFragmentCreate(mContext, shader, texNames, params);
820     }
rsnProgramVertexCreate(long con, String shader, String[] texNames, long[] params)821     native long rsnProgramVertexCreate(long con, String shader, String[] texNames, long[] params);
nProgramVertexCreate(String shader, String[] texNames, long[] params)822     synchronized long nProgramVertexCreate(String shader, String[] texNames, long[] params) {
823         validate();
824         return rsnProgramVertexCreate(mContext, shader, texNames, params);
825     }
826 
rsnMeshCreate(long con, long[] vtx, long[] idx, int[] prim)827     native long rsnMeshCreate(long con, long[] vtx, long[] idx, int[] prim);
nMeshCreate(long[] vtx, long[] idx, int[] prim)828     synchronized long nMeshCreate(long[] vtx, long[] idx, int[] prim) {
829         validate();
830         return rsnMeshCreate(mContext, vtx, idx, prim);
831     }
rsnMeshGetVertexBufferCount(long con, long id)832     native int  rsnMeshGetVertexBufferCount(long con, long id);
nMeshGetVertexBufferCount(long id)833     synchronized int nMeshGetVertexBufferCount(long id) {
834         validate();
835         return rsnMeshGetVertexBufferCount(mContext, id);
836     }
rsnMeshGetIndexCount(long con, long id)837     native int  rsnMeshGetIndexCount(long con, long id);
nMeshGetIndexCount(long id)838     synchronized int nMeshGetIndexCount(long id) {
839         validate();
840         return rsnMeshGetIndexCount(mContext, id);
841     }
rsnMeshGetVertices(long con, long id, long[] vtxIds, int vtxIdCount)842     native void rsnMeshGetVertices(long con, long id, long[] vtxIds, int vtxIdCount);
nMeshGetVertices(long id, long[] vtxIds, int vtxIdCount)843     synchronized void nMeshGetVertices(long id, long[] vtxIds, int vtxIdCount) {
844         validate();
845         rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
846     }
rsnMeshGetIndices(long con, long id, long[] idxIds, int[] primitives, int vtxIdCount)847     native void rsnMeshGetIndices(long con, long id, long[] idxIds, int[] primitives, int vtxIdCount);
nMeshGetIndices(long id, long[] idxIds, int[] primitives, int vtxIdCount)848     synchronized void nMeshGetIndices(long id, long[] idxIds, int[] primitives, int vtxIdCount) {
849         validate();
850         rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
851     }
852 
rsnPathCreate(long con, int prim, boolean isStatic, long vtx, long loop, float q)853     native long rsnPathCreate(long con, int prim, boolean isStatic, long vtx, long loop, float q);
nPathCreate(int prim, boolean isStatic, long vtx, long loop, float q)854     synchronized long nPathCreate(int prim, boolean isStatic, long vtx, long loop, float q) {
855         validate();
856         return rsnPathCreate(mContext, prim, isStatic, vtx, loop, q);
857     }
858 
859     long     mDev;
860     long     mContext;
861     @SuppressWarnings({"FieldCanBeLocal"})
862     MessageThread mMessageThread;
863 
864     Element mElement_U8;
865     Element mElement_I8;
866     Element mElement_U16;
867     Element mElement_I16;
868     Element mElement_U32;
869     Element mElement_I32;
870     Element mElement_U64;
871     Element mElement_I64;
872     Element mElement_F32;
873     Element mElement_F64;
874     Element mElement_BOOLEAN;
875 
876     Element mElement_ELEMENT;
877     Element mElement_TYPE;
878     Element mElement_ALLOCATION;
879     Element mElement_SAMPLER;
880     Element mElement_SCRIPT;
881     Element mElement_MESH;
882     Element mElement_PROGRAM_FRAGMENT;
883     Element mElement_PROGRAM_VERTEX;
884     Element mElement_PROGRAM_RASTER;
885     Element mElement_PROGRAM_STORE;
886     Element mElement_FONT;
887 
888     Element mElement_A_8;
889     Element mElement_RGB_565;
890     Element mElement_RGB_888;
891     Element mElement_RGBA_5551;
892     Element mElement_RGBA_4444;
893     Element mElement_RGBA_8888;
894 
895     Element mElement_FLOAT_2;
896     Element mElement_FLOAT_3;
897     Element mElement_FLOAT_4;
898 
899     Element mElement_DOUBLE_2;
900     Element mElement_DOUBLE_3;
901     Element mElement_DOUBLE_4;
902 
903     Element mElement_UCHAR_2;
904     Element mElement_UCHAR_3;
905     Element mElement_UCHAR_4;
906 
907     Element mElement_CHAR_2;
908     Element mElement_CHAR_3;
909     Element mElement_CHAR_4;
910 
911     Element mElement_USHORT_2;
912     Element mElement_USHORT_3;
913     Element mElement_USHORT_4;
914 
915     Element mElement_SHORT_2;
916     Element mElement_SHORT_3;
917     Element mElement_SHORT_4;
918 
919     Element mElement_UINT_2;
920     Element mElement_UINT_3;
921     Element mElement_UINT_4;
922 
923     Element mElement_INT_2;
924     Element mElement_INT_3;
925     Element mElement_INT_4;
926 
927     Element mElement_ULONG_2;
928     Element mElement_ULONG_3;
929     Element mElement_ULONG_4;
930 
931     Element mElement_LONG_2;
932     Element mElement_LONG_3;
933     Element mElement_LONG_4;
934 
935     Element mElement_YUV;
936 
937     Element mElement_MATRIX_4X4;
938     Element mElement_MATRIX_3X3;
939     Element mElement_MATRIX_2X2;
940 
941     Sampler mSampler_CLAMP_NEAREST;
942     Sampler mSampler_CLAMP_LINEAR;
943     Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
944     Sampler mSampler_WRAP_NEAREST;
945     Sampler mSampler_WRAP_LINEAR;
946     Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
947     Sampler mSampler_MIRRORED_REPEAT_NEAREST;
948     Sampler mSampler_MIRRORED_REPEAT_LINEAR;
949     Sampler mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
950 
951     ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
952     ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
953     ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
954     ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
955 
956     ProgramRaster mProgramRaster_CULL_BACK;
957     ProgramRaster mProgramRaster_CULL_FRONT;
958     ProgramRaster mProgramRaster_CULL_NONE;
959 
960     ///////////////////////////////////////////////////////////////////////////////////
961     //
962 
963     /**
964      * The base class from which an application should derive in order
965      * to receive RS messages from scripts. When a script calls {@code
966      * rsSendToClient}, the data fields will be filled, and the run
967      * method will be called on a separate thread.  This will occur
968      * some time after {@code rsSendToClient} completes in the script,
969      * as {@code rsSendToClient} is asynchronous. Message handlers are
970      * not guaranteed to have completed when {@link
971      * android.renderscript.RenderScript#finish} returns.
972      *
973      */
974     public static class RSMessageHandler implements Runnable {
975         protected int[] mData;
976         protected int mID;
977         protected int mLength;
run()978         public void run() {
979         }
980     }
981     /**
982      * If an application is expecting messages, it should set this
983      * field to an instance of {@link RSMessageHandler}.  This
984      * instance will receive all the user messages sent from {@code
985      * sendToClient} by scripts from this context.
986      *
987      */
988     RSMessageHandler mMessageCallback = null;
989 
setMessageHandler(RSMessageHandler msg)990     public void setMessageHandler(RSMessageHandler msg) {
991         mMessageCallback = msg;
992     }
getMessageHandler()993     public RSMessageHandler getMessageHandler() {
994         return mMessageCallback;
995     }
996 
997     /**
998      * Place a message into the message queue to be sent back to the message
999      * handler once all previous commands have been executed.
1000      *
1001      * @param id
1002      * @param data
1003      */
sendMessage(int id, int[] data)1004     public void sendMessage(int id, int[] data) {
1005         nContextSendMessage(id, data);
1006     }
1007 
1008     /**
1009      * The runtime error handler base class.  An application should derive from this class
1010      * if it wishes to install an error handler.  When errors occur at runtime,
1011      * the fields in this class will be filled, and the run method will be called.
1012      *
1013      */
1014     public static class RSErrorHandler implements Runnable {
1015         protected String mErrorMessage;
1016         protected int mErrorNum;
run()1017         public void run() {
1018         }
1019     }
1020 
1021     /**
1022      * Application Error handler.  All runtime errors will be dispatched to the
1023      * instance of RSAsyncError set here.  If this field is null a
1024      * {@link RSRuntimeException} will instead be thrown with details about the error.
1025      * This will cause program termaination.
1026      *
1027      */
1028     RSErrorHandler mErrorCallback = null;
1029 
setErrorHandler(RSErrorHandler msg)1030     public void setErrorHandler(RSErrorHandler msg) {
1031         mErrorCallback = msg;
1032     }
getErrorHandler()1033     public RSErrorHandler getErrorHandler() {
1034         return mErrorCallback;
1035     }
1036 
1037     /**
1038      * RenderScript worker thread priority enumeration.  The default value is
1039      * NORMAL.  Applications wishing to do background processing should set
1040      * their priority to LOW to avoid starving forground processes.
1041      */
1042     public enum Priority {
1043         LOW (Process.THREAD_PRIORITY_BACKGROUND + (5 * Process.THREAD_PRIORITY_LESS_FAVORABLE)),
1044         NORMAL (Process.THREAD_PRIORITY_DISPLAY);
1045 
1046         int mID;
Priority(int id)1047         Priority(int id) {
1048             mID = id;
1049         }
1050     }
1051 
validateObject(BaseObj o)1052     void validateObject(BaseObj o) {
1053         if (o != null) {
1054             if (o.mRS != this) {
1055                 throw new RSIllegalArgumentException("Attempting to use an object across contexts.");
1056             }
1057         }
1058     }
1059 
validate()1060     void validate() {
1061         if (mContext == 0) {
1062             throw new RSInvalidStateException("Calling RS with no Context active.");
1063         }
1064     }
1065 
1066 
1067     /**
1068      * Change the priority of the worker threads for this context.
1069      *
1070      * @param p New priority to be set.
1071      */
setPriority(Priority p)1072     public void setPriority(Priority p) {
1073         validate();
1074         nContextSetPriority(p.mID);
1075     }
1076 
1077     static class MessageThread extends Thread {
1078         RenderScript mRS;
1079         boolean mRun = true;
1080         int[] mAuxData = new int[2];
1081 
1082         static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
1083         static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
1084         static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
1085         static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
1086         static final int RS_MESSAGE_TO_CLIENT_USER = 4;
1087         static final int RS_MESSAGE_TO_CLIENT_NEW_BUFFER = 5;
1088 
1089         static final int RS_ERROR_FATAL_DEBUG = 0x0800;
1090         static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
1091 
MessageThread(RenderScript rs)1092         MessageThread(RenderScript rs) {
1093             super("RSMessageThread");
1094             mRS = rs;
1095 
1096         }
1097 
run()1098         public void run() {
1099             // This function is a temporary solution.  The final solution will
1100             // used typed allocations where the message id is the type indicator.
1101             int[] rbuf = new int[16];
1102             mRS.nContextInitToClient(mRS.mContext);
1103             while(mRun) {
1104                 rbuf[0] = 0;
1105                 int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
1106                 int size = mAuxData[1];
1107                 int subID = mAuxData[0];
1108 
1109                 if (msg == RS_MESSAGE_TO_CLIENT_USER) {
1110                     if ((size>>2) >= rbuf.length) {
1111                         rbuf = new int[(size + 3) >> 2];
1112                     }
1113                     if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
1114                         RS_MESSAGE_TO_CLIENT_USER) {
1115                         throw new RSDriverException("Error processing message from RenderScript.");
1116                     }
1117 
1118                     if(mRS.mMessageCallback != null) {
1119                         mRS.mMessageCallback.mData = rbuf;
1120                         mRS.mMessageCallback.mID = subID;
1121                         mRS.mMessageCallback.mLength = size;
1122                         mRS.mMessageCallback.run();
1123                     } else {
1124                         throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
1125                     }
1126                     continue;
1127                 }
1128 
1129                 if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
1130                     String e = mRS.nContextGetErrorMessage(mRS.mContext);
1131 
1132                     // Throw RSRuntimeException under the following conditions:
1133                     //
1134                     // 1) It is an unknown fatal error.
1135                     // 2) It is a debug fatal error, and we are not in a
1136                     //    debug context.
1137                     // 3) It is a debug fatal error, and we do not have an
1138                     //    error callback.
1139                     if (subID >= RS_ERROR_FATAL_UNKNOWN ||
1140                         (subID >= RS_ERROR_FATAL_DEBUG &&
1141                          (mRS.mContextType != ContextType.DEBUG ||
1142                           mRS.mErrorCallback == null))) {
1143                         throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
1144                     }
1145 
1146                     if(mRS.mErrorCallback != null) {
1147                         mRS.mErrorCallback.mErrorMessage = e;
1148                         mRS.mErrorCallback.mErrorNum = subID;
1149                         mRS.mErrorCallback.run();
1150                     } else {
1151                         android.util.Log.e(LOG_TAG, "non fatal RS error, " + e);
1152                         // Do not throw here. In these cases, we do not have
1153                         // a fatal error.
1154                     }
1155                     continue;
1156                 }
1157 
1158                 if (msg == RS_MESSAGE_TO_CLIENT_NEW_BUFFER) {
1159                     if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
1160                         RS_MESSAGE_TO_CLIENT_NEW_BUFFER) {
1161                         throw new RSDriverException("Error processing message from RenderScript.");
1162                     }
1163                     long bufferID = ((long)rbuf[1] << 32L) + ((long)rbuf[0] & 0xffffffffL);
1164                     Allocation.sendBufferNotification(bufferID);
1165                     continue;
1166                 }
1167 
1168                 // 2: teardown.
1169                 // But we want to avoid starving other threads during
1170                 // teardown by yielding until the next line in the destructor
1171                 // can execute to set mRun = false
1172                 try {
1173                     sleep(1, 0);
1174                 } catch(InterruptedException e) {
1175                 }
1176             }
1177             //Log.d(LOG_TAG, "MessageThread exiting.");
1178         }
1179     }
1180 
RenderScript(Context ctx)1181     RenderScript(Context ctx) {
1182         mContextType = ContextType.NORMAL;
1183         if (ctx != null) {
1184             mApplicationContext = ctx.getApplicationContext();
1185         }
1186         mRWLock = new ReentrantReadWriteLock();
1187         try {
1188             registerNativeAllocation.invoke(sRuntime, 4 * 1024 * 1024); // 4MB for GC sake
1189         } catch (Exception e) {
1190             Log.e(RenderScript.LOG_TAG, "Couldn't invoke registerNativeAllocation:" + e);
1191             throw new RSRuntimeException("Couldn't invoke registerNativeAllocation:" + e);
1192         }
1193 
1194     }
1195 
1196     /**
1197      * Gets the application context associated with the RenderScript context.
1198      *
1199      * @return The application context.
1200      */
getApplicationContext()1201     public final Context getApplicationContext() {
1202         return mApplicationContext;
1203     }
1204 
1205     /**
1206      * @hide
1207      */
create(Context ctx, int sdkVersion)1208     public static RenderScript create(Context ctx, int sdkVersion) {
1209         return create(ctx, sdkVersion, ContextType.NORMAL, CREATE_FLAG_NONE);
1210     }
1211 
1212     /**
1213      * Create a RenderScript context.
1214      *
1215      * @hide
1216      * @param ctx The context.
1217      * @return RenderScript
1218      */
create(Context ctx, int sdkVersion, ContextType ct, int flags)1219     public static RenderScript create(Context ctx, int sdkVersion, ContextType ct, int flags) {
1220         if (!sInitialized) {
1221             Log.e(LOG_TAG, "RenderScript.create() called when disabled; someone is likely to crash");
1222             return null;
1223         }
1224 
1225         if ((flags & ~(CREATE_FLAG_LOW_LATENCY | CREATE_FLAG_LOW_POWER)) != 0) {
1226             throw new RSIllegalArgumentException("Invalid flags passed.");
1227         }
1228 
1229         RenderScript rs = new RenderScript(ctx);
1230 
1231         rs.mDev = rs.nDeviceCreate();
1232         rs.mContext = rs.nContextCreate(rs.mDev, flags, sdkVersion, ct.mID);
1233         rs.mContextType = ct;
1234         if (rs.mContext == 0) {
1235             throw new RSDriverException("Failed to create RS context.");
1236         }
1237         rs.mMessageThread = new MessageThread(rs);
1238         rs.mMessageThread.start();
1239         return rs;
1240     }
1241 
1242     /**
1243      * Create a RenderScript context.
1244      *
1245      * @param ctx The context.
1246      * @return RenderScript
1247      */
create(Context ctx)1248     public static RenderScript create(Context ctx) {
1249         return create(ctx, ContextType.NORMAL);
1250     }
1251 
1252     /**
1253      * Create a RenderScript context.
1254      *
1255      *
1256      * @param ctx The context.
1257      * @param ct The type of context to be created.
1258      * @return RenderScript
1259      */
create(Context ctx, ContextType ct)1260     public static RenderScript create(Context ctx, ContextType ct) {
1261         int v = ctx.getApplicationInfo().targetSdkVersion;
1262         return create(ctx, v, ct, CREATE_FLAG_NONE);
1263     }
1264 
1265      /**
1266      * Create a RenderScript context.
1267      *
1268      *
1269      * @param ctx The context.
1270      * @param ct The type of context to be created.
1271      * @param flags The OR of the CREATE_FLAG_* options desired
1272      * @return RenderScript
1273      */
create(Context ctx, ContextType ct, int flags)1274     public static RenderScript create(Context ctx, ContextType ct, int flags) {
1275         int v = ctx.getApplicationInfo().targetSdkVersion;
1276         return create(ctx, v, ct, flags);
1277     }
1278 
1279     /**
1280      * Print the currently available debugging information about the state of
1281      * the RS context to the log.
1282      *
1283      */
contextDump()1284     public void contextDump() {
1285         validate();
1286         nContextDump(0);
1287     }
1288 
1289     /**
1290      * Wait for any pending asynchronous opeations (such as copies to a RS
1291      * allocation or RS script executions) to complete.
1292      *
1293      */
finish()1294     public void finish() {
1295         nContextFinish();
1296     }
1297 
1298     /**
1299      * Destroys this RenderScript context.  Once this function is called,
1300      * using this context or any objects belonging to this context is
1301      * illegal.
1302      *
1303      */
destroy()1304     public void destroy() {
1305         validate();
1306         nContextFinish();
1307 
1308         nContextDeinitToClient(mContext);
1309         mMessageThread.mRun = false;
1310         try {
1311             mMessageThread.join();
1312         } catch(InterruptedException e) {
1313         }
1314 
1315         nContextDestroy();
1316 
1317         nDeviceDestroy(mDev);
1318         mDev = 0;
1319     }
1320 
isAlive()1321     boolean isAlive() {
1322         return mContext != 0;
1323     }
1324 
safeID(BaseObj o)1325     long safeID(BaseObj o) {
1326         if(o != null) {
1327             return o.getID(this);
1328         }
1329         return 0;
1330     }
1331 }
1332