1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
24419977d78018a9933c7f455fe001f644f2d638bStephen Hines * Copyright (C) 2009-2012 The Android Open Source Project
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License.
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License.
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h"
18d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines#include <time.h>
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2011496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace android {
2111496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace renderscript {
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
23afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukScript::Script(Context *rsc) : ObjectBase(rsc) {
24928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    memset(&mEnviroment, 0, sizeof(mEnviroment));
25bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    memset(&mHal, 0, sizeof(mHal));
26700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk
2744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    mSlots = nullptr;
2844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    mTypes = nullptr;
2977020c5248ca0921d7d24fb60dec5105ba39026cJason Sams    mInitialized = false;
30c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines    mHasObjectSlots = false;
315d95a78ab5758c2625949d78bb67eb3c5d9701ccStephen Hines    mApiLevel = 0;
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
34afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukScript::~Script() {
35afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (mSlots) {
36700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk        delete [] mSlots;
3744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        mSlots = nullptr;
38700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk    }
39afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (mTypes) {
40700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk        delete [] mTypes;
4144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        mTypes = nullptr;
42700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk    }
43700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk}
44700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk
45700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchoukvoid Script::setSlot(uint32_t slot, Allocation *a) {
46af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("setSlot %i %p", slot, a);
47bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (slot >= mHal.info.exportedVariableCount) {
48af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Script::setSlot unable to set allocation, invalid slot index");
49700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk        return;
50700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk    }
51700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk
524efe3d38ee1d7b76c93a47ce6218b1f708fd4d9aJason Sams    if (mRSC->hadFatalError()) return;
534efe3d38ee1d7b76c93a47ce6218b1f708fd4d9aJason Sams
54700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk    mSlots[slot].set(a);
55c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines    mHasObjectSlots = true;
56807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    mRSC->mHal.funcs.script.setGlobalBind(mRSC, this, slot, a);
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
59b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchoukvoid Script::setVar(uint32_t slot, const void *val, size_t len) {
60af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("setVar %i %p %i", slot, val, len);
61bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (slot >= mHal.info.exportedVariableCount) {
62af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Script::setVar unable to set allocation, invalid slot index");
63bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        return;
64be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    }
654efe3d38ee1d7b76c93a47ce6218b1f708fd4d9aJason Sams    if (mRSC->hadFatalError()) return;
664efe3d38ee1d7b76c93a47ce6218b1f708fd4d9aJason Sams
67bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    mRSC->mHal.funcs.script.setGlobalVar(mRSC, this, slot, (void *)val, len);
68be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
69be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
709c64239ebbfa4170190ede812e69150035e008e0Tim Murrayvoid Script::getVar(uint32_t slot, const void *val, size_t len) {
719c64239ebbfa4170190ede812e69150035e008e0Tim Murray    //ALOGE("getVar %i %p %i", slot, val, len);
729c64239ebbfa4170190ede812e69150035e008e0Tim Murray    if (slot >= mHal.info.exportedVariableCount) {
73cadee38f6940e5584d3ec3398a21bd2a494361e2Stephen Hines        ALOGE("Script::getVar unable to set allocation, invalid slot index: "
7402759d75bdf238551134dfdda095e3ffcf319a25Nick Kralevich              "%u >= %zu", slot, mHal.info.exportedVariableCount);
759c64239ebbfa4170190ede812e69150035e008e0Tim Murray        return;
769c64239ebbfa4170190ede812e69150035e008e0Tim Murray    }
774efe3d38ee1d7b76c93a47ce6218b1f708fd4d9aJason Sams    if (mRSC->hadFatalError()) return;
784efe3d38ee1d7b76c93a47ce6218b1f708fd4d9aJason Sams
799c64239ebbfa4170190ede812e69150035e008e0Tim Murray    mRSC->mHal.funcs.script.getGlobalVar(mRSC, this, slot, (void *)val, len);
809c64239ebbfa4170190ede812e69150035e008e0Tim Murray}
819c64239ebbfa4170190ede812e69150035e008e0Tim Murray
822980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hinesvoid Script::setVar(uint32_t slot, const void *val, size_t len, Element *e,
83f0a5078aaf6426e5524a847a0b17d09570fc00b8Stephen Hines                    const uint32_t *dims, size_t dimLen) {
842980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    if (slot >= mHal.info.exportedVariableCount) {
85cadee38f6940e5584d3ec3398a21bd2a494361e2Stephen Hines        ALOGE("Script::setVar unable to set allocation, invalid slot index: "
8602759d75bdf238551134dfdda095e3ffcf319a25Nick Kralevich              "%u >= %zu", slot, mHal.info.exportedVariableCount);
872980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        return;
882980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    }
894efe3d38ee1d7b76c93a47ce6218b1f708fd4d9aJason Sams    if (mRSC->hadFatalError()) return;
904efe3d38ee1d7b76c93a47ce6218b1f708fd4d9aJason Sams
912980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    mRSC->mHal.funcs.script.setGlobalVarWithElemDims(mRSC, this, slot,
922980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines            (void *)val, len, e, dims, dimLen);
932980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines}
942980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines
95a5eb6e17c08426deeedf989d6be280d89662ee82Jason Samsvoid Script::setVarObj(uint32_t slot, ObjectBase *val) {
96af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("setVarObj %i %p", slot, val);
97bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (slot >= mHal.info.exportedVariableCount) {
98cadee38f6940e5584d3ec3398a21bd2a494361e2Stephen Hines        ALOGE("Script::setVarObj unable to set allocation, invalid slot index: "
9902759d75bdf238551134dfdda095e3ffcf319a25Nick Kralevich              "%u >= %zu", slot, mHal.info.exportedVariableCount);
100bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        return;
101a5eb6e17c08426deeedf989d6be280d89662ee82Jason Sams    }
1024efe3d38ee1d7b76c93a47ce6218b1f708fd4d9aJason Sams    if (mRSC->hadFatalError()) return;
1034efe3d38ee1d7b76c93a47ce6218b1f708fd4d9aJason Sams
104c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines    mHasObjectSlots = true;
105bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    mRSC->mHal.funcs.script.setGlobalObj(mRSC, this, slot, val);
106a5eb6e17c08426deeedf989d6be280d89662ee82Jason Sams}
107a5eb6e17c08426deeedf989d6be280d89662ee82Jason Sams
108a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Samsvoid Script::callUpdateCacheObject(const Context *rsc, void *dstObj) const {
10944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (rsc->mHal.funcs.script.updateCachedObject != nullptr) {
110a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        rsc->mHal.funcs.script.updateCachedObject(rsc, this, (rs_script *)dstObj);
111a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    } else {
112a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams        *((const void **)dstObj) = this;
113a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    }
114a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams}
115a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
1164ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hinesbool Script::freeChildren() {
1174ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines    incSysRef();
1184ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines    mRSC->mHal.funcs.script.invokeFreeChildren(mRSC, this);
1194ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines    return decSysRef();
1204ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines}
1214ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines
122dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason SamsScriptKernelID::ScriptKernelID(Context *rsc, Script *s, int slot, int sig)
123eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        : IDBase(rsc, s, slot) {
124dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mHasKernelInput = (sig & 1) != 0;
125dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mHasKernelOutput = (sig & 2) != 0;
126dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
127dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
128dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason SamsRsA3DClassID ScriptKernelID::getClassId() const {
129dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    return RS_A3D_CLASS_ID_SCRIPT_KERNEL_ID;
130dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
131dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
132eb9aa675754c49f613c6ad71d41472b30f38b007Yang NiScriptInvokeID::ScriptInvokeID(Context *rsc, Script *s, int slot)
133eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    : IDBase(rsc, s, slot) {
134dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
135dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
136eb9aa675754c49f613c6ad71d41472b30f38b007Yang NiRsA3DClassID ScriptInvokeID::getClassId() const {
137eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    return RS_A3D_CLASS_ID_SCRIPT_INVOKE_ID;
138dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
139dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
140eb9aa675754c49f613c6ad71d41472b30f38b007Yang NiScriptFieldID::ScriptFieldID(Context *rsc, Script *s, int slot) :
141eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    IDBase(rsc, s, slot) {
142dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
143dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
144dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason SamsRsA3DClassID ScriptFieldID::getClassId() const {
145dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    return RS_A3D_CLASS_ID_SCRIPT_FIELD_ID;
146dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
147dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
148dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
149dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason SamsRsScriptKernelID rsi_ScriptKernelIDCreate(Context *rsc, RsScript vs, int slot, int sig) {
15061c86951f6a1192fafc536aee613beb6f899064bStephen Hines    ScriptKernelID *kid = new ScriptKernelID(rsc, (Script *)vs, slot, sig);
15161c86951f6a1192fafc536aee613beb6f899064bStephen Hines    kid->incUserRef();
15261c86951f6a1192fafc536aee613beb6f899064bStephen Hines    return kid;
153dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
154dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
155eb9aa675754c49f613c6ad71d41472b30f38b007Yang NiRsScriptInvokeID rsi_ScriptInvokeIDCreate(Context *rsc, RsScript vs, uint32_t slot) {
156eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    ScriptInvokeID *iid = new ScriptInvokeID(rsc, (Script *)vs, slot);
157eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    iid->incUserRef();
158eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    return iid;
159eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni}
160eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni
161dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason SamsRsScriptFieldID rsi_ScriptFieldIDCreate(Context *rsc, RsScript vs, int slot) {
16261c86951f6a1192fafc536aee613beb6f899064bStephen Hines    ScriptFieldID *fid = new ScriptFieldID(rsc, (Script *)vs, slot);
16361c86951f6a1192fafc536aee613beb6f899064bStephen Hines    fid->incUserRef();
16461c86951f6a1192fafc536aee613beb6f899064bStephen Hines    return fid;
165dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
166dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
167afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_ScriptBindAllocation(Context * rsc, RsScript vs, RsAllocation va, uint32_t slot) {
168326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Script *s = static_cast<Script *>(vs);
169be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    Allocation *a = static_cast<Allocation *>(va);
170700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk    s->setSlot(slot, a);
171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
173b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchoukvoid rsi_ScriptSetTimeZone(Context * rsc, RsScript vs, const char * timeZone, size_t length) {
174d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines    // We unfortunately need to make a new copy of the string, since it is
17544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    // not nullptr-terminated. We then use setenv(), which properly handles
176d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines    // freeing/duplicating the actual string for the environment.
177d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines    char *tz = (char *) malloc(length + 1);
178d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines    if (!tz) {
179af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Couldn't allocate memory for timezone buffer");
180d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines        return;
181d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines    }
182d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines    strncpy(tz, timeZone, length);
183d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines    tz[length] = '\0';
184d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines    if (setenv("TZ", tz, 1) == 0) {
185d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines        tzset();
186d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines    } else {
187af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Error setting timezone");
188d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines    }
189d2432b9691869b5b40a5b49c682c40d917ea9dcbStephen Hines    free(tz);
190d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams}
191d34b725ac1752f5a234c7643a0b65245591ea1ccJason Sams
1924b3c34e6833e39bc89c2128002806b654b8e623dChris Wailesvoid rsi_ScriptForEachMulti(Context *rsc, RsScript vs, uint32_t slot,
1934b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            RsAllocation *vains, size_t inLen,
1944b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            RsAllocation vaout, const void *params,
1954b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            size_t paramLen, const RsScriptCall *sc,
1964b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            size_t scLen) {
197f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes
198f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes    Script      *s    = static_cast<Script *>(vs);
1994b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes    Allocation **ains = (Allocation**)(vains);
2004b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
2014b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes    s->runForEach(rsc, slot,
2024b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                  const_cast<const Allocation **>(ains), inLen,
2034b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                  static_cast<Allocation *>(vaout), params, paramLen, sc);
2044b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
2054b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes}
2064b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
207f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailesvoid rsi_ScriptForEach(Context *rsc, RsScript vs, uint32_t slot,
208f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                       RsAllocation vain, RsAllocation vaout,
209f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                       const void *params, size_t paramLen,
210f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                       const RsScriptCall *sc, size_t scLen) {
211f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes
21244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (vain == nullptr) {
21344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        rsi_ScriptForEachMulti(rsc, vs, slot, nullptr, 0, vaout, params, paramLen,
214f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                               sc, scLen);
215f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes    } else {
216f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes        RsAllocation ains[1] = {vain};
217f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes
218f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes        rsi_ScriptForEachMulti(rsc, vs, slot, ains,
219f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                               sizeof(ains) / sizeof(RsAllocation), vaout,
220f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                               params, paramLen, sc, scLen);
221f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes    }
222f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes}
223f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes
22439a9d9b7d1e1231c89021d2a45b59e9c08eed4b4Matt Walavoid rsi_ScriptReduce(Context *rsc, RsScript vs, uint32_t slot,
225ae2ec3febedfc29376b9104413fb4042028f1265David Gross                      RsAllocation *vains, size_t inLen,
226ae2ec3febedfc29376b9104413fb4042028f1265David Gross                      RsAllocation vaout, const RsScriptCall *sc,
227ae2ec3febedfc29376b9104413fb4042028f1265David Gross                      size_t scLen) {
2286c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross  Script *s = static_cast<Script *>(vs);
2296c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross  Allocation **ains = (Allocation**)(vains);
2306c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross
231ae2ec3febedfc29376b9104413fb4042028f1265David Gross  s->runReduce(rsc, slot,
232ae2ec3febedfc29376b9104413fb4042028f1265David Gross               const_cast<const Allocation **>(ains), inLen,
233ae2ec3febedfc29376b9104413fb4042028f1265David Gross               static_cast<Allocation *>(vaout), sc);
2346c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross}
2356c1876bbef1b2c89975dce91230a168bd2d2ce4cDavid Gross
236afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_ScriptInvoke(Context *rsc, RsScript vs, uint32_t slot) {
2378c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams    Script *s = static_cast<Script *>(vs);
23844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    s->Invoke(rsc, slot, nullptr, 0);
2398c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams}
2408c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams
2418c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams
242afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_ScriptInvokeData(Context *rsc, RsScript vs, uint32_t slot, void *data) {
243be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    Script *s = static_cast<Script *>(vs);
24444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    s->Invoke(rsc, slot, nullptr, 0);
245be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
246be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
247b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchoukvoid rsi_ScriptInvokeV(Context *rsc, RsScript vs, uint32_t slot, const void *data, size_t len) {
248be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    Script *s = static_cast<Script *>(vs);
24922fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    s->Invoke(rsc, slot, data, len);
250be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
251be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
252afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_ScriptSetVarI(Context *rsc, RsScript vs, uint32_t slot, int value) {
253be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    Script *s = static_cast<Script *>(vs);
254be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->setVar(slot, &value, sizeof(value));
255be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
256be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
257a5eb6e17c08426deeedf989d6be280d89662ee82Jason Samsvoid rsi_ScriptSetVarObj(Context *rsc, RsScript vs, uint32_t slot, RsObjectBase value) {
258a5eb6e17c08426deeedf989d6be280d89662ee82Jason Sams    Script *s = static_cast<Script *>(vs);
259a5eb6e17c08426deeedf989d6be280d89662ee82Jason Sams    ObjectBase *o = static_cast<ObjectBase *>(value);
260a5eb6e17c08426deeedf989d6be280d89662ee82Jason Sams    s->setVarObj(slot, o);
261a5eb6e17c08426deeedf989d6be280d89662ee82Jason Sams}
262a5eb6e17c08426deeedf989d6be280d89662ee82Jason Sams
263099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murrayvoid rsi_ScriptSetVarJ(Context *rsc, RsScript vs, uint32_t slot, int64_t value) {
2640977c94a4b83dd8ef6d3808160710ebbaa1b1768Stephen Hines    Script *s = static_cast<Script *>(vs);
2650977c94a4b83dd8ef6d3808160710ebbaa1b1768Stephen Hines    s->setVar(slot, &value, sizeof(value));
2660977c94a4b83dd8ef6d3808160710ebbaa1b1768Stephen Hines}
2670977c94a4b83dd8ef6d3808160710ebbaa1b1768Stephen Hines
268afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_ScriptSetVarF(Context *rsc, RsScript vs, uint32_t slot, float value) {
269be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    Script *s = static_cast<Script *>(vs);
270be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->setVar(slot, &value, sizeof(value));
271be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams}
272be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams
273afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_ScriptSetVarD(Context *rsc, RsScript vs, uint32_t slot, double value) {
2746d0a0740530d57e2a5759df994352600946ff47dStephen Hines    Script *s = static_cast<Script *>(vs);
2756d0a0740530d57e2a5759df994352600946ff47dStephen Hines    s->setVar(slot, &value, sizeof(value));
2766d0a0740530d57e2a5759df994352600946ff47dStephen Hines}
2776d0a0740530d57e2a5759df994352600946ff47dStephen Hines
278b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchoukvoid rsi_ScriptSetVarV(Context *rsc, RsScript vs, uint32_t slot, const void *data, size_t len) {
279be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    Script *s = static_cast<Script *>(vs);
280be36bf3a76481737a7fa606a04144ceef80eb4f2Jason Sams    s->setVar(slot, data, len);
281fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams}
282fa51719e6c1bd17b3f347477b4827face9ab647eJason Sams
2839c64239ebbfa4170190ede812e69150035e008e0Tim Murrayvoid rsi_ScriptGetVarV(Context *rsc, RsScript vs, uint32_t slot, void *data, size_t len) {
2849c64239ebbfa4170190ede812e69150035e008e0Tim Murray    Script *s = static_cast<Script *>(vs);
2859c64239ebbfa4170190ede812e69150035e008e0Tim Murray    s->getVar(slot, data, len);
2869c64239ebbfa4170190ede812e69150035e008e0Tim Murray}
2879c64239ebbfa4170190ede812e69150035e008e0Tim Murray
2882980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hinesvoid rsi_ScriptSetVarVE(Context *rsc, RsScript vs, uint32_t slot,
2892980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines                        const void *data, size_t len, RsElement ve,
290ac8d146a41f18afad5314ac8af440d6aedbe20bfStephen Hines                        const uint32_t *dims, size_t dimLen) {
2912980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    Script *s = static_cast<Script *>(vs);
2922980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    Element *e = static_cast<Element *>(ve);
2932980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    s->setVar(slot, data, len, e, dims, dimLen);
2942980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines}
2952980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines
29611496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace renderscript
29711496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace android
298