Script.java revision c11e25c4e653124def1fb18e203b894f42106cbe
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
17package android.renderscript;
18
19import android.util.SparseArray;
20
21/**
22 * The parent class for all executable scripts. This should not be used by
23 * applications.
24 **/
25public 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