1d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#include "DMTask.h"
2d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#include "DMTaskRunner.h"
3fa8cb1cf222f85aa898cfe979ac57da6a7b9f6f9commit-bot@chromium.org#include "SkCommandLineFlags.h"
4fa8cb1cf222f85aa898cfe979ac57da6a7b9f6f9commit-bot@chromium.org
5fa8cb1cf222f85aa898cfe979ac57da6a7b9f6f9commit-bot@chromium.orgDEFINE_bool(cpu, true, "Master switch for running CPU-bound work.");
6fa8cb1cf222f85aa898cfe979ac57da6a7b9f6f9commit-bot@chromium.orgDEFINE_bool(gpu, true, "Master switch for running GPU-bound work.");
7d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
8a65e2fdc9af4b0b0415888a560d6ebd779bc3148commit-bot@chromium.orgDECLARE_bool(dryRun);
9a65e2fdc9af4b0b0415888a560d6ebd779bc3148commit-bot@chromium.org
10d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comnamespace DM {
11d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
12d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comTask::Task(Reporter* reporter, TaskRunner* taskRunner)
13ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    : fReporter(reporter)
14ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    , fTaskRunner(taskRunner)
15ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    , fDepth(0) {
1639e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org    fReporter->taskCreated();
17d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}
18d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
19d6bab0238655dbab24dfe92bd0b16b464310a8c7rmistry@google.comTask::Task(const Task& parent)
20ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    : fReporter(parent.fReporter)
21d6bab0238655dbab24dfe92bd0b16b464310a8c7rmistry@google.com    , fTaskRunner(parent.fTaskRunner)
22ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    , fDepth(parent.depth() + 1) {
2339e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org    fReporter->taskCreated();
2439e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org}
2539e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org
2639e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.orgTask::~Task() {
2739e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org    fReporter->taskDestroyed();
28d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}
29d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
30ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.orgvoid Task::fail(const char* msg) {
31ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    SkString failure(this->name());
32ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    if (msg) {
33ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org        failure.appendf(": %s", msg);
34d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    }
35ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    fReporter->fail(failure);
36ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org}
37ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org
38a39874b636f9954c6da335733fed646ba33dd614commit-bot@chromium.orgvoid Task::start() {
39a39874b636f9954c6da335733fed646ba33dd614commit-bot@chromium.org    fStart = SkTime::GetMSecs();
40a39874b636f9954c6da335733fed646ba33dd614commit-bot@chromium.org}
41a39874b636f9954c6da335733fed646ba33dd614commit-bot@chromium.org
42ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.orgvoid Task::finish() {
4339e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org    fReporter->printStatus(this->name(), SkTime::GetMSecs() - fStart);
44d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}
45d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
463f032156c8b5d4decb0beccdc2cdbcf91867fa36commit-bot@chromium.orgvoid Task::spawnChildNext(CpuTask* task) {
473f032156c8b5d4decb0beccdc2cdbcf91867fa36commit-bot@chromium.org    fTaskRunner->addNext(task);
48d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}
49d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
50ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.orgCpuTask::CpuTask(Reporter* reporter, TaskRunner* taskRunner) : Task(reporter, taskRunner) {}
51ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.orgCpuTask::CpuTask(const Task& parent) : Task(parent) {}
52ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org
53ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.orgvoid CpuTask::run() {
54fa8cb1cf222f85aa898cfe979ac57da6a7b9f6f9commit-bot@chromium.org    if (FLAGS_cpu && !this->shouldSkip()) {
5539e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org        this->start();
56a65e2fdc9af4b0b0415888a560d6ebd779bc3148commit-bot@chromium.org        if (!FLAGS_dryRun) this->draw();
5739e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org        this->finish();
580dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    }
59ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    SkDELETE(this);
60d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}
61d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
62b0c7156d5be00509d0f80a8d223d5355122b6a3fcommit-bot@chromium.orgvoid CpuTask::spawnChild(CpuTask* task) {
63b0c7156d5be00509d0f80a8d223d5355122b6a3fcommit-bot@chromium.org    // Run children serially on this (CPU) thread.  This tends to save RAM and is usually no slower.
643f032156c8b5d4decb0beccdc2cdbcf91867fa36commit-bot@chromium.org    // Calling spawnChildNext() is nearly equivalent, but it'd pointlessly contend on the
653f032156c8b5d4decb0beccdc2cdbcf91867fa36commit-bot@chromium.org    // threadpool; spawnChildNext() is most useful when you want to change threadpools.
66b0c7156d5be00509d0f80a8d223d5355122b6a3fcommit-bot@chromium.org    task->run();
67b0c7156d5be00509d0f80a8d223d5355122b6a3fcommit-bot@chromium.org}
68b0c7156d5be00509d0f80a8d223d5355122b6a3fcommit-bot@chromium.org
69ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.orgGpuTask::GpuTask(Reporter* reporter, TaskRunner* taskRunner) : Task(reporter, taskRunner) {}
70ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org
71ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.orgvoid GpuTask::run(GrContextFactory& factory) {
72fa8cb1cf222f85aa898cfe979ac57da6a7b9f6f9commit-bot@chromium.org    if (FLAGS_gpu && !this->shouldSkip()) {
7339e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org        this->start();
74a65e2fdc9af4b0b0415888a560d6ebd779bc3148commit-bot@chromium.org        if (!FLAGS_dryRun) this->draw(&factory);
7539e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org        this->finish();
76ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    }
77ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org    SkDELETE(this);
7838aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org}
7938aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org
80b0c7156d5be00509d0f80a8d223d5355122b6a3fcommit-bot@chromium.orgvoid GpuTask::spawnChild(CpuTask* task) {
81b0c7156d5be00509d0f80a8d223d5355122b6a3fcommit-bot@chromium.org    // Really spawn a new task so it runs on the CPU threadpool instead of the GPU one we're on now.
823f032156c8b5d4decb0beccdc2cdbcf91867fa36commit-bot@chromium.org    // It goes on the front of the queue to minimize the time we must hold reference bitmaps in RAM.
833f032156c8b5d4decb0beccdc2cdbcf91867fa36commit-bot@chromium.org    this->spawnChildNext(task);
84b0c7156d5be00509d0f80a8d223d5355122b6a3fcommit-bot@chromium.org}
85ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org
86d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}  // namespace DM
87