• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
depth()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);
~CpuTask()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);
~GpuTask()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