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 31 namespace bcinfo { 32 class MetadataExtractor; 33 } // namespace bcinfo 34 35 namespace android { 36 namespace renderscript { 37 38 class ScriptExecutable; 39 40 class RsdCpuScriptImpl : public RsdCpuReferenceImpl::CpuScript { 41 public: 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 112 protected: 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 133 public: 134 static const char* BCC_EXE_PATH; 135 const char* getBitcodeFilePath() const { return mBitcodeFilePath.c_str(); } 136 137 private: 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 147 Allocation * rsdScriptGetAllocationForPointer( 148 const Context *dc, 149 const Script *script, 150 const void *); 151 152 uint32_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_BC "/system/lib64" 161 #define SYSLIBPATH_VENDOR "/system/vendor/lib64" 162 #elif defined(BUILD_ARM_FOR_X86) && defined(__arm__) 163 #define SYSLIBPATH "/system/lib/arm" 164 #define SYSLIBPATH_BC "/system/lib" 165 #define SYSLIBPATH_VENDOR "/system/vendor/lib/arm" 166 #else 167 #define SYSLIBPATH "/system/lib" 168 #define SYSLIBPATH_BC "/system/lib" 169 #define SYSLIBPATH_VENDOR "/system/vendor/lib" 170 #endif 171 172 } // namespace android 173 174 namespace { 175 176 inline bool is_force_recompile() { 177 char buf[PROP_VALUE_MAX]; 178 179 // Re-compile if floating point precision has been overridden. 180 android::renderscript::property_get("debug.rs.precision", buf, ""); 181 if (buf[0] != '\0') { 182 return true; 183 } 184 185 // Re-compile if debug.rs.forcerecompile is set. 186 android::renderscript::property_get("debug.rs.forcerecompile", buf, "0"); 187 if ((::strcmp(buf, "1") == 0) || (::strcmp(buf, "true") == 0)) { 188 return true; 189 } else { 190 return false; 191 } 192 } 193 194 } // anonymous namespace 195 196 #endif // RSD_CPU_SCRIPT_H 197