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.content.Context;
     22 import android.content.pm.ApplicationInfo;
     23 import android.content.pm.PackageManager;
     24 import android.content.res.AssetManager;
     25 import android.graphics.Bitmap;
     26 import android.graphics.BitmapFactory;
     27 import android.graphics.SurfaceTexture;
     28 import android.os.Process;
     29 import android.util.Log;
     30 import android.view.Surface;
     31 
     32 
     33 
     34 /**
     35  * Renderscript base master class.  An instance of this class creates native
     36  * worker threads for processing commands from this object.  This base class
     37  * does not provide any extended capabilities beyond simple data processing.
     38  * For extended capabilities use derived classes such as RenderScriptGL.
     39  *
     40  * <div class="special reference">
     41  * <h3>Developer Guides</h3>
     42  * <p>For more information about creating an application that uses Renderscript, read the
     43  * <a href="{@docRoot}guide/topics/graphics/renderscript.html">Renderscript</a> developer guide.</p>
     44  * </div>
     45  **/
     46 public class RenderScript {
     47     static final String LOG_TAG = "RenderScript_jni";
     48     static final boolean DEBUG  = false;
     49     @SuppressWarnings({"UnusedDeclaration", "deprecation"})
     50     static final boolean LOG_ENABLED = false;
     51 
     52     private Context mApplicationContext;
     53 
     54     /*
     55      * We use a class initializer to allow the native code to cache some
     56      * field offsets.
     57      */
     58     @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
     59     static boolean sInitialized;
     60     native static void _nInit();
     61 
     62 
     63     static {
     64         sInitialized = false;
     65         try {
     66             System.loadLibrary("rs_jni");
     67             _nInit();
     68             sInitialized = true;
     69         } catch (UnsatisfiedLinkError e) {
     70             Log.e(LOG_TAG, "Error loading RS jni library: " + e);
     71             throw new RSRuntimeException("Error loading RS jni library: " + e);
     72         }
     73     }
     74 
     75     // Non-threadsafe functions.
     76     native int  nDeviceCreate();
     77     native void nDeviceDestroy(int dev);
     78     native void nDeviceSetConfig(int dev, int param, int value);
     79     native int nContextGetUserMessage(int con, int[] data);
     80     native String nContextGetErrorMessage(int con);
     81     native int  nContextPeekMessage(int con, int[] subID);
     82     native void nContextInitToClient(int con);
     83     native void nContextDeinitToClient(int con);
     84 
     85 
     86     // Methods below are wrapped to protect the non-threadsafe
     87     // lockless fifo.
     88     native int  rsnContextCreateGL(int dev, int ver, int sdkVer,
     89                  int colorMin, int colorPref,
     90                  int alphaMin, int alphaPref,
     91                  int depthMin, int depthPref,
     92                  int stencilMin, int stencilPref,
     93                  int samplesMin, int samplesPref, float samplesQ, int dpi);
     94     synchronized int nContextCreateGL(int dev, int ver, int sdkVer,
     95                  int colorMin, int colorPref,
     96                  int alphaMin, int alphaPref,
     97                  int depthMin, int depthPref,
     98                  int stencilMin, int stencilPref,
     99                  int samplesMin, int samplesPref, float samplesQ, int dpi) {
    100         return rsnContextCreateGL(dev, ver, sdkVer, colorMin, colorPref,
    101                                   alphaMin, alphaPref, depthMin, depthPref,
    102                                   stencilMin, stencilPref,
    103                                   samplesMin, samplesPref, samplesQ, dpi);
    104     }
    105     native int  rsnContextCreate(int dev, int ver, int sdkVer);
    106     synchronized int nContextCreate(int dev, int ver, int sdkVer) {
    107         return rsnContextCreate(dev, ver, sdkVer);
    108     }
    109     native void rsnContextDestroy(int con);
    110     synchronized void nContextDestroy() {
    111         validate();
    112         rsnContextDestroy(mContext);
    113     }
    114     native void rsnContextSetSurface(int con, int w, int h, Surface sur);
    115     synchronized void nContextSetSurface(int w, int h, Surface sur) {
    116         validate();
    117         rsnContextSetSurface(mContext, w, h, sur);
    118     }
    119     native void rsnContextSetSurfaceTexture(int con, int w, int h, SurfaceTexture sur);
    120     synchronized void nContextSetSurfaceTexture(int w, int h, SurfaceTexture sur) {
    121         validate();
    122         rsnContextSetSurfaceTexture(mContext, w, h, sur);
    123     }
    124     native void rsnContextSetPriority(int con, int p);
    125     synchronized void nContextSetPriority(int p) {
    126         validate();
    127         rsnContextSetPriority(mContext, p);
    128     }
    129     native void rsnContextDump(int con, int bits);
    130     synchronized void nContextDump(int bits) {
    131         validate();
    132         rsnContextDump(mContext, bits);
    133     }
    134     native void rsnContextFinish(int con);
    135     synchronized void nContextFinish() {
    136         validate();
    137         rsnContextFinish(mContext);
    138     }
    139 
    140     native void rsnContextBindRootScript(int con, int script);
    141     synchronized void nContextBindRootScript(int script) {
    142         validate();
    143         rsnContextBindRootScript(mContext, script);
    144     }
    145     native void rsnContextBindSampler(int con, int sampler, int slot);
    146     synchronized void nContextBindSampler(int sampler, int slot) {
    147         validate();
    148         rsnContextBindSampler(mContext, sampler, slot);
    149     }
    150     native void rsnContextBindProgramStore(int con, int pfs);
    151     synchronized void nContextBindProgramStore(int pfs) {
    152         validate();
    153         rsnContextBindProgramStore(mContext, pfs);
    154     }
    155     native void rsnContextBindProgramFragment(int con, int pf);
    156     synchronized void nContextBindProgramFragment(int pf) {
    157         validate();
    158         rsnContextBindProgramFragment(mContext, pf);
    159     }
    160     native void rsnContextBindProgramVertex(int con, int pv);
    161     synchronized void nContextBindProgramVertex(int pv) {
    162         validate();
    163         rsnContextBindProgramVertex(mContext, pv);
    164     }
    165     native void rsnContextBindProgramRaster(int con, int pr);
    166     synchronized void nContextBindProgramRaster(int pr) {
    167         validate();
    168         rsnContextBindProgramRaster(mContext, pr);
    169     }
    170     native void rsnContextPause(int con);
    171     synchronized void nContextPause() {
    172         validate();
    173         rsnContextPause(mContext);
    174     }
    175     native void rsnContextResume(int con);
    176     synchronized void nContextResume() {
    177         validate();
    178         rsnContextResume(mContext);
    179     }
    180 
    181     native void rsnAssignName(int con, int obj, byte[] name);
    182     synchronized void nAssignName(int obj, byte[] name) {
    183         validate();
    184         rsnAssignName(mContext, obj, name);
    185     }
    186     native String rsnGetName(int con, int obj);
    187     synchronized String nGetName(int obj) {
    188         validate();
    189         return rsnGetName(mContext, obj);
    190     }
    191     native void rsnObjDestroy(int con, int id);
    192     synchronized void nObjDestroy(int id) {
    193         // There is a race condition here.  The calling code may be run
    194         // by the gc while teardown is occuring.  This protects againts
    195         // deleting dead objects.
    196         if (mContext != 0) {
    197             rsnObjDestroy(mContext, id);
    198         }
    199     }
    200 
    201     native int  rsnElementCreate(int con, int type, int kind, boolean norm, int vecSize);
    202     synchronized int nElementCreate(int type, int kind, boolean norm, int vecSize) {
    203         validate();
    204         return rsnElementCreate(mContext, type, kind, norm, vecSize);
    205     }
    206     native int  rsnElementCreate2(int con, int[] elements, String[] names, int[] arraySizes);
    207     synchronized int nElementCreate2(int[] elements, String[] names, int[] arraySizes) {
    208         validate();
    209         return rsnElementCreate2(mContext, elements, names, arraySizes);
    210     }
    211     native void rsnElementGetNativeData(int con, int id, int[] elementData);
    212     synchronized void nElementGetNativeData(int id, int[] elementData) {
    213         validate();
    214         rsnElementGetNativeData(mContext, id, elementData);
    215     }
    216     native void rsnElementGetSubElements(int con, int id,
    217                                          int[] IDs, String[] names, int[] arraySizes);
    218     synchronized void nElementGetSubElements(int id, int[] IDs, String[] names, int[] arraySizes) {
    219         validate();
    220         rsnElementGetSubElements(mContext, id, IDs, names, arraySizes);
    221     }
    222 
    223     native int rsnTypeCreate(int con, int eid, int x, int y, int z, boolean mips, boolean faces);
    224     synchronized int nTypeCreate(int eid, int x, int y, int z, boolean mips, boolean faces) {
    225         validate();
    226         return rsnTypeCreate(mContext, eid, x, y, z, mips, faces);
    227     }
    228     native void rsnTypeGetNativeData(int con, int id, int[] typeData);
    229     synchronized void nTypeGetNativeData(int id, int[] typeData) {
    230         validate();
    231         rsnTypeGetNativeData(mContext, id, typeData);
    232     }
    233 
    234     native int  rsnAllocationCreateTyped(int con, int type, int mip, int usage);
    235     synchronized int nAllocationCreateTyped(int type, int mip, int usage) {
    236         validate();
    237         return rsnAllocationCreateTyped(mContext, type, mip, usage);
    238     }
    239     native int  rsnAllocationCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
    240     synchronized int nAllocationCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
    241         validate();
    242         return rsnAllocationCreateFromBitmap(mContext, type, mip, bmp, usage);
    243     }
    244     native int  rsnAllocationCubeCreateFromBitmap(int con, int type, int mip, Bitmap bmp, int usage);
    245     synchronized int nAllocationCubeCreateFromBitmap(int type, int mip, Bitmap bmp, int usage) {
    246         validate();
    247         return rsnAllocationCubeCreateFromBitmap(mContext, type, mip, bmp, usage);
    248     }
    249     native int  rsnAllocationCreateBitmapRef(int con, int type, Bitmap bmp);
    250     synchronized int nAllocationCreateBitmapRef(int type, Bitmap bmp) {
    251         validate();
    252         return rsnAllocationCreateBitmapRef(mContext, type, bmp);
    253     }
    254     native int  rsnAllocationCreateFromAssetStream(int con, int mips, int assetStream, int usage);
    255     synchronized int nAllocationCreateFromAssetStream(int mips, int assetStream, int usage) {
    256         validate();
    257         return rsnAllocationCreateFromAssetStream(mContext, mips, assetStream, usage);
    258     }
    259 
    260     native void  rsnAllocationCopyToBitmap(int con, int alloc, Bitmap bmp);
    261     synchronized void nAllocationCopyToBitmap(int alloc, Bitmap bmp) {
    262         validate();
    263         rsnAllocationCopyToBitmap(mContext, alloc, bmp);
    264     }
    265 
    266 
    267     native void rsnAllocationSyncAll(int con, int alloc, int src);
    268     synchronized void nAllocationSyncAll(int alloc, int src) {
    269         validate();
    270         rsnAllocationSyncAll(mContext, alloc, src);
    271     }
    272     native void rsnAllocationGenerateMipmaps(int con, int alloc);
    273     synchronized void nAllocationGenerateMipmaps(int alloc) {
    274         validate();
    275         rsnAllocationGenerateMipmaps(mContext, alloc);
    276     }
    277     native void  rsnAllocationCopyFromBitmap(int con, int alloc, Bitmap bmp);
    278     synchronized void nAllocationCopyFromBitmap(int alloc, Bitmap bmp) {
    279         validate();
    280         rsnAllocationCopyFromBitmap(mContext, alloc, bmp);
    281     }
    282 
    283 
    284     native void rsnAllocationData1D(int con, int id, int off, int mip, int count, int[] d, int sizeBytes);
    285     synchronized void nAllocationData1D(int id, int off, int mip, int count, int[] d, int sizeBytes) {
    286         validate();
    287         rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
    288     }
    289     native void rsnAllocationData1D(int con, int id, int off, int mip, int count, short[] d, int sizeBytes);
    290     synchronized void nAllocationData1D(int id, int off, int mip, int count, short[] d, int sizeBytes) {
    291         validate();
    292         rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
    293     }
    294     native void rsnAllocationData1D(int con, int id, int off, int mip, int count, byte[] d, int sizeBytes);
    295     synchronized void nAllocationData1D(int id, int off, int mip, int count, byte[] d, int sizeBytes) {
    296         validate();
    297         rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
    298     }
    299     native void rsnAllocationData1D(int con, int id, int off, int mip, int count, float[] d, int sizeBytes);
    300     synchronized void nAllocationData1D(int id, int off, int mip, int count, float[] d, int sizeBytes) {
    301         validate();
    302         rsnAllocationData1D(mContext, id, off, mip, count, d, sizeBytes);
    303     }
    304 
    305     native void rsnAllocationElementData1D(int con, int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes);
    306     synchronized void nAllocationElementData1D(int id, int xoff, int mip, int compIdx, byte[] d, int sizeBytes) {
    307         validate();
    308         rsnAllocationElementData1D(mContext, id, xoff, mip, compIdx, d, sizeBytes);
    309     }
    310 
    311     native void rsnAllocationData2D(int con,
    312                                     int dstAlloc, int dstXoff, int dstYoff,
    313                                     int dstMip, int dstFace,
    314                                     int width, int height,
    315                                     int srcAlloc, int srcXoff, int srcYoff,
    316                                     int srcMip, int srcFace);
    317     synchronized void nAllocationData2D(int dstAlloc, int dstXoff, int dstYoff,
    318                                         int dstMip, int dstFace,
    319                                         int width, int height,
    320                                         int srcAlloc, int srcXoff, int srcYoff,
    321                                         int srcMip, int srcFace) {
    322         validate();
    323         rsnAllocationData2D(mContext,
    324                             dstAlloc, dstXoff, dstYoff,
    325                             dstMip, dstFace,
    326                             width, height,
    327                             srcAlloc, srcXoff, srcYoff,
    328                             srcMip, srcFace);
    329     }
    330 
    331     native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes);
    332     synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, byte[] d, int sizeBytes) {
    333         validate();
    334         rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
    335     }
    336     native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes);
    337     synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, short[] d, int sizeBytes) {
    338         validate();
    339         rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
    340     }
    341     native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes);
    342     synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, int[] d, int sizeBytes) {
    343         validate();
    344         rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
    345     }
    346     native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes);
    347     synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, int w, int h, float[] d, int sizeBytes) {
    348         validate();
    349         rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, w, h, d, sizeBytes);
    350     }
    351     native void rsnAllocationData2D(int con, int id, int xoff, int yoff, int mip, int face, Bitmap b);
    352     synchronized void nAllocationData2D(int id, int xoff, int yoff, int mip, int face, Bitmap b) {
    353         validate();
    354         rsnAllocationData2D(mContext, id, xoff, yoff, mip, face, b);
    355     }
    356 
    357     native void rsnAllocationRead(int con, int id, byte[] d);
    358     synchronized void nAllocationRead(int id, byte[] d) {
    359         validate();
    360         rsnAllocationRead(mContext, id, d);
    361     }
    362     native void rsnAllocationRead(int con, int id, short[] d);
    363     synchronized void nAllocationRead(int id, short[] d) {
    364         validate();
    365         rsnAllocationRead(mContext, id, d);
    366     }
    367     native void rsnAllocationRead(int con, int id, int[] d);
    368     synchronized void nAllocationRead(int id, int[] d) {
    369         validate();
    370         rsnAllocationRead(mContext, id, d);
    371     }
    372     native void rsnAllocationRead(int con, int id, float[] d);
    373     synchronized void nAllocationRead(int id, float[] d) {
    374         validate();
    375         rsnAllocationRead(mContext, id, d);
    376     }
    377     native int  rsnAllocationGetType(int con, int id);
    378     synchronized int nAllocationGetType(int id) {
    379         validate();
    380         return rsnAllocationGetType(mContext, id);
    381     }
    382 
    383     native void rsnAllocationResize1D(int con, int id, int dimX);
    384     synchronized void nAllocationResize1D(int id, int dimX) {
    385         validate();
    386         rsnAllocationResize1D(mContext, id, dimX);
    387     }
    388     native void rsnAllocationResize2D(int con, int id, int dimX, int dimY);
    389     synchronized void nAllocationResize2D(int id, int dimX, int dimY) {
    390         validate();
    391         rsnAllocationResize2D(mContext, id, dimX, dimY);
    392     }
    393 
    394     native int  rsnFileA3DCreateFromAssetStream(int con, int assetStream);
    395     synchronized int nFileA3DCreateFromAssetStream(int assetStream) {
    396         validate();
    397         return rsnFileA3DCreateFromAssetStream(mContext, assetStream);
    398     }
    399     native int  rsnFileA3DCreateFromFile(int con, String path);
    400     synchronized int nFileA3DCreateFromFile(String path) {
    401         validate();
    402         return rsnFileA3DCreateFromFile(mContext, path);
    403     }
    404     native int  rsnFileA3DCreateFromAsset(int con, AssetManager mgr, String path);
    405     synchronized int nFileA3DCreateFromAsset(AssetManager mgr, String path) {
    406         validate();
    407         return rsnFileA3DCreateFromAsset(mContext, mgr, path);
    408     }
    409     native int  rsnFileA3DGetNumIndexEntries(int con, int fileA3D);
    410     synchronized int nFileA3DGetNumIndexEntries(int fileA3D) {
    411         validate();
    412         return rsnFileA3DGetNumIndexEntries(mContext, fileA3D);
    413     }
    414     native void rsnFileA3DGetIndexEntries(int con, int fileA3D, int numEntries, int[] IDs, String[] names);
    415     synchronized void nFileA3DGetIndexEntries(int fileA3D, int numEntries, int[] IDs, String[] names) {
    416         validate();
    417         rsnFileA3DGetIndexEntries(mContext, fileA3D, numEntries, IDs, names);
    418     }
    419     native int  rsnFileA3DGetEntryByIndex(int con, int fileA3D, int index);
    420     synchronized int nFileA3DGetEntryByIndex(int fileA3D, int index) {
    421         validate();
    422         return rsnFileA3DGetEntryByIndex(mContext, fileA3D, index);
    423     }
    424 
    425     native int  rsnFontCreateFromFile(int con, String fileName, float size, int dpi);
    426     synchronized int nFontCreateFromFile(String fileName, float size, int dpi) {
    427         validate();
    428         return rsnFontCreateFromFile(mContext, fileName, size, dpi);
    429     }
    430     native int  rsnFontCreateFromAssetStream(int con, String name, float size, int dpi, int assetStream);
    431     synchronized int nFontCreateFromAssetStream(String name, float size, int dpi, int assetStream) {
    432         validate();
    433         return rsnFontCreateFromAssetStream(mContext, name, size, dpi, assetStream);
    434     }
    435     native int  rsnFontCreateFromAsset(int con, AssetManager mgr, String path, float size, int dpi);
    436     synchronized int nFontCreateFromAsset(AssetManager mgr, String path, float size, int dpi) {
    437         validate();
    438         return rsnFontCreateFromAsset(mContext, mgr, path, size, dpi);
    439     }
    440 
    441 
    442     native void rsnScriptBindAllocation(int con, int script, int alloc, int slot);
    443     synchronized void nScriptBindAllocation(int script, int alloc, int slot) {
    444         validate();
    445         rsnScriptBindAllocation(mContext, script, alloc, slot);
    446     }
    447     native void rsnScriptSetTimeZone(int con, int script, byte[] timeZone);
    448     synchronized void nScriptSetTimeZone(int script, byte[] timeZone) {
    449         validate();
    450         rsnScriptSetTimeZone(mContext, script, timeZone);
    451     }
    452     native void rsnScriptInvoke(int con, int id, int slot);
    453     synchronized void nScriptInvoke(int id, int slot) {
    454         validate();
    455         rsnScriptInvoke(mContext, id, slot);
    456     }
    457     native void rsnScriptForEach(int con, int id, int slot, int ain, int aout, byte[] params);
    458     native void rsnScriptForEach(int con, int id, int slot, int ain, int aout);
    459     synchronized void nScriptForEach(int id, int slot, int ain, int aout, byte[] params) {
    460         validate();
    461         if (params == null) {
    462             rsnScriptForEach(mContext, id, slot, ain, aout);
    463         } else {
    464             rsnScriptForEach(mContext, id, slot, ain, aout, params);
    465         }
    466     }
    467     native void rsnScriptInvokeV(int con, int id, int slot, byte[] params);
    468     synchronized void nScriptInvokeV(int id, int slot, byte[] params) {
    469         validate();
    470         rsnScriptInvokeV(mContext, id, slot, params);
    471     }
    472     native void rsnScriptSetVarI(int con, int id, int slot, int val);
    473     synchronized void nScriptSetVarI(int id, int slot, int val) {
    474         validate();
    475         rsnScriptSetVarI(mContext, id, slot, val);
    476     }
    477     native void rsnScriptSetVarJ(int con, int id, int slot, long val);
    478     synchronized void nScriptSetVarJ(int id, int slot, long val) {
    479         validate();
    480         rsnScriptSetVarJ(mContext, id, slot, val);
    481     }
    482     native void rsnScriptSetVarF(int con, int id, int slot, float val);
    483     synchronized void nScriptSetVarF(int id, int slot, float val) {
    484         validate();
    485         rsnScriptSetVarF(mContext, id, slot, val);
    486     }
    487     native void rsnScriptSetVarD(int con, int id, int slot, double val);
    488     synchronized void nScriptSetVarD(int id, int slot, double val) {
    489         validate();
    490         rsnScriptSetVarD(mContext, id, slot, val);
    491     }
    492     native void rsnScriptSetVarV(int con, int id, int slot, byte[] val);
    493     synchronized void nScriptSetVarV(int id, int slot, byte[] val) {
    494         validate();
    495         rsnScriptSetVarV(mContext, id, slot, val);
    496     }
    497     native void rsnScriptSetVarObj(int con, int id, int slot, int val);
    498     synchronized void nScriptSetVarObj(int id, int slot, int val) {
    499         validate();
    500         rsnScriptSetVarObj(mContext, id, slot, val);
    501     }
    502 
    503     native int  rsnScriptCCreate(int con, String resName, String cacheDir,
    504                                  byte[] script, int length);
    505     synchronized int nScriptCCreate(String resName, String cacheDir, byte[] script, int length) {
    506         validate();
    507         return rsnScriptCCreate(mContext, resName, cacheDir, script, length);
    508     }
    509 
    510     native int  rsnSamplerCreate(int con, int magFilter, int minFilter,
    511                                  int wrapS, int wrapT, int wrapR, float aniso);
    512     synchronized int nSamplerCreate(int magFilter, int minFilter,
    513                                  int wrapS, int wrapT, int wrapR, float aniso) {
    514         validate();
    515         return rsnSamplerCreate(mContext, magFilter, minFilter, wrapS, wrapT, wrapR, aniso);
    516     }
    517 
    518     native int  rsnProgramStoreCreate(int con, boolean r, boolean g, boolean b, boolean a,
    519                                       boolean depthMask, boolean dither,
    520                                       int srcMode, int dstMode, int depthFunc);
    521     synchronized int nProgramStoreCreate(boolean r, boolean g, boolean b, boolean a,
    522                                          boolean depthMask, boolean dither,
    523                                          int srcMode, int dstMode, int depthFunc) {
    524         validate();
    525         return rsnProgramStoreCreate(mContext, r, g, b, a, depthMask, dither, srcMode,
    526                                      dstMode, depthFunc);
    527     }
    528 
    529     native int  rsnProgramRasterCreate(int con, boolean pointSprite, int cullMode);
    530     synchronized int nProgramRasterCreate(boolean pointSprite, int cullMode) {
    531         validate();
    532         return rsnProgramRasterCreate(mContext, pointSprite, cullMode);
    533     }
    534 
    535     native void rsnProgramBindConstants(int con, int pv, int slot, int mID);
    536     synchronized void nProgramBindConstants(int pv, int slot, int mID) {
    537         validate();
    538         rsnProgramBindConstants(mContext, pv, slot, mID);
    539     }
    540     native void rsnProgramBindTexture(int con, int vpf, int slot, int a);
    541     synchronized void nProgramBindTexture(int vpf, int slot, int a) {
    542         validate();
    543         rsnProgramBindTexture(mContext, vpf, slot, a);
    544     }
    545     native void rsnProgramBindSampler(int con, int vpf, int slot, int s);
    546     synchronized void nProgramBindSampler(int vpf, int slot, int s) {
    547         validate();
    548         rsnProgramBindSampler(mContext, vpf, slot, s);
    549     }
    550     native int  rsnProgramFragmentCreate(int con, String shader, int[] params);
    551     synchronized int nProgramFragmentCreate(String shader, int[] params) {
    552         validate();
    553         return rsnProgramFragmentCreate(mContext, shader, params);
    554     }
    555     native int  rsnProgramVertexCreate(int con, String shader, int[] params);
    556     synchronized int nProgramVertexCreate(String shader, int[] params) {
    557         validate();
    558         return rsnProgramVertexCreate(mContext, shader, params);
    559     }
    560 
    561     native int  rsnMeshCreate(int con, int[] vtx, int[] idx, int[] prim);
    562     synchronized int nMeshCreate(int[] vtx, int[] idx, int[] prim) {
    563         validate();
    564         return rsnMeshCreate(mContext, vtx, idx, prim);
    565     }
    566     native int  rsnMeshGetVertexBufferCount(int con, int id);
    567     synchronized int nMeshGetVertexBufferCount(int id) {
    568         validate();
    569         return rsnMeshGetVertexBufferCount(mContext, id);
    570     }
    571     native int  rsnMeshGetIndexCount(int con, int id);
    572     synchronized int nMeshGetIndexCount(int id) {
    573         validate();
    574         return rsnMeshGetIndexCount(mContext, id);
    575     }
    576     native void rsnMeshGetVertices(int con, int id, int[] vtxIds, int vtxIdCount);
    577     synchronized void nMeshGetVertices(int id, int[] vtxIds, int vtxIdCount) {
    578         validate();
    579         rsnMeshGetVertices(mContext, id, vtxIds, vtxIdCount);
    580     }
    581     native void rsnMeshGetIndices(int con, int id, int[] idxIds, int[] primitives, int vtxIdCount);
    582     synchronized void nMeshGetIndices(int id, int[] idxIds, int[] primitives, int vtxIdCount) {
    583         validate();
    584         rsnMeshGetIndices(mContext, id, idxIds, primitives, vtxIdCount);
    585     }
    586 
    587 
    588     int     mDev;
    589     int     mContext;
    590     @SuppressWarnings({"FieldCanBeLocal"})
    591     MessageThread mMessageThread;
    592 
    593     Element mElement_U8;
    594     Element mElement_I8;
    595     Element mElement_U16;
    596     Element mElement_I16;
    597     Element mElement_U32;
    598     Element mElement_I32;
    599     Element mElement_U64;
    600     Element mElement_I64;
    601     Element mElement_F32;
    602     Element mElement_F64;
    603     Element mElement_BOOLEAN;
    604 
    605     Element mElement_ELEMENT;
    606     Element mElement_TYPE;
    607     Element mElement_ALLOCATION;
    608     Element mElement_SAMPLER;
    609     Element mElement_SCRIPT;
    610     Element mElement_MESH;
    611     Element mElement_PROGRAM_FRAGMENT;
    612     Element mElement_PROGRAM_VERTEX;
    613     Element mElement_PROGRAM_RASTER;
    614     Element mElement_PROGRAM_STORE;
    615 
    616     Element mElement_A_8;
    617     Element mElement_RGB_565;
    618     Element mElement_RGB_888;
    619     Element mElement_RGBA_5551;
    620     Element mElement_RGBA_4444;
    621     Element mElement_RGBA_8888;
    622 
    623     Element mElement_FLOAT_2;
    624     Element mElement_FLOAT_3;
    625     Element mElement_FLOAT_4;
    626 
    627     Element mElement_DOUBLE_2;
    628     Element mElement_DOUBLE_3;
    629     Element mElement_DOUBLE_4;
    630 
    631     Element mElement_UCHAR_2;
    632     Element mElement_UCHAR_3;
    633     Element mElement_UCHAR_4;
    634 
    635     Element mElement_CHAR_2;
    636     Element mElement_CHAR_3;
    637     Element mElement_CHAR_4;
    638 
    639     Element mElement_USHORT_2;
    640     Element mElement_USHORT_3;
    641     Element mElement_USHORT_4;
    642 
    643     Element mElement_SHORT_2;
    644     Element mElement_SHORT_3;
    645     Element mElement_SHORT_4;
    646 
    647     Element mElement_UINT_2;
    648     Element mElement_UINT_3;
    649     Element mElement_UINT_4;
    650 
    651     Element mElement_INT_2;
    652     Element mElement_INT_3;
    653     Element mElement_INT_4;
    654 
    655     Element mElement_ULONG_2;
    656     Element mElement_ULONG_3;
    657     Element mElement_ULONG_4;
    658 
    659     Element mElement_LONG_2;
    660     Element mElement_LONG_3;
    661     Element mElement_LONG_4;
    662 
    663     Element mElement_MATRIX_4X4;
    664     Element mElement_MATRIX_3X3;
    665     Element mElement_MATRIX_2X2;
    666 
    667     Sampler mSampler_CLAMP_NEAREST;
    668     Sampler mSampler_CLAMP_LINEAR;
    669     Sampler mSampler_CLAMP_LINEAR_MIP_LINEAR;
    670     Sampler mSampler_WRAP_NEAREST;
    671     Sampler mSampler_WRAP_LINEAR;
    672     Sampler mSampler_WRAP_LINEAR_MIP_LINEAR;
    673 
    674     ProgramStore mProgramStore_BLEND_NONE_DEPTH_TEST;
    675     ProgramStore mProgramStore_BLEND_NONE_DEPTH_NO_DEPTH;
    676     ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_TEST;
    677     ProgramStore mProgramStore_BLEND_ALPHA_DEPTH_NO_DEPTH;
    678 
    679     ProgramRaster mProgramRaster_CULL_BACK;
    680     ProgramRaster mProgramRaster_CULL_FRONT;
    681     ProgramRaster mProgramRaster_CULL_NONE;
    682 
    683     ///////////////////////////////////////////////////////////////////////////////////
    684     //
    685 
    686     /**
    687      * Base class application should derive from for handling RS messages
    688      * coming from their scripts.  When a script calls sendToClient the data
    689      * fields will be filled in and then the run method called by a message
    690      * handling thread.  This will occur some time after sendToClient completes
    691      * in the script.
    692      *
    693      */
    694     public static class RSMessageHandler implements Runnable {
    695         protected int[] mData;
    696         protected int mID;
    697         protected int mLength;
    698         public void run() {
    699         }
    700     }
    701     /**
    702      * If an application is expecting messages it should set this field to an
    703      * instance of RSMessage.  This instance will receive all the user messages
    704      * sent from sendToClient by scripts from this context.
    705      *
    706      */
    707     RSMessageHandler mMessageCallback = null;
    708 
    709     public void setMessageHandler(RSMessageHandler msg) {
    710         mMessageCallback = msg;
    711     }
    712     public RSMessageHandler getMessageHandler() {
    713         return mMessageCallback;
    714     }
    715 
    716     /**
    717      * Runtime error base class.  An application should derive from this class
    718      * if it wishes to install an error handler.  When errors occur at runtime
    719      * the fields in this class will be filled and the run method called.
    720      *
    721      */
    722     public static class RSErrorHandler implements Runnable {
    723         protected String mErrorMessage;
    724         protected int mErrorNum;
    725         public void run() {
    726         }
    727     }
    728 
    729     /**
    730      * Application Error handler.  All runtime errors will be dispatched to the
    731      * instance of RSAsyncError set here.  If this field is null a
    732      * RSRuntimeException will instead be thrown with details about the error.
    733      * This will cause program termaination.
    734      *
    735      */
    736     RSErrorHandler mErrorCallback = null;
    737 
    738     public void setErrorHandler(RSErrorHandler msg) {
    739         mErrorCallback = msg;
    740     }
    741     public RSErrorHandler getErrorHandler() {
    742         return mErrorCallback;
    743     }
    744 
    745     /**
    746      * RenderScript worker threads priority enumeration.  The default value is
    747      * NORMAL.  Applications wishing to do background processing such as
    748      * wallpapers should set their priority to LOW to avoid starving forground
    749      * processes.
    750      */
    751     public enum Priority {
    752         LOW (Process.THREAD_PRIORITY_BACKGROUND + (5 * Process.THREAD_PRIORITY_LESS_FAVORABLE)),
    753         NORMAL (Process.THREAD_PRIORITY_DISPLAY);
    754 
    755         int mID;
    756         Priority(int id) {
    757             mID = id;
    758         }
    759     }
    760 
    761     void validate() {
    762         if (mContext == 0) {
    763             throw new RSInvalidStateException("Calling RS with no Context active.");
    764         }
    765     }
    766 
    767 
    768     /**
    769      * Change the priority of the worker threads for this context.
    770      *
    771      * @param p New priority to be set.
    772      */
    773     public void setPriority(Priority p) {
    774         validate();
    775         nContextSetPriority(p.mID);
    776     }
    777 
    778     static class MessageThread extends Thread {
    779         RenderScript mRS;
    780         boolean mRun = true;
    781         int[] mAuxData = new int[2];
    782 
    783         static final int RS_MESSAGE_TO_CLIENT_NONE = 0;
    784         static final int RS_MESSAGE_TO_CLIENT_EXCEPTION = 1;
    785         static final int RS_MESSAGE_TO_CLIENT_RESIZE = 2;
    786         static final int RS_MESSAGE_TO_CLIENT_ERROR = 3;
    787         static final int RS_MESSAGE_TO_CLIENT_USER = 4;
    788 
    789         static final int RS_ERROR_FATAL_UNKNOWN = 0x1000;
    790 
    791         MessageThread(RenderScript rs) {
    792             super("RSMessageThread");
    793             mRS = rs;
    794 
    795         }
    796 
    797         public void run() {
    798             // This function is a temporary solution.  The final solution will
    799             // used typed allocations where the message id is the type indicator.
    800             int[] rbuf = new int[16];
    801             mRS.nContextInitToClient(mRS.mContext);
    802             while(mRun) {
    803                 rbuf[0] = 0;
    804                 int msg = mRS.nContextPeekMessage(mRS.mContext, mAuxData);
    805                 int size = mAuxData[1];
    806                 int subID = mAuxData[0];
    807 
    808                 if (msg == RS_MESSAGE_TO_CLIENT_USER) {
    809                     if ((size>>2) >= rbuf.length) {
    810                         rbuf = new int[(size + 3) >> 2];
    811                     }
    812                     if (mRS.nContextGetUserMessage(mRS.mContext, rbuf) !=
    813                         RS_MESSAGE_TO_CLIENT_USER) {
    814                         throw new RSDriverException("Error processing message from Renderscript.");
    815                     }
    816 
    817                     if(mRS.mMessageCallback != null) {
    818                         mRS.mMessageCallback.mData = rbuf;
    819                         mRS.mMessageCallback.mID = subID;
    820                         mRS.mMessageCallback.mLength = size;
    821                         mRS.mMessageCallback.run();
    822                     } else {
    823                         throw new RSInvalidStateException("Received a message from the script with no message handler installed.");
    824                     }
    825                     continue;
    826                 }
    827 
    828                 if (msg == RS_MESSAGE_TO_CLIENT_ERROR) {
    829                     String e = mRS.nContextGetErrorMessage(mRS.mContext);
    830 
    831                     if (subID >= RS_ERROR_FATAL_UNKNOWN) {
    832                         throw new RSRuntimeException("Fatal error " + subID + ", details: " + e);
    833                     }
    834 
    835                     if(mRS.mErrorCallback != null) {
    836                         mRS.mErrorCallback.mErrorMessage = e;
    837                         mRS.mErrorCallback.mErrorNum = subID;
    838                         mRS.mErrorCallback.run();
    839                     } else {
    840                         //throw new RSRuntimeException("Received error num " + subID + ", details: " + e);
    841                     }
    842                     continue;
    843                 }
    844 
    845                 // 2: teardown.
    846                 // But we want to avoid starving other threads during
    847                 // teardown by yielding until the next line in the destructor
    848                 // can execute to set mRun = false
    849                 try {
    850                     sleep(1, 0);
    851                 } catch(InterruptedException e) {
    852                 }
    853             }
    854             Log.d(LOG_TAG, "MessageThread exiting.");
    855         }
    856     }
    857 
    858     RenderScript(Context ctx) {
    859         mApplicationContext = ctx.getApplicationContext();
    860     }
    861 
    862     /**
    863      * Gets the application context associated with the RenderScript context.
    864      *
    865      * @return The application context.
    866      */
    867     public final Context getApplicationContext() {
    868         return mApplicationContext;
    869     }
    870 
    871     static int getTargetSdkVersion(Context ctx) {
    872         return ctx.getApplicationInfo().targetSdkVersion;
    873     }
    874 
    875     /**
    876      * Create a basic RenderScript context.
    877      *
    878      * @param ctx The context.
    879      * @return RenderScript
    880      */
    881     public static RenderScript create(Context ctx) {
    882         RenderScript rs = new RenderScript(ctx);
    883 
    884         int sdkVersion = getTargetSdkVersion(ctx);
    885 
    886         rs.mDev = rs.nDeviceCreate();
    887         rs.mContext = rs.nContextCreate(rs.mDev, 0, sdkVersion);
    888         if (rs.mContext == 0) {
    889             throw new RSDriverException("Failed to create RS context.");
    890         }
    891         rs.mMessageThread = new MessageThread(rs);
    892         rs.mMessageThread.start();
    893         return rs;
    894     }
    895 
    896     /**
    897      * Print the currently available debugging information about the state of
    898      * the RS context to the log.
    899      *
    900      */
    901     public void contextDump() {
    902         validate();
    903         nContextDump(0);
    904     }
    905 
    906     /**
    907      * Wait for any commands in the fifo between the java bindings and native to
    908      * be processed.
    909      *
    910      */
    911     public void finish() {
    912         nContextFinish();
    913     }
    914 
    915     /**
    916      * Destroy this renderscript context.  Once this function is called its no
    917      * longer legal to use this or any objects created by this context.
    918      *
    919      */
    920     public void destroy() {
    921         validate();
    922         nContextDeinitToClient(mContext);
    923         mMessageThread.mRun = false;
    924         try {
    925             mMessageThread.join();
    926         } catch(InterruptedException e) {
    927         }
    928 
    929         nContextDestroy();
    930         mContext = 0;
    931 
    932         nDeviceDestroy(mDev);
    933         mDev = 0;
    934     }
    935 
    936     boolean isAlive() {
    937         return mContext != 0;
    938     }
    939 
    940     int safeID(BaseObj o) {
    941         if(o != null) {
    942             return o.getID();
    943         }
    944         return 0;
    945     }
    946 }
    947