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