#ifndef DMTask_DEFINED #define DMTask_DEFINED #include "DMReporter.h" #include "DMGpuSupport.h" #include "SkRunnable.h" #include "SkTime.h" // DM will run() these tasks on one of two threadpools. // Subclasses can call fail() to mark this task as failed, or make any number of spawnChild() calls // to kick off dependent tasks. // // Tasks delete themselves when run. namespace DM { class TaskRunner; class CpuTask; class Task { public: virtual bool shouldSkip() const = 0; virtual SkString name() const = 0; // Returns the number of parents above this task. // Top-level tasks return 0, their children 1, and so on. int depth() const { return fDepth; } protected: Task(Reporter* reporter, TaskRunner* taskRunner); Task(const Task& parent); virtual ~Task(); void start(); void fail(const char* msg = NULL); void finish(); void spawnChildNext(CpuTask* task); // For now we don't allow GPU child tasks. private: Reporter* fReporter; // Unowned. TaskRunner* fTaskRunner; // Unowned. int fDepth; SkMSec fStart; }; class CpuTask : public Task, public SkRunnable { public: CpuTask(Reporter* reporter, TaskRunner* taskRunner); CpuTask(const Task& parent); virtual ~CpuTask() {} void run() SK_OVERRIDE; virtual void draw() = 0; void spawnChild(CpuTask* task); }; class GpuTask : public Task, public SkTRunnable<GrContextFactory> { public: GpuTask(Reporter* reporter, TaskRunner* taskRunner); virtual ~GpuTask() {} void run(GrContextFactory&) SK_OVERRIDE; virtual void draw(GrContextFactory*) = 0; void spawnChild(CpuTask* task); }; } // namespace DM #endif // DMTask_DEFINED