Index: dm/DMTask.h |
diff --git a/dm/DMTask.h b/dm/DMTask.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3f41b497ba6f6840c8292ebe54acf17f3e34c998 |
--- /dev/null |
+++ b/dm/DMTask.h |
@@ -0,0 +1,74 @@ |
+#ifndef DMTask_DEFINED |
+#define DMTask_DEFINED |
+ |
+#include "DMGpuSupport.h" |
+#include "DMReporter.h" |
+#include "SkRunnable.h" |
+#include "SkTaskGroup.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 reallySpawnChild(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: |
+ GpuTask(Reporter* reporter, TaskRunner* taskRunner); |
+ virtual ~GpuTask() {} |
+ |
+ void run(GrContextFactory*); |
+ virtual void draw(GrContextFactory*) = 0; |
+ |
+ void spawnChild(CpuTask* task); |
+}; |
+ |
+} // namespace DM |
+ |
+#endif // DMTask_DEFINED |