rsCpuScriptGroup2.h revision eb9aa675754c49f613c6ad71d41472b30f38b007
11ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#ifndef CPU_REF_CPUSCRIPTGROUP2IMPL_H_
21ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#define CPU_REF_CPUSCRIPTGROUP2IMPL_H_
31ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
41ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#include <list>
51ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
61ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#include "rsd_cpu.h"
71ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
81ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niusing std::list;
91ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
101ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ninamespace android {
111ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ninamespace renderscript {
121ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
131ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass Closure;
141ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass RsdCpuScriptImpl;
151ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass RsdCpuReferenceImpl;
16da0f069871343119251d6b0586be356dc2146a62Yang Niclass ScriptExecutable;
171ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass ScriptGroup2;
181ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
191ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nistruct RsExpandKernelParams;
201ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
211ffd86b448d78366190c540f98f8b6d641cdb6cfYang Nitypedef void (*ExpandFuncTy)(const RsExpandKernelParams*, uint32_t, uint32_t,
221ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni                             uint32_t);
23eb9aa675754c49f613c6ad71d41472b30f38b007Yang Nitypedef void (*InvokeFuncTy)(const void*, uint32_t);
241ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
251ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass CPUClosure {
26eb9aa675754c49f613c6ad71d41472b30f38b007Yang Nipublic:
27eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    CPUClosure(const Closure* closure, RsdCpuScriptImpl* si, ExpandFuncTy func,
28eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni               const void* usrPtr, const size_t usrSize) :
29eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        mClosure(closure), mSi(si), mFunc(func),
30eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        mUsrPtr(usrPtr), mUsrSize(usrSize) {}
31eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni
32eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    CPUClosure(const Closure* closure, RsdCpuScriptImpl* si) :
33eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        mClosure(closure), mSi(si), mFunc(nullptr),
34eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        mUsrPtr(nullptr), mUsrSize(0) {}
35eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni
36eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    // It's important to do forwarding here than inheritance for unbound value
37eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    // binding to work.
38eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    const Closure* mClosure;
39eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    RsdCpuScriptImpl* mSi;
40eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    const ExpandFuncTy mFunc;
41eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    const void* mUsrPtr;
42eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    const size_t mUsrSize;
431ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni};
441ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
45da0f069871343119251d6b0586be356dc2146a62Yang Niclass CpuScriptGroup2Impl;
46da0f069871343119251d6b0586be356dc2146a62Yang Ni
47da0f069871343119251d6b0586be356dc2146a62Yang Niclass Batch {
48eb9aa675754c49f613c6ad71d41472b30f38b007Yang Nipublic:
49eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    Batch(CpuScriptGroup2Impl* group) : mGroup(group), mExecutable(nullptr) {}
50da0f069871343119251d6b0586be356dc2146a62Yang Ni
51eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    ~Batch();
52da0f069871343119251d6b0586be356dc2146a62Yang Ni
53eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    // Returns true if closure depends on any closure in this batch for a global
54eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    // variable
55eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    bool conflict(CPUClosure* closure) const;
56da0f069871343119251d6b0586be356dc2146a62Yang Ni
57eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    void tryToCreateFusedKernel(const char* cacheDir);
58eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    void setGlobalsForBatch();
59eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    void run();
60da0f069871343119251d6b0586be356dc2146a62Yang Ni
61eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    CpuScriptGroup2Impl* mGroup;
62eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    ScriptExecutable* mExecutable;
63eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    void* mScriptObj;
64eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    list<CPUClosure*> mClosures;
65da0f069871343119251d6b0586be356dc2146a62Yang Ni};
66da0f069871343119251d6b0586be356dc2146a62Yang Ni
671ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass CpuScriptGroup2Impl : public RsdCpuReference::CpuScriptGroup2 {
68eb9aa675754c49f613c6ad71d41472b30f38b007Yang Nipublic:
69eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    CpuScriptGroup2Impl(RsdCpuReferenceImpl *cpuRefImpl, const ScriptGroupBase* group);
70eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    virtual ~CpuScriptGroup2Impl();
711ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
72eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    bool init();
73eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    virtual void execute();
741ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
75eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    RsdCpuReferenceImpl* getCpuRefImpl() const { return mCpuRefImpl; }
761ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
77eb9aa675754c49f613c6ad71d41472b30f38b007Yang Niprivate:
78eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    RsdCpuReferenceImpl* mCpuRefImpl;
79eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    const ScriptGroup2* mGroup;
80eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    list<Batch*> mBatches;
811ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni};
821ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
831ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni}  // namespace renderscript
841ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni}  // namespace android
851ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni
861ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#endif  // CPU_REF_CPUSCRIPTGROUP2IMPL_H_
87