RenderScript.java revision 67f2e442a31b8395e3c1951f8e91139ec7f2be99
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.graphics.Bitmap;
22import android.graphics.BitmapFactory;
23import android.util.Config;
24import android.util.Log;
25import android.view.Surface;
26
27
28/**
29 * @hide
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    protected static final boolean DEBUG  = false;
42    @SuppressWarnings({"UnusedDeclaration", "deprecation"})
43    protected static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
44
45
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    protected static boolean sInitialized;
53    native protected 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.d(LOG_TAG, "RenderScript JNI library not found!");
64        }
65    }
66
67    // Non-threadsafe functions.
68    native void nInitElements(int a8, int rgba4444, int rgba8888, int rgb565);
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);
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) {
93        return rsnContextCreateGL(dev, ver, colorMin, colorPref,
94                                  alphaMin, alphaPref, depthMin, depthPref,
95                                  stencilMin, stencilPref,
96                                  samplesMin, samplesPref, samplesQ);
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        rsnContextDestroy(mContext);
105    }
106    native void rsnContextSetSurface(int con, int w, int h, Surface sur);
107    synchronized void nContextSetSurface(int w, int h, Surface sur) {
108        rsnContextSetSurface(mContext, w, h, sur);
109    }
110    native void rsnContextSetPriority(int con, int p);
111    synchronized void nContextSetPriority(int p) {
112        rsnContextSetPriority(mContext, p);
113    }
114    native void rsnContextDump(int con, int bits);
115    synchronized void nContextDump(int bits) {
116        rsnContextDump(mContext, bits);
117    }
118    native void rsnContextFinish(int con);
119    synchronized void nContextFinish() {
120        rsnContextFinish(mContext);
121    }
122
123    native void rsnContextBindRootScript(int con, int script);
124    synchronized void nContextBindRootScript(int script) {
125        rsnContextBindRootScript(mContext, script);
126    }
127    native void rsnContextBindSampler(int con, int sampler, int slot);
128    synchronized void nContextBindSampler(int sampler, int slot) {
129        rsnContextBindSampler(mContext, sampler, slot);
130    }
131    native void rsnContextBindProgramStore(int con, int pfs);
132    synchronized void nContextBindProgramStore(int pfs) {
133        rsnContextBindProgramStore(mContext, pfs);
134    }
135    native void rsnContextBindProgramFragment(int con, int pf);
136    synchronized void nContextBindProgramFragment(int pf) {
137        rsnContextBindProgramFragment(mContext, pf);
138    }
139    native void rsnContextBindProgramVertex(int con, int pv);
140    synchronized void nContextBindProgramVertex(int pv) {
141        rsnContextBindProgramVertex(mContext, pv);
142    }
143    native void rsnContextBindProgramRaster(int con, int pr);
144    synchronized void nContextBindProgramRaster(int pr) {
145        rsnContextBindProgramRaster(mContext, pr);
146    }
147    native void rsnContextPause(int con);
148    synchronized void nContextPause() {
149        rsnContextPause(mContext);
150    }
151    native void rsnContextResume(int con);
152    synchronized void nContextResume() {
153        rsnContextResume(mContext);
154    }
155
156    native void rsnAssignName(int con, int obj, byte[] name);
157    synchronized void nAssignName(int obj, byte[] name) {
158        rsnAssignName(mContext, obj, name);
159    }
160    native String rsnGetName(int con, int obj);
161    synchronized String nGetName(int obj) {
162        return rsnGetName(mContext, obj);
163    }
164    native void rsnObjDestroy(int con, int id);
165    synchronized void nObjDestroy(int id) {
166        rsnObjDestroy(mContext, id);
167    }
168
169    native int  rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize);
170    synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) {
171        return rsnElementCreate(mContext, type, kind, norm, vecSize);
172    }
173    native int  rsnElementCreate2(int con, int[] elements, String[] names, int[] arraySizes);
174    synchronized int nElementCreate2(int[] elements, String[] names, int[] arraySizes) {
175        return rsnElementCreate2(mContext, elements, names, arraySizes);
176    }
177    native void rsnElementGetNativeData(int con, int id, int[] elementData);
178    synchronized void nElementGetNativeData(int id, int[] elementData) {
179        rsnElementGetNativeData(mContext, id, elementData);
180    }
181    native void rsnElementGetSubElements(int con, int id, int[] IDs, String[] names);
182    synchronized void nElementGetSubElements(int id, int[] IDs, String[] names) {
183        rsnElementGetSubElements(mContext, id, IDs, names);
184    }
185
186    native int rsnTypeCreate(int con, int eid, int[] dims, int[] vals);
187    synchronized int nTypeCreate(int eid, int[] dims, int[] vals) {
188        return rsnTypeCreate(mContext, eid, dims, vals);
189    }
190    native void rsnTypeGetNativeData(int con, int id, int[] typeData);
191    synchronized void nTypeGetNativeData(int id, int[] typeData) {
192        rsnTypeGetNativeData(mContext, id, typeData);
193    }
194
195    native int  rsnAllocationCreateTyped(int con, int type);
196    synchronized int nAllocationCreateTyped(int type) {
197        return rsnAllocationCreateTyped(mContext, type);
198    }
199    native void  rsnAllocationUpdateFromBitmap(int con, int alloc, Bitmap bmp);
200    synchronized void nAllocationUpdateFromBitmap(int alloc, Bitmap bmp) {
201        rsnAllocationUpdateFromBitmap(mContext, alloc, bmp);
202    }
203    native int  rsnAllocationCreateFromBitmap(int con, int dstFmt, boolean genMips, Bitmap bmp);
204    synchronized int nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp) {
205        return rsnAllocationCreateFromBitmap(mContext, dstFmt, genMips, bmp);
206    }
207    native int  rsnAllocationCubeCreateFromBitmap(int con, int dstFmt, boolean genMips, Bitmap bmp);
208    synchronized int nAllocationCubeCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp) {
209        return rsnAllocationCubeCreateFromBitmap(mContext, dstFmt, genMips, bmp);
210    }
211    native int  rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp);
212    synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) {
213        return rsnAllocationCreateBitmapRef(mContext, type, bmp);
214    }
215    native int  rsnAllocationCreateFromAssetStream(int con, int dstFmt, boolean genMips, int assetStream);
216    synchronized int nAllocationCreateFromAssetStream(int dstFmt, boolean genMips, int assetStream) {
217        return rsnAllocationCreateFromAssetStream(mContext, dstFmt, genMips, assetStream);
218    }
219
220    native void rsnAllocationUploadToTexture(int con, int alloc, boolean genMips, int baseMioLevel);
221    synchronized void nAllocationUploadToTexture(int alloc, boolean genMips, int baseMioLevel) {
222        rsnAllocationUploadToTexture(mContext, alloc, genMips, baseMioLevel);
223    }
224    native void rsnAllocationUploadToBufferObject(int con, int alloc);
225    synchronized void nAllocationUploadToBufferObject(int alloc) {
226        rsnAllocationUploadToBufferObject(mContext, alloc);
227    }
228
229    native void rsnAllocationSubData1D(int con, int id, int off, int count, int[] d, int sizeBytes);
230    synchronized void nAllocationSubData1D(int id, int off, int count, int[] d, int sizeBytes) {
231        rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
232    }
233    native void rsnAllocationSubData1D(int con, int id, int off, int count, short[] d, int sizeBytes);
234    synchronized void nAllocationSubData1D(int id, int off, int count, short[] d, int sizeBytes) {
235        rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
236    }
237    native void rsnAllocationSubData1D(int con, int id, int off, int count, byte[] d, int sizeBytes);
238    synchronized void nAllocationSubData1D(int id, int off, int count, byte[] d, int sizeBytes) {
239        rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
240    }
241    native void rsnAllocationSubElementData1D(int con, int id, int xoff, int compIdx, byte[] d, int sizeBytes);
242    synchronized void nAllocationSubElementData1D(int id, int xoff, int compIdx, byte[] d, int sizeBytes) {
243        rsnAllocationSubElementData1D(mContext, id, xoff, compIdx, d, sizeBytes);
244    }
245    native void rsnAllocationSubData1D(int con, int id, int off, int count, float[] d, int sizeBytes);
246    synchronized void nAllocationSubData1D(int id, int off, int count, float[] d, int sizeBytes) {
247        rsnAllocationSubData1D(mContext, id, off, count, d, sizeBytes);
248    }
249
250    native void rsnAllocationSubData2D(int con, int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes);
251    synchronized void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes) {
252        rsnAllocationSubData2D(mContext, id, xoff, yoff, w, h, d, sizeBytes);
253    }
254    native void rsnAllocationSubData2D(int con, int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes);
255    synchronized void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes) {
256        rsnAllocationSubData2D(mContext, id, xoff, yoff, w, h, d, sizeBytes);
257    }
258    native void rsnAllocationRead(int con, int id, int[] d);
259    synchronized void nAllocationRead(int id, int[] d) {
260        rsnAllocationRead(mContext, id, d);
261    }
262    native void rsnAllocationRead(int con, int id, float[] d);
263    synchronized void nAllocationRead(int id, float[] d) {
264        rsnAllocationRead(mContext, id, d);
265    }
266    native int  rsnAllocationGetType(int con, int id);
267    synchronized int nAllocationGetType(int id) {
268        return rsnAllocationGetType(mContext, id);
269    }
270
271    native void rsnAllocationResize1D(int con, int id, int dimX);
272    synchronized void nAllocationResize1D(int id, int dimX) {
273        rsnAllocationResize1D(mContext, id, dimX);
274    }
275    native void rsnAllocationResize2D(int con, int id, int dimX, int dimY);
276    synchronized void nAllocationResize2D(int id, int dimX, int dimY) {
277        rsnAllocationResize2D(mContext, id, dimX, dimY);
278    }
279
280    native int  rsnFileA3DCreateFromAssetStream(int con, int assetStream);
281    synchronized int nFileA3DCreateFromAssetStream(int assetStream) {
282        return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
283    }
284    native int  rsnFileA3DGetNumIndexEntries(int con, int fileA3D);
285    synchronized int nFileA3DGetNumIndexEntries(int fileA3D) {
286        return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
287    }
288    native void rsnFileA3DGetIndexEntries(int con, int fileA3D, int numEntries, int[] IDs, String[] names);
289    synchronized void nFileA3DGetIndexEntries(int fileA3D, int numEntries, int[] IDs, String[] names) {
290        rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
291    }
292    native int  rsnFileA3DGetEntryByIndex(int con, int fileA3D, int index);
293    synchronized int nFileA3DGetEntryByIndex(int fileA3D, int index) {
294        return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
295    }
296
297    native int  rsnFontCreateFromFile(int con, String fileName, int size, int dpi);
298    synchronized int nFontCreateFromFile(String fileName, int size, int dpi) {
299        return rsnFontCreateFromFile(mContext, fileName, size, dpi);
300    }
301
302    native void rsnAdapter1DBindAllocation(int con, int ad, int alloc);
303    synchronized void nAdapter1DBindAllocation(int ad, int alloc) {
304        rsnAdapter1DBindAllocation(mContext, ad, alloc);
305    }
306    native void rsnAdapter1DSetConstraint(int con, int ad, int dim, int value);
307    synchronized void nAdapter1DSetConstraint(int ad, int dim, int value) {
308        rsnAdapter1DSetConstraint(mContext, ad, dim, value);
309    }
310    native void rsnAdapter1DData(int con, int ad, int[] d);
311    synchronized void nAdapter1DData(int ad, int[] d) {
312        rsnAdapter1DData(mContext, ad, d);
313    }
314    native void rsnAdapter1DData(int con, int ad, float[] d);
315    synchronized void nAdapter1DData(int ad, float[] d) {
316        rsnAdapter1DData(mContext, ad, d);
317    }
318    native void rsnAdapter1DSubData(int con, int ad, int off, int count, int[] d);
319    synchronized void nAdapter1DSubData(int ad, int off, int count, int[] d) {
320        rsnAdapter1DSubData(mContext, ad, off, count, d);
321    }
322    native void rsnAdapter1DSubData(int con, int ad, int off, int count, float[] d);
323    synchronized void nAdapter1DSubData(int ad, int off, int count, float[] d) {
324        rsnAdapter1DSubData(mContext, ad, off, count, d);
325    }
326    native int  rsnAdapter1DCreate(int con);
327    synchronized int nAdapter1DCreate() {
328        return rsnAdapter1DCreate(mContext);
329    }
330
331    native void rsnAdapter2DBindAllocation(int con, int ad, int alloc);
332    synchronized void nAdapter2DBindAllocation(int ad, int alloc) {
333        rsnAdapter2DBindAllocation(mContext, ad, alloc);
334    }
335    native void rsnAdapter2DSetConstraint(int con, int ad, int dim, int value);
336    synchronized void nAdapter2DSetConstraint(int ad, int dim, int value) {
337        rsnAdapter2DSetConstraint(mContext, ad, dim, value);
338    }
339    native void rsnAdapter2DData(int con, int ad, int[] d);
340    synchronized void nAdapter2DData(int ad, int[] d) {
341        rsnAdapter2DData(mContext, ad, d);
342    }
343    native void rsnAdapter2DData(int con, int ad, float[] d);
344    synchronized void nAdapter2DData(int ad, float[] d) {
345        rsnAdapter2DData(mContext, ad, d);
346    }
347    native void rsnAdapter2DSubData(int con, int ad, int xoff, int yoff, int w, int h, int[] d);
348    synchronized void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, int[] d) {
349        rsnAdapter2DSubData(mContext, ad, xoff, yoff, w, h, d);
350    }
351    native void rsnAdapter2DSubData(int con, int ad, int xoff, int yoff, int w, int h, float[] d);
352    synchronized void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d) {
353        rsnAdapter2DSubData(mContext, ad, xoff, yoff, w, h, d);
354    }
355    native int  rsnAdapter2DCreate(int con);
356    synchronized int nAdapter2DCreate() {
357        return rsnAdapter2DCreate(mContext);
358    }
359
360    native void rsnScriptBindAllocation(int con, int script, int alloc, int slot);
361    synchronized void nScriptBindAllocation(int script, int alloc, int slot) {
362        rsnScriptBindAllocation(mContext, script, alloc, slot);
363    }
364    native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone);
365    synchronized void nScriptSetTimeZone(int script, byte[] timeZone) {
366        rsnScriptSetTimeZone(mContext, script, timeZone);
367    }
368    native void rsnScriptInvoke(int con, int id, int slot);
369    synchronized void nScriptInvoke(int id, int slot) {
370        rsnScriptInvoke(mContext, id, slot);
371    }
372    native void rsnScriptInvokeV(int con, int id, int slot, byte[] params);
373    synchronized void nScriptInvokeV(int id, int slot, byte[] params) {
374        rsnScriptInvokeV(mContext, id, slot, params);
375    }
376    native void rsnScriptSetVarI(int con, int id, int slot, int val);
377    synchronized void nScriptSetVarI(int id, int slot, int val) {
378        rsnScriptSetVarI(mContext, id, slot, val);
379    }
380    native void rsnScriptSetVarJ(int con, int id, int slot, long val);
381    synchronized void nScriptSetVarJ(int id, int slot, long val) {
382        rsnScriptSetVarJ(mContext, id, slot, val);
383    }
384    native void rsnScriptSetVarF(int con, int id, int slot, float val);
385    synchronized void nScriptSetVarF(int id, int slot, float val) {
386        rsnScriptSetVarF(mContext, id, slot, val);
387    }
388    native void rsnScriptSetVarD(int con, int id, int slot, double val);
389    synchronized void nScriptSetVarD(int id, int slot, double val) {
390        rsnScriptSetVarD(mContext, id, slot, val);
391    }
392    native void rsnScriptSetVarV(int con, int id, int slot, byte[] val);
393    synchronized void nScriptSetVarV(int id, int slot, byte[] val) {
394        rsnScriptSetVarV(mContext, id, slot, val);
395    }
396    native void rsnScriptSetVarObj(int con, int id, int slot, int val);
397    synchronized void nScriptSetVarObj(int id, int slot, int val) {
398        rsnScriptSetVarObj(mContext, id, slot, val);
399    }
400
401    native void rsnScriptCBegin(int con);
402    synchronized void nScriptCBegin() {
403        rsnScriptCBegin(mContext);
404    }
405    native void rsnScriptCSetScript(int con, byte[] script, int offset, int length);
406    synchronized void nScriptCSetScript(byte[] script, int offset, int length) {
407        rsnScriptCSetScript(mContext, script, offset, length);
408    }
409    native int  rsnScriptCCreate(int con, String val);
410    synchronized int nScriptCCreate(String val) {
411        return rsnScriptCCreate(mContext, val);
412    }
413
414    native void rsnSamplerBegin(int con);
415    synchronized void nSamplerBegin() {
416        rsnSamplerBegin(mContext);
417    }
418    native void rsnSamplerSet(int con, int param, int value);
419    synchronized void nSamplerSet(int param, int value) {
420        rsnSamplerSet(mContext, param, value);
421    }
422    native void rsnSamplerSet2(int con, int param, float value);
423    synchronized void nSamplerSet2(int param, float value) {
424        rsnSamplerSet2(mContext, param, value);
425    }
426    native int  rsnSamplerCreate(int con);
427    synchronized int nSamplerCreate() {
428        return rsnSamplerCreate(mContext);
429    }
430
431    native void rsnProgramStoreBegin(int con, int in, int out);
432    synchronized void nProgramStoreBegin(int in, int out) {
433        rsnProgramStoreBegin(mContext, in, out);
434    }
435    native void rsnProgramStoreDepthFunc(int con, int func);
436    synchronized void nProgramStoreDepthFunc(int func) {
437        rsnProgramStoreDepthFunc(mContext, func);
438    }
439    native void rsnProgramStoreDepthMask(int con, boolean enable);
440    synchronized void nProgramStoreDepthMask(boolean enable) {
441        rsnProgramStoreDepthMask(mContext, enable);
442    }
443    native void rsnProgramStoreColorMask(int con, boolean r, boolean g, boolean b, boolean a);
444    synchronized void nProgramStoreColorMask(boolean r, boolean g, boolean b, boolean a) {
445        rsnProgramStoreColorMask(mContext, r, g, b, a);
446    }
447    native void rsnProgramStoreBlendFunc(int con, int src, int dst);
448    synchronized void nProgramStoreBlendFunc(int src, int dst) {
449        rsnProgramStoreBlendFunc(mContext, src, dst);
450    }
451    native void rsnProgramStoreDither(int con, boolean enable);
452    synchronized void nProgramStoreDither(boolean enable) {
453        rsnProgramStoreDither(mContext, enable);
454    }
455    native int  rsnProgramStoreCreate(int con);
456    synchronized int nProgramStoreCreate() {
457        return rsnProgramStoreCreate(mContext);
458    }
459
460    native int  rsnProgramRasterCreate(int con, boolean pointSmooth, boolean lineSmooth, boolean pointSprite);
461    synchronized int nProgramRasterCreate(boolean pointSmooth, boolean lineSmooth, boolean pointSprite) {
462        return rsnProgramRasterCreate(mContext, pointSmooth, lineSmooth, pointSprite);
463    }
464    native void rsnProgramRasterSetLineWidth(int con, int pr, float v);
465    synchronized void nProgramRasterSetLineWidth(int pr, float v) {
466        rsnProgramRasterSetLineWidth(mContext, pr, v);
467    }
468    native void rsnProgramRasterSetCullMode(int con, int pr, int mode);
469    synchronized void nProgramRasterSetCullMode(int pr, int mode) {
470        rsnProgramRasterSetCullMode(mContext, pr, mode);
471    }
472
473    native void rsnProgramBindConstants(int con, int pv, int slot, int mID);
474    synchronized void nProgramBindConstants(int pv, int slot, int mID) {
475        rsnProgramBindConstants(mContext, pv, slot, mID);
476    }
477    native void rsnProgramBindTexture(int con, int vpf, int slot, int a);
478    synchronized void nProgramBindTexture(int vpf, int slot, int a) {
479        rsnProgramBindTexture(mContext, vpf, slot, a);
480    }
481    native void rsnProgramBindSampler(int con, int vpf, int slot, int s);
482    synchronized void nProgramBindSampler(int vpf, int slot, int s) {
483        rsnProgramBindSampler(mContext, vpf, slot, s);
484    }
485    native int  rsnProgramFragmentCreate(int con, String shader, int[] params);
486    synchronized int nProgramFragmentCreate(String shader, int[] params) {
487        return rsnProgramFragmentCreate(mContext, shader, params);
488    }
489    native int  rsnProgramVertexCreate(int con, String shader, int[] params);
490    synchronized int nProgramVertexCreate(String shader, int[] params) {
491        return rsnProgramVertexCreate(mContext, shader, params);
492    }
493
494    native int  rsnMeshCreate(int con, int vtxCount, int indexCount);
495    synchronized int nMeshCreate(int vtxCount, int indexCount) {
496        return rsnMeshCreate(mContext, vtxCount, indexCount);
497    }
498    native void rsnMeshBindVertex(int con, int id, int alloc, int slot);
499    synchronized void nMeshBindVertex(int id, int alloc, int slot) {
500        rsnMeshBindVertex(mContext, id, alloc, slot);
501    }
502    native void rsnMeshBindIndex(int con, int id, int alloc, int prim, int slot);
503    synchronized void nMeshBindIndex(int id, int alloc, int prim, int slot) {
504        rsnMeshBindIndex(mContext, id, alloc, prim, slot);
505    }
506    native void rsnMeshInitVertexAttribs(int con, int id);
507    synchronized void nMeshInitVertexAttribs(int id) {
508        rsnMeshInitVertexAttribs(mContext, id);
509    }
510    native int  rsnMeshGetVertexBufferCount(int con, int id);
511    synchronized int nMeshGetVertexBufferCount(int id) {
512        return rsnMeshGetVertexBufferCount(mContext, id);
513    }
514    native int  rsnMeshGetIndexCount(int con, int id);
515    synchronized int nMeshGetIndexCount(int id) {
516        return rsnMeshGetIndexCount(mContext, id);
517    }
518    native void rsnMeshGetVertices(int con, int id, int[] vtxIds, int vtxIdCount);
519    synchronized void nMeshGetVertices(int id, int[] vtxIds, int vtxIdCount) {
520        rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
521    }
522    native void rsnMeshGetIndices(int con, int id, int[] idxIds, int[] primitives, int vtxIdCount);
523    synchronized void nMeshGetIndices(int id, int[] idxIds, int[] primitives, int vtxIdCount) {
524        rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
525    }
526
527
528    protected int     mDev;
529    protected int     mContext;
530    @SuppressWarnings({"FieldCanBeLocal"})
531    protected MessageThread mMessageThread;
532
533    Element mElement_U8;
534    Element mElement_I8;
535    Element mElement_U16;
536    Element mElement_I16;
537    Element mElement_U32;
538    Element mElement_I32;
539    Element mElement_U64;
540    Element mElement_I64;
541    Element mElement_F32;
542    Element mElement_F64;
543    Element mElement_BOOLEAN;
544
545    Element mElement_ELEMENT;
546    Element mElement_TYPE;
547    Element mElement_ALLOCATION;
548    Element mElement_SAMPLER;
549    Element mElement_SCRIPT;
550    Element mElement_MESH;
551    Element mElement_PROGRAM_FRAGMENT;
552    Element mElement_PROGRAM_VERTEX;
553    Element mElement_PROGRAM_RASTER;
554    Element mElement_PROGRAM_STORE;
555
556    Element mElement_A_8;
557    Element mElement_RGB_565;
558    Element mElement_RGB_888;
559    Element mElement_RGBA_5551;
560    Element mElement_RGBA_4444;
561    Element mElement_RGBA_8888;
562
563    Element mElement_FLOAT_2;
564    Element mElement_FLOAT_3;
565    Element mElement_FLOAT_4;
566    Element mElement_UCHAR_4;
567
568    Element mElement_MATRIX_4X4;
569    Element mElement_MATRIX_3X3;
570    Element mElement_MATRIX_2X2;
571
572    Sampler mSampler_CLAMP_NEAREST;
573    Sampler mSampler_CLAMP_LINEAR;
574    Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
575    Sampler mSampler_WRAP_NEAREST;
576    Sampler mSampler_WRAP_LINEAR;
577    Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
578
579    ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
580    ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
581    ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_TEST;
582    ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_WRITE;
583    ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
584    ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
585    ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_TEST;
586    ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_WRITE;
587    ProgramStore mProgramStore_BLEND_ADD_DEPTH_TEST;
588    ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_DEPTH;
589    ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_TEST;
590    ProgramStore mProgramStore_BLEND_ADD_DEPTH_NO_WRITE;
591
592    ProgramRaster mProgramRaster_CULL_BACK;
593    ProgramRaster mProgramRaster_CULL_FRONT;
594    ProgramRaster mProgramRaster_CULL_NONE;
595
596    ///////////////////////////////////////////////////////////////////////////////////
597    //
598
599    /**
600     * Base class application should derive from for handling RS messages
601     * comming from their scripts.  When a script calls sendToClient the data
602     * fields will be filled in and then the run method called by a message
603     * handling thread.  This will occur some time after sendToClient completes
604     * in the script.
605     *
606     */
607    public static class RSMessage implements Runnable {
608        protected int[] mData;
609        protected int mID;
610        protected int mLength;
611        public void run() {
612        }
613    }
614    /**
615     * If an application is expecting messages it should set this field to an
616     * instance of RSMessage.  This instance will receive all the user messages
617     * sent from sendToClient by scripts from this context.
618     *
619     */
620    public RSMessage mMessageCallback = null;
621
622    /**
623     * Runtime error base class.  An application should derive from this class
624     * if it wishes to install an error handler.  When errors occur at runtime
625     * the fields in this class will be filled and the run method called.
626     *
627     */
628    public static class RSAsyncError implements Runnable {
629        protected String mErrorMessage;
630        protected int mErrorNum;
631        public void run() {
632        }
633    }
634
635    /**
636     * Application Error handler.  All runtime errors will be dispatched to the
637     * instance of RSAsyncError set here.  If this field is null a
638     * RSRuntimeException will instead be thrown with details about the error.
639     * This will cause program termaination.
640     *
641     */
642    public RSAsyncError mErrorCallback = null;
643
644    /**
645     * RenderScript worker threads priority enumeration.  The default value is
646     * NORMAL.  Applications wishing to do background processing such as
647     * wallpapers should set their priority to LOW to avoid starving forground
648     * processes.
649     */
650    public enum Priority {
651        LOW (5),     //ANDROID_PRIORITY_BACKGROUND + 5
652        NORMAL (-4);  //ANDROID_PRIORITY_DISPLAY
653
654        int mID;
655        Priority(int id) {
656            mID = id;
657        }
658    }
659
660    void validate() {
661        if (mContext == 0) {
662            throw new RSInvalidStateException("Calling RS with no Context active.");
663        }
664    }
665
666
667    /**
668     * Change the priority of the worker threads for this context.
669     *
670     * @param p New priority to be set.
671     */
672    public void contextSetPriority(Priority p) {
673        validate();
674        nContextSetPriority(p.mID);
675    }
676
677    protected static class MessageThread extends Thread {
678        RenderScript mRS;
679        boolean mRun = true;
680        int[] auxData = new int[2];
681
682        public static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
683        public static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
684        public static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
685        public static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
686        public static final int RS_MESSAGE_TO_CLIENT_USER = 4;
687
688        MessageThread(RenderScript rs) {
689            super("RSMessageThread");
690            mRS = rs;
691
692        }
693
694        public void run() {
695            // This function is a temporary solution.  The final solution will
696            // used typed allocations where the message id is the type indicator.
697            int[] rbuf = new int[16];
698            mRS.nContextInitToClient(mRS.mContext);
699            while(mRun) {
700                rbuf[0] = 0;
701                int msg = mRS.nContextPeekMessage(mRS.mContext, auxData, true);
702                int size = auxData[1];
703                int subID = auxData[0];
704
705                if (msg == RS_MESSAGE_TO_CLIENT_USER) {
706                    if ((size>>2) >= rbuf.length) {
707                        rbuf = new int[(size + 3) >> 2];
708                    }
709                    mRS.nContextGetUserMessage(mRS.mContext, rbuf);
710
711                    if(mRS.mMessageCallback != null) {
712                        mRS.mMessageCallback.mData = rbuf;
713                        mRS.mMessageCallback.mID = subID;
714                        mRS.mMessageCallback.mLength = size;
715                        mRS.mMessageCallback.run();
716                    } else {
717                        throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
718                    }
719                    continue;
720                }
721
722                if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
723                    String e = mRS.nContextGetErrorMessage(mRS.mContext);
724
725                    if(mRS.mErrorCallback != null) {
726                        mRS.mErrorCallback.mErrorMessage = e;
727                        mRS.mErrorCallback.mErrorNum = subID;
728                        mRS.mErrorCallback.run();
729                    } else {
730                        //throw new RSRuntimeException("Received error num " + subID + ", details: " + e);
731                    }
732                    continue;
733                }
734
735                // 2: teardown.
736                // But we want to avoid starving other threads during
737                // teardown by yielding until the next line in the destructor
738                // can execute to set mRun = false
739                try {
740                    sleep(1, 0);
741                } catch(InterruptedException e) {
742                }
743            }
744            Log.d(LOG_TAG, "MessageThread exiting.");
745        }
746    }
747
748    RenderScript() {
749    }
750
751    /**
752     * Create a basic RenderScript context.
753     *
754     *
755     * @return RenderScript
756     */
757    public static RenderScript create() {
758        RenderScript rs = new RenderScript();
759
760        rs.mDev = rs.nDeviceCreate();
761        rs.mContext = rs.nContextCreate(rs.mDev, 0);
762        rs.mMessageThread = new MessageThread(rs);
763        rs.mMessageThread.start();
764        Element.initPredefined(rs);
765        return rs;
766    }
767
768    /**
769     * Print the currently available debugging information about the state of
770     * the RS context to the log.
771     *
772     *
773     * @param bits Currently ignored.
774     */
775    public void contextDump(int bits) {
776        validate();
777        nContextDump(bits);
778    }
779
780    /**
781     * Wait for any commands in the fifo between the java bindings and native to
782     * be processed.
783     *
784     */
785    public void finish() {
786        nContextFinish();
787    }
788
789    /**
790     * Destroy this renderscript context.  Once this function is called its no
791     * longer legal to use this or any objects created by this context.
792     *
793     */
794    public void destroy() {
795        validate();
796        nContextDeinitToClient(mContext);
797        mMessageThread.mRun = false;
798        try {
799            mMessageThread.join();
800        } catch(InterruptedException e) {
801        }
802
803        nContextDestroy();
804        mContext = 0;
805
806        nDeviceDestroy(mDev);
807        mDev = 0;
808    }
809
810    boolean isAlive() {
811        return mContext != 0;
812    }
813
814    protected int safeID(BaseObj o) {
815        if(o != null) {
816            return o.getID();
817        }
818        return 0;
819    }
820}
821