Home | History | Annotate | Download | only in dm
      1 #ifndef DMTask_DEFINED
      2 #define DMTask_DEFINED
      3 
      4 #include "DMReporter.h"
      5 #include "SkRunnable.h"
      6 #include "SkThreadPool.h"
      7 
      8 // DM will run() these tasks on one of two threadpools, depending on the result
      9 // of usesGpu().  The subclasses can call fail() to mark this task as failed,
     10 // or make any number of spawnChild() calls to kick off dependent tasks.
     11 //
     12 // Task deletes itself when run.
     13 
     14 namespace DM {
     15 
     16 class TaskRunner;
     17 
     18 class Task : public SkRunnable {
     19 public:
     20     Task(Reporter* reporter, TaskRunner* taskRunner);
     21     Task(const Task& parent);
     22     virtual ~Task();
     23 
     24     void run() SK_OVERRIDE;
     25 
     26     virtual void draw() = 0;
     27     virtual bool usesGpu() const = 0;
     28     virtual bool shouldSkip() const = 0;
     29     virtual SkString name() const = 0;
     30 
     31     // Returns the number of parents above this task.
     32     // Top-level tasks return 0, their children 1, and so on.
     33     int depth() const { return fDepth; }
     34 
     35 protected:
     36     void spawnChild(Task* task);
     37     void fail();
     38 
     39 private:
     40     // Both unowned.
     41     Reporter* fReporter;
     42     TaskRunner* fTaskRunner;
     43     int fDepth;
     44 
     45     typedef SkRunnable INHERITED;
     46 };
     47 
     48 }  // namespace DM
     49 
     50 #endif  // DMTask_DEFINED
     51