rsCpuScript.cpp revision 3a25fdd3786c1a08b783d8a83ef94b756347ff5c
1709a0978ae141198018ca9769f8d96292a8928e6Jason Sams/*
2709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Copyright (C) 2011-2012 The Android Open Source Project
3709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *
4709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * you may not use this file except in compliance with the License.
6709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * You may obtain a copy of the License at
7709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *
8709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *
10709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Unless required by applicable law or agreed to in writing, software
11709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * See the License for the specific language governing permissions and
14709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * limitations under the License.
15709a0978ae141198018ca9769f8d96292a8928e6Jason Sams */
16709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
17709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
18709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
19709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuCore.h"
20709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
21709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuScript.h"
22709a0978ae141198018ca9769f8d96292a8928e6Jason Sams//#include "rsdRuntime.h"
23709a0978ae141198018ca9769f8d96292a8928e6Jason Sams//#include "rsdAllocation.h"
24709a0978ae141198018ca9769f8d96292a8928e6Jason Sams//#include "rsCpuIntrinsics.h"
25709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
26709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
27709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "utils/Vector.h"
28709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "utils/Timers.h"
29709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "utils/StopWatch.h"
30709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
32709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include <bcc/BCCContext.h>
33709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include <bcc/Renderscript/RSCompilerDriver.h>
34709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include <bcc/Renderscript/RSExecutable.h>
35709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include <bcc/Renderscript/RSInfo.h>
36709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
37709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android {
38709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript {
39709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
40709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
41709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
42709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptImpl::RsdCpuScriptImpl(RsdCpuReferenceImpl *ctx, const Script *s) {
43709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx = ctx;
44709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mScript = s;
45709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
46709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mRoot = NULL;
47709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mRootExpand = NULL;
48709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mInit = NULL;
49709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mFreeChildren = NULL;
50709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
51709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCompilerContext = NULL;
52709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCompilerDriver = NULL;
53709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mExecutable = NULL;
54709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
55709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mBoundAllocs = NULL;
56709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mIntrinsicData = NULL;
57709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mIsThreadable = true;
58709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
59709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
60709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
61709a0978ae141198018ca9769f8d96292a8928e6Jason Samsbool RsdCpuScriptImpl::init(char const *resName, char const *cacheDir,
62709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                            uint8_t const *bitcode, size_t bitcodeSize,
63709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                            uint32_t flags) {
64709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //ALOGE("rsdScriptCreate %p %p %p %p %i %i %p", rsc, resName, cacheDir, bitcode, bitcodeSize, flags, lookupFunc);
65709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //ALOGE("rsdScriptInit %p %p", rsc, script);
66709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
67709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->lockMutex();
68709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
69709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    bcc::RSExecutable *exec;
70709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const bcc::RSInfo *info;
71709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
72709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCompilerContext = NULL;
73709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCompilerDriver = NULL;
74709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mExecutable = NULL;
75709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
76709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCompilerContext = new bcc::BCCContext();
77709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mCompilerContext == NULL) {
78709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        ALOGE("bcc: FAILS to create compiler context (out of memory)");
79709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mCtx->unlockMutex();
80709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return false;
81709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
82709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
83709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCompilerDriver = new bcc::RSCompilerDriver();
84709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mCompilerDriver == NULL) {
85709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        ALOGE("bcc: FAILS to create compiler driver (out of memory)");
86709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mCtx->unlockMutex();
87709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return false;
88709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
89709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
90709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCompilerDriver->setRSRuntimeLookupFunction(lookupRuntimeStub);
91709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCompilerDriver->setRSRuntimeLookupContext(this);
92709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
93709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    exec = mCompilerDriver->build(*mCompilerContext, cacheDir, resName,
94f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines                                  (const char *)bitcode, bitcodeSize, NULL,
95f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines                                  mCtx->getLinkRuntimeCallback());
96709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
97709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (exec == NULL) {
98709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        ALOGE("bcc: FAILS to prepare executable for '%s'", resName);
99709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mCtx->unlockMutex();
100709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return false;
101709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
102709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
103709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mExecutable = exec;
104709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
105709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    exec->setThreadable(mIsThreadable);
106709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!exec->syncInfo()) {
107709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        ALOGW("bcc: FAILS to synchronize the RS info file to the disk");
108709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
109709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
110709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mRoot = reinterpret_cast<int (*)()>(exec->getSymbolAddress("root"));
111709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mRootExpand =
112709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        reinterpret_cast<int (*)()>(exec->getSymbolAddress("root.expand"));
113709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mInit = reinterpret_cast<void (*)()>(exec->getSymbolAddress("init"));
114709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mFreeChildren =
115709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        reinterpret_cast<void (*)()>(exec->getSymbolAddress(".rs.dtor"));
116709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
117709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
118709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    info = &mExecutable->getInfo();
119709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (info->getExportVarNames().size()) {
120709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mBoundAllocs = new Allocation *[info->getExportVarNames().size()];
121709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        memset(mBoundAllocs, 0, sizeof(void *) * info->getExportVarNames().size());
122709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
123709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
124709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->unlockMutex();
125709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return true;
126709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
127709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
128709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::populateScript(Script *script) {
129709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const bcc::RSInfo *info = &mExecutable->getInfo();
130709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
131709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    // Copy info over to runtime
132709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script->mHal.info.exportedFunctionCount = info->getExportFuncNames().size();
133709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script->mHal.info.exportedVariableCount = info->getExportVarNames().size();
134709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script->mHal.info.exportedPragmaCount = info->getPragmas().size();
135709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script->mHal.info.exportedPragmaKeyList =
136709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        const_cast<const char**>(mExecutable->getPragmaKeys().array());
137709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script->mHal.info.exportedPragmaValueList =
138709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        const_cast<const char**>(mExecutable->getPragmaValues().array());
139709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
140709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mRootExpand) {
141709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        script->mHal.info.root = mRootExpand;
142709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    } else {
143709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        script->mHal.info.root = mRoot;
144709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
145709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
146709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
147709a0978ae141198018ca9769f8d96292a8928e6Jason Sams/*
148709a0978ae141198018ca9769f8d96292a8928e6Jason Samsbool rsdInitIntrinsic(const Context *rsc, Script *s, RsScriptIntrinsicID iid, Element *e) {
149709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    pthread_mutex_lock(&rsdgInitMutex);
150709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
151709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    DrvScript *drv = (DrvScript *)calloc(1, sizeof(DrvScript));
152709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (drv == NULL) {
153709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        goto error;
154709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
155709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    s->mHal.drv = drv;
156709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    drv->mIntrinsicID = iid;
157709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    drv->mIntrinsicData = rsdIntrinsic_Init(rsc, s, iid, &drv->mIntrinsicFuncs);
158709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    s->mHal.info.isThreadable = true;
159709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
160709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    pthread_mutex_unlock(&rsdgInitMutex);
161709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return true;
162709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
163709a0978ae141198018ca9769f8d96292a8928e6Jason Samserror:
164709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    pthread_mutex_unlock(&rsdgInitMutex);
165709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return false;
166709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
167709a0978ae141198018ca9769f8d96292a8928e6Jason Sams*/
168709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
169709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (*rs_t)(const void *, void *, const void *, uint32_t, uint32_t, uint32_t, uint32_t);
170709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
171709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::forEachMtlsSetup(const Allocation * ain, Allocation * aout,
172709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                        const void * usr, uint32_t usrLen,
173709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                        const RsScriptCall *sc,
174709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                        MTLaunchStruct *mtls) {
175709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
176709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    memset(mtls, 0, sizeof(MTLaunchStruct));
177709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
1783a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray    // possible for this to occur if IO_OUTPUT/IO_INPUT with no bound surface
1793a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray    if (ain && (const uint8_t *)ain->mHal.drvState.lod[0].mallocPtr == NULL) {
1803a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray        mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations");
1813a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray        return;
1823a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray    }
1833a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray    if (aout && (const uint8_t *)aout->mHal.drvState.lod[0].mallocPtr == NULL) {
1843a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray        mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations");
1853a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray        return;
1863a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray    }
1873a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray
188709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (ain) {
189709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.dimX = ain->getType()->getDimX();
190709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.dimY = ain->getType()->getDimY();
191709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.dimZ = ain->getType()->getDimZ();
192709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //mtls->dimArray = ain->getType()->getDimArray();
193709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    } else if (aout) {
194709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.dimX = aout->getType()->getDimX();
195709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.dimY = aout->getType()->getDimY();
196709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.dimZ = aout->getType()->getDimZ();
197709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //mtls->dimArray = aout->getType()->getDimArray();
198709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    } else {
199709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations");
200709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return;
201709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
202709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
203709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!sc || (sc->xEnd == 0)) {
204709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->xEnd = mtls->fep.dimX;
205709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    } else {
206709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        rsAssert(sc->xStart < mtls->fep.dimX);
207709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        rsAssert(sc->xEnd <= mtls->fep.dimX);
208709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        rsAssert(sc->xStart < sc->xEnd);
209709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->xStart = rsMin(mtls->fep.dimX, sc->xStart);
210709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->xEnd = rsMin(mtls->fep.dimX, sc->xEnd);
211709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        if (mtls->xStart >= mtls->xEnd) return;
212709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
213709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
214709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!sc || (sc->yEnd == 0)) {
215709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->yEnd = mtls->fep.dimY;
216709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    } else {
217709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        rsAssert(sc->yStart < mtls->fep.dimY);
218709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        rsAssert(sc->yEnd <= mtls->fep.dimY);
219709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        rsAssert(sc->yStart < sc->yEnd);
220709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->yStart = rsMin(mtls->fep.dimY, sc->yStart);
221709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->yEnd = rsMin(mtls->fep.dimY, sc->yEnd);
222709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        if (mtls->yStart >= mtls->yEnd) return;
223709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
224709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
225d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray    if (!sc || (sc->zEnd == 0)) {
226d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        mtls->zEnd = mtls->fep.dimZ;
227d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray    } else {
228d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        rsAssert(sc->zStart < mtls->fep.dimZ);
229d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        rsAssert(sc->zEnd <= mtls->fep.dimZ);
230d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        rsAssert(sc->zStart < sc->zEnd);
231d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        mtls->zStart = rsMin(mtls->fep.dimZ, sc->zStart);
232d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        mtls->zEnd = rsMin(mtls->fep.dimZ, sc->zEnd);
233d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        if (mtls->zStart >= mtls->zEnd) return;
234d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray    }
235d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray
236709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->xEnd = rsMax((uint32_t)1, mtls->xEnd);
237709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->yEnd = rsMax((uint32_t)1, mtls->yEnd);
238709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->zEnd = rsMax((uint32_t)1, mtls->zEnd);
239709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->arrayEnd = rsMax((uint32_t)1, mtls->arrayEnd);
240709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
241709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    rsAssert(!ain || (ain->getType()->getDimZ() == 0));
242709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
243709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->rsc = mCtx;
244709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->ain = ain;
245709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->aout = aout;
246709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.usr = usr;
247709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.usrLen = usrLen;
248709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->mSliceSize = 1;
249709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->mSliceNum = 0;
250709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
251709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.ptrIn = NULL;
252709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.eStrideIn = 0;
253709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->isThreadable = mIsThreadable;
254709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
255709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (ain) {
256709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.ptrIn = (const uint8_t *)ain->mHal.drvState.lod[0].mallocPtr;
257709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.eStrideIn = ain->getType()->getElementSizeBytes();
258709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.yStrideIn = ain->mHal.drvState.lod[0].stride;
259709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
260709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
261709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.ptrOut = NULL;
262709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.eStrideOut = 0;
263709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (aout) {
264709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.ptrOut = (uint8_t *)aout->mHal.drvState.lod[0].mallocPtr;
265709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.eStrideOut = aout->getType()->getElementSizeBytes();
266709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.yStrideOut = aout->mHal.drvState.lod[0].stride;
267709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
268709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
269709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
270709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
271709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeForEach(uint32_t slot,
272709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     const Allocation * ain,
273709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     Allocation * aout,
274709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     const void * usr,
275709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     uint32_t usrLen,
276709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     const RsScriptCall *sc) {
277709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
278709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    MTLaunchStruct mtls;
279709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    forEachMtlsSetup(ain, aout, usr, usrLen, sc, &mtls);
280709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    forEachKernelSetup(slot, &mtls);
281709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
282709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this);
283709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->launchThreads(ain, aout, sc, &mtls);
284709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->setTLS(oldTLS);
285709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
286709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
287709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::forEachKernelSetup(uint32_t slot, MTLaunchStruct *mtls) {
288709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
289709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->script = this;
290709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.slot = slot;
291709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
292709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    rsAssert(slot < mExecutable->getExportForeachFuncAddrs().size());
293709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->kernel = reinterpret_cast<ForEachFunc_t>(
294709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                      mExecutable->getExportForeachFuncAddrs()[slot]);
295709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    rsAssert(mtls->kernel != NULL);
296709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->sig = mExecutable->getInfo().getExportForeachFuncs()[slot].second;
297709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
298709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
299709a0978ae141198018ca9769f8d96292a8928e6Jason Samsint RsdCpuScriptImpl::invokeRoot() {
300709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this);
301709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    int ret = mRoot();
302709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->setTLS(oldTLS);
303709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return ret;
304709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
305709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
306709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeInit() {
307709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mInit) {
308709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mInit();
309709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
310709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
311709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
312709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeFreeChildren() {
313709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mFreeChildren) {
314709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mFreeChildren();
315709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
316709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
317709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
318709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeFunction(uint32_t slot, const void *params,
319709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                      size_t paramLength) {
320709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //ALOGE("invoke %p %p %i %p %i", dc, script, slot, params, paramLength);
321709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
322709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this);
323709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    reinterpret_cast<void (*)(const void *, uint32_t)>(
324709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mExecutable->getExportFuncAddrs()[slot])(params, paramLength);
325709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->setTLS(oldTLS);
326709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
327709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
328709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalVar(uint32_t slot, const void *data, size_t dataLength) {
329709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //rsAssert(!script->mFieldIsObject[slot]);
330709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //ALOGE("setGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength);
331709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
332709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //if (mIntrinsicID) {
333709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //mIntrinsicFuncs.setVar(dc, script, drv->mIntrinsicData, slot, data, dataLength);
334709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //return;
335709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //}
336709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
337709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    int32_t *destPtr = reinterpret_cast<int32_t *>(
338709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                          mExecutable->getExportVarAddrs()[slot]);
339709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!destPtr) {
340709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //ALOGV("Calling setVar on slot = %i which is null", slot);
341709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return;
342709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
343709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
344709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    memcpy(destPtr, data, dataLength);
345709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
346709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
347709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength,
348709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                                const Element *elem,
349709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                                const size_t *dims, size_t dimLength) {
350709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
351709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    int32_t *destPtr = reinterpret_cast<int32_t *>(
352709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mExecutable->getExportVarAddrs()[slot]);
353709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!destPtr) {
354709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //ALOGV("Calling setVar on slot = %i which is null", slot);
355709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return;
356709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
357709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
358709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    // We want to look at dimension in terms of integer components,
359709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    // but dimLength is given in terms of bytes.
360709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    dimLength /= sizeof(int);
361709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
362709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    // Only a single dimension is currently supported.
363709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    rsAssert(dimLength == 1);
364709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (dimLength == 1) {
365709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        // First do the increment loop.
366709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        size_t stride = elem->getSizeBytes();
367709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        const char *cVal = reinterpret_cast<const char *>(data);
368709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        for (size_t i = 0; i < dims[0]; i++) {
369709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            elem->incRefs(cVal);
370709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            cVal += stride;
371709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        }
372709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
373709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        // Decrement loop comes after (to prevent race conditions).
374709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        char *oldVal = reinterpret_cast<char *>(destPtr);
375709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        for (size_t i = 0; i < dims[0]; i++) {
376709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            elem->decRefs(oldVal);
377709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            oldVal += stride;
378709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        }
379709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
380709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
381709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    memcpy(destPtr, data, dataLength);
382709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
383709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
384709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalBind(uint32_t slot, Allocation *data) {
385709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
386709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //rsAssert(!script->mFieldIsObject[slot]);
387709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //ALOGE("setGlobalBind %p %p %i %p", dc, script, slot, data);
388709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
389709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    int32_t *destPtr = reinterpret_cast<int32_t *>(
390709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                          mExecutable->getExportVarAddrs()[slot]);
391709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!destPtr) {
392709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //ALOGV("Calling setVar on slot = %i which is null", slot);
393709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return;
394709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
395709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
396709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    void *ptr = NULL;
397709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mBoundAllocs[slot] = data;
398709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if(data) {
399709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        ptr = data->mHal.drvState.lod[0].mallocPtr;
400709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
401709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    memcpy(destPtr, &ptr, sizeof(void *));
402709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
403709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
404709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalObj(uint32_t slot, ObjectBase *data) {
405709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
406709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //rsAssert(script->mFieldIsObject[slot]);
407709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //ALOGE("setGlobalObj %p %p %i %p", dc, script, slot, data);
408709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
409709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //if (mIntrinsicID) {
410709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //mIntrinsicFuncs.setVarObj(dc, script, drv->mIntrinsicData, slot, alloc);
411709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //return;
412709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //}
413709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
414709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    int32_t *destPtr = reinterpret_cast<int32_t *>(
415709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                          mExecutable->getExportVarAddrs()[slot]);
416709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!destPtr) {
417709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //ALOGV("Calling setVar on slot = %i which is null", slot);
418709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return;
419709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
420709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
421709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    rsrSetObject(mCtx->getContext(), (ObjectBase **)destPtr, data);
422709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
423709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
424709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptImpl::~RsdCpuScriptImpl() {
425709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
426709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mExecutable) {
427709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        Vector<void *>::const_iterator var_addr_iter =
428709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            mExecutable->getExportVarAddrs().begin();
429709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        Vector<void *>::const_iterator var_addr_end =
430709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            mExecutable->getExportVarAddrs().end();
431709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
432709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        bcc::RSInfo::ObjectSlotListTy::const_iterator is_object_iter =
433709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            mExecutable->getInfo().getObjectSlots().begin();
434709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        bcc::RSInfo::ObjectSlotListTy::const_iterator is_object_end =
435709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            mExecutable->getInfo().getObjectSlots().end();
436709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
437709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        while ((var_addr_iter != var_addr_end) &&
438709a0978ae141198018ca9769f8d96292a8928e6Jason Sams               (is_object_iter != is_object_end)) {
439709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            // The field address can be NULL if the script-side has optimized
440709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            // the corresponding global variable away.
441709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            ObjectBase **obj_addr =
442709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                reinterpret_cast<ObjectBase **>(*var_addr_iter);
443709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            if (*is_object_iter) {
444709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                if (*var_addr_iter != NULL) {
445709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                    rsrClearObject(mCtx->getContext(), obj_addr);
446709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                }
447709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            }
448709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            var_addr_iter++;
449709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            is_object_iter++;
450709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        }
451709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
452709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
453709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mCompilerContext) {
454709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        delete mCompilerContext;
455709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
456709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mCompilerDriver) {
457709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        delete mCompilerDriver;
458709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
459709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mExecutable) {
460709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        delete mExecutable;
461709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
462709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mBoundAllocs) {
463709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        delete[] mBoundAllocs;
464709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
465709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
466709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
467709a0978ae141198018ca9769f8d96292a8928e6Jason SamsAllocation * RsdCpuScriptImpl::getAllocationForPointer(const void *ptr) const {
468709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!ptr) {
469709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return NULL;
470709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
471709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
472709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    for (uint32_t ct=0; ct < mScript->mHal.info.exportedVariableCount; ct++) {
473709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        Allocation *a = mBoundAllocs[ct];
474709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        if (!a) continue;
475709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        if (a->mHal.drvState.lod[0].mallocPtr == ptr) {
476709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            return a;
477709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        }
478709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
479709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    ALOGE("rsGetAllocation, failed to find %p", ptr);
480709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return NULL;
481709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
482709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
483709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
484709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
485709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
486