xref: /aosp_15_r20/frameworks/rs/cpu_ref/rsCpuScriptGroup2.h (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
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