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 #include "cc/raster/bitmap_tile_task_worker_pool.h" | 5 #include "cc/raster/bitmap_tile_task_worker_pool.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 task_runner, task_graph_runner, resource_provider)); | 70 task_runner, task_graph_runner, resource_provider)); |
71 } | 71 } |
72 | 72 |
73 BitmapTileTaskWorkerPool::BitmapTileTaskWorkerPool( | 73 BitmapTileTaskWorkerPool::BitmapTileTaskWorkerPool( |
74 base::SequencedTaskRunner* task_runner, | 74 base::SequencedTaskRunner* task_runner, |
75 TaskGraphRunner* task_graph_runner, | 75 TaskGraphRunner* task_graph_runner, |
76 ResourceProvider* resource_provider) | 76 ResourceProvider* resource_provider) |
77 : task_runner_(task_runner), | 77 : task_runner_(task_runner), |
78 task_graph_runner_(task_graph_runner), | 78 task_graph_runner_(task_graph_runner), |
79 namespace_token_(task_graph_runner->GetNamespaceToken()), | 79 namespace_token_(task_graph_runner->GetNamespaceToken()), |
80 resource_provider_(resource_provider), | 80 resource_provider_(resource_provider) {} |
81 task_set_finished_weak_ptr_factory_(this) { | |
82 } | |
83 | 81 |
84 BitmapTileTaskWorkerPool::~BitmapTileTaskWorkerPool() { | 82 BitmapTileTaskWorkerPool::~BitmapTileTaskWorkerPool() { |
85 } | 83 } |
86 | 84 |
87 TileTaskRunner* BitmapTileTaskWorkerPool::AsTileTaskRunner() { | 85 TileTaskRunner* BitmapTileTaskWorkerPool::AsTileTaskRunner() { |
88 return this; | 86 return this; |
89 } | 87 } |
90 | 88 |
91 void BitmapTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) { | |
92 client_ = client; | |
93 } | |
94 | |
95 void BitmapTileTaskWorkerPool::Shutdown() { | 89 void BitmapTileTaskWorkerPool::Shutdown() { |
96 TRACE_EVENT0("cc", "BitmapTileTaskWorkerPool::Shutdown"); | 90 TRACE_EVENT0("cc", "BitmapTileTaskWorkerPool::Shutdown"); |
97 | 91 |
98 TaskGraph empty; | 92 TaskGraph empty; |
99 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); | 93 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); |
100 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); | 94 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
101 } | 95 } |
102 | 96 |
103 void BitmapTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) { | 97 void BitmapTileTaskWorkerPool::ScheduleTasks(TaskGraph* graph) { |
104 TRACE_EVENT0("cc", "BitmapTileTaskWorkerPool::ScheduleTasks"); | 98 TRACE_EVENT0("cc", "BitmapTileTaskWorkerPool::ScheduleTasks"); |
105 | 99 |
106 if (tasks_pending_.none()) | 100 ScheduleTasksOnOriginThread(this, graph); |
107 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); | 101 task_graph_runner_->ScheduleTasks(namespace_token_, graph); |
108 | |
109 // Mark all task sets as pending. | |
110 tasks_pending_.set(); | |
111 | |
112 size_t priority = kTileTaskPriorityBase; | |
113 | |
114 graph_.Reset(); | |
115 | |
116 // Cancel existing OnTaskSetFinished callbacks. | |
117 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | |
118 | |
119 scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets]; | |
120 | |
121 size_t task_count[kNumberOfTaskSets] = {0}; | |
122 | |
123 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | |
124 new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask( | |
125 task_runner_.get(), | |
126 base::Bind(&BitmapTileTaskWorkerPool::OnTaskSetFinished, | |
127 task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set)); | |
128 } | |
129 | |
130 for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); | |
131 it != queue->items.end(); ++it) { | |
132 const TileTaskQueue::Item& item = *it; | |
133 RasterTask* task = item.task; | |
134 DCHECK(!task->HasCompleted()); | |
135 | |
136 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | |
137 if (!item.task_sets[task_set]) | |
138 continue; | |
139 | |
140 ++task_count[task_set]; | |
141 | |
142 graph_.edges.push_back( | |
143 TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get())); | |
144 } | |
145 | |
146 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); | |
147 } | |
148 | |
149 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | |
150 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(), | |
151 kTaskSetFinishedTaskPriorityBase + task_set, | |
152 task_count[task_set]); | |
153 } | |
154 | |
155 ScheduleTasksOnOriginThread(this, &graph_); | |
156 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); | |
157 | |
158 std::copy(new_task_set_finished_tasks, | |
159 new_task_set_finished_tasks + kNumberOfTaskSets, | |
160 task_set_finished_tasks_); | |
161 | |
162 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", | |
163 StateAsValue()); | |
164 } | 102 } |
165 | 103 |
166 void BitmapTileTaskWorkerPool::CheckForCompletedTasks() { | 104 void BitmapTileTaskWorkerPool::CheckForCompletedTasks() { |
167 TRACE_EVENT0("cc", "BitmapTileTaskWorkerPool::CheckForCompletedTasks"); | 105 TRACE_EVENT0("cc", "BitmapTileTaskWorkerPool::CheckForCompletedTasks"); |
168 | 106 |
169 task_graph_runner_->CollectCompletedTasks(namespace_token_, | 107 task_graph_runner_->CollectCompletedTasks(namespace_token_, |
170 &completed_tasks_); | 108 &completed_tasks_); |
171 for (Task::Vector::const_iterator it = completed_tasks_.begin(); | 109 for (Task::Vector::const_iterator it = completed_tasks_.begin(); |
172 it != completed_tasks_.end(); ++it) { | 110 it != completed_tasks_.end(); ++it) { |
173 TileTask* task = static_cast<TileTask*>(it->get()); | 111 TileTask* task = static_cast<TileTask*>(it->get()); |
(...skipping 22 matching lines...) Expand all Loading... |
196 uint64_t previous_content_id) { | 134 uint64_t previous_content_id) { |
197 return scoped_ptr<RasterBuffer>(new RasterBufferImpl( | 135 return scoped_ptr<RasterBuffer>(new RasterBufferImpl( |
198 resource_provider_, resource, resource_content_id, previous_content_id)); | 136 resource_provider_, resource, resource_content_id, previous_content_id)); |
199 } | 137 } |
200 | 138 |
201 void BitmapTileTaskWorkerPool::ReleaseBufferForRaster( | 139 void BitmapTileTaskWorkerPool::ReleaseBufferForRaster( |
202 scoped_ptr<RasterBuffer> buffer) { | 140 scoped_ptr<RasterBuffer> buffer) { |
203 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 141 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
204 } | 142 } |
205 | 143 |
206 void BitmapTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { | |
207 TRACE_EVENT1("cc", "BitmapTileTaskWorkerPool::OnTaskSetFinished", "task_set", | |
208 task_set); | |
209 | |
210 DCHECK(tasks_pending_[task_set]); | |
211 tasks_pending_[task_set] = false; | |
212 if (tasks_pending_.any()) { | |
213 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", | |
214 "state", StateAsValue()); | |
215 } else { | |
216 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); | |
217 } | |
218 client_->DidFinishRunningTileTasks(task_set); | |
219 } | |
220 | |
221 scoped_refptr<base::trace_event::ConvertableToTraceFormat> | |
222 BitmapTileTaskWorkerPool::StateAsValue() const { | |
223 scoped_refptr<base::trace_event::TracedValue> state = | |
224 new base::trace_event::TracedValue(); | |
225 | |
226 state->BeginArray("tasks_pending"); | |
227 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) | |
228 state->AppendBoolean(tasks_pending_[task_set]); | |
229 state->EndArray(); | |
230 return state; | |
231 } | |
232 | |
233 } // namespace cc | 144 } // namespace cc |
OLD | NEW |