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 23110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifdef RS_COMPATIBILITY_LIB 24110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <dlfcn.h> 25110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <stdio.h> 26110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <string.h> 27110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 28110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <bcc/BCCContext.h> 29110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <bcc/Renderscript/RSCompilerDriver.h> 30110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <bcc/Renderscript/RSExecutable.h> 31110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <bcc/Renderscript/RSInfo.h> 32110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 33709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 34709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android { 35709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript { 36709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 37709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 38110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifdef RS_COMPATIBILITY_LIB 39110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define MAXLINE 500 40110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define MAKE_STR_HELPER(S) #S 41110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define MAKE_STR(S) MAKE_STR_HELPER(S) 42110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define EXPORT_VAR_STR "exportVarCount: " 43110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define EXPORT_VAR_STR_LEN strlen(EXPORT_VAR_STR) 44110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define EXPORT_FUNC_STR "exportFuncCount: " 45110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define EXPORT_FUNC_STR_LEN strlen(EXPORT_FUNC_STR) 46110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define EXPORT_FOREACH_STR "exportForEachCount: " 47110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define EXPORT_FOREACH_STR_LEN strlen(EXPORT_FOREACH_STR) 48110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define OBJECT_SLOT_STR "objectSlotCount: " 49110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define OBJECT_SLOT_STR_LEN strlen(OBJECT_SLOT_STR) 50110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 51110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams// Copy up to a newline or size chars from str -> s, updating str 52110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams// Returns s when successful and NULL when '\0' is finally reached. 53110f181b7966212a36ef18016f9b81c7322d0a2fJason Samsstatic char* strgets(char *s, int size, const char **ppstr) { 54110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (!ppstr || !*ppstr || **ppstr == '\0' || size < 1) { 55110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams return NULL; 56110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 57110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 58110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams int i; 59110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams for (i = 0; i < (size - 1); i++) { 60110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams s[i] = **ppstr; 61110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams (*ppstr)++; 62110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (s[i] == '\0') { 63110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams return s; 64110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } else if (s[i] == '\n') { 65110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams s[i+1] = '\0'; 66110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams return s; 67110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 68110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 69110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 70110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // size has been exceeded. 71110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams s[i] = '\0'; 72110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 73110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams return s; 74110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams} 75110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 76709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 77709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptImpl::RsdCpuScriptImpl(RsdCpuReferenceImpl *ctx, const Script *s) { 78709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx = ctx; 79709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mScript = s; 80709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 81110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifdef RS_COMPATIBILITY_LIB 82110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mScriptSO = NULL; 83110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mInvokeFunctions = NULL; 84110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mForEachFunctions = NULL; 85110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFieldAddress = NULL; 86110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFieldIsObject = NULL; 87110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mForEachSignatures = NULL; 88110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 89110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mCompilerContext = NULL; 90110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mCompilerDriver = NULL; 91110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mExecutable = NULL; 92110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 93110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 94709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mRoot = NULL; 95709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mRootExpand = NULL; 96709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mInit = NULL; 97709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mFreeChildren = NULL; 98709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 99709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 100709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mBoundAllocs = NULL; 101709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mIntrinsicData = NULL; 102709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mIsThreadable = true; 103709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 104709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 105709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 106709a0978ae141198018ca9769f8d96292a8928e6Jason Samsbool RsdCpuScriptImpl::init(char const *resName, char const *cacheDir, 107709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint8_t const *bitcode, size_t bitcodeSize, 108709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t flags) { 109709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("rsdScriptCreate %p %p %p %p %i %i %p", rsc, resName, cacheDir, bitcode, bitcodeSize, flags, lookupFunc); 110709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("rsdScriptInit %p %p", rsc, script); 111709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 112709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->lockMutex(); 113709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 114110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 115709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bcc::RSExecutable *exec; 116709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 117709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerContext = NULL; 118709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerDriver = NULL; 119709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable = NULL; 120709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 121709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerContext = new bcc::BCCContext(); 122709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mCompilerContext == NULL) { 123709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ALOGE("bcc: FAILS to create compiler context (out of memory)"); 124709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->unlockMutex(); 125709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return false; 126709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 127709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 128709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerDriver = new bcc::RSCompilerDriver(); 129709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mCompilerDriver == NULL) { 130709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ALOGE("bcc: FAILS to create compiler driver (out of memory)"); 131709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->unlockMutex(); 132709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return false; 133709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 134709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 135709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerDriver->setRSRuntimeLookupFunction(lookupRuntimeStub); 136709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerDriver->setRSRuntimeLookupContext(this); 137709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 1381d476620399d54774e4fd386c1d23cc583d49522Stephen Hines const char *core_lib = NULL; 1391d476620399d54774e4fd386c1d23cc583d49522Stephen Hines RSSelectRTCallback selectRTCallback = mCtx->getSelectRTCallback(); 1401d476620399d54774e4fd386c1d23cc583d49522Stephen Hines if (selectRTCallback != NULL) { 1411d476620399d54774e4fd386c1d23cc583d49522Stephen Hines core_lib = selectRTCallback((const char *)bitcode, bitcodeSize); 1421d476620399d54774e4fd386c1d23cc583d49522Stephen Hines } 143cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines 144cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines if (mCtx->getContext()->getContextType() == RS_CONTEXT_TYPE_DEBUG) { 145cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines // Use the libclcore_debug.bc instead of the default library. 146cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines core_lib = bcc::RSInfo::LibCLCoreDebugPath; 147f47e8b4b86bf194e65398032f3f5f47a6da89f3fStephen Hines mCompilerDriver->setDebugContext(true); 148cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines } 149709a0978ae141198018ca9769f8d96292a8928e6Jason Sams exec = mCompilerDriver->build(*mCompilerContext, cacheDir, resName, 1501d476620399d54774e4fd386c1d23cc583d49522Stephen Hines (const char *)bitcode, bitcodeSize, core_lib, 151f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines mCtx->getLinkRuntimeCallback()); 152709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 153709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (exec == NULL) { 154709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ALOGE("bcc: FAILS to prepare executable for '%s'", resName); 155709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->unlockMutex(); 156709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return false; 157709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 158709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 159709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable = exec; 160709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 161709a0978ae141198018ca9769f8d96292a8928e6Jason Sams exec->setThreadable(mIsThreadable); 162709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!exec->syncInfo()) { 163709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ALOGW("bcc: FAILS to synchronize the RS info file to the disk"); 164709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 165709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 166709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mRoot = reinterpret_cast<int (*)()>(exec->getSymbolAddress("root")); 167709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mRootExpand = 168709a0978ae141198018ca9769f8d96292a8928e6Jason Sams reinterpret_cast<int (*)()>(exec->getSymbolAddress("root.expand")); 169709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mInit = reinterpret_cast<void (*)()>(exec->getSymbolAddress("init")); 170709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mFreeChildren = 171709a0978ae141198018ca9769f8d96292a8928e6Jason Sams reinterpret_cast<void (*)()>(exec->getSymbolAddress(".rs.dtor")); 172709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 173709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 1741d476620399d54774e4fd386c1d23cc583d49522Stephen Hines const bcc::RSInfo *info = &mExecutable->getInfo(); 175709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (info->getExportVarNames().size()) { 176709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mBoundAllocs = new Allocation *[info->getExportVarNames().size()]; 177709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memset(mBoundAllocs, 0, sizeof(void *) * info->getExportVarNames().size()); 178709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 179709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 180110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 181110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 1820b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER 183110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams String8 scriptSOName(cacheDir); 184110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSOName = scriptSOName.getPathDir(); 185b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hines scriptSOName.append("/lib/librs."); 1860b575de8ed0b628d84d256f5846500b0385979bdTim Murray#else 1870b575de8ed0b628d84d256f5846500b0385979bdTim Murray String8 scriptSOName("lib"); 1880b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif 189110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSOName.append(resName); 190110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSOName.append(".so"); 191110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 192110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //script->mHal.drv = drv; 193110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 194110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGV("Opening up shared object: %s", scriptSOName.string()); 195110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mScriptSO = dlopen(scriptSOName.string(), RTLD_NOW | RTLD_LOCAL); 196110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO == NULL) { 197110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Unable to open shared library (%s): %s", 198110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSOName.string(), dlerror()); 199110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 200110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // One final attempt to find the library in "/system/lib". 201110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // We do this to allow bundled applications to use the compatibility 202110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // library fallback path. Those applications don't have a private 203110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // library path, so they need to install to the system directly. 204110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams String8 scriptSONameSystem("/system/lib/librs."); 205110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSONameSystem.append(resName); 206110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSONameSystem.append(".so"); 207110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mScriptSO = dlopen(scriptSONameSystem.string(), RTLD_NOW | RTLD_LOCAL); 208110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO == NULL) { 209110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Unable to open system shared library (%s): %s", 210110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSONameSystem.string(), dlerror()); 211110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 212110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 213110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 214110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 215110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO) { 216110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams char line[MAXLINE]; 217110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mRoot = (RootFunc_t) dlsym(mScriptSO, "root"); 218110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mRoot) { 219110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found root(): %p", mRoot); 220110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 221110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mRootExpand = (RootFunc_t) dlsym(mScriptSO, "root.expand"); 222110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mRootExpand) { 223110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found root.expand(): %p", mRootExpand); 224110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 225110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mInit = (InvokeFunc_t) dlsym(mScriptSO, "init"); 226110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mInit) { 227110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found init(): %p", mInit); 228110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 229110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFreeChildren = (InvokeFunc_t) dlsym(mScriptSO, ".rs.dtor"); 230110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFreeChildren) { 231110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found .rs.dtor(): %p", mFreeChildren); 232110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 233110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 234110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams const char *rsInfo = (const char *) dlsym(mScriptSO, ".rs.info"); 235110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (rsInfo) { 236110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found .rs.info(): %p - %s", rsInfo, rsInfo); 237110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 238110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 239110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams size_t varCount = 0; 240110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 241110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 242110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 243110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (sscanf(line, EXPORT_VAR_STR "%zu", &varCount) != 1) { 244110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Invalid export var count!: %s", line); 245110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 246110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 247110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 248110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mExportedVariableCount = varCount; 249110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("varCount: %zu", varCount); 250110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (varCount > 0) { 251110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Start by creating/zeroing this member, since we don't want to 252110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // accidentally clean up invalid pointers later (if we error out). 253110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFieldIsObject = new bool[varCount]; 254110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldIsObject == NULL) { 255110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 256110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 257110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams memset(mFieldIsObject, 0, varCount * sizeof(*mFieldIsObject)); 258110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFieldAddress = new void*[varCount]; 259110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldAddress == NULL) { 260110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 261110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 262110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams for (size_t i = 0; i < varCount; ++i) { 263110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 264110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 265110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 266110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams char *c = strrchr(line, '\n'); 267110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (c) { 268110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams *c = '\0'; 269110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 270110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFieldAddress[i] = dlsym(mScriptSO, line); 271110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldAddress[i] == NULL) { 272110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Failed to find variable address for %s: %s", 273110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams line, dlerror()); 274110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Not a critical error if we don't find a global variable. 275110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 276110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams else { 277110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found variable %s at %p", line, 278110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //mFieldAddress[i]); 279110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 280110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 281110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 282110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 283110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams size_t funcCount = 0; 284110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 285110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 286110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 287110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (sscanf(line, EXPORT_FUNC_STR "%zu", &funcCount) != 1) { 288110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Invalid export func count!: %s", line); 289110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 290110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 291110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 292110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mExportedFunctionCount = funcCount; 293110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("funcCount: %zu", funcCount); 294110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 295110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (funcCount > 0) { 296110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mInvokeFunctions = new InvokeFunc_t[funcCount]; 297110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mInvokeFunctions == NULL) { 298110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 299110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 300110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams for (size_t i = 0; i < funcCount; ++i) { 301110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 302110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 303110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 304110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams char *c = strrchr(line, '\n'); 305110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (c) { 306110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams *c = '\0'; 307110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 308110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 309110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mInvokeFunctions[i] = (InvokeFunc_t) dlsym(mScriptSO, line); 310110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mInvokeFunctions[i] == NULL) { 311110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Failed to get function address for %s(): %s", 312110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams line, dlerror()); 313110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 314110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 315110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams else { 316110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found InvokeFunc_t %s at %p", line, mInvokeFunctions[i]); 317110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 318110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 319110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 320110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 321110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams size_t forEachCount = 0; 322110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 323110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 324110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 325110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (sscanf(line, EXPORT_FOREACH_STR "%zu", &forEachCount) != 1) { 326110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Invalid export forEach count!: %s", line); 327110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 328110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 329110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 330110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (forEachCount > 0) { 331110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 332110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mForEachSignatures = new uint32_t[forEachCount]; 333110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mForEachSignatures == NULL) { 334110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 335110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 336110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mForEachFunctions = new ForEachFunc_t[forEachCount]; 337110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mForEachFunctions == NULL) { 338110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 339110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 340110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams for (size_t i = 0; i < forEachCount; ++i) { 341110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams unsigned int tmpSig = 0; 342110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams char tmpName[MAXLINE]; 343110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 344110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 345110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 346110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 347110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (sscanf(line, "%u - %" MAKE_STR(MAXLINE) "s", 348110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams &tmpSig, tmpName) != 2) { 349110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Invalid export forEach!: %s", line); 350110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 351110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 352110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 353110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Lookup the expanded ForEach kernel. 354110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams strncat(tmpName, ".expand", MAXLINE-1-strlen(tmpName)); 355110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mForEachSignatures[i] = tmpSig; 356110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mForEachFunctions[i] = 357110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams (ForEachFunc_t) dlsym(mScriptSO, tmpName); 358ef7481e2f0a4ad7b32bb626245e4207cabe171dcStephen Hines if (i != 0 && mForEachFunctions[i] == NULL) { 359110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Ignore missing root.expand functions. 360110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // root() is always specified at location 0. 361ef7481e2f0a4ad7b32bb626245e4207cabe171dcStephen Hines ALOGE("Failed to find forEach function address for %s: %s", 362ef7481e2f0a4ad7b32bb626245e4207cabe171dcStephen Hines tmpName, dlerror()); 363ef7481e2f0a4ad7b32bb626245e4207cabe171dcStephen Hines goto error; 364110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 365110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams else { 366110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found forEach %s at %p", tmpName, mForEachFunctions[i]); 367110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 368110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 369110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 370110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 371110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams size_t objectSlotCount = 0; 372110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 373110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 374110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 375110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (sscanf(line, OBJECT_SLOT_STR "%zu", &objectSlotCount) != 1) { 376110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Invalid object slot count!: %s", line); 377110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 378110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 379110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 380110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (objectSlotCount > 0) { 381110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams rsAssert(varCount > 0); 382110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams for (size_t i = 0; i < objectSlotCount; ++i) { 383110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams uint32_t varNum = 0; 384110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 385110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 386110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 387110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (sscanf(line, "%u", &varNum) != 1) { 388110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Invalid object slot!: %s", line); 389110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 390110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 391110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 392110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (varNum < varCount) { 393110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFieldIsObject[varNum] = true; 394110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 395110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 396110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 397110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 398110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (varCount > 0) { 399110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mBoundAllocs = new Allocation *[varCount]; 400110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams memset(mBoundAllocs, 0, varCount * sizeof(*mBoundAllocs)); 401110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 402110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 403110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO == (void*)1) { 404110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //rsdLookupRuntimeStub(script, "acos"); 405110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 406110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 407110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 408110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 409709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->unlockMutex(); 410709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return true; 411110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 412110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifdef RS_COMPATIBILITY_LIB 413110f181b7966212a36ef18016f9b81c7322d0a2fJason Samserror: 414110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 415110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mCtx->unlockMutex(); 416110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams delete[] mInvokeFunctions; 417110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams delete[] mForEachFunctions; 418110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams delete[] mFieldAddress; 419110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams delete[] mFieldIsObject; 420110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams delete[] mForEachSignatures; 421110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams delete[] mBoundAllocs; 422110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO) { 423110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams dlclose(mScriptSO); 424110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 425110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams return false; 426110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 427709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 428709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 429709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::populateScript(Script *script) { 430110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 431709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const bcc::RSInfo *info = &mExecutable->getInfo(); 432709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 433709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // Copy info over to runtime 434709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.exportedFunctionCount = info->getExportFuncNames().size(); 435709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.exportedVariableCount = info->getExportVarNames().size(); 436709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.exportedPragmaCount = info->getPragmas().size(); 437709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.exportedPragmaKeyList = 438709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const_cast<const char**>(mExecutable->getPragmaKeys().array()); 439709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.exportedPragmaValueList = 440709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const_cast<const char**>(mExecutable->getPragmaValues().array()); 441709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 442709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mRootExpand) { 443709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.root = mRootExpand; 444709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } else { 445709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.root = mRoot; 446709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 447110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 448110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Copy info over to runtime 449110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.exportedFunctionCount = mExportedFunctionCount; 450110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.exportedVariableCount = mExportedVariableCount; 451110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.exportedPragmaCount = 0; 452110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.exportedPragmaKeyList = 0; 453110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.exportedPragmaValueList = 0; 454110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 455110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Bug, need to stash in metadata 456110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mRootExpand) { 457110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.root = mRootExpand; 458110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } else { 459110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.root = mRoot; 460110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 461110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 462709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 463709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 464709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 465709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (*rs_t)(const void *, void *, const void *, uint32_t, uint32_t, uint32_t, uint32_t); 466709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 467709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::forEachMtlsSetup(const Allocation * ain, Allocation * aout, 468709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const void * usr, uint32_t usrLen, 469709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const RsScriptCall *sc, 470709a0978ae141198018ca9769f8d96292a8928e6Jason Sams MTLaunchStruct *mtls) { 471709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 472709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memset(mtls, 0, sizeof(MTLaunchStruct)); 473709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 4743a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray // possible for this to occur if IO_OUTPUT/IO_INPUT with no bound surface 4753a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray if (ain && (const uint8_t *)ain->mHal.drvState.lod[0].mallocPtr == NULL) { 4763a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations"); 4773a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray return; 4783a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray } 4793a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray if (aout && (const uint8_t *)aout->mHal.drvState.lod[0].mallocPtr == NULL) { 4803a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations"); 4813a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray return; 4823a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray } 4833a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray 484709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (ain) { 485709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.dimX = ain->getType()->getDimX(); 486709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.dimY = ain->getType()->getDimY(); 487709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.dimZ = ain->getType()->getDimZ(); 488709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //mtls->dimArray = ain->getType()->getDimArray(); 489709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } else if (aout) { 490709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.dimX = aout->getType()->getDimX(); 491709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.dimY = aout->getType()->getDimY(); 492709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.dimZ = aout->getType()->getDimZ(); 493709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //mtls->dimArray = aout->getType()->getDimArray(); 494709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } else { 495709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations"); 496709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 497709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 498709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 499709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!sc || (sc->xEnd == 0)) { 500709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->xEnd = mtls->fep.dimX; 501709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } else { 502709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(sc->xStart < mtls->fep.dimX); 503709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(sc->xEnd <= mtls->fep.dimX); 504709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(sc->xStart < sc->xEnd); 505709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->xStart = rsMin(mtls->fep.dimX, sc->xStart); 506709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->xEnd = rsMin(mtls->fep.dimX, sc->xEnd); 507709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mtls->xStart >= mtls->xEnd) return; 508709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 509709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 510709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!sc || (sc->yEnd == 0)) { 511709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->yEnd = mtls->fep.dimY; 512709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } else { 513709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(sc->yStart < mtls->fep.dimY); 514709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(sc->yEnd <= mtls->fep.dimY); 515709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(sc->yStart < sc->yEnd); 516709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->yStart = rsMin(mtls->fep.dimY, sc->yStart); 517709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->yEnd = rsMin(mtls->fep.dimY, sc->yEnd); 518709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mtls->yStart >= mtls->yEnd) return; 519709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 520709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 521d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray if (!sc || (sc->zEnd == 0)) { 522d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray mtls->zEnd = mtls->fep.dimZ; 523d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray } else { 524d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray rsAssert(sc->zStart < mtls->fep.dimZ); 525d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray rsAssert(sc->zEnd <= mtls->fep.dimZ); 526d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray rsAssert(sc->zStart < sc->zEnd); 527d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray mtls->zStart = rsMin(mtls->fep.dimZ, sc->zStart); 528d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray mtls->zEnd = rsMin(mtls->fep.dimZ, sc->zEnd); 529d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray if (mtls->zStart >= mtls->zEnd) return; 530d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray } 531d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray 532709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->xEnd = rsMax((uint32_t)1, mtls->xEnd); 533709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->yEnd = rsMax((uint32_t)1, mtls->yEnd); 534709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->zEnd = rsMax((uint32_t)1, mtls->zEnd); 535709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->arrayEnd = rsMax((uint32_t)1, mtls->arrayEnd); 536709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 537709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(!ain || (ain->getType()->getDimZ() == 0)); 538709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 539709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->rsc = mCtx; 540709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->ain = ain; 541709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->aout = aout; 542709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.usr = usr; 543709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.usrLen = usrLen; 544709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->mSliceSize = 1; 545709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->mSliceNum = 0; 546709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 547709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.ptrIn = NULL; 548709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.eStrideIn = 0; 549709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->isThreadable = mIsThreadable; 550709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 551709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (ain) { 552709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.ptrIn = (const uint8_t *)ain->mHal.drvState.lod[0].mallocPtr; 553709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.eStrideIn = ain->getType()->getElementSizeBytes(); 554709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.yStrideIn = ain->mHal.drvState.lod[0].stride; 555709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 556709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 557709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.ptrOut = NULL; 558709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.eStrideOut = 0; 559709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (aout) { 560709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.ptrOut = (uint8_t *)aout->mHal.drvState.lod[0].mallocPtr; 561709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.eStrideOut = aout->getType()->getElementSizeBytes(); 562709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.yStrideOut = aout->mHal.drvState.lod[0].stride; 563709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 564709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 565709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 566709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 567709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeForEach(uint32_t slot, 568709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const Allocation * ain, 569709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Allocation * aout, 570709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const void * usr, 571709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t usrLen, 572709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const RsScriptCall *sc) { 573709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 574709a0978ae141198018ca9769f8d96292a8928e6Jason Sams MTLaunchStruct mtls; 575709a0978ae141198018ca9769f8d96292a8928e6Jason Sams forEachMtlsSetup(ain, aout, usr, usrLen, sc, &mtls); 576709a0978ae141198018ca9769f8d96292a8928e6Jason Sams forEachKernelSetup(slot, &mtls); 577709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 578709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this); 579709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->launchThreads(ain, aout, sc, &mtls); 580709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->setTLS(oldTLS); 581709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 582709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 583709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::forEachKernelSetup(uint32_t slot, MTLaunchStruct *mtls) { 584709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->script = this; 585709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.slot = slot; 586110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 587709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(slot < mExecutable->getExportForeachFuncAddrs().size()); 588709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->kernel = reinterpret_cast<ForEachFunc_t>( 589709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportForeachFuncAddrs()[slot]); 590709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(mtls->kernel != NULL); 591709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->sig = mExecutable->getInfo().getExportForeachFuncs()[slot].second; 592110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 593110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mtls->kernel = reinterpret_cast<ForEachFunc_t>(mForEachFunctions[slot]); 594110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams rsAssert(mtls->kernel != NULL); 595110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mtls->sig = mForEachSignatures[slot]; 596110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 597709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 598709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 599709a0978ae141198018ca9769f8d96292a8928e6Jason Samsint RsdCpuScriptImpl::invokeRoot() { 600709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this); 601709a0978ae141198018ca9769f8d96292a8928e6Jason Sams int ret = mRoot(); 602709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->setTLS(oldTLS); 603709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return ret; 604709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 605709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 606709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeInit() { 607709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mInit) { 608709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mInit(); 609709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 610709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 611709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 612709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeFreeChildren() { 613709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mFreeChildren) { 614709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mFreeChildren(); 615709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 616709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 617709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 618709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeFunction(uint32_t slot, const void *params, 619709a0978ae141198018ca9769f8d96292a8928e6Jason Sams size_t paramLength) { 620709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("invoke %p %p %i %p %i", dc, script, slot, params, paramLength); 621709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 622709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this); 623709a0978ae141198018ca9769f8d96292a8928e6Jason Sams reinterpret_cast<void (*)(const void *, uint32_t)>( 624110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 625709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportFuncAddrs()[slot])(params, paramLength); 626110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 627110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mInvokeFunctions[slot])(params, paramLength); 628110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 629709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->setTLS(oldTLS); 630709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 631709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 632709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalVar(uint32_t slot, const void *data, size_t dataLength) { 633709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //rsAssert(!script->mFieldIsObject[slot]); 634709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("setGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength); 635709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 636709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //if (mIntrinsicID) { 637709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //mIntrinsicFuncs.setVar(dc, script, drv->mIntrinsicData, slot, data, dataLength); 638709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //return; 639709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //} 640709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 641110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 642709a0978ae141198018ca9769f8d96292a8928e6Jason Sams int32_t *destPtr = reinterpret_cast<int32_t *>( 643709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportVarAddrs()[slot]); 644110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 645110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams int32_t *destPtr = reinterpret_cast<int32_t *>(mFieldAddress[slot]); 646110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 647709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!destPtr) { 648709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGV("Calling setVar on slot = %i which is null", slot); 649709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 650709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 651709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 652709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memcpy(destPtr, data, dataLength); 653709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 654709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 6559c64239ebbfa4170190ede812e69150035e008e0Tim Murrayvoid RsdCpuScriptImpl::getGlobalVar(uint32_t slot, void *data, size_t dataLength) { 6569c64239ebbfa4170190ede812e69150035e008e0Tim Murray //rsAssert(!script->mFieldIsObject[slot]); 6579c64239ebbfa4170190ede812e69150035e008e0Tim Murray //ALOGE("getGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength); 6589c64239ebbfa4170190ede812e69150035e008e0Tim Murray 6599c64239ebbfa4170190ede812e69150035e008e0Tim Murray#ifndef RS_COMPATIBILITY_LIB 6609c64239ebbfa4170190ede812e69150035e008e0Tim Murray int32_t *srcPtr = reinterpret_cast<int32_t *>( 6619c64239ebbfa4170190ede812e69150035e008e0Tim Murray mExecutable->getExportVarAddrs()[slot]); 6629c64239ebbfa4170190ede812e69150035e008e0Tim Murray#else 6639c64239ebbfa4170190ede812e69150035e008e0Tim Murray int32_t *srcPtr = reinterpret_cast<int32_t *>(mFieldAddress[slot]); 6649c64239ebbfa4170190ede812e69150035e008e0Tim Murray#endif 6659c64239ebbfa4170190ede812e69150035e008e0Tim Murray if (!srcPtr) { 6669c64239ebbfa4170190ede812e69150035e008e0Tim Murray //ALOGV("Calling setVar on slot = %i which is null", slot); 6679c64239ebbfa4170190ede812e69150035e008e0Tim Murray return; 6689c64239ebbfa4170190ede812e69150035e008e0Tim Murray } 6699c64239ebbfa4170190ede812e69150035e008e0Tim Murray memcpy(data, srcPtr, dataLength); 6709c64239ebbfa4170190ede812e69150035e008e0Tim Murray} 6719c64239ebbfa4170190ede812e69150035e008e0Tim Murray 6729c64239ebbfa4170190ede812e69150035e008e0Tim Murray 673709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength, 674709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const Element *elem, 675709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const size_t *dims, size_t dimLength) { 676709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 677110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 678709a0978ae141198018ca9769f8d96292a8928e6Jason Sams int32_t *destPtr = reinterpret_cast<int32_t *>( 679709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportVarAddrs()[slot]); 680110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 681110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams int32_t *destPtr = reinterpret_cast<int32_t *>(mFieldAddress[slot]); 682110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 683709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!destPtr) { 684709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGV("Calling setVar on slot = %i which is null", slot); 685709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 686709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 687709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 688709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // We want to look at dimension in terms of integer components, 689709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // but dimLength is given in terms of bytes. 690709a0978ae141198018ca9769f8d96292a8928e6Jason Sams dimLength /= sizeof(int); 691709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 692709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // Only a single dimension is currently supported. 693709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(dimLength == 1); 694709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (dimLength == 1) { 695709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // First do the increment loop. 696709a0978ae141198018ca9769f8d96292a8928e6Jason Sams size_t stride = elem->getSizeBytes(); 697709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const char *cVal = reinterpret_cast<const char *>(data); 698709a0978ae141198018ca9769f8d96292a8928e6Jason Sams for (size_t i = 0; i < dims[0]; i++) { 699709a0978ae141198018ca9769f8d96292a8928e6Jason Sams elem->incRefs(cVal); 700709a0978ae141198018ca9769f8d96292a8928e6Jason Sams cVal += stride; 701709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 702709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 703709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // Decrement loop comes after (to prevent race conditions). 704709a0978ae141198018ca9769f8d96292a8928e6Jason Sams char *oldVal = reinterpret_cast<char *>(destPtr); 705709a0978ae141198018ca9769f8d96292a8928e6Jason Sams for (size_t i = 0; i < dims[0]; i++) { 706709a0978ae141198018ca9769f8d96292a8928e6Jason Sams elem->decRefs(oldVal); 707709a0978ae141198018ca9769f8d96292a8928e6Jason Sams oldVal += stride; 708709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 709709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 710709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 711709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memcpy(destPtr, data, dataLength); 712709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 713709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 714709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalBind(uint32_t slot, Allocation *data) { 715709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 716709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //rsAssert(!script->mFieldIsObject[slot]); 717709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("setGlobalBind %p %p %i %p", dc, script, slot, data); 718709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 719110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 720709a0978ae141198018ca9769f8d96292a8928e6Jason Sams int32_t *destPtr = reinterpret_cast<int32_t *>( 721709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportVarAddrs()[slot]); 722110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 723110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams int32_t *destPtr = reinterpret_cast<int32_t *>(mFieldAddress[slot]); 724110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 725709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!destPtr) { 726709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGV("Calling setVar on slot = %i which is null", slot); 727709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 728709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 729709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 730709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void *ptr = NULL; 731709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mBoundAllocs[slot] = data; 732709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if(data) { 733709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ptr = data->mHal.drvState.lod[0].mallocPtr; 734709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 735709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memcpy(destPtr, &ptr, sizeof(void *)); 736709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 737709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 738709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalObj(uint32_t slot, ObjectBase *data) { 739709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 740709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //rsAssert(script->mFieldIsObject[slot]); 741709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("setGlobalObj %p %p %i %p", dc, script, slot, data); 742709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 743709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //if (mIntrinsicID) { 744709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //mIntrinsicFuncs.setVarObj(dc, script, drv->mIntrinsicData, slot, alloc); 745709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //return; 746709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //} 747709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 748110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 749709a0978ae141198018ca9769f8d96292a8928e6Jason Sams int32_t *destPtr = reinterpret_cast<int32_t *>( 750709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportVarAddrs()[slot]); 751110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 752110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams int32_t *destPtr = reinterpret_cast<int32_t *>(mFieldAddress[slot]); 753110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 754709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!destPtr) { 755709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGV("Calling setVar on slot = %i which is null", slot); 756709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 757709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 758709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 759709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsrSetObject(mCtx->getContext(), (ObjectBase **)destPtr, data); 760709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 761709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 762709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptImpl::~RsdCpuScriptImpl() { 763110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 764709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mExecutable) { 765709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Vector<void *>::const_iterator var_addr_iter = 766709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportVarAddrs().begin(); 767709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Vector<void *>::const_iterator var_addr_end = 768709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportVarAddrs().end(); 769709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 770709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bcc::RSInfo::ObjectSlotListTy::const_iterator is_object_iter = 771709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getInfo().getObjectSlots().begin(); 772709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bcc::RSInfo::ObjectSlotListTy::const_iterator is_object_end = 773709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getInfo().getObjectSlots().end(); 774709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 775709a0978ae141198018ca9769f8d96292a8928e6Jason Sams while ((var_addr_iter != var_addr_end) && 776709a0978ae141198018ca9769f8d96292a8928e6Jason Sams (is_object_iter != is_object_end)) { 777709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // The field address can be NULL if the script-side has optimized 778709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // the corresponding global variable away. 779709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ObjectBase **obj_addr = 780709a0978ae141198018ca9769f8d96292a8928e6Jason Sams reinterpret_cast<ObjectBase **>(*var_addr_iter); 781709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (*is_object_iter) { 782709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (*var_addr_iter != NULL) { 783709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsrClearObject(mCtx->getContext(), obj_addr); 784709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 785709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 786709a0978ae141198018ca9769f8d96292a8928e6Jason Sams var_addr_iter++; 787709a0978ae141198018ca9769f8d96292a8928e6Jason Sams is_object_iter++; 788709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 789709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 790709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 791709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mCompilerContext) { 792709a0978ae141198018ca9769f8d96292a8928e6Jason Sams delete mCompilerContext; 793709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 794709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mCompilerDriver) { 795709a0978ae141198018ca9769f8d96292a8928e6Jason Sams delete mCompilerDriver; 796709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 797709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mExecutable) { 798709a0978ae141198018ca9769f8d96292a8928e6Jason Sams delete mExecutable; 799709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 800709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mBoundAllocs) { 801709a0978ae141198018ca9769f8d96292a8928e6Jason Sams delete[] mBoundAllocs; 802709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 803110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 804110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldIsObject) { 805110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams for (size_t i = 0; i < mExportedVariableCount; ++i) { 806110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldIsObject[i]) { 807110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldAddress[i] != NULL) { 808110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ObjectBase **obj_addr = 809110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams reinterpret_cast<ObjectBase **>(mFieldAddress[i]); 810110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams rsrClearObject(mCtx->getContext(), obj_addr); 811110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 812110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 813110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 814110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 815110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 816110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mInvokeFunctions) delete[] mInvokeFunctions; 817110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mForEachFunctions) delete[] mForEachFunctions; 818110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldAddress) delete[] mFieldAddress; 819110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldIsObject) delete[] mFieldIsObject; 820110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mForEachSignatures) delete[] mForEachSignatures; 821110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mBoundAllocs) delete[] mBoundAllocs; 822110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO) { 823110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams dlclose(mScriptSO); 824110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 825110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 826709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 827709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 828709a0978ae141198018ca9769f8d96292a8928e6Jason SamsAllocation * RsdCpuScriptImpl::getAllocationForPointer(const void *ptr) const { 829709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!ptr) { 830709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return NULL; 831709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 832709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 833709a0978ae141198018ca9769f8d96292a8928e6Jason Sams for (uint32_t ct=0; ct < mScript->mHal.info.exportedVariableCount; ct++) { 834709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Allocation *a = mBoundAllocs[ct]; 835709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!a) continue; 836709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (a->mHal.drvState.lod[0].mallocPtr == ptr) { 837709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return a; 838709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 839709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 840709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ALOGE("rsGetAllocation, failed to find %p", ptr); 841709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return NULL; 842709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 843709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 844709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 845709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 846709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 847