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