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