OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CC_RASTER_TASK_GRAPH_RUNNER_H_ | 5 #ifndef CC_RASTER_TASK_GRAPH_RUNNER_H_ |
6 #define CC_RASTER_TASK_GRAPH_RUNNER_H_ | 6 #define CC_RASTER_TASK_GRAPH_RUNNER_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
11 #include <algorithm> | 11 #include <algorithm> |
12 #include <map> | 12 #include <map> |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "base/logging.h" | 15 #include "base/logging.h" |
16 #include "base/memory/ref_counted.h" | 16 #include "base/memory/ref_counted.h" |
17 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
18 #include "cc/base/cc_export.h" | 18 #include "cc/base/cc_export.h" |
| 19 #include "cc/raster/dependency_task.h" |
19 | 20 |
20 namespace cc { | 21 namespace cc { |
21 | 22 |
22 class TaskGraphRunner; | 23 class TaskGraphRunner; |
23 | 24 |
24 // A task which can be run by a TaskGraphRunner. To run a Task, it should be | |
25 // inserted into a TaskGraph, which can then be scheduled on the | |
26 // TaskGraphRunner. | |
27 class CC_EXPORT Task : public base::RefCountedThreadSafe<Task> { | |
28 public: | |
29 typedef std::vector<scoped_refptr<Task>> Vector; | |
30 | |
31 // Subclasses should implement this method. RunOnWorkerThread may be called | |
32 // on any thread, and subclasses are responsible for locking and thread | |
33 // safety. | |
34 virtual void RunOnWorkerThread() = 0; | |
35 | |
36 void WillRun(); | |
37 void DidRun(); | |
38 bool HasFinishedRunning() const; | |
39 | |
40 protected: | |
41 friend class base::RefCountedThreadSafe<Task>; | |
42 | |
43 Task(); | |
44 virtual ~Task(); | |
45 | |
46 bool will_run_; | |
47 bool did_run_; | |
48 }; | |
49 | |
50 // A task dependency graph describes the order in which to execute a set | 25 // A task dependency graph describes the order in which to execute a set |
51 // of tasks. Dependencies are represented as edges. Each node is assigned | 26 // of tasks. Dependencies are represented as edges. Each node is assigned |
52 // a category, a priority and a run count that matches the number of | 27 // a category, a priority and a run count that matches the number of |
53 // dependencies. Priority range from 0 (most favorable scheduling) to UINT16_MAX | 28 // dependencies. Priority range from 0 (most favorable scheduling) to UINT16_MAX |
54 // (least favorable). Categories range from 0 to UINT16_MAX. It is up to the | 29 // (least favorable). Categories range from 0 to UINT16_MAX. It is up to the |
55 // implementation and its consumer to determine the meaning (if any) of a | 30 // implementation and its consumer to determine the meaning (if any) of a |
56 // category. A TaskGraphRunner implementation may chose to prioritize certain | 31 // category. A TaskGraphRunner implementation may chose to prioritize certain |
57 // categories over others, regardless of the individual priorities of tasks. | 32 // categories over others, regardless of the individual priorities of tasks. |
58 struct CC_EXPORT TaskGraph { | 33 struct CC_EXPORT TaskGraph { |
59 struct Node { | 34 struct Node { |
60 typedef std::vector<Node> Vector; | 35 typedef std::vector<Node> Vector; |
61 | 36 |
62 Node(Task* task, | 37 Node(DependencyTask* task, |
63 uint16_t category, | 38 uint16_t category, |
64 uint16_t priority, | 39 uint16_t priority, |
65 uint32_t dependencies) | 40 uint32_t dependencies) |
66 : task(task), | 41 : task(task), |
67 category(category), | 42 category(category), |
68 priority(priority), | 43 priority(priority), |
69 dependencies(dependencies) {} | 44 dependencies(dependencies) {} |
70 | 45 |
71 Task* task; | 46 DependencyTask* task; |
72 uint16_t category; | 47 uint16_t category; |
73 uint16_t priority; | 48 uint16_t priority; |
74 uint32_t dependencies; | 49 uint32_t dependencies; |
75 }; | 50 }; |
76 | 51 |
77 struct Edge { | 52 struct Edge { |
78 typedef std::vector<Edge> Vector; | 53 typedef std::vector<Edge> Vector; |
79 | 54 |
80 Edge(const Task* task, Task* dependent) | 55 Edge(const DependencyTask* task, DependencyTask* dependent) |
81 : task(task), dependent(dependent) {} | 56 : task(task), dependent(dependent) {} |
82 | 57 |
83 const Task* task; | 58 const DependencyTask* task; |
84 Task* dependent; | 59 DependencyTask* dependent; |
85 }; | 60 }; |
86 | 61 |
87 TaskGraph(); | 62 TaskGraph(); |
88 TaskGraph(const TaskGraph& other); | 63 TaskGraph(const TaskGraph& other); |
89 ~TaskGraph(); | 64 ~TaskGraph(); |
90 | 65 |
91 void Swap(TaskGraph* other); | 66 void Swap(TaskGraph* other); |
92 void Reset(); | 67 void Reset(); |
93 | 68 |
94 Node::Vector nodes; | 69 Node::Vector nodes; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 // longer needed will be canceled unless already running. Canceled tasks are | 127 // longer needed will be canceled unless already running. Canceled tasks are |
153 // moved to |completed_tasks| without being run. The result is that once | 128 // moved to |completed_tasks| without being run. The result is that once |
154 // scheduled, a task is guaranteed to end up in the |completed_tasks| queue | 129 // scheduled, a task is guaranteed to end up in the |completed_tasks| queue |
155 // even if it later gets canceled by another call to ScheduleTasks(). | 130 // even if it later gets canceled by another call to ScheduleTasks(). |
156 virtual void ScheduleTasks(NamespaceToken token, TaskGraph* graph) = 0; | 131 virtual void ScheduleTasks(NamespaceToken token, TaskGraph* graph) = 0; |
157 | 132 |
158 // Wait for all scheduled tasks to finish running. | 133 // Wait for all scheduled tasks to finish running. |
159 virtual void WaitForTasksToFinishRunning(NamespaceToken token) = 0; | 134 virtual void WaitForTasksToFinishRunning(NamespaceToken token) = 0; |
160 | 135 |
161 // Collect all completed tasks in |completed_tasks|. | 136 // Collect all completed tasks in |completed_tasks|. |
162 virtual void CollectCompletedTasks(NamespaceToken token, | 137 virtual void CollectCompletedTasks( |
163 Task::Vector* completed_tasks) = 0; | 138 NamespaceToken token, |
| 139 DependencyTask::Vector* completed_tasks) = 0; |
164 | 140 |
165 protected: | 141 protected: |
166 virtual ~TaskGraphRunner() {} | 142 virtual ~TaskGraphRunner() {} |
167 }; | 143 }; |
168 | 144 |
169 // Helper class for iterating over all dependents of a task. | 145 // Helper class for iterating over all dependents of a task. |
170 class DependentIterator { | 146 class DependentIterator { |
171 public: | 147 public: |
172 DependentIterator(TaskGraph* graph, const Task* task) | 148 DependentIterator(TaskGraph* graph, const DependencyTask* task) |
173 : graph_(graph), | 149 : graph_(graph), |
174 task_(task), | 150 task_(task), |
175 current_index_(static_cast<size_t>(-1)), | 151 current_index_(static_cast<size_t>(-1)), |
176 current_node_(NULL) { | 152 current_node_(NULL) { |
177 ++(*this); | 153 ++(*this); |
178 } | 154 } |
179 | 155 |
180 TaskGraph::Node& operator->() const { | 156 TaskGraph::Node& operator->() const { |
181 DCHECK_LT(current_index_, graph_->edges.size()); | 157 DCHECK_LT(current_index_, graph_->edges.size()); |
182 DCHECK_EQ(graph_->edges[current_index_].task, task_); | 158 DCHECK_EQ(graph_->edges[current_index_].task, task_); |
(...skipping 26 matching lines...) Expand all Loading... |
209 DCHECK(it != graph_->nodes.end()); | 185 DCHECK(it != graph_->nodes.end()); |
210 current_node_ = &(*it); | 186 current_node_ = &(*it); |
211 | 187 |
212 return *this; | 188 return *this; |
213 } | 189 } |
214 | 190 |
215 operator bool() const { return current_index_ < graph_->edges.size(); } | 191 operator bool() const { return current_index_ < graph_->edges.size(); } |
216 | 192 |
217 private: | 193 private: |
218 TaskGraph* graph_; | 194 TaskGraph* graph_; |
219 const Task* task_; | 195 const DependencyTask* task_; |
220 size_t current_index_; | 196 size_t current_index_; |
221 TaskGraph::Node* current_node_; | 197 TaskGraph::Node* current_node_; |
222 }; | 198 }; |
223 | 199 |
224 } // namespace cc | 200 } // namespace cc |
225 | 201 |
226 #endif // CC_RASTER_TASK_GRAPH_RUNNER_H_ | 202 #endif // CC_RASTER_TASK_GRAPH_RUNNER_H_ |
OLD | NEW |