• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package android.renderscript;
18 
19 import java.lang.reflect.Field;
20 
21 import android.graphics.Bitmap;
22 import android.graphics.BitmapFactory;
23 import android.util.Config;
24 import android.util.Log;
25 import android.view.Surface;
26 
27 
28 /**
29  * @hide
30  *
31  **/
32 public class RenderScript {
33     static final String LOG_TAG = "RenderScript_jni";
34     protected static final boolean DEBUG  = false;
35     @SuppressWarnings({"UnusedDeclaration", "deprecation"})
36     protected static final boolean LOG_ENABLED = DEBUG ? Config.LOGD : Config.LOGV;
37 
38 
39 
40      /*
41      * We use a class initializer to allow the native code to cache some
42      * field offsets.
43      */
44     @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
45     protected static boolean sInitialized;
_nInit()46     native protected static void _nInit();
47 
48 
49     static {
50         sInitialized = false;
51         try {
52             System.loadLibrary("rs_jni");
_nInit()53             _nInit();
54             sInitialized = true;
55         } catch (UnsatisfiedLinkError e) {
56             Log.d(LOG_TAG, "RenderScript JNI library not found!");
57         }
58     }
59 
nInitElements(int a8, int rgba4444, int rgba8888, int rgb565)60     native void nInitElements(int a8, int rgba4444, int rgba8888, int rgb565);
61 
nDeviceCreate()62     native int  nDeviceCreate();
nDeviceDestroy(int dev)63     native void nDeviceDestroy(int dev);
nDeviceSetConfig(int dev, int param, int value)64     native void nDeviceSetConfig(int dev, int param, int value);
nContextCreateGL(int dev, int ver, boolean useDepth)65     native int  nContextCreateGL(int dev, int ver, boolean useDepth);
nContextCreate(int dev, int ver)66     native int  nContextCreate(int dev, int ver);
nContextDestroy(int con)67     native void nContextDestroy(int con);
nContextSetSurface(int w, int h, Surface sur)68     native void nContextSetSurface(int w, int h, Surface sur);
nContextSetPriority(int p)69     native void nContextSetPriority(int p);
nContextDump(int bits)70     native void nContextDump(int bits);
71 
nContextBindRootScript(int script)72     native void nContextBindRootScript(int script);
nContextBindSampler(int sampler, int slot)73     native void nContextBindSampler(int sampler, int slot);
nContextBindProgramFragmentStore(int pfs)74     native void nContextBindProgramFragmentStore(int pfs);
nContextBindProgramFragment(int pf)75     native void nContextBindProgramFragment(int pf);
nContextBindProgramVertex(int pf)76     native void nContextBindProgramVertex(int pf);
nContextBindProgramRaster(int pr)77     native void nContextBindProgramRaster(int pr);
nContextPause()78     native void nContextPause();
nContextResume()79     native void nContextResume();
nContextGetMessage(int[] data, boolean wait)80     native int nContextGetMessage(int[] data, boolean wait);
nContextInitToClient()81     native void nContextInitToClient();
nContextDeinitToClient()82     native void nContextDeinitToClient();
83 
nAssignName(int obj, byte[] name)84     native void nAssignName(int obj, byte[] name);
nObjDestroy(int id)85     native void nObjDestroy(int id);
nObjDestroyOOB(int id)86     native void nObjDestroyOOB(int id);
nFileOpen(byte[] name)87     native int  nFileOpen(byte[] name);
88 
89 
nElementCreate(int type, int kind, boolean norm, int vecSize)90     native int  nElementCreate(int type, int kind, boolean norm, int vecSize);
nElementCreate2(int[] elements, String[] names)91     native int  nElementCreate2(int[] elements, String[] names);
92 
nTypeBegin(int elementID)93     native void nTypeBegin(int elementID);
nTypeAdd(int dim, int val)94     native void nTypeAdd(int dim, int val);
nTypeCreate()95     native int  nTypeCreate();
nTypeFinalDestroy(Type t)96     native void nTypeFinalDestroy(Type t);
nTypeSetupFields(Type t, int[] types, int[] bits, Field[] IDs)97     native void nTypeSetupFields(Type t, int[] types, int[] bits, Field[] IDs);
98 
nAllocationCreateTyped(int type)99     native int  nAllocationCreateTyped(int type);
nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp)100     native int  nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp);
nAllocationCreateBitmapRef(int type, Bitmap bmp)101     native int  nAllocationCreateBitmapRef(int type, Bitmap bmp);
nAllocationCreateFromBitmapBoxed(int dstFmt, boolean genMips, Bitmap bmp)102     native int  nAllocationCreateFromBitmapBoxed(int dstFmt, boolean genMips, Bitmap bmp);
nAllocationCreateFromAssetStream(int dstFmt, boolean genMips, int assetStream)103     native int  nAllocationCreateFromAssetStream(int dstFmt, boolean genMips, int assetStream);
104 
nAllocationUploadToTexture(int alloc, boolean genMips, int baseMioLevel)105     native void nAllocationUploadToTexture(int alloc, boolean genMips, int baseMioLevel);
nAllocationUploadToBufferObject(int alloc)106     native void nAllocationUploadToBufferObject(int alloc);
107 
nAllocationSubData1D(int id, int off, int count, int[] d, int sizeBytes)108     native void nAllocationSubData1D(int id, int off, int count, int[] d, int sizeBytes);
nAllocationSubData1D(int id, int off, int count, short[] d, int sizeBytes)109     native void nAllocationSubData1D(int id, int off, int count, short[] d, int sizeBytes);
nAllocationSubData1D(int id, int off, int count, byte[] d, int sizeBytes)110     native void nAllocationSubData1D(int id, int off, int count, byte[] d, int sizeBytes);
nAllocationSubData1D(int id, int off, int count, float[] d, int sizeBytes)111     native void nAllocationSubData1D(int id, int off, int count, float[] d, int sizeBytes);
112 
nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes)113     native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes);
nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes)114     native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes);
nAllocationRead(int id, int[] d)115     native void nAllocationRead(int id, int[] d);
nAllocationRead(int id, float[] d)116     native void nAllocationRead(int id, float[] d);
nAllocationSubDataFromObject(int id, Type t, int offset, Object o)117     native void nAllocationSubDataFromObject(int id, Type t, int offset, Object o);
nAllocationSubReadFromObject(int id, Type t, int offset, Object o)118     native void nAllocationSubReadFromObject(int id, Type t, int offset, Object o);
119 
nAdapter1DBindAllocation(int ad, int alloc)120     native void nAdapter1DBindAllocation(int ad, int alloc);
nAdapter1DSetConstraint(int ad, int dim, int value)121     native void nAdapter1DSetConstraint(int ad, int dim, int value);
nAdapter1DData(int ad, int[] d)122     native void nAdapter1DData(int ad, int[] d);
nAdapter1DData(int ad, float[] d)123     native void nAdapter1DData(int ad, float[] d);
nAdapter1DSubData(int ad, int off, int count, int[] d)124     native void nAdapter1DSubData(int ad, int off, int count, int[] d);
nAdapter1DSubData(int ad, int off, int count, float[] d)125     native void nAdapter1DSubData(int ad, int off, int count, float[] d);
nAdapter1DCreate()126     native int  nAdapter1DCreate();
127 
nAdapter2DBindAllocation(int ad, int alloc)128     native void nAdapter2DBindAllocation(int ad, int alloc);
nAdapter2DSetConstraint(int ad, int dim, int value)129     native void nAdapter2DSetConstraint(int ad, int dim, int value);
nAdapter2DData(int ad, int[] d)130     native void nAdapter2DData(int ad, int[] d);
nAdapter2DData(int ad, float[] d)131     native void nAdapter2DData(int ad, float[] d);
nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, int[] d)132     native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, int[] d);
nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d)133     native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d);
nAdapter2DCreate()134     native int  nAdapter2DCreate();
135 
nScriptBindAllocation(int script, int alloc, int slot)136     native void nScriptBindAllocation(int script, int alloc, int slot);
nScriptSetClearColor(int script, float r, float g, float b, float a)137     native void nScriptSetClearColor(int script, float r, float g, float b, float a);
nScriptSetClearDepth(int script, float depth)138     native void nScriptSetClearDepth(int script, float depth);
nScriptSetClearStencil(int script, int stencil)139     native void nScriptSetClearStencil(int script, int stencil);
nScriptSetTimeZone(int script, byte[] timeZone)140     native void nScriptSetTimeZone(int script, byte[] timeZone);
nScriptSetType(int type, boolean writable, String name, int slot)141     native void nScriptSetType(int type, boolean writable, String name, int slot);
nScriptSetRoot(boolean isRoot)142     native void nScriptSetRoot(boolean isRoot);
nScriptSetInvokable(String name, int slot)143     native void nScriptSetInvokable(String name, int slot);
nScriptInvoke(int id, int slot)144     native void nScriptInvoke(int id, int slot);
145 
nScriptCBegin()146     native void nScriptCBegin();
nScriptCSetScript(byte[] script, int offset, int length)147     native void nScriptCSetScript(byte[] script, int offset, int length);
nScriptCCreate()148     native int  nScriptCCreate();
nScriptCAddDefineI32(String name, int value)149     native void nScriptCAddDefineI32(String name, int value);
nScriptCAddDefineF(String name, float value)150     native void nScriptCAddDefineF(String name, float value);
151 
nSamplerBegin()152     native void nSamplerBegin();
nSamplerSet(int param, int value)153     native void nSamplerSet(int param, int value);
nSamplerCreate()154     native int  nSamplerCreate();
155 
nProgramFragmentStoreBegin(int in, int out)156     native void nProgramFragmentStoreBegin(int in, int out);
nProgramFragmentStoreDepthFunc(int func)157     native void nProgramFragmentStoreDepthFunc(int func);
nProgramFragmentStoreDepthMask(boolean enable)158     native void nProgramFragmentStoreDepthMask(boolean enable);
nProgramFragmentStoreColorMask(boolean r, boolean g, boolean b, boolean a)159     native void nProgramFragmentStoreColorMask(boolean r, boolean g, boolean b, boolean a);
nProgramFragmentStoreBlendFunc(int src, int dst)160     native void nProgramFragmentStoreBlendFunc(int src, int dst);
nProgramFragmentStoreDither(boolean enable)161     native void nProgramFragmentStoreDither(boolean enable);
nProgramFragmentStoreCreate()162     native int  nProgramFragmentStoreCreate();
163 
nProgramRasterCreate(int in, int out, boolean pointSmooth, boolean lineSmooth, boolean pointSprite)164     native int  nProgramRasterCreate(int in, int out, boolean pointSmooth, boolean lineSmooth, boolean pointSprite);
nProgramRasterSetLineWidth(int pr, float v)165     native void nProgramRasterSetLineWidth(int pr, float v);
nProgramRasterSetPointSize(int pr, float v)166     native void nProgramRasterSetPointSize(int pr, float v);
167 
nProgramBindConstants(int pv, int slot, int mID)168     native void nProgramBindConstants(int pv, int slot, int mID);
nProgramBindTexture(int vpf, int slot, int a)169     native void nProgramBindTexture(int vpf, int slot, int a);
nProgramBindSampler(int vpf, int slot, int s)170     native void nProgramBindSampler(int vpf, int slot, int s);
171 
nProgramFragmentCreate(int[] params)172     native int  nProgramFragmentCreate(int[] params);
nProgramFragmentCreate2(String shader, int[] params)173     native int  nProgramFragmentCreate2(String shader, int[] params);
174 
nProgramVertexCreate(boolean texMat)175     native int  nProgramVertexCreate(boolean texMat);
nProgramVertexCreate2(String shader, int[] params)176     native int  nProgramVertexCreate2(String shader, int[] params);
177 
nLightBegin()178     native void nLightBegin();
nLightSetIsMono(boolean isMono)179     native void nLightSetIsMono(boolean isMono);
nLightSetIsLocal(boolean isLocal)180     native void nLightSetIsLocal(boolean isLocal);
nLightCreate()181     native int  nLightCreate();
nLightSetColor(int l, float r, float g, float b)182     native void nLightSetColor(int l, float r, float g, float b);
nLightSetPosition(int l, float x, float y, float z)183     native void nLightSetPosition(int l, float x, float y, float z);
184 
nSimpleMeshCreate(int batchID, int idxID, int[] vtxID, int prim)185     native int  nSimpleMeshCreate(int batchID, int idxID, int[] vtxID, int prim);
nSimpleMeshBindVertex(int id, int alloc, int slot)186     native void nSimpleMeshBindVertex(int id, int alloc, int slot);
nSimpleMeshBindIndex(int id, int alloc)187     native void nSimpleMeshBindIndex(int id, int alloc);
188 
nAnimationBegin(int attribCount, int keyframeCount)189     native void nAnimationBegin(int attribCount, int keyframeCount);
nAnimationAdd(float time, float[] attribs)190     native void nAnimationAdd(float time, float[] attribs);
nAnimationCreate()191     native int  nAnimationCreate();
192 
193     protected int     mDev;
194     protected int     mContext;
195     @SuppressWarnings({"FieldCanBeLocal"})
196     protected MessageThread mMessageThread;
197 
198     Element mElement_USER_U8;
199     Element mElement_USER_I8;
200     Element mElement_USER_U16;
201     Element mElement_USER_I16;
202     Element mElement_USER_U32;
203     Element mElement_USER_I32;
204     Element mElement_USER_F32;
205 
206     Element mElement_A_8;
207     Element mElement_RGB_565;
208     Element mElement_RGB_888;
209     Element mElement_RGBA_5551;
210     Element mElement_RGBA_4444;
211     Element mElement_RGBA_8888;
212 
213     Element mElement_INDEX_16;
214     Element mElement_POSITION_2;
215     Element mElement_POSITION_3;
216     Element mElement_TEXTURE_2;
217     Element mElement_NORMAL_3;
218     Element mElement_COLOR_U8_4;
219     Element mElement_COLOR_F32_4;
220 
221     ///////////////////////////////////////////////////////////////////////////////////
222     //
223 
224     public static class RSMessage implements Runnable {
225         protected int[] mData;
226         protected int mID;
run()227         public void run() {
228         }
229     }
230     public RSMessage mMessageCallback = null;
231 
232     public enum Priority {
233         LOW (5),     //ANDROID_PRIORITY_BACKGROUND + 5
234         NORMAL (-4);  //ANDROID_PRIORITY_DISPLAY
235 
236         int mID;
Priority(int id)237         Priority(int id) {
238             mID = id;
239         }
240     }
241 
validate()242     void validate() {
243         if (mContext == 0) {
244             throw new IllegalStateException("Calling RS with no Context active.");
245         }
246     }
247 
contextSetPriority(Priority p)248     public void contextSetPriority(Priority p) {
249         validate();
250         nContextSetPriority(p.mID);
251     }
252 
253     protected static class MessageThread extends Thread {
254         RenderScript mRS;
255         boolean mRun = true;
256 
MessageThread(RenderScript rs)257         MessageThread(RenderScript rs) {
258             super("RSMessageThread");
259             mRS = rs;
260 
261         }
262 
run()263         public void run() {
264             // This function is a temporary solution.  The final solution will
265             // used typed allocations where the message id is the type indicator.
266             int[] rbuf = new int[16];
267             mRS.nContextInitToClient();
268             while(mRun) {
269                 int msg = mRS.nContextGetMessage(rbuf, true);
270                 if (msg == 0) {
271                     // Should only happen during teardown.
272                     // But we want to avoid starving other threads during
273                     // teardown by yielding until the next line in the destructor
274                     // can execute to set mRun = false
275                     try {
276                         sleep(1, 0);
277                     } catch(InterruptedException e) {
278                     }
279                 }
280                 if(mRS.mMessageCallback != null) {
281                     mRS.mMessageCallback.mData = rbuf;
282                     mRS.mMessageCallback.mID = msg;
283                     mRS.mMessageCallback.run();
284                 }
285                 //Log.d(LOG_TAG, "MessageThread msg " + msg + " v1 " + rbuf[0] + " v2 " + rbuf[1] + " v3 " +rbuf[2]);
286             }
287             Log.d(LOG_TAG, "MessageThread exiting.");
288         }
289     }
290 
RenderScript()291     protected RenderScript() {
292     }
293 
create()294     public static RenderScript create() {
295         RenderScript rs = new RenderScript();
296 
297         rs.mDev = rs.nDeviceCreate();
298         rs.mContext = rs.nContextCreate(rs.mDev, 0);
299         rs.mMessageThread = new MessageThread(rs);
300         rs.mMessageThread.start();
301         Element.initPredefined(rs);
302         return rs;
303     }
304 
contextDump(int bits)305     public void contextDump(int bits) {
306         validate();
307         nContextDump(bits);
308     }
309 
destroy()310     public void destroy() {
311         validate();
312         nContextDeinitToClient();
313         mMessageThread.mRun = false;
314 
315         nContextDestroy(mContext);
316         mContext = 0;
317 
318         nDeviceDestroy(mDev);
319         mDev = 0;
320     }
321 
isAlive()322     boolean isAlive() {
323         return mContext != 0;
324     }
325 
326     ///////////////////////////////////////////////////////////////////////////////////
327     // Root state
328 
safeID(BaseObj o)329     protected int safeID(BaseObj o) {
330         if(o != null) {
331             return o.mID;
332         }
333         return 0;
334     }
335 }
336 
337 
338