1bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams/*
2ee7aa2e3900f807ee41bb9735da86b3eb4cc2e70Stephen Hines * Copyright (C) 2011-2012 The Android Open Source Project
3bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *
4bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * you may not use this file except in compliance with the License.
6bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * You may obtain a copy of the License at
7bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *
8bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams *
10bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * Unless required by applicable law or agreed to in writing, software
11bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * See the License for the specific language governing permissions and
14bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams * limitations under the License.
15bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams */
16bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
17bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#include "rsdCore.h"
18bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
19a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao#include <bcc/BCCContext.h>
20378d30b1da622e0e75e551e95fafb18ff3a3f88eStephen Hines#include <bcc/Renderscript/RSCompilerDriver.h>
21378d30b1da622e0e75e551e95fafb18ff3a3f88eStephen Hines#include <bcc/Renderscript/RSExecutable.h>
22378d30b1da622e0e75e551e95fafb18ff3a3f88eStephen Hines#include <bcc/Renderscript/RSInfo.h>
23689821f178503af951a3d9dd558ef8eace6537cdStephen Hines
24dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsdBcc.h"
25dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsdRuntime.h"
26dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsdAllocation.h"
27dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams#include "rsdIntrinsics.h"
28dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
29bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#include "rsContext.h"
302980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines#include "rsElement.h"
31bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#include "rsScriptC.h"
32bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
33a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao#include "utils/Vector.h"
34bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#include "utils/Timers.h"
35bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams#include "utils/StopWatch.h"
36bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
37bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsusing namespace android;
38bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsusing namespace android::renderscript;
39bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
4083c451a4ef4388e002482e383d488ca9b7b7600dJason Sams
41cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Samsstatic Script * setTLS(Script *sc) {
4283c451a4ef4388e002482e383d488ca9b7b7600dJason Sams    ScriptTLSStruct * tls = (ScriptTLSStruct *)pthread_getspecific(rsdgThreadTLSKey);
43cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    rsAssert(tls);
44cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    Script *old = tls->mScript;
45cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    tls->mScript = sc;
46cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    return old;
47cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams}
48cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
49cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
50bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsbool rsdScriptInit(const Context *rsc,
51bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                     ScriptC *script,
52bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                     char const *resName,
53bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                     char const *cacheDir,
54bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                     uint8_t const *bitcode,
55bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                     size_t bitcodeSize,
5687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                     uint32_t flags) {
57af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("rsdScriptCreate %p %p %p %p %i %i %p", rsc, resName, cacheDir, bitcode, bitcodeSize, flags, lookupFunc);
580ab9f9f6b1fb31cda536ae4aeaed258f78ee1447Jason Sams    //ALOGE("rsdScriptInit %p %p", rsc, script);
59bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
6083c451a4ef4388e002482e383d488ca9b7b7600dJason Sams    pthread_mutex_lock(&rsdgInitMutex);
611415ca46b289604fd727310e4f6ae3c8c68276c9Logan Chien
62a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    bcc::RSExecutable *exec;
63a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    const bcc::RSInfo *info;
64bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    DrvScript *drv = (DrvScript *)calloc(1, sizeof(DrvScript));
65bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (drv == NULL) {
6683c451a4ef4388e002482e383d488ca9b7b7600dJason Sams        goto error;
67bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    }
68bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    script->mHal.drv = drv;
69bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
70a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    drv->mCompilerContext = NULL;
71a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    drv->mCompilerDriver = NULL;
72a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    drv->mExecutable = NULL;
73070cb235d9f094048c0260aa72d5acf61ed840a3Stephen Hines
74a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    drv->mCompilerContext = new bcc::BCCContext();
75a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    if (drv->mCompilerContext == NULL) {
76a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        ALOGE("bcc: FAILS to create compiler context (out of memory)");
7783c451a4ef4388e002482e383d488ca9b7b7600dJason Sams        goto error;
78bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    }
79bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
80a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    drv->mCompilerDriver = new bcc::RSCompilerDriver();
81a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    if (drv->mCompilerDriver == NULL) {
82a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        ALOGE("bcc: FAILS to create compiler driver (out of memory)");
83070cb235d9f094048c0260aa72d5acf61ed840a3Stephen Hines        goto error;
84070cb235d9f094048c0260aa72d5acf61ed840a3Stephen Hines    }
85bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
86a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    script->mHal.info.isThreadable = true;
87bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
88a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    drv->mCompilerDriver->setRSRuntimeLookupFunction(rsdLookupRuntimeStub);
89a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    drv->mCompilerDriver->setRSRuntimeLookupContext(script);
90bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
91a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    exec = drv->mCompilerDriver->build(*drv->mCompilerContext,
92a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao                                       cacheDir, resName,
93a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao                                       (const char *)bitcode, bitcodeSize);
94bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
95a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    if (exec == NULL) {
96a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        ALOGE("bcc: FAILS to prepare executable for '%s'", resName);
97a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        goto error;
984419977d78018a9933c7f455fe001f644f2d638bStephen Hines    }
993815badf95a7dca8aa278e3e12f07a3924a82319Stephen Hines
100a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    drv->mExecutable = exec;
101070cb235d9f094048c0260aa72d5acf61ed840a3Stephen Hines
102a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    exec->setThreadable(script->mHal.info.isThreadable);
103a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    if (!exec->syncInfo()) {
104a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        ALOGW("bcc: FAILS to synchronize the RS info file to the disk");
105070cb235d9f094048c0260aa72d5acf61ed840a3Stephen Hines    }
106ec3fc1163c01e18b1454057723c451f0d96868adShih-wei Liao
107a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    drv->mRoot = reinterpret_cast<int (*)()>(exec->getSymbolAddress("root"));
108a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    drv->mRootExpand =
109a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        reinterpret_cast<int (*)()>(exec->getSymbolAddress("root.expand"));
110a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    drv->mInit = reinterpret_cast<void (*)()>(exec->getSymbolAddress("init"));
111a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    drv->mFreeChildren =
112a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        reinterpret_cast<void (*)()>(exec->getSymbolAddress(".rs.dtor"));
113a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao
114a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    info = &drv->mExecutable->getInfo();
115bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    // Copy info over to runtime
116a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    script->mHal.info.exportedFunctionCount = info->getExportFuncNames().size();
117a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    script->mHal.info.exportedVariableCount = info->getExportVarNames().size();
118a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    script->mHal.info.exportedPragmaCount = info->getPragmas().size();
119a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    script->mHal.info.exportedPragmaKeyList =
120a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        const_cast<const char**>(exec->getPragmaKeys().array());
121a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    script->mHal.info.exportedPragmaValueList =
122a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        const_cast<const char**>(exec->getPragmaValues().array());
123ee7aa2e3900f807ee41bb9735da86b3eb4cc2e70Stephen Hines
124ee7aa2e3900f807ee41bb9735da86b3eb4cc2e70Stephen Hines    if (drv->mRootExpand) {
125a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        script->mHal.info.root = drv->mRootExpand;
126ee7aa2e3900f807ee41bb9735da86b3eb4cc2e70Stephen Hines    } else {
127a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        script->mHal.info.root = drv->mRoot;
128ee7aa2e3900f807ee41bb9735da86b3eb4cc2e70Stephen Hines    }
129bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
130807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    if (script->mHal.info.exportedVariableCount) {
131807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        drv->mBoundAllocs = new Allocation *[script->mHal.info.exportedVariableCount];
132807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        memset(drv->mBoundAllocs, 0, sizeof(void *) * script->mHal.info.exportedVariableCount);
133807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    }
134807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
13583c451a4ef4388e002482e383d488ca9b7b7600dJason Sams    pthread_mutex_unlock(&rsdgInitMutex);
136bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    return true;
137bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
138bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samserror:
139bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
14083c451a4ef4388e002482e383d488ca9b7b7600dJason Sams    pthread_mutex_unlock(&rsdgInitMutex);
141a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    if (drv) {
142a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        delete drv->mCompilerContext;
143a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        delete drv->mCompilerDriver;
144a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        delete drv->mExecutable;
145807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        delete[] drv->mBoundAllocs;
146a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        free(drv);
147cbb0b8aceedb9146ba901cba1fbd6d1e9ca88f51Stephen Hines    }
148a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    script->mHal.drv = NULL;
149bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    return false;
150bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
151bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
152bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
15341d6c769f5fa21da3cbc116af95d88949a4a5c76Stephen Hinesbool rsdInitIntrinsic(const Context *rsc, Script *s, RsScriptIntrinsicID iid, Element *e) {
1548eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    pthread_mutex_lock(&rsdgInitMutex);
1558eaba4fee0c7b5325742c87187622fdff51d5effJason Sams
1568eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    DrvScript *drv = (DrvScript *)calloc(1, sizeof(DrvScript));
1578eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    if (drv == NULL) {
1588eaba4fee0c7b5325742c87187622fdff51d5effJason Sams        goto error;
1598eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    }
1608eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    s->mHal.drv = drv;
1618eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    drv->mIntrinsicID = iid;
162e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams    drv->mIntrinsicData = rsdIntrinsic_Init(rsc, s, iid, &drv->mIntrinsicFuncs);
163ba808d71236c5c9deca01f0e2938cae983564940Jason Sams    s->mHal.info.isThreadable = true;
1648eaba4fee0c7b5325742c87187622fdff51d5effJason Sams
1658eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    pthread_mutex_unlock(&rsdgInitMutex);
1668eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    return true;
1678eaba4fee0c7b5325742c87187622fdff51d5effJason Sams
1688eaba4fee0c7b5325742c87187622fdff51d5effJason Samserror:
1698eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    pthread_mutex_unlock(&rsdgInitMutex);
1708eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    return false;
1718eaba4fee0c7b5325742c87187622fdff51d5effJason Sams}
1728eaba4fee0c7b5325742c87187622fdff51d5effJason Sams
1733815badf95a7dca8aa278e3e12f07a3924a82319Stephen Hinestypedef void (*rs_t)(const void *, void *, const void *, uint32_t, uint32_t, uint32_t, uint32_t);
174cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
175cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Samsstatic void wc_xy(void *usr, uint32_t idx) {
176cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    MTLaunchStruct *mtls = (MTLaunchStruct *)usr;
177451cf2e16555c96eaaf9d8180e29dd97a5d6cbd7Jason Sams    RsForEachStubParamStruct p;
1788eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    memcpy(&p, &mtls->fep, sizeof(p));
1793815badf95a7dca8aa278e3e12f07a3924a82319Stephen Hines    RsdHal * dc = (RsdHal *)mtls->rsc->mHal.drv;
1803815badf95a7dca8aa278e3e12f07a3924a82319Stephen Hines    uint32_t sig = mtls->sig;
181cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
1827c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams#if defined(ARCH_ARM_RS_USE_CACHED_SCANLINE_WRITE)
1837c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams    unsigned char buf[1024 * 8];
1847c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams#endif
1857c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams
1864419977d78018a9933c7f455fe001f644f2d638bStephen Hines    outer_foreach_t fn = (outer_foreach_t) mtls->kernel;
187cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    while (1) {
188cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        uint32_t slice = (uint32_t)android_atomic_inc(&mtls->mSliceNum);
189cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        uint32_t yStart = mtls->yStart + slice * mtls->mSliceSize;
190cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        uint32_t yEnd = yStart + mtls->mSliceSize;
191cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        yEnd = rsMin(yEnd, mtls->yEnd);
192cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        if (yEnd <= yStart) {
193cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams            return;
194cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        }
195cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
196af12ac6a08651464f8d823add667c706f993b587Steve Block        //ALOGE("usr idx %i, x %i,%i  y %i,%i", idx, mtls->xStart, mtls->xEnd, yStart, yEnd);
197f598811a60088236222bb1879503842094ca378bStephen Hines        //ALOGE("usr ptr in %p,  out %p", mtls->fep.ptrIn, mtls->fep.ptrOut);
1987c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams
1997c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams#if defined(ARCH_ARM_RS_USE_CACHED_SCANLINE_WRITE)
2007c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams        if (mtls->fep.yStrideOut < sizeof(buf)) {
2017c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams            p.out = buf;
2027c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams            for (p.y = yStart; p.y < yEnd; p.y++) {
2037c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams                p.in = mtls->fep.ptrIn + (mtls->fep.yStrideIn * p.y);
2047c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams                fn(&p, mtls->xStart, mtls->xEnd, mtls->fep.eStrideIn, mtls->fep.eStrideOut);
2057c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams                memcpy(mtls->fep.ptrOut + (mtls->fep.yStrideOut * p.y), buf, mtls->fep.yStrideOut);
2067c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams            }
2077c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams        } else
2087c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams#endif
2097c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams            {
2107c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams            for (p.y = yStart; p.y < yEnd; p.y++) {
211f598811a60088236222bb1879503842094ca378bStephen Hines                p.out = mtls->fep.ptrOut + (mtls->fep.yStrideOut * p.y) +
212f598811a60088236222bb1879503842094ca378bStephen Hines                        (mtls->fep.eStrideOut * mtls->xStart);
213f598811a60088236222bb1879503842094ca378bStephen Hines                p.in = mtls->fep.ptrIn + (mtls->fep.yStrideIn * p.y) +
214f598811a60088236222bb1879503842094ca378bStephen Hines                       (mtls->fep.eStrideIn * mtls->xStart);
2157c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams                fn(&p, mtls->xStart, mtls->xEnd, mtls->fep.eStrideIn, mtls->fep.eStrideOut);
2167c355cc6e667220244cfd55249b64cd161c3dbd9Jason Sams            }
217cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        }
218cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    }
219cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams}
220cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
221cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Samsstatic void wc_x(void *usr, uint32_t idx) {
222cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    MTLaunchStruct *mtls = (MTLaunchStruct *)usr;
223451cf2e16555c96eaaf9d8180e29dd97a5d6cbd7Jason Sams    RsForEachStubParamStruct p;
2248eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    memcpy(&p, &mtls->fep, sizeof(p));
2253815badf95a7dca8aa278e3e12f07a3924a82319Stephen Hines    RsdHal * dc = (RsdHal *)mtls->rsc->mHal.drv;
2263815badf95a7dca8aa278e3e12f07a3924a82319Stephen Hines    uint32_t sig = mtls->sig;
227cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
2284419977d78018a9933c7f455fe001f644f2d638bStephen Hines    outer_foreach_t fn = (outer_foreach_t) mtls->kernel;
229cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    while (1) {
230cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        uint32_t slice = (uint32_t)android_atomic_inc(&mtls->mSliceNum);
231cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        uint32_t xStart = mtls->xStart + slice * mtls->mSliceSize;
232cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        uint32_t xEnd = xStart + mtls->mSliceSize;
233cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        xEnd = rsMin(xEnd, mtls->xEnd);
234cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        if (xEnd <= xStart) {
235cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams            return;
236cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        }
237cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
238af12ac6a08651464f8d823add667c706f993b587Steve Block        //ALOGE("usr slice %i idx %i, x %i,%i", slice, idx, xStart, xEnd);
239f598811a60088236222bb1879503842094ca378bStephen Hines        //ALOGE("usr ptr in %p,  out %p", mtls->fep.ptrIn, mtls->fep.ptrOut);
24096cd1361e25f0dab881aa416d206fc4574dc602eJason Sams
2418eaba4fee0c7b5325742c87187622fdff51d5effJason Sams        p.out = mtls->fep.ptrOut + (mtls->fep.eStrideOut * xStart);
2428eaba4fee0c7b5325742c87187622fdff51d5effJason Sams        p.in = mtls->fep.ptrIn + (mtls->fep.eStrideIn * xStart);
2438eaba4fee0c7b5325742c87187622fdff51d5effJason Sams        fn(&p, xStart, xEnd, mtls->fep.eStrideIn, mtls->fep.eStrideOut);
244cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    }
245cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams}
246cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
247dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsvoid rsdScriptInvokeForEachMtlsSetup(const Context *rsc,
248dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                                     const Allocation * ain,
249dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                                     Allocation * aout,
250dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                                     const void * usr,
251dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                                     uint32_t usrLen,
252dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                                     const RsScriptCall *sc,
253dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                                     MTLaunchStruct *mtls) {
2540ab9f9f6b1fb31cda536ae4aeaed258f78ee1447Jason Sams
255dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    memset(mtls, 0, sizeof(MTLaunchStruct));
256a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao
257cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    if (ain) {
258dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->fep.dimX = ain->getType()->getDimX();
259dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->fep.dimY = ain->getType()->getDimY();
260dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->fep.dimZ = ain->getType()->getDimZ();
261dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        //mtls->dimArray = ain->getType()->getDimArray();
262cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    } else if (aout) {
263dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->fep.dimX = aout->getType()->getDimX();
264dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->fep.dimY = aout->getType()->getDimY();
265dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->fep.dimZ = aout->getType()->getDimZ();
266dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        //mtls->dimArray = aout->getType()->getDimArray();
267cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    } else {
268cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        rsc->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations");
269cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        return;
270cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    }
271bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
272cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    if (!sc || (sc->xEnd == 0)) {
273dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->xEnd = mtls->fep.dimX;
274cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    } else {
275dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        rsAssert(sc->xStart < mtls->fep.dimX);
276dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        rsAssert(sc->xEnd <= mtls->fep.dimX);
277cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        rsAssert(sc->xStart < sc->xEnd);
278dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->xStart = rsMin(mtls->fep.dimX, sc->xStart);
279dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->xEnd = rsMin(mtls->fep.dimX, sc->xEnd);
280dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        if (mtls->xStart >= mtls->xEnd) return;
281cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    }
282cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
283cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    if (!sc || (sc->yEnd == 0)) {
284dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->yEnd = mtls->fep.dimY;
285cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    } else {
286dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        rsAssert(sc->yStart < mtls->fep.dimY);
287dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        rsAssert(sc->yEnd <= mtls->fep.dimY);
288cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        rsAssert(sc->yStart < sc->yEnd);
289dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->yStart = rsMin(mtls->fep.dimY, sc->yStart);
290dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->yEnd = rsMin(mtls->fep.dimY, sc->yEnd);
291dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        if (mtls->yStart >= mtls->yEnd) return;
292cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    }
293cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
294dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->xEnd = rsMax((uint32_t)1, mtls->xEnd);
295dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->yEnd = rsMax((uint32_t)1, mtls->yEnd);
296dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->zEnd = rsMax((uint32_t)1, mtls->zEnd);
297dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->arrayEnd = rsMax((uint32_t)1, mtls->arrayEnd);
298cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
299eed1b156ca3e439f3d178ce99a4fa736527b15f9Stephen Hines    rsAssert(!ain || (ain->getType()->getDimZ() == 0));
300cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
301cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    Context *mrsc = (Context *)rsc;
302dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->rsc = mrsc;
303dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->ain = ain;
304dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->aout = aout;
305dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->fep.usr = usr;
306dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->fep.usrLen = usrLen;
307dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->mSliceSize = 10;
308dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->mSliceNum = 0;
309dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
310dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->fep.ptrIn = NULL;
311dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->fep.eStrideIn = 0;
312cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams
313cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    if (ain) {
314807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        DrvAllocation *aindrv = (DrvAllocation *)ain->mHal.drv;
315dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->fep.ptrIn = (const uint8_t *)aindrv->lod[0].mallocPtr;
316dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->fep.eStrideIn = ain->getType()->getElementSizeBytes();
317dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->fep.yStrideIn = aindrv->lod[0].stride;
318cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    }
319cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
320dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->fep.ptrOut = NULL;
321dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls->fep.eStrideOut = 0;
322cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    if (aout) {
323807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        DrvAllocation *aoutdrv = (DrvAllocation *)aout->mHal.drv;
324dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->fep.ptrOut = (uint8_t *)aoutdrv->lod[0].mallocPtr;
325dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->fep.eStrideOut = aout->getType()->getElementSizeBytes();
326dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls->fep.yStrideOut = aoutdrv->lod[0].stride;
327cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    }
328dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
329dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
330dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsvoid rsdScriptLaunchThreads(const Context *rsc,
331dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            Script *s,
332dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            uint32_t slot,
333dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            const Allocation * ain,
334dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            Allocation * aout,
335dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            const void * usr,
336dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            uint32_t usrLen,
337dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            const RsScriptCall *sc,
338dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            MTLaunchStruct *mtls) {
339cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
340dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    Script * oldTLS = setTLS(s);
341dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    Context *mrsc = (Context *)rsc;
342dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    RsdHal * dc = (RsdHal *)mtls->rsc->mHal.drv;
3438eaba4fee0c7b5325742c87187622fdff51d5effJason Sams
344aa152101cc4d04597d9aefc3e5a1454eaf39d2ccJason Sams    if ((dc->mWorkers.mCount > 1) && s->mHal.info.isThreadable && !dc->mInForEach) {
345aa152101cc4d04597d9aefc3e5a1454eaf39d2ccJason Sams        dc->mInForEach = true;
346dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        if (mtls->fep.dimY > 1) {
347dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams            mtls->mSliceSize = mtls->fep.dimY / (dc->mWorkers.mCount * 4);
348dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams            if(mtls->mSliceSize < 1) {
349dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                mtls->mSliceSize = 1;
3500ab9f9f6b1fb31cda536ae4aeaed258f78ee1447Jason Sams            }
3510ab9f9f6b1fb31cda536ae4aeaed258f78ee1447Jason Sams
352dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams            rsdLaunchThreads(mrsc, wc_xy, mtls);
353cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        } else {
354dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams            mtls->mSliceSize = mtls->fep.dimX / (dc->mWorkers.mCount * 4);
355dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams            if(mtls->mSliceSize < 1) {
356dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                mtls->mSliceSize = 1;
3570ab9f9f6b1fb31cda536ae4aeaed258f78ee1447Jason Sams            }
3580ab9f9f6b1fb31cda536ae4aeaed258f78ee1447Jason Sams
359dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams            rsdLaunchThreads(mrsc, wc_x, mtls);
360cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        }
361aa152101cc4d04597d9aefc3e5a1454eaf39d2ccJason Sams        dc->mInForEach = false;
362cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
363af12ac6a08651464f8d823add667c706f993b587Steve Block        //ALOGE("launch 1");
364cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    } else {
365451cf2e16555c96eaaf9d8180e29dd97a5d6cbd7Jason Sams        RsForEachStubParamStruct p;
366dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        memcpy(&p, &mtls->fep, sizeof(p));
367dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        uint32_t sig = mtls->sig;
368451cf2e16555c96eaaf9d8180e29dd97a5d6cbd7Jason Sams
369af12ac6a08651464f8d823add667c706f993b587Steve Block        //ALOGE("launch 3");
370dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        outer_foreach_t fn = (outer_foreach_t) mtls->kernel;
371dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        for (p.ar[0] = mtls->arrayStart; p.ar[0] < mtls->arrayEnd; p.ar[0]++) {
372dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams            for (p.z = mtls->zStart; p.z < mtls->zEnd; p.z++) {
373dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                for (p.y = mtls->yStart; p.y < mtls->yEnd; p.y++) {
374dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                    uint32_t offset = mtls->fep.dimY * mtls->fep.dimZ * p.ar[0] +
375dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                                      mtls->fep.dimY * p.z + p.y;
376f598811a60088236222bb1879503842094ca378bStephen Hines                    p.out = mtls->fep.ptrOut + (mtls->fep.yStrideOut * offset) +
377f598811a60088236222bb1879503842094ca378bStephen Hines                            (mtls->fep.eStrideOut * mtls->xStart);
378f598811a60088236222bb1879503842094ca378bStephen Hines                    p.in = mtls->fep.ptrIn + (mtls->fep.yStrideIn * offset) +
379f598811a60088236222bb1879503842094ca378bStephen Hines                           (mtls->fep.eStrideIn * mtls->xStart);
380dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                    fn(&p, mtls->xStart, mtls->xEnd, mtls->fep.eStrideIn, mtls->fep.eStrideOut);
381cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams                }
382cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams            }
383cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams        }
384cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    }
385cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
386cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    setTLS(oldTLS);
387cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams}
388cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
389dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samsvoid rsdScriptInvokeForEach(const Context *rsc,
390dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            Script *s,
391dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            uint32_t slot,
392dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            const Allocation * ain,
393dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            Allocation * aout,
394dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            const void * usr,
395dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            uint32_t usrLen,
396dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                            const RsScriptCall *sc) {
397dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
398dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    RsdHal * dc = (RsdHal *)rsc->mHal.drv;
399dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
400dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    MTLaunchStruct mtls;
401dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    rsdScriptInvokeForEachMtlsSetup(rsc, ain, aout, usr, usrLen, sc, &mtls);
402dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    mtls.script = s;
403cf9ea9f4145cae663f439b1c2dab956fa37180bbJason Sams    mtls.fep.slot = slot;
404dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
405dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    DrvScript *drv = (DrvScript *)s->mHal.drv;
406dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    if (drv->mIntrinsicID) {
407dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls.kernel = (void (*)())drv->mIntrinsicFuncs.root;
408dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls.fep.usr = drv->mIntrinsicData;
409dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    } else {
410dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        rsAssert(slot < drv->mExecutable->getExportForeachFuncAddrs().size());
411dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls.kernel = reinterpret_cast<ForEachFunc_t>(
412dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams                          drv->mExecutable->getExportForeachFuncAddrs()[slot]);
413dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        rsAssert(mtls.kernel != NULL);
414dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams        mtls.sig = drv->mExecutable->getInfo().getExportForeachFuncs()[slot].second;
415dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    }
416dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
417dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
418dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    rsdScriptLaunchThreads(rsc, s, slot, ain, aout, usr, usrLen, sc, &mtls);
419dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams}
420dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
421cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
422cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Samsint rsdScriptInvokeRoot(const Context *dc, Script *script) {
423bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    DrvScript *drv = (DrvScript *)script->mHal.drv;
424cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
425cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    Script * oldTLS = setTLS(script);
426cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    int ret = drv->mRoot();
427cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    setTLS(oldTLS);
428cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams
429cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    return ret;
430bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
431bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
432cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Samsvoid rsdScriptInvokeInit(const Context *dc, Script *script) {
433bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    DrvScript *drv = (DrvScript *)script->mHal.drv;
434bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
435bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (drv->mInit) {
436bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        drv->mInit();
437bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    }
438bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
439bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
4404ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hinesvoid rsdScriptInvokeFreeChildren(const Context *dc, Script *script) {
4414ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines    DrvScript *drv = (DrvScript *)script->mHal.drv;
4424ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines
4434ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines    if (drv->mFreeChildren) {
4444ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines        drv->mFreeChildren();
4454ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines    }
4464ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines}
447bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
448cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Samsvoid rsdScriptInvokeFunction(const Context *dc, Script *script,
449bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                            uint32_t slot,
450bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                            const void *params,
451bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                            size_t paramLength) {
452bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    DrvScript *drv = (DrvScript *)script->mHal.drv;
453af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("invoke %p %p %i %p %i", dc, script, slot, params, paramLength);
454bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
455cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    Script * oldTLS = setTLS(script);
456a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    reinterpret_cast<void (*)(const void *, uint32_t)>(
457a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        drv->mExecutable->getExportFuncAddrs()[slot])(params, paramLength);
458cdfdb8f2cdf4668c476cac842212892b2505ff3fJason Sams    setTLS(oldTLS);
459bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
460bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
461bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsvoid rsdScriptSetGlobalVar(const Context *dc, const Script *script,
462bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams                           uint32_t slot, void *data, size_t dataLength) {
463bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    DrvScript *drv = (DrvScript *)script->mHal.drv;
464bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    //rsAssert(!script->mFieldIsObject[slot]);
465af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("setGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength);
466bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
4678eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    if (drv->mIntrinsicID) {
468e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams        drv->mIntrinsicFuncs.setVar(dc, script, drv->mIntrinsicData, slot, data, dataLength);
4698eaba4fee0c7b5325742c87187622fdff51d5effJason Sams        return;
4708eaba4fee0c7b5325742c87187622fdff51d5effJason Sams    }
4718eaba4fee0c7b5325742c87187622fdff51d5effJason Sams
472a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    int32_t *destPtr = reinterpret_cast<int32_t *>(
473a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao                          drv->mExecutable->getExportVarAddrs()[slot]);
474bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (!destPtr) {
4756598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block        //ALOGV("Calling setVar on slot = %i which is null", slot);
476bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        return;
477bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    }
478bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
479bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    memcpy(destPtr, data, dataLength);
480bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
481bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
4822980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hinesvoid rsdScriptSetGlobalVarWithElemDims(
4832980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        const android::renderscript::Context *dc,
4842980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        const android::renderscript::Script *script,
4852980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        uint32_t slot, void *data, size_t dataLength,
4862980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        const android::renderscript::Element *elem,
4872980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        const size_t *dims, size_t dimLength) {
4882980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    DrvScript *drv = (DrvScript *)script->mHal.drv;
4892980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines
490a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    int32_t *destPtr = reinterpret_cast<int32_t *>(
491a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        drv->mExecutable->getExportVarAddrs()[slot]);
4922980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    if (!destPtr) {
4932980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        //ALOGV("Calling setVar on slot = %i which is null", slot);
4942980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        return;
4952980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    }
4962980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines
4972980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    // We want to look at dimension in terms of integer components,
4982980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    // but dimLength is given in terms of bytes.
4992980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    dimLength /= sizeof(int);
5002980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines
5012980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    // Only a single dimension is currently supported.
5022980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    rsAssert(dimLength == 1);
5032980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    if (dimLength == 1) {
5042980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        // First do the increment loop.
5052980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        size_t stride = elem->getSizeBytes();
5062980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        char *cVal = reinterpret_cast<char *>(data);
5072980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        for (size_t i = 0; i < dims[0]; i++) {
5082980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines            elem->incRefs(cVal);
5092980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines            cVal += stride;
5102980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        }
5112980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines
5122980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        // Decrement loop comes after (to prevent race conditions).
5132980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        char *oldVal = reinterpret_cast<char *>(destPtr);
5142980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        for (size_t i = 0; i < dims[0]; i++) {
5152980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines            elem->decRefs(oldVal);
5162980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines            oldVal += stride;
5172980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines        }
5182980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    }
5192980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines
5202980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    memcpy(destPtr, data, dataLength);
5212980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines}
5222980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines
523807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Samsvoid rsdScriptSetGlobalBind(const Context *dc, const Script *script, uint32_t slot, Allocation *data) {
524bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    DrvScript *drv = (DrvScript *)script->mHal.drv;
525807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
526bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    //rsAssert(!script->mFieldIsObject[slot]);
527af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("setGlobalBind %p %p %i %p", dc, script, slot, data);
528bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
52978b050ea1e13108110ce3b8ead63252e5ebe2468Jason Sams    rsAssert(!drv->mIntrinsicID);
53017f03fc9552551024fa9ec50e3b020c7e3100ceeJason Sams
531a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    int32_t *destPtr = reinterpret_cast<int32_t *>(
532a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao                          drv->mExecutable->getExportVarAddrs()[slot]);
533bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (!destPtr) {
5346598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block        //ALOGV("Calling setVar on slot = %i which is null", slot);
535bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        return;
536bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    }
537bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
538807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    void *ptr = NULL;
539807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    drv->mBoundAllocs[slot] = data;
540807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    if(data) {
541807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        DrvAllocation *allocDrv = (DrvAllocation *)data->mHal.drv;
542807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        ptr = allocDrv->lod[0].mallocPtr;
543807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    }
544807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    memcpy(destPtr, &ptr, sizeof(void *));
545bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
546bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
547bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsvoid rsdScriptSetGlobalObj(const Context *dc, const Script *script, uint32_t slot, ObjectBase *data) {
548bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    DrvScript *drv = (DrvScript *)script->mHal.drv;
549bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    //rsAssert(script->mFieldIsObject[slot]);
550af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("setGlobalObj %p %p %i %p", dc, script, slot, data);
551bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
55278b050ea1e13108110ce3b8ead63252e5ebe2468Jason Sams    if (drv->mIntrinsicID) {
55378b050ea1e13108110ce3b8ead63252e5ebe2468Jason Sams        drv->mIntrinsicFuncs.setVarObj(dc, script, drv->mIntrinsicData, slot,
55478b050ea1e13108110ce3b8ead63252e5ebe2468Jason Sams                                       static_cast<Allocation *>(data));
55578b050ea1e13108110ce3b8ead63252e5ebe2468Jason Sams        return;
55678b050ea1e13108110ce3b8ead63252e5ebe2468Jason Sams    }
55778b050ea1e13108110ce3b8ead63252e5ebe2468Jason Sams
558a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    int32_t *destPtr = reinterpret_cast<int32_t *>(
559a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao                          drv->mExecutable->getExportVarAddrs()[slot]);
560bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (!destPtr) {
5616598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block        //ALOGV("Calling setVar on slot = %i which is null", slot);
562bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        return;
563bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    }
564bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
56587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsrSetObject(dc, script, (ObjectBase **)destPtr, data);
566bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
567bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
568bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsvoid rsdScriptDestroy(const Context *dc, Script *script) {
569bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    DrvScript *drv = (DrvScript *)script->mHal.drv;
570bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
571a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    if (drv == NULL) {
572a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        return;
573a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    }
574a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao
575a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    if (drv->mExecutable) {
576a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        Vector<void *>::const_iterator var_addr_iter =
577a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao            drv->mExecutable->getExportVarAddrs().begin();
578a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        Vector<void *>::const_iterator var_addr_end =
579a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao            drv->mExecutable->getExportVarAddrs().end();
580a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao
581a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        bcc::RSInfo::ObjectSlotListTy::const_iterator is_object_iter =
582a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao            drv->mExecutable->getInfo().getObjectSlots().begin();
583a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        bcc::RSInfo::ObjectSlotListTy::const_iterator is_object_end =
584a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao            drv->mExecutable->getInfo().getObjectSlots().end();
585a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao
586a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao        while ((var_addr_iter != var_addr_end) &&
587a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao               (is_object_iter != is_object_end)) {
588a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao            // The field address can be NULL if the script-side has optimized
589a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao            // the corresponding global variable away.
590a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao            ObjectBase **obj_addr =
591a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao                reinterpret_cast<ObjectBase **>(*var_addr_iter);
592a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao            if (*is_object_iter) {
593a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao                if (*var_addr_iter != NULL) {
594a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao                    rsrClearObject(dc, script, obj_addr);
5958d43eafdd2684b7bcb2554e65676dc914b7eabd7Stephen Hines                }
596bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            }
597a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao            var_addr_iter++;
598a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao            is_object_iter++;
599bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        }
600070cb235d9f094048c0260aa72d5acf61ed840a3Stephen Hines    }
601070cb235d9f094048c0260aa72d5acf61ed840a3Stephen Hines
602a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    delete drv->mCompilerContext;
603a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    delete drv->mCompilerDriver;
604a3af2cd3cc684aee2a090475f797936f3bd1b8cbShih-wei Liao    delete drv->mExecutable;
605807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    delete[] drv->mBoundAllocs;
606bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    free(drv);
607bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    script->mHal.drv = NULL;
608bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams}
609807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
610807fdc4b6f3fb893015ee136565d6151bb2332d3Jason SamsAllocation * rsdScriptGetAllocationForPointer(const android::renderscript::Context *dc,
611807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                                              const android::renderscript::Script *sc,
612807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                                              const void *ptr) {
613807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    DrvScript *drv = (DrvScript *)sc->mHal.drv;
614807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    if (!ptr) {
615807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        return NULL;
616807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    }
617807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
618807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    for (uint32_t ct=0; ct < sc->mHal.info.exportedVariableCount; ct++) {
619807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        Allocation *a = drv->mBoundAllocs[ct];
620807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        if (!a) continue;
621807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        DrvAllocation *adrv = (DrvAllocation *)a->mHal.drv;
622807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        if (adrv->lod[0].mallocPtr == ptr) {
623807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams            return a;
624807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        }
625807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    }
626807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    ALOGE("rsGetAllocation, failed to find %p", ptr);
627807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    return NULL;
628807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams}
629807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
630