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;
4408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        }
4508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    }
4608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
4708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    private final SparseArray<KernelID> mKIDs = new SparseArray<KernelID>();
4808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    /**
4908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * Only to be used by generated reflected classes.
5008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     */
51be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    protected KernelID createKernelID(int slot, int sig, Element ein,
52be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                                      Element eout) {
5308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        KernelID k = mKIDs.get(slot);
5408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        if (k != null) {
5508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            return k;
5608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        }
5708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
587a629fac82f88126642081b4474879f6a883e313Tim Murray        long id = mRS.nScriptKernelIDCreate(getID(mRS), slot, sig);
5908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        if (id == 0) {
6008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            throw new RSDriverException("Failed to create KernelID");
6108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        }
6208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
6308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        k = new KernelID(id, mRS, this, slot, sig);
6408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        mKIDs.put(slot, k);
6508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        return k;
6608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    }
6708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
6808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    /**
69be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     * InvokeID is an identifier for an invoke function. It is used
70be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     * as an identifier for ScriptGroup creation.
71be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     *
72be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     * This class should not be directly created. Instead use the method in the
73be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     * reflected or intrinsic code "getInvokeID_funcname()".
74be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     *
75be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     */
76be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    public static final class InvokeID extends BaseObj {
77be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        Script mScript;
78be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        int mSlot;
79be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        InvokeID(long id, RenderScript rs, Script s, int slot) {
80be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni            super(id, rs);
81be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni            mScript = s;
82be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni            mSlot = slot;
83be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        }
84be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    }
85be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
86be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    private final SparseArray<InvokeID> mIIDs = new SparseArray<InvokeID>();
87be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    /**
88be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     * Only to be used by generated reflected classes.
89be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni     */
90be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    protected InvokeID createInvokeID(int slot) {
91be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        InvokeID i = mIIDs.get(slot);
92be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        if (i != null) {
93be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni            return i;
94be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        }
95be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
96be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        long id = mRS.nScriptInvokeIDCreate(getID(mRS), slot);
97be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        if (id == 0) {
98be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni            throw new RSDriverException("Failed to create KernelID");
99be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        }
100be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
101be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        i = new InvokeID(id, mRS, this, slot);
102be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        mIIDs.put(slot, i);
103be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni        return i;
104be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    }
105be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni
106be392ad35e29b17ed54fdbbbb8dd3e80fc1022b9Yang Ni    /**
10708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * FieldID is an identifier for a Script + exported field pair. It is used
10808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * as an identifier for ScriptGroup creation.
10908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     *
11008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * This class should not be directly created. Instead use the method in the
11108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * reflected or intrinsic code "getFieldID_funcname()".
11208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     *
11308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     */
11408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    public static final class FieldID extends BaseObj {
11508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        Script mScript;
11608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        int mSlot;
1177a629fac82f88126642081b4474879f6a883e313Tim Murray        FieldID(long id, RenderScript rs, Script s, int slot) {
11808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            super(id, rs);
11908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            mScript = s;
12008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            mSlot = slot;
12108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        }
12208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    }
12308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
12408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    private final SparseArray<FieldID> mFIDs = new SparseArray();
12508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    /**
12608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     * Only to be used by generated reflected classes.
12708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams     */
12808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    protected FieldID createFieldID(int slot, Element e) {
12908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        FieldID f = mFIDs.get(slot);
13008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        if (f != null) {
13108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            return f;
13208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        }
13308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
1347a629fac82f88126642081b4474879f6a883e313Tim Murray        long id = mRS.nScriptFieldIDCreate(getID(mRS), slot);
13508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        if (id == 0) {
13608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams            throw new RSDriverException("Failed to create FieldID");
13708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        }
13808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
13908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        f = new FieldID(id, mRS, this, slot);
14008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        mFIDs.put(slot, f);
14108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams        return f;
14208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams    }
14308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
14408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams
1459c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
14667e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
14767e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
14867e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
1492d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams    protected void invoke(int slot) {
150e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptInvoke(getID(mRS), slot);
1512d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams    }
1522d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
1539c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
15467e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
15567e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
15667e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
15796ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams    protected void invoke(int slot, FieldPacker v) {
15896ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams        if (v != null) {
159e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mRS.nScriptInvokeV(getID(mRS), slot, v.getData());
16096ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams        } else {
161e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mRS.nScriptInvoke(getID(mRS), slot);
16296ed4cfa62dd09aafb3f9da01e047661b4fe3c95Jason Sams        }
1634d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1644d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1659c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1666e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams     * Only intended for use by generated reflected code.
1676e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams     *
1686e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams     */
169be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    protected void forEach(int slot, Allocation ain, Allocation aout,
170be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                           FieldPacker v) {
171be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        forEach(slot, ain, aout, v, null);
1726e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams    }
1736e494d3ab606be8c06f8d4930fbec572bbfa15c2Jason Sams
174f64cca905c45fcc74aacf78e6510e133385110cfJason Sams    /**
175f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     * Only intended for use by generated reflected code.
176f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     *
177f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     */
178be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    protected void forEach(int slot, Allocation ain, Allocation aout,
179be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                           FieldPacker v, LaunchOptions sc) {
180be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        // TODO: Is this necessary if nScriptForEach calls validate as well?
181678cc7fe9fef00fb3381e64f95cc6907796bcd8eJason Sams        mRS.validate();
182678cc7fe9fef00fb3381e64f95cc6907796bcd8eJason Sams        mRS.validateObject(ain);
183678cc7fe9fef00fb3381e64f95cc6907796bcd8eJason Sams        mRS.validateObject(aout);
184be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
185d1516dffa8d676fcad092d9736163829e6d0fdceJason Sams        if (ain == null && aout == null && sc == null) {
186eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            throw new RSIllegalArgumentException(
187d1516dffa8d676fcad092d9736163829e6d0fdceJason Sams                "At least one of input allocation, output allocation, or LaunchOptions is required to be non-null.");
188eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
189ba9dd06176cf833898832861114e225fdb428ea0Tim Murray
190be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        long[] in_ids = null;
191eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        if (ain != null) {
192be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_ids    = mInIdsBuffer;
193be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            in_ids[0] = ain.getID(mRS);
194eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
195be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
1967a629fac82f88126642081b4474879f6a883e313Tim Murray        long out_id = 0;
197eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        if (aout != null) {
198eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            out_id = aout.getID(mRS);
199eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
200be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
201eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        byte[] params = null;
202eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        if (v != null) {
203eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            params = v.getData();
204eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
205be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
206be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        int[] limits = null;
207be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        if (sc != null) {
208be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits = new int[6];
209be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
210be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[0] = sc.xstart;
211be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[1] = sc.xend;
212be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[2] = sc.ystart;
213be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[3] = sc.yend;
214be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[4] = sc.zstart;
215be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[5] = sc.zend;
216be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        }
217be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
218be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        mRS.nScriptForEach(getID(mRS), slot, in_ids, out_id, params, limits);
219eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray    }
2204d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
221949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    /**
222949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes     * Only intended for use by generated reflected code.
223949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes     */
224be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    protected void forEach(int slot, Allocation[] ains, Allocation aout,
225be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                           FieldPacker v) {
2266a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams
2276a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams        // FieldPacker is kept here to support regular params in the future.
228be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        forEach(slot, ains, aout, v, null);
229949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
230949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
231949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    /**
232949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes     * Only intended for use by generated reflected code.
233949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes     */
234be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    protected void forEach(int slot, Allocation[] ains, Allocation aout,
235be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                           FieldPacker v, LaunchOptions sc) {
236be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        // TODO: Is this necessary if nScriptForEach calls validate as well?
2376a420b5e0be235d35f319118eb4920f74a61dc5eJason Sams        // FieldPacker is kept here to support regular params in the future.
238949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        mRS.validate();
239c8ddcddd13bda93758295713a29fa4b924451ff6Andreas Gampe        if (ains != null) {
240c8ddcddd13bda93758295713a29fa4b924451ff6Andreas Gampe            for (Allocation ain : ains) {
241c8ddcddd13bda93758295713a29fa4b924451ff6Andreas Gampe                mRS.validateObject(ain);
242c8ddcddd13bda93758295713a29fa4b924451ff6Andreas Gampe            }
243949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        }
244c9c7daf69b32c0e72a3b99379cc5116c1647f24eStephen Hines        mRS.validateObject(aout);
245be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
246949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        if (ains == null && aout == null) {
247949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes            throw new RSIllegalArgumentException(
248949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes                "At least one of ain or aout is required to be non-null.");
249949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        }
250949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
251ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe        long[] in_ids;
252ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe        if (ains != null) {
253ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe            in_ids = new long[ains.length];
254ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe            for (int index = 0; index < ains.length; ++index) {
255ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe                in_ids[index] = ains[index].getID(mRS);
256ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe            }
257ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe        } else {
258ad555f91a0f95c6778a0e0f9a2a9cfd57dc00b6cAndreas Gampe            in_ids = null;
259949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        }
260949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
261949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        long out_id = 0;
262949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        if (aout != null) {
263949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes            out_id = aout.getID(mRS);
264949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        }
265be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
266949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        byte[] params = null;
267949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        if (v != null) {
268949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes            params = v.getData();
269949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        }
270be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
271be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        int[] limits = null;
272be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        if (sc != null) {
273be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits = new int[6];
274be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
275be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[0] = sc.xstart;
276be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[1] = sc.xend;
277be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[2] = sc.ystart;
278be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[3] = sc.yend;
279be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[4] = sc.zstart;
280be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            limits[5] = sc.zend;
281be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        }
282be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
283be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        mRS.nScriptForEach(getID(mRS), slot, in_ids, out_id, params, limits);
284949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes    }
285949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes
28636eb1f74b3d19d9dbae0803f3bc271683be811ceMatt Wala    /**
28726ef7a739b724452f93f850a1c268c42e439317bDavid Gross     * Only intended for use by generated reflected code.  (General reduction)
28826ef7a739b724452f93f850a1c268c42e439317bDavid Gross     *
28926ef7a739b724452f93f850a1c268c42e439317bDavid Gross     */
29026ef7a739b724452f93f850a1c268c42e439317bDavid Gross    protected void reduce(int slot, Allocation[] ains, Allocation aout, LaunchOptions sc) {
29126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        mRS.validate();
29226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (ains == null || ains.length < 1) {
29326ef7a739b724452f93f850a1c268c42e439317bDavid Gross            throw new RSIllegalArgumentException(
29426ef7a739b724452f93f850a1c268c42e439317bDavid Gross                "At least one input is required.");
29526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
29626ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (aout == null) {
29726ef7a739b724452f93f850a1c268c42e439317bDavid Gross            throw new RSIllegalArgumentException(
29826ef7a739b724452f93f850a1c268c42e439317bDavid Gross                "aout is required to be non-null.");
29926ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
30026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        for (Allocation ain : ains) {
30126ef7a739b724452f93f850a1c268c42e439317bDavid Gross            mRS.validateObject(ain);
30226ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
30326ef7a739b724452f93f850a1c268c42e439317bDavid Gross
30426ef7a739b724452f93f850a1c268c42e439317bDavid Gross        long[] in_ids = new long[ains.length];
30526ef7a739b724452f93f850a1c268c42e439317bDavid Gross        for (int index = 0; index < ains.length; ++index) {
30626ef7a739b724452f93f850a1c268c42e439317bDavid Gross            in_ids[index] = ains[index].getID(mRS);
30726ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
30826ef7a739b724452f93f850a1c268c42e439317bDavid Gross        long out_id = aout.getID(mRS);
30926ef7a739b724452f93f850a1c268c42e439317bDavid Gross
31026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        int[] limits = null;
31126ef7a739b724452f93f850a1c268c42e439317bDavid Gross        if (sc != null) {
31226ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits = new int[6];
31326ef7a739b724452f93f850a1c268c42e439317bDavid Gross
31426ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits[0] = sc.xstart;
31526ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits[1] = sc.xend;
31626ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits[2] = sc.ystart;
31726ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits[3] = sc.yend;
31826ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits[4] = sc.zstart;
31926ef7a739b724452f93f850a1c268c42e439317bDavid Gross            limits[5] = sc.zend;
32026ef7a739b724452f93f850a1c268c42e439317bDavid Gross        }
32126ef7a739b724452f93f850a1c268c42e439317bDavid Gross
3224a4578530a1a5fb751ea5a7bfbff83f3ab669895David Gross        mRS.nScriptReduce(getID(mRS), slot, in_ids, out_id, limits);
32326ef7a739b724452f93f850a1c268c42e439317bDavid Gross    }
32426ef7a739b724452f93f850a1c268c42e439317bDavid Gross
325be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes    long[] mInIdsBuffer;
326be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
3277a629fac82f88126642081b4474879f6a883e313Tim Murray    Script(long id, RenderScript rs) {
3280de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
329be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
330be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes        mInIdsBuffer = new long[1];
3316484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni
3326484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni        /* The constructors for the derived classes (including ScriptIntrinsic
3336484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * derived classes and ScriptC derived classes generated by Slang
3346484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * reflection) seem to be simple enough, so we just put the guard.open()
3356484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * call here, rather than in the end of the constructor for the derived
3366484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * class. This, of course, assumes the derived constructor would not
3376484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * throw any exception after calling this constructor.
3386484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         *
3396484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * If new derived classes are added with more complicated constructors
3406484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * that throw exceptions, this call has to be (duplicated and) moved
3416484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         * to the end of each derived class constructor.
3426484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni         */
3436484b6be5ca5233614d0a8991a5d909543824fc7Yang Ni        guard.open("destroy");
34469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    }
34569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
3469c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
34767e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
34867e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
34967e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
35069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    public void bindAllocation(Allocation va, int slot) {
351771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
352678cc7fe9fef00fb3381e64f95cc6907796bcd8eJason Sams        mRS.validateObject(va);
3534d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if (va != null) {
354be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
355be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            android.content.Context context = mRS.getApplicationContext();
356be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
357be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            if (context.getApplicationInfo().targetSdkVersion >= 20) {
358cf9c894a9b7523cd5ec707218b89517f67caa047Jason Sams                final Type t = va.mType;
359be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                if (t.hasMipmaps() || t.hasFaces() || (t.getY() != 0) ||
360be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                    (t.getZ() != 0)) {
361be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes
362cf9c894a9b7523cd5ec707218b89517f67caa047Jason Sams                    throw new RSIllegalArgumentException(
363be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                        "API 20+ only allows simple 1D allocations to be " +
364be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                        "used with bind.");
365cf9c894a9b7523cd5ec707218b89517f67caa047Jason Sams                }
366cf9c894a9b7523cd5ec707218b89517f67caa047Jason Sams            }
367e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mRS.nScriptBindAllocation(getID(mRS), va.getID(mRS), slot);
3684d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        } else {
369e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mRS.nScriptBindAllocation(getID(mRS), 0, slot);
3704d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
3714d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
3724d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
3739c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
37467e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
37567e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
37667e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
3774d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public void setVar(int index, float v) {
378e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarF(getID(mRS), index, v);
3794d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
3807c4caadb939b1563328251c156262c179a685c70Tim Murray    public float getVarF(int index) {
3817c4caadb939b1563328251c156262c179a685c70Tim Murray        return mRS.nScriptGetVarF(getID(mRS), index);
3827c4caadb939b1563328251c156262c179a685c70Tim Murray    }
3834d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
3849c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
38567e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
38667e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
38767e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
388ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines    public void setVar(int index, double v) {
389e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarD(getID(mRS), index, v);
390ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines    }
3917c4caadb939b1563328251c156262c179a685c70Tim Murray    public double getVarD(int index) {
3927c4caadb939b1563328251c156262c179a685c70Tim Murray        return mRS.nScriptGetVarD(getID(mRS), index);
3937c4caadb939b1563328251c156262c179a685c70Tim Murray    }
394ca54ec302f5bddd1674ea1f36cd3b7c540b2fbcaStephen Hines
3959c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
39667e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
39767e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
39867e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
3994d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public void setVar(int index, int v) {
400e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarI(getID(mRS), index, v);
4014d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
4027c4caadb939b1563328251c156262c179a685c70Tim Murray    public int getVarI(int index) {
4037c4caadb939b1563328251c156262c179a685c70Tim Murray        return mRS.nScriptGetVarI(getID(mRS), index);
4047c4caadb939b1563328251c156262c179a685c70Tim Murray    }
4057c4caadb939b1563328251c156262c179a685c70Tim Murray
4064d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
4079c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
40867e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
40967e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
41067e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
411031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines    public void setVar(int index, long v) {
412e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarJ(getID(mRS), index, v);
413031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines    }
4147c4caadb939b1563328251c156262c179a685c70Tim Murray    public long getVarJ(int index) {
4157c4caadb939b1563328251c156262c179a685c70Tim Murray        return mRS.nScriptGetVarJ(getID(mRS), index);
4167c4caadb939b1563328251c156262c179a685c70Tim Murray    }
4177c4caadb939b1563328251c156262c179a685c70Tim Murray
418031ec58cfc7a20927302a5300eba3f5fc1709b50Stephen Hines
4199c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
42067e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
42167e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
42267e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
4230b9a22cf782ab8f837161bf3357e08471ff5b9f2Jason Sams    public void setVar(int index, boolean v) {
424e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarI(getID(mRS), index, v ? 1 : 0);
4250b9a22cf782ab8f837161bf3357e08471ff5b9f2Jason Sams    }
4267c4caadb939b1563328251c156262c179a685c70Tim Murray    public boolean getVarB(int index) {
4277c4caadb939b1563328251c156262c179a685c70Tim Murray        return mRS.nScriptGetVarI(getID(mRS), index) > 0 ? true : false;
4287c4caadb939b1563328251c156262c179a685c70Tim Murray    }
4290b9a22cf782ab8f837161bf3357e08471ff5b9f2Jason Sams
4309c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
43167e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
43267e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
43367e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
4346f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams    public void setVar(int index, BaseObj o) {
435678cc7fe9fef00fb3381e64f95cc6907796bcd8eJason Sams        mRS.validate();
436678cc7fe9fef00fb3381e64f95cc6907796bcd8eJason Sams        mRS.validateObject(o);
437e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : o.getID(mRS));
4386f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams    }
4396f4cf0b8885403ead157ae00fd43cf1282331c23Jason Sams
4409c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
44167e3d206ca80dd97309ca63169503088cb509bdeJason Sams     * Only intended for use by generated reflected code.
44267e3d206ca80dd97309ca63169503088cb509bdeJason Sams     *
44367e3d206ca80dd97309ca63169503088cb509bdeJason Sams     */
4444d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public void setVar(int index, FieldPacker v) {
445e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams        mRS.nScriptSetVarV(getID(mRS), index, v.getData());
44669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    }
44769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
4489c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
449adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines     * Only intended for use by generated reflected code.
450adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines     *
451adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines     */
452adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    public void setVar(int index, FieldPacker v, Element e, int[] dims) {
453adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines        mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), e.getID(mRS), dims);
454adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines    }
455adeb809201fcb77ba2b76a814ae4cdc9dacb326bStephen Hines
456f64cca905c45fcc74aacf78e6510e133385110cfJason Sams    /**
457f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     * Only intended for use by generated reflected code.
458f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     *
459f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     */
4607c4caadb939b1563328251c156262c179a685c70Tim Murray    public void getVarV(int index, FieldPacker v) {
4617c4caadb939b1563328251c156262c179a685c70Tim Murray        mRS.nScriptGetVarV(getID(mRS), index, v.getData());
4627c4caadb939b1563328251c156262c179a685c70Tim Murray    }
4637c4caadb939b1563328251c156262c179a685c70Tim Murray
46422534176fb5c1257130ef4ee589739ca42766a32Jason Sams    public void setTimeZone(String timeZone) {
465771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
46622534176fb5c1257130ef4ee589739ca42766a32Jason Sams        try {
467e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams            mRS.nScriptSetTimeZone(getID(mRS), timeZone.getBytes("UTF-8"));
46822534176fb5c1257130ef4ee589739ca42766a32Jason Sams        } catch (java.io.UnsupportedEncodingException e) {
46922534176fb5c1257130ef4ee589739ca42766a32Jason Sams            throw new RuntimeException(e);
47022534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
47122534176fb5c1257130ef4ee589739ca42766a32Jason Sams    }
47269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
473c11e25c4e653124def1fb18e203b894f42106cbeTim Murray    /**
474c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Only intended for use by generated reflected code.
475c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     *
476c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     */
47769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    public static class Builder {
47869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        RenderScript mRS;
47969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
48069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        Builder(RenderScript rs) {
48169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams            mRS = rs;
482fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams        }
48369f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    }
48469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
4852d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
486f64cca905c45fcc74aacf78e6510e133385110cfJason Sams    /**
487f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     * Only intended for use by generated reflected code.
488f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     *
489f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     */
4902d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams    public static class FieldBase {
4912d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        protected Element mElement;
4922d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        protected Allocation mAllocation;
4932d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
4942d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        protected void init(RenderScript rs, int dimx) {
495be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            mAllocation = Allocation.createSized(rs, mElement, dimx,
496be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                                                 Allocation.USAGE_SCRIPT);
4975476b450e50939940dcf3f15c92335cee2fc572dJason Sams        }
4985476b450e50939940dcf3f15c92335cee2fc572dJason Sams
4995476b450e50939940dcf3f15c92335cee2fc572dJason Sams        protected void init(RenderScript rs, int dimx, int usages) {
500be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes            mAllocation =
501be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                Allocation.createSized(rs, mElement, dimx,
502be7b1defb6b11920703b241ba5815fb09487bb02Chris Wailes                                       Allocation.USAGE_SCRIPT | usages);
5032d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        }
5042d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
5052d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        protected FieldBase() {
5062d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        }
5072d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
5082d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        public Element getElement() {
5092d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams            return mElement;
5102d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        }
5112d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
5122d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        public Type getType() {
51331a7e42f4baa059352f0db119de38428e655eab2Jason Sams            return mAllocation.getType();
5142d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        }
5152d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
5162d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        public Allocation getAllocation() {
5172d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams            return mAllocation;
5182d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        }
5192d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams
5202d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        //@Override
5212d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        public void updateAllocation() {
5222d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams        }
5232d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams    }
524fbfaa853630edfca25eaa840f92035713eef13baTim Murray
525fbfaa853630edfca25eaa840f92035713eef13baTim Murray
526f64cca905c45fcc74aacf78e6510e133385110cfJason Sams    /**
5278610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * Class for specifying the specifics about how a kernel will be
52853fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang     * launched.
5298610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     *
5308610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * This class can specify a potential range of cells on which to
5318610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * run a kernel.  If no set is called for a dimension then this
5328610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * class will have no impact on that dimension when the kernel
5338610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * is executed.
5348610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     *
53553fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang     * The forEach kernel launch will operate over the intersection of
53653fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang     * the dimensions.
5378610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     *
5388610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * Example:
5398610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * LaunchOptions with setX(5, 15)
5408610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     * Allocation with dimension X=10, Y=10
54153fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang     * The resulting forEach run would execute over:
54253fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang     * x = 5 to 9 (inclusive) and
54353fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang     * y = 0 to 9 (inclusive).
5448610f837bcc70f30f0ed4a6f59b54bd1d896f305Jason Sams     *
545f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     *
546f64cca905c45fcc74aacf78e6510e133385110cfJason Sams     */
547f64cca905c45fcc74aacf78e6510e133385110cfJason Sams    public static final class LaunchOptions {
548f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int xstart = 0;
549f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int ystart = 0;
550f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int xend = 0;
551f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int yend = 0;
552f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int zstart = 0;
553f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int zend = 0;
554f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        private int strategy;
555f64cca905c45fcc74aacf78e6510e133385110cfJason Sams
556f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
55753fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * Set the X range. xstartArg is the lowest coordinate of the range,
55853fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * and xendArg-1 is the highest coordinate of the range.
559f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
560f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @param xstartArg Must be >= 0
56153fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * @param xendArg Must be > xstartArg
562f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
563f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return LaunchOptions
564f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
565eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        public LaunchOptions setX(int xstartArg, int xendArg) {
566fbfaa853630edfca25eaa840f92035713eef13baTim Murray            if (xstartArg < 0 || xendArg <= xstartArg) {
567fbfaa853630edfca25eaa840f92035713eef13baTim Murray                throw new RSIllegalArgumentException("Invalid dimensions");
568fbfaa853630edfca25eaa840f92035713eef13baTim Murray            }
569fbfaa853630edfca25eaa840f92035713eef13baTim Murray            xstart = xstartArg;
570fbfaa853630edfca25eaa840f92035713eef13baTim Murray            xend = xendArg;
571eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            return this;
572fbfaa853630edfca25eaa840f92035713eef13baTim Murray        }
573fbfaa853630edfca25eaa840f92035713eef13baTim Murray
574f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
57553fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * Set the Y range. ystartArg is the lowest coordinate of the range,
57653fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * and yendArg-1 is the highest coordinate of the range.
577f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
578f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @param ystartArg Must be >= 0
57953fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * @param yendArg Must be > ystartArg
580f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
581f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return LaunchOptions
582f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
583eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        public LaunchOptions setY(int ystartArg, int yendArg) {
584fbfaa853630edfca25eaa840f92035713eef13baTim Murray            if (ystartArg < 0 || yendArg <= ystartArg) {
585fbfaa853630edfca25eaa840f92035713eef13baTim Murray                throw new RSIllegalArgumentException("Invalid dimensions");
586fbfaa853630edfca25eaa840f92035713eef13baTim Murray            }
587fbfaa853630edfca25eaa840f92035713eef13baTim Murray            ystart = ystartArg;
588fbfaa853630edfca25eaa840f92035713eef13baTim Murray            yend = yendArg;
589eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            return this;
590eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
591eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray
592f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
59353fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * Set the Z range. zstartArg is the lowest coordinate of the range,
59453fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * and zendArg-1 is the highest coordinate of the range.
595f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
596f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @param zstartArg Must be >= 0
59753fdcfbe63c1d4b2f1cbee6e72a6dd13f41dc1bcMiao Wang         * @param zendArg Must be > zstartArg
598f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
599f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return LaunchOptions
600f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
601eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        public LaunchOptions setZ(int zstartArg, int zendArg) {
602eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            if (zstartArg < 0 || zendArg <= zstartArg) {
603eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray                throw new RSIllegalArgumentException("Invalid dimensions");
604eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            }
605eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            zstart = zstartArg;
606eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            zend = zendArg;
607eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            return this;
608fbfaa853630edfca25eaa840f92035713eef13baTim Murray        }
609fbfaa853630edfca25eaa840f92035713eef13baTim Murray
610eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray
611f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
612f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * Returns the current X start
613f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
614f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return int current value
615f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
616fbfaa853630edfca25eaa840f92035713eef13baTim Murray        public int getXStart() {
617fbfaa853630edfca25eaa840f92035713eef13baTim Murray            return xstart;
618fbfaa853630edfca25eaa840f92035713eef13baTim Murray        }
619f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
620f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * Returns the current X end
621f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
622f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return int current value
623f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
624fbfaa853630edfca25eaa840f92035713eef13baTim Murray        public int getXEnd() {
625fbfaa853630edfca25eaa840f92035713eef13baTim Murray            return xend;
626fbfaa853630edfca25eaa840f92035713eef13baTim Murray        }
627f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
628f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * Returns the current Y start
629f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
630f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return int current value
631f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
632fbfaa853630edfca25eaa840f92035713eef13baTim Murray        public int getYStart() {
633fbfaa853630edfca25eaa840f92035713eef13baTim Murray            return ystart;
634fbfaa853630edfca25eaa840f92035713eef13baTim Murray        }
635f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
636f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * Returns the current Y end
637f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
638f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return int current value
639f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
640fbfaa853630edfca25eaa840f92035713eef13baTim Murray        public int getYEnd() {
641fbfaa853630edfca25eaa840f92035713eef13baTim Murray            return yend;
642fbfaa853630edfca25eaa840f92035713eef13baTim Murray        }
643f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
644f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * Returns the current Z start
645f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
646f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return int current value
647f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
648eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        public int getZStart() {
649eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            return zstart;
650eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
651f64cca905c45fcc74aacf78e6510e133385110cfJason Sams        /**
652f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * Returns the current Z end
653f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         *
654f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         * @return int current value
655f64cca905c45fcc74aacf78e6510e133385110cfJason Sams         */
656eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        public int getZEnd() {
657eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray            return zend;
658eb8c29cb7ece3f4b7ad18e5393b07fa7418a541cTim Murray        }
659fbfaa853630edfca25eaa840f92035713eef13baTim Murray
660fbfaa853630edfca25eaa840f92035713eef13baTim Murray    }
66169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams}
662