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