1*e1eccf28SAndroid Build Coastguard Worker #ifndef CPU_REF_CPUSCRIPTGROUP2IMPL_H_ 2*e1eccf28SAndroid Build Coastguard Worker #define CPU_REF_CPUSCRIPTGROUP2IMPL_H_ 3*e1eccf28SAndroid Build Coastguard Worker 4*e1eccf28SAndroid Build Coastguard Worker #include "rsd_cpu.h" 5*e1eccf28SAndroid Build Coastguard Worker #include "rsList.h" 6*e1eccf28SAndroid Build Coastguard Worker 7*e1eccf28SAndroid Build Coastguard Worker struct RsExpandKernelDriverInfo; 8*e1eccf28SAndroid Build Coastguard Worker 9*e1eccf28SAndroid Build Coastguard Worker namespace android { 10*e1eccf28SAndroid Build Coastguard Worker namespace renderscript { 11*e1eccf28SAndroid Build Coastguard Worker 12*e1eccf28SAndroid Build Coastguard Worker class Closure; 13*e1eccf28SAndroid Build Coastguard Worker class RsdCpuScriptImpl; 14*e1eccf28SAndroid Build Coastguard Worker class RsdCpuReferenceImpl; 15*e1eccf28SAndroid Build Coastguard Worker class ScriptExecutable; 16*e1eccf28SAndroid Build Coastguard Worker class ScriptGroup2; 17*e1eccf28SAndroid Build Coastguard Worker 18*e1eccf28SAndroid Build Coastguard Worker typedef void (*ExpandFuncTy)(const RsExpandKernelDriverInfo*, uint32_t, uint32_t, 19*e1eccf28SAndroid Build Coastguard Worker uint32_t); 20*e1eccf28SAndroid Build Coastguard Worker typedef void (*InvokeFuncTy)(const void*, uint32_t); 21*e1eccf28SAndroid Build Coastguard Worker 22*e1eccf28SAndroid Build Coastguard Worker class CPUClosure { 23*e1eccf28SAndroid Build Coastguard Worker public: CPUClosure(const Closure * closure,RsdCpuScriptImpl * si,ExpandFuncTy func)24*e1eccf28SAndroid Build Coastguard Worker CPUClosure(const Closure* closure, RsdCpuScriptImpl* si, ExpandFuncTy func) : 25*e1eccf28SAndroid Build Coastguard Worker mClosure(closure), mSi(si), mFunc(func) {} 26*e1eccf28SAndroid Build Coastguard Worker CPUClosure(const Closure * closure,RsdCpuScriptImpl * si)27*e1eccf28SAndroid Build Coastguard Worker CPUClosure(const Closure* closure, RsdCpuScriptImpl* si) : 28*e1eccf28SAndroid Build Coastguard Worker mClosure(closure), mSi(si), mFunc(nullptr) {} 29*e1eccf28SAndroid Build Coastguard Worker 30*e1eccf28SAndroid Build Coastguard Worker // It's important to do forwarding here than inheritance for unbound value 31*e1eccf28SAndroid Build Coastguard Worker // binding to work. 32*e1eccf28SAndroid Build Coastguard Worker const Closure* mClosure; 33*e1eccf28SAndroid Build Coastguard Worker RsdCpuScriptImpl* mSi; 34*e1eccf28SAndroid Build Coastguard Worker const ExpandFuncTy mFunc; 35*e1eccf28SAndroid Build Coastguard Worker }; 36*e1eccf28SAndroid Build Coastguard Worker 37*e1eccf28SAndroid Build Coastguard Worker class CpuScriptGroup2Impl; 38*e1eccf28SAndroid Build Coastguard Worker 39*e1eccf28SAndroid Build Coastguard Worker class Batch { 40*e1eccf28SAndroid Build Coastguard Worker public: 41*e1eccf28SAndroid Build Coastguard Worker Batch(CpuScriptGroup2Impl* group, const char* name); 42*e1eccf28SAndroid Build Coastguard Worker ~Batch(); 43*e1eccf28SAndroid Build Coastguard Worker 44*e1eccf28SAndroid Build Coastguard Worker // Returns true if closure depends on any closure in this batch for a global 45*e1eccf28SAndroid Build Coastguard Worker // variable 46*e1eccf28SAndroid Build Coastguard Worker bool conflict(CPUClosure* closure) const; 47*e1eccf28SAndroid Build Coastguard Worker 48*e1eccf28SAndroid Build Coastguard Worker void resolveFuncPtr(void* sharedObj); 49*e1eccf28SAndroid Build Coastguard Worker void setGlobalsForBatch(); 50*e1eccf28SAndroid Build Coastguard Worker void run(); 51*e1eccf28SAndroid Build Coastguard Worker size()52*e1eccf28SAndroid Build Coastguard Worker size_t size() const { return mClosures.size(); } 53*e1eccf28SAndroid Build Coastguard Worker 54*e1eccf28SAndroid Build Coastguard Worker CpuScriptGroup2Impl* mGroup; 55*e1eccf28SAndroid Build Coastguard Worker List<CPUClosure*> mClosures; 56*e1eccf28SAndroid Build Coastguard Worker char* mName; 57*e1eccf28SAndroid Build Coastguard Worker void* mFunc; 58*e1eccf28SAndroid Build Coastguard Worker }; 59*e1eccf28SAndroid Build Coastguard Worker 60*e1eccf28SAndroid Build Coastguard Worker class CpuScriptGroup2Impl : public RsdCpuReference::CpuScriptGroup2 { 61*e1eccf28SAndroid Build Coastguard Worker public: 62*e1eccf28SAndroid Build Coastguard Worker CpuScriptGroup2Impl(RsdCpuReferenceImpl *cpuRefImpl, const ScriptGroupBase* group); 63*e1eccf28SAndroid Build Coastguard Worker ~CpuScriptGroup2Impl() override; 64*e1eccf28SAndroid Build Coastguard Worker 65*e1eccf28SAndroid Build Coastguard Worker bool init(); 66*e1eccf28SAndroid Build Coastguard Worker void execute() override; 67*e1eccf28SAndroid Build Coastguard Worker getCpuRefImpl()68*e1eccf28SAndroid Build Coastguard Worker RsdCpuReferenceImpl* getCpuRefImpl() const { return mCpuRefImpl; } getExecutable()69*e1eccf28SAndroid Build Coastguard Worker ScriptExecutable* getExecutable() const { return mExecutable; } 70*e1eccf28SAndroid Build Coastguard Worker 71*e1eccf28SAndroid Build Coastguard Worker void compile(const char* cacheDir); 72*e1eccf28SAndroid Build Coastguard Worker 73*e1eccf28SAndroid Build Coastguard Worker private: 74*e1eccf28SAndroid Build Coastguard Worker RsdCpuReferenceImpl* mCpuRefImpl; 75*e1eccf28SAndroid Build Coastguard Worker const ScriptGroup2* mGroup; 76*e1eccf28SAndroid Build Coastguard Worker List<Batch*> mBatches; 77*e1eccf28SAndroid Build Coastguard Worker ScriptExecutable* mExecutable; 78*e1eccf28SAndroid Build Coastguard Worker void* mScriptObj; 79*e1eccf28SAndroid Build Coastguard Worker }; 80*e1eccf28SAndroid Build Coastguard Worker 81*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript 82*e1eccf28SAndroid Build Coastguard Worker } // namespace android 83*e1eccf28SAndroid Build Coastguard Worker 84*e1eccf28SAndroid Build Coastguard Worker #endif // CPU_REF_CPUSCRIPTGROUP2IMPL_H_ 85