rsCpuCore.h revision c44d6706868749abe37780fc28b2cc627ddcf269
185ec0d676297724f211213c7cb188839f1d3601bSteve McKay/* 285ec0d676297724f211213c7cb188839f1d3601bSteve McKay * Copyright (C) 2012 The Android Open Source Project 385ec0d676297724f211213c7cb188839f1d3601bSteve McKay * 485ec0d676297724f211213c7cb188839f1d3601bSteve McKay * Licensed under the Apache License, Version 2.0 (the "License"); 585ec0d676297724f211213c7cb188839f1d3601bSteve McKay * you may not use this file except in compliance with the License. 685ec0d676297724f211213c7cb188839f1d3601bSteve McKay * You may obtain a copy of the License at 785ec0d676297724f211213c7cb188839f1d3601bSteve McKay * 885ec0d676297724f211213c7cb188839f1d3601bSteve McKay * http://www.apache.org/licenses/LICENSE-2.0 985ec0d676297724f211213c7cb188839f1d3601bSteve McKay * 1085ec0d676297724f211213c7cb188839f1d3601bSteve McKay * Unless required by applicable law or agreed to in writing, software 1185ec0d676297724f211213c7cb188839f1d3601bSteve McKay * distributed under the License is distributed on an "AS IS" BASIS, 1285ec0d676297724f211213c7cb188839f1d3601bSteve McKay * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1385ec0d676297724f211213c7cb188839f1d3601bSteve McKay * See the License for the specific language governing permissions and 1485ec0d676297724f211213c7cb188839f1d3601bSteve McKay * limitations under the License. 1585ec0d676297724f211213c7cb188839f1d3601bSteve McKay */ 1685ec0d676297724f211213c7cb188839f1d3601bSteve McKay 17ae84a18a1fa5dc020fd25a963cb0955c8c31bfefSteve McKay#ifndef RSD_CPU_CORE_H 1885ec0d676297724f211213c7cb188839f1d3601bSteve McKay#define RSD_CPU_CORE_H 1985ec0d676297724f211213c7cb188839f1d3601bSteve McKay 2085ec0d676297724f211213c7cb188839f1d3601bSteve McKay#include "rsd_cpu.h" 2185ec0d676297724f211213c7cb188839f1d3601bSteve McKay#include "rsSignal.h" 2285ec0d676297724f211213c7cb188839f1d3601bSteve McKay#include "rsContext.h" 238ff27d68c04b96f89076675de17cc268c433d5dcGarfield Tan#include "rsElement.h" 248ff27d68c04b96f89076675de17cc268c433d5dcGarfield Tan#include "rsScriptC.h" 2585ec0d676297724f211213c7cb188839f1d3601bSteve McKay 2685ec0d676297724f211213c7cb188839f1d3601bSteve McKaynamespace bcc { 2785ec0d676297724f211213c7cb188839f1d3601bSteve McKay class BCCContext; 2885ec0d676297724f211213c7cb188839f1d3601bSteve McKay class RSCompilerDriver; 29b6006b2ef723fdbb3fef3b4a350c8d363b127d0fSteve McKay class RSExecutable; 3016e0c1fcf2be1ac7daafa6cb2c1c97d751ca3e66Steve McKay} 3185ec0d676297724f211213c7cb188839f1d3601bSteve McKay 3285ec0d676297724f211213c7cb188839f1d3601bSteve McKaynamespace android { 33b6006b2ef723fdbb3fef3b4a350c8d363b127d0fSteve McKaynamespace renderscript { 3485ec0d676297724f211213c7cb188839f1d3601bSteve McKay 3585ec0d676297724f211213c7cb188839f1d3601bSteve McKay 36b6006b2ef723fdbb3fef3b4a350c8d363b127d0fSteve McKaytypedef void (* InvokeFunc_t)(void); 3785ec0d676297724f211213c7cb188839f1d3601bSteve McKaytypedef void (* ForEachFunc_t)(void); 3885ec0d676297724f211213c7cb188839f1d3601bSteve McKaytypedef void (*WorkerCallback_t)(void *usr, uint32_t idx); 3985ec0d676297724f211213c7cb188839f1d3601bSteve McKay 4085ec0d676297724f211213c7cb188839f1d3601bSteve McKayclass RsdCpuScriptImpl; 4185ec0d676297724f211213c7cb188839f1d3601bSteve McKayclass RsdCpuReferenceImpl; 4285ec0d676297724f211213c7cb188839f1d3601bSteve McKay 4385ec0d676297724f211213c7cb188839f1d3601bSteve McKaytypedef struct ScriptTLSStructRec { 4485ec0d676297724f211213c7cb188839f1d3601bSteve McKay android::renderscript::Context * mContext; 4585ec0d676297724f211213c7cb188839f1d3601bSteve McKay const android::renderscript::Script * mScript; 4685ec0d676297724f211213c7cb188839f1d3601bSteve McKay RsdCpuScriptImpl *mImpl; 4785ec0d676297724f211213c7cb188839f1d3601bSteve McKay} ScriptTLSStruct; 4885ec0d676297724f211213c7cb188839f1d3601bSteve McKay 4985ec0d676297724f211213c7cb188839f1d3601bSteve McKaytypedef struct { 5085ec0d676297724f211213c7cb188839f1d3601bSteve McKay RsForEachStubParamStruct fep; 5185ec0d676297724f211213c7cb188839f1d3601bSteve McKay 5285ec0d676297724f211213c7cb188839f1d3601bSteve McKay RsdCpuReferenceImpl *rsc; 5385ec0d676297724f211213c7cb188839f1d3601bSteve McKay RsdCpuScriptImpl *script; 5485ec0d676297724f211213c7cb188839f1d3601bSteve McKay 5585ec0d676297724f211213c7cb188839f1d3601bSteve McKay ForEachFunc_t kernel; 5685ec0d676297724f211213c7cb188839f1d3601bSteve McKay uint32_t sig; 5785ec0d676297724f211213c7cb188839f1d3601bSteve McKay const Allocation * ain; 5885ec0d676297724f211213c7cb188839f1d3601bSteve McKay Allocation * aout; 5985ec0d676297724f211213c7cb188839f1d3601bSteve McKay 6085ec0d676297724f211213c7cb188839f1d3601bSteve McKay uint32_t mSliceSize; 6185ec0d676297724f211213c7cb188839f1d3601bSteve McKay volatile int mSliceNum; 6285ec0d676297724f211213c7cb188839f1d3601bSteve McKay bool isThreadable; 6385ec0d676297724f211213c7cb188839f1d3601bSteve McKay 6485ec0d676297724f211213c7cb188839f1d3601bSteve McKay uint32_t xStart; 6585ec0d676297724f211213c7cb188839f1d3601bSteve McKay uint32_t xEnd; 6685ec0d676297724f211213c7cb188839f1d3601bSteve McKay uint32_t yStart; 6785ec0d676297724f211213c7cb188839f1d3601bSteve McKay uint32_t yEnd; 6885ec0d676297724f211213c7cb188839f1d3601bSteve McKay uint32_t zStart; 6985ec0d676297724f211213c7cb188839f1d3601bSteve McKay uint32_t zEnd; 7085ec0d676297724f211213c7cb188839f1d3601bSteve McKay uint32_t arrayStart; 7185ec0d676297724f211213c7cb188839f1d3601bSteve McKay uint32_t arrayEnd; 7285ec0d676297724f211213c7cb188839f1d3601bSteve McKay} MTLaunchStruct; 7385ec0d676297724f211213c7cb188839f1d3601bSteve McKay 74 75 76 77class RsdCpuReferenceImpl : public RsdCpuReference { 78public: 79 virtual ~RsdCpuReferenceImpl(); 80 RsdCpuReferenceImpl(Context *); 81 82 void lockMutex(); 83 void unlockMutex(); 84 85 bool init(uint32_t version_major, uint32_t version_minor, sym_lookup_t, script_lookup_t); 86 virtual void setPriority(int32_t priority); 87 virtual void launchThreads(WorkerCallback_t cbk, void *data); 88 static void * helperThreadProc(void *vrsc); 89 RsdCpuScriptImpl * setTLS(RsdCpuScriptImpl *sc); 90 91 Context * getContext() {return mRSC;} 92 uint32_t getThreadCount() const { 93 return mWorkers.mCount + 1; 94 } 95 96 void launchThreads(const Allocation * ain, Allocation * aout, 97 const RsScriptCall *sc, MTLaunchStruct *mtls); 98 99 virtual CpuScript * createScript(const ScriptC *s, 100 char const *resName, char const *cacheDir, 101 uint8_t const *bitcode, size_t bitcodeSize, 102 uint32_t flags); 103 virtual CpuScript * createIntrinsic(const Script *s, 104 RsScriptIntrinsicID iid, Element *e); 105 virtual CpuScriptGroup * createScriptGroup(const ScriptGroup *sg); 106 107 const RsdCpuReference::CpuSymbol *symLookup(const char *); 108 109 RsdCpuReference::CpuScript * lookupScript(const Script *s) { 110 return mScriptLookupFn(mRSC, s); 111 } 112 113 114protected: 115 Context *mRSC; 116 uint32_t version_major; 117 uint32_t version_minor; 118 //bool mHasGraphics; 119 bool mInForEach; 120 121 struct Workers { 122 volatile int mRunningCount; 123 volatile int mLaunchCount; 124 uint32_t mCount; 125 pthread_t *mThreadId; 126 pid_t *mNativeThreadId; 127 Signal mCompleteSignal; 128 Signal *mLaunchSignals; 129 WorkerCallback_t mLaunchCallback; 130 void *mLaunchData; 131 }; 132 Workers mWorkers; 133 bool mExit; 134 sym_lookup_t mSymLookupFn; 135 script_lookup_t mScriptLookupFn; 136 137 ScriptTLSStruct mTlsStruct; 138}; 139 140 141} 142} 143 144#endif 145