|  | #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 |