rsCpuCore.h revision f5ef8df639ba6363aa5d546e57ce872d04144cb6
1709a0978ae141198018ca9769f8d96292a8928e6Jason Sams/* 2709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Copyright (C) 2012 The Android Open Source Project 3709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * 4709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * you may not use this file except in compliance with the License. 6709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * You may obtain a copy of the License at 7709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * 8709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * 10709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Unless required by applicable law or agreed to in writing, software 11709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * See the License for the specific language governing permissions and 14709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * limitations under the License. 15709a0978ae141198018ca9769f8d96292a8928e6Jason Sams */ 16709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 17709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#ifndef RSD_CPU_CORE_H 18709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#define RSD_CPU_CORE_H 19709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 20709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsd_cpu.h" 21709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsSignal.h" 22709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsContext.h" 23709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsElement.h" 24709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsScriptC.h" 25709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 26709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace bcc { 27709a0978ae141198018ca9769f8d96292a8928e6Jason Sams class BCCContext; 28709a0978ae141198018ca9769f8d96292a8928e6Jason Sams class RSCompilerDriver; 29709a0978ae141198018ca9769f8d96292a8928e6Jason Sams class RSExecutable; 30709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 32709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android { 33709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript { 34709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 35f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Samsextern bool gArchUseSIMD; 36709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 37709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (* InvokeFunc_t)(void); 38709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (* ForEachFunc_t)(void); 39709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (*WorkerCallback_t)(void *usr, uint32_t idx); 40709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 41709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptImpl; 42709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuReferenceImpl; 43709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 44709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef struct ScriptTLSStructRec { 45709a0978ae141198018ca9769f8d96292a8928e6Jason Sams android::renderscript::Context * mContext; 46709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const android::renderscript::Script * mScript; 47709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl *mImpl; 48709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} ScriptTLSStruct; 49709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 50709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef struct { 51709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsForEachStubParamStruct fep; 52709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 53709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuReferenceImpl *rsc; 54709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl *script; 55709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 56709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ForEachFunc_t kernel; 57709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t sig; 58709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const Allocation * ain; 59709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Allocation * aout; 60709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 61709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t mSliceSize; 62709a0978ae141198018ca9769f8d96292a8928e6Jason Sams volatile int mSliceNum; 63709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool isThreadable; 64709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 65709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t xStart; 66709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t xEnd; 67709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t yStart; 68709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t yEnd; 69709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t zStart; 70709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t zEnd; 71709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t arrayStart; 72709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t arrayEnd; 73709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} MTLaunchStruct; 74709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 75709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 76709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 77709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 78709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuReferenceImpl : public RsdCpuReference { 79709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic: 80709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual ~RsdCpuReferenceImpl(); 81709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuReferenceImpl(Context *); 82709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 83709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void lockMutex(); 84709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void unlockMutex(); 85709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 86709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool init(uint32_t version_major, uint32_t version_minor, sym_lookup_t, script_lookup_t); 87709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual void setPriority(int32_t priority); 88709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual void launchThreads(WorkerCallback_t cbk, void *data); 89709a0978ae141198018ca9769f8d96292a8928e6Jason Sams static void * helperThreadProc(void *vrsc); 90709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl * setTLS(RsdCpuScriptImpl *sc); 91709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 92709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Context * getContext() {return mRSC;} 93c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams uint32_t getThreadCount() const { 94c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams return mWorkers.mCount + 1; 95c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams } 96709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 97709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void launchThreads(const Allocation * ain, Allocation * aout, 98709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const RsScriptCall *sc, MTLaunchStruct *mtls); 99709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 100709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual CpuScript * createScript(const ScriptC *s, 101709a0978ae141198018ca9769f8d96292a8928e6Jason Sams char const *resName, char const *cacheDir, 102709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint8_t const *bitcode, size_t bitcodeSize, 103709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t flags); 104709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual CpuScript * createIntrinsic(const Script *s, 105709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsScriptIntrinsicID iid, Element *e); 106709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual CpuScriptGroup * createScriptGroup(const ScriptGroup *sg); 107709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 108709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const RsdCpuReference::CpuSymbol *symLookup(const char *); 109709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 110709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuReference::CpuScript * lookupScript(const Script *s) { 111709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return mScriptLookupFn(mRSC, s); 112709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 113709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 114cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#ifndef RS_COMPATIBILITY_LIB 115f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines void setLinkRuntimeCallback( 116f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines bcc::RSLinkRuntimeCallback pLinkRuntimeCallback) { 117f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines mLinkRuntimeCallback = pLinkRuntimeCallback; 118f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines } 119f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines bcc::RSLinkRuntimeCallback getLinkRuntimeCallback() { 120f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines return mLinkRuntimeCallback; 121f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines } 1221d476620399d54774e4fd386c1d23cc583d49522Stephen Hines 1231d476620399d54774e4fd386c1d23cc583d49522Stephen Hines void setSelectRTCallback(RSSelectRTCallback pSelectRTCallback) { 1241d476620399d54774e4fd386c1d23cc583d49522Stephen Hines mSelectRTCallback = pSelectRTCallback; 1251d476620399d54774e4fd386c1d23cc583d49522Stephen Hines } 1261d476620399d54774e4fd386c1d23cc583d49522Stephen Hines RSSelectRTCallback getSelectRTCallback() { 1271d476620399d54774e4fd386c1d23cc583d49522Stephen Hines return mSelectRTCallback; 1281d476620399d54774e4fd386c1d23cc583d49522Stephen Hines } 129cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#endif 130f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines virtual bool getInForEach() { return mInForEach; } 131709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 132709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected: 133709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Context *mRSC; 134709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t version_major; 135709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t version_minor; 136709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //bool mHasGraphics; 137709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool mInForEach; 138709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 139709a0978ae141198018ca9769f8d96292a8928e6Jason Sams struct Workers { 140709a0978ae141198018ca9769f8d96292a8928e6Jason Sams volatile int mRunningCount; 141709a0978ae141198018ca9769f8d96292a8928e6Jason Sams volatile int mLaunchCount; 142709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t mCount; 143709a0978ae141198018ca9769f8d96292a8928e6Jason Sams pthread_t *mThreadId; 144709a0978ae141198018ca9769f8d96292a8928e6Jason Sams pid_t *mNativeThreadId; 145709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Signal mCompleteSignal; 146709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Signal *mLaunchSignals; 147709a0978ae141198018ca9769f8d96292a8928e6Jason Sams WorkerCallback_t mLaunchCallback; 148709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void *mLaunchData; 149709a0978ae141198018ca9769f8d96292a8928e6Jason Sams }; 150709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Workers mWorkers; 151709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool mExit; 152709a0978ae141198018ca9769f8d96292a8928e6Jason Sams sym_lookup_t mSymLookupFn; 153709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script_lookup_t mScriptLookupFn; 154709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 155709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ScriptTLSStruct mTlsStruct; 156f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines 157cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#ifndef RS_COMPATIBILITY_LIB 158f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines bcc::RSLinkRuntimeCallback mLinkRuntimeCallback; 1591d476620399d54774e4fd386c1d23cc583d49522Stephen Hines RSSelectRTCallback mSelectRTCallback; 160cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#endif 161709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}; 162709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 163709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 164709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 165709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 166709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 167709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#endif 168