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