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 26005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines#include <string> 27005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines 28709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace bcc { 29709a0978ae141198018ca9769f8d96292a8928e6Jason Sams class BCCContext; 30709a0978ae141198018ca9769f8d96292a8928e6Jason Sams class RSCompilerDriver; 31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams class RSExecutable; 32709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 33709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 34709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android { 35709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript { 36709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 37cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailestypedef struct { 384b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes uint32_t eStride; 394b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes uint32_t yStride; 404b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes} StridePair; 414b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 424b3c34e6833e39bc89c2128002806b654b8e623dChris Wailestypedef struct { 43cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes const void *in; 44cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes void *out; 45cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes const void *usr; 46cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t usrLen; 47cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t x; 48cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t y; 49cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t z; 50cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t lod; 51cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes RsAllocationCubemapFace face; 52cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t ar[16]; 534b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 544b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes const void **ins; 554b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes uint32_t *eStrideIns; 564b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 57cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t lid; 58cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes 59cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t dimX; 60cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t dimY; 61cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t dimZ; 62cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t dimArray; 63cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes 64cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes const uint8_t *ptrIn; 65cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint8_t *ptrOut; 66cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t eStrideIn; 67cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t eStrideOut; 68cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t yStrideIn; 69cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t yStrideOut; 70cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes uint32_t slot; 714b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 724b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes const uint8_t** ptrIns; 734b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes StridePair* inStrides; 74cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes} RsForEachStubParamStruct; 75cb51798a0379409c0f9927c44bbcdd772ed7ec18Chris Wailes 76f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Samsextern bool gArchUseSIMD; 77709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 78709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (* InvokeFunc_t)(void); 79709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (* ForEachFunc_t)(void); 80709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef void (*WorkerCallback_t)(void *usr, uint32_t idx); 81709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 82709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptImpl; 83709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuReferenceImpl; 84709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 85709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef struct ScriptTLSStructRec { 86709a0978ae141198018ca9769f8d96292a8928e6Jason Sams android::renderscript::Context * mContext; 87709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const android::renderscript::Script * mScript; 88709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl *mImpl; 89709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} ScriptTLSStruct; 90709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 91709a0978ae141198018ca9769f8d96292a8928e6Jason Samstypedef struct { 92709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsForEachStubParamStruct fep; 93709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 94709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuReferenceImpl *rsc; 95709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl *script; 96709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 97709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ForEachFunc_t kernel; 98709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t sig; 99709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const Allocation * ain; 100709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Allocation * aout; 101709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 102709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t mSliceSize; 103709a0978ae141198018ca9769f8d96292a8928e6Jason Sams volatile int mSliceNum; 104709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool isThreadable; 105709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 106709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t xStart; 107709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t xEnd; 108709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t yStart; 109709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t yEnd; 110709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t zStart; 111709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t zEnd; 112709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t arrayStart; 113709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t arrayEnd; 1144b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 1154b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes // Multi-input data. 1164b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes const Allocation ** ains; 117709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} MTLaunchStruct; 118709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 119709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 120709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 121709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 122709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuReferenceImpl : public RsdCpuReference { 123709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic: 124709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual ~RsdCpuReferenceImpl(); 125709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuReferenceImpl(Context *); 126709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 127709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void lockMutex(); 128709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void unlockMutex(); 129709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 130709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool init(uint32_t version_major, uint32_t version_minor, sym_lookup_t, script_lookup_t); 131709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual void setPriority(int32_t priority); 132709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual void launchThreads(WorkerCallback_t cbk, void *data); 133709a0978ae141198018ca9769f8d96292a8928e6Jason Sams static void * helperThreadProc(void *vrsc); 134709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuScriptImpl * setTLS(RsdCpuScriptImpl *sc); 135709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 136709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Context * getContext() {return mRSC;} 137c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams uint32_t getThreadCount() const { 138c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams return mWorkers.mCount + 1; 139c44d6706868749abe37780fc28b2cc627ddcf269Jason Sams } 140709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 141709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void launchThreads(const Allocation * ain, Allocation * aout, 142709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const RsScriptCall *sc, MTLaunchStruct *mtls); 143709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 1444b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes void launchThreads(const Allocation** ains, uint32_t inLen, Allocation* aout, 1454b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes const RsScriptCall* sc, MTLaunchStruct* mtls); 1464b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes 147709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual CpuScript * createScript(const ScriptC *s, 148709a0978ae141198018ca9769f8d96292a8928e6Jason Sams char const *resName, char const *cacheDir, 149709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint8_t const *bitcode, size_t bitcodeSize, 150709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t flags); 151709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual CpuScript * createIntrinsic(const Script *s, 152709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsScriptIntrinsicID iid, Element *e); 153709a0978ae141198018ca9769f8d96292a8928e6Jason Sams virtual CpuScriptGroup * createScriptGroup(const ScriptGroup *sg); 154709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 155709a0978ae141198018ca9769f8d96292a8928e6Jason Sams const RsdCpuReference::CpuSymbol *symLookup(const char *); 156709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 157709a0978ae141198018ca9769f8d96292a8928e6Jason Sams RsdCpuReference::CpuScript * lookupScript(const Script *s) { 158709a0978ae141198018ca9769f8d96292a8928e6Jason Sams return mScriptLookupFn(mRSC, s); 159709a0978ae141198018ca9769f8d96292a8928e6Jason Sams } 160709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 161cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#ifndef RS_COMPATIBILITY_LIB 162f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines void setLinkRuntimeCallback( 163f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines bcc::RSLinkRuntimeCallback pLinkRuntimeCallback) { 164f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines mLinkRuntimeCallback = pLinkRuntimeCallback; 165f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines } 166f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines bcc::RSLinkRuntimeCallback getLinkRuntimeCallback() { 167f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines return mLinkRuntimeCallback; 168f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines } 1691d476620399d54774e4fd386c1d23cc583d49522Stephen Hines 1701d476620399d54774e4fd386c1d23cc583d49522Stephen Hines void setSelectRTCallback(RSSelectRTCallback pSelectRTCallback) { 1711d476620399d54774e4fd386c1d23cc583d49522Stephen Hines mSelectRTCallback = pSelectRTCallback; 1721d476620399d54774e4fd386c1d23cc583d49522Stephen Hines } 1731d476620399d54774e4fd386c1d23cc583d49522Stephen Hines RSSelectRTCallback getSelectRTCallback() { 1741d476620399d54774e4fd386c1d23cc583d49522Stephen Hines return mSelectRTCallback; 1751d476620399d54774e4fd386c1d23cc583d49522Stephen Hines } 176b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines 177b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines virtual void setSetupCompilerCallback( 178b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines RSSetupCompilerCallback pSetupCompilerCallback) { 179b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines mSetupCompilerCallback = pSetupCompilerCallback; 180b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines } 181b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines virtual RSSetupCompilerCallback getSetupCompilerCallback() const { 182b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines return mSetupCompilerCallback; 183b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines } 184005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines 185005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines virtual void setBccPluginName(const char *name) { 186005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines mBccPluginName.assign(name); 187005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines } 188005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines virtual const char *getBccPluginName() const { 189005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines return mBccPluginName.c_str(); 190005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines } 191cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#endif 192f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines virtual bool getInForEach() { return mInForEach; } 193709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 194709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected: 195709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Context *mRSC; 196709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t version_major; 197709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t version_minor; 198709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //bool mHasGraphics; 199709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool mInForEach; 200709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 201709a0978ae141198018ca9769f8d96292a8928e6Jason Sams struct Workers { 202709a0978ae141198018ca9769f8d96292a8928e6Jason Sams volatile int mRunningCount; 203709a0978ae141198018ca9769f8d96292a8928e6Jason Sams volatile int mLaunchCount; 204709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t mCount; 205709a0978ae141198018ca9769f8d96292a8928e6Jason Sams pthread_t *mThreadId; 206709a0978ae141198018ca9769f8d96292a8928e6Jason Sams pid_t *mNativeThreadId; 207709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Signal mCompleteSignal; 208709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Signal *mLaunchSignals; 209709a0978ae141198018ca9769f8d96292a8928e6Jason Sams WorkerCallback_t mLaunchCallback; 210709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void *mLaunchData; 211709a0978ae141198018ca9769f8d96292a8928e6Jason Sams }; 212709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Workers mWorkers; 213709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool mExit; 214709a0978ae141198018ca9769f8d96292a8928e6Jason Sams sym_lookup_t mSymLookupFn; 215709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script_lookup_t mScriptLookupFn; 216709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 217709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ScriptTLSStruct mTlsStruct; 218f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines 219cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#ifndef RS_COMPATIBILITY_LIB 220f218bf115af4ae4fd79adbb8842608b308a4cf07Stephen Hines bcc::RSLinkRuntimeCallback mLinkRuntimeCallback; 2211d476620399d54774e4fd386c1d23cc583d49522Stephen Hines RSSelectRTCallback mSelectRTCallback; 222b7d9c80c98fc96aa7c638e3124be24f13a6436b2Stephen Hines RSSetupCompilerCallback mSetupCompilerCallback; 223005113297b19ed256b6db9d6bc293ed9266899fcStephen Hines std::string mBccPluginName; 224cadfac411e6690e39de36c4f9e94deb9b7d2d08eJason Sams#endif 225709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}; 226709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 227709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 228709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 229709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 230709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 231709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#endif 232