1 /* 2 * Copyright (C) 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_CORE_H 18 #define RSD_CPU_CORE_H 19 20 #include "rsd_cpu.h" 21 #include "rsSignal.h" 22 #include "rsContext.h" 23 #include "rsElement.h" 24 #include "rsScriptC.h" 25 26 #include <string> 27 28 namespace bcc { 29 class BCCContext; 30 class RSCompilerDriver; 31 class RSExecutable; 32 } 33 34 namespace android { 35 namespace renderscript { 36 37 typedef struct { 38 uint32_t eStride; 39 uint32_t yStride; 40 } StridePair; 41 42 typedef struct { 43 const void *in; 44 void *out; 45 const void *usr; 46 uint32_t usrLen; 47 uint32_t x; 48 uint32_t y; 49 uint32_t z; 50 uint32_t lod; 51 RsAllocationCubemapFace face; 52 uint32_t ar[16]; 53 54 const void **ins; 55 uint32_t *eStrideIns; 56 57 uint32_t lid; 58 59 uint32_t dimX; 60 uint32_t dimY; 61 uint32_t dimZ; 62 uint32_t dimArray; 63 64 const uint8_t *ptrIn; 65 uint8_t *ptrOut; 66 uint32_t eStrideIn; 67 uint32_t eStrideOut; 68 uint32_t yStrideIn; 69 uint32_t yStrideOut; 70 uint32_t slot; 71 72 const uint8_t** ptrIns; 73 StridePair* inStrides; 74 } RsForEachStubParamStruct; 75 76 extern bool gArchUseSIMD; 77 78 typedef void (* InvokeFunc_t)(void); 79 typedef void (* ForEachFunc_t)(void); 80 typedef void (*WorkerCallback_t)(void *usr, uint32_t idx); 81 82 class RsdCpuScriptImpl; 83 class RsdCpuReferenceImpl; 84 85 typedef struct ScriptTLSStructRec { 86 android::renderscript::Context * mContext; 87 const android::renderscript::Script * mScript; 88 RsdCpuScriptImpl *mImpl; 89 } ScriptTLSStruct; 90 91 typedef struct { 92 RsForEachStubParamStruct fep; 93 94 RsdCpuReferenceImpl *rsc; 95 RsdCpuScriptImpl *script; 96 97 ForEachFunc_t kernel; 98 uint32_t sig; 99 const Allocation * ain; 100 Allocation * aout; 101 102 uint32_t mSliceSize; 103 volatile int mSliceNum; 104 bool isThreadable; 105 106 uint32_t xStart; 107 uint32_t xEnd; 108 uint32_t yStart; 109 uint32_t yEnd; 110 uint32_t zStart; 111 uint32_t zEnd; 112 uint32_t arrayStart; 113 uint32_t arrayEnd; 114 115 // Multi-input data. 116 const Allocation ** ains; 117 } MTLaunchStruct; 118 119 120 121 122 class RsdCpuReferenceImpl : public RsdCpuReference { 123 public: 124 virtual ~RsdCpuReferenceImpl(); 125 RsdCpuReferenceImpl(Context *); 126 127 void lockMutex(); 128 void unlockMutex(); 129 130 bool init(uint32_t version_major, uint32_t version_minor, sym_lookup_t, script_lookup_t); 131 virtual void setPriority(int32_t priority); 132 virtual void launchThreads(WorkerCallback_t cbk, void *data); 133 static void * helperThreadProc(void *vrsc); 134 RsdCpuScriptImpl * setTLS(RsdCpuScriptImpl *sc); 135 136 Context * getContext() {return mRSC;} 137 uint32_t getThreadCount() const { 138 return mWorkers.mCount + 1; 139 } 140 141 void launchThreads(const Allocation * ain, Allocation * aout, 142 const RsScriptCall *sc, MTLaunchStruct *mtls); 143 144 void launchThreads(const Allocation** ains, uint32_t inLen, Allocation* aout, 145 const RsScriptCall* sc, MTLaunchStruct* mtls); 146 147 virtual CpuScript * createScript(const ScriptC *s, 148 char const *resName, char const *cacheDir, 149 uint8_t const *bitcode, size_t bitcodeSize, 150 uint32_t flags); 151 virtual CpuScript * createIntrinsic(const Script *s, 152 RsScriptIntrinsicID iid, Element *e); 153 virtual CpuScriptGroup * createScriptGroup(const ScriptGroup *sg); 154 155 const RsdCpuReference::CpuSymbol *symLookup(const char *); 156 157 RsdCpuReference::CpuScript * lookupScript(const Script *s) { 158 return mScriptLookupFn(mRSC, s); 159 } 160 161 #ifndef RS_COMPATIBILITY_LIB 162 void setLinkRuntimeCallback( 163 bcc::RSLinkRuntimeCallback pLinkRuntimeCallback) { 164 mLinkRuntimeCallback = pLinkRuntimeCallback; 165 } 166 bcc::RSLinkRuntimeCallback getLinkRuntimeCallback() { 167 return mLinkRuntimeCallback; 168 } 169 170 void setSelectRTCallback(RSSelectRTCallback pSelectRTCallback) { 171 mSelectRTCallback = pSelectRTCallback; 172 } 173 RSSelectRTCallback getSelectRTCallback() { 174 return mSelectRTCallback; 175 } 176 177 virtual void setSetupCompilerCallback( 178 RSSetupCompilerCallback pSetupCompilerCallback) { 179 mSetupCompilerCallback = pSetupCompilerCallback; 180 } 181 virtual RSSetupCompilerCallback getSetupCompilerCallback() const { 182 return mSetupCompilerCallback; 183 } 184 185 virtual void setBccPluginName(const char *name) { 186 mBccPluginName.assign(name); 187 } 188 virtual const char *getBccPluginName() const { 189 return mBccPluginName.c_str(); 190 } 191 #endif 192 virtual bool getInForEach() { return mInForEach; } 193 194 protected: 195 Context *mRSC; 196 uint32_t version_major; 197 uint32_t version_minor; 198 //bool mHasGraphics; 199 bool mInForEach; 200 201 struct Workers { 202 volatile int mRunningCount; 203 volatile int mLaunchCount; 204 uint32_t mCount; 205 pthread_t *mThreadId; 206 pid_t *mNativeThreadId; 207 Signal mCompleteSignal; 208 Signal *mLaunchSignals; 209 WorkerCallback_t mLaunchCallback; 210 void *mLaunchData; 211 }; 212 Workers mWorkers; 213 bool mExit; 214 sym_lookup_t mSymLookupFn; 215 script_lookup_t mScriptLookupFn; 216 217 ScriptTLSStruct mTlsStruct; 218 219 #ifndef RS_COMPATIBILITY_LIB 220 bcc::RSLinkRuntimeCallback mLinkRuntimeCallback; 221 RSSelectRTCallback mSelectRTCallback; 222 RSSetupCompilerCallback mSetupCompilerCallback; 223 std::string mBccPluginName; 224 #endif 225 }; 226 227 228 } 229 } 230 231 #endif 232