rsCpuCore.h revision c44d6706868749abe37780fc28b2cc627ddcf269
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 113709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 114709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected: 115709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Context *mRSC; 116709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t version_major; 117709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t version_minor; 118709a0978ae141198018ca9769f8d96292a8928e6Jason Sams //bool mHasGraphics; 119709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool mInForEach; 120709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 121709a0978ae141198018ca9769f8d96292a8928e6Jason Sams struct Workers { 122709a0978ae141198018ca9769f8d96292a8928e6Jason Sams volatile int mRunningCount; 123709a0978ae141198018ca9769f8d96292a8928e6Jason Sams volatile int mLaunchCount; 124709a0978ae141198018ca9769f8d96292a8928e6Jason Sams uint32_t mCount; 125709a0978ae141198018ca9769f8d96292a8928e6Jason Sams pthread_t *mThreadId; 126709a0978ae141198018ca9769f8d96292a8928e6Jason Sams pid_t *mNativeThreadId; 127709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Signal mCompleteSignal; 128709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Signal *mLaunchSignals; 129709a0978ae141198018ca9769f8d96292a8928e6Jason Sams WorkerCallback_t mLaunchCallback; 130709a0978ae141198018ca9769f8d96292a8928e6Jason Sams void *mLaunchData; 131709a0978ae141198018ca9769f8d96292a8928e6Jason Sams }; 132709a0978ae141198018ca9769f8d96292a8928e6Jason Sams Workers mWorkers; 133709a0978ae141198018ca9769f8d96292a8928e6Jason Sams bool mExit; 134709a0978ae141198018ca9769f8d96292a8928e6Jason Sams sym_lookup_t mSymLookupFn; 135709a0978ae141198018ca9769f8d96292a8928e6Jason Sams script_lookup_t mScriptLookupFn; 136709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 137709a0978ae141198018ca9769f8d96292a8928e6Jason Sams ScriptTLSStruct mTlsStruct; 138709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}; 139709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 140709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 141709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 142709a0978ae141198018ca9769f8d96292a8928e6Jason Sams} 143709a0978ae141198018ca9769f8d96292a8928e6Jason Sams 144709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#endif 145