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