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  *
     23  **/
     24 public class Script extends BaseObj {
     25 
     26     /**
     27      * KernelID is an identifier for a Script + root function pair. It is used
     28      * as an identifier for ScriptGroup creation.
     29      *
     30      * This class should not be directly created. Instead use the method in the
     31      * reflected or intrinsic code "getKernelID_funcname()".
     32      *
     33      */
     34     public static final class KernelID extends BaseObj {
     35         Script mScript;
     36         int mSlot;
     37         int mSig;
     38         KernelID(int id, RenderScript rs, Script s, int slot, int sig) {
     39             super(id, rs);
     40             mScript = s;
     41             mSlot = slot;
     42             mSig = sig;
     43         }
     44     }
     45 
     46     private final SparseArray<KernelID> mKIDs = new SparseArray<KernelID>();
     47     /**
     48      * Only to be used by generated reflected classes.
     49      *
     50      *
     51      * @param slot
     52      * @param sig
     53      * @param ein
     54      * @param eout
     55      *
     56      * @return KernelID
     57      */
     58     protected KernelID createKernelID(int slot, int sig, Element ein, Element eout) {
     59         KernelID k = mKIDs.get(slot);
     60         if (k != null) {
     61             return k;
     62         }
     63 
     64         int id = mRS.nScriptKernelIDCreate(getID(mRS), slot, sig);
     65         if (id == 0) {
     66             throw new RSDriverException("Failed to create KernelID");
     67         }
     68 
     69         k = new KernelID(id, mRS, this, slot, sig);
     70         mKIDs.put(slot, k);
     71         return k;
     72     }
     73 
     74     /**
     75      * FieldID is an identifier for a Script + exported field pair. It is used
     76      * as an identifier for ScriptGroup creation.
     77      *
     78      * This class should not be directly created. Instead use the method in the
     79      * reflected or intrinsic code "getFieldID_funcname()".
     80      *
     81      */
     82     public static final class FieldID extends BaseObj {
     83         Script mScript;
     84         int mSlot;
     85         FieldID(int id, RenderScript rs, Script s, int slot) {
     86             super(id, rs);
     87             mScript = s;
     88             mSlot = slot;
     89         }
     90     }
     91 
     92     private final SparseArray<FieldID> mFIDs = new SparseArray();
     93     /**
     94      * Only to be used by generated reflected classes.
     95      *
     96      * @param slot
     97      * @param e
     98      *
     99      * @return FieldID
    100      */
    101     protected FieldID createFieldID(int slot, Element e) {
    102         FieldID f = mFIDs.get(slot);
    103         if (f != null) {
    104             return f;
    105         }
    106 
    107         int id = mRS.nScriptFieldIDCreate(getID(mRS), slot);
    108         if (id == 0) {
    109             throw new RSDriverException("Failed to create FieldID");
    110         }
    111 
    112         f = new FieldID(id, mRS, this, slot);
    113         mFIDs.put(slot, f);
    114         return f;
    115     }
    116 
    117 
    118     /**
    119      * Only intended for use by generated reflected code.
    120      *
    121      * @param slot
    122      */
    123     protected void invoke(int slot) {
    124         mRS.nScriptInvoke(getID(mRS), slot);
    125     }
    126 
    127     /**
    128      * Only intended for use by generated reflected code.
    129      *
    130      * @param slot
    131      * @param v
    132      */
    133     protected void invoke(int slot, FieldPacker v) {
    134         if (v != null) {
    135             mRS.nScriptInvokeV(getID(mRS), slot, v.getData());
    136         } else {
    137             mRS.nScriptInvoke(getID(mRS), slot);
    138         }
    139     }
    140 
    141     /**
    142      * Only intended for use by generated reflected code.
    143      *
    144      * @param slot
    145      * @param ain
    146      * @param aout
    147      * @param v
    148      */
    149     protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v) {
    150         if (ain == null && aout == null) {
    151             throw new RSIllegalArgumentException(
    152                 "At least one of ain or aout is required to be non-null.");
    153         }
    154         int in_id = 0;
    155         if (ain != null) {
    156             in_id = ain.getID(mRS);
    157         }
    158         int out_id = 0;
    159         if (aout != null) {
    160             out_id = aout.getID(mRS);
    161         }
    162         byte[] params = null;
    163         if (v != null) {
    164             params = v.getData();
    165         }
    166         mRS.nScriptForEach(getID(mRS), slot, in_id, out_id, params);
    167     }
    168 
    169 
    170     Script(int id, RenderScript rs) {
    171         super(id, rs);
    172     }
    173 
    174 
    175     /**
    176      * Only intended for use by generated reflected code.
    177      *
    178      * @param va
    179      * @param slot
    180      */
    181     public void bindAllocation(Allocation va, int slot) {
    182         mRS.validate();
    183         if (va != null) {
    184             mRS.nScriptBindAllocation(getID(mRS), va.getID(mRS), slot);
    185         } else {
    186             mRS.nScriptBindAllocation(getID(mRS), 0, slot);
    187         }
    188     }
    189 
    190     /**
    191      * Only intended for use by generated reflected code.
    192      *
    193      * @param index
    194      * @param v
    195      */
    196     public void setVar(int index, float v) {
    197         mRS.nScriptSetVarF(getID(mRS), index, v);
    198     }
    199 
    200     /**
    201      * Only intended for use by generated reflected code.
    202      *
    203      * @param index
    204      * @param v
    205      */
    206     public void setVar(int index, double v) {
    207         mRS.nScriptSetVarD(getID(mRS), index, v);
    208     }
    209 
    210     /**
    211      * Only intended for use by generated reflected code.
    212      *
    213      * @param index
    214      * @param v
    215      */
    216     public void setVar(int index, int v) {
    217         mRS.nScriptSetVarI(getID(mRS), index, v);
    218     }
    219 
    220     /**
    221      * Only intended for use by generated reflected code.
    222      *
    223      * @param index
    224      * @param v
    225      */
    226     public void setVar(int index, long v) {
    227         mRS.nScriptSetVarJ(getID(mRS), index, v);
    228     }
    229 
    230     /**
    231      * Only intended for use by generated reflected code.
    232      *
    233      * @param index
    234      * @param v
    235      */
    236     public void setVar(int index, boolean v) {
    237         mRS.nScriptSetVarI(getID(mRS), index, v ? 1 : 0);
    238     }
    239 
    240     /**
    241      * Only intended for use by generated reflected code.
    242      *
    243      * @param index
    244      * @param o
    245      */
    246     public void setVar(int index, BaseObj o) {
    247         mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : o.getID(mRS));
    248     }
    249 
    250     /**
    251      * Only intended for use by generated reflected code.
    252      *
    253      * @param index
    254      * @param v
    255      */
    256     public void setVar(int index, FieldPacker v) {
    257         mRS.nScriptSetVarV(getID(mRS), index, v.getData());
    258     }
    259 
    260     /**
    261      * Only intended for use by generated reflected code.
    262      *
    263      * @param index
    264      * @param v
    265      * @param e
    266      * @param dims
    267      */
    268     public void setVar(int index, FieldPacker v, Element e, int[] dims) {
    269         mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), e.getID(mRS), dims);
    270     }
    271 
    272     public void setTimeZone(String timeZone) {
    273         mRS.validate();
    274         try {
    275             mRS.nScriptSetTimeZone(getID(mRS), timeZone.getBytes("UTF-8"));
    276         } catch (java.io.UnsupportedEncodingException e) {
    277             throw new RuntimeException(e);
    278         }
    279     }
    280 
    281     public static class Builder {
    282         RenderScript mRS;
    283 
    284         Builder(RenderScript rs) {
    285             mRS = rs;
    286         }
    287     }
    288 
    289 
    290     public static class FieldBase {
    291         protected Element mElement;
    292         protected Allocation mAllocation;
    293 
    294         protected void init(RenderScript rs, int dimx) {
    295             mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT);
    296         }
    297 
    298         protected void init(RenderScript rs, int dimx, int usages) {
    299             mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT | usages);
    300         }
    301 
    302         protected FieldBase() {
    303         }
    304 
    305         public Element getElement() {
    306             return mElement;
    307         }
    308 
    309         public Type getType() {
    310             return mAllocation.getType();
    311         }
    312 
    313         public Allocation getAllocation() {
    314             return mAllocation;
    315         }
    316 
    317         //@Override
    318         public void updateAllocation() {
    319         }
    320     }
    321 }
    322 
    323