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