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