rsCpuScript.cpp revision ba17ae494add84056bbf3275b68e40e62a643db0
1709a0978ae141198018ca9769f8d96292a8928e6Jason Sams/* 2709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Copyright (C) 2011-2012 The Android Open Source Project 3709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * 4709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * you may not use this file except in compliance with the License. 6709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * You may obtain a copy of the License at 7709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * 8709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * 10709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Unless required by applicable law or agreed to in writing, software 11709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * See the License for the specific language governing permissions and 14709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * limitations under the License. 15709a0978ae141198018ca9769f8d96292a8928e6Jason Sams */ 16709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 17709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 18709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 19709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuCore.h" 20709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 21709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuScript.h" 22709a0978ae141198018ca9769f8d96292a8928e6Jason Sams//#include "rsdRuntime.h" 23709a0978ae141198018ca9769f8d96292a8928e6Jason Sams//#include "rsdAllocation.h" 24709a0978ae141198018ca9769f8d96292a8928e6Jason Sams//#include "rsCpuIntrinsics.h" 25709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 260b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER 27709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "utils/Vector.h" 28709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "utils/Timers.h" 29709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "utils/StopWatch.h" 300b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif 31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 32110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifdef RS_COMPATIBILITY_LIB 33110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <dlfcn.h> 34110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <stdio.h> 35110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <string.h> 36110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 37110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <bcc/BCCContext.h> 38110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <bcc/Renderscript/RSCompilerDriver.h> 39110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <bcc/Renderscript/RSExecutable.h> 40110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams #include <bcc/Renderscript/RSInfo.h> 41ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines #include <cutils/properties.h> 42110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 43709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 44ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines#ifndef RS_COMPATIBILITY_LIB 45ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hinesnamespace { 46ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hinesstatic bool is_force_recompile() { 47ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines#ifdef RS_SERVER 48ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines return false; 49ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines#else 50ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines char buf[PROPERTY_VALUE_MAX]; 51ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines 52ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines // Re-compile if floating point precision has been overridden. 53ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines property_get("debug.rs.precision", buf, ""); 54ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines if (buf[0] != '\0') { 55ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines return true; 56ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines } 57ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines 58ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines // Re-compile if debug.rs.forcerecompile is set. 59ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines property_get("debug.rs.forcerecompile", buf, "0"); 60ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines if ((::strcmp(buf, "1") == 0) || (::strcmp(buf, "true") == 0)) { 61ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines return true; 62ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines } else { 63ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines return false; 64ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines } 65ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines#endif // RS_SERVER 66ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines} 67ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines} // namespace 68ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines#endif // !defined(RS_COMPATIBILITY_LIB) 69ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines 70709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android { 71709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript { 72709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 73709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 74110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifdef RS_COMPATIBILITY_LIB 75110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define MAXLINE 500 76110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define MAKE_STR_HELPER(S) #S 77110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define MAKE_STR(S) MAKE_STR_HELPER(S) 78110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define EXPORT_VAR_STR "exportVarCount: " 79110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define EXPORT_VAR_STR_LEN strlen(EXPORT_VAR_STR) 80110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define EXPORT_FUNC_STR "exportFuncCount: " 81110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define EXPORT_FUNC_STR_LEN strlen(EXPORT_FUNC_STR) 82110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define EXPORT_FOREACH_STR "exportForEachCount: " 83110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define EXPORT_FOREACH_STR_LEN strlen(EXPORT_FOREACH_STR) 84110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define OBJECT_SLOT_STR "objectSlotCount: " 85110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#define OBJECT_SLOT_STR_LEN strlen(OBJECT_SLOT_STR) 86110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 87110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams// Copy up to a newline or size chars from str -> s, updating str 88110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams// Returns s when successful and NULL when '\0' is finally reached. 89110f181b7966212a36ef18016f9b81c7322d0a2fJason Samsstatic char* strgets(char *s, int size, const char **ppstr) { 90110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (!ppstr || !*ppstr || **ppstr == '\0' || size < 1) { 91110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams return NULL; 92110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 93110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 94110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams int i; 95110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams for (i = 0; i < (size - 1); i++) { 96110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams s[i] = **ppstr; 97110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams (*ppstr)++; 98110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (s[i] == '\0') { 99110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams return s; 100110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } else if (s[i] == '\n') { 101110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams s[i+1] = '\0'; 102110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams return s; 103110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 104110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 105110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 106110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // size has been exceeded. 107110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams s[i] = '\0'; 108110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 109110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams return s; 110110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams} 111110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 112709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 113709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptImpl::RsdCpuScriptImpl(RsdCpuReferenceImpl *ctx, const Script *s) { 114709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx = ctx; 115709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mScript = s; 116709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 117110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifdef RS_COMPATIBILITY_LIB 118110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mScriptSO = NULL; 119110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mInvokeFunctions = NULL; 120110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mForEachFunctions = NULL; 121110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFieldAddress = NULL; 122110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFieldIsObject = NULL; 123110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mForEachSignatures = NULL; 124110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 125110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mCompilerContext = NULL; 126110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mCompilerDriver = NULL; 127110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mExecutable = NULL; 128110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 129110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 130709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mRoot = NULL; 131709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mRootExpand = NULL; 132709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mInit = NULL; 133709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mFreeChildren = NULL; 134709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 135709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 136709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mBoundAllocs = NULL; 137709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mIntrinsicData = NULL; 138709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mIsThreadable = true; 139709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 140709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 141709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 142709a0978ae141198018ca9769f8d96292a8928e6Jason Samsbool RsdCpuScriptImpl::init(char const *resName, char const *cacheDir, 143709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint8_t const *bitcode, size_t bitcodeSize, 144709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t flags) { 145709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("rsdScriptCreate %p %p %p %p %i %i %p", rsc, resName, cacheDir, bitcode, bitcodeSize, flags, lookupFunc); 146709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("rsdScriptInit %p %p", rsc, script); 147709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 148709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->lockMutex(); 149709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 150110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 151ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines bcc::RSExecutable *exec = NULL; 152709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 153709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerContext = NULL; 154709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerDriver = NULL; 155709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable = NULL; 156709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 157709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerContext = new bcc::BCCContext(); 158709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mCompilerContext == NULL) { 159709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ALOGE("bcc: FAILS to create compiler context (out of memory)"); 160709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->unlockMutex(); 161709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return false; 162709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 163709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 164709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerDriver = new bcc::RSCompilerDriver(); 165709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mCompilerDriver == NULL) { 166709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ALOGE("bcc: FAILS to create compiler driver (out of memory)"); 167709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->unlockMutex(); 168709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return false; 169709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 170709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 171709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerDriver->setRSRuntimeLookupFunction(lookupRuntimeStub); 172709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCompilerDriver->setRSRuntimeLookupContext(this); 173709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 174b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines // Run any compiler setup functions we have been provided with. 175b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines RSSetupCompilerCallback setupCompilerCallback = 176b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines mCtx->getSetupCompilerCallback(); 177b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines if (setupCompilerCallback != NULL) { 178b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines setupCompilerCallback(mCompilerDriver); 179b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines } 180b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines 1811d476620399d54774e4fd386c1d23cc583d49522Stephen Hines const char *core_lib = NULL; 1821d476620399d54774e4fd386c1d23cc583d49522Stephen Hines RSSelectRTCallback selectRTCallback = mCtx->getSelectRTCallback(); 1831d476620399d54774e4fd386c1d23cc583d49522Stephen Hines if (selectRTCallback != NULL) { 1841d476620399d54774e4fd386c1d23cc583d49522Stephen Hines core_lib = selectRTCallback((const char *)bitcode, bitcodeSize); 1851d476620399d54774e4fd386c1d23cc583d49522Stephen Hines } 186cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines 187cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines if (mCtx->getContext()->getContextType() == RS_CONTEXT_TYPE_DEBUG) { 188cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines // Use the libclcore_debug.bc instead of the default library. 189cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines core_lib = bcc::RSInfo::LibCLCoreDebugPath; 190f47e8b4b86bf194e65398032f3f5f47a6da89f3fStephen Hines mCompilerDriver->setDebugContext(true); 191ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines // Skip the cache lookup 192ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines } else if (!is_force_recompile()) { 193ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines // Attempt to just load the script from cache first if we can. 194ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines exec = mCompilerDriver->loadScript(cacheDir, resName, 195ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines (const char *)bitcode, bitcodeSize); 196ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines } 197ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines 198ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines // TODO(srhines): This is being refactored, but it simply wraps the 199ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines // build (compile) and load steps together. 200ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines if (exec == NULL) { 201ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines bool built = mCompilerDriver->build(*mCompilerContext, cacheDir, 202ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines resName, (const char *)bitcode, 203ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines bitcodeSize, core_lib, 204ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines mCtx->getLinkRuntimeCallback()); 205ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines if (built) { 206ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines exec = mCompilerDriver->loadScript(cacheDir, resName, 207ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines (const char *)bitcode, 208ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines bitcodeSize); 209ba17ae494add84056bbf3275b68e40e62a643db0Stephen Hines } 210cca3d6ca444bef3b6d75431ec19bd07bfe40a733Stephen Hines } 211709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 212709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (exec == NULL) { 213709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ALOGE("bcc: FAILS to prepare executable for '%s'", resName); 214709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->unlockMutex(); 215709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return false; 216709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 217709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 218709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable = exec; 219709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 220709a0978ae141198018ca9769f8d96292a8928e6Jason Sams exec->setThreadable(mIsThreadable); 221709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!exec->syncInfo()) { 222709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ALOGW("bcc: FAILS to synchronize the RS info file to the disk"); 223709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 224709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 225709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mRoot = reinterpret_cast<int (*)()>(exec->getSymbolAddress("root")); 226709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mRootExpand = 227709a0978ae141198018ca9769f8d96292a8928e6Jason Sams reinterpret_cast<int (*)()>(exec->getSymbolAddress("root.expand")); 228709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mInit = reinterpret_cast<void (*)()>(exec->getSymbolAddress("init")); 229709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mFreeChildren = 230709a0978ae141198018ca9769f8d96292a8928e6Jason Sams reinterpret_cast<void (*)()>(exec->getSymbolAddress(".rs.dtor")); 231709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 232709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 2331d476620399d54774e4fd386c1d23cc583d49522Stephen Hines const bcc::RSInfo *info = &mExecutable->getInfo(); 234709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (info->getExportVarNames().size()) { 235709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mBoundAllocs = new Allocation *[info->getExportVarNames().size()]; 236709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memset(mBoundAllocs, 0, sizeof(void *) * info->getExportVarNames().size()); 237709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 238709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 239110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 240110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 2410b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_SERVER 242110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams String8 scriptSOName(cacheDir); 243110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSOName = scriptSOName.getPathDir(); 244110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSOName.appendPath("lib"); 245110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSOName.append("/librs."); 2460b575de8ed0b628d84d256f5846500b0385979bdTim Murray#else 2470b575de8ed0b628d84d256f5846500b0385979bdTim Murray String8 scriptSOName("lib"); 2480b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif 249110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSOName.append(resName); 250110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSOName.append(".so"); 251110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 252110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //script->mHal.drv = drv; 253110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 254110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGV("Opening up shared object: %s", scriptSOName.string()); 255110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mScriptSO = dlopen(scriptSOName.string(), RTLD_NOW | RTLD_LOCAL); 256110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO == NULL) { 257110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Unable to open shared library (%s): %s", 258110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSOName.string(), dlerror()); 259110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 260110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // One final attempt to find the library in "/system/lib". 261110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // We do this to allow bundled applications to use the compatibility 262110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // library fallback path. Those applications don't have a private 263110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // library path, so they need to install to the system directly. 264110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams String8 scriptSONameSystem("/system/lib/librs."); 265110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSONameSystem.append(resName); 266110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSONameSystem.append(".so"); 267110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mScriptSO = dlopen(scriptSONameSystem.string(), RTLD_NOW | RTLD_LOCAL); 268110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO == NULL) { 269110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Unable to open system shared library (%s): %s", 270110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams scriptSONameSystem.string(), dlerror()); 271110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 272110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 273110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 274110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 275110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO) { 276110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams char line[MAXLINE]; 277110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mRoot = (RootFunc_t) dlsym(mScriptSO, "root"); 278110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mRoot) { 279110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found root(): %p", mRoot); 280110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 281110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mRootExpand = (RootFunc_t) dlsym(mScriptSO, "root.expand"); 282110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mRootExpand) { 283110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found root.expand(): %p", mRootExpand); 284110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 285110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mInit = (InvokeFunc_t) dlsym(mScriptSO, "init"); 286110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mInit) { 287110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found init(): %p", mInit); 288110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 289110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFreeChildren = (InvokeFunc_t) dlsym(mScriptSO, ".rs.dtor"); 290110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFreeChildren) { 291110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found .rs.dtor(): %p", mFreeChildren); 292110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 293110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 294110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams const char *rsInfo = (const char *) dlsym(mScriptSO, ".rs.info"); 295110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (rsInfo) { 296110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found .rs.info(): %p - %s", rsInfo, rsInfo); 297110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 298110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 299110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams size_t varCount = 0; 300110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 301110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 302110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 303110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (sscanf(line, EXPORT_VAR_STR "%zu", &varCount) != 1) { 304110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Invalid export var count!: %s", line); 305110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 306110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 307110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 308110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mExportedVariableCount = varCount; 309110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("varCount: %zu", varCount); 310110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (varCount > 0) { 311110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Start by creating/zeroing this member, since we don't want to 312110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // accidentally clean up invalid pointers later (if we error out). 313110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFieldIsObject = new bool[varCount]; 314110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldIsObject == NULL) { 315110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 316110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 317110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams memset(mFieldIsObject, 0, varCount * sizeof(*mFieldIsObject)); 318110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFieldAddress = new void*[varCount]; 319110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldAddress == NULL) { 320110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 321110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 322110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams for (size_t i = 0; i < varCount; ++i) { 323110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 324110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 325110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 326110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams char *c = strrchr(line, '\n'); 327110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (c) { 328110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams *c = '\0'; 329110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 330110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFieldAddress[i] = dlsym(mScriptSO, line); 331110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldAddress[i] == NULL) { 332110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Failed to find variable address for %s: %s", 333110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams line, dlerror()); 334110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Not a critical error if we don't find a global variable. 335110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 336110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams else { 337110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found variable %s at %p", line, 338110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //mFieldAddress[i]); 339110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 340110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 341110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 342110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 343110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams size_t funcCount = 0; 344110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 345110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 346110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 347110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (sscanf(line, EXPORT_FUNC_STR "%zu", &funcCount) != 1) { 348110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Invalid export func count!: %s", line); 349110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 350110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 351110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 352110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mExportedFunctionCount = funcCount; 353110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("funcCount: %zu", funcCount); 354110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 355110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (funcCount > 0) { 356110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mInvokeFunctions = new InvokeFunc_t[funcCount]; 357110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mInvokeFunctions == NULL) { 358110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 359110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 360110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams for (size_t i = 0; i < funcCount; ++i) { 361110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 362110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 363110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 364110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams char *c = strrchr(line, '\n'); 365110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (c) { 366110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams *c = '\0'; 367110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 368110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 369110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mInvokeFunctions[i] = (InvokeFunc_t) dlsym(mScriptSO, line); 370110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mInvokeFunctions[i] == NULL) { 371110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Failed to get function address for %s(): %s", 372110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams line, dlerror()); 373110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 374110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 375110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams else { 376110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found InvokeFunc_t %s at %p", line, mInvokeFunctions[i]); 377110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 378110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 379110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 380110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 381110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams size_t forEachCount = 0; 382110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 383110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 384110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 385110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (sscanf(line, EXPORT_FOREACH_STR "%zu", &forEachCount) != 1) { 386110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Invalid export forEach count!: %s", line); 387110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 388110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 389110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 390110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (forEachCount > 0) { 391110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 392110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mForEachSignatures = new uint32_t[forEachCount]; 393110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mForEachSignatures == NULL) { 394110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 395110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 396110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mForEachFunctions = new ForEachFunc_t[forEachCount]; 397110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mForEachFunctions == NULL) { 398110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 399110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 400110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams for (size_t i = 0; i < forEachCount; ++i) { 401110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams unsigned int tmpSig = 0; 402110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams char tmpName[MAXLINE]; 403110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 404110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 405110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 406110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 407110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (sscanf(line, "%u - %" MAKE_STR(MAXLINE) "s", 408110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams &tmpSig, tmpName) != 2) { 409110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Invalid export forEach!: %s", line); 410110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 411110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 412110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 413110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Lookup the expanded ForEach kernel. 414110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams strncat(tmpName, ".expand", MAXLINE-1-strlen(tmpName)); 415110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mForEachSignatures[i] = tmpSig; 416110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mForEachFunctions[i] = 417110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams (ForEachFunc_t) dlsym(mScriptSO, tmpName); 418ef7481e2f0a4ad7b32bb626245e4207cabe171dcStephen Hines if (i != 0 && mForEachFunctions[i] == NULL) { 419110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Ignore missing root.expand functions. 420110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // root() is always specified at location 0. 421ef7481e2f0a4ad7b32bb626245e4207cabe171dcStephen Hines ALOGE("Failed to find forEach function address for %s: %s", 422ef7481e2f0a4ad7b32bb626245e4207cabe171dcStephen Hines tmpName, dlerror()); 423ef7481e2f0a4ad7b32bb626245e4207cabe171dcStephen Hines goto error; 424110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 425110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams else { 426110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //ALOGE("Found forEach %s at %p", tmpName, mForEachFunctions[i]); 427110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 428110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 429110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 430110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 431110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams size_t objectSlotCount = 0; 432110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 433110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 434110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 435110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (sscanf(line, OBJECT_SLOT_STR "%zu", &objectSlotCount) != 1) { 436110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Invalid object slot count!: %s", line); 437110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 438110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 439110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 440110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (objectSlotCount > 0) { 441110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams rsAssert(varCount > 0); 442110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams for (size_t i = 0; i < objectSlotCount; ++i) { 443110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams uint32_t varNum = 0; 444110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (strgets(line, MAXLINE, &rsInfo) == NULL) { 445110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 446110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 447110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (sscanf(line, "%u", &varNum) != 1) { 448110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ALOGE("Invalid object slot!: %s", line); 449110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams goto error; 450110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 451110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 452110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (varNum < varCount) { 453110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mFieldIsObject[varNum] = true; 454110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 455110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 456110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 457110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 458110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (varCount > 0) { 459110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mBoundAllocs = new Allocation *[varCount]; 460110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams memset(mBoundAllocs, 0, varCount * sizeof(*mBoundAllocs)); 461110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 462110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 463110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO == (void*)1) { 464110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams //rsdLookupRuntimeStub(script, "acos"); 465110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 466110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 467110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 468110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 469709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->unlockMutex(); 470709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return true; 471110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 472110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifdef RS_COMPATIBILITY_LIB 473110f181b7966212a36ef18016f9b81c7322d0a2fJason Samserror: 474110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 475110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mCtx->unlockMutex(); 476110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams delete[] mInvokeFunctions; 477110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams delete[] mForEachFunctions; 478110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams delete[] mFieldAddress; 479110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams delete[] mFieldIsObject; 480110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams delete[] mForEachSignatures; 481110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams delete[] mBoundAllocs; 482110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO) { 483110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams dlclose(mScriptSO); 484110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 485110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams return false; 486110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 487709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 488709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 489709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::populateScript(Script *script) { 490110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 491709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const bcc::RSInfo *info = &mExecutable->getInfo(); 492709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 493709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // Copy info over to runtime 494709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.exportedFunctionCount = info->getExportFuncNames().size(); 495709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.exportedVariableCount = info->getExportVarNames().size(); 496709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.exportedPragmaCount = info->getPragmas().size(); 497709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.exportedPragmaKeyList = 498709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const_cast<const char**>(mExecutable->getPragmaKeys().array()); 499709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.exportedPragmaValueList = 500709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const_cast<const char**>(mExecutable->getPragmaValues().array()); 501709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 502709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mRootExpand) { 503709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.root = mRootExpand; 504709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } else { 505709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script->mHal.info.root = mRoot; 506709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 507110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 508110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Copy info over to runtime 509110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.exportedFunctionCount = mExportedFunctionCount; 510110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.exportedVariableCount = mExportedVariableCount; 511110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.exportedPragmaCount = 0; 512110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.exportedPragmaKeyList = 0; 513110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.exportedPragmaValueList = 0; 514110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 515110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams // Bug, need to stash in metadata 516110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mRootExpand) { 517110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.root = mRootExpand; 518110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } else { 519110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams script->mHal.info.root = mRoot; 520110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 521110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 522709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 523709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 524709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 525709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (*rs_t)(const void *, void *, const void *, uint32_t, uint32_t, uint32_t, uint32_t); 526709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 527709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::forEachMtlsSetup(const Allocation * ain, Allocation * aout, 528709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const void * usr, uint32_t usrLen, 529709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const RsScriptCall *sc, 530709a0978ae141198018ca9769f8d96292a8928e6Jason Sams MTLaunchStruct *mtls) { 531709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 532709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memset(mtls, 0, sizeof(MTLaunchStruct)); 533709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 5343a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray // possible for this to occur if IO_OUTPUT/IO_INPUT with no bound surface 5353a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray if (ain && (const uint8_t *)ain->mHal.drvState.lod[0].mallocPtr == NULL) { 5363a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations"); 5373a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray return; 5383a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray } 5393a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray if (aout && (const uint8_t *)aout->mHal.drvState.lod[0].mallocPtr == NULL) { 5403a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations"); 5413a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray return; 5423a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray } 5433a25fdd3786c1a08b783d8a83ef94b756347ff5cTim Murray 544709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (ain) { 545709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.dimX = ain->getType()->getDimX(); 546709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.dimY = ain->getType()->getDimY(); 547709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.dimZ = ain->getType()->getDimZ(); 548709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //mtls->dimArray = ain->getType()->getDimArray(); 549709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } else if (aout) { 550709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.dimX = aout->getType()->getDimX(); 551709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.dimY = aout->getType()->getDimY(); 552709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.dimZ = aout->getType()->getDimZ(); 553709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //mtls->dimArray = aout->getType()->getDimArray(); 554709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } else { 555709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->getContext()->setError(RS_ERROR_BAD_SCRIPT, "rsForEach called with null allocations"); 556709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 557709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 558709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 559709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!sc || (sc->xEnd == 0)) { 560709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->xEnd = mtls->fep.dimX; 561709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } else { 562709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(sc->xStart < mtls->fep.dimX); 563709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(sc->xEnd <= mtls->fep.dimX); 564709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(sc->xStart < sc->xEnd); 565709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->xStart = rsMin(mtls->fep.dimX, sc->xStart); 566709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->xEnd = rsMin(mtls->fep.dimX, sc->xEnd); 567709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mtls->xStart >= mtls->xEnd) return; 568709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 569709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 570709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!sc || (sc->yEnd == 0)) { 571709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->yEnd = mtls->fep.dimY; 572709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } else { 573709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(sc->yStart < mtls->fep.dimY); 574709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(sc->yEnd <= mtls->fep.dimY); 575709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(sc->yStart < sc->yEnd); 576709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->yStart = rsMin(mtls->fep.dimY, sc->yStart); 577709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->yEnd = rsMin(mtls->fep.dimY, sc->yEnd); 578709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mtls->yStart >= mtls->yEnd) return; 579709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 580709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 581d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray if (!sc || (sc->zEnd == 0)) { 582d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray mtls->zEnd = mtls->fep.dimZ; 583d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray } else { 584d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray rsAssert(sc->zStart < mtls->fep.dimZ); 585d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray rsAssert(sc->zEnd <= mtls->fep.dimZ); 586d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray rsAssert(sc->zStart < sc->zEnd); 587d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray mtls->zStart = rsMin(mtls->fep.dimZ, sc->zStart); 588d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray mtls->zEnd = rsMin(mtls->fep.dimZ, sc->zEnd); 589d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray if (mtls->zStart >= mtls->zEnd) return; 590d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray } 591d4ecb17adc9b099351f2ca1779a74f5283f20a3dTim Murray 592709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->xEnd = rsMax((uint32_t)1, mtls->xEnd); 593709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->yEnd = rsMax((uint32_t)1, mtls->yEnd); 594709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->zEnd = rsMax((uint32_t)1, mtls->zEnd); 595709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->arrayEnd = rsMax((uint32_t)1, mtls->arrayEnd); 596709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 597709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(!ain || (ain->getType()->getDimZ() == 0)); 598709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 599709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->rsc = mCtx; 600709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->ain = ain; 601709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->aout = aout; 602709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.usr = usr; 603709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.usrLen = usrLen; 604709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->mSliceSize = 1; 605709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->mSliceNum = 0; 606709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 607709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.ptrIn = NULL; 608709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.eStrideIn = 0; 609709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->isThreadable = mIsThreadable; 610709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 611709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (ain) { 612709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.ptrIn = (const uint8_t *)ain->mHal.drvState.lod[0].mallocPtr; 613709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.eStrideIn = ain->getType()->getElementSizeBytes(); 614709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.yStrideIn = ain->mHal.drvState.lod[0].stride; 615709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 616709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 617709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.ptrOut = NULL; 618709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.eStrideOut = 0; 619709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (aout) { 620709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.ptrOut = (uint8_t *)aout->mHal.drvState.lod[0].mallocPtr; 621709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.eStrideOut = aout->getType()->getElementSizeBytes(); 622709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.yStrideOut = aout->mHal.drvState.lod[0].stride; 623709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 624709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 625709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 626709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 627709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeForEach(uint32_t slot, 628709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const Allocation * ain, 629709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Allocation * aout, 630709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const void * usr, 631709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t usrLen, 632709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const RsScriptCall *sc) { 633709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 634709a0978ae141198018ca9769f8d96292a8928e6Jason Sams MTLaunchStruct mtls; 635709a0978ae141198018ca9769f8d96292a8928e6Jason Sams forEachMtlsSetup(ain, aout, usr, usrLen, sc, &mtls); 636709a0978ae141198018ca9769f8d96292a8928e6Jason Sams forEachKernelSetup(slot, &mtls); 637709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 638709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this); 639709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->launchThreads(ain, aout, sc, &mtls); 640709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->setTLS(oldTLS); 641709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 642709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 643709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::forEachKernelSetup(uint32_t slot, MTLaunchStruct *mtls) { 644709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->script = this; 645709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->fep.slot = slot; 646110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 647709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(slot < mExecutable->getExportForeachFuncAddrs().size()); 648709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->kernel = reinterpret_cast<ForEachFunc_t>( 649709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportForeachFuncAddrs()[slot]); 650709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(mtls->kernel != NULL); 651709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mtls->sig = mExecutable->getInfo().getExportForeachFuncs()[slot].second; 652110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 653110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mtls->kernel = reinterpret_cast<ForEachFunc_t>(mForEachFunctions[slot]); 654110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams rsAssert(mtls->kernel != NULL); 655110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mtls->sig = mForEachSignatures[slot]; 656110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 657709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 658709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 659709a0978ae141198018ca9769f8d96292a8928e6Jason Samsint RsdCpuScriptImpl::invokeRoot() { 660709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this); 661709a0978ae141198018ca9769f8d96292a8928e6Jason Sams int ret = mRoot(); 662709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->setTLS(oldTLS); 663709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return ret; 664709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 665709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 666709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeInit() { 667709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mInit) { 668709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mInit(); 669709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 670709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 671709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 672709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeFreeChildren() { 673709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mFreeChildren) { 674709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mFreeChildren(); 675709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 676709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 677709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 678709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::invokeFunction(uint32_t slot, const void *params, 679709a0978ae141198018ca9769f8d96292a8928e6Jason Sams size_t paramLength) { 680709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("invoke %p %p %i %p %i", dc, script, slot, params, paramLength); 681709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 682709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this); 683709a0978ae141198018ca9769f8d96292a8928e6Jason Sams reinterpret_cast<void (*)(const void *, uint32_t)>( 684110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 685709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportFuncAddrs()[slot])(params, paramLength); 686110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 687110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams mInvokeFunctions[slot])(params, paramLength); 688110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 689709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mCtx->setTLS(oldTLS); 690709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 691709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 692709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalVar(uint32_t slot, const void *data, size_t dataLength) { 693709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //rsAssert(!script->mFieldIsObject[slot]); 694709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("setGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength); 695709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 696709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //if (mIntrinsicID) { 697709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //mIntrinsicFuncs.setVar(dc, script, drv->mIntrinsicData, slot, data, dataLength); 698709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //return; 699709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //} 700709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 701110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 702709a0978ae141198018ca9769f8d96292a8928e6Jason Sams int32_t *destPtr = reinterpret_cast<int32_t *>( 703709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportVarAddrs()[slot]); 704110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 705110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams int32_t *destPtr = reinterpret_cast<int32_t *>(mFieldAddress[slot]); 706110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 707709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!destPtr) { 708709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGV("Calling setVar on slot = %i which is null", slot); 709709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 710709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 711709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 712709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memcpy(destPtr, data, dataLength); 713709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 714709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 7159c64239ebbfa4170190ede812e69150035e008e0Tim Murrayvoid RsdCpuScriptImpl::getGlobalVar(uint32_t slot, void *data, size_t dataLength) { 7169c64239ebbfa4170190ede812e69150035e008e0Tim Murray //rsAssert(!script->mFieldIsObject[slot]); 7179c64239ebbfa4170190ede812e69150035e008e0Tim Murray //ALOGE("getGlobalVar %p %p %i %p %i", dc, script, slot, data, dataLength); 7189c64239ebbfa4170190ede812e69150035e008e0Tim Murray 7199c64239ebbfa4170190ede812e69150035e008e0Tim Murray#ifndef RS_COMPATIBILITY_LIB 7209c64239ebbfa4170190ede812e69150035e008e0Tim Murray int32_t *srcPtr = reinterpret_cast<int32_t *>( 7219c64239ebbfa4170190ede812e69150035e008e0Tim Murray mExecutable->getExportVarAddrs()[slot]); 7229c64239ebbfa4170190ede812e69150035e008e0Tim Murray#else 7239c64239ebbfa4170190ede812e69150035e008e0Tim Murray int32_t *srcPtr = reinterpret_cast<int32_t *>(mFieldAddress[slot]); 7249c64239ebbfa4170190ede812e69150035e008e0Tim Murray#endif 7259c64239ebbfa4170190ede812e69150035e008e0Tim Murray if (!srcPtr) { 7269c64239ebbfa4170190ede812e69150035e008e0Tim Murray //ALOGV("Calling setVar on slot = %i which is null", slot); 7279c64239ebbfa4170190ede812e69150035e008e0Tim Murray return; 7289c64239ebbfa4170190ede812e69150035e008e0Tim Murray } 7299c64239ebbfa4170190ede812e69150035e008e0Tim Murray memcpy(data, srcPtr, dataLength); 7309c64239ebbfa4170190ede812e69150035e008e0Tim Murray} 7319c64239ebbfa4170190ede812e69150035e008e0Tim Murray 7329c64239ebbfa4170190ede812e69150035e008e0Tim Murray 733709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength, 734709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const Element *elem, 735709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const size_t *dims, size_t dimLength) { 736709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 737110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 738709a0978ae141198018ca9769f8d96292a8928e6Jason Sams int32_t *destPtr = reinterpret_cast<int32_t *>( 739709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportVarAddrs()[slot]); 740110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 741110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams int32_t *destPtr = reinterpret_cast<int32_t *>(mFieldAddress[slot]); 742110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 743709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!destPtr) { 744709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGV("Calling setVar on slot = %i which is null", slot); 745709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 746709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 747709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 748709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // We want to look at dimension in terms of integer components, 749709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // but dimLength is given in terms of bytes. 750709a0978ae141198018ca9769f8d96292a8928e6Jason Sams dimLength /= sizeof(int); 751709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 752709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // Only a single dimension is currently supported. 753709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsAssert(dimLength == 1); 754709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (dimLength == 1) { 755709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // First do the increment loop. 756709a0978ae141198018ca9769f8d96292a8928e6Jason Sams size_t stride = elem->getSizeBytes(); 757709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const char *cVal = reinterpret_cast<const char *>(data); 758709a0978ae141198018ca9769f8d96292a8928e6Jason Sams for (size_t i = 0; i < dims[0]; i++) { 759709a0978ae141198018ca9769f8d96292a8928e6Jason Sams elem->incRefs(cVal); 760709a0978ae141198018ca9769f8d96292a8928e6Jason Sams cVal += stride; 761709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 762709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 763709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // Decrement loop comes after (to prevent race conditions). 764709a0978ae141198018ca9769f8d96292a8928e6Jason Sams char *oldVal = reinterpret_cast<char *>(destPtr); 765709a0978ae141198018ca9769f8d96292a8928e6Jason Sams for (size_t i = 0; i < dims[0]; i++) { 766709a0978ae141198018ca9769f8d96292a8928e6Jason Sams elem->decRefs(oldVal); 767709a0978ae141198018ca9769f8d96292a8928e6Jason Sams oldVal += stride; 768709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 769709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 770709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 771709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memcpy(destPtr, data, dataLength); 772709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 773709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 774709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalBind(uint32_t slot, Allocation *data) { 775709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 776709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //rsAssert(!script->mFieldIsObject[slot]); 777709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("setGlobalBind %p %p %i %p", dc, script, slot, data); 778709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 779110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 780709a0978ae141198018ca9769f8d96292a8928e6Jason Sams int32_t *destPtr = reinterpret_cast<int32_t *>( 781709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportVarAddrs()[slot]); 782110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 783110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams int32_t *destPtr = reinterpret_cast<int32_t *>(mFieldAddress[slot]); 784110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 785709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!destPtr) { 786709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGV("Calling setVar on slot = %i which is null", slot); 787709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 788709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 789709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 790709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void *ptr = NULL; 791709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mBoundAllocs[slot] = data; 792709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if(data) { 793709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ptr = data->mHal.drvState.lod[0].mallocPtr; 794709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 795709a0978ae141198018ca9769f8d96292a8928e6Jason Sams memcpy(destPtr, &ptr, sizeof(void *)); 796709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 797709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 798709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptImpl::setGlobalObj(uint32_t slot, ObjectBase *data) { 799709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 800709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //rsAssert(script->mFieldIsObject[slot]); 801709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGE("setGlobalObj %p %p %i %p", dc, script, slot, data); 802709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 803709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //if (mIntrinsicID) { 804709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //mIntrinsicFuncs.setVarObj(dc, script, drv->mIntrinsicData, slot, alloc); 805709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //return; 806709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //} 807709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 808110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 809709a0978ae141198018ca9769f8d96292a8928e6Jason Sams int32_t *destPtr = reinterpret_cast<int32_t *>( 810709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportVarAddrs()[slot]); 811110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 812110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams int32_t *destPtr = reinterpret_cast<int32_t *>(mFieldAddress[slot]); 813110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 814709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!destPtr) { 815709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //ALOGV("Calling setVar on slot = %i which is null", slot); 816709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return; 817709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 818709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 819709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsrSetObject(mCtx->getContext(), (ObjectBase **)destPtr, data); 820709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 821709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 822709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptImpl::~RsdCpuScriptImpl() { 823110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#ifndef RS_COMPATIBILITY_LIB 824709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mExecutable) { 825709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Vector<void *>::const_iterator var_addr_iter = 826709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportVarAddrs().begin(); 827709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Vector<void *>::const_iterator var_addr_end = 828709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getExportVarAddrs().end(); 829709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 830709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bcc::RSInfo::ObjectSlotListTy::const_iterator is_object_iter = 831709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getInfo().getObjectSlots().begin(); 832709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bcc::RSInfo::ObjectSlotListTy::const_iterator is_object_end = 833709a0978ae141198018ca9769f8d96292a8928e6Jason Sams mExecutable->getInfo().getObjectSlots().end(); 834709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 835709a0978ae141198018ca9769f8d96292a8928e6Jason Sams while ((var_addr_iter != var_addr_end) && 836709a0978ae141198018ca9769f8d96292a8928e6Jason Sams (is_object_iter != is_object_end)) { 837709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // The field address can be NULL if the script-side has optimized 838709a0978ae141198018ca9769f8d96292a8928e6Jason Sams // the corresponding global variable away. 839709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ObjectBase **obj_addr = 840709a0978ae141198018ca9769f8d96292a8928e6Jason Sams reinterpret_cast<ObjectBase **>(*var_addr_iter); 841709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (*is_object_iter) { 842709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (*var_addr_iter != NULL) { 843709a0978ae141198018ca9769f8d96292a8928e6Jason Sams rsrClearObject(mCtx->getContext(), obj_addr); 844709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 845709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 846709a0978ae141198018ca9769f8d96292a8928e6Jason Sams var_addr_iter++; 847709a0978ae141198018ca9769f8d96292a8928e6Jason Sams is_object_iter++; 848709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 849709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 850709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 851709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mCompilerContext) { 852709a0978ae141198018ca9769f8d96292a8928e6Jason Sams delete mCompilerContext; 853709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 854709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mCompilerDriver) { 855709a0978ae141198018ca9769f8d96292a8928e6Jason Sams delete mCompilerDriver; 856709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 857709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mExecutable) { 858709a0978ae141198018ca9769f8d96292a8928e6Jason Sams delete mExecutable; 859709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 860709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (mBoundAllocs) { 861709a0978ae141198018ca9769f8d96292a8928e6Jason Sams delete[] mBoundAllocs; 862709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 863110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#else 864110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldIsObject) { 865110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams for (size_t i = 0; i < mExportedVariableCount; ++i) { 866110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldIsObject[i]) { 867110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldAddress[i] != NULL) { 868110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams ObjectBase **obj_addr = 869110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams reinterpret_cast<ObjectBase **>(mFieldAddress[i]); 870110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams rsrClearObject(mCtx->getContext(), obj_addr); 871110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 872110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 873110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 874110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 875110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams 876110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mInvokeFunctions) delete[] mInvokeFunctions; 877110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mForEachFunctions) delete[] mForEachFunctions; 878110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldAddress) delete[] mFieldAddress; 879110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mFieldIsObject) delete[] mFieldIsObject; 880110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mForEachSignatures) delete[] mForEachSignatures; 881110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mBoundAllocs) delete[] mBoundAllocs; 882110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams if (mScriptSO) { 883110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams dlclose(mScriptSO); 884110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams } 885110f181b7966212a36ef18016f9b81c7322d0a2fJason Sams#endif 886709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 887709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 888709a0978ae141198018ca9769f8d96292a8928e6Jason SamsAllocation * RsdCpuScriptImpl::getAllocationForPointer(const void *ptr) const { 889709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!ptr) { 890709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return NULL; 891709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 892709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 893709a0978ae141198018ca9769f8d96292a8928e6Jason Sams for (uint32_t ct=0; ct < mScript->mHal.info.exportedVariableCount; ct++) { 894709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Allocation *a = mBoundAllocs[ct]; 895709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (!a) continue; 896709a0978ae141198018ca9769f8d96292a8928e6Jason Sams if (a->mHal.drvState.lod[0].mallocPtr == ptr) { 897709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return a; 898709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 899709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 900709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ALOGE("rsGetAllocation, failed to find %p", ptr); 901709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return NULL; 902709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 903709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 904709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 905709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 906709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 907