2 * Copyright (C) 2008-2012 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package android.renderscript;
20 import java.lang.reflect.Field;
22 import android.content.Context;
23 import android.content.pm.ApplicationInfo;
24 import android.content.pm.PackageManager;
25 import android.content.res.AssetManager;
26 import android.graphics.Bitmap;
27 import android.graphics.BitmapFactory;
28 import android.graphics.SurfaceTexture;
29 import android.os.Process;
30 import android.util.Log;
31 import android.view.Surface;
36 * Renderscript base master class. An instance of this class creates native
37 * worker threads for processing commands from this object. This base class
38 * does not provide any extended capabilities beyond simple data processing.
39 * For extended capabilities use derived classes such as RenderScriptGL.
41 * <div class="special reference">
42 * <h3>Developer Guides</h3>
43 * <p>For more information about creating an application that uses Renderscript, read the
44 * <a href="{@docRoot}guide/topics/renderscript/index.html">Renderscript</a> developer guide.</p>
47 public class RenderScript {
48 static final String LOG_TAG = "RenderScript_jni";
49 static final boolean DEBUG = false;
50 @SuppressWarnings({"UnusedDeclaration", "deprecation"})
51 static final boolean LOG_ENABLED = false;
53 private Context mApplicationContext;
56 * We use a class initializer to allow the native code to cache some
59 @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
60 static boolean sInitialized;
61 native static void _nInit();
67 System.loadLibrary("rs_jni");
70 } catch (UnsatisfiedLinkError e) {
71 Log.e(LOG_TAG, "Error loading RS jni library: " + e);
72 throw new RSRuntimeException("Error loading RS jni library: " + e);
76 // Non-threadsafe functions.
77 native int nDeviceCreate();
78 native void nDeviceDestroy(int dev);
79 native void nDeviceSetConfig(int dev, int param, int value);
80 native int nContextGetUserMessage(int con, int[] data);
81 native String nContextGetErrorMessage(int con);
82 native int nContextPeekMessage(int con, int[] subID);
83 native void nContextInitToClient(int con);
84 native void nContextDeinitToClient(int con);
86 static File mCacheDir;
89 * Sets the directory to use as a persistent storage for the
90 * renderscript object file cache.
93 * @param cacheDir A directory the current process can write to
95 public static void setupDiskCache(File cacheDir) {
96 // Defer creation of cache path to nScriptCCreate().
101 * ContextType specifies the specific type of context to be created.
104 public enum ContextType {
106 * NORMAL context, this is the default and what shipping apps should
112 * DEBUG context, perform extra runtime checks to validate the
113 * kernels and APIs are being used as intended. Get and SetElementAt
114 * will be bounds checked in this mode.
119 * PROFILE context, Intended to be used once the first time an
120 * application is run on a new device. This mode allows the runtime to
121 * do additional testing and performance tuning.
126 ContextType(int id) {
131 ContextType mContextType;
133 // Methods below are wrapped to protect the non-threadsafe
135 native int rsnContextCreateGL(int dev, int ver, int sdkVer,
136 int colorMin, int colorPref,
137 int alphaMin, int alphaPref,
138 int depthMin, int depthPref,
139 int stencilMin, int stencilPref,
140 int samplesMin, int samplesPref, float samplesQ, int dpi);
141 synchronized int nContextCreateGL(int dev, int ver, int sdkVer,
142 int colorMin, int colorPref,
143 int alphaMin, int alphaPref,
144 int depthMin, int depthPref,
145 int stencilMin, int stencilPref,
146 int samplesMin, int samplesPref, float samplesQ, int dpi) {
147 return rsnContextCreateGL(dev, ver, sdkVer, colorMin, colorPref,
148 alphaMin, alphaPref, depthMin, depthPref,
149 stencilMin, stencilPref,
150 samplesMin, samplesPref, samplesQ, dpi);
152 native int rsnContextCreate(int dev, int ver, int sdkVer, int contextType);
153 synchronized int nContextCreate(int dev, int ver, int sdkVer, int contextType) {
154 return rsnContextCreate(dev, ver, sdkVer, contextType);
156 native void rsnContextDestroy(int con);
157 synchronized void nContextDestroy() {
159 rsnContextDestroy(mContext);
161 native void rsnContextSetSurface(int con, int w, int h, Surface sur);
162 synchronized void nContextSetSurface(int w, int h, Surface sur) {
164 rsnContextSetSurface(mContext, w, h, sur);
166 native void rsnContextSetSurfaceTexture(int con, int w, int h, SurfaceTexture sur);
167 synchronized void nContextSetSurfaceTexture(int w, int h, SurfaceTexture sur) {
169 rsnContextSetSurfaceTexture(mContext, w, h, sur);
171 native void rsnContextSetPriority(int con, int p);
172 synchronized void nContextSetPriority(int p) {
174 rsnContextSetPriority(mContext, p);
176 native void rsnContextDump(int con, int bits);
177 synchronized void nContextDump(int bits) {
179 rsnContextDump(mContext, bits);
181 native void rsnContextFinish(int con);
182 synchronized void nContextFinish() {
184 rsnContextFinish(mContext);
187 native void rsnContextSendMessage(int con, int id, int[] data);
188 synchronized void nContextSendMessage(int id, int[] data) {
190 rsnContextSendMessage(mContext, id, data);
193 native void rsnContextBindRootScript(int con, int script);
194 synchronized void nContextBindRootScript(int script) {
196 rsnContextBindRootScript(mContext, script);
198 native void rsnContextBindSampler(int con, int sampler, int slot);
199 synchronized void nContextBindSampler(int sampler, int slot) {
201 rsnContextBindSampler(mContext, sampler, slot);
203 native void rsnContextBindProgramStore(int con, int pfs);
204 synchronized void nContextBindProgramStore(int pfs) {
206 rsnContextBindProgramStore(mContext, pfs);
208 native void rsnContextBindProgramFragment(int con, int pf);
209 synchronized void nContextBindProgramFragment(int pf) {
211 rsnContextBindProgramFragment(mContext, pf);
213 native void rsnContextBindProgramVertex(int con, int pv);
214 synchronized void nContextBindProgramVertex(int pv) {
216 rsnContextBindProgramVertex(mContext, pv);
218 native void rsnContextBindProgramRaster(int con, int pr);
219 synchronized void nContextBindProgramRaster(int pr) {
221 rsnContextBindProgramRaster(mContext, pr);
223 native void rsnContextPause(int con);
224 synchronized void nContextPause() {
226 rsnContextPause(mContext);
228 native void rsnContextResume(int con);
229 synchronized void nContextResume() {
231 rsnContextResume(mContext);
234 native void rsnAssignName(int con, int obj, byte[] name);
235 synchronized void nAssignName(int obj, byte[] name) {
237 rsnAssignName(mContext, obj, name);
239 native String rsnGetName(int con, int obj);
240 synchronized String nGetName(int obj) {
242 return rsnGetName(mContext, obj);
244 native void rsnObjDestroy(int con, int id);
245 synchronized void nObjDestroy(int id) {
246 // There is a race condition here. The calling code may be run
247 // by the gc while teardown is occuring. This protects againts
248 // deleting dead objects.
250 rsnObjDestroy(mContext, id);
254 native int rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize);
255 synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) {
257 return rsnElementCreate(mContext, type, kind, norm, vecSize);
259 native int rsnElementCreate2(int con, int[] elements, String[] names, int[] arraySizes);
260 synchronized int nElementCreate2(int[] elements, String[] names, int[] arraySizes) {
262 return rsnElementCreate2(mContext, elements, names, arraySizes);
264 native void rsnElementGetNativeData(int con, int id, int[] elementData);
265 synchronized void nElementGetNativeData(int id, int[] elementData) {
267 rsnElementGetNativeData(mContext, id, elementData);
269 native void rsnElementGetSubElements(int con, int id,
270 int[] IDs, String[] names, int[] arraySizes);
271 synchronized void nElementGetSubElements(int id, int[] IDs, String[] names, int[] arraySizes) {
273 rsnElementGetSubElements(mContext, id, IDs, names, arraySizes);
276 native int rsnTypeCreate(int con, int eid, int x, int y, int z, boolean mips, boolean faces, int yuv);
277 synchronized int nTypeCreate(int eid, int x, int y, int z, boolean mips, boolean faces, int yuv) {
279 return rsnTypeCreate(mContext, eid, x, y, z, mips, faces, yuv);
281 native void rsnTypeGetNativeData(int con, int id, int[] typeData);
282 synchronized void nTypeGetNativeData(int id, int[] typeData) {
284 rsnTypeGetNativeData(mContext, id, typeData);
287 native int rsnAllocationCreateTyped(int con, int type, int mip, int usage, int pointer);
288 synchronized int nAllocationCreateTyped(int type, int mip, int usage, int pointer) {
290 return rsnAllocationCreateTyped(mContext, type, mip, usage, pointer);
292 native int rsnAllocationCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
293 synchronized int nAllocationCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
295 return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
298 native int rsnAllocationCreateBitmapBackedAllocation(int con, int type, int mip, Bitmap bmp, int usage);
299 synchronized int nAllocationCreateBitmapBackedAllocation(int type, int mip, Bitmap bmp, int usage) {
301 return rsnAllocationCreateBitmapBackedAllocation(mContext, type, mip, bmp, usage);
305 native int rsnAllocationCubeCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
306 synchronized int nAllocationCubeCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
308 return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
310 native int rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp);
311 synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) {
313 return rsnAllocationCreateBitmapRef(mContext, type, bmp);
315 native int rsnAllocationCreateFromAssetStream(int con, int mips, int assetStream, int usage);
316 synchronized int nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
318 return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
321 native void rsnAllocationCopyToBitmap(int con, int alloc, Bitmap bmp);
322 synchronized void nAllocationCopyToBitmap(int alloc, Bitmap bmp) {
324 rsnAllocationCopyToBitmap(mContext, alloc, bmp);
328 native void rsnAllocationSyncAll(int con, int alloc, int src);
329 synchronized void nAllocationSyncAll(int alloc, int src) {
331 rsnAllocationSyncAll(mContext, alloc, src);
333 native Surface rsnAllocationGetSurface(int con, int alloc);
334 synchronized Surface nAllocationGetSurface(int alloc) {
336 return rsnAllocationGetSurface(mContext, alloc);
338 native void rsnAllocationSetSurface(int con, int alloc, Surface sur);
339 synchronized void nAllocationSetSurface(int alloc, Surface sur) {
341 rsnAllocationSetSurface(mContext, alloc, sur);
343 native void rsnAllocationIoSend(int con, int alloc);
344 synchronized void nAllocationIoSend(int alloc) {
346 rsnAllocationIoSend(mContext, alloc);
348 native void rsnAllocationIoReceive(int con, int alloc);
349 synchronized void nAllocationIoReceive(int alloc) {
351 rsnAllocationIoReceive(mContext, alloc);
355 native void rsnAllocationGenerateMipmaps(int con, int alloc);
356 synchronized void nAllocationGenerateMipmaps(int alloc) {
358 rsnAllocationGenerateMipmaps(mContext, alloc);
360 native void rsnAllocationCopyFromBitmap(int con, int alloc, Bitmap bmp);
361 synchronized void nAllocationCopyFromBitmap(int alloc, Bitmap bmp) {
363 rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
367 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, int[] d, int sizeBytes);
368 synchronized void nAllocationData1D(int id, int off, int mip, int count, int[] d, int sizeBytes) {
370 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
372 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, short[] d, int sizeBytes);
373 synchronized void nAllocationData1D(int id, int off, int mip, int count, short[] d, int sizeBytes) {
375 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
377 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, byte[] d, int sizeBytes);
378 synchronized void nAllocationData1D(int id, int off, int mip, int count, byte[] d, int sizeBytes) {
380 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
382 native void rsnAllocationData1D(int con, int id, int off, int mip, int count, float[] d, int sizeBytes);
383 synchronized void nAllocationData1D(int id, int off, int mip, int count, float[] d, int sizeBytes) {
385 rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
388 native void rsnAllocationElementData1D(int con, int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes);
389 synchronized void nAllocationElementData1D(int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes) {
391 rsnAllocationElementData1D(mContext, id, xoff, mip, compIdx, d, sizeBytes);
394 native void rsnAllocationData2D(int con,
395 int dstAlloc, int dstXoff, int dstYoff,
396 int dstMip, int dstFace,
397 int width, int height,
398 int srcAlloc, int srcXoff, int srcYoff,
399 int srcMip, int srcFace);
400 synchronized void nAllocationData2D(int dstAlloc, int dstXoff, int dstYoff,
401 int dstMip, int dstFace,
402 int width, int height,
403 int srcAlloc, int srcXoff, int srcYoff,
404 int srcMip, int srcFace) {
406 rsnAllocationData2D(mContext,
407 dstAlloc, dstXoff, dstYoff,
410 srcAlloc, srcXoff, srcYoff,
414 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes);
415 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes) {
417 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
419 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes);
420 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes) {
422 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
424 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes);
425 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes) {
427 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
429 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes);
430 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes) {
432 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
434 native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, Bitmap b);
435 synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, Bitmap b) {
437 rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
440 native void rsnAllocationData3D(int con,
441 int dstAlloc, int dstXoff, int dstYoff, int dstZoff,
443 int width, int height, int depth,
444 int srcAlloc, int srcXoff, int srcYoff, int srcZoff,
446 synchronized void nAllocationData3D(int dstAlloc, int dstXoff, int dstYoff, int dstZoff,
448 int width, int height, int depth,
449 int srcAlloc, int srcXoff, int srcYoff, int srcZoff,
452 rsnAllocationData3D(mContext,
453 dstAlloc, dstXoff, dstYoff, dstZoff,
454 dstMip, width, height, depth,
455 srcAlloc, srcXoff, srcYoff, srcZoff, srcMip);
458 native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, byte[] d, int sizeBytes);
459 synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, byte[] d, int sizeBytes) {
461 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
463 native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, short[] d, int sizeBytes);
464 synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, short[] d, int sizeBytes) {
466 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
468 native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, int[] d, int sizeBytes);
469 synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, int[] d, int sizeBytes) {
471 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
473 native void rsnAllocationData3D(int con, int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, float[] d, int sizeBytes);
474 synchronized void nAllocationData3D(int id, int xoff, int yoff, int zoff, int mip, int w, int h, int depth, float[] d, int sizeBytes) {
476 rsnAllocationData3D(mContext, id, xoff, yoff, zoff, mip, w, h, depth, d, sizeBytes);
480 native void rsnAllocationRead(int con, int id, byte[] d);
481 synchronized void nAllocationRead(int id, byte[] d) {
483 rsnAllocationRead(mContext, id, d);
485 native void rsnAllocationRead(int con, int id, short[] d);
486 synchronized void nAllocationRead(int id, short[] d) {
488 rsnAllocationRead(mContext, id, d);
490 native void rsnAllocationRead(int con, int id, int[] d);
491 synchronized void nAllocationRead(int id, int[] d) {
493 rsnAllocationRead(mContext, id, d);
495 native void rsnAllocationRead(int con, int id, float[] d);
496 synchronized void nAllocationRead(int id, float[] d) {
498 rsnAllocationRead(mContext, id, d);
500 native int rsnAllocationGetType(int con, int id);
501 synchronized int nAllocationGetType(int id) {
503 return rsnAllocationGetType(mContext, id);
506 native void rsnAllocationResize1D(int con, int id, int dimX);
507 synchronized void nAllocationResize1D(int id, int dimX) {
509 rsnAllocationResize1D(mContext, id, dimX);
512 native int rsnFileA3DCreateFromAssetStream(int con, int assetStream);
513 synchronized int nFileA3DCreateFromAssetStream(int assetStream) {
515 return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
517 native int rsnFileA3DCreateFromFile(int con, String path);
518 synchronized int nFileA3DCreateFromFile(String path) {
520 return rsnFileA3DCreateFromFile(mContext, path);
522 native int rsnFileA3DCreateFromAsset(int con, AssetManager mgr, String path);
523 synchronized int nFileA3DCreateFromAsset(AssetManager mgr, String path) {
525 return rsnFileA3DCreateFromAsset(mContext, mgr, path);
527 native int rsnFileA3DGetNumIndexEntries(int con, int fileA3D);
528 synchronized int nFileA3DGetNumIndexEntries(int fileA3D) {
530 return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
532 native void rsnFileA3DGetIndexEntries(int con, int fileA3D, int numEntries, int[] IDs, String[] names);
533 synchronized void nFileA3DGetIndexEntries(int fileA3D, int numEntries, int[] IDs, String[] names) {
535 rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
537 native int rsnFileA3DGetEntryByIndex(int con, int fileA3D, int index);
538 synchronized int nFileA3DGetEntryByIndex(int fileA3D, int index) {
540 return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
543 native int rsnFontCreateFromFile(int con, String fileName, float size, int dpi);
544 synchronized int nFontCreateFromFile(String fileName, float size, int dpi) {
546 return rsnFontCreateFromFile(mContext, fileName, size, dpi);
548 native int rsnFontCreateFromAssetStream(int con, String name, float size, int dpi, int assetStream);
549 synchronized int nFontCreateFromAssetStream(String name, float size, int dpi, int assetStream) {
551 return rsnFontCreateFromAssetStream(mContext, name, size, dpi, assetStream);
553 native int rsnFontCreateFromAsset(int con, AssetManager mgr, String path, float size, int dpi);
554 synchronized int nFontCreateFromAsset(AssetManager mgr, String path, float size, int dpi) {
556 return rsnFontCreateFromAsset(mContext, mgr, path, size, dpi);
560 native void rsnScriptBindAllocation(int con, int script, int alloc, int slot);
561 synchronized void nScriptBindAllocation(int script, int alloc, int slot) {
563 rsnScriptBindAllocation(mContext, script, alloc, slot);
565 native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone);
566 synchronized void nScriptSetTimeZone(int script, byte[] timeZone) {
568 rsnScriptSetTimeZone(mContext, script, timeZone);
570 native void rsnScriptInvoke(int con, int id, int slot);
571 synchronized void nScriptInvoke(int id, int slot) {
573 rsnScriptInvoke(mContext, id, slot);
575 native void rsnScriptForEach(int con, int id, int slot, int ain, int aout, byte[] params);
576 native void rsnScriptForEach(int con, int id, int slot, int ain, int aout);
577 native void rsnScriptForEachClipped(int con, int id, int slot, int ain, int aout, byte[] params,
578 int xstart, int xend, int ystart, int yend, int zstart, int zend);
579 native void rsnScriptForEachClipped(int con, int id, int slot, int ain, int aout,
580 int xstart, int xend, int ystart, int yend, int zstart, int zend);
581 synchronized void nScriptForEach(int id, int slot, int ain, int aout, byte[] params) {
583 if (params == null) {
584 rsnScriptForEach(mContext, id, slot, ain, aout);
586 rsnScriptForEach(mContext, id, slot, ain, aout, params);
590 synchronized void nScriptForEachClipped(int id, int slot, int ain, int aout, byte[] params,
591 int xstart, int xend, int ystart, int yend, int zstart, int zend) {
593 if (params == null) {
594 rsnScriptForEachClipped(mContext, id, slot, ain, aout, xstart, xend, ystart, yend, zstart, zend);
596 rsnScriptForEachClipped(mContext, id, slot, ain, aout, params, xstart, xend, ystart, yend, zstart, zend);
600 native void rsnScriptInvokeV(int con, int id, int slot, byte[] params);
601 synchronized void nScriptInvokeV(int id, int slot, byte[] params) {
603 rsnScriptInvokeV(mContext, id, slot, params);
606 native void rsnScriptSetVarI(int con, int id, int slot, int val);
607 synchronized void nScriptSetVarI(int id, int slot, int val) {
609 rsnScriptSetVarI(mContext, id, slot, val);
611 native int rsnScriptGetVarI(int con, int id, int slot);
612 synchronized int nScriptGetVarI(int id, int slot) {
614 return rsnScriptGetVarI(mContext, id, slot);
617 native void rsnScriptSetVarJ(int con, int id, int slot, long val);
618 synchronized void nScriptSetVarJ(int id, int slot, long val) {
620 rsnScriptSetVarJ(mContext, id, slot, val);
622 native long rsnScriptGetVarJ(int con, int id, int slot);
623 synchronized long nScriptGetVarJ(int id, int slot) {
625 return rsnScriptGetVarJ(mContext, id, slot);
628 native void rsnScriptSetVarF(int con, int id, int slot, float val);
629 synchronized void nScriptSetVarF(int id, int slot, float val) {
631 rsnScriptSetVarF(mContext, id, slot, val);
633 native float rsnScriptGetVarF(int con, int id, int slot);
634 synchronized float nScriptGetVarF(int id, int slot) {
636 return rsnScriptGetVarF(mContext, id, slot);
638 native void rsnScriptSetVarD(int con, int id, int slot, double val);
639 synchronized void nScriptSetVarD(int id, int slot, double val) {
641 rsnScriptSetVarD(mContext, id, slot, val);
643 native double rsnScriptGetVarD(int con, int id, int slot);
644 synchronized double nScriptGetVarD(int id, int slot) {
646 return rsnScriptGetVarD(mContext, id, slot);
648 native void rsnScriptSetVarV(int con, int id, int slot, byte[] val);
649 synchronized void nScriptSetVarV(int id, int slot, byte[] val) {
651 rsnScriptSetVarV(mContext, id, slot, val);
653 native void rsnScriptGetVarV(int con, int id, int slot, byte[] val);
654 synchronized void nScriptGetVarV(int id, int slot, byte[] val) {
656 rsnScriptGetVarV(mContext, id, slot, val);
658 native void rsnScriptSetVarVE(int con, int id, int slot, byte[] val,
660 synchronized void nScriptSetVarVE(int id, int slot, byte[] val,
663 rsnScriptSetVarVE(mContext, id, slot, val, e, dims);
665 native void rsnScriptSetVarObj(int con, int id, int slot, int val);
666 synchronized void nScriptSetVarObj(int id, int slot, int val) {
668 rsnScriptSetVarObj(mContext, id, slot, val);
671 native int rsnScriptCCreate(int con, String resName, String cacheDir,
672 byte[] script, int length);
673 synchronized int nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
675 return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
678 native int rsnScriptIntrinsicCreate(int con, int id, int eid);
679 synchronized int nScriptIntrinsicCreate(int id, int eid) {
681 return rsnScriptIntrinsicCreate(mContext, id, eid);
684 native int rsnScriptKernelIDCreate(int con, int sid, int slot, int sig);
685 synchronized int nScriptKernelIDCreate(int sid, int slot, int sig) {
687 return rsnScriptKernelIDCreate(mContext, sid, slot, sig);
690 native int rsnScriptFieldIDCreate(int con, int sid, int slot);
691 synchronized int nScriptFieldIDCreate(int sid, int slot) {
693 return rsnScriptFieldIDCreate(mContext, sid, slot);
696 native int rsnScriptGroupCreate(int con, int[] kernels, int[] src, int[] dstk, int[] dstf, int[] types);
697 synchronized int nScriptGroupCreate(int[] kernels, int[] src, int[] dstk, int[] dstf, int[] types) {
699 return rsnScriptGroupCreate(mContext, kernels, src, dstk, dstf, types);
702 native void rsnScriptGroupSetInput(int con, int group, int kernel, int alloc);
703 synchronized void nScriptGroupSetInput(int group, int kernel, int alloc) {
705 rsnScriptGroupSetInput(mContext, group, kernel, alloc);
708 native void rsnScriptGroupSetOutput(int con, int group, int kernel, int alloc);
709 synchronized void nScriptGroupSetOutput(int group, int kernel, int alloc) {
711 rsnScriptGroupSetOutput(mContext, group, kernel, alloc);
714 native void rsnScriptGroupExecute(int con, int group);
715 synchronized void nScriptGroupExecute(int group) {
717 rsnScriptGroupExecute(mContext, group);
720 native int rsnSamplerCreate(int con, int magFilter, int minFilter,
721 int wrapS, int wrapT, int wrapR, float aniso);
722 synchronized int nSamplerCreate(int magFilter, int minFilter,
723 int wrapS, int wrapT, int wrapR, float aniso) {
725 return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
728 native int rsnProgramStoreCreate(int con, boolean r, boolean g, boolean b, boolean a,
729 boolean depthMask, boolean dither,
730 int srcMode, int dstMode, int depthFunc);
731 synchronized int nProgramStoreCreate(boolean r, boolean g, boolean b, boolean a,
732 boolean depthMask, boolean dither,
733 int srcMode, int dstMode, int depthFunc) {
735 return rsnProgramStoreCreate(mContext, r, g, b, a, depthMask, dither, srcMode,
739 native int rsnProgramRasterCreate(int con, boolean pointSprite, int cullMode);
740 synchronized int nProgramRasterCreate(boolean pointSprite, int cullMode) {
742 return rsnProgramRasterCreate(mContext, pointSprite, cullMode);
745 native void rsnProgramBindConstants(int con, int pv, int slot, int mID);
746 synchronized void nProgramBindConstants(int pv, int slot, int mID) {
748 rsnProgramBindConstants(mContext, pv, slot, mID);
750 native void rsnProgramBindTexture(int con, int vpf, int slot, int a);
751 synchronized void nProgramBindTexture(int vpf, int slot, int a) {
753 rsnProgramBindTexture(mContext, vpf, slot, a);
755 native void rsnProgramBindSampler(int con, int vpf, int slot, int s);
756 synchronized void nProgramBindSampler(int vpf, int slot, int s) {
758 rsnProgramBindSampler(mContext, vpf, slot, s);
760 native int rsnProgramFragmentCreate(int con, String shader, String[] texNames, int[] params);
761 synchronized int nProgramFragmentCreate(String shader, String[] texNames, int[] params) {
763 return rsnProgramFragmentCreate(mContext, shader, texNames, params);
765 native int rsnProgramVertexCreate(int con, String shader, String[] texNames, int[] params);
766 synchronized int nProgramVertexCreate(String shader, String[] texNames, int[] params) {
768 return rsnProgramVertexCreate(mContext, shader, texNames, params);
771 native int rsnMeshCreate(int con, int[] vtx, int[] idx, int[] prim);
772 synchronized int nMeshCreate(int[] vtx, int[] idx, int[] prim) {
774 return rsnMeshCreate(mContext, vtx, idx, prim);
776 native int rsnMeshGetVertexBufferCount(int con, int id);
777 synchronized int nMeshGetVertexBufferCount(int id) {
779 return rsnMeshGetVertexBufferCount(mContext, id);
781 native int rsnMeshGetIndexCount(int con, int id);
782 synchronized int nMeshGetIndexCount(int id) {
784 return rsnMeshGetIndexCount(mContext, id);
786 native void rsnMeshGetVertices(int con, int id, int[] vtxIds, int vtxIdCount);
787 synchronized void nMeshGetVertices(int id, int[] vtxIds, int vtxIdCount) {
789 rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
791 native void rsnMeshGetIndices(int con, int id, int[] idxIds, int[] primitives, int vtxIdCount);
792 synchronized void nMeshGetIndices(int id, int[] idxIds, int[] primitives, int vtxIdCount) {
794 rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
797 native int rsnPathCreate(int con, int prim, boolean isStatic, int vtx, int loop, float q);
798 synchronized int nPathCreate(int prim, boolean isStatic, int vtx, int loop, float q) {
800 return rsnPathCreate(mContext, prim, isStatic, vtx, loop, q);
805 @SuppressWarnings({"FieldCanBeLocal"})
806 MessageThread mMessageThread;
810 Element mElement_U16;
811 Element mElement_I16;
812 Element mElement_U32;
813 Element mElement_I32;
814 Element mElement_U64;
815 Element mElement_I64;
816 Element mElement_F32;
817 Element mElement_F64;
818 Element mElement_BOOLEAN;
820 Element mElement_ELEMENT;
821 Element mElement_TYPE;
822 Element mElement_ALLOCATION;
823 Element mElement_SAMPLER;
824 Element mElement_SCRIPT;
825 Element mElement_MESH;
826 Element mElement_PROGRAM_FRAGMENT;
827 Element mElement_PROGRAM_VERTEX;
828 Element mElement_PROGRAM_RASTER;
829 Element mElement_PROGRAM_STORE;
830 Element mElement_FONT;
832 Element mElement_A_8;
833 Element mElement_RGB_565;
834 Element mElement_RGB_888;
835 Element mElement_RGBA_5551;
836 Element mElement_RGBA_4444;
837 Element mElement_RGBA_8888;
839 Element mElement_FLOAT_2;
840 Element mElement_FLOAT_3;
841 Element mElement_FLOAT_4;
843 Element mElement_DOUBLE_2;
844 Element mElement_DOUBLE_3;
845 Element mElement_DOUBLE_4;
847 Element mElement_UCHAR_2;
848 Element mElement_UCHAR_3;
849 Element mElement_UCHAR_4;
851 Element mElement_CHAR_2;
852 Element mElement_CHAR_3;
853 Element mElement_CHAR_4;
855 Element mElement_USHORT_2;
856 Element mElement_USHORT_3;
857 Element mElement_USHORT_4;
859 Element mElement_SHORT_2;
860 Element mElement_SHORT_3;
861 Element mElement_SHORT_4;
863 Element mElement_UINT_2;
864 Element mElement_UINT_3;
865 Element mElement_UINT_4;
867 Element mElement_INT_2;
868 Element mElement_INT_3;
869 Element mElement_INT_4;
871 Element mElement_ULONG_2;
872 Element mElement_ULONG_3;
873 Element mElement_ULONG_4;
875 Element mElement_LONG_2;
876 Element mElement_LONG_3;
877 Element mElement_LONG_4;
879 Element mElement_MATRIX_4X4;
880 Element mElement_MATRIX_3X3;
881 Element mElement_MATRIX_2X2;
883 Sampler mSampler_CLAMP_NEAREST;
884 Sampler mSampler_CLAMP_LINEAR;
885 Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
886 Sampler mSampler_WRAP_NEAREST;
887 Sampler mSampler_WRAP_LINEAR;
888 Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
889 Sampler mSampler_MIRRORED_REPEAT_NEAREST;
890 Sampler mSampler_MIRRORED_REPEAT_LINEAR;
891 Sampler mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
893 ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
894 ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
895 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
896 ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
898 ProgramRaster mProgramRaster_CULL_BACK;
899 ProgramRaster mProgramRaster_CULL_FRONT;
900 ProgramRaster mProgramRaster_CULL_NONE;
902 ///////////////////////////////////////////////////////////////////////////////////
906 * Base class application should derive from for handling RS messages
907 * coming from their scripts. When a script calls sendToClient the data
908 * fields will be filled in and then the run method called by a message
909 * handling thread. This will occur some time after sendToClient completes
913 public static class RSMessageHandler implements Runnable {
914 protected int[] mData;
916 protected int mLength;
921 * If an application is expecting messages it should set this field to an
922 * instance of RSMessage. This instance will receive all the user messages
923 * sent from sendToClient by scripts from this context.
926 RSMessageHandler mMessageCallback = null;
928 public void setMessageHandler(RSMessageHandler msg) {
929 mMessageCallback = msg;
931 public RSMessageHandler getMessageHandler() {
932 return mMessageCallback;
936 * Place a message into the message queue to be sent back to the message
937 * handler once all previous commands have been executed.
942 public void sendMessage(int id, int[] data) {
943 nContextSendMessage(id, data);
947 * Runtime error base class. An application should derive from this class
948 * if it wishes to install an error handler. When errors occur at runtime
949 * the fields in this class will be filled and the run method called.
952 public static class RSErrorHandler implements Runnable {
953 protected String mErrorMessage;
954 protected int mErrorNum;
960 * Application Error handler. All runtime errors will be dispatched to the
961 * instance of RSAsyncError set here. If this field is null a
962 * RSRuntimeException will instead be thrown with details about the error.
963 * This will cause program termaination.
966 RSErrorHandler mErrorCallback = null;
968 public void setErrorHandler(RSErrorHandler msg) {
969 mErrorCallback = msg;
971 public RSErrorHandler getErrorHandler() {
972 return mErrorCallback;
976 * RenderScript worker threads priority enumeration. The default value is
977 * NORMAL. Applications wishing to do background processing such as
978 * wallpapers should set their priority to LOW to avoid starving forground
981 public enum Priority {
982 LOW (Process.THREAD_PRIORITY_BACKGROUND + (5 * Process.THREAD_PRIORITY_LESS_FAVORABLE)),
983 NORMAL (Process.THREAD_PRIORITY_DISPLAY);
993 throw new RSInvalidStateException("Calling RS with no Context active.");
999 * Change the priority of the worker threads for this context.
1001 * @param p New priority to be set.
1003 public void setPriority(Priority p) {
1005 nContextSetPriority(p.mID);
1008 static class MessageThread extends Thread {
1010 boolean mRun = true;
1011 int[] mAuxData = new int[2];
1013 static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
1014 static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
1015 static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
1016 static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
1017 static final int RS_MESSAGE_TO_CLIENT_USER = 4;
1018 static final int RS_MESSAGE_TO_CLIENT_NEW_BUFFER = 5;
1020 static final int RS_ERROR_FATAL_DEBUG = 0x0800;
1021 static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
1023 MessageThread(RenderScript rs) {
1024 super("RSMessageThread");
1030 // This function is a temporary solution. The final solution will
1031 // used typed allocations where the message id is the type indicator.
1032 int[] rbuf = new int[16];
1033 mRS.nContextInitToClient(mRS.mContext);
1036 int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
1037 int size = mAuxData[1];
1038 int subID = mAuxData[0];
1040 if (msg == RS_MESSAGE_TO_CLIENT_USER) {
1041 if ((size>>2) >= rbuf.length) {
1042 rbuf = new int[(size + 3) >> 2];
1044 if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
1045 RS_MESSAGE_TO_CLIENT_USER) {
1046 throw new RSDriverException("Error processing message from Renderscript.");
1049 if(mRS.mMessageCallback != null) {
1050 mRS.mMessageCallback.mData = rbuf;
1051 mRS.mMessageCallback.mID = subID;
1052 mRS.mMessageCallback.mLength = size;
1053 mRS.mMessageCallback.run();
1055 throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
1060 if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
1061 String e = mRS.nContextGetErrorMessage(mRS.mContext);
1063 // Throw RSRuntimeException under the following conditions:
1065 // 1) It is an unknown fatal error.
1066 // 2) It is a debug fatal error, and we are not in a
1068 // 3) It is a debug fatal error, and we do not have an
1070 if (subID >= RS_ERROR_FATAL_UNKNOWN ||
1071 (subID >= RS_ERROR_FATAL_DEBUG &&
1072 (mRS.mContextType != ContextType.DEBUG ||
1073 mRS.mErrorCallback == null))) {
1074 throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
1077 if(mRS.mErrorCallback != null) {
1078 mRS.mErrorCallback.mErrorMessage = e;
1079 mRS.mErrorCallback.mErrorNum = subID;
1080 mRS.mErrorCallback.run();
1082 android.util.Log.e(LOG_TAG, "non fatal RS error, " + e);
1083 // Do not throw here. In these cases, we do not have
1089 if (msg == RS_MESSAGE_TO_CLIENT_NEW_BUFFER) {
1090 Allocation.sendBufferNotification(subID);
1095 // But we want to avoid starving other threads during
1096 // teardown by yielding until the next line in the destructor
1097 // can execute to set mRun = false
1100 } catch(InterruptedException e) {
1103 //Log.d(LOG_TAG, "MessageThread exiting.");
1107 RenderScript(Context ctx) {
1108 mContextType = ContextType.NORMAL;
1110 mApplicationContext = ctx.getApplicationContext();
1115 * Gets the application context associated with the RenderScript context.
1117 * @return The application context.
1119 public final Context getApplicationContext() {
1120 return mApplicationContext;
1126 public static RenderScript create(Context ctx, int sdkVersion) {
1127 return create(ctx, sdkVersion, ContextType.NORMAL);
1131 * Create a basic RenderScript context.
1134 * @param ctx The context.
1135 * @return RenderScript
1137 public static RenderScript create(Context ctx, int sdkVersion, ContextType ct) {
1138 RenderScript rs = new RenderScript(ctx);
1140 rs.mDev = rs.nDeviceCreate();
1141 rs.mContext = rs.nContextCreate(rs.mDev, 0, sdkVersion, ct.mID);
1142 rs.mContextType = ct;
1143 if (rs.mContext == 0) {
1144 throw new RSDriverException("Failed to create RS context.");
1146 rs.mMessageThread = new MessageThread(rs);
1147 rs.mMessageThread.start();
1152 * Create a basic RenderScript context.
1154 * @param ctx The context.
1155 * @return RenderScript
1157 public static RenderScript create(Context ctx) {
1158 return create(ctx, ContextType.NORMAL);
1162 * Create a basic RenderScript context.
1165 * @param ctx The context.
1166 * @param ct The type of context to be created.
1167 * @return RenderScript
1169 public static RenderScript create(Context ctx, ContextType ct) {
1170 int v = ctx.getApplicationInfo().targetSdkVersion;
1171 return create(ctx, v, ct);
1175 * Print the currently available debugging information about the state of
1176 * the RS context to the log.
1179 public void contextDump() {
1185 * Wait for any commands in the fifo between the java bindings and native to
1189 public void finish() {
1194 * Destroy this renderscript context. Once this function is called its no
1195 * longer legal to use this or any objects created by this context.
1198 public void destroy() {
1200 nContextDeinitToClient(mContext);
1201 mMessageThread.mRun = false;
1203 mMessageThread.join();
1204 } catch(InterruptedException e) {
1210 nDeviceDestroy(mDev);
1215 return mContext != 0;
1218 int safeID(BaseObj o) {
1220 return o.getID(this);