#ifndef CPU_REF_CPUSCRIPTGROUP2IMPL_H_
#define CPU_REF_CPUSCRIPTGROUP2IMPL_H_

#include "rsd_cpu.h"
#include "rsList.h"

struct RsExpandKernelDriverInfo;

namespace android {
namespace renderscript {

class Closure;
class RsdCpuScriptImpl;
class RsdCpuReferenceImpl;
class ScriptExecutable;
class ScriptGroup2;

typedef void (*ExpandFuncTy)(const RsExpandKernelDriverInfo*, uint32_t, uint32_t,
                             uint32_t);
typedef void (*InvokeFuncTy)(const void*, uint32_t);

class CPUClosure {
public:
    CPUClosure(const Closure* closure, RsdCpuScriptImpl* si, ExpandFuncTy func) :
        mClosure(closure), mSi(si), mFunc(func) {}

    CPUClosure(const Closure* closure, RsdCpuScriptImpl* si) :
        mClosure(closure), mSi(si), mFunc(nullptr) {}

    // It's important to do forwarding here than inheritance for unbound value
    // binding to work.
    const Closure* mClosure;
    RsdCpuScriptImpl* mSi;
    const ExpandFuncTy mFunc;
};

class CpuScriptGroup2Impl;

class Batch {
public:
    Batch(CpuScriptGroup2Impl* group, const char* name);
    ~Batch();

    // Returns true if closure depends on any closure in this batch for a global
    // variable
    bool conflict(CPUClosure* closure) const;

    void resolveFuncPtr(void* sharedObj);
    void setGlobalsForBatch();
    void run();

    size_t size() const { return mClosures.size(); }

    CpuScriptGroup2Impl* mGroup;
    List<CPUClosure*> mClosures;
    char* mName;
    void* mFunc;
};

class CpuScriptGroup2Impl : public RsdCpuReference::CpuScriptGroup2 {
public:
    CpuScriptGroup2Impl(RsdCpuReferenceImpl *cpuRefImpl, const ScriptGroupBase* group);
    virtual ~CpuScriptGroup2Impl();

    bool init();
    virtual void execute();

    RsdCpuReferenceImpl* getCpuRefImpl() const { return mCpuRefImpl; }
    ScriptExecutable* getExecutable() const { return mExecutable; }

    void compile(const char* cacheDir);

private:
    RsdCpuReferenceImpl* mCpuRefImpl;
    const ScriptGroup2* mGroup;
    List<Batch*> mBatches;
    ScriptExecutable* mExecutable;
    void* mScriptObj;
};

}  // namespace renderscript
}  // namespace android

#endif  // CPU_REF_CPUSCRIPTGROUP2IMPL_H_
