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