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