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