| 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_raster_worker_pool.h" | 5 #include "cc/resources/gpu_raster_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 const Resource* resource_; | 69 const Resource* resource_; |
| 70 SkMultiPictureDraw* multi_picture_draw_; | 70 SkMultiPictureDraw* multi_picture_draw_; |
| 71 bool use_distance_field_text_; | 71 bool use_distance_field_text_; |
| 72 | 72 |
| 73 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); | 73 DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
| 74 }; | 74 }; |
| 75 | 75 |
| 76 } // namespace | 76 } // namespace |
| 77 | 77 |
| 78 // static | 78 // static |
| 79 scoped_ptr<RasterWorkerPool> GpuRasterWorkerPool::Create( | 79 scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create( |
| 80 base::SequencedTaskRunner* task_runner, | 80 base::SequencedTaskRunner* task_runner, |
| 81 ContextProvider* context_provider, | 81 ContextProvider* context_provider, |
| 82 ResourceProvider* resource_provider, | 82 ResourceProvider* resource_provider, |
| 83 bool use_distance_field_text) { | 83 bool use_distance_field_text) { |
| 84 return make_scoped_ptr<RasterWorkerPool>( | 84 return make_scoped_ptr<TileTaskWorkerPool>( |
| 85 new GpuRasterWorkerPool(task_runner, | 85 new GpuTileTaskWorkerPool(task_runner, context_provider, |
| 86 context_provider, | 86 resource_provider, use_distance_field_text)); |
| 87 resource_provider, | |
| 88 use_distance_field_text)); | |
| 89 } | 87 } |
| 90 | 88 |
| 91 GpuRasterWorkerPool::GpuRasterWorkerPool(base::SequencedTaskRunner* task_runner, | 89 GpuTileTaskWorkerPool::GpuTileTaskWorkerPool( |
| 92 ContextProvider* context_provider, | 90 base::SequencedTaskRunner* task_runner, |
| 93 ResourceProvider* resource_provider, | 91 ContextProvider* context_provider, |
| 94 bool use_distance_field_text) | 92 ResourceProvider* resource_provider, |
| 93 bool use_distance_field_text) |
| 95 : task_runner_(task_runner), | 94 : task_runner_(task_runner), |
| 96 task_graph_runner_(new TaskGraphRunner), | 95 task_graph_runner_(new TaskGraphRunner), |
| 97 namespace_token_(task_graph_runner_->GetNamespaceToken()), | 96 namespace_token_(task_graph_runner_->GetNamespaceToken()), |
| 98 context_provider_(context_provider), | 97 context_provider_(context_provider), |
| 99 resource_provider_(resource_provider), | 98 resource_provider_(resource_provider), |
| 100 run_tasks_on_origin_thread_pending_(false), | 99 run_tasks_on_origin_thread_pending_(false), |
| 101 use_distance_field_text_(use_distance_field_text), | 100 use_distance_field_text_(use_distance_field_text), |
| 102 raster_finished_weak_ptr_factory_(this), | 101 task_set_finished_weak_ptr_factory_(this), |
| 103 weak_ptr_factory_(this) { | 102 weak_ptr_factory_(this) { |
| 104 DCHECK(context_provider_); | 103 DCHECK(context_provider_); |
| 105 } | 104 } |
| 106 | 105 |
| 107 GpuRasterWorkerPool::~GpuRasterWorkerPool() { | 106 GpuTileTaskWorkerPool::~GpuTileTaskWorkerPool() { |
| 108 DCHECK_EQ(0u, completed_tasks_.size()); | 107 DCHECK_EQ(0u, completed_tasks_.size()); |
| 109 } | 108 } |
| 110 | 109 |
| 111 Rasterizer* GpuRasterWorkerPool::AsRasterizer() { | 110 TileTaskRunner* GpuTileTaskWorkerPool::AsTileTaskRunner() { |
| 112 return this; | 111 return this; |
| 113 } | 112 } |
| 114 | 113 |
| 115 void GpuRasterWorkerPool::SetClient(RasterizerClient* client) { | 114 void GpuTileTaskWorkerPool::SetClient(TileTaskRunnerClient* client) { |
| 116 client_ = client; | 115 client_ = client; |
| 117 } | 116 } |
| 118 | 117 |
| 119 void GpuRasterWorkerPool::Shutdown() { | 118 void GpuTileTaskWorkerPool::Shutdown() { |
| 120 TRACE_EVENT0("cc", "GpuRasterWorkerPool::Shutdown"); | 119 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::Shutdown"); |
| 121 | 120 |
| 122 TaskGraph empty; | 121 TaskGraph empty; |
| 123 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); | 122 task_graph_runner_->ScheduleTasks(namespace_token_, &empty); |
| 124 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); | 123 task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_); |
| 125 } | 124 } |
| 126 | 125 |
| 127 void GpuRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { | 126 void GpuTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) { |
| 128 TRACE_EVENT0("cc", "GpuRasterWorkerPool::ScheduleTasks"); | 127 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::ScheduleTasks"); |
| 129 | 128 |
| 130 // Mark all task sets as pending. | 129 // Mark all task sets as pending. |
| 131 raster_pending_.set(); | 130 tasks_pending_.set(); |
| 132 | 131 |
| 133 unsigned priority = kRasterTaskPriorityBase; | 132 unsigned priority = kTileTaskPriorityBase; |
| 134 | 133 |
| 135 graph_.Reset(); | 134 graph_.Reset(); |
| 136 | 135 |
| 137 // Cancel existing OnRasterFinished callbacks. | 136 // Cancel existing OnTaskSetFinished callbacks. |
| 138 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 137 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 139 | 138 |
| 140 scoped_refptr<RasterizerTask> new_raster_finished_tasks[kNumberOfTaskSets]; | 139 scoped_refptr<TileTask> new_task_set_finished_tasks[kNumberOfTaskSets]; |
| 141 | 140 |
| 142 size_t task_count[kNumberOfTaskSets] = {0}; | 141 size_t task_count[kNumberOfTaskSets] = {0}; |
| 143 | 142 |
| 144 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 143 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
| 145 new_raster_finished_tasks[task_set] = CreateRasterFinishedTask( | 144 new_task_set_finished_tasks[task_set] = CreateTaskSetFinishedTask( |
| 146 task_runner_.get(), | 145 task_runner_.get(), |
| 147 base::Bind(&GpuRasterWorkerPool::OnRasterFinished, | 146 base::Bind(&GpuTileTaskWorkerPool::OnTaskSetFinished, |
| 148 raster_finished_weak_ptr_factory_.GetWeakPtr(), | 147 task_set_finished_weak_ptr_factory_.GetWeakPtr(), task_set)); |
| 149 task_set)); | |
| 150 } | 148 } |
| 151 | 149 |
| 152 for (RasterTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); | 150 for (TileTaskQueue::Item::Vector::const_iterator it = queue->items.begin(); |
| 153 it != queue->items.end(); | 151 it != queue->items.end(); ++it) { |
| 154 ++it) { | 152 const TileTaskQueue::Item& item = *it; |
| 155 const RasterTaskQueue::Item& item = *it; | |
| 156 RasterTask* task = item.task; | 153 RasterTask* task = item.task; |
| 157 DCHECK(!task->HasCompleted()); | 154 DCHECK(!task->HasCompleted()); |
| 158 | 155 |
| 159 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 156 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
| 160 if (!item.task_sets[task_set]) | 157 if (!item.task_sets[task_set]) |
| 161 continue; | 158 continue; |
| 162 | 159 |
| 163 ++task_count[task_set]; | 160 ++task_count[task_set]; |
| 164 | 161 |
| 165 graph_.edges.push_back( | 162 graph_.edges.push_back( |
| 166 TaskGraph::Edge(task, new_raster_finished_tasks[task_set].get())); | 163 TaskGraph::Edge(task, new_task_set_finished_tasks[task_set].get())); |
| 167 } | 164 } |
| 168 | 165 |
| 169 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); | 166 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); |
| 170 } | 167 } |
| 171 | 168 |
| 172 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { | 169 for (TaskSet task_set = 0; task_set < kNumberOfTaskSets; ++task_set) { |
| 173 InsertNodeForTask(&graph_, | 170 InsertNodeForTask(&graph_, new_task_set_finished_tasks[task_set].get(), |
| 174 new_raster_finished_tasks[task_set].get(), | 171 kTaskSetFinishedTaskPriority, task_count[task_set]); |
| 175 kRasterFinishedTaskPriority, | |
| 176 task_count[task_set]); | |
| 177 } | 172 } |
| 178 | 173 |
| 179 ScheduleTasksOnOriginThread(this, &graph_); | 174 ScheduleTasksOnOriginThread(this, &graph_); |
| 180 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); | 175 task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); |
| 181 | 176 |
| 182 ScheduleRunTasksOnOriginThread(); | 177 ScheduleRunTasksOnOriginThread(); |
| 183 | 178 |
| 184 std::copy(new_raster_finished_tasks, | 179 std::copy(new_task_set_finished_tasks, |
| 185 new_raster_finished_tasks + kNumberOfTaskSets, | 180 new_task_set_finished_tasks + kNumberOfTaskSets, |
| 186 raster_finished_tasks_); | 181 task_set_finished_tasks_); |
| 187 } | 182 } |
| 188 | 183 |
| 189 void GpuRasterWorkerPool::CheckForCompletedTasks() { | 184 void GpuTileTaskWorkerPool::CheckForCompletedTasks() { |
| 190 TRACE_EVENT0("cc", "GpuRasterWorkerPool::CheckForCompletedTasks"); | 185 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::CheckForCompletedTasks"); |
| 191 | 186 |
| 192 task_graph_runner_->CollectCompletedTasks(namespace_token_, | 187 task_graph_runner_->CollectCompletedTasks(namespace_token_, |
| 193 &completed_tasks_); | 188 &completed_tasks_); |
| 194 for (Task::Vector::const_iterator it = completed_tasks_.begin(); | 189 for (Task::Vector::const_iterator it = completed_tasks_.begin(); |
| 195 it != completed_tasks_.end(); | 190 it != completed_tasks_.end(); |
| 196 ++it) { | 191 ++it) { |
| 197 RasterizerTask* task = static_cast<RasterizerTask*>(it->get()); | 192 TileTask* task = static_cast<TileTask*>(it->get()); |
| 198 | 193 |
| 199 task->WillComplete(); | 194 task->WillComplete(); |
| 200 task->CompleteOnOriginThread(this); | 195 task->CompleteOnOriginThread(this); |
| 201 task->DidComplete(); | 196 task->DidComplete(); |
| 202 | 197 |
| 203 task->RunReplyOnOriginThread(); | 198 task->RunReplyOnOriginThread(); |
| 204 } | 199 } |
| 205 completed_tasks_.clear(); | 200 completed_tasks_.clear(); |
| 206 } | 201 } |
| 207 | 202 |
| 208 scoped_ptr<RasterBuffer> GpuRasterWorkerPool::AcquireBufferForRaster( | 203 scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster( |
| 209 const Resource* resource) { | 204 const Resource* resource) { |
| 210 return make_scoped_ptr<RasterBuffer>( | 205 return make_scoped_ptr<RasterBuffer>( |
| 211 new RasterBufferImpl(resource_provider_, | 206 new RasterBufferImpl(resource_provider_, |
| 212 resource, | 207 resource, |
| 213 &multi_picture_draw_, | 208 &multi_picture_draw_, |
| 214 use_distance_field_text_)); | 209 use_distance_field_text_)); |
| 215 } | 210 } |
| 216 | 211 |
| 217 void GpuRasterWorkerPool::ReleaseBufferForRaster( | 212 void GpuTileTaskWorkerPool::ReleaseBufferForRaster( |
| 218 scoped_ptr<RasterBuffer> buffer) { | 213 scoped_ptr<RasterBuffer> buffer) { |
| 219 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. | 214 // Nothing to do here. RasterBufferImpl destructor cleans up after itself. |
| 220 } | 215 } |
| 221 | 216 |
| 222 void GpuRasterWorkerPool::OnRasterFinished(TaskSet task_set) { | 217 void GpuTileTaskWorkerPool::OnTaskSetFinished(TaskSet task_set) { |
| 223 TRACE_EVENT1( | 218 TRACE_EVENT1("cc", "GpuTileTaskWorkerPool::OnTaskSetFinished", "task_set", |
| 224 "cc", "GpuRasterWorkerPool::OnRasterFinished", "task_set", task_set); | 219 task_set); |
| 225 | 220 |
| 226 DCHECK(raster_pending_[task_set]); | 221 DCHECK(tasks_pending_[task_set]); |
| 227 raster_pending_[task_set] = false; | 222 tasks_pending_[task_set] = false; |
| 228 client_->DidFinishRunningTasks(task_set); | 223 client_->DidFinishRunningTileTasks(task_set); |
| 229 } | 224 } |
| 230 | 225 |
| 231 void GpuRasterWorkerPool::ScheduleRunTasksOnOriginThread() { | 226 void GpuTileTaskWorkerPool::ScheduleRunTasksOnOriginThread() { |
| 232 if (run_tasks_on_origin_thread_pending_) | 227 if (run_tasks_on_origin_thread_pending_) |
| 233 return; | 228 return; |
| 234 | 229 |
| 235 task_runner_->PostTask( | 230 task_runner_->PostTask( |
| 236 FROM_HERE, | 231 FROM_HERE, base::Bind(&GpuTileTaskWorkerPool::RunTasksOnOriginThread, |
| 237 base::Bind(&GpuRasterWorkerPool::RunTasksOnOriginThread, | 232 weak_ptr_factory_.GetWeakPtr())); |
| 238 weak_ptr_factory_.GetWeakPtr())); | |
| 239 run_tasks_on_origin_thread_pending_ = true; | 233 run_tasks_on_origin_thread_pending_ = true; |
| 240 } | 234 } |
| 241 | 235 |
| 242 void GpuRasterWorkerPool::RunTasksOnOriginThread() { | 236 void GpuTileTaskWorkerPool::RunTasksOnOriginThread() { |
| 243 TRACE_EVENT0("cc", "GpuRasterWorkerPool::RunTasksOnOriginThread"); | 237 TRACE_EVENT0("cc", "GpuTileTaskWorkerPool::RunTasksOnOriginThread"); |
| 244 | 238 |
| 245 DCHECK(run_tasks_on_origin_thread_pending_); | 239 DCHECK(run_tasks_on_origin_thread_pending_); |
| 246 run_tasks_on_origin_thread_pending_ = false; | 240 run_tasks_on_origin_thread_pending_ = false; |
| 247 | 241 |
| 248 ScopedGpuRaster gpu_raster(context_provider_); | 242 ScopedGpuRaster gpu_raster(context_provider_); |
| 249 task_graph_runner_->RunUntilIdle(); | 243 task_graph_runner_->RunUntilIdle(); |
| 250 | 244 |
| 251 // Draw each all of the pictures that were collected. This will also clear | 245 // Draw each all of the pictures that were collected. This will also clear |
| 252 // the pictures and canvases added to |multi_picture_draw_| | 246 // the pictures and canvases added to |multi_picture_draw_| |
| 253 multi_picture_draw_.draw(); | 247 multi_picture_draw_.draw(); |
| 254 } | 248 } |
| 255 | 249 |
| 256 } // namespace cc | 250 } // namespace cc |
| OLD | NEW |