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_BCC_H 18 #define RSD_BCC_H 19 20 #include <rs_hal.h> 21 #include <rsRuntime.h> 22 23 #ifndef RS_COMPATIBILITY_LIB 24 #include <bcc/ExecutionEngine/CompilerRTSymbolResolver.h> 25 #include <bcc/ExecutionEngine/SymbolResolverProxy.h> 26 #include <vector> 27 #include <utility> 28 #endif 29 30 #include "rsCpuCore.h" 31 32 namespace bcc { 33 class BCCContext; 34 class RSCompilerDriver; 35 class RSExecutable; 36 } 37 38 namespace bcinfo { 39 class MetadataExtractor; 40 } 41 42 namespace android { 43 namespace renderscript { 44 45 46 47 class RsdCpuScriptImpl : public RsdCpuReferenceImpl::CpuScript { 48 public: 49 typedef void (*outer_foreach_t)( 50 const RsForEachStubParamStruct *, 51 uint32_t x1, uint32_t x2, 52 uint32_t instep, uint32_t outstep); 53 #ifdef RS_COMPATIBILITY_LIB 54 typedef void (* InvokeFunc_t)(void); 55 typedef void (* ForEachFunc_t)(void); 56 typedef int (* RootFunc_t)(void); 57 typedef void (*WorkerCallback_t)(void *usr, uint32_t idx); 58 #endif 59 60 bool init(char const *resName, char const *cacheDir, 61 uint8_t const *bitcode, size_t bitcodeSize, uint32_t flags, 62 char const *bccPluginName = NULL); 63 virtual void populateScript(Script *); 64 65 virtual void invokeFunction(uint32_t slot, const void *params, size_t paramLength); 66 virtual int invokeRoot(); 67 virtual void preLaunch(uint32_t slot, const Allocation * ain, 68 Allocation * aout, const void * usr, 69 uint32_t usrLen, const RsScriptCall *sc); 70 virtual void postLaunch(uint32_t slot, const Allocation * ain, 71 Allocation * aout, const void * usr, 72 uint32_t usrLen, const RsScriptCall *sc); 73 virtual void invokeForEach(uint32_t slot, 74 const Allocation * ain, 75 Allocation * aout, 76 const void * usr, 77 uint32_t usrLen, 78 const RsScriptCall *sc); 79 80 virtual void invokeForEachMulti(uint32_t slot, 81 const Allocation** ains, 82 uint32_t inLen, 83 Allocation* aout, 84 const void* usr, 85 uint32_t usrLen, 86 const RsScriptCall* sc); 87 virtual void invokeInit(); 88 virtual void invokeFreeChildren(); 89 90 virtual void setGlobalVar(uint32_t slot, const void *data, size_t dataLength); 91 virtual void getGlobalVar(uint32_t slot, void *data, size_t dataLength); 92 virtual void setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength, 93 const Element *e, const uint32_t *dims, size_t dimLength); 94 virtual void setGlobalBind(uint32_t slot, Allocation *data); 95 virtual void setGlobalObj(uint32_t slot, ObjectBase *data); 96 97 98 virtual ~RsdCpuScriptImpl(); 99 RsdCpuScriptImpl(RsdCpuReferenceImpl *ctx, const Script *s); 100 101 const Script * getScript() {return mScript;} 102 103 void forEachMtlsSetup(const Allocation * ain, Allocation * aout, 104 const void * usr, uint32_t usrLen, 105 const RsScriptCall *sc, MTLaunchStruct *mtls); 106 107 void forEachMtlsSetup(const Allocation ** ains, uint32_t inLen, 108 Allocation * aout, const void * usr, uint32_t usrLen, 109 const RsScriptCall *sc, MTLaunchStruct *mtls); 110 111 virtual void forEachKernelSetup(uint32_t slot, MTLaunchStruct *mtls); 112 113 114 const RsdCpuReference::CpuSymbol * lookupSymbolMath(const char *sym); 115 static void * lookupRuntimeStub(void* pContext, char const* name); 116 117 virtual Allocation * getAllocationForPointer(const void *ptr) const; 118 119 #ifndef RS_COMPATIBILITY_LIB 120 virtual void * getRSExecutable() { return mExecutable; } 121 #endif 122 123 protected: 124 RsdCpuReferenceImpl *mCtx; 125 const Script *mScript; 126 127 #ifndef RS_COMPATIBILITY_LIB 128 // Returns the path to the core library we'll use. 129 const char* findCoreLib(const bcinfo::MetadataExtractor& bitCodeMetaData, const char* bitcode, 130 size_t bitcodeSize); 131 int (*mRoot)(); 132 int (*mRootExpand)(); 133 void (*mInit)(); 134 void (*mFreeChildren)(); 135 136 std::vector<std::pair<const char *, uint32_t> > mExportedForEachFuncList; 137 138 bcc::BCCContext *mCompilerContext; 139 bcc::RSCompilerDriver *mCompilerDriver; 140 bcc::CompilerRTSymbolResolver mCompilerRuntime; 141 bcc::LookupFunctionSymbolResolver<void *> mRSRuntime; 142 bcc::SymbolResolverProxy mResolver; 143 bcc::RSExecutable *mExecutable; 144 #else 145 void *mScriptSO; 146 RootFunc_t mRoot; 147 RootFunc_t mRootExpand; 148 InvokeFunc_t mInit; 149 InvokeFunc_t mFreeChildren; 150 InvokeFunc_t *mInvokeFunctions; 151 ForEachFunc_t *mForEachFunctions; 152 153 void **mFieldAddress; 154 bool *mFieldIsObject; 155 uint32_t *mForEachSignatures; 156 157 // for populate script 158 //int mVersionMajor; 159 //int mVersionMinor; 160 size_t mExportedVariableCount; 161 size_t mExportedFunctionCount; 162 #endif 163 164 Allocation **mBoundAllocs; 165 void * mIntrinsicData; 166 bool mIsThreadable; 167 }; 168 169 Allocation * rsdScriptGetAllocationForPointer( 170 const Context *dc, 171 const Script *script, 172 const void *); 173 174 175 176 } 177 } 178 179 #endif 180