198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/*
298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Copyright (C) 2012 The Android Open Source Project
398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License.
698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at
798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams *
1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software
1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and
1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License.
1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */
1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript;
1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
19ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsimport android.util.SparseArray;
20ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/**
227d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * The parent class for all executable scripts. This should not be used by
237d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * applications.
2498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/
2598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class Script extends BaseObj {
26ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    /**
27059fede7f200350b6131fc131f76248085485722Miao Wang     * Determine if Incremental Intrinsic Support is needed
28059fede7f200350b6131fc131f76248085485722Miao Wang     *
29059fede7f200350b6131fc131f76248085485722Miao Wang     */
30059fede7f200350b6131fc131f76248085485722Miao Wang    private boolean mUseIncSupp;
31059fede7f200350b6131fc131f76248085485722Miao Wang    protected void setIncSupp(boolean useInc) {
32059fede7f200350b6131fc131f76248085485722Miao Wang        mUseIncSupp = useInc;
33059fede7f200350b6131fc131f76248085485722Miao Wang    }
34059fede7f200350b6131fc131f76248085485722Miao Wang    protected boolean isIncSupp() {
35059fede7f200350b6131fc131f76248085485722Miao Wang        return mUseIncSupp;
36059fede7f200350b6131fc131f76248085485722Miao Wang    }
37059fede7f200350b6131fc131f76248085485722Miao Wang    /**
38059fede7f200350b6131fc131f76248085485722Miao Wang     * An allocation for the compat context will be created when needed
39059fede7f200350b6131fc131f76248085485722Miao Wang     * e.g. foreach(ain, aout), setVar(ain);
40059fede7f200350b6131fc131f76248085485722Miao Wang     *
41059fede7f200350b6131fc131f76248085485722Miao Wang     */
4235ef270f319aeac81d562897c480b507102dc9aeMiao Wang    long getDummyAlloc(Allocation ain) {
43059fede7f200350b6131fc131f76248085485722Miao Wang        long dInElement = 0;
44059fede7f200350b6131fc131f76248085485722Miao Wang        long dInType = 0;
45059fede7f200350b6131fc131f76248085485722Miao Wang        long dummyAlloc = 0;
46059fede7f200350b6131fc131f76248085485722Miao Wang        if (ain != null) {
47e536825342e722b68c498042fea387b5c5504f44Miao Wang            Type inType = ain.getType();
48e536825342e722b68c498042fea387b5c5504f44Miao Wang            dInElement = inType.getElement().getDummyElement(mRS);
49e536825342e722b68c498042fea387b5c5504f44Miao Wang            dInType = inType.getDummyType(mRS, dInElement);
50e536825342e722b68c498042fea387b5c5504f44Miao Wang            int xBytesSize = inType.getX() * inType.getElement().getBytesSize();
51e536825342e722b68c498042fea387b5c5504f44Miao Wang            dummyAlloc = mRS.nIncAllocationCreateTyped(ain.getID(mRS), dInType, xBytesSize);
52059fede7f200350b6131fc131f76248085485722Miao Wang            ain.setIncAllocID(dummyAlloc);
53059fede7f200350b6131fc131f76248085485722Miao Wang        }
54059fede7f200350b6131fc131f76248085485722Miao Wang
55059fede7f200350b6131fc131f76248085485722Miao Wang        return dummyAlloc;
56059fede7f200350b6131fc131f76248085485722Miao Wang    }
57059fede7f200350b6131fc131f76248085485722Miao Wang    /**
58ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * KernelID is an identifier for a Script + root function pair. It is used
59ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * as an identifier for ScriptGroup creation.
60ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     *
61ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * This class should not be directly created. Instead use the method in the
62ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * reflected or intrinsic code "getKernelID_funcname()".
63ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     *
64ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     */
65ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    public static final class KernelID extends BaseObj {
66ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        android.renderscript.Script.KernelID mN;
67ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        Script mScript;
68ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        int mSlot;
69ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        int mSig;
703d9b60c9ae71c4c09df0b4e59c825a5d631e1254Miao Wang        KernelID(long id, RenderScript rs, Script s, int slot, int sig) {
71ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            super(id, rs);
72ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            mScript = s;
73ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            mSlot = slot;
74ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            mSig = sig;
75ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
76ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
77ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
78ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    private final SparseArray<KernelID> mKIDs = new SparseArray<KernelID>();
79ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    /**
80ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * Only to be used by generated reflected classes.
81ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     *
82ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     *
83ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * @param slot
84ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * @param sig
85ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * @param ein
86ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * @param eout
87ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     *
88ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * @return KernelID
89ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     */
90ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    protected KernelID createKernelID(int slot, int sig, Element ein, Element eout) {
91ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        KernelID k = mKIDs.get(slot);
92ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        if (k != null) {
93ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            return k;
94ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
95059fede7f200350b6131fc131f76248085485722Miao Wang
96059fede7f200350b6131fc131f76248085485722Miao Wang        long id = mRS.nScriptKernelIDCreate(getID(mRS), slot, sig, mUseIncSupp);
97ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        if (id == 0) {
98ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            throw new RSDriverException("Failed to create KernelID");
99ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
100ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
101ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        k = new KernelID(id, mRS, this, slot, sig);
102ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
103ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        mKIDs.put(slot, k);
104ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        return k;
105ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
106ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
107ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    /**
108b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni     * InvokeID is an identifier for a invoke function. It is used
109b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni     * as an identifier for ScriptGroup creation.
110b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni     *
111b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni     * This class should not be directly created. Instead use the method in the
112b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni     * reflected or intrinsic code "getInvokeID_funcname()".
113b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni     *
114b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni     */
115b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni    public static final class InvokeID extends BaseObj {
116b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        Script mScript;
117b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        int mSlot;
118b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        InvokeID(long id, RenderScript rs, Script s, int slot) {
119b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni            super(id, rs);
120b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni            mScript = s;
121b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni            mSlot = slot;
122b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        }
123b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni    }
124b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni
125b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni    private final SparseArray<InvokeID> mIIDs = new SparseArray<InvokeID>();
126b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni    /**
127b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni     * Only to be used by generated reflected classes.
128b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni     */
129b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni    protected InvokeID createInvokeID(int slot) {
130b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        InvokeID i = mIIDs.get(slot);
131b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        if (i != null) {
132b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni            return i;
133b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        }
134b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni
135b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        long id = mRS.nScriptInvokeIDCreate(getID(mRS), slot);
136b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        if (id == 0) {
137b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni            throw new RSDriverException("Failed to create KernelID");
138b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        }
139b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni
140b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        i = new InvokeID(id, mRS, this, slot);
141b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        mIIDs.put(slot, i);
142b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni        return i;
143b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni    }
144b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni
145b9da3f66de38ee08c42e4612087b81d7331bdf74Yang Ni    /**
146ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * FieldID is an identifier for a Script + exported field pair. It is used
147ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * as an identifier for ScriptGroup creation.
148ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     *
149ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * This class should not be directly created. Instead use the method in the
150ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * reflected or intrinsic code "getFieldID_funcname()".
151ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     *
152ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     */
153ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    public static final class FieldID extends BaseObj {
154ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        android.renderscript.Script.FieldID mN;
155ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        Script mScript;
156ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        int mSlot;
1573d9b60c9ae71c4c09df0b4e59c825a5d631e1254Miao Wang        FieldID(long id, RenderScript rs, Script s, int slot) {
158ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            super(id, rs);
159ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            mScript = s;
160ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            mSlot = slot;
161ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
162ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
163ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
164ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    private final SparseArray<FieldID> mFIDs = new SparseArray();
165ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    /**
166ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * Only to be used by generated reflected classes.
167ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     *
168ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * @param slot
169ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * @param e
170ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     *
171ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     * @return FieldID
172ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams     */
173ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    protected FieldID createFieldID(int slot, Element e) {
174ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        FieldID f = mFIDs.get(slot);
175ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        if (f != null) {
176ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            return f;
177ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
178ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
179059fede7f200350b6131fc131f76248085485722Miao Wang        long id = mRS.nScriptFieldIDCreate(getID(mRS), slot, mUseIncSupp);
180ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        if (id == 0) {
181ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams            throw new RSDriverException("Failed to create FieldID");
182ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        }
183ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
184ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        f = new FieldID(id, mRS, this, slot);
185ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        mFIDs.put(slot, f);
186ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams        return f;
187ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams    }
188ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams
18998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
19098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Only intended for use by generated reflected code.
19198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
19298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param slot
19398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
19498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    protected void invoke(int slot) {
195059fede7f200350b6131fc131f76248085485722Miao Wang        mRS.nScriptInvoke(getID(mRS), slot, mUseIncSupp);
19698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
19798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
19898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
19998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Only intended for use by generated reflected code.
20098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
20198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param slot
20298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param v
20398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
20498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    protected void invoke(int slot, FieldPacker v) {
20598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (v != null) {
206059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptInvokeV(getID(mRS), slot, v.getData(), mUseIncSupp);
20798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        } else {
208059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptInvoke(getID(mRS), slot, mUseIncSupp);
20998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
21098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
21198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
21298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
21398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Only intended for use by generated reflected code.
21498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
215ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray     * @param va
216ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray     * @param slot
217ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray     */
218ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    public void bindAllocation(Allocation va, int slot) {
219ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        mRS.validate();
220ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        if (va != null) {
221059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptBindAllocation(getID(mRS), va.getID(mRS), slot, mUseIncSupp);
222ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        } else {
223059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptBindAllocation(getID(mRS), 0, slot, mUseIncSupp);
224ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        }
225ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    }
226ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
227ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    public void setTimeZone(String timeZone) {
228ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        mRS.validate();
229ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        try {
230059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptSetTimeZone(getID(mRS), timeZone.getBytes("UTF-8"), mUseIncSupp);
231ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        } catch (java.io.UnsupportedEncodingException e) {
232ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            throw new RuntimeException(e);
233ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        }
234ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    }
235ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
236ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
237ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    /**
238ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray     * Only intended for use by generated reflected code.
239ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray     *
24098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param slot
24198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param ain
24298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param aout
24398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param v
24498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
24598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v) {
24698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (ain == null && aout == null) {
24798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            throw new RSIllegalArgumentException(
24898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams                "At least one of ain or aout is required to be non-null.");
24998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
2503d9b60c9ae71c4c09df0b4e59c825a5d631e1254Miao Wang        long in_id = 0;
251059fede7f200350b6131fc131f76248085485722Miao Wang        long out_id = 0;
25298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (ain != null) {
25398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            in_id = ain.getID(mRS);
25498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
25598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (aout != null) {
25698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            out_id = aout.getID(mRS);
25798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
258059fede7f200350b6131fc131f76248085485722Miao Wang
25998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        byte[] params = null;
26098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        if (v != null) {
26198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            params = v.getData();
26298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
263059fede7f200350b6131fc131f76248085485722Miao Wang
264059fede7f200350b6131fc131f76248085485722Miao Wang        if (mUseIncSupp) {
265059fede7f200350b6131fc131f76248085485722Miao Wang            long ainInc = getDummyAlloc(ain);
266059fede7f200350b6131fc131f76248085485722Miao Wang            long aoutInc = getDummyAlloc(aout);
267059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptForEach(getID(mRS), slot, ainInc, aoutInc, params, mUseIncSupp);
268059fede7f200350b6131fc131f76248085485722Miao Wang        } else {
269059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptForEach(getID(mRS), slot, in_id, out_id, params, mUseIncSupp);
270059fede7f200350b6131fc131f76248085485722Miao Wang        }
27198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
27298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
2737d435ae5ba100be5710b685653cc351cab159c11Stephen Hines    /**
2747d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     * Only intended for use by generated reflected code.
2757d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     *
2767d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     * @param slot
2777d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     * @param ain
2787d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     * @param aout
2797d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     * @param v
2807d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     * @param sc
2817d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     */
282be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray    protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v, LaunchOptions sc) {
283be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        if (ain == null && aout == null) {
2842da197aafb9325a3ec5e546c4a15b73ce592c0b9Stephen Hines            throw new RSIllegalArgumentException(
2852da197aafb9325a3ec5e546c4a15b73ce592c0b9Stephen Hines                "At least one of ain or aout is required to be non-null.");
2862da197aafb9325a3ec5e546c4a15b73ce592c0b9Stephen Hines        }
2872da197aafb9325a3ec5e546c4a15b73ce592c0b9Stephen Hines
2882da197aafb9325a3ec5e546c4a15b73ce592c0b9Stephen Hines        if (sc == null) {
2892da197aafb9325a3ec5e546c4a15b73ce592c0b9Stephen Hines            forEach(slot, ain, aout, v);
2902da197aafb9325a3ec5e546c4a15b73ce592c0b9Stephen Hines            return;
291be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
2923d9b60c9ae71c4c09df0b4e59c825a5d631e1254Miao Wang        long in_id = 0;
293059fede7f200350b6131fc131f76248085485722Miao Wang        long out_id = 0;
294be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        if (ain != null) {
295be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            in_id = ain.getID(mRS);
296be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
297be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        if (aout != null) {
298be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            out_id = aout.getID(mRS);
299be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
300059fede7f200350b6131fc131f76248085485722Miao Wang
301be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        byte[] params = null;
302be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        if (v != null) {
303be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            params = v.getData();
304be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
305059fede7f200350b6131fc131f76248085485722Miao Wang        if (mUseIncSupp) {
306059fede7f200350b6131fc131f76248085485722Miao Wang            long ainInc = getDummyAlloc(ain);
307059fede7f200350b6131fc131f76248085485722Miao Wang            long aoutInc = getDummyAlloc(aout);
308059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptForEachClipped(getID(mRS), slot, ainInc, aoutInc, params, sc.xstart, sc.xend, sc.ystart, sc.yend, sc.zstart, sc.zend, mUseIncSupp);
309059fede7f200350b6131fc131f76248085485722Miao Wang        } else {
310059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptForEachClipped(getID(mRS), slot, in_id, out_id, params, sc.xstart, sc.xend, sc.ystart, sc.yend, sc.zstart, sc.zend, mUseIncSupp);
311059fede7f200350b6131fc131f76248085485722Miao Wang        }
312be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray    }
313be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray
3143d9b60c9ae71c4c09df0b4e59c825a5d631e1254Miao Wang    Script(long id, RenderScript rs) {
31598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        super(id, rs);
316059fede7f200350b6131fc131f76248085485722Miao Wang        mUseIncSupp = false;
31798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
31898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
31998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
32098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Only intended for use by generated reflected code.
32198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
3223cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang     * @hide
3233cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang     */
3243cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang    protected void forEach(int slot, Allocation[] ains, Allocation aout,
3253cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang                           FieldPacker v) {
3263cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        forEach(slot, ains, aout, v, null);
3273cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang    }
3283cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang
3293cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang    /**
3303cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang     * Only intended for use by generated reflected code.
3313cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang     *
3323cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang     * @hide
3333cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang     */
3343cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang    protected void forEach(int slot, Allocation[] ains, Allocation aout,
3353cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang                           FieldPacker v, LaunchOptions sc) {
3363cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        // TODO: Is this necessary if nScriptForEach calls validate as well?
3373cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        mRS.validate();
3383cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        if (ains != null) {
3393cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            for (Allocation ain : ains) {
3403cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang                mRS.validateObject(ain);
3413cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            }
3423cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        }
3433cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        mRS.validateObject(aout);
3443cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang
3453cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        if (ains == null && aout == null) {
3463cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            throw new RSIllegalArgumentException(
3473cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang                "At least one of ain or aout is required to be non-null.");
3483cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        }
3493cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang
3503cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        long[] in_ids;
3513cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        if (ains != null) {
3523cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            in_ids = new long[ains.length];
3533cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            for (int index = 0; index < ains.length; ++index) {
3543cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang                in_ids[index] = ains[index].getID(mRS);
3553cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            }
3563cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        } else {
3573cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            in_ids = null;
3583cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        }
3593cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang
3603cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        long out_id = 0;
3613cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        if (aout != null) {
3623cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            out_id = aout.getID(mRS);
3633cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        }
3643cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang
3653cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        byte[] params = null;
3663cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        if (v != null) {
3673cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            params = v.getData();
3683cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        }
3693cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang
3703cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        int[] limits = null;
3713cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        if (sc != null) {
3723cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            limits = new int[6];
3733cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang
3743cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            limits[0] = sc.xstart;
3753cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            limits[1] = sc.xend;
3763cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            limits[2] = sc.ystart;
3773cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            limits[3] = sc.yend;
3783cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            limits[4] = sc.zstart;
3793cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang            limits[5] = sc.zend;
3803cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        }
3813cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang
3823cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang        mRS.nScriptForEach(getID(mRS), slot, in_ids, out_id, params, limits);
3833cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang    }
3843cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang
3853cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang    /**
386e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross     * Only intended for use by generated reflected code.  (General reduction)
387e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross     *
388e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross     * @hide
389e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross     */
390e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross    protected void reduce(int slot, Allocation[] ains, Allocation aout, LaunchOptions sc) {
391e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        mRS.validate();
392e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        if (ains == null || ains.length < 1) {
393e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross            throw new RSIllegalArgumentException(
394e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross                "At least one input is required.");
395e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        }
396e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        if (aout == null) {
397e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross            throw new RSIllegalArgumentException(
398e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross                "aout is required to be non-null.");
399e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        }
400e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        for (Allocation ain : ains) {
401e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross            mRS.validateObject(ain);
402e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        }
403e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross
404e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        long[] in_ids = new long[ains.length];
405e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        for (int index = 0; index < ains.length; ++index) {
406e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross            in_ids[index] = ains[index].getID(mRS);
407e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        }
408e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        long out_id = aout.getID(mRS);
409e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross
410e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        int[] limits = null;
411e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        if (sc != null) {
412e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross            limits = new int[6];
413e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross
414e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross            limits[0] = sc.xstart;
415e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross            limits[1] = sc.xend;
416e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross            limits[2] = sc.ystart;
417e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross            limits[3] = sc.yend;
418e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross            limits[4] = sc.zstart;
419e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross            limits[5] = sc.zend;
420e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross        }
421e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross
422b96cf883ae029038386da87af40b2acf72a54d5bDavid Gross        mRS.nScriptReduce(getID(mRS), slot, in_ids, out_id, limits);
423e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross    }
424e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross
425e4a401fd3e2f777365c2ee9ee277c68065d5b178David Gross    /**
42642e1c8ed103fb24059cb6d689cb06179f04f7e41Matt Wala     * Only intended for use by generated reflected code.
42742e1c8ed103fb24059cb6d689cb06179f04f7e41Matt Wala     *
42898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param index
42998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param v
43098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
43198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setVar(int index, float v) {
432059fede7f200350b6131fc131f76248085485722Miao Wang        mRS.nScriptSetVarF(getID(mRS), index, v, mUseIncSupp);
43398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
43498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
43598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
43698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Only intended for use by generated reflected code.
43798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
43898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param index
43998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param v
44098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
44198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setVar(int index, double v) {
442059fede7f200350b6131fc131f76248085485722Miao Wang        mRS.nScriptSetVarD(getID(mRS), index, v, mUseIncSupp);
44398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
44498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
44598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
44698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Only intended for use by generated reflected code.
44798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
44898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param index
44998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param v
45098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
45198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setVar(int index, int v) {
452059fede7f200350b6131fc131f76248085485722Miao Wang        mRS.nScriptSetVarI(getID(mRS), index, v, mUseIncSupp);
45398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
45498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
45598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
45698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Only intended for use by generated reflected code.
45798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
45898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param index
45998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param v
46098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
46198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setVar(int index, long v) {
4621aaa8b2c1e7d3cbacb743e7231a56bfc8358838fMiao Wang        mRS.nScriptSetVarJ(getID(mRS), index, v, mUseIncSupp);
46398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
46498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
46598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
46698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Only intended for use by generated reflected code.
46798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
46898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param index
46998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param v
47098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
47198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setVar(int index, boolean v) {
472059fede7f200350b6131fc131f76248085485722Miao Wang        mRS.nScriptSetVarI(getID(mRS), index, v ? 1 : 0, mUseIncSupp);
47398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
47498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
47598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
47698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Only intended for use by generated reflected code.
47798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
47898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param index
47998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param o
48098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
48198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setVar(int index, BaseObj o) {
482059fede7f200350b6131fc131f76248085485722Miao Wang        if (mUseIncSupp) {
483059fede7f200350b6131fc131f76248085485722Miao Wang            long oInc = getDummyAlloc((Allocation)o);
484059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : oInc, mUseIncSupp);
485059fede7f200350b6131fc131f76248085485722Miao Wang        } else {
486059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : o.getID(mRS), mUseIncSupp);
487059fede7f200350b6131fc131f76248085485722Miao Wang        }
48898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
48998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
49098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
49198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Only intended for use by generated reflected code.
49298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
49398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param index
49498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param v
49598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
49698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setVar(int index, FieldPacker v) {
497059fede7f200350b6131fc131f76248085485722Miao Wang        mRS.nScriptSetVarV(getID(mRS), index, v.getData(), mUseIncSupp);
49898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
49998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
50098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    /**
50198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * Only intended for use by generated reflected code.
50298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     *
50398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param index
50498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param v
50598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param e
50698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     * @param dims
50798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams     */
50898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public void setVar(int index, FieldPacker v, Element e, int[] dims) {
509059fede7f200350b6131fc131f76248085485722Miao Wang        if (mUseIncSupp) {
510059fede7f200350b6131fc131f76248085485722Miao Wang            long dElement = e.getDummyElement(mRS);
511059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), dElement, dims, mUseIncSupp);
512059fede7f200350b6131fc131f76248085485722Miao Wang        } else {
513059fede7f200350b6131fc131f76248085485722Miao Wang            mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), e.getID(mRS), dims, mUseIncSupp);
514059fede7f200350b6131fc131f76248085485722Miao Wang        }
51598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
51698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
5177d435ae5ba100be5710b685653cc351cab159c11Stephen Hines    /**
5187d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     * Only intended for use by generated reflected code.
5197d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     *
5207d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     */
52198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static class Builder {
52298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        RenderScript mRS;
52398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
52498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        Builder(RenderScript rs) {
52598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mRS = rs;
52698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
52798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
52898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
52998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
5307d435ae5ba100be5710b685653cc351cab159c11Stephen Hines    /**
5317d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     * Only intended for use by generated reflected code.
5327d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     *
5337d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     */
53498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    public static class FieldBase {
53598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        protected Element mElement;
53698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        protected Allocation mAllocation;
53798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
53898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        protected void init(RenderScript rs, int dimx) {
53998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT);
54098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
54198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
54298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        protected void init(RenderScript rs, int dimx, int usages) {
54398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT | usages);
54498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
54598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
54698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        protected FieldBase() {
54798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
54898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
54998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Element getElement() {
55098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return mElement;
55198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
55298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
55398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Type getType() {
55498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return mAllocation.getType();
55598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
55698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
55798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public Allocation getAllocation() {
55898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams            return mAllocation;
55998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
56098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams
56198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        //@Override
56298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        public void updateAllocation() {
56398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams        }
56498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams    }
565be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray
566be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray
5677d435ae5ba100be5710b685653cc351cab159c11Stephen Hines    /**
568ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * Class for specifying the specifics about how a kernel will be
569ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * launched.
570ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     *
571ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * This class can specify a potential range of cells on which to
572ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * run a kernel.  If no set is called for a dimension then this
573ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * class will have no impact on that dimension when the kernel
574ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * is executed.
575ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     *
576ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * The forEach kernel launch will operate over the intersection of
577ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * the dimensions.
578ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     *
579ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * Example:
580ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * LaunchOptions with setX(5, 15)
581ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * Allocation with dimension X=10, Y=10
582ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * The resulting forEach run would execute over:
583ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * x = 5 to 9 (inclusive) and
584ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang     * y = 0 to 9 (inclusive).
5857d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     *
5867d435ae5ba100be5710b685653cc351cab159c11Stephen Hines     */
5877d435ae5ba100be5710b685653cc351cab159c11Stephen Hines    public static final class LaunchOptions {
5887d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        private int xstart = 0;
5897d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        private int ystart = 0;
5907d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        private int xend = 0;
5917d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        private int yend = 0;
5927d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        private int zstart = 0;
5937d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        private int zend = 0;
5947d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        private int strategy;
5957d435ae5ba100be5710b685653cc351cab159c11Stephen Hines
5967d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        /**
597ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang         * Set the X range. xstartArg is the lowest coordinate of the range,
598ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang         * and xendArg-1 is the highest coordinate of the range.
5997d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
6007d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @param xstartArg Must be >= 0
601ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang         * @param xendArg Must be > xstartArg
6027d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
6037d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @return LaunchOptions
6047d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         */
605be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        public LaunchOptions setX(int xstartArg, int xendArg) {
606be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            if (xstartArg < 0 || xendArg <= xstartArg) {
607be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray                throw new RSIllegalArgumentException("Invalid dimensions");
608be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            }
609be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            xstart = xstartArg;
610be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            xend = xendArg;
611be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            return this;
612be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
613be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray
6147d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        /**
615ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang         * Set the Y range. ystartArg is the lowest coordinate of the range,
616ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang         * and yendArg-1 is the highest coordinate of the range.
6177d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
6187d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @param ystartArg Must be >= 0
619ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang         * @param yendArg Must be > ystartArg
6207d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
6217d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @return LaunchOptions
6227d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         */
623be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        public LaunchOptions setY(int ystartArg, int yendArg) {
624be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            if (ystartArg < 0 || yendArg <= ystartArg) {
625be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray                throw new RSIllegalArgumentException("Invalid dimensions");
626be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            }
627be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            ystart = ystartArg;
628be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            yend = yendArg;
629be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            return this;
630be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
631be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray
6327d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        /**
633ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang         * Set the Z range. zstartArg is the lowest coordinate of the range,
634ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang         * and zendArg-1 is the highest coordinate of the range.
6357d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
6367d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @param zstartArg Must be >= 0
637ec7aaf761b70596614cb832939c881eea6e2941fMiao Wang         * @param zendArg Must be > zstartArg
6387d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
6397d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @return LaunchOptions
6407d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         */
641be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        public LaunchOptions setZ(int zstartArg, int zendArg) {
642be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            if (zstartArg < 0 || zendArg <= zstartArg) {
643be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray                throw new RSIllegalArgumentException("Invalid dimensions");
644be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            }
645be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            zstart = zstartArg;
646be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            zend = zendArg;
647be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            return this;
648be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
649be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray
650be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray
6517d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        /**
6527d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * Returns the current X start
6537d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
6547d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @return int current value
6557d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         */
656be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        public int getXStart() {
657be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            return xstart;
658be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
6597d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        /**
6607d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * Returns the current X end
6617d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
6627d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @return int current value
6637d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         */
664be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        public int getXEnd() {
665be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            return xend;
666be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
6677d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        /**
6687d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * Returns the current Y start
6697d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
6707d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @return int current value
6717d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         */
672be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        public int getYStart() {
673be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            return ystart;
674be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
6757d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        /**
6767d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * Returns the current Y end
6777d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
6787d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @return int current value
6797d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         */
680be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        public int getYEnd() {
681be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            return yend;
682be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
6837d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        /**
6847d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * Returns the current Z start
6857d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
6867d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @return int current value
6877d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         */
688be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        public int getZStart() {
689be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            return zstart;
690be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
6917d435ae5ba100be5710b685653cc351cab159c11Stephen Hines        /**
6927d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * Returns the current Z end
6937d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         *
6947d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         * @return int current value
6957d435ae5ba100be5710b685653cc351cab159c11Stephen Hines         */
696be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        public int getZEnd() {
697be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray            return zend;
698be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray        }
699be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray
700be995a8c3431dd87ca8877f56d922689eea35ac1Tim Murray    }
70198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams}
702