rsCpuScript.cpp revision d4ecb17adc9b099351f2ca1779a74f5283f20a3d
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,
94709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                  (const char *)bitcode, bitcodeSize, NULL);
95709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
96709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (exec == NULL) {
97709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        ALOGE("bcc: FAILS to prepare executable for '%s'", resName);
98709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mCtx->unlockMutex();
99709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return false;
100709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
101709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
102709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mExecutable = exec;
103709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
104709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    exec->setThreadable(mIsThreadable);
105709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!exec->syncInfo()) {
106709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        ALOGW("bcc: FAILS to synchronize the RS info file to the disk");
107709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
108709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
109709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mRoot = reinterpret_cast<int (*)()>(exec->getSymbolAddress("root"));
110709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mRootExpand =
111709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        reinterpret_cast<int (*)()>(exec->getSymbolAddress("root.expand"));
112709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mInit = reinterpret_cast<void (*)()>(exec->getSymbolAddress("init"));
113709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mFreeChildren =
114709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        reinterpret_cast<void (*)()>(exec->getSymbolAddress(".rs.dtor"));
115709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
116709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
117709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    info = &mExecutable->getInfo();
118709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (info->getExportVarNames().size()) {
119709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mBoundAllocs = new Allocation *[info->getExportVarNames().size()];
120709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        memset(mBoundAllocs, 0, sizeof(void *) * info->getExportVarNames().size());
121709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
122709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
123709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->unlockMutex();
124709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return true;
125709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
126709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
127709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::populateScript(Script *script) {
128709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const bcc::RSInfo *info = &mExecutable->getInfo();
129709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
130709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    // Copy info over to runtime
131709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script->mHal.info.exportedFunctionCount = info->getExportFuncNames().size();
132709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script->mHal.info.exportedVariableCount = info->getExportVarNames().size();
133709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script->mHal.info.exportedPragmaCount = info->getPragmas().size();
134709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script->mHal.info.exportedPragmaKeyList =
135709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        const_cast<const char**>(mExecutable->getPragmaKeys().array());
136709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    script->mHal.info.exportedPragmaValueList =
137709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        const_cast<const char**>(mExecutable->getPragmaValues().array());
138709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
139709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mRootExpand) {
140709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        script->mHal.info.root = mRootExpand;
141709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    } else {
142709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        script->mHal.info.root = mRoot;
143709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
144709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
145709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
146709a0978ae141198018ca9769f8d96292a8928e6Jason Sams/*
147709a0978ae141198018ca9769f8d96292a8928e6Jason Samsbool rsdInitIntrinsic(const Context *rsc, Script *s, RsScriptIntrinsicID iid, Element *e) {
148709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    pthread_mutex_lock(&rsdgInitMutex);
149709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
150709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    DrvScript *drv = (DrvScript *)calloc(1, sizeof(DrvScript));
151709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (drv == NULL) {
152709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        goto error;
153709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
154709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    s->mHal.drv = drv;
155709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    drv->mIntrinsicID = iid;
156709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    drv->mIntrinsicData = rsdIntrinsic_Init(rsc, s, iid, &drv->mIntrinsicFuncs);
157709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    s->mHal.info.isThreadable = true;
158709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
159709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    pthread_mutex_unlock(&rsdgInitMutex);
160709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return true;
161709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
162709a0978ae141198018ca9769f8d96292a8928e6Jason Samserror:
163709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    pthread_mutex_unlock(&rsdgInitMutex);
164709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return false;
165709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
166709a0978ae141198018ca9769f8d96292a8928e6Jason Sams*/
167709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
168709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (*rs_t)(const void *, void *, const void *, uint32_t, uint32_t, uint32_t, uint32_t);
169709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
170709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::forEachMtlsSetup(const Allocation * ain, Allocation * aout,
171709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                        const void * usr, uint32_t usrLen,
172709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                        const RsScriptCall *sc,
173709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                        MTLaunchStruct *mtls) {
174709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
175709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    memset(mtls, 0, sizeof(MTLaunchStruct));
176709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
177709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (ain) {
178709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.dimX = ain->getType()->getDimX();
179709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.dimY = ain->getType()->getDimY();
180709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.dimZ = ain->getType()->getDimZ();
181709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //mtls->dimArray = ain->getType()->getDimArray();
182709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    } else if (aout) {
183709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.dimX = aout->getType()->getDimX();
184709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.dimY = aout->getType()->getDimY();
185709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.dimZ = aout->getType()->getDimZ();
186709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //mtls->dimArray = aout->getType()->getDimArray();
187709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    } else {
188709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations");
189709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return;
190709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
191709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
192709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!sc || (sc->xEnd == 0)) {
193709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->xEnd = mtls->fep.dimX;
194709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    } else {
195709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        rsAssert(sc->xStart < mtls->fep.dimX);
196709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        rsAssert(sc->xEnd <= mtls->fep.dimX);
197709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        rsAssert(sc->xStart < sc->xEnd);
198709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->xStart = rsMin(mtls->fep.dimX, sc->xStart);
199709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->xEnd = rsMin(mtls->fep.dimX, sc->xEnd);
200709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        if (mtls->xStart >= mtls->xEnd) return;
201709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
202709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
203709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!sc || (sc->yEnd == 0)) {
204709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->yEnd = mtls->fep.dimY;
205709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    } else {
206709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        rsAssert(sc->yStart < mtls->fep.dimY);
207709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        rsAssert(sc->yEnd <= mtls->fep.dimY);
208709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        rsAssert(sc->yStart < sc->yEnd);
209709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->yStart = rsMin(mtls->fep.dimY, sc->yStart);
210709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->yEnd = rsMin(mtls->fep.dimY, sc->yEnd);
211709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        if (mtls->yStart >= mtls->yEnd) return;
212709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
213709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
214d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray    if (!sc || (sc->zEnd == 0)) {
215d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        mtls->zEnd = mtls->fep.dimZ;
216d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray    } else {
217d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        rsAssert(sc->zStart < mtls->fep.dimZ);
218d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        rsAssert(sc->zEnd <= mtls->fep.dimZ);
219d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        rsAssert(sc->zStart < sc->zEnd);
220d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        mtls->zStart = rsMin(mtls->fep.dimZ, sc->zStart);
221d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        mtls->zEnd = rsMin(mtls->fep.dimZ, sc->zEnd);
222d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray        if (mtls->zStart >= mtls->zEnd) return;
223d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray    }
224d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray
225709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->xEnd = rsMax((uint32_t)1, mtls->xEnd);
226709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->yEnd = rsMax((uint32_t)1, mtls->yEnd);
227709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->zEnd = rsMax((uint32_t)1, mtls->zEnd);
228709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->arrayEnd = rsMax((uint32_t)1, mtls->arrayEnd);
229709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
230709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    rsAssert(!ain || (ain->getType()->getDimZ() == 0));
231709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
232709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->rsc = mCtx;
233709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->ain = ain;
234709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->aout = aout;
235709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.usr = usr;
236709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.usrLen = usrLen;
237709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->mSliceSize = 1;
238709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->mSliceNum = 0;
239709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
240709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.ptrIn = NULL;
241709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.eStrideIn = 0;
242709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->isThreadable = mIsThreadable;
243709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
244709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (ain) {
245709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.ptrIn = (const uint8_t *)ain->mHal.drvState.lod[0].mallocPtr;
246709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.eStrideIn = ain->getType()->getElementSizeBytes();
247709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.yStrideIn = ain->mHal.drvState.lod[0].stride;
248709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
249709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
250709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.ptrOut = NULL;
251709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.eStrideOut = 0;
252709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (aout) {
253709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.ptrOut = (uint8_t *)aout->mHal.drvState.lod[0].mallocPtr;
254709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.eStrideOut = aout->getType()->getElementSizeBytes();
255709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mtls->fep.yStrideOut = aout->mHal.drvState.lod[0].stride;
256709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
257709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
258709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
259709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
260709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeForEach(uint32_t slot,
261709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     const Allocation * ain,
262709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     Allocation * aout,
263709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     const void * usr,
264709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     uint32_t usrLen,
265709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                     const RsScriptCall *sc) {
266709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
267709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    MTLaunchStruct mtls;
268709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    forEachMtlsSetup(ain, aout, usr, usrLen, sc, &mtls);
269709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    forEachKernelSetup(slot, &mtls);
270709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
271709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this);
272709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->launchThreads(ain, aout, sc, &mtls);
273709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->setTLS(oldTLS);
274709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
275709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
276709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::forEachKernelSetup(uint32_t slot, MTLaunchStruct *mtls) {
277709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
278709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->script = this;
279709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->fep.slot = slot;
280709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
281709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    rsAssert(slot < mExecutable->getExportForeachFuncAddrs().size());
282709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->kernel = reinterpret_cast<ForEachFunc_t>(
283709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                      mExecutable->getExportForeachFuncAddrs()[slot]);
284709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    rsAssert(mtls->kernel != NULL);
285709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mtls->sig = mExecutable->getInfo().getExportForeachFuncs()[slot].second;
286709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
287709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
288709a0978ae141198018ca9769f8d96292a8928e6Jason Samsint RsdCpuScriptImpl::invokeRoot() {
289709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this);
290709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    int ret = mRoot();
291709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->setTLS(oldTLS);
292709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return ret;
293709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
294709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
295709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeInit() {
296709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mInit) {
297709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mInit();
298709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
299709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
300709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
301709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeFreeChildren() {
302709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mFreeChildren) {
303709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mFreeChildren();
304709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
305709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
306709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
307709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeFunction(uint32_t slot, const void *params,
308709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                      size_t paramLength) {
309709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //ALOGE("invoke %p %p %i %p %i", dc, script, slot, params, paramLength);
310709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
311709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this);
312709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    reinterpret_cast<void (*)(const void *, uint32_t)>(
313709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mExecutable->getExportFuncAddrs()[slot])(params, paramLength);
314709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mCtx->setTLS(oldTLS);
315709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
316709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
317709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalVar(uint32_t slot, const void *data, size_t dataLength) {
318709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //rsAssert(!script->mFieldIsObject[slot]);
319709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //ALOGE("setGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength);
320709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
321709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //if (mIntrinsicID) {
322709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //mIntrinsicFuncs.setVar(dc, script, drv->mIntrinsicData, slot, data, dataLength);
323709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //return;
324709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //}
325709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
326709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    int32_t *destPtr = reinterpret_cast<int32_t *>(
327709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                          mExecutable->getExportVarAddrs()[slot]);
328709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!destPtr) {
329709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //ALOGV("Calling setVar on slot = %i which is null", slot);
330709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return;
331709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
332709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
333709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    memcpy(destPtr, data, dataLength);
334709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
335709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
336709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength,
337709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                                const Element *elem,
338709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                                const size_t *dims, size_t dimLength) {
339709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
340709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    int32_t *destPtr = reinterpret_cast<int32_t *>(
341709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mExecutable->getExportVarAddrs()[slot]);
342709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!destPtr) {
343709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //ALOGV("Calling setVar on slot = %i which is null", slot);
344709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return;
345709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
346709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
347709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    // We want to look at dimension in terms of integer components,
348709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    // but dimLength is given in terms of bytes.
349709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    dimLength /= sizeof(int);
350709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
351709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    // Only a single dimension is currently supported.
352709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    rsAssert(dimLength == 1);
353709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (dimLength == 1) {
354709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        // First do the increment loop.
355709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        size_t stride = elem->getSizeBytes();
356709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        const char *cVal = reinterpret_cast<const char *>(data);
357709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        for (size_t i = 0; i < dims[0]; i++) {
358709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            elem->incRefs(cVal);
359709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            cVal += stride;
360709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        }
361709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
362709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        // Decrement loop comes after (to prevent race conditions).
363709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        char *oldVal = reinterpret_cast<char *>(destPtr);
364709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        for (size_t i = 0; i < dims[0]; i++) {
365709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            elem->decRefs(oldVal);
366709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            oldVal += stride;
367709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        }
368709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
369709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
370709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    memcpy(destPtr, data, dataLength);
371709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
372709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
373709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalBind(uint32_t slot, Allocation *data) {
374709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
375709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //rsAssert(!script->mFieldIsObject[slot]);
376709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //ALOGE("setGlobalBind %p %p %i %p", dc, script, slot, data);
377709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
378709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    int32_t *destPtr = reinterpret_cast<int32_t *>(
379709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                          mExecutable->getExportVarAddrs()[slot]);
380709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!destPtr) {
381709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //ALOGV("Calling setVar on slot = %i which is null", slot);
382709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return;
383709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
384709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
385709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    void *ptr = NULL;
386709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mBoundAllocs[slot] = data;
387709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if(data) {
388709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        ptr = data->mHal.drvState.lod[0].mallocPtr;
389709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
390709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    memcpy(destPtr, &ptr, sizeof(void *));
391709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
392709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
393709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalObj(uint32_t slot, ObjectBase *data) {
394709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
395709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //rsAssert(script->mFieldIsObject[slot]);
396709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //ALOGE("setGlobalObj %p %p %i %p", dc, script, slot, data);
397709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
398709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //if (mIntrinsicID) {
399709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //mIntrinsicFuncs.setVarObj(dc, script, drv->mIntrinsicData, slot, alloc);
400709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //return;
401709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    //}
402709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
403709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    int32_t *destPtr = reinterpret_cast<int32_t *>(
404709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                          mExecutable->getExportVarAddrs()[slot]);
405709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!destPtr) {
406709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        //ALOGV("Calling setVar on slot = %i which is null", slot);
407709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return;
408709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
409709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
410709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    rsrSetObject(mCtx->getContext(), (ObjectBase **)destPtr, data);
411709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
412709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
413709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptImpl::~RsdCpuScriptImpl() {
414709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
415709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mExecutable) {
416709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        Vector<void *>::const_iterator var_addr_iter =
417709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            mExecutable->getExportVarAddrs().begin();
418709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        Vector<void *>::const_iterator var_addr_end =
419709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            mExecutable->getExportVarAddrs().end();
420709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
421709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        bcc::RSInfo::ObjectSlotListTy::const_iterator is_object_iter =
422709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            mExecutable->getInfo().getObjectSlots().begin();
423709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        bcc::RSInfo::ObjectSlotListTy::const_iterator is_object_end =
424709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            mExecutable->getInfo().getObjectSlots().end();
425709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
426709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        while ((var_addr_iter != var_addr_end) &&
427709a0978ae141198018ca9769f8d96292a8928e6Jason Sams               (is_object_iter != is_object_end)) {
428709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            // The field address can be NULL if the script-side has optimized
429709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            // the corresponding global variable away.
430709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            ObjectBase **obj_addr =
431709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                reinterpret_cast<ObjectBase **>(*var_addr_iter);
432709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            if (*is_object_iter) {
433709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                if (*var_addr_iter != NULL) {
434709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                    rsrClearObject(mCtx->getContext(), obj_addr);
435709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                }
436709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            }
437709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            var_addr_iter++;
438709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            is_object_iter++;
439709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        }
440709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
441709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
442709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mCompilerContext) {
443709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        delete mCompilerContext;
444709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
445709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mCompilerDriver) {
446709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        delete mCompilerDriver;
447709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
448709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mExecutable) {
449709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        delete mExecutable;
450709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
451709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (mBoundAllocs) {
452709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        delete[] mBoundAllocs;
453709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
454709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
455709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
456709a0978ae141198018ca9769f8d96292a8928e6Jason SamsAllocation * RsdCpuScriptImpl::getAllocationForPointer(const void *ptr) const {
457709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    if (!ptr) {
458709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        return NULL;
459709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
460709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
461709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    for (uint32_t ct=0; ct < mScript->mHal.info.exportedVariableCount; ct++) {
462709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        Allocation *a = mBoundAllocs[ct];
463709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        if (!a) continue;
464709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        if (a->mHal.drvState.lod[0].mallocPtr == ptr) {
465709a0978ae141198018ca9769f8d96292a8928e6Jason Sams            return a;
466709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        }
467709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
468709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    ALOGE("rsGetAllocation, failed to find %p", ptr);
469709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    return NULL;
470709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
471709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
472709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
473709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
474709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
475