1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2011-2012 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker *
4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker *
8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker *
10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker */
16*e1eccf28SAndroid Build Coastguard Worker
17*e1eccf28SAndroid Build Coastguard Worker #ifndef RSD_CPU_SCRIPT_H
18*e1eccf28SAndroid Build Coastguard Worker #define RSD_CPU_SCRIPT_H
19*e1eccf28SAndroid Build Coastguard Worker
20*e1eccf28SAndroid Build Coastguard Worker #include <rs_hal.h>
21*e1eccf28SAndroid Build Coastguard Worker #include <rsRuntime.h>
22*e1eccf28SAndroid Build Coastguard Worker
23*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
24*e1eccf28SAndroid Build Coastguard Worker #include <utility>
25*e1eccf28SAndroid Build Coastguard Worker #endif
26*e1eccf28SAndroid Build Coastguard Worker
27*e1eccf28SAndroid Build Coastguard Worker #include "rsCpuCore.h"
28*e1eccf28SAndroid Build Coastguard Worker
29*e1eccf28SAndroid Build Coastguard Worker #include <string>
30*e1eccf28SAndroid Build Coastguard Worker
31*e1eccf28SAndroid Build Coastguard Worker namespace bcinfo {
32*e1eccf28SAndroid Build Coastguard Worker class MetadataExtractor;
33*e1eccf28SAndroid Build Coastguard Worker } // namespace bcinfo
34*e1eccf28SAndroid Build Coastguard Worker
35*e1eccf28SAndroid Build Coastguard Worker namespace android {
36*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
37*e1eccf28SAndroid Build Coastguard Worker
38*e1eccf28SAndroid Build Coastguard Worker class ScriptExecutable;
39*e1eccf28SAndroid Build Coastguard Worker
40*e1eccf28SAndroid Build Coastguard Worker class RsdCpuScriptImpl : public RsdCpuReferenceImpl::CpuScript {
41*e1eccf28SAndroid Build Coastguard Worker public:
42*e1eccf28SAndroid Build Coastguard Worker bool init(char const *resName, char const *cacheDir,
43*e1eccf28SAndroid Build Coastguard Worker uint8_t const *bitcode, size_t bitcodeSize, uint32_t flags,
44*e1eccf28SAndroid Build Coastguard Worker char const *bccPluginName = nullptr);
45*e1eccf28SAndroid Build Coastguard Worker void populateScript(Script *) override;
46*e1eccf28SAndroid Build Coastguard Worker
47*e1eccf28SAndroid Build Coastguard Worker void invokeFunction(uint32_t slot, const void *params, size_t paramLength) override;
48*e1eccf28SAndroid Build Coastguard Worker int invokeRoot() override;
49*e1eccf28SAndroid Build Coastguard Worker virtual void preLaunch(uint32_t slot, const Allocation ** ains,
50*e1eccf28SAndroid Build Coastguard Worker uint32_t inLen, Allocation * aout, const void * usr,
51*e1eccf28SAndroid Build Coastguard Worker uint32_t usrLen, const RsScriptCall *sc);
52*e1eccf28SAndroid Build Coastguard Worker virtual void postLaunch(uint32_t slot, const Allocation ** ains,
53*e1eccf28SAndroid Build Coastguard Worker uint32_t inLen, Allocation * aout,
54*e1eccf28SAndroid Build Coastguard Worker const void * usr, uint32_t usrLen,
55*e1eccf28SAndroid Build Coastguard Worker const RsScriptCall *sc);
56*e1eccf28SAndroid Build Coastguard Worker
57*e1eccf28SAndroid Build Coastguard Worker void invokeForEach(uint32_t slot,
58*e1eccf28SAndroid Build Coastguard Worker const Allocation ** ains,
59*e1eccf28SAndroid Build Coastguard Worker uint32_t inLen,
60*e1eccf28SAndroid Build Coastguard Worker Allocation* aout,
61*e1eccf28SAndroid Build Coastguard Worker const void* usr,
62*e1eccf28SAndroid Build Coastguard Worker uint32_t usrLen,
63*e1eccf28SAndroid Build Coastguard Worker const RsScriptCall* sc) override;
64*e1eccf28SAndroid Build Coastguard Worker
65*e1eccf28SAndroid Build Coastguard Worker void invokeReduce(uint32_t slot,
66*e1eccf28SAndroid Build Coastguard Worker const Allocation ** ains, uint32_t inLen,
67*e1eccf28SAndroid Build Coastguard Worker Allocation* aout,
68*e1eccf28SAndroid Build Coastguard Worker const RsScriptCall* sc) override;
69*e1eccf28SAndroid Build Coastguard Worker
70*e1eccf28SAndroid Build Coastguard Worker void invokeInit() override;
71*e1eccf28SAndroid Build Coastguard Worker void invokeFreeChildren() override;
72*e1eccf28SAndroid Build Coastguard Worker
73*e1eccf28SAndroid Build Coastguard Worker void setGlobalVar(uint32_t slot, const void *data, size_t dataLength) override;
74*e1eccf28SAndroid Build Coastguard Worker void getGlobalVar(uint32_t slot, void *data, size_t dataLength) override;
75*e1eccf28SAndroid Build Coastguard Worker void setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength,
76*e1eccf28SAndroid Build Coastguard Worker const Element *e, const uint32_t *dims,
77*e1eccf28SAndroid Build Coastguard Worker size_t dimLength) override;
78*e1eccf28SAndroid Build Coastguard Worker void setGlobalBind(uint32_t slot, Allocation *data) override;
79*e1eccf28SAndroid Build Coastguard Worker void setGlobalObj(uint32_t slot, ObjectBase *data) override;
80*e1eccf28SAndroid Build Coastguard Worker
81*e1eccf28SAndroid Build Coastguard Worker const char* getFieldName(uint32_t slot) const;
82*e1eccf28SAndroid Build Coastguard Worker
83*e1eccf28SAndroid Build Coastguard Worker ~RsdCpuScriptImpl() override;
84*e1eccf28SAndroid Build Coastguard Worker RsdCpuScriptImpl(RsdCpuReferenceImpl *ctx, const Script *s);
85*e1eccf28SAndroid Build Coastguard Worker
getScript()86*e1eccf28SAndroid Build Coastguard Worker const Script * getScript() {return mScript;}
87*e1eccf28SAndroid Build Coastguard Worker
88*e1eccf28SAndroid Build Coastguard Worker bool forEachMtlsSetup(const Allocation ** ains, uint32_t inLen,
89*e1eccf28SAndroid Build Coastguard Worker Allocation * aout, const void * usr, uint32_t usrLen,
90*e1eccf28SAndroid Build Coastguard Worker const RsScriptCall *sc, MTLaunchStructForEach *mtls);
91*e1eccf28SAndroid Build Coastguard Worker
92*e1eccf28SAndroid Build Coastguard Worker virtual void forEachKernelSetup(uint32_t slot, MTLaunchStructForEach *mtls);
93*e1eccf28SAndroid Build Coastguard Worker
94*e1eccf28SAndroid Build Coastguard Worker // Build an MTLaunchStruct suitable for launching a general reduce-style kernel.
95*e1eccf28SAndroid Build Coastguard Worker bool reduceMtlsSetup(const Allocation ** ains, uint32_t inLen, const Allocation *aout,
96*e1eccf28SAndroid Build Coastguard Worker const RsScriptCall *sc, MTLaunchStructReduce *mtls);
97*e1eccf28SAndroid Build Coastguard Worker // Finalize an MTLaunchStruct for launching a general reduce-style kernel.
98*e1eccf28SAndroid Build Coastguard Worker virtual void reduceKernelSetup(uint32_t slot, MTLaunchStructReduce *mtls);
99*e1eccf28SAndroid Build Coastguard Worker
100*e1eccf28SAndroid Build Coastguard Worker const RsdCpuReference::CpuSymbol * lookupSymbolMath(const char *sym);
101*e1eccf28SAndroid Build Coastguard Worker static void * lookupRuntimeStub(void* pContext, char const* name);
102*e1eccf28SAndroid Build Coastguard Worker
103*e1eccf28SAndroid Build Coastguard Worker Allocation * getAllocationForPointer(const void *ptr) const override;
104*e1eccf28SAndroid Build Coastguard Worker bool storeRSInfoFromSO();
105*e1eccf28SAndroid Build Coastguard Worker
106*e1eccf28SAndroid Build Coastguard Worker int getGlobalEntries() const override;
107*e1eccf28SAndroid Build Coastguard Worker const char * getGlobalName(int i) const override;
108*e1eccf28SAndroid Build Coastguard Worker const void * getGlobalAddress(int i) const override;
109*e1eccf28SAndroid Build Coastguard Worker size_t getGlobalSize(int i) const override;
110*e1eccf28SAndroid Build Coastguard Worker uint32_t getGlobalProperties(int i) const override;
111*e1eccf28SAndroid Build Coastguard Worker
112*e1eccf28SAndroid Build Coastguard Worker protected:
113*e1eccf28SAndroid Build Coastguard Worker RsdCpuReferenceImpl *mCtx;
114*e1eccf28SAndroid Build Coastguard Worker const Script *mScript;
115*e1eccf28SAndroid Build Coastguard Worker void *mScriptSO;
116*e1eccf28SAndroid Build Coastguard Worker
117*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
118*e1eccf28SAndroid Build Coastguard Worker // Returns the path to the core library we'll use.
119*e1eccf28SAndroid Build Coastguard Worker const char* findCoreLib(const bcinfo::MetadataExtractor& bitCodeMetaData, const char* bitcode,
120*e1eccf28SAndroid Build Coastguard Worker size_t bitcodeSize);
121*e1eccf28SAndroid Build Coastguard Worker #endif
122*e1eccf28SAndroid Build Coastguard Worker
123*e1eccf28SAndroid Build Coastguard Worker RootFunc_t mRoot;
124*e1eccf28SAndroid Build Coastguard Worker RootFunc_t mRootExpand;
125*e1eccf28SAndroid Build Coastguard Worker InitOrDtorFunc_t mInit;
126*e1eccf28SAndroid Build Coastguard Worker InitOrDtorFunc_t mFreeChildren;
127*e1eccf28SAndroid Build Coastguard Worker ScriptExecutable* mScriptExec;
128*e1eccf28SAndroid Build Coastguard Worker
129*e1eccf28SAndroid Build Coastguard Worker Allocation **mBoundAllocs;
130*e1eccf28SAndroid Build Coastguard Worker void * mIntrinsicData;
131*e1eccf28SAndroid Build Coastguard Worker bool mIsThreadable;
132*e1eccf28SAndroid Build Coastguard Worker
133*e1eccf28SAndroid Build Coastguard Worker public:
134*e1eccf28SAndroid Build Coastguard Worker static const char* BCC_EXE_PATH;
getBitcodeFilePath()135*e1eccf28SAndroid Build Coastguard Worker const char* getBitcodeFilePath() const { return mBitcodeFilePath.c_str(); }
136*e1eccf28SAndroid Build Coastguard Worker
137*e1eccf28SAndroid Build Coastguard Worker private:
138*e1eccf28SAndroid Build Coastguard Worker bool setUpMtlsDimensions(MTLaunchStructCommon *mtls,
139*e1eccf28SAndroid Build Coastguard Worker const RsLaunchDimensions &baseDim,
140*e1eccf28SAndroid Build Coastguard Worker const RsScriptCall *sc);
141*e1eccf28SAndroid Build Coastguard Worker
142*e1eccf28SAndroid Build Coastguard Worker std::string mBitcodeFilePath;
143*e1eccf28SAndroid Build Coastguard Worker uint32_t mBuildChecksum;
144*e1eccf28SAndroid Build Coastguard Worker bool mChecksumNeeded;
145*e1eccf28SAndroid Build Coastguard Worker };
146*e1eccf28SAndroid Build Coastguard Worker
147*e1eccf28SAndroid Build Coastguard Worker Allocation * rsdScriptGetAllocationForPointer(
148*e1eccf28SAndroid Build Coastguard Worker const Context *dc,
149*e1eccf28SAndroid Build Coastguard Worker const Script *script,
150*e1eccf28SAndroid Build Coastguard Worker const void *);
151*e1eccf28SAndroid Build Coastguard Worker
152*e1eccf28SAndroid Build Coastguard Worker uint32_t constructBuildChecksum(uint8_t const *bitcode, size_t bitcodeSize,
153*e1eccf28SAndroid Build Coastguard Worker const char *commandLine,
154*e1eccf28SAndroid Build Coastguard Worker const char ** bccFiles, size_t numFiles);
155*e1eccf28SAndroid Build Coastguard Worker
156*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
157*e1eccf28SAndroid Build Coastguard Worker
158*e1eccf28SAndroid Build Coastguard Worker #ifndef __ANDROID_NATIVE_BRIDGE__
159*e1eccf28SAndroid Build Coastguard Worker
160*e1eccf28SAndroid Build Coastguard Worker #ifdef __LP64__
161*e1eccf28SAndroid Build Coastguard Worker #define SYSLIBPATH "/system/lib64"
162*e1eccf28SAndroid Build Coastguard Worker #define SYSLIBPATH_BC "/system/lib64"
163*e1eccf28SAndroid Build Coastguard Worker #define SYSLIBPATH_VENDOR "/system/vendor/lib64"
164*e1eccf28SAndroid Build Coastguard Worker #else
165*e1eccf28SAndroid Build Coastguard Worker #define SYSLIBPATH "/system/lib"
166*e1eccf28SAndroid Build Coastguard Worker #define SYSLIBPATH_BC "/system/lib"
167*e1eccf28SAndroid Build Coastguard Worker #define SYSLIBPATH_VENDOR "/system/vendor/lib"
168*e1eccf28SAndroid Build Coastguard Worker #endif
169*e1eccf28SAndroid Build Coastguard Worker
170*e1eccf28SAndroid Build Coastguard Worker #else
171*e1eccf28SAndroid Build Coastguard Worker
172*e1eccf28SAndroid Build Coastguard Worker #if defined(__arm__)
173*e1eccf28SAndroid Build Coastguard Worker #define SYSLIBPATH "/system/lib/arm"
174*e1eccf28SAndroid Build Coastguard Worker #define SYSLIBPATH_BC "/system/lib"
175*e1eccf28SAndroid Build Coastguard Worker #define SYSLIBPATH_VENDOR "/system/vendor/lib/arm"
176*e1eccf28SAndroid Build Coastguard Worker #elif defined(__aarch64__)
177*e1eccf28SAndroid Build Coastguard Worker #define SYSLIBPATH "/system/lib64/arm64"
178*e1eccf28SAndroid Build Coastguard Worker #define SYSLIBPATH_BC "/system/lib64"
179*e1eccf28SAndroid Build Coastguard Worker #define SYSLIBPATH_VENDOR "/system/vendor/lib64/arm64"
180*e1eccf28SAndroid Build Coastguard Worker #else
181*e1eccf28SAndroid Build Coastguard Worker #error Unknown architecture
182*e1eccf28SAndroid Build Coastguard Worker #endif
183*e1eccf28SAndroid Build Coastguard Worker
184*e1eccf28SAndroid Build Coastguard Worker #endif
185*e1eccf28SAndroid Build Coastguard Worker
186*e1eccf28SAndroid Build Coastguard Worker } // namespace android
187*e1eccf28SAndroid Build Coastguard Worker
188*e1eccf28SAndroid Build Coastguard Worker namespace {
189*e1eccf28SAndroid Build Coastguard Worker
is_force_recompile()190*e1eccf28SAndroid Build Coastguard Worker inline bool is_force_recompile() {
191*e1eccf28SAndroid Build Coastguard Worker char buf[PROP_VALUE_MAX];
192*e1eccf28SAndroid Build Coastguard Worker
193*e1eccf28SAndroid Build Coastguard Worker // Re-compile if floating point precision has been overridden.
194*e1eccf28SAndroid Build Coastguard Worker android::renderscript::property_get("debug.rs.precision", buf, "");
195*e1eccf28SAndroid Build Coastguard Worker if (buf[0] != '\0') {
196*e1eccf28SAndroid Build Coastguard Worker return true;
197*e1eccf28SAndroid Build Coastguard Worker }
198*e1eccf28SAndroid Build Coastguard Worker
199*e1eccf28SAndroid Build Coastguard Worker // Re-compile if debug.rs.forcerecompile is set.
200*e1eccf28SAndroid Build Coastguard Worker android::renderscript::property_get("debug.rs.forcerecompile", buf, "0");
201*e1eccf28SAndroid Build Coastguard Worker if ((::strcmp(buf, "1") == 0) || (::strcmp(buf, "true") == 0)) {
202*e1eccf28SAndroid Build Coastguard Worker return true;
203*e1eccf28SAndroid Build Coastguard Worker } else {
204*e1eccf28SAndroid Build Coastguard Worker return false;
205*e1eccf28SAndroid Build Coastguard Worker }
206*e1eccf28SAndroid Build Coastguard Worker }
207*e1eccf28SAndroid Build Coastguard Worker
getVndkSysLibPath()208*e1eccf28SAndroid Build Coastguard Worker inline std::string getVndkSysLibPath() {
209*e1eccf28SAndroid Build Coastguard Worker char buf[PROP_VALUE_MAX];
210*e1eccf28SAndroid Build Coastguard Worker android::renderscript::property_get("ro.vndk.version", buf, "");
211*e1eccf28SAndroid Build Coastguard Worker std::string vndk_path = "/apex/com.android.vndk.v" + std::string(buf) + "/lib";
212*e1eccf28SAndroid Build Coastguard Worker #ifdef __LP64__
213*e1eccf28SAndroid Build Coastguard Worker vndk_path += "64";
214*e1eccf28SAndroid Build Coastguard Worker #endif
215*e1eccf28SAndroid Build Coastguard Worker return vndk_path;
216*e1eccf28SAndroid Build Coastguard Worker }
217*e1eccf28SAndroid Build Coastguard Worker
218*e1eccf28SAndroid Build Coastguard Worker } // anonymous namespace
219*e1eccf28SAndroid Build Coastguard Worker
220*e1eccf28SAndroid Build Coastguard Worker #endif // RSD_CPU_SCRIPT_H
221