1 #ifndef DMTask_DEFINED 2 #define DMTask_DEFINED 3 4 #include "DMReporter.h" 5 #include "DMGpuSupport.h" 6 #include "SkRunnable.h" 7 #include "SkTime.h" 8 9 // DM will run() these tasks on one of two threadpools. 10 // Subclasses can call fail() to mark this task as failed, or make any number of spawnChild() calls 11 // to kick off dependent tasks. 12 // 13 // Tasks delete themselves when run. 14 15 namespace DM { 16 17 class TaskRunner; 18 19 class CpuTask; 20 21 class Task { 22 public: 23 virtual bool shouldSkip() const = 0; 24 virtual SkString name() const = 0; 25 26 // Returns the number of parents above this task. 27 // Top-level tasks return 0, their children 1, and so on. 28 int depth() const { return fDepth; } 29 30 protected: 31 Task(Reporter* reporter, TaskRunner* taskRunner); 32 Task(const Task& parent); 33 virtual ~Task(); 34 35 void start(); 36 void fail(const char* msg = NULL); 37 void finish(); 38 39 void spawnChildNext(CpuTask* task); // For now we don't allow GPU child tasks. 40 41 private: 42 Reporter* fReporter; // Unowned. 43 TaskRunner* fTaskRunner; // Unowned. 44 int fDepth; 45 SkMSec fStart; 46 }; 47 48 class CpuTask : public Task, public SkRunnable { 49 public: 50 CpuTask(Reporter* reporter, TaskRunner* taskRunner); 51 CpuTask(const Task& parent); 52 virtual ~CpuTask() {} 53 54 void run() SK_OVERRIDE; 55 virtual void draw() = 0; 56 57 void spawnChild(CpuTask* task); 58 }; 59 60 class GpuTask : public Task, public SkTRunnable<GrContextFactory> { 61 public: 62 GpuTask(Reporter* reporter, TaskRunner* taskRunner); 63 virtual ~GpuTask() {} 64 65 void run(GrContextFactory&) SK_OVERRIDE; 66 virtual void draw(GrContextFactory*) = 0; 67 68 void spawnChild(CpuTask* task); 69 }; 70 71 } // namespace DM 72 73 #endif // DMTask_DEFINED 74