1/*
2 * Copyright (C) 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
17package android.support.v8.renderscript;
18
19import android.util.SparseArray;
20
21/**
22 *
23 **/
24public 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