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