| 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 |