blob: eaeeff575f24edf5148217e7b786c616cde996af [file] [log] [blame]
Yang Ni1ffd86b2015-01-07 09:16:40 -08001#ifndef CPU_REF_CPUSCRIPTGROUP2IMPL_H_
2#define CPU_REF_CPUSCRIPTGROUP2IMPL_H_
3
Yang Ni1ffd86b2015-01-07 09:16:40 -08004#include "rsd_cpu.h"
Yang Niff2bb542015-02-02 14:33:47 -08005#include "rsList.h"
Yang Ni1ffd86b2015-01-07 09:16:40 -08006
David Grossb0abb142015-03-12 15:23:03 -07007struct RsExpandKernelDriverInfo;
David Grossdced5c92015-03-11 16:12:42 -07008
Yang Ni1ffd86b2015-01-07 09:16:40 -08009namespace android {
10namespace renderscript {
11
12class Closure;
13class RsdCpuScriptImpl;
14class RsdCpuReferenceImpl;
Yang Nida0f0692015-01-12 13:03:40 -080015class ScriptExecutable;
Yang Ni1ffd86b2015-01-07 09:16:40 -080016class ScriptGroup2;
17
David Grossb0abb142015-03-12 15:23:03 -070018typedef void (*ExpandFuncTy)(const RsExpandKernelDriverInfo*, uint32_t, uint32_t,
Yang Ni1ffd86b2015-01-07 09:16:40 -080019 uint32_t);
Yang Nieb9aa672015-01-27 14:32:25 -080020typedef void (*InvokeFuncTy)(const void*, uint32_t);
Yang Ni1ffd86b2015-01-07 09:16:40 -080021
22class CPUClosure {
Yang Nieb9aa672015-01-27 14:32:25 -080023public:
Yang Ni062c2872015-02-20 15:20:00 -080024 CPUClosure(const Closure* closure, RsdCpuScriptImpl* si, ExpandFuncTy func) :
25 mClosure(closure), mSi(si), mFunc(func) {}
Yang Ni1ffd86b2015-01-07 09:16:40 -080026
Yang Nieb9aa672015-01-27 14:32:25 -080027 CPUClosure(const Closure* closure, RsdCpuScriptImpl* si) :
Yang Ni062c2872015-02-20 15:20:00 -080028 mClosure(closure), mSi(si), mFunc(nullptr) {}
Yang Nieb9aa672015-01-27 14:32:25 -080029
30 // It's important to do forwarding here than inheritance for unbound value
31 // binding to work.
32 const Closure* mClosure;
33 RsdCpuScriptImpl* mSi;
34 const ExpandFuncTy mFunc;
Yang Ni1ffd86b2015-01-07 09:16:40 -080035};
36
Yang Nida0f0692015-01-12 13:03:40 -080037class CpuScriptGroup2Impl;
38
39class Batch {
Yang Nieb9aa672015-01-27 14:32:25 -080040public:
Yang Ni062c2872015-02-20 15:20:00 -080041 Batch(CpuScriptGroup2Impl* group, const char* name);
Yang Nieb9aa672015-01-27 14:32:25 -080042 ~Batch();
Yang Nida0f0692015-01-12 13:03:40 -080043
Yang Nieb9aa672015-01-27 14:32:25 -080044 // Returns true if closure depends on any closure in this batch for a global
45 // variable
46 bool conflict(CPUClosure* closure) const;
Yang Nida0f0692015-01-12 13:03:40 -080047
Yang Ni062c2872015-02-20 15:20:00 -080048 void resolveFuncPtr(void* sharedObj);
Yang Nieb9aa672015-01-27 14:32:25 -080049 void setGlobalsForBatch();
50 void run();
Yang Nida0f0692015-01-12 13:03:40 -080051
Yang Ni062c2872015-02-20 15:20:00 -080052 size_t size() const { return mClosures.size(); }
53
Yang Nieb9aa672015-01-27 14:32:25 -080054 CpuScriptGroup2Impl* mGroup;
Yang Niff2bb542015-02-02 14:33:47 -080055 List<CPUClosure*> mClosures;
Yang Ni062c2872015-02-20 15:20:00 -080056 char* mName;
57 void* mFunc;
Yang Nida0f0692015-01-12 13:03:40 -080058};
59
Yang Ni1ffd86b2015-01-07 09:16:40 -080060class CpuScriptGroup2Impl : public RsdCpuReference::CpuScriptGroup2 {
Yang Nieb9aa672015-01-27 14:32:25 -080061public:
62 CpuScriptGroup2Impl(RsdCpuReferenceImpl *cpuRefImpl, const ScriptGroupBase* group);
Stephen Hinesc060f142015-05-13 19:26:09 -070063 ~CpuScriptGroup2Impl() override;
Yang Ni1ffd86b2015-01-07 09:16:40 -080064
Yang Nieb9aa672015-01-27 14:32:25 -080065 bool init();
Stephen Hinesc060f142015-05-13 19:26:09 -070066 void execute() override;
Yang Ni1ffd86b2015-01-07 09:16:40 -080067
Yang Nieb9aa672015-01-27 14:32:25 -080068 RsdCpuReferenceImpl* getCpuRefImpl() const { return mCpuRefImpl; }
Yang Ni062c2872015-02-20 15:20:00 -080069 ScriptExecutable* getExecutable() const { return mExecutable; }
70
71 void compile(const char* cacheDir);
Yang Ni1ffd86b2015-01-07 09:16:40 -080072
Yang Nieb9aa672015-01-27 14:32:25 -080073private:
74 RsdCpuReferenceImpl* mCpuRefImpl;
75 const ScriptGroup2* mGroup;
Yang Niff2bb542015-02-02 14:33:47 -080076 List<Batch*> mBatches;
Yang Ni062c2872015-02-20 15:20:00 -080077 ScriptExecutable* mExecutable;
78 void* mScriptObj;
Yang Ni1ffd86b2015-01-07 09:16:40 -080079};
80
81} // namespace renderscript
82} // namespace android
83
84#endif // CPU_REF_CPUSCRIPTGROUP2IMPL_H_