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