1d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#ifndef DMTask_DEFINED
2d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#define DMTask_DEFINED
3d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
42460bbdfbb1d55ef307c3189c661e65de1a7affbmtklein#include "DMGpuSupport.h"
5406654be7a930b484159f5bca107d3b11d8a9edemtklein#include "DMReporter.h"
6d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#include "SkRunnable.h"
7406654be7a930b484159f5bca107d3b11d8a9edemtklein#include "SkTaskGroup.h"
8a39874b636f9954c6da335733fed646ba33dd614commit-bot@chromium.org#include "SkTime.h"
9d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
10ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org// DM will run() these tasks on one of two threadpools.
11ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org// Subclasses can call fail() to mark this task as failed, or make any number of spawnChild() calls
12ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org// to kick off dependent tasks.
13d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com//
14ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org// Tasks delete themselves when run.
15d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
16d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comnamespace DM {
17d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
18d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comclass TaskRunner;
19d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
20ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.orgclass CpuTask;
21d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
22ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.orgclass Task {
23ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.orgpublic:
24d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    virtual bool shouldSkip() const = 0;
25d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    virtual SkString name() const = 0;
26d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
27d6bab0238655dbab24dfe92bd0b16b464310a8c7rmistry@google.com    // Returns the number of parents above this task.
28d6bab0238655dbab24dfe92bd0b16b464310a8c7rmistry@google.com    // Top-level tasks return 0, their children 1, and so on.
29d6bab0238655dbab24dfe92bd0b16b464310a8c7rmistry@google.com    int depth() const { return fDepth; }
30d6bab0238655dbab24dfe92bd0b16b464310a8c7rmistry@google.com
31d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comprotected:
32ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    Task(Reporter* reporter, TaskRunner* taskRunner);
33ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    Task(const Task& parent);
3439e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org    virtual ~Task();
35d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
36a39874b636f9954c6da335733fed646ba33dd614commit-bot@chromium.org    void start();
37ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    void fail(const char* msg = NULL);
38ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    void finish();
39a39874b636f9954c6da335733fed646ba33dd614commit-bot@chromium.org
40406654be7a930b484159f5bca107d3b11d8a9edemtklein    void reallySpawnChild(CpuTask* task);  // For now we don't allow GPU child tasks.
4138aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org
42d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comprivate:
43ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    Reporter* fReporter;      // Unowned.
44ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    TaskRunner* fTaskRunner;  // Unowned.
45d6bab0238655dbab24dfe92bd0b16b464310a8c7rmistry@google.com    int fDepth;
46a39874b636f9954c6da335733fed646ba33dd614commit-bot@chromium.org    SkMSec fStart;
47ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org};
48ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org
49ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.orgclass CpuTask : public Task, public SkRunnable {
50ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.orgpublic:
51ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    CpuTask(Reporter* reporter, TaskRunner* taskRunner);
52ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    CpuTask(const Task& parent);
53ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    virtual ~CpuTask() {}
54ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org
55ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    void run() SK_OVERRIDE;
56ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    virtual void draw() = 0;
57b0c7156d5be00509d0f80a8d223d5355122b6a3fcommit-bot@chromium.org
58b0c7156d5be00509d0f80a8d223d5355122b6a3fcommit-bot@chromium.org    void spawnChild(CpuTask* task);
59ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org};
60ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org
61406654be7a930b484159f5bca107d3b11d8a9edemtkleinclass GpuTask : public Task {
62ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org public:
63ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    GpuTask(Reporter* reporter, TaskRunner* taskRunner);
64ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    virtual ~GpuTask() {}
651ecd9cf379312e72670e2aec313c850d422ce9c7scroggo@google.com
66406654be7a930b484159f5bca107d3b11d8a9edemtklein    void run(GrContextFactory*);
67ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    virtual void draw(GrContextFactory*) = 0;
68b0c7156d5be00509d0f80a8d223d5355122b6a3fcommit-bot@chromium.org
69b0c7156d5be00509d0f80a8d223d5355122b6a3fcommit-bot@chromium.org    void spawnChild(CpuTask* task);
70d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com};
71d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
72d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}  // namespace DM
73d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
74d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#endif  // DMTask_DEFINED
75