rsCpuScriptGroup2.h revision ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0d
11ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#ifndef CPU_REF_CPUSCRIPTGROUP2IMPL_H_
21ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#define CPU_REF_CPUSCRIPTGROUP2IMPL_H_
31ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
41ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#include "rsd_cpu.h"
5ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni#include "rsList.h"
61ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
71ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ninamespace android {
81ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ninamespace renderscript {
91ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
101ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass Closure;
111ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass RsdCpuScriptImpl;
121ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass RsdCpuReferenceImpl;
13da0f069871343119251d6b0586be356dc2146a62Yang Niclass ScriptExecutable;
141ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass ScriptGroup2;
151ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
161ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nistruct RsExpandKernelParams;
171ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
181ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nitypedef void (*ExpandFuncTy)(const RsExpandKernelParams*, uint32_t, uint32_t,
191ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni                             uint32_t);
20eb9aa675754c49f613c6ad71d41472b30f38b007Yang Nitypedef void (*InvokeFuncTy)(const void*, uint32_t);
211ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
221ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass CPUClosure {
23eb9aa675754c49f613c6ad71d41472b30f38b007Yang Nipublic:
24eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    CPUClosure(const Closure* closure, RsdCpuScriptImpl* si, ExpandFuncTy func,
25eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni               const void* usrPtr, const size_t usrSize) :
26eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        mClosure(closure), mSi(si), mFunc(func),
27eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        mUsrPtr(usrPtr), mUsrSize(usrSize) {}
28eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni
29eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    CPUClosure(const Closure* closure, RsdCpuScriptImpl* si) :
30eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        mClosure(closure), mSi(si), mFunc(nullptr),
31eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        mUsrPtr(nullptr), mUsrSize(0) {}
32eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni
33eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    // It's important to do forwarding here than inheritance for unbound value
34eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    // binding to work.
35eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    const Closure* mClosure;
36eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    RsdCpuScriptImpl* mSi;
37eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    const ExpandFuncTy mFunc;
38eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    const void* mUsrPtr;
39eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    const size_t mUsrSize;
401ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni};
411ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
42da0f069871343119251d6b0586be356dc2146a62Yang Niclass CpuScriptGroup2Impl;
43da0f069871343119251d6b0586be356dc2146a62Yang Ni
44da0f069871343119251d6b0586be356dc2146a62Yang Niclass Batch {
45eb9aa675754c49f613c6ad71d41472b30f38b007Yang Nipublic:
46eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    Batch(CpuScriptGroup2Impl* group) : mGroup(group), mExecutable(nullptr) {}
47da0f069871343119251d6b0586be356dc2146a62Yang Ni
48eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    ~Batch();
49da0f069871343119251d6b0586be356dc2146a62Yang Ni
50eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    // Returns true if closure depends on any closure in this batch for a global
51eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    // variable
52eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    bool conflict(CPUClosure* closure) const;
53da0f069871343119251d6b0586be356dc2146a62Yang Ni
54eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    void tryToCreateFusedKernel(const char* cacheDir);
55eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    void setGlobalsForBatch();
56eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    void run();
57da0f069871343119251d6b0586be356dc2146a62Yang Ni
58eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    CpuScriptGroup2Impl* mGroup;
59eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    ScriptExecutable* mExecutable;
60eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    void* mScriptObj;
61ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni    List<CPUClosure*> mClosures;
62da0f069871343119251d6b0586be356dc2146a62Yang Ni};
63da0f069871343119251d6b0586be356dc2146a62Yang Ni
641ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass CpuScriptGroup2Impl : public RsdCpuReference::CpuScriptGroup2 {
65eb9aa675754c49f613c6ad71d41472b30f38b007Yang Nipublic:
66eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    CpuScriptGroup2Impl(RsdCpuReferenceImpl *cpuRefImpl, const ScriptGroupBase* group);
67eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    virtual ~CpuScriptGroup2Impl();
681ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
69eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    bool init();
70eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    virtual void execute();
711ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
72eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    RsdCpuReferenceImpl* getCpuRefImpl() const { return mCpuRefImpl; }
731ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
74eb9aa675754c49f613c6ad71d41472b30f38b007Yang Niprivate:
75eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    RsdCpuReferenceImpl* mCpuRefImpl;
76eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    const ScriptGroup2* mGroup;
77ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni    List<Batch*> mBatches;
781ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni};
791ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
801ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni}  // namespace renderscript
811ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni}  // namespace android
821ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
831ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#endif  // CPU_REF_CPUSCRIPTGROUP2IMPL_H_
84