RenderScript.java revision 85397d8dcbcbe098c805b90fe7779206125e2399
1/*
2 * Copyright (C) 2008 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
17package android.renderscript;
18
19import java.lang.reflect.Field;
20
21import android.content.Context;
22import android.content.pm.ApplicationInfo;
23import android.content.pm.PackageManager;
24import android.content.res.AssetManager;
25import android.graphics.Bitmap;
26import android.graphics.BitmapFactory;
27import android.graphics.SurfaceTexture;
28import android.os.Process;
29import android.util.Log;
30import android.view.Surface;
31
32
33
34/**
35 * RenderScript base master class.  An instance of this class creates native
36 * worker threads for processing commands from this object.  This base class
37 * does not provide any extended capabilities beyond simple data processing.
38 * For extended capabilities use derived classes such as RenderScriptGL.
39 *
40 *
41 *
42 **/
43public class RenderScript {
44    static final String LOG_TAG = "RenderScript_jni";
45    static final boolean DEBUG  = false;
46    @SuppressWarnings({"UnusedDeclaration", "deprecation"})
47    static final boolean LOG_ENABLED = false;
48
49    private Context mApplicationContext;
50
51    /*
52     * We use a class initializer to allow the native code to cache some
53     * field offsets.
54     */
55    @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
56    static boolean sInitialized;
57    native static void _nInit();
58
59
60    static {
61        sInitialized = false;
62        try {
63            System.loadLibrary("rs_jni");
64            _nInit();
65            sInitialized = true;
66        } catch (UnsatisfiedLinkError e) {
67            Log.e(LOG_TAG, "Error loading RS jni library: " + e);
68            throw new RSRuntimeException("Error loading RS jni library: " + e);
69        }
70    }
71
72    // Non-threadsafe functions.
73    native int  nDeviceCreate();
74    native void nDeviceDestroy(int dev);
75    native void nDeviceSetConfig(int dev, int param, int value);
76    native int nContextGetUserMessage(int con, int[] data);
77    native String nContextGetErrorMessage(int con);
78    native int  nContextPeekMessage(int con, int[] subID);
79    native void nContextInitToClient(int con);
80    native void nContextDeinitToClient(int con);
81
82
83    // Methods below are wrapped to protect the non-threadsafe
84    // lockless fifo.
85    native int  rsnContextCreateGL(int dev, int ver, int sdkVer,
86                 int colorMin, int colorPref,
87                 int alphaMin, int alphaPref,
88                 int depthMin, int depthPref,
89                 int stencilMin, int stencilPref,
90                 int samplesMin, int samplesPref, float samplesQ, int dpi);
91    synchronized int nContextCreateGL(int dev, int ver, int sdkVer,
92                 int colorMin, int colorPref,
93                 int alphaMin, int alphaPref,
94                 int depthMin, int depthPref,
95                 int stencilMin, int stencilPref,
96                 int samplesMin, int samplesPref, float samplesQ, int dpi) {
97        return rsnContextCreateGL(dev, ver, sdkVer, colorMin, colorPref,
98                                  alphaMin, alphaPref, depthMin, depthPref,
99                                  stencilMin, stencilPref,
100                                  samplesMin, samplesPref, samplesQ, dpi);
101    }
102    native int  rsnContextCreate(int dev, int ver, int sdkVer);
103    synchronized int nContextCreate(int dev, int ver, int sdkVer) {
104        return rsnContextCreate(dev, ver, sdkVer);
105    }
106    native void rsnContextDestroy(int con);
107    synchronized void nContextDestroy() {
108        validate();
109        rsnContextDestroy(mContext);
110    }
111    native void rsnContextSetSurface(int con, int w, int h, Surface sur);
112    synchronized void nContextSetSurface(int w, int h, Surface sur) {
113        validate();
114        rsnContextSetSurface(mContext, w, h, sur);
115    }
116    native void rsnContextSetSurfaceTexture(int con, int w, int h, SurfaceTexture sur);
117    synchronized void nContextSetSurfaceTexture(int w, int h, SurfaceTexture sur) {
118        validate();
119        rsnContextSetSurfaceTexture(mContext, w, h, sur);
120    }
121    native void rsnContextSetPriority(int con, int p);
122    synchronized void nContextSetPriority(int p) {
123        validate();
124        rsnContextSetPriority(mContext, p);
125    }
126    native void rsnContextDump(int con, int bits);
127    synchronized void nContextDump(int bits) {
128        validate();
129        rsnContextDump(mContext, bits);
130    }
131    native void rsnContextFinish(int con);
132    synchronized void nContextFinish() {
133        validate();
134        rsnContextFinish(mContext);
135    }
136
137    native void rsnContextBindRootScript(int con, int script);
138    synchronized void nContextBindRootScript(int script) {
139        validate();
140        rsnContextBindRootScript(mContext, script);
141    }
142    native void rsnContextBindSampler(int con, int sampler, int slot);
143    synchronized void nContextBindSampler(int sampler, int slot) {
144        validate();
145        rsnContextBindSampler(mContext, sampler, slot);
146    }
147    native void rsnContextBindProgramStore(int con, int pfs);
148    synchronized void nContextBindProgramStore(int pfs) {
149        validate();
150        rsnContextBindProgramStore(mContext, pfs);
151    }
152    native void rsnContextBindProgramFragment(int con, int pf);
153    synchronized void nContextBindProgramFragment(int pf) {
154        validate();
155        rsnContextBindProgramFragment(mContext, pf);
156    }
157    native void rsnContextBindProgramVertex(int con, int pv);
158    synchronized void nContextBindProgramVertex(int pv) {
159        validate();
160        rsnContextBindProgramVertex(mContext, pv);
161    }
162    native void rsnContextBindProgramRaster(int con, int pr);
163    synchronized void nContextBindProgramRaster(int pr) {
164        validate();
165        rsnContextBindProgramRaster(mContext, pr);
166    }
167    native void rsnContextPause(int con);
168    synchronized void nContextPause() {
169        validate();
170        rsnContextPause(mContext);
171    }
172    native void rsnContextResume(int con);
173    synchronized void nContextResume() {
174        validate();
175        rsnContextResume(mContext);
176    }
177
178    native void rsnAssignName(int con, int obj, byte[] name);
179    synchronized void nAssignName(int obj, byte[] name) {
180        validate();
181        rsnAssignName(mContext, obj, name);
182    }
183    native String rsnGetName(int con, int obj);
184    synchronized String nGetName(int obj) {
185        validate();
186        return rsnGetName(mContext, obj);
187    }
188    native void rsnObjDestroy(int con, int id);
189    synchronized void nObjDestroy(int id) {
190        // There is a race condition here.  The calling code may be run
191        // by the gc while teardown is occuring.  This protects againts
192        // deleting dead objects.
193        if (mContext != 0) {
194            rsnObjDestroy(mContext, id);
195        }
196    }
197
198    native int  rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize);
199    synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) {
200        validate();
201        return rsnElementCreate(mContext, type, kind, norm, vecSize);
202    }
203    native int  rsnElementCreate2(int con, int[] elements, String[] names, int[] arraySizes);
204    synchronized int nElementCreate2(int[] elements, String[] names, int[] arraySizes) {
205        validate();
206        return rsnElementCreate2(mContext, elements, names, arraySizes);
207    }
208    native void rsnElementGetNativeData(int con, int id, int[] elementData);
209    synchronized void nElementGetNativeData(int id, int[] elementData) {
210        validate();
211        rsnElementGetNativeData(mContext, id, elementData);
212    }
213    native void rsnElementGetSubElements(int con, int id, int[] IDs, String[] names);
214    synchronized void nElementGetSubElements(int id, int[] IDs, String[] names) {
215        validate();
216        rsnElementGetSubElements(mContext, id, IDs, names);
217    }
218
219    native int rsnTypeCreate(int con, int eid, int x, int y, int z, boolean mips, boolean faces);
220    synchronized int nTypeCreate(int eid, int x, int y, int z, boolean mips, boolean faces) {
221        validate();
222        return rsnTypeCreate(mContext, eid, x, y, z, mips, faces);
223    }
224    native void rsnTypeGetNativeData(int con, int id, int[] typeData);
225    synchronized void nTypeGetNativeData(int id, int[] typeData) {
226        validate();
227        rsnTypeGetNativeData(mContext, id, typeData);
228    }
229
230    native int  rsnAllocationCreateTyped(int con, int type, int mip, int usage);
231    synchronized int nAllocationCreateTyped(int type, int mip, int usage) {
232        validate();
233        return rsnAllocationCreateTyped(mContext, type, mip, usage);
234    }
235    native int  rsnAllocationCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
236    synchronized int nAllocationCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
237        validate();
238        return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
239    }
240    native int  rsnAllocationCubeCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
241    synchronized int nAllocationCubeCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
242        validate();
243        return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
244    }
245    native int  rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp);
246    synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) {
247        validate();
248        return rsnAllocationCreateBitmapRef(mContext, type, bmp);
249    }
250    native int  rsnAllocationCreateFromAssetStream(int con, int mips, int assetStream, int usage);
251    synchronized int nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
252        validate();
253        return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
254    }
255
256    native void  rsnAllocationCopyToBitmap(int con, int alloc, Bitmap bmp);
257    synchronized void nAllocationCopyToBitmap(int alloc, Bitmap bmp) {
258        validate();
259        rsnAllocationCopyToBitmap(mContext, alloc, bmp);
260    }
261
262
263    native void rsnAllocationSyncAll(int con, int alloc, int src);
264    synchronized void nAllocationSyncAll(int alloc, int src) {
265        validate();
266        rsnAllocationSyncAll(mContext, alloc, src);
267    }
268    native void rsnAllocationGenerateMipmaps(int con, int alloc);
269    synchronized void nAllocationGenerateMipmaps(int alloc) {
270        validate();
271        rsnAllocationGenerateMipmaps(mContext, alloc);
272    }
273    native void  rsnAllocationCopyFromBitmap(int con, int alloc, Bitmap bmp);
274    synchronized void nAllocationCopyFromBitmap(int alloc, Bitmap bmp) {
275        validate();
276        rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
277    }
278
279
280    native void rsnAllocationData1D(int con, int id, int off, int mip, int count, int[] d, int sizeBytes);
281    synchronized void nAllocationData1D(int id, int off, int mip, int count, int[] d, int sizeBytes) {
282        validate();
283        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
284    }
285    native void rsnAllocationData1D(int con, int id, int off, int mip, int count, short[] d, int sizeBytes);
286    synchronized void nAllocationData1D(int id, int off, int mip, int count, short[] d, int sizeBytes) {
287        validate();
288        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
289    }
290    native void rsnAllocationData1D(int con, int id, int off, int mip, int count, byte[] d, int sizeBytes);
291    synchronized void nAllocationData1D(int id, int off, int mip, int count, byte[] d, int sizeBytes) {
292        validate();
293        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
294    }
295    native void rsnAllocationData1D(int con, int id, int off, int mip, int count, float[] d, int sizeBytes);
296    synchronized void nAllocationData1D(int id, int off, int mip, int count, float[] d, int sizeBytes) {
297        validate();
298        rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
299    }
300
301    native void rsnAllocationElementData1D(int con, int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes);
302    synchronized void nAllocationElementData1D(int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes) {
303        validate();
304        rsnAllocationElementData1D(mContext, id, xoff, mip, compIdx, d, sizeBytes);
305    }
306
307    native void rsnAllocationData2D(int con,
308                                    int dstAlloc, int dstXoff, int dstYoff,
309                                    int dstMip, int dstFace,
310                                    int width, int height,
311                                    int srcAlloc, int srcXoff, int srcYoff,
312                                    int srcMip, int srcFace);
313    synchronized void nAllocationData2D(int dstAlloc, int dstXoff, int dstYoff,
314                                        int dstMip, int dstFace,
315                                        int width, int height,
316                                        int srcAlloc, int srcXoff, int srcYoff,
317                                        int srcMip, int srcFace) {
318        validate();
319        rsnAllocationData2D(mContext,
320                            dstAlloc, dstXoff, dstYoff,
321                            dstMip, dstFace,
322                            width, height,
323                            srcAlloc, srcXoff, srcYoff,
324                            srcMip, srcFace);
325    }
326
327    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes);
328    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes) {
329        validate();
330        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
331    }
332    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes);
333    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes) {
334        validate();
335        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
336    }
337    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes);
338    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes) {
339        validate();
340        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
341    }
342    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes);
343    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes) {
344        validate();
345        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
346    }
347    native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, Bitmap b);
348    synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, Bitmap b) {
349        validate();
350        rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
351    }
352
353    native void rsnAllocationRead(int con, int id, byte[] d);
354    synchronized void nAllocationRead(int id, byte[] d) {
355        validate();
356        rsnAllocationRead(mContext, id, d);
357    }
358    native void rsnAllocationRead(int con, int id, short[] d);
359    synchronized void nAllocationRead(int id, short[] d) {
360        validate();
361        rsnAllocationRead(mContext, id, d);
362    }
363    native void rsnAllocationRead(int con, int id, int[] d);
364    synchronized void nAllocationRead(int id, int[] d) {
365        validate();
366        rsnAllocationRead(mContext, id, d);
367    }
368    native void rsnAllocationRead(int con, int id, float[] d);
369    synchronized void nAllocationRead(int id, float[] d) {
370        validate();
371        rsnAllocationRead(mContext, id, d);
372    }
373    native int  rsnAllocationGetType(int con, int id);
374    synchronized int nAllocationGetType(int id) {
375        validate();
376        return rsnAllocationGetType(mContext, id);
377    }
378
379    native void rsnAllocationResize1D(int con, int id, int dimX);
380    synchronized void nAllocationResize1D(int id, int dimX) {
381        validate();
382        rsnAllocationResize1D(mContext, id, dimX);
383    }
384    native void rsnAllocationResize2D(int con, int id, int dimX, int dimY);
385    synchronized void nAllocationResize2D(int id, int dimX, int dimY) {
386        validate();
387        rsnAllocationResize2D(mContext, id, dimX, dimY);
388    }
389
390    native int  rsnFileA3DCreateFromAssetStream(int con, int assetStream);
391    synchronized int nFileA3DCreateFromAssetStream(int assetStream) {
392        validate();
393        return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
394    }
395    native int  rsnFileA3DCreateFromFile(int con, String path);
396    synchronized int nFileA3DCreateFromFile(String path) {
397        validate();
398        return rsnFileA3DCreateFromFile(mContext, path);
399    }
400    native int  rsnFileA3DCreateFromAsset(int con, AssetManager mgr, String path);
401    synchronized int nFileA3DCreateFromAsset(AssetManager mgr, String path) {
402        validate();
403        return rsnFileA3DCreateFromAsset(mContext, mgr, path);
404    }
405    native int  rsnFileA3DGetNumIndexEntries(int con, int fileA3D);
406    synchronized int nFileA3DGetNumIndexEntries(int fileA3D) {
407        validate();
408        return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
409    }
410    native void rsnFileA3DGetIndexEntries(int con, int fileA3D, int numEntries, int[] IDs, String[] names);
411    synchronized void nFileA3DGetIndexEntries(int fileA3D, int numEntries, int[] IDs, String[] names) {
412        validate();
413        rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
414    }
415    native int  rsnFileA3DGetEntryByIndex(int con, int fileA3D, int index);
416    synchronized int nFileA3DGetEntryByIndex(int fileA3D, int index) {
417        validate();
418        return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
419    }
420
421    native int  rsnFontCreateFromFile(int con, String fileName, float size, int dpi);
422    synchronized int nFontCreateFromFile(String fileName, float size, int dpi) {
423        validate();
424        return rsnFontCreateFromFile(mContext, fileName, size, dpi);
425    }
426    native int  rsnFontCreateFromAssetStream(int con, String name, float size, int dpi, int assetStream);
427    synchronized int nFontCreateFromAssetStream(String name, float size, int dpi, int assetStream) {
428        validate();
429        return rsnFontCreateFromAssetStream(mContext, name, size, dpi, assetStream);
430    }
431    native int  rsnFontCreateFromAsset(int con, AssetManager mgr, String path, float size, int dpi);
432    synchronized int nFontCreateFromAsset(AssetManager mgr, String path, float size, int dpi) {
433        validate();
434        return rsnFontCreateFromAsset(mContext, mgr, path, size, dpi);
435    }
436
437
438    native void rsnScriptBindAllocation(int con, int script, int alloc, int slot);
439    synchronized void nScriptBindAllocation(int script, int alloc, int slot) {
440        validate();
441        rsnScriptBindAllocation(mContext, script, alloc, slot);
442    }
443    native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone);
444    synchronized void nScriptSetTimeZone(int script, byte[] timeZone) {
445        validate();
446        rsnScriptSetTimeZone(mContext, script, timeZone);
447    }
448    native void rsnScriptInvoke(int con, int id, int slot);
449    synchronized void nScriptInvoke(int id, int slot) {
450        validate();
451        rsnScriptInvoke(mContext, id, slot);
452    }
453    native void rsnScriptForEach(int con, int id, int slot, int ain, int aout, byte[] params);
454    native void rsnScriptForEach(int con, int id, int slot, int ain, int aout);
455    synchronized void nScriptForEach(int id, int slot, int ain, int aout, byte[] params) {
456        validate();
457        if (params == null) {
458            rsnScriptForEach(mContext, id, slot, ain, aout);
459        } else {
460            rsnScriptForEach(mContext, id, slot, ain, aout, params);
461        }
462    }
463    native void rsnScriptInvokeV(int con, int id, int slot, byte[] params);
464    synchronized void nScriptInvokeV(int id, int slot, byte[] params) {
465        validate();
466        rsnScriptInvokeV(mContext, id, slot, params);
467    }
468    native void rsnScriptSetVarI(int con, int id, int slot, int val);
469    synchronized void nScriptSetVarI(int id, int slot, int val) {
470        validate();
471        rsnScriptSetVarI(mContext, id, slot, val);
472    }
473    native void rsnScriptSetVarJ(int con, int id, int slot, long val);
474    synchronized void nScriptSetVarJ(int id, int slot, long val) {
475        validate();
476        rsnScriptSetVarJ(mContext, id, slot, val);
477    }
478    native void rsnScriptSetVarF(int con, int id, int slot, float val);
479    synchronized void nScriptSetVarF(int id, int slot, float val) {
480        validate();
481        rsnScriptSetVarF(mContext, id, slot, val);
482    }
483    native void rsnScriptSetVarD(int con, int id, int slot, double val);
484    synchronized void nScriptSetVarD(int id, int slot, double val) {
485        validate();
486        rsnScriptSetVarD(mContext, id, slot, val);
487    }
488    native void rsnScriptSetVarV(int con, int id, int slot, byte[] val);
489    synchronized void nScriptSetVarV(int id, int slot, byte[] val) {
490        validate();
491        rsnScriptSetVarV(mContext, id, slot, val);
492    }
493    native void rsnScriptSetVarObj(int con, int id, int slot, int val);
494    synchronized void nScriptSetVarObj(int id, int slot, int val) {
495        validate();
496        rsnScriptSetVarObj(mContext, id, slot, val);
497    }
498
499    native int  rsnScriptCCreate(int con, String resName, String cacheDir,
500                                 byte[] script, int length);
501    synchronized int nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
502        validate();
503        return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
504    }
505
506    native int  rsnSamplerCreate(int con, int magFilter, int minFilter,
507                                 int wrapS, int wrapT, int wrapR, float aniso);
508    synchronized int nSamplerCreate(int magFilter, int minFilter,
509                                 int wrapS, int wrapT, int wrapR, float aniso) {
510        validate();
511        return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
512    }
513
514    native int  rsnProgramStoreCreate(int con, boolean r, boolean g, boolean b, boolean a,
515                                      boolean depthMask, boolean dither,
516                                      int srcMode, int dstMode, int depthFunc);
517    synchronized int nProgramStoreCreate(boolean r, boolean g, boolean b, boolean a,
518                                         boolean depthMask, boolean dither,
519                                         int srcMode, int dstMode, int depthFunc) {
520        validate();
521        return rsnProgramStoreCreate(mContext, r, g, b, a, depthMask, dither, srcMode,
522                                     dstMode, depthFunc);
523    }
524
525    native int  rsnProgramRasterCreate(int con, boolean pointSprite, int cullMode);
526    synchronized int nProgramRasterCreate(boolean pointSprite, int cullMode) {
527        validate();
528        return rsnProgramRasterCreate(mContext, pointSprite, cullMode);
529    }
530
531    native void rsnProgramBindConstants(int con, int pv, int slot, int mID);
532    synchronized void nProgramBindConstants(int pv, int slot, int mID) {
533        validate();
534        rsnProgramBindConstants(mContext, pv, slot, mID);
535    }
536    native void rsnProgramBindTexture(int con, int vpf, int slot, int a);
537    synchronized void nProgramBindTexture(int vpf, int slot, int a) {
538        validate();
539        rsnProgramBindTexture(mContext, vpf, slot, a);
540    }
541    native void rsnProgramBindSampler(int con, int vpf, int slot, int s);
542    synchronized void nProgramBindSampler(int vpf, int slot, int s) {
543        validate();
544        rsnProgramBindSampler(mContext, vpf, slot, s);
545    }
546    native int  rsnProgramFragmentCreate(int con, String shader, int[] params);
547    synchronized int nProgramFragmentCreate(String shader, int[] params) {
548        validate();
549        return rsnProgramFragmentCreate(mContext, shader, params);
550    }
551    native int  rsnProgramVertexCreate(int con, String shader, int[] params);
552    synchronized int nProgramVertexCreate(String shader, int[] params) {
553        validate();
554        return rsnProgramVertexCreate(mContext, shader, params);
555    }
556
557    native int  rsnMeshCreate(int con, int[] vtx, int[] idx, int[] prim);
558    synchronized int nMeshCreate(int[] vtx, int[] idx, int[] prim) {
559        validate();
560        return rsnMeshCreate(mContext, vtx, idx, prim);
561    }
562    native int  rsnMeshGetVertexBufferCount(int con, int id);
563    synchronized int nMeshGetVertexBufferCount(int id) {
564        validate();
565        return rsnMeshGetVertexBufferCount(mContext, id);
566    }
567    native int  rsnMeshGetIndexCount(int con, int id);
568    synchronized int nMeshGetIndexCount(int id) {
569        validate();
570        return rsnMeshGetIndexCount(mContext, id);
571    }
572    native void rsnMeshGetVertices(int con, int id, int[] vtxIds, int vtxIdCount);
573    synchronized void nMeshGetVertices(int id, int[] vtxIds, int vtxIdCount) {
574        validate();
575        rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
576    }
577    native void rsnMeshGetIndices(int con, int id, int[] idxIds, int[] primitives, int vtxIdCount);
578    synchronized void nMeshGetIndices(int id, int[] idxIds, int[] primitives, int vtxIdCount) {
579        validate();
580        rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
581    }
582
583
584    int     mDev;
585    int     mContext;
586    @SuppressWarnings({"FieldCanBeLocal"})
587    MessageThread mMessageThread;
588
589    Element mElement_U8;
590    Element mElement_I8;
591    Element mElement_U16;
592    Element mElement_I16;
593    Element mElement_U32;
594    Element mElement_I32;
595    Element mElement_U64;
596    Element mElement_I64;
597    Element mElement_F32;
598    Element mElement_F64;
599    Element mElement_BOOLEAN;
600
601    Element mElement_ELEMENT;
602    Element mElement_TYPE;
603    Element mElement_ALLOCATION;
604    Element mElement_SAMPLER;
605    Element mElement_SCRIPT;
606    Element mElement_MESH;
607    Element mElement_PROGRAM_FRAGMENT;
608    Element mElement_PROGRAM_VERTEX;
609    Element mElement_PROGRAM_RASTER;
610    Element mElement_PROGRAM_STORE;
611
612    Element mElement_A_8;
613    Element mElement_RGB_565;
614    Element mElement_RGB_888;
615    Element mElement_RGBA_5551;
616    Element mElement_RGBA_4444;
617    Element mElement_RGBA_8888;
618
619    Element mElement_FLOAT_2;
620    Element mElement_FLOAT_3;
621    Element mElement_FLOAT_4;
622
623    Element mElement_DOUBLE_2;
624    Element mElement_DOUBLE_3;
625    Element mElement_DOUBLE_4;
626
627    Element mElement_UCHAR_2;
628    Element mElement_UCHAR_3;
629    Element mElement_UCHAR_4;
630
631    Element mElement_CHAR_2;
632    Element mElement_CHAR_3;
633    Element mElement_CHAR_4;
634
635    Element mElement_USHORT_2;
636    Element mElement_USHORT_3;
637    Element mElement_USHORT_4;
638
639    Element mElement_SHORT_2;
640    Element mElement_SHORT_3;
641    Element mElement_SHORT_4;
642
643    Element mElement_UINT_2;
644    Element mElement_UINT_3;
645    Element mElement_UINT_4;
646
647    Element mElement_INT_2;
648    Element mElement_INT_3;
649    Element mElement_INT_4;
650
651    Element mElement_ULONG_2;
652    Element mElement_ULONG_3;
653    Element mElement_ULONG_4;
654
655    Element mElement_LONG_2;
656    Element mElement_LONG_3;
657    Element mElement_LONG_4;
658
659    Element mElement_MATRIX_4X4;
660    Element mElement_MATRIX_3X3;
661    Element mElement_MATRIX_2X2;
662
663    Sampler mSampler_CLAMP_NEAREST;
664    Sampler mSampler_CLAMP_LINEAR;
665    Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
666    Sampler mSampler_WRAP_NEAREST;
667    Sampler mSampler_WRAP_LINEAR;
668    Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
669
670    ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
671    ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
672    ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
673    ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
674
675    ProgramRaster mProgramRaster_CULL_BACK;
676    ProgramRaster mProgramRaster_CULL_FRONT;
677    ProgramRaster mProgramRaster_CULL_NONE;
678
679    ///////////////////////////////////////////////////////////////////////////////////
680    //
681
682    /**
683     * Base class application should derive from for handling RS messages
684     * coming from their scripts.  When a script calls sendToClient the data
685     * fields will be filled in and then the run method called by a message
686     * handling thread.  This will occur some time after sendToClient completes
687     * in the script.
688     *
689     */
690    public static class RSMessageHandler implements Runnable {
691        protected int[] mData;
692        protected int mID;
693        protected int mLength;
694        public void run() {
695        }
696    }
697    /**
698     * If an application is expecting messages it should set this field to an
699     * instance of RSMessage.  This instance will receive all the user messages
700     * sent from sendToClient by scripts from this context.
701     *
702     */
703    RSMessageHandler mMessageCallback = null;
704
705    public void setMessageHandler(RSMessageHandler msg) {
706        mMessageCallback = msg;
707    }
708    public RSMessageHandler getMessageHandler() {
709        return mMessageCallback;
710    }
711
712    /**
713     * Runtime error base class.  An application should derive from this class
714     * if it wishes to install an error handler.  When errors occur at runtime
715     * the fields in this class will be filled and the run method called.
716     *
717     */
718    public static class RSErrorHandler implements Runnable {
719        protected String mErrorMessage;
720        protected int mErrorNum;
721        public void run() {
722        }
723    }
724
725    /**
726     * Application Error handler.  All runtime errors will be dispatched to the
727     * instance of RSAsyncError set here.  If this field is null a
728     * RSRuntimeException will instead be thrown with details about the error.
729     * This will cause program termaination.
730     *
731     */
732    RSErrorHandler mErrorCallback = null;
733
734    public void setErrorHandler(RSErrorHandler msg) {
735        mErrorCallback = msg;
736    }
737    public RSErrorHandler getErrorHandler() {
738        return mErrorCallback;
739    }
740
741    /**
742     * RenderScript worker threads priority enumeration.  The default value is
743     * NORMAL.  Applications wishing to do background processing such as
744     * wallpapers should set their priority to LOW to avoid starving forground
745     * processes.
746     */
747    public enum Priority {
748        LOW (Process.THREAD_PRIORITY_BACKGROUND + (5 * Process.THREAD_PRIORITY_LESS_FAVORABLE)),
749        NORMAL (Process.THREAD_PRIORITY_DISPLAY);
750
751        int mID;
752        Priority(int id) {
753            mID = id;
754        }
755    }
756
757    void validate() {
758        if (mContext == 0) {
759            throw new RSInvalidStateException("Calling RS with no Context active.");
760        }
761    }
762
763
764    /**
765     * Change the priority of the worker threads for this context.
766     *
767     * @param p New priority to be set.
768     */
769    public void setPriority(Priority p) {
770        validate();
771        nContextSetPriority(p.mID);
772    }
773
774    static class MessageThread extends Thread {
775        RenderScript mRS;
776        boolean mRun = true;
777        int[] mAuxData = new int[2];
778
779        static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
780        static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
781        static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
782        static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
783        static final int RS_MESSAGE_TO_CLIENT_USER = 4;
784
785        static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
786
787        MessageThread(RenderScript rs) {
788            super("RSMessageThread");
789            mRS = rs;
790
791        }
792
793        public void run() {
794            // This function is a temporary solution.  The final solution will
795            // used typed allocations where the message id is the type indicator.
796            int[] rbuf = new int[16];
797            mRS.nContextInitToClient(mRS.mContext);
798            while(mRun) {
799                rbuf[0] = 0;
800                int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
801                int size = mAuxData[1];
802                int subID = mAuxData[0];
803
804                if (msg == RS_MESSAGE_TO_CLIENT_USER) {
805                    if ((size>>2) >= rbuf.length) {
806                        rbuf = new int[(size + 3) >> 2];
807                    }
808                    if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
809                        RS_MESSAGE_TO_CLIENT_USER) {
810                        throw new RSDriverException("Error processing message from Renderscript.");
811                    }
812
813                    if(mRS.mMessageCallback != null) {
814                        mRS.mMessageCallback.mData = rbuf;
815                        mRS.mMessageCallback.mID = subID;
816                        mRS.mMessageCallback.mLength = size;
817                        mRS.mMessageCallback.run();
818                    } else {
819                        throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
820                    }
821                    continue;
822                }
823
824                if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
825                    String e = mRS.nContextGetErrorMessage(mRS.mContext);
826
827                    if (subID >= RS_ERROR_FATAL_UNKNOWN) {
828                        throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
829                    }
830
831                    if(mRS.mErrorCallback != null) {
832                        mRS.mErrorCallback.mErrorMessage = e;
833                        mRS.mErrorCallback.mErrorNum = subID;
834                        mRS.mErrorCallback.run();
835                    } else {
836                        //throw new RSRuntimeException("Received error num " + subID + ", details: " + e);
837                    }
838                    continue;
839                }
840
841                // 2: teardown.
842                // But we want to avoid starving other threads during
843                // teardown by yielding until the next line in the destructor
844                // can execute to set mRun = false
845                try {
846                    sleep(1, 0);
847                } catch(InterruptedException e) {
848                }
849            }
850            Log.d(LOG_TAG, "MessageThread exiting.");
851        }
852    }
853
854    RenderScript(Context ctx) {
855        mApplicationContext = ctx.getApplicationContext();
856    }
857
858    /**
859     * Gets the application context associated with the RenderScript context.
860     *
861     * @return The application context.
862     */
863    public final Context getApplicationContext() {
864        return mApplicationContext;
865    }
866
867    static int getTargetSdkVersion(Context ctx) {
868        return ctx.getApplicationInfo().targetSdkVersion;
869    }
870
871    /**
872     * Create a basic RenderScript context.
873     *
874     * @param ctx The context.
875     * @return RenderScript
876     */
877    public static RenderScript create(Context ctx) {
878        RenderScript rs = new RenderScript(ctx);
879
880        int sdkVersion = getTargetSdkVersion(ctx);
881
882        rs.mDev = rs.nDeviceCreate();
883        rs.mContext = rs.nContextCreate(rs.mDev, 0, sdkVersion);
884        if (rs.mContext == 0) {
885            throw new RSDriverException("Failed to create RS context.");
886        }
887        rs.mMessageThread = new MessageThread(rs);
888        rs.mMessageThread.start();
889        return rs;
890    }
891
892    /**
893     * Print the currently available debugging information about the state of
894     * the RS context to the log.
895     *
896     */
897    public void contextDump() {
898        validate();
899        nContextDump(0);
900    }
901
902    /**
903     * Wait for any commands in the fifo between the java bindings and native to
904     * be processed.
905     *
906     */
907    public void finish() {
908        nContextFinish();
909    }
910
911    /**
912     * Destroy this renderscript context.  Once this function is called its no
913     * longer legal to use this or any objects created by this context.
914     *
915     */
916    public void destroy() {
917        validate();
918        nContextDeinitToClient(mContext);
919        mMessageThread.mRun = false;
920        try {
921            mMessageThread.join();
922        } catch(InterruptedException e) {
923        }
924
925        nContextDestroy();
926        mContext = 0;
927
928        nDeviceDestroy(mDev);
929        mDev = 0;
930    }
931
932    boolean isAlive() {
933        return mContext != 0;
934    }
935
936    int safeID(BaseObj o) {
937        if(o != null) {
938            return o.getID();
939        }
940        return 0;
941    }
942}
943