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 |