Home | History | Annotate | Download | only in renderscript
      1 /*
      2  * Copyright (C) 2008-2012 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 android.util.SparseArray;
     20 
     21 /**
     22  * The parent class for all executable scripts. This should not be used by
     23  * applications.
     24  **/
     25 public class Script extends BaseObj {
     26 
     27     /**
     28      * KernelID is an identifier for a Script + root function pair. It is used
     29      * as an identifier for ScriptGroup creation.
     30      *
     31      * This class should not be directly created. Instead use the method in the
     32      * reflected or intrinsic code "getKernelID_funcname()".
     33      *
     34      */
     35     public static final class KernelID extends BaseObj {
     36         Script mScript;
     37         int mSlot;
     38         int mSig;
     39         KernelID(int id, RenderScript rs, Script s, int slot, int sig) {
     40             super(id, rs);
     41             mScript = s;
     42             mSlot = slot;
     43             mSig = sig;
     44         }
     45     }
     46 
     47     private final SparseArray<KernelID> mKIDs = new SparseArray<KernelID>();
     48     /**
     49      * Only to be used by generated reflected classes.
     50      */
     51     protected KernelID createKernelID(int slot, int sig, Element ein, Element eout) {
     52         KernelID k = mKIDs.get(slot);
     53         if (k != null) {
     54             return k;
     55         }
     56 
     57         int id = mRS.nScriptKernelIDCreate(getID(mRS), slot, sig);
     58         if (id == 0) {
     59             throw new RSDriverException("Failed to create KernelID");
     60         }
     61 
     62         k = new KernelID(id, mRS, this, slot, sig);
     63         mKIDs.put(slot, k);
     64         return k;
     65     }
     66 
     67     /**
     68      * FieldID is an identifier for a Script + exported field pair. It is used
     69      * as an identifier for ScriptGroup creation.
     70      *
     71      * This class should not be directly created. Instead use the method in the
     72      * reflected or intrinsic code "getFieldID_funcname()".
     73      *
     74      */
     75     public static final class FieldID extends BaseObj {
     76         Script mScript;
     77         int mSlot;
     78         FieldID(int id, RenderScript rs, Script s, int slot) {
     79             super(id, rs);
     80             mScript = s;
     81             mSlot = slot;
     82         }
     83     }
     84 
     85     private final SparseArray<FieldID> mFIDs = new SparseArray();
     86     /**
     87      * Only to be used by generated reflected classes.
     88      */
     89     protected FieldID createFieldID(int slot, Element e) {
     90         FieldID f = mFIDs.get(slot);
     91         if (f != null) {
     92             return f;
     93         }
     94 
     95         int id = mRS.nScriptFieldIDCreate(getID(mRS), slot);
     96         if (id == 0) {
     97             throw new RSDriverException("Failed to create FieldID");
     98         }
     99 
    100         f = new FieldID(id, mRS, this, slot);
    101         mFIDs.put(slot, f);
    102         return f;
    103     }
    104 
    105 
    106     /**
    107      * Only intended for use by generated reflected code.
    108      *
    109      */
    110     protected void invoke(int slot) {
    111         mRS.nScriptInvoke(getID(mRS), slot);
    112     }
    113 
    114     /**
    115      * Only intended for use by generated reflected code.
    116      *
    117      */
    118     protected void invoke(int slot, FieldPacker v) {
    119         if (v != null) {
    120             mRS.nScriptInvokeV(getID(mRS), slot, v.getData());
    121         } else {
    122             mRS.nScriptInvoke(getID(mRS), slot);
    123         }
    124     }
    125 
    126     /**
    127      * Only intended for use by generated reflected code.
    128      *
    129      */
    130     protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v) {
    131         if (ain == null && aout == null) {
    132             throw new RSIllegalArgumentException(
    133                 "At least one of ain or aout is required to be non-null.");
    134         }
    135         int in_id = 0;
    136         if (ain != null) {
    137             in_id = ain.getID(mRS);
    138         }
    139         int out_id = 0;
    140         if (aout != null) {
    141             out_id = aout.getID(mRS);
    142         }
    143         byte[] params = null;
    144         if (v != null) {
    145             params = v.getData();
    146         }
    147         mRS.nScriptForEach(getID(mRS), slot, in_id, out_id, params);
    148     }
    149 
    150     /**
    151      * Only intended for use by generated reflected code.
    152      *
    153      */
    154     protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v, LaunchOptions sc) {
    155         if (ain == null && aout == null) {
    156             throw new RSIllegalArgumentException(
    157                 "At least one of ain or aout is required to be non-null.");
    158         }
    159 
    160         if (sc == null) {
    161             forEach(slot, ain, aout, v);
    162             return;
    163         }
    164         int in_id = 0;
    165         if (ain != null) {
    166             in_id = ain.getID(mRS);
    167         }
    168         int out_id = 0;
    169         if (aout != null) {
    170             out_id = aout.getID(mRS);
    171         }
    172         byte[] params = null;
    173         if (v != null) {
    174             params = v.getData();
    175         }
    176         mRS.nScriptForEachClipped(getID(mRS), slot, in_id, out_id, params, sc.xstart, sc.xend, sc.ystart, sc.yend, sc.zstart, sc.zend);
    177     }
    178 
    179     Script(int id, RenderScript rs) {
    180         super(id, rs);
    181     }
    182 
    183 
    184     /**
    185      * Only intended for use by generated reflected code.
    186      *
    187      */
    188     public void bindAllocation(Allocation va, int slot) {
    189         mRS.validate();
    190         if (va != null) {
    191             mRS.nScriptBindAllocation(getID(mRS), va.getID(mRS), slot);
    192         } else {
    193             mRS.nScriptBindAllocation(getID(mRS), 0, slot);
    194         }
    195     }
    196 
    197     /**
    198      * Only intended for use by generated reflected code.
    199      *
    200      */
    201     public void setVar(int index, float v) {
    202         mRS.nScriptSetVarF(getID(mRS), index, v);
    203     }
    204     public float getVarF(int index) {
    205         return mRS.nScriptGetVarF(getID(mRS), index);
    206     }
    207 
    208     /**
    209      * Only intended for use by generated reflected code.
    210      *
    211      */
    212     public void setVar(int index, double v) {
    213         mRS.nScriptSetVarD(getID(mRS), index, v);
    214     }
    215     public double getVarD(int index) {
    216         return mRS.nScriptGetVarD(getID(mRS), index);
    217     }
    218 
    219     /**
    220      * Only intended for use by generated reflected code.
    221      *
    222      */
    223     public void setVar(int index, int v) {
    224         mRS.nScriptSetVarI(getID(mRS), index, v);
    225     }
    226     public int getVarI(int index) {
    227         return mRS.nScriptGetVarI(getID(mRS), index);
    228     }
    229 
    230 
    231     /**
    232      * Only intended for use by generated reflected code.
    233      *
    234      */
    235     public void setVar(int index, long v) {
    236         mRS.nScriptSetVarJ(getID(mRS), index, v);
    237     }
    238     public long getVarJ(int index) {
    239         return mRS.nScriptGetVarJ(getID(mRS), index);
    240     }
    241 
    242 
    243     /**
    244      * Only intended for use by generated reflected code.
    245      *
    246      */
    247     public void setVar(int index, boolean v) {
    248         mRS.nScriptSetVarI(getID(mRS), index, v ? 1 : 0);
    249     }
    250     public boolean getVarB(int index) {
    251         return mRS.nScriptGetVarI(getID(mRS), index) > 0 ? true : false;
    252     }
    253 
    254     /**
    255      * Only intended for use by generated reflected code.
    256      *
    257      */
    258     public void setVar(int index, BaseObj o) {
    259         mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : o.getID(mRS));
    260     }
    261 
    262     /**
    263      * Only intended for use by generated reflected code.
    264      *
    265      */
    266     public void setVar(int index, FieldPacker v) {
    267         mRS.nScriptSetVarV(getID(mRS), index, v.getData());
    268     }
    269 
    270     /**
    271      * Only intended for use by generated reflected code.
    272      *
    273      */
    274     public void setVar(int index, FieldPacker v, Element e, int[] dims) {
    275         mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), e.getID(mRS), dims);
    276     }
    277 
    278     /**
    279      * Only intended for use by generated reflected code.
    280      *
    281      */
    282     public void getVarV(int index, FieldPacker v) {
    283         mRS.nScriptGetVarV(getID(mRS), index, v.getData());
    284     }
    285 
    286     public void setTimeZone(String timeZone) {
    287         mRS.validate();
    288         try {
    289             mRS.nScriptSetTimeZone(getID(mRS), timeZone.getBytes("UTF-8"));
    290         } catch (java.io.UnsupportedEncodingException e) {
    291             throw new RuntimeException(e);
    292         }
    293     }
    294 
    295     /**
    296      * Only intended for use by generated reflected code.
    297      *
    298      */
    299     public static class Builder {
    300         RenderScript mRS;
    301 
    302         Builder(RenderScript rs) {
    303             mRS = rs;
    304         }
    305     }
    306 
    307 
    308     /**
    309      * Only intended for use by generated reflected code.
    310      *
    311      */
    312     public static class FieldBase {
    313         protected Element mElement;
    314         protected Allocation mAllocation;
    315 
    316         protected void init(RenderScript rs, int dimx) {
    317             mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT);
    318         }
    319 
    320         protected void init(RenderScript rs, int dimx, int usages) {
    321             mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT | usages);
    322         }
    323 
    324         protected FieldBase() {
    325         }
    326 
    327         public Element getElement() {
    328             return mElement;
    329         }
    330 
    331         public Type getType() {
    332             return mAllocation.getType();
    333         }
    334 
    335         public Allocation getAllocation() {
    336             return mAllocation;
    337         }
    338 
    339         //@Override
    340         public void updateAllocation() {
    341         }
    342     }
    343 
    344 
    345     /**
    346      * Class used to specify clipping for a kernel launch.
    347      *
    348      */
    349     public static final class LaunchOptions {
    350         private int xstart = 0;
    351         private int ystart = 0;
    352         private int xend = 0;
    353         private int yend = 0;
    354         private int zstart = 0;
    355         private int zend = 0;
    356         private int strategy;
    357 
    358         /**
    359          * Set the X range.  If the end value is set to 0 the X dimension is not
    360          * clipped.
    361          *
    362          * @param xstartArg Must be >= 0
    363          * @param xendArg Must be >= xstartArg
    364          *
    365          * @return LaunchOptions
    366          */
    367         public LaunchOptions setX(int xstartArg, int xendArg) {
    368             if (xstartArg < 0 || xendArg <= xstartArg) {
    369                 throw new RSIllegalArgumentException("Invalid dimensions");
    370             }
    371             xstart = xstartArg;
    372             xend = xendArg;
    373             return this;
    374         }
    375 
    376         /**
    377          * Set the Y range.  If the end value is set to 0 the Y dimension is not
    378          * clipped.
    379          *
    380          * @param ystartArg Must be >= 0
    381          * @param yendArg Must be >= ystartArg
    382          *
    383          * @return LaunchOptions
    384          */
    385         public LaunchOptions setY(int ystartArg, int yendArg) {
    386             if (ystartArg < 0 || yendArg <= ystartArg) {
    387                 throw new RSIllegalArgumentException("Invalid dimensions");
    388             }
    389             ystart = ystartArg;
    390             yend = yendArg;
    391             return this;
    392         }
    393 
    394         /**
    395          * Set the Z range.  If the end value is set to 0 the Z dimension is not
    396          * clipped.
    397          *
    398          * @param zstartArg Must be >= 0
    399          * @param zendArg Must be >= zstartArg
    400          *
    401          * @return LaunchOptions
    402          */
    403         public LaunchOptions setZ(int zstartArg, int zendArg) {
    404             if (zstartArg < 0 || zendArg <= zstartArg) {
    405                 throw new RSIllegalArgumentException("Invalid dimensions");
    406             }
    407             zstart = zstartArg;
    408             zend = zendArg;
    409             return this;
    410         }
    411 
    412 
    413         /**
    414          * Returns the current X start
    415          *
    416          * @return int current value
    417          */
    418         public int getXStart() {
    419             return xstart;
    420         }
    421         /**
    422          * Returns the current X end
    423          *
    424          * @return int current value
    425          */
    426         public int getXEnd() {
    427             return xend;
    428         }
    429         /**
    430          * Returns the current Y start
    431          *
    432          * @return int current value
    433          */
    434         public int getYStart() {
    435             return ystart;
    436         }
    437         /**
    438          * Returns the current Y end
    439          *
    440          * @return int current value
    441          */
    442         public int getYEnd() {
    443             return yend;
    444         }
    445         /**
    446          * Returns the current Z start
    447          *
    448          * @return int current value
    449          */
    450         public int getZStart() {
    451             return zstart;
    452         }
    453         /**
    454          * Returns the current Z end
    455          *
    456          * @return int current value
    457          */
    458         public int getZEnd() {
    459             return zend;
    460         }
    461 
    462     }
    463 }
    464 
    465