Home | History | Annotate | Download | only in renderscript
      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;
     46     native protected static void _nInit();
     47 
     48 
     49     static {
     50         sInitialized = false;
     51         try {
     52             System.loadLibrary("rs_jni");
     53             _nInit();
     54             sInitialized = true;
     55         } catch (UnsatisfiedLinkError e) {
     56             Log.d(LOG_TAG, "RenderScript JNI library not found!");
     57         }
     58     }
     59 
     60     native void nInitElements(int a8, int rgba4444, int rgba8888, int rgb565);
     61 
     62     native int  nDeviceCreate();
     63     native void nDeviceDestroy(int dev);
     64     native void nDeviceSetConfig(int dev, int param, int value);
     65     native int  nContextCreateGL(int dev, int ver, boolean useDepth);
     66     native int  nContextCreate(int dev, int ver);
     67     native void nContextDestroy(int con);
     68     native void nContextSetSurface(int w, int h, Surface sur);
     69     native void nContextSetPriority(int p);
     70     native void nContextDump(int bits);
     71 
     72     native void nContextBindRootScript(int script);
     73     native void nContextBindSampler(int sampler, int slot);
     74     native void nContextBindProgramFragmentStore(int pfs);
     75     native void nContextBindProgramFragment(int pf);
     76     native void nContextBindProgramVertex(int pf);
     77     native void nContextBindProgramRaster(int pr);
     78     native void nContextPause();
     79     native void nContextResume();
     80     native int nContextGetMessage(int[] data, boolean wait);
     81     native void nContextInitToClient();
     82     native void nContextDeinitToClient();
     83 
     84     native void nAssignName(int obj, byte[] name);
     85     native void nObjDestroy(int id);
     86     native void nObjDestroyOOB(int id);
     87     native int  nFileOpen(byte[] name);
     88 
     89 
     90     native int  nElementCreate(int type, int kind, boolean norm, int vecSize);
     91     native int  nElementCreate2(int[] elements, String[] names);
     92 
     93     native void nTypeBegin(int elementID);
     94     native void nTypeAdd(int dim, int val);
     95     native int  nTypeCreate();
     96     native void nTypeFinalDestroy(Type t);
     97     native void nTypeSetupFields(Type t, int[] types, int[] bits, Field[] IDs);
     98 
     99     native int  nAllocationCreateTyped(int type);
    100     native int  nAllocationCreateFromBitmap(int dstFmt, boolean genMips, Bitmap bmp);
    101     native int  nAllocationCreateBitmapRef(int type, Bitmap bmp);
    102     native int  nAllocationCreateFromBitmapBoxed(int dstFmt, boolean genMips, Bitmap bmp);
    103     native int  nAllocationCreateFromAssetStream(int dstFmt, boolean genMips, int assetStream);
    104 
    105     native void nAllocationUploadToTexture(int alloc, boolean genMips, int baseMioLevel);
    106     native void nAllocationUploadToBufferObject(int alloc);
    107 
    108     native void nAllocationSubData1D(int id, int off, int count, int[] d, int sizeBytes);
    109     native void nAllocationSubData1D(int id, int off, int count, short[] d, int sizeBytes);
    110     native void nAllocationSubData1D(int id, int off, int count, byte[] d, int sizeBytes);
    111     native void nAllocationSubData1D(int id, int off, int count, float[] d, int sizeBytes);
    112 
    113     native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, int[] d, int sizeBytes);
    114     native void nAllocationSubData2D(int id, int xoff, int yoff, int w, int h, float[] d, int sizeBytes);
    115     native void nAllocationRead(int id, int[] d);
    116     native void nAllocationRead(int id, float[] d);
    117     native void nAllocationSubDataFromObject(int id, Type t, int offset, Object o);
    118     native void nAllocationSubReadFromObject(int id, Type t, int offset, Object o);
    119 
    120     native void nAdapter1DBindAllocation(int ad, int alloc);
    121     native void nAdapter1DSetConstraint(int ad, int dim, int value);
    122     native void nAdapter1DData(int ad, int[] d);
    123     native void nAdapter1DData(int ad, float[] d);
    124     native void nAdapter1DSubData(int ad, int off, int count, int[] d);
    125     native void nAdapter1DSubData(int ad, int off, int count, float[] d);
    126     native int  nAdapter1DCreate();
    127 
    128     native void nAdapter2DBindAllocation(int ad, int alloc);
    129     native void nAdapter2DSetConstraint(int ad, int dim, int value);
    130     native void nAdapter2DData(int ad, int[] d);
    131     native void nAdapter2DData(int ad, float[] d);
    132     native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, int[] d);
    133     native void nAdapter2DSubData(int ad, int xoff, int yoff, int w, int h, float[] d);
    134     native int  nAdapter2DCreate();
    135 
    136     native void nScriptBindAllocation(int script, int alloc, int slot);
    137     native void nScriptSetClearColor(int script, float r, float g, float b, float a);
    138     native void nScriptSetClearDepth(int script, float depth);
    139     native void nScriptSetClearStencil(int script, int stencil);
    140     native void nScriptSetTimeZone(int script, byte[] timeZone);
    141     native void nScriptSetType(int type, boolean writable, String name, int slot);
    142     native void nScriptSetRoot(boolean isRoot);
    143     native void nScriptSetInvokable(String name, int slot);
    144     native void nScriptInvoke(int id, int slot);
    145 
    146     native void nScriptCBegin();
    147     native void nScriptCSetScript(byte[] script, int offset, int length);
    148     native int  nScriptCCreate();
    149     native void nScriptCAddDefineI32(String name, int value);
    150     native void nScriptCAddDefineF(String name, float value);
    151 
    152     native void nSamplerBegin();
    153     native void nSamplerSet(int param, int value);
    154     native int  nSamplerCreate();
    155 
    156     native void nProgramFragmentStoreBegin(int in, int out);
    157     native void nProgramFragmentStoreDepthFunc(int func);
    158     native void nProgramFragmentStoreDepthMask(boolean enable);
    159     native void nProgramFragmentStoreColorMask(boolean r, boolean g, boolean b, boolean a);
    160     native void nProgramFragmentStoreBlendFunc(int src, int dst);
    161     native void nProgramFragmentStoreDither(boolean enable);
    162     native int  nProgramFragmentStoreCreate();
    163 
    164     native int  nProgramRasterCreate(int in, int out, boolean pointSmooth, boolean lineSmooth, boolean pointSprite);
    165     native void nProgramRasterSetLineWidth(int pr, float v);
    166     native void nProgramRasterSetPointSize(int pr, float v);
    167 
    168     native void nProgramBindConstants(int pv, int slot, int mID);
    169     native void nProgramBindTexture(int vpf, int slot, int a);
    170     native void nProgramBindSampler(int vpf, int slot, int s);
    171 
    172     native int  nProgramFragmentCreate(int[] params);
    173     native int  nProgramFragmentCreate2(String shader, int[] params);
    174 
    175     native int  nProgramVertexCreate(boolean texMat);
    176     native int  nProgramVertexCreate2(String shader, int[] params);
    177 
    178     native void nLightBegin();
    179     native void nLightSetIsMono(boolean isMono);
    180     native void nLightSetIsLocal(boolean isLocal);
    181     native int  nLightCreate();
    182     native void nLightSetColor(int l, float r, float g, float b);
    183     native void nLightSetPosition(int l, float x, float y, float z);
    184 
    185     native int  nSimpleMeshCreate(int batchID, int idxID, int[] vtxID, int prim);
    186     native void nSimpleMeshBindVertex(int id, int alloc, int slot);
    187     native void nSimpleMeshBindIndex(int id, int alloc);
    188 
    189     native void nAnimationBegin(int attribCount, int keyframeCount);
    190     native void nAnimationAdd(float time, float[] attribs);
    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;
    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;
    237         Priority(int id) {
    238             mID = id;
    239         }
    240     }
    241 
    242     void validate() {
    243         if (mContext == 0) {
    244             throw new IllegalStateException("Calling RS with no Context active.");
    245         }
    246     }
    247 
    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 
    257         MessageThread(RenderScript rs) {
    258             super("RSMessageThread");
    259             mRS = rs;
    260 
    261         }
    262 
    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 
    291     protected RenderScript() {
    292     }
    293 
    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 
    305     public void contextDump(int bits) {
    306         validate();
    307         nContextDump(bits);
    308     }
    309 
    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 
    322     boolean isAlive() {
    323         return mContext != 0;
    324     }
    325 
    326     ///////////////////////////////////////////////////////////////////////////////////
    327     // Root state
    328 
    329     protected int safeID(BaseObj o) {
    330         if(o != null) {
    331             return o.mID;
    332         }
    333         return 0;
    334     }
    335 }
    336 
    337 
    338