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