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/resources/gpu_tile_task_worker_pool.h" | 5 #include "cc/resources/gpu_tile_task_worker_pool.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "cc/output/context_provider.h" | 10 #include "cc/output/context_provider.h" |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 bool use_distance_field_text_; | 69 bool use_distance_field_text_; |
70 | 70 |
71 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); | 71 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
72 }; | 72 }; |
73 | 73 |
74 } // namespace | 74 } // namespace |
75 | 75 |
76 // static | 76 // static |
77 scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create( | 77 scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create( |
78 base::SequencedTaskRunner* task_runner, | 78 base::SequencedTaskRunner* task_runner, |
| 79 TaskGraphRunner* task_graph_runner, |
79 ContextProvider* context_provider, | 80 ContextProvider* context_provider, |
80 ResourceProvider* resource_provider, | 81 ResourceProvider* resource_provider, |
81 bool use_distance_field_text) { | 82 bool use_distance_field_text) { |
82 return make_scoped_ptr<TileTaskWorkerPool>( | 83 return make_scoped_ptr<TileTaskWorkerPool>(new GpuTileTaskWorkerPool( |
83 new GpuTileTaskWorkerPool(task_runner, context_provider, | 84 task_runner, task_graph_runner, context_provider, resource_provider, |
84 resource_provider, use_distance_field_text)); | 85 use_distance_field_text)); |
85 } | 86 } |
86 | 87 |
87 GpuTileTaskWorkerPool::GpuTileTaskWorkerPool( | 88 GpuTileTaskWorkerPool::GpuTileTaskWorkerPool( |
88 base::SequencedTaskRunner* task_runner, | 89 base::SequencedTaskRunner* task_runner, |
| 90 TaskGraphRunner* task_graph_runner, |
89 ContextProvider* context_provider, | 91 ContextProvider* context_provider, |
90 ResourceProvider* resource_provider, | 92 ResourceProvider* resource_provider, |
91 bool use_distance_field_text) | 93 bool use_distance_field_text) |
92 : task_runner_(task_runner), | 94 : task_runner_(task_runner), |
93 task_graph_runner_(new TaskGraphRunner), | 95 task_graph_runner_(task_graph_runner), |
94 namespace_token_(task_graph_runner_->GetNamespaceToken()), | 96 namespace_token_(task_graph_runner_->GetNamespaceToken()), |
95 context_provider_(context_provider), | 97 context_provider_(context_provider), |
96 resource_provider_(resource_provider), | 98 resource_provider_(resource_provider), |
97 run_tasks_on_origin_thread_pending_(false), | 99 run_tasks_on_origin_thread_pending_(false), |
98 use_distance_field_text_(use_distance_field_text), | 100 use_distance_field_text_(use_distance_field_text), |
99 task_set_finished_weak_ptr_factory_(this), | 101 task_set_finished_weak_ptr_factory_(this), |
100 weak_ptr_factory_(this) { | 102 weak_ptr_factory_(this) { |
101 DCHECK(context_provider_); | 103 DCHECK(context_provider_); |
102 } | 104 } |
103 | 105 |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 } | 167 } |
166 | 168 |
167 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 169 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
168 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(), | 170 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(), |
169 kTaskSetFinishedTaskPriority, task_count[task_set]); | 171 kTaskSetFinishedTaskPriority, task_count[task_set]); |
170 } | 172 } |
171 | 173 |
172 ScheduleTasksOnOriginThread(this, &graph_); | 174 ScheduleTasksOnOriginThread(this, &graph_); |
173 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); | 175 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); |
174 | 176 |
175 ScheduleRunTasksOnOriginThread(); | |
176 | |
177 std::copy(new_task_set_finished_tasks, | 177 std::copy(new_task_set_finished_tasks, |
178 new_task_set_finished_tasks + kNumberOfTaskSets, | 178 new_task_set_finished_tasks + kNumberOfTaskSets, |
179 task_set_finished_tasks_); | 179 task_set_finished_tasks_); |
180 } | 180 } |
181 | 181 |
182 void GpuTileTaskWorkerPool::CheckForCompletedTasks() { | 182 void GpuTileTaskWorkerPool::CheckForCompletedTasks() { |
183 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::CheckForCompletedTasks"); | 183 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::CheckForCompletedTasks"); |
184 | 184 |
185 task_graph_runner_->CollectCompletedTasks(namespace_token_, | 185 task_graph_runner_->CollectCompletedTasks(namespace_token_, |
186 &completed_tasks_); | 186 &completed_tasks_); |
187 for (Task::Vector::const_iterator it = completed_tasks_.begin(); | 187 CompleteTasks(completed_tasks_); |
188 it != completed_tasks_.end(); ++it) { | 188 completed_tasks_.clear(); |
189 TileTask* task = static_cast<TileTask*>(it->get()); | 189 } |
190 | 190 |
191 task->WillComplete(); | 191 void GpuTileTaskWorkerPool::CompleteTasks(const Task::Vector& tasks) { |
192 task->CompleteOnOriginThread(this); | 192 for (auto& task : tasks) { |
193 task->DidComplete(); | 193 RasterTask* raster_task = static_cast<RasterTask*>(task.get()); |
194 | 194 |
195 task->RunReplyOnOriginThread(); | 195 raster_task->WillComplete(); |
| 196 raster_task->CompleteOnOriginThread(this); |
| 197 raster_task->DidComplete(); |
| 198 |
| 199 raster_task->RunReplyOnOriginThread(); |
196 } | 200 } |
197 completed_tasks_.clear(); | 201 completed_tasks_.clear(); |
198 } | 202 } |
199 | 203 |
200 scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster( | 204 scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster( |
201 const Resource* resource) { | 205 const Resource* resource) { |
202 return make_scoped_ptr<RasterBuffer>( | 206 return make_scoped_ptr<RasterBuffer>( |
203 new RasterBufferImpl(resource_provider_, resource, &multi_picture_draw_, | 207 new RasterBufferImpl(resource_provider_, resource, &multi_picture_draw_, |
204 use_distance_field_text_)); | 208 use_distance_field_text_)); |
205 } | 209 } |
206 | 210 |
207 void GpuTileTaskWorkerPool::ReleaseBufferForRaster( | 211 void GpuTileTaskWorkerPool::ReleaseBufferForRaster( |
208 scoped_ptr<RasterBuffer> buffer) { | 212 scoped_ptr<RasterBuffer> buffer) { |
209 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 213 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
210 } | 214 } |
211 | 215 |
212 void GpuTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { | 216 void GpuTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { |
213 TRACE_EVENT1("cc", "GpuTileTaskWorkerPool::OnTaskSetFinished", "task_set", | 217 TRACE_EVENT1("cc", "GpuTileTaskWorkerPool::OnTaskSetFinished", "task_set", |
214 task_set); | 218 task_set); |
215 | 219 |
216 DCHECK(tasks_pending_[task_set]); | 220 DCHECK(tasks_pending_[task_set]); |
217 tasks_pending_[task_set] = false; | 221 tasks_pending_[task_set] = false; |
| 222 |
218 client_->DidFinishRunningTileTasks(task_set); | 223 client_->DidFinishRunningTileTasks(task_set); |
219 } | 224 } |
220 | 225 |
221 void GpuTileTaskWorkerPool::ScheduleRunTasksOnOriginThread() { | |
222 if (run_tasks_on_origin_thread_pending_) | |
223 return; | |
224 | |
225 task_runner_->PostTask( | |
226 FROM_HERE, base::Bind(&GpuTileTaskWorkerPool::RunTasksOnOriginThread, | |
227 weak_ptr_factory_.GetWeakPtr())); | |
228 run_tasks_on_origin_thread_pending_ = true; | |
229 } | |
230 | |
231 void GpuTileTaskWorkerPool::RunTasksOnOriginThread() { | |
232 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::RunTasksOnOriginThread"); | |
233 | |
234 DCHECK(run_tasks_on_origin_thread_pending_); | |
235 run_tasks_on_origin_thread_pending_ = false; | |
236 | |
237 ScopedGpuRaster gpu_raster(context_provider_); | |
238 task_graph_runner_->RunUntilIdle(); | |
239 | |
240 // Draw each all of the pictures that were collected. This will also clear | |
241 // the pictures and canvases added to |multi_picture_draw_| | |
242 multi_picture_draw_.draw(); | |
243 } | |
244 | |
245 } // namespace cc | 226 } // namespace cc |
OLD | NEW |