169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams/*
2adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines * Copyright (C) 2008-2012 The Android Open Source Project
369f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams *
469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * you may not use this file except in compliance with the License.
669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * You may obtain a copy of the License at
769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams *
869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams *
1069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * Unless required by applicable law or agreed to in writing, software
1169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1369f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * See the License for the specific language governing permissions and
1469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * limitations under the License.
1569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams */
1669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
1769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Samspackage android.renderscript;
1869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
1908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Samsimport android.util.SparseArray;
2008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
219c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
22c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * The parent class for all executable scripts. This should not be used by
23c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * applications.
2469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams **/
2569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Samspublic class Script extends BaseObj {
2608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
2708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    /**
2808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * KernelID is an identifier for a Script + root function pair. It is used
2908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * as an identifier for ScriptGroup creation.
3008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     *
3108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * This class should not be directly created. Instead use the method in the
3208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * reflected or intrinsic code "getKernelID_funcname()".
3308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     *
3408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     */
3508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    public static final class KernelID extends BaseObj {
3608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        Script mScript;
3708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        int mSlot;
3808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        int mSig;
397a629fac82f88126642081b4474879f6a883e313Tim Murray        KernelID(long id, RenderScript rs, Script s, int slot, int sig) {
4008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            super(id, rs);
4108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            mScript = s;
4208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            mSlot = slot;
4308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            mSig = sig;
446484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni            guard.open("destroy");
4508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        }
4608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    }
4708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
4808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    private final SparseArray<KernelID> mKIDs = new SparseArray<KernelID>();
4908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    /**
5008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * Only to be used by generated reflected classes.
5108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     */
52be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    protected KernelID createKernelID(int slot, int sig, Element ein,
53be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                                      Element eout) {
5408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        KernelID k = mKIDs.get(slot);
5508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        if (k != null) {
5608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            return k;
5708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        }
5808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
597a629fac82f88126642081b4474879f6a883e313Tim Murray        long id = mRS.nScriptKernelIDCreate(getID(mRS), slot, sig);
6008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        if (id == 0) {
6108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            throw new RSDriverException("Failed to create KernelID");
6208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        }
6308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
6408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        k = new KernelID(id, mRS, this, slot, sig);
6508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        mKIDs.put(slot, k);
6608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        return k;
6708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    }
6808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
6908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    /**
70be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     * InvokeID is an identifier for an invoke function. It is used
71be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     * as an identifier for ScriptGroup creation.
72be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     *
73be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     * This class should not be directly created. Instead use the method in the
74be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     * reflected or intrinsic code "getInvokeID_funcname()".
75be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     *
76be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     */
77be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    public static final class InvokeID extends BaseObj {
78be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        Script mScript;
79be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        int mSlot;
80be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        InvokeID(long id, RenderScript rs, Script s, int slot) {
81be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni            super(id, rs);
82be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni            mScript = s;
83be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni            mSlot = slot;
84be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        }
85be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    }
86be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
87be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    private final SparseArray<InvokeID> mIIDs = new SparseArray<InvokeID>();
88be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    /**
89be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     * Only to be used by generated reflected classes.
90be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     */
91be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    protected InvokeID createInvokeID(int slot) {
92be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        InvokeID i = mIIDs.get(slot);
93be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        if (i != null) {
94be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni            return i;
95be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        }
96be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
97be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        long id = mRS.nScriptInvokeIDCreate(getID(mRS), slot);
98be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        if (id == 0) {
99be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni            throw new RSDriverException("Failed to create KernelID");
100be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        }
101be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
102be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        i = new InvokeID(id, mRS, this, slot);
103be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        mIIDs.put(slot, i);
104be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        return i;
105be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    }
106be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
107be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    /**
10808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * FieldID is an identifier for a Script + exported field pair. It is used
10908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * as an identifier for ScriptGroup creation.
11008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     *
11108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * This class should not be directly created. Instead use the method in the
11208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * reflected or intrinsic code "getFieldID_funcname()".
11308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     *
11408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     */
11508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    public static final class FieldID extends BaseObj {
11608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        Script mScript;
11708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        int mSlot;
1187a629fac82f88126642081b4474879f6a883e313Tim Murray        FieldID(long id, RenderScript rs, Script s, int slot) {
11908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            super(id, rs);
12008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            mScript = s;
12108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            mSlot = slot;
1226484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni            guard.open("destroy");
12308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        }
12408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    }
12508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
12608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    private final SparseArray<FieldID> mFIDs = new SparseArray();
12708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    /**
12808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * Only to be used by generated reflected classes.
12908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     */
13008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    protected FieldID createFieldID(int slot, Element e) {
13108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        FieldID f = mFIDs.get(slot);
13208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        if (f != null) {
13308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            return f;
13408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        }
13508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
1367a629fac82f88126642081b4474879f6a883e313Tim Murray        long id = mRS.nScriptFieldIDCreate(getID(mRS), slot);
13708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        if (id == 0) {
13808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            throw new RSDriverException("Failed to create FieldID");
13908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        }
14008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
14108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        f = new FieldID(id, mRS, this, slot);
14208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        mFIDs.put(slot, f);
14308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        return f;
14408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    }
14508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
14608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
1479c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
14867e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
14967e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
15067e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
1512d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams    protected void invoke(int slot) {
152e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptInvoke(getID(mRS), slot);
1532d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams    }
1542d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
1559c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
15667e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
15767e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
15867e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
15996ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams    protected void invoke(int slot, FieldPacker v) {
16096ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams        if (v != null) {
161e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mRS.nScriptInvokeV(getID(mRS), slot, v.getData());
16296ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams        } else {
163e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mRS.nScriptInvoke(getID(mRS), slot);
16496ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams        }
1654d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1664d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1679c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1686e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams     * Only intended for use by generated reflected code.
1696e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams     *
1706e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams     */
171be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    protected void forEach(int slot, Allocation ain, Allocation aout,
172be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                           FieldPacker v) {
173be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        forEach(slot, ain, aout, v, null);
1746e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams    }
1756e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams
176f64cca905c45fcc74aacf78e6510e133385110cfJason Sams    /**
177f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     * Only intended for use by generated reflected code.
178f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     *
179f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     */
180be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    protected void forEach(int slot, Allocation ain, Allocation aout,
181be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                           FieldPacker v, LaunchOptions sc) {
182be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        // TODO: Is this necessary if nScriptForEach calls validate as well?
183678cc7fe9fef00fb3381e64f95cc6907796bcd8eJason Sams        mRS.validate();
184678cc7fe9fef00fb3381e64f95cc6907796bcd8eJason Sams        mRS.validateObject(ain);
185678cc7fe9fef00fb3381e64f95cc6907796bcd8eJason Sams        mRS.validateObject(aout);
186be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
187d1516dffa8d676fcad092d9736163829e6d0fdceJason Sams        if (ain == null && aout == null && sc == null) {
188eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            throw new RSIllegalArgumentException(
189d1516dffa8d676fcad092d9736163829e6d0fdceJason Sams                "At least one of input allocation, output allocation, or LaunchOptions is required to be non-null.");
190eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
191ba9dd06176cf833898832861114e225fdb428ea0Tim Murray
192be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        long[] in_ids = null;
193eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        if (ain != null) {
194be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_ids    = mInIdsBuffer;
195be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_ids[0] = ain.getID(mRS);
196eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
197be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
1987a629fac82f88126642081b4474879f6a883e313Tim Murray        long out_id = 0;
199eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        if (aout != null) {
200eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            out_id = aout.getID(mRS);
201eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
202be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
203eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        byte[] params = null;
204eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        if (v != null) {
205eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            params = v.getData();
206eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
207be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
208be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        int[] limits = null;
209be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        if (sc != null) {
210be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits = new int[6];
211be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
212be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[0] = sc.xstart;
213be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[1] = sc.xend;
214be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[2] = sc.ystart;
215be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[3] = sc.yend;
216be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[4] = sc.zstart;
217be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[5] = sc.zend;
218be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        }
219be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
220be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        mRS.nScriptForEach(getID(mRS), slot, in_ids, out_id, params, limits);
221eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray    }
2224d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
223949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    /**
224949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes     * Only intended for use by generated reflected code.
225949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes     */
226be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    protected void forEach(int slot, Allocation[] ains, Allocation aout,
227be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                           FieldPacker v) {
2286a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams
2296a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams        // FieldPacker is kept here to support regular params in the future.
230be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        forEach(slot, ains, aout, v, null);
231949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
232949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
233949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    /**
234949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes     * Only intended for use by generated reflected code.
235949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes     */
236be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    protected void forEach(int slot, Allocation[] ains, Allocation aout,
237be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                           FieldPacker v, LaunchOptions sc) {
238be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        // TODO: Is this necessary if nScriptForEach calls validate as well?
2396a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams        // FieldPacker is kept here to support regular params in the future.
240949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        mRS.validate();
241c8ddcddd13bda93758295713a29fa4b924451ff6Andreas Gampe        if (ains != null) {
242c8ddcddd13bda93758295713a29fa4b924451ff6Andreas Gampe            for (Allocation ain : ains) {
243c8ddcddd13bda93758295713a29fa4b924451ff6Andreas Gampe                mRS.validateObject(ain);
244c8ddcddd13bda93758295713a29fa4b924451ff6Andreas Gampe            }
245949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        }
246c9c7daf69b32c0e72a3b99379cc5116c1647f24eStephen Hines        mRS.validateObject(aout);
247be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
248949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        if (ains == null && aout == null) {
249949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes            throw new RSIllegalArgumentException(
250949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes                "At least one of ain or aout is required to be non-null.");
251949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        }
252949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
253ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe        long[] in_ids;
254ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe        if (ains != null) {
255ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe            in_ids = new long[ains.length];
256ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe            for (int index = 0; index < ains.length; ++index) {
257ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe                in_ids[index] = ains[index].getID(mRS);
258ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe            }
259ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe        } else {
260ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe            in_ids = null;
261949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        }
262949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
263949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        long out_id = 0;
264949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        if (aout != null) {
265949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes            out_id = aout.getID(mRS);
266949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        }
267be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
268949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        byte[] params = null;
269949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        if (v != null) {
270949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes            params = v.getData();
271949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        }
272be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
273be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        int[] limits = null;
274be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        if (sc != null) {
275be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits = new int[6];
276be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
277be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[0] = sc.xstart;
278be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[1] = sc.xend;
279be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[2] = sc.ystart;
280be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[3] = sc.yend;
281be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[4] = sc.zstart;
282be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[5] = sc.zend;
283be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        }
284be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
285be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        mRS.nScriptForEach(getID(mRS), slot, in_ids, out_id, params, limits);
286949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
287949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
28836eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    /**
28926ef7a739b724452f93f850a1c268c42e439317bDavid Gross     * Only intended for use by generated reflected code.  (General reduction)
29026ef7a739b724452f93f850a1c268c42e439317bDavid Gross     *
29126ef7a739b724452f93f850a1c268c42e439317bDavid Gross     */
29226ef7a739b724452f93f850a1c268c42e439317bDavid Gross    protected void reduce(int slot, Allocation[] ains, Allocation aout, LaunchOptions sc) {
29326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        mRS.validate();
29426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (ains == null || ains.length < 1) {
29526ef7a739b724452f93f850a1c268c42e439317bDavid Gross            throw new RSIllegalArgumentException(
29626ef7a739b724452f93f850a1c268c42e439317bDavid Gross                "At least one input is required.");
29726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
29826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (aout == null) {
29926ef7a739b724452f93f850a1c268c42e439317bDavid Gross            throw new RSIllegalArgumentException(
30026ef7a739b724452f93f850a1c268c42e439317bDavid Gross                "aout is required to be non-null.");
30126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
30226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        for (Allocation ain : ains) {
30326ef7a739b724452f93f850a1c268c42e439317bDavid Gross            mRS.validateObject(ain);
30426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
30526ef7a739b724452f93f850a1c268c42e439317bDavid Gross
30626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        long[] in_ids = new long[ains.length];
30726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        for (int index = 0; index < ains.length; ++index) {
30826ef7a739b724452f93f850a1c268c42e439317bDavid Gross            in_ids[index] = ains[index].getID(mRS);
30926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
31026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        long out_id = aout.getID(mRS);
31126ef7a739b724452f93f850a1c268c42e439317bDavid Gross
31226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        int[] limits = null;
31326ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (sc != null) {
31426ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits = new int[6];
31526ef7a739b724452f93f850a1c268c42e439317bDavid Gross
31626ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits[0] = sc.xstart;
31726ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits[1] = sc.xend;
31826ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits[2] = sc.ystart;
31926ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits[3] = sc.yend;
32026ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits[4] = sc.zstart;
32126ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits[5] = sc.zend;
32226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
32326ef7a739b724452f93f850a1c268c42e439317bDavid Gross
3244a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross        mRS.nScriptReduce(getID(mRS), slot, in_ids, out_id, limits);
32526ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
32626ef7a739b724452f93f850a1c268c42e439317bDavid Gross
327be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    long[] mInIdsBuffer;
328be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
3297a629fac82f88126642081b4474879f6a883e313Tim Murray    Script(long id, RenderScript rs) {
3300de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
331be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
332be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        mInIdsBuffer = new long[1];
3336484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni
3346484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni        /* The constructors for the derived classes (including ScriptIntrinsic
3356484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * derived classes and ScriptC derived classes generated by Slang
3366484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * reflection) seem to be simple enough, so we just put the guard.open()
3376484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * call here, rather than in the end of the constructor for the derived
3386484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * class. This, of course, assumes the derived constructor would not
3396484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * throw any exception after calling this constructor.
3406484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         *
3416484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * If new derived classes are added with more complicated constructors
3426484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * that throw exceptions, this call has to be (duplicated and) moved
3436484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * to the end of each derived class constructor.
3446484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         */
3456484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni        guard.open("destroy");
34669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    }
34769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
3489c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
34967e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
35067e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
35167e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
35269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    public void bindAllocation(Allocation va, int slot) {
353771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
354678cc7fe9fef00fb3381e64f95cc6907796bcd8eJason Sams        mRS.validateObject(va);
3554d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if (va != null) {
356be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
357be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            android.content.Context context = mRS.getApplicationContext();
358be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
359be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            if (context.getApplicationInfo().targetSdkVersion >= 20) {
360cf9c894a9b7523cd5ec707218b89517f67caa047Jason Sams                final Type t = va.mType;
361be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                if (t.hasMipmaps() || t.hasFaces() || (t.getY() != 0) ||
362be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                    (t.getZ() != 0)) {
363be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
364cf9c894a9b7523cd5ec707218b89517f67caa047Jason Sams                    throw new RSIllegalArgumentException(
365be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                        "API 20+ only allows simple 1D allocations to be " +
366be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                        "used with bind.");
367cf9c894a9b7523cd5ec707218b89517f67caa047Jason Sams                }
368cf9c894a9b7523cd5ec707218b89517f67caa047Jason Sams            }
369e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mRS.nScriptBindAllocation(getID(mRS), va.getID(mRS), slot);
3704d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        } else {
371e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mRS.nScriptBindAllocation(getID(mRS), 0, slot);
3724d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
3734d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
3744d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
3759c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
37667e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
37767e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
37867e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
3794d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public void setVar(int index, float v) {
380e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarF(getID(mRS), index, v);
3814d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
3827c4caadb939b1563328251c156262c179a685c70Tim Murray    public float getVarF(int index) {
3837c4caadb939b1563328251c156262c179a685c70Tim Murray        return mRS.nScriptGetVarF(getID(mRS), index);
3847c4caadb939b1563328251c156262c179a685c70Tim Murray    }
3854d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
3869c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
38767e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
38867e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
38967e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
390ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines    public void setVar(int index, double v) {
391e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarD(getID(mRS), index, v);
392ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines    }
3937c4caadb939b1563328251c156262c179a685c70Tim Murray    public double getVarD(int index) {
3947c4caadb939b1563328251c156262c179a685c70Tim Murray        return mRS.nScriptGetVarD(getID(mRS), index);
3957c4caadb939b1563328251c156262c179a685c70Tim Murray    }
396ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines
3979c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
39867e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
39967e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
40067e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
4014d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public void setVar(int index, int v) {
402e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarI(getID(mRS), index, v);
4034d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
4047c4caadb939b1563328251c156262c179a685c70Tim Murray    public int getVarI(int index) {
4057c4caadb939b1563328251c156262c179a685c70Tim Murray        return mRS.nScriptGetVarI(getID(mRS), index);
4067c4caadb939b1563328251c156262c179a685c70Tim Murray    }
4077c4caadb939b1563328251c156262c179a685c70Tim Murray
4084d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
4099c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
41067e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
41167e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
41267e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
413031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines    public void setVar(int index, long v) {
414e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarJ(getID(mRS), index, v);
415031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines    }
4167c4caadb939b1563328251c156262c179a685c70Tim Murray    public long getVarJ(int index) {
4177c4caadb939b1563328251c156262c179a685c70Tim Murray        return mRS.nScriptGetVarJ(getID(mRS), index);
4187c4caadb939b1563328251c156262c179a685c70Tim Murray    }
4197c4caadb939b1563328251c156262c179a685c70Tim Murray
420031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines
4219c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
42267e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
42367e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
42467e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
4250b9a22cf782ab8f837161bf3357e08471ff5b9f2Jason Sams    public void setVar(int index, boolean v) {
426e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarI(getID(mRS), index, v ? 1 : 0);
4270b9a22cf782ab8f837161bf3357e08471ff5b9f2Jason Sams    }
4287c4caadb939b1563328251c156262c179a685c70Tim Murray    public boolean getVarB(int index) {
4297c4caadb939b1563328251c156262c179a685c70Tim Murray        return mRS.nScriptGetVarI(getID(mRS), index) > 0 ? true : false;
4307c4caadb939b1563328251c156262c179a685c70Tim Murray    }
4310b9a22cf782ab8f837161bf3357e08471ff5b9f2Jason Sams
4329c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
43367e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
43467e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
43567e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
4366f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams    public void setVar(int index, BaseObj o) {
437678cc7fe9fef00fb3381e64f95cc6907796bcd8eJason Sams        mRS.validate();
438678cc7fe9fef00fb3381e64f95cc6907796bcd8eJason Sams        mRS.validateObject(o);
439e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : o.getID(mRS));
4406f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams    }
4416f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams
4429c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
44367e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
44467e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
44567e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
4464d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public void setVar(int index, FieldPacker v) {
447e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarV(getID(mRS), index, v.getData());
44869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    }
44969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
4509c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
451adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines     * Only intended for use by generated reflected code.
452adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines     *
453adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines     */
454adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    public void setVar(int index, FieldPacker v, Element e, int[] dims) {
455adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines        mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), e.getID(mRS), dims);
456adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    }
457adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines
458f64cca905c45fcc74aacf78e6510e133385110cfJason Sams    /**
459f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     * Only intended for use by generated reflected code.
460f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     *
461f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     */
4627c4caadb939b1563328251c156262c179a685c70Tim Murray    public void getVarV(int index, FieldPacker v) {
4637c4caadb939b1563328251c156262c179a685c70Tim Murray        mRS.nScriptGetVarV(getID(mRS), index, v.getData());
4647c4caadb939b1563328251c156262c179a685c70Tim Murray    }
4657c4caadb939b1563328251c156262c179a685c70Tim Murray
46622534176fb5c1257130ef4ee589739ca42766a32Jason Sams    public void setTimeZone(String timeZone) {
467771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
46822534176fb5c1257130ef4ee589739ca42766a32Jason Sams        try {
469e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mRS.nScriptSetTimeZone(getID(mRS), timeZone.getBytes("UTF-8"));
47022534176fb5c1257130ef4ee589739ca42766a32Jason Sams        } catch (java.io.UnsupportedEncodingException e) {
47122534176fb5c1257130ef4ee589739ca42766a32Jason Sams            throw new RuntimeException(e);
47222534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
47322534176fb5c1257130ef4ee589739ca42766a32Jason Sams    }
47469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
475c11e25c4e653124def1fb18e203b894f42106cbeTim Murray    /**
476c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Only intended for use by generated reflected code.
477c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     *
478c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     */
47969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    public static class Builder {
48069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        RenderScript mRS;
48169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
48269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        Builder(RenderScript rs) {
48369f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams            mRS = rs;
484fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams        }
48569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    }
48669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
4872d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
488f64cca905c45fcc74aacf78e6510e133385110cfJason Sams    /**
489f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     * Only intended for use by generated reflected code.
490f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     *
491f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     */
4922d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams    public static class FieldBase {
4932d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        protected Element mElement;
4942d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        protected Allocation mAllocation;
4952d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
4962d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        protected void init(RenderScript rs, int dimx) {
497be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            mAllocation = Allocation.createSized(rs, mElement, dimx,
498be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                                                 Allocation.USAGE_SCRIPT);
4995476b450e50939940dcf3f15c92335cee2fc572dJason Sams        }
5005476b450e50939940dcf3f15c92335cee2fc572dJason Sams
5015476b450e50939940dcf3f15c92335cee2fc572dJason Sams        protected void init(RenderScript rs, int dimx, int usages) {
502be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            mAllocation =
503be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                Allocation.createSized(rs, mElement, dimx,
504be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                                       Allocation.USAGE_SCRIPT | usages);
5052d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        }
5062d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
5072d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        protected FieldBase() {
5082d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        }
5092d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
5102d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        public Element getElement() {
5112d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams            return mElement;
5122d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        }
5132d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
5142d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        public Type getType() {
51531a7e42f4baa059352f0db119de38428e655eab2Jason Sams            return mAllocation.getType();
5162d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        }
5172d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
5182d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        public Allocation getAllocation() {
5192d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams            return mAllocation;
5202d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        }
5212d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
5222d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        //@Override
5232d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        public void updateAllocation() {
5242d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        }
5252d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams    }
526fbfaa853630edfca25eaa840f92035713eef13baTim Murray
527fbfaa853630edfca25eaa840f92035713eef13baTim Murray
528f64cca905c45fcc74aacf78e6510e133385110cfJason Sams    /**
5298610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * Class for specifying the specifics about how a kernel will be
53053fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang     * launched.
5318610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     *
5328610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * This class can specify a potential range of cells on which to
5338610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * run a kernel.  If no set is called for a dimension then this
5348610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * class will have no impact on that dimension when the kernel
5358610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * is executed.
5368610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     *
53753fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang     * The forEach kernel launch will operate over the intersection of
53853fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang     * the dimensions.
5398610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     *
5408610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * Example:
5418610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * LaunchOptions with setX(5, 15)
5428610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * Allocation with dimension X=10, Y=10
54353fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang     * The resulting forEach run would execute over:
54453fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang     * x = 5 to 9 (inclusive) and
54553fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang     * y = 0 to 9 (inclusive).
5468610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     *
547f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     *
548f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     */
549f64cca905c45fcc74aacf78e6510e133385110cfJason Sams    public static final class LaunchOptions {
550f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int xstart = 0;
551f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int ystart = 0;
552f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int xend = 0;
553f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int yend = 0;
554f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int zstart = 0;
555f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int zend = 0;
556f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int strategy;
557f64cca905c45fcc74aacf78e6510e133385110cfJason Sams
558f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
55953fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * Set the X range. xstartArg is the lowest coordinate of the range,
56053fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * and xendArg-1 is the highest coordinate of the range.
561f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
562f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @param xstartArg Must be >= 0
56353fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * @param xendArg Must be > xstartArg
564f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
565f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return LaunchOptions
566f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
567eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        public LaunchOptions setX(int xstartArg, int xendArg) {
568fbfaa853630edfca25eaa840f92035713eef13baTim Murray            if (xstartArg < 0 || xendArg <= xstartArg) {
569fbfaa853630edfca25eaa840f92035713eef13baTim Murray                throw new RSIllegalArgumentException("Invalid dimensions");
570fbfaa853630edfca25eaa840f92035713eef13baTim Murray            }
571fbfaa853630edfca25eaa840f92035713eef13baTim Murray            xstart = xstartArg;
572fbfaa853630edfca25eaa840f92035713eef13baTim Murray            xend = xendArg;
573eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            return this;
574fbfaa853630edfca25eaa840f92035713eef13baTim Murray        }
575fbfaa853630edfca25eaa840f92035713eef13baTim Murray
576f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
57753fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * Set the Y range. ystartArg is the lowest coordinate of the range,
57853fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * and yendArg-1 is the highest coordinate of the range.
579f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
580f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @param ystartArg Must be >= 0
58153fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * @param yendArg Must be > ystartArg
582f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
583f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return LaunchOptions
584f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
585eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        public LaunchOptions setY(int ystartArg, int yendArg) {
586fbfaa853630edfca25eaa840f92035713eef13baTim Murray            if (ystartArg < 0 || yendArg <= ystartArg) {
587fbfaa853630edfca25eaa840f92035713eef13baTim Murray                throw new RSIllegalArgumentException("Invalid dimensions");
588fbfaa853630edfca25eaa840f92035713eef13baTim Murray            }
589fbfaa853630edfca25eaa840f92035713eef13baTim Murray            ystart = ystartArg;
590fbfaa853630edfca25eaa840f92035713eef13baTim Murray            yend = yendArg;
591eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            return this;
592eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
593eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray
594f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
59553fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * Set the Z range. zstartArg is the lowest coordinate of the range,
59653fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * and zendArg-1 is the highest coordinate of the range.
597f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
598f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @param zstartArg Must be >= 0
59953fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * @param zendArg Must be > zstartArg
600f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
601f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return LaunchOptions
602f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
603eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        public LaunchOptions setZ(int zstartArg, int zendArg) {
604eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            if (zstartArg < 0 || zendArg <= zstartArg) {
605eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray                throw new RSIllegalArgumentException("Invalid dimensions");
606eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            }
607eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            zstart = zstartArg;
608eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            zend = zendArg;
609eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            return this;
610fbfaa853630edfca25eaa840f92035713eef13baTim Murray        }
611fbfaa853630edfca25eaa840f92035713eef13baTim Murray
612eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray
613f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
614f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * Returns the current X start
615f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
616f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return int current value
617f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
618fbfaa853630edfca25eaa840f92035713eef13baTim Murray        public int getXStart() {
619fbfaa853630edfca25eaa840f92035713eef13baTim Murray            return xstart;
620fbfaa853630edfca25eaa840f92035713eef13baTim Murray        }
621f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
622f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * Returns the current X end
623f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
624f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return int current value
625f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
626fbfaa853630edfca25eaa840f92035713eef13baTim Murray        public int getXEnd() {
627fbfaa853630edfca25eaa840f92035713eef13baTim Murray            return xend;
628fbfaa853630edfca25eaa840f92035713eef13baTim Murray        }
629f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
630f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * Returns the current Y start
631f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
632f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return int current value
633f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
634fbfaa853630edfca25eaa840f92035713eef13baTim Murray        public int getYStart() {
635fbfaa853630edfca25eaa840f92035713eef13baTim Murray            return ystart;
636fbfaa853630edfca25eaa840f92035713eef13baTim Murray        }
637f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
638f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * Returns the current Y end
639f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
640f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return int current value
641f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
642fbfaa853630edfca25eaa840f92035713eef13baTim Murray        public int getYEnd() {
643fbfaa853630edfca25eaa840f92035713eef13baTim Murray            return yend;
644fbfaa853630edfca25eaa840f92035713eef13baTim Murray        }
645f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
646f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * Returns the current Z start
647f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
648f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return int current value
649f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
650eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        public int getZStart() {
651eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            return zstart;
652eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
653f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
654f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * Returns the current Z end
655f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
656f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return int current value
657f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
658eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        public int getZEnd() {
659eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            return zend;
660eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
661fbfaa853630edfca25eaa840f92035713eef13baTim Murray
662fbfaa853630edfca25eaa840f92035713eef13baTim Murray    }
66369f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams}
664