RenderScript.java revision 96ed4cfa62dd09aafb3f9da01e047661b4fe3c95
160aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich/*
260aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich * Copyright (C) 2008 The Android Open Source Project
360aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich *
460aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich * Licensed under the Apache License, Version 2.0 (the "License");
560aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich * you may not use this file except in compliance with the License.
660aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich * You may obtain a copy of the License at
760aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich *
860aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich *      http://www.apache.org/licenses/LICENSE-2.0
960aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich *
1060aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich * Unless required by applicable law or agreed to in writing, software
1160aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich * distributed under the License is distributed on an "AS IS" BASIS,
1260aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1360aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich * See the License for the specific language governing permissions and
1460aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich * limitations under the License.
1560aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich */
1660aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
1794d8e90ad78ee1dbc0efa315117688abd126ae55Jason Samspackage android.renderscript;
1860aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
1943ee06857bb7f99446d1d84f8789016c5d105558Jason Samsimport java.lang.reflect.Field;
2036e612a488511940b61f09803b270aa1c61b68e0Jason Sams
21b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samsimport android.graphics.Bitmap;
22650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guyimport android.graphics.BitmapFactory;
2336e612a488511940b61f09803b270aa1c61b68e0Jason Samsimport android.util.Config;
2436e612a488511940b61f09803b270aa1c61b68e0Jason Samsimport android.util.Log;
2536e612a488511940b61f09803b270aa1c61b68e0Jason Samsimport android.view.Surface;
2643702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich
2760aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
28e29d471e5ca9781d8772d445ec7832e94856fd14Jason Sams/**
29e29d471e5ca9781d8772d445ec7832e94856fd14Jason Sams * @hide
30e29d471e5ca9781d8772d445ec7832e94856fd14Jason Sams *
31e29d471e5ca9781d8772d445ec7832e94856fd14Jason Sams **/
3260aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevichpublic class RenderScript {
333bc47d438171dce294e816366d53bc9eca772c5bJason Sams    static final String LOG_TAG = "RenderScript_jni";
34704ff64b099406bb328898a7443921f22dbffd6dJason Sams    protected static final boolean DEBUG  = false;
35650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy    @SuppressWarnings({"UnusedDeclaration", "deprecation"})
36704ff64b099406bb328898a7443921f22dbffd6dJason Sams    protected static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
3760aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
3860aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
3960aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
4002fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams     /*
4160aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich     * We use a class initializer to allow the native code to cache some
4260aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich     * field offsets.
4360aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich     */
44650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy    @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
45704ff64b099406bb328898a7443921f22dbffd6dJason Sams    protected static boolean sInitialized;
46704ff64b099406bb328898a7443921f22dbffd6dJason Sams    native protected static void _nInit();
4760aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
48dba3ba5b5bf6026abceced921b1b0d231b0faefdJason Sams
4960aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich    static {
5060aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich        sInitialized = false;
5160aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich        try {
52e29d471e5ca9781d8772d445ec7832e94856fd14Jason Sams            System.loadLibrary("rs_jni");
5360aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich            _nInit();
5460aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich            sInitialized = true;
5560aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich        } catch (UnsatisfiedLinkError e) {
5660aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich            Log.d(LOG_TAG, "RenderScript JNI library not found!");
5760aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich        }
5860aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich    }
5960aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
60ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams    native void nInitElements(int a8, int rgba4444, int rgba8888, int rgb565);
61ea84a7c51790f9ba5f2194a66d6cf4ea8d879776Jason Sams
6236e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native int  nDeviceCreate();
6336e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nDeviceDestroy(int dev);
64ebfb436a49673693b98469683451bd9ede797557Jason Sams    native void nDeviceSetConfig(int dev, int param, int value);
65704ff64b099406bb328898a7443921f22dbffd6dJason Sams    native int  nContextCreateGL(int dev, int ver, boolean useDepth);
66704ff64b099406bb328898a7443921f22dbffd6dJason Sams    native int  nContextCreate(int dev, int ver);
6736e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nContextDestroy(int con);
683bc47d438171dce294e816366d53bc9eca772c5bJason Sams    native void nContextSetSurface(int w, int h, Surface sur);
697d787b4722eaeb79cab42c36060336e092b77b5fJason Sams    native void nContextSetPriority(int p);
70715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams    native void nContextDump(int bits);
7196ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams    native void nContextFinish();
7260aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
7336e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nContextBindRootScript(int script);
7436e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nContextBindSampler(int sampler, int slot);
7554db59c3594e887a412a24713fc3daa1c2404593Jason Sams    native void nContextBindProgramStore(int pfs);
7636e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nContextBindProgramFragment(int pf);
7736e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nContextBindProgramVertex(int pf);
78ebfb436a49673693b98469683451bd9ede797557Jason Sams    native void nContextBindProgramRaster(int pr);
7965e7aa56f56097418d617663683544c25b3988eaJason Sams    native void nContextPause();
8065e7aa56f56097418d617663683544c25b3988eaJason Sams    native void nContextResume();
81516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    native int nContextGetMessage(int[] data, boolean wait);
82516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    native void nContextInitToClient();
83516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    native void nContextDeinitToClient();
8436e612a488511940b61f09803b270aa1c61b68e0Jason Sams
8536e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nAssignName(int obj, byte[] name);
867ce033d797e5df5e2131e2ed459fba181eaf4658Jason Sams    native void nObjDestroy(int id);
87730ee65d4ddb307898053b623120bad1655fadadJason Sams    native void nObjDestroyOOB(int id);
8836e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native int  nFileOpen(byte[] name);
8936e612a488511940b61f09803b270aa1c61b68e0Jason Sams
90718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams
91718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    native int  nElementCreate(int type, int kind, boolean norm, int vecSize);
92718cd1f322ee5b62b6a49cb36195bcb18a5ab711Jason Sams    native int  nElementCreate2(int[] elements, String[] names);
9336e612a488511940b61f09803b270aa1c61b68e0Jason Sams
9436e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nTypeBegin(int elementID);
9536e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nTypeAdd(int dim, int val);
9636e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native int  nTypeCreate();
9743ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    native void nTypeFinalDestroy(Type t);
9843ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    native void nTypeSetupFields(Type t, int[] types, int[] bits, Field[] IDs);
9936e612a488511940b61f09803b270aa1c61b68e0Jason Sams
10036e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native int  nAllocationCreateTyped(int type);
10136e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native int  nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp);
1028a64743f37ed35af7c2204acd18bb3d62d8f66d5Jason Sams    native int  nAllocationCreateBitmapRef(int type, Bitmap bmp);
10336e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native int  nAllocationCreateFromBitmapBoxed(int dstFmt, boolean genMips, Bitmap bmp);
104650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy    native int  nAllocationCreateFromAssetStream(int dstFmt, boolean genMips, int assetStream);
10536e612a488511940b61f09803b270aa1c61b68e0Jason Sams
106c2908e60c9b021fb4bb69acff8d49981dd4dade8Jason Sams    native void nAllocationUploadToTexture(int alloc, boolean genMips, int baseMioLevel);
10707ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams    native void nAllocationUploadToBufferObject(int alloc);
108768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
10907ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams    native void nAllocationSubData1D(int id, int off, int count, int[] d, int sizeBytes);
110768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    native void nAllocationSubData1D(int id, int off, int count, short[] d, int sizeBytes);
111768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    native void nAllocationSubData1D(int id, int off, int count, byte[] d, int sizeBytes);
11207ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams    native void nAllocationSubData1D(int id, int off, int count, float[] d, int sizeBytes);
113768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
11407ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams    native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes);
11507ae40623737a6060b8a925fd2e6bba76780dcd4Jason Sams    native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes);
11640a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams    native void nAllocationRead(int id, int[] d);
11740a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams    native void nAllocationRead(int id, float[] d);
1182525a815220652b37e2e390fe8c62394a6d0e574Jason Sams    native void nAllocationSubDataFromObject(int id, Type t, int offset, Object o);
1195f43fd289abbd5380b6068766daf721b555d0053Jason Sams    native void nAllocationSubReadFromObject(int id, Type t, int offset, Object o);
12036e612a488511940b61f09803b270aa1c61b68e0Jason Sams
121aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    native int  nFileA3DCreateFromAssetStream(int assetStream);
122aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    native int  nFileA3DGetNumIndexEntries(int fileA3D);
123aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    native void nFileA3DGetIndexEntries(int fileA3D, int numEntries, int[] IDs, String[] names);
124aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk    native int  nFileA3DGetEntryByIndex(int fileA3D, int index);
125aae74ad6144470c66e72b075ac3afeddb186fa98Alex Sakhartchouk
12636e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nAdapter1DBindAllocation(int ad, int alloc);
12736e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nAdapter1DSetConstraint(int ad, int dim, int value);
12836e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nAdapter1DData(int ad, int[] d);
12936e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nAdapter1DData(int ad, float[] d);
130bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams    native void nAdapter1DSubData(int ad, int off, int count, int[] d);
13136e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nAdapter1DSubData(int ad, int off, int count, float[] d);
13236e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native int  nAdapter1DCreate();
13336e612a488511940b61f09803b270aa1c61b68e0Jason Sams
134bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams    native void nAdapter2DBindAllocation(int ad, int alloc);
135bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams    native void nAdapter2DSetConstraint(int ad, int dim, int value);
136bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams    native void nAdapter2DData(int ad, int[] d);
137bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams    native void nAdapter2DData(int ad, float[] d);
138bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams    native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, int[] d);
139bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams    native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d);
140bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams    native int  nAdapter2DCreate();
141bd1c3ad0cdf8e60b849a009cdc0b36764cc1dacbJason Sams
14222534176fb5c1257130ef4ee589739ca42766a32Jason Sams    native void nScriptBindAllocation(int script, int alloc, int slot);
14322534176fb5c1257130ef4ee589739ca42766a32Jason Sams    native void nScriptSetTimeZone(int script, byte[] timeZone);
144be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams    native void nScriptInvoke(int id, int slot);
1454d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    native void nScriptInvokeV(int id, int slot, byte[] params);
1464d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    native void nScriptSetVarI(int id, int slot, int val);
1474d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    native void nScriptSetVarF(int id, int slot, float val);
1484d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    native void nScriptSetVarV(int id, int slot, byte[] val);
14922534176fb5c1257130ef4ee589739ca42766a32Jason Sams
15036e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nScriptCBegin();
15136e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nScriptCSetScript(byte[] script, int offset, int length);
15236e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native int  nScriptCCreate();
15336e612a488511940b61f09803b270aa1c61b68e0Jason Sams
15436e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nSamplerBegin();
15536e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nSamplerSet(int param, int value);
15636e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native int  nSamplerCreate();
15736e612a488511940b61f09803b270aa1c61b68e0Jason Sams
15854db59c3594e887a412a24713fc3daa1c2404593Jason Sams    native void nProgramStoreBegin(int in, int out);
15954db59c3594e887a412a24713fc3daa1c2404593Jason Sams    native void nProgramStoreDepthFunc(int func);
16054db59c3594e887a412a24713fc3daa1c2404593Jason Sams    native void nProgramStoreDepthMask(boolean enable);
16154db59c3594e887a412a24713fc3daa1c2404593Jason Sams    native void nProgramStoreColorMask(boolean r, boolean g, boolean b, boolean a);
16254db59c3594e887a412a24713fc3daa1c2404593Jason Sams    native void nProgramStoreBlendFunc(int src, int dst);
16354db59c3594e887a412a24713fc3daa1c2404593Jason Sams    native void nProgramStoreDither(boolean enable);
16454db59c3594e887a412a24713fc3daa1c2404593Jason Sams    native int  nProgramStoreCreate();
16536e612a488511940b61f09803b270aa1c61b68e0Jason Sams
166ebfb436a49673693b98469683451bd9ede797557Jason Sams    native int  nProgramRasterCreate(int in, int out, boolean pointSmooth, boolean lineSmooth, boolean pointSprite);
167ebfb436a49673693b98469683451bd9ede797557Jason Sams    native void nProgramRasterSetLineWidth(int pr, float v);
168ebfb436a49673693b98469683451bd9ede797557Jason Sams    native void nProgramRasterSetPointSize(int pr, float v);
169ebfb436a49673693b98469683451bd9ede797557Jason Sams
1700011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    native void nProgramBindConstants(int pv, int slot, int mID);
17168afd01ec9fd37774d8291192952a25e5605b6fbJason Sams    native void nProgramBindTexture(int vpf, int slot, int a);
17268afd01ec9fd37774d8291192952a25e5605b6fbJason Sams    native void nProgramBindSampler(int vpf, int slot, int s);
1730011bcf57ff711a221a3a4c73f2a79125111647dJason Sams
17468afd01ec9fd37774d8291192952a25e5605b6fbJason Sams    native int  nProgramFragmentCreate(int[] params);
1757e5ab3b177b10fee304d011b3a4b9ee03e2b18b5Jason Sams    native int  nProgramFragmentCreate2(String shader, int[] params);
17636e612a488511940b61f09803b270aa1c61b68e0Jason Sams
1770011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    native int  nProgramVertexCreate(boolean texMat);
1780011bcf57ff711a221a3a4c73f2a79125111647dJason Sams    native int  nProgramVertexCreate2(String shader, int[] params);
17936e612a488511940b61f09803b270aa1c61b68e0Jason Sams
18036e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nLightBegin();
18136e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nLightSetIsMono(boolean isMono);
18236e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nLightSetIsLocal(boolean isLocal);
18336e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native int  nLightCreate();
18436e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nLightSetColor(int l, float r, float g, float b);
18536e612a488511940b61f09803b270aa1c61b68e0Jason Sams    native void nLightSetPosition(int l, float x, float y, float z);
186bba134c8a1dcfe0c8473307a95899a02c9553504Jason Sams
1871bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    native int  nSimpleMeshCreate(int batchID, int idxID, int[] vtxID, int prim);
1881bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    native void nSimpleMeshBindVertex(int id, int alloc, int slot);
1891bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    native void nSimpleMeshBindIndex(int id, int alloc);
1901bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
19140a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams    native void nAnimationBegin(int attribCount, int keyframeCount);
19240a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams    native void nAnimationAdd(float time, float[] attribs);
19340a29e8e28772b37ab0f9fe9708ecdcba24abb84Jason Sams    native int  nAnimationCreate();
19460aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
195704ff64b099406bb328898a7443921f22dbffd6dJason Sams    protected int     mDev;
196704ff64b099406bb328898a7443921f22dbffd6dJason Sams    protected int     mContext;
197650a3eb7d621dc8e81573142a4498bbd07bcde27Romain Guy    @SuppressWarnings({"FieldCanBeLocal"})
198704ff64b099406bb328898a7443921f22dbffd6dJason Sams    protected MessageThread mMessageThread;
19960aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
2008cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_U8;
2018cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_I8;
2028cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_U16;
2038cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_I16;
2048cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_U32;
2058cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_I32;
2068cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_F32;
2078cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams
2088cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_ELEMENT;
2098cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_TYPE;
2108cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_ALLOCATION;
2118cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_SAMPLER;
2128cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_SCRIPT;
2138cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_MESH;
2148cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_PROGRAM_FRAGMENT;
2158cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_PROGRAM_VERTEX;
2168cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_PROGRAM_RASTER;
2178cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_PROGRAM_STORE;
218a70f416c9cf2fc6cc5e132c1d656ce07441d6b82Jason Sams
2193c0dfbab807a459622aeade4940daddf482dec66Jason Sams    Element mElement_A_8;
2203c0dfbab807a459622aeade4940daddf482dec66Jason Sams    Element mElement_RGB_565;
2213c0dfbab807a459622aeade4940daddf482dec66Jason Sams    Element mElement_RGB_888;
2223c0dfbab807a459622aeade4940daddf482dec66Jason Sams    Element mElement_RGBA_5551;
2233c0dfbab807a459622aeade4940daddf482dec66Jason Sams    Element mElement_RGBA_4444;
2243c0dfbab807a459622aeade4940daddf482dec66Jason Sams    Element mElement_RGBA_8888;
2253c0dfbab807a459622aeade4940daddf482dec66Jason Sams
2268cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_FLOAT_2;
2278cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_FLOAT_3;
2288cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_FLOAT_4;
2298cb39de03aef6097a90033600d11a60ae000a6e4Jason Sams    Element mElement_UCHAR_4;
2307d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
2314d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    Sampler mSampler_CLAMP_NEAREST;
2324d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    Sampler mSampler_CLAMP_LINEAR;
2334d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
2344d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    Sampler mSampler_WRAP_NEAREST;
2354d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    Sampler mSampler_WRAP_LINEAR;
2364d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
2374d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
23860aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich    ///////////////////////////////////////////////////////////////////////////////////
23943702d8925c54360ad5f9f66b0d35d61d59f6910Jack Palevich    //
24060aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
241516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    public static class RSMessage implements Runnable {
242516c31911578db8ce53529483c3ded918ac7dc6bJason Sams        protected int[] mData;
243516c31911578db8ce53529483c3ded918ac7dc6bJason Sams        protected int mID;
244516c31911578db8ce53529483c3ded918ac7dc6bJason Sams        public void run() {
245516c31911578db8ce53529483c3ded918ac7dc6bJason Sams        }
246516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    }
247516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    public RSMessage mMessageCallback = null;
248516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
2497d787b4722eaeb79cab42c36060336e092b77b5fJason Sams    public enum Priority {
2507d787b4722eaeb79cab42c36060336e092b77b5fJason Sams        LOW (5),     //ANDROID_PRIORITY_BACKGROUND + 5
2517d787b4722eaeb79cab42c36060336e092b77b5fJason Sams        NORMAL (-4);  //ANDROID_PRIORITY_DISPLAY
2527d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
2537d787b4722eaeb79cab42c36060336e092b77b5fJason Sams        int mID;
2547d787b4722eaeb79cab42c36060336e092b77b5fJason Sams        Priority(int id) {
2557d787b4722eaeb79cab42c36060336e092b77b5fJason Sams            mID = id;
2567d787b4722eaeb79cab42c36060336e092b77b5fJason Sams        }
2577d787b4722eaeb79cab42c36060336e092b77b5fJason Sams    }
2587d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
259771bebb94054d06f97284379c93a2620613513c3Jason Sams    void validate() {
260771bebb94054d06f97284379c93a2620613513c3Jason Sams        if (mContext == 0) {
261771bebb94054d06f97284379c93a2620613513c3Jason Sams            throw new IllegalStateException("Calling RS with no Context active.");
262771bebb94054d06f97284379c93a2620613513c3Jason Sams        }
263771bebb94054d06f97284379c93a2620613513c3Jason Sams    }
264771bebb94054d06f97284379c93a2620613513c3Jason Sams
2657d787b4722eaeb79cab42c36060336e092b77b5fJason Sams    public void contextSetPriority(Priority p) {
2665dbfe93b3f15f3a837836d024958635fd8f9ad14Jason Sams        validate();
2677d787b4722eaeb79cab42c36060336e092b77b5fJason Sams        nContextSetPriority(p.mID);
2687d787b4722eaeb79cab42c36060336e092b77b5fJason Sams    }
2697d787b4722eaeb79cab42c36060336e092b77b5fJason Sams
270704ff64b099406bb328898a7443921f22dbffd6dJason Sams    protected static class MessageThread extends Thread {
271516c31911578db8ce53529483c3ded918ac7dc6bJason Sams        RenderScript mRS;
272516c31911578db8ce53529483c3ded918ac7dc6bJason Sams        boolean mRun = true;
273516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
274516c31911578db8ce53529483c3ded918ac7dc6bJason Sams        MessageThread(RenderScript rs) {
275516c31911578db8ce53529483c3ded918ac7dc6bJason Sams            super("RSMessageThread");
276516c31911578db8ce53529483c3ded918ac7dc6bJason Sams            mRS = rs;
277516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
278516c31911578db8ce53529483c3ded918ac7dc6bJason Sams        }
279516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
280516c31911578db8ce53529483c3ded918ac7dc6bJason Sams        public void run() {
281516c31911578db8ce53529483c3ded918ac7dc6bJason Sams            // This function is a temporary solution.  The final solution will
282516c31911578db8ce53529483c3ded918ac7dc6bJason Sams            // used typed allocations where the message id is the type indicator.
283516c31911578db8ce53529483c3ded918ac7dc6bJason Sams            int[] rbuf = new int[16];
284516c31911578db8ce53529483c3ded918ac7dc6bJason Sams            mRS.nContextInitToClient();
285516c31911578db8ce53529483c3ded918ac7dc6bJason Sams            while(mRun) {
286516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                int msg = mRS.nContextGetMessage(rbuf, true);
287516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                if (msg == 0) {
288516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                    // Should only happen during teardown.
289516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                    // But we want to avoid starving other threads during
290516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                    // teardown by yielding until the next line in the destructor
291516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                    // can execute to set mRun = false
292516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                    try {
293516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                        sleep(1, 0);
294516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                    } catch(InterruptedException e) {
295516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                    }
296516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                }
297516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                if(mRS.mMessageCallback != null) {
298516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                    mRS.mMessageCallback.mData = rbuf;
299516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                    mRS.mMessageCallback.mID = msg;
300516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                    mRS.mMessageCallback.run();
301516c31911578db8ce53529483c3ded918ac7dc6bJason Sams                }
302516c31911578db8ce53529483c3ded918ac7dc6bJason Sams            }
3033bc47d438171dce294e816366d53bc9eca772c5bJason Sams            Log.d(LOG_TAG, "MessageThread exiting.");
304516c31911578db8ce53529483c3ded918ac7dc6bJason Sams        }
305516c31911578db8ce53529483c3ded918ac7dc6bJason Sams    }
306516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
307704ff64b099406bb328898a7443921f22dbffd6dJason Sams    protected RenderScript() {
30860aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich    }
30960aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
310704ff64b099406bb328898a7443921f22dbffd6dJason Sams    public static RenderScript create() {
311704ff64b099406bb328898a7443921f22dbffd6dJason Sams        RenderScript rs = new RenderScript();
312704ff64b099406bb328898a7443921f22dbffd6dJason Sams
313704ff64b099406bb328898a7443921f22dbffd6dJason Sams        rs.mDev = rs.nDeviceCreate();
314704ff64b099406bb328898a7443921f22dbffd6dJason Sams        rs.mContext = rs.nContextCreate(rs.mDev, 0);
315704ff64b099406bb328898a7443921f22dbffd6dJason Sams        rs.mMessageThread = new MessageThread(rs);
316704ff64b099406bb328898a7443921f22dbffd6dJason Sams        rs.mMessageThread.start();
317704ff64b099406bb328898a7443921f22dbffd6dJason Sams        Element.initPredefined(rs);
318704ff64b099406bb328898a7443921f22dbffd6dJason Sams        return rs;
319efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams    }
320efd9b6fb2e0f31b50db089352118e5daeb268879Jason Sams
321715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams    public void contextDump(int bits) {
3225dbfe93b3f15f3a837836d024958635fd8f9ad14Jason Sams        validate();
323715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams        nContextDump(bits);
324715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams    }
325715333b832fb448c32165c7d97d408a3fa43f7cbJason Sams
32696ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams    public void finish() {
32796ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams        nContextFinish();
32896ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams    }
32996ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams
330f5b4596a383b6ab83f92edecfe054e80b555c2d0Jason Sams    public void destroy() {
3315dbfe93b3f15f3a837836d024958635fd8f9ad14Jason Sams        validate();
332516c31911578db8ce53529483c3ded918ac7dc6bJason Sams        nContextDeinitToClient();
333516c31911578db8ce53529483c3ded918ac7dc6bJason Sams        mMessageThread.mRun = false;
334516c31911578db8ce53529483c3ded918ac7dc6bJason Sams
335f5b4596a383b6ab83f92edecfe054e80b555c2d0Jason Sams        nContextDestroy(mContext);
336f5b4596a383b6ab83f92edecfe054e80b555c2d0Jason Sams        mContext = 0;
337f5b4596a383b6ab83f92edecfe054e80b555c2d0Jason Sams
338f5b4596a383b6ab83f92edecfe054e80b555c2d0Jason Sams        nDeviceDestroy(mDev);
339f5b4596a383b6ab83f92edecfe054e80b555c2d0Jason Sams        mDev = 0;
340f5b4596a383b6ab83f92edecfe054e80b555c2d0Jason Sams    }
34102fb2cb531035779a25dbf9595e0628ea40585b0Jason Sams
342a9e7a05b84470257637c97d65f6562aa832c66efJason Sams    boolean isAlive() {
343a9e7a05b84470257637c97d65f6562aa832c66efJason Sams        return mContext != 0;
344a9e7a05b84470257637c97d65f6562aa832c66efJason Sams    }
345a9e7a05b84470257637c97d65f6562aa832c66efJason Sams
34660aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich    ///////////////////////////////////////////////////////////////////////////////////
34760aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich    // Root state
34860aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
349704ff64b099406bb328898a7443921f22dbffd6dJason Sams    protected int safeID(BaseObj o) {
3506b9dec00afec359f091ed353f371f08ff150278aJason Sams        if(o != null) {
3516b9dec00afec359f091ed353f371f08ff150278aJason Sams            return o.mID;
352d8e4161f114331343b897cbacea927e7e60e7b17Jason Sams        }
3536b9dec00afec359f091ed353f371f08ff150278aJason Sams        return 0;
35460aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich    }
35560aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich}
35660aa3eaf559b1410898c228e4f6ab7920f3953d0Jack Palevich
35736e612a488511940b61f09803b270aa1c61b68e0Jason Sams
358