rsCpuCore.h revision b7d9c80c98fc96aa7c638e3124be24f13a6436b2
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 35709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 36709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (* InvokeFunc_t)(void); 37709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (* ForEachFunc_t)(void); 38709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (*WorkerCallback_t)(void *usr, uint32_t idx); 39709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 40709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptImpl; 41709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuReferenceImpl; 42709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 43709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef struct ScriptTLSStructRec { 44709a0978ae141198018ca9769f8d96292a8928e6Jason Sams android::renderscript::Context * mContext; 45709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const android::renderscript::Script * mScript; 46709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl *mImpl; 47709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} ScriptTLSStruct; 48709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 49709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef struct { 50709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsForEachStubParamStruct fep; 51709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 52709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuReferenceImpl *rsc; 53709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl *script; 54709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 55709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ForEachFunc_t kernel; 56709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t sig; 57709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const Allocation * ain; 58709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Allocation * aout; 59709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 60709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t mSliceSize; 61709a0978ae141198018ca9769f8d96292a8928e6Jason Sams volatile int mSliceNum; 62709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool isThreadable; 63709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 64709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t xStart; 65709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t xEnd; 66709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t yStart; 67709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t yEnd; 68709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t zStart; 69709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t zEnd; 70709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t arrayStart; 71709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t arrayEnd; 72709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} MTLaunchStruct; 73709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 74709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 75709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 76709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 77709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuReferenceImpl : public RsdCpuReference { 78709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic: 79709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual ~RsdCpuReferenceImpl(); 80709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuReferenceImpl(Context *); 81709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 82709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void lockMutex(); 83709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void unlockMutex(); 84709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 85709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool init(uint32_t version_major, uint32_t version_minor, sym_lookup_t, script_lookup_t); 86709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual void setPriority(int32_t priority); 87709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual void launchThreads(WorkerCallback_t cbk, void *data); 88709a0978ae141198018ca9769f8d96292a8928e6Jason Sams static void * helperThreadProc(void *vrsc); 89709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl * setTLS(RsdCpuScriptImpl *sc); 90709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 91709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Context * getContext() {return mRSC;} 92c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams uint32_t getThreadCount() const { 93c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams return mWorkers.mCount + 1; 94c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams } 95709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 96709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void launchThreads(const Allocation * ain, Allocation * aout, 97709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const RsScriptCall *sc, MTLaunchStruct *mtls); 98709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 99709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual CpuScript * createScript(const ScriptC *s, 100709a0978ae141198018ca9769f8d96292a8928e6Jason Sams char const *resName, char const *cacheDir, 101709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint8_t const *bitcode, size_t bitcodeSize, 102709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t flags); 103709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual CpuScript * createIntrinsic(const Script *s, 104709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsScriptIntrinsicID iid, Element *e); 105709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual CpuScriptGroup * createScriptGroup(const ScriptGroup *sg); 106709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 107709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const RsdCpuReference::CpuSymbol *symLookup(const char *); 108709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 109709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuReference::CpuScript * lookupScript(const Script *s) { 110709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return mScriptLookupFn(mRSC, s); 111709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 112709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 113cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#ifndef RS_COMPATIBILITY_LIB 114f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines void setLinkRuntimeCallback( 115f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines bcc::RSLinkRuntimeCallback pLinkRuntimeCallback) { 116f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines mLinkRuntimeCallback = pLinkRuntimeCallback; 117f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines } 118f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines bcc::RSLinkRuntimeCallback getLinkRuntimeCallback() { 119f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines return mLinkRuntimeCallback; 120f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines } 1211d476620399d54774e4fd386c1d23cc583d49522Stephen Hines 1221d476620399d54774e4fd386c1d23cc583d49522Stephen Hines void setSelectRTCallback(RSSelectRTCallback pSelectRTCallback) { 1231d476620399d54774e4fd386c1d23cc583d49522Stephen Hines mSelectRTCallback = pSelectRTCallback; 1241d476620399d54774e4fd386c1d23cc583d49522Stephen Hines } 1251d476620399d54774e4fd386c1d23cc583d49522Stephen Hines RSSelectRTCallback getSelectRTCallback() { 1261d476620399d54774e4fd386c1d23cc583d49522Stephen Hines return mSelectRTCallback; 1271d476620399d54774e4fd386c1d23cc583d49522Stephen Hines } 128b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines 129b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines virtual void setSetupCompilerCallback( 130b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines RSSetupCompilerCallback pSetupCompilerCallback) { 131b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines mSetupCompilerCallback = pSetupCompilerCallback; 132b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines } 133b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines virtual RSSetupCompilerCallback getSetupCompilerCallback() const { 134b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines return mSetupCompilerCallback; 135b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines } 136cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#endif 137f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines virtual bool getInForEach() { return mInForEach; } 138709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 139709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected: 140709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Context *mRSC; 141709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t version_major; 142709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t version_minor; 143709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //bool mHasGraphics; 144709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool mInForEach; 145709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 146709a0978ae141198018ca9769f8d96292a8928e6Jason Sams struct Workers { 147709a0978ae141198018ca9769f8d96292a8928e6Jason Sams volatile int mRunningCount; 148709a0978ae141198018ca9769f8d96292a8928e6Jason Sams volatile int mLaunchCount; 149709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t mCount; 150709a0978ae141198018ca9769f8d96292a8928e6Jason Sams pthread_t *mThreadId; 151709a0978ae141198018ca9769f8d96292a8928e6Jason Sams pid_t *mNativeThreadId; 152709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Signal mCompleteSignal; 153709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Signal *mLaunchSignals; 154709a0978ae141198018ca9769f8d96292a8928e6Jason Sams WorkerCallback_t mLaunchCallback; 155709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void *mLaunchData; 156709a0978ae141198018ca9769f8d96292a8928e6Jason Sams }; 157709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Workers mWorkers; 158709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool mExit; 159709a0978ae141198018ca9769f8d96292a8928e6Jason Sams sym_lookup_t mSymLookupFn; 160709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script_lookup_t mScriptLookupFn; 161709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 162709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ScriptTLSStruct mTlsStruct; 163f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines 164cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#ifndef RS_COMPATIBILITY_LIB 165f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines bcc::RSLinkRuntimeCallback mLinkRuntimeCallback; 1661d476620399d54774e4fd386c1d23cc583d49522Stephen Hines RSSelectRTCallback mSelectRTCallback; 167b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines RSSetupCompilerCallback mSetupCompilerCallback; 168cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#endif 169709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}; 170709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 171709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 172709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 173709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 174709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 175709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#endif 176