OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/pixel_buffer_raster_worker_pool.h" | 5 #include "cc/resources/pixel_buffer_raster_worker_pool.h" |
6 | 6 |
7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "cc/resources/resource.h" | 8 #include "cc/resources/resource.h" |
9 #include "third_party/skia/include/core/SkDevice.h" | 9 #include "third_party/skia/include/core/SkDevice.h" |
10 | 10 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 DCHECK_EQ(0u, completed_tasks_.size()); | 98 DCHECK_EQ(0u, completed_tasks_.size()); |
99 } | 99 } |
100 | 100 |
101 void PixelBufferRasterWorkerPool::Shutdown() { | 101 void PixelBufferRasterWorkerPool::Shutdown() { |
102 RasterWorkerPool::Shutdown(); | 102 RasterWorkerPool::Shutdown(); |
103 CheckForCompletedRasterTasks(); | 103 CheckForCompletedRasterTasks(); |
104 AbortPendingUploads(); | 104 AbortPendingUploads(); |
105 for (TaskMap::iterator it = pixel_buffer_tasks_.begin(); | 105 for (TaskMap::iterator it = pixel_buffer_tasks_.begin(); |
106 it != pixel_buffer_tasks_.end(); ++it) { | 106 it != pixel_buffer_tasks_.end(); ++it) { |
107 internal::RasterWorkerPoolTask* task = it->first; | 107 internal::RasterWorkerPoolTask* task = it->first; |
108 internal::WorkerPoolTask* pixel_buffer_task = it->second; | 108 internal::WorkerPoolTask* pixel_buffer_task = it->second.get(); |
109 | 109 |
110 // All inactive tasks needs to be canceled. | 110 // All inactive tasks needs to be canceled. |
111 if (!pixel_buffer_task) | 111 if (!pixel_buffer_task) |
112 completed_tasks_.push_back(task); | 112 completed_tasks_.push_back(task); |
113 } | 113 } |
114 // Cancel any pending OnRasterFinished callback. | 114 // Cancel any pending OnRasterFinished callback. |
115 weak_ptr_factory_.InvalidateWeakPtrs(); | 115 weak_ptr_factory_.InvalidateWeakPtrs(); |
116 } | 116 } |
117 | 117 |
118 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { | 118 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { |
119 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks"); | 119 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks"); |
120 | 120 |
121 RasterWorkerPool::SetRasterTasks(queue); | 121 RasterWorkerPool::SetRasterTasks(queue); |
122 | 122 |
123 // Build new pixel buffer task set. | 123 // Build new pixel buffer task set. |
124 TaskMap new_pixel_buffer_tasks; | 124 TaskMap new_pixel_buffer_tasks; |
125 for (RasterTask::Queue::TaskVector::const_iterator it = | 125 for (RasterTask::Queue::TaskVector::const_iterator it = |
126 raster_tasks().begin(); | 126 raster_tasks().begin(); |
127 it != raster_tasks().end(); ++it) { | 127 it != raster_tasks().end(); ++it) { |
128 internal::RasterWorkerPoolTask* task = *it; | 128 internal::RasterWorkerPoolTask* task = it->get(); |
129 DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end()); | 129 DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end()); |
130 DCHECK(!task->HasCompleted()); | 130 DCHECK(!task->HasCompleted()); |
131 | 131 |
132 // Use existing pixel buffer task if available. | 132 // Use existing pixel buffer task if available. |
133 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); | 133 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); |
134 if (pixel_buffer_it == pixel_buffer_tasks_.end()) { | 134 if (pixel_buffer_it == pixel_buffer_tasks_.end()) { |
135 new_pixel_buffer_tasks[task] = NULL; | 135 new_pixel_buffer_tasks[task] = NULL; |
136 continue; | 136 continue; |
137 } | 137 } |
138 | 138 |
139 new_pixel_buffer_tasks[task] = pixel_buffer_it->second; | 139 new_pixel_buffer_tasks[task] = pixel_buffer_it->second; |
140 pixel_buffer_tasks_.erase(task); | 140 pixel_buffer_tasks_.erase(task); |
141 } | 141 } |
142 | 142 |
143 // Transfer remaining pixel buffer tasks to |new_pixel_buffer_tasks| | 143 // Transfer remaining pixel buffer tasks to |new_pixel_buffer_tasks| |
144 // and cancel all remaining inactive tasks. | 144 // and cancel all remaining inactive tasks. |
145 for (TaskMap::iterator it = pixel_buffer_tasks_.begin(); | 145 for (TaskMap::iterator it = pixel_buffer_tasks_.begin(); |
146 it != pixel_buffer_tasks_.end(); ++it) { | 146 it != pixel_buffer_tasks_.end(); ++it) { |
147 internal::RasterWorkerPoolTask* task = it->first; | 147 internal::RasterWorkerPoolTask* task = it->first; |
148 internal::WorkerPoolTask* pixel_buffer_task = it->second; | 148 internal::WorkerPoolTask* pixel_buffer_task = it->second.get(); |
149 | 149 |
150 // Move task to |new_pixel_buffer_tasks| | 150 // Move task to |new_pixel_buffer_tasks| |
151 new_pixel_buffer_tasks[task] = pixel_buffer_task; | 151 new_pixel_buffer_tasks[task] = pixel_buffer_task; |
152 | 152 |
153 // Inactive task can be canceled. | 153 // Inactive task can be canceled. |
154 if (!pixel_buffer_task) | 154 if (!pixel_buffer_task) |
155 completed_tasks_.push_back(task); | 155 completed_tasks_.push_back(task); |
156 } | 156 } |
157 | 157 |
158 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks); | 158 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks); |
159 | 159 |
160 ScheduleMoreTasks(); | 160 ScheduleMoreTasks(); |
161 } | 161 } |
162 | 162 |
163 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { | 163 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { |
164 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks"); | 164 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks"); |
165 | 165 |
166 CheckForCompletedRasterTasks(); | 166 CheckForCompletedRasterTasks(); |
167 | 167 |
168 while (!completed_tasks_.empty()) { | 168 while (!completed_tasks_.empty()) { |
169 internal::RasterWorkerPoolTask* task = completed_tasks_.front(); | 169 internal::RasterWorkerPoolTask* task = completed_tasks_.front().get(); |
170 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); | 170 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); |
171 | 171 |
172 pixel_buffer_tasks_.erase(task); | 172 pixel_buffer_tasks_.erase(task); |
173 | 173 |
174 task->DidComplete(); | 174 task->DidComplete(); |
175 task->DispatchCompletionCallback(); | 175 task->DispatchCompletionCallback(); |
176 | 176 |
177 completed_tasks_.pop_front(); | 177 completed_tasks_.pop_front(); |
178 } | 178 } |
179 } | 179 } |
180 | 180 |
181 bool PixelBufferRasterWorkerPool::ForceUploadToComplete( | 181 bool PixelBufferRasterWorkerPool::ForceUploadToComplete( |
182 const RasterTask& raster_task) { | 182 const RasterTask& raster_task) { |
183 for (TaskDeque::iterator it = tasks_with_pending_upload_.begin(); | 183 for (TaskDeque::iterator it = tasks_with_pending_upload_.begin(); |
184 it != tasks_with_pending_upload_.end(); ++it) { | 184 it != tasks_with_pending_upload_.end(); ++it) { |
185 internal::RasterWorkerPoolTask* task = *it; | 185 internal::RasterWorkerPoolTask* task = it->get(); |
186 if (task == raster_task.internal_) { | 186 if (task == raster_task.internal_.get()) { |
187 resource_provider()->ForceSetPixelsToComplete(task->resource()->id()); | 187 resource_provider()->ForceSetPixelsToComplete(task->resource()->id()); |
188 return true; | 188 return true; |
189 } | 189 } |
190 } | 190 } |
191 | 191 |
192 return false; | 192 return false; |
193 } | 193 } |
194 | 194 |
195 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() { | 195 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() { |
196 if (check_for_completed_raster_tasks_pending_) | 196 if (check_for_completed_raster_tasks_pending_) |
(...skipping 17 matching lines...) Expand all Loading... |
214 check_for_completed_raster_tasks_pending_ = false; | 214 check_for_completed_raster_tasks_pending_ = false; |
215 | 215 |
216 WorkerPool::CheckForCompletedTasks(); | 216 WorkerPool::CheckForCompletedTasks(); |
217 | 217 |
218 if (has_performed_uploads_since_last_flush_) { | 218 if (has_performed_uploads_since_last_flush_) { |
219 resource_provider()->ShallowFlushIfSupported(); | 219 resource_provider()->ShallowFlushIfSupported(); |
220 has_performed_uploads_since_last_flush_ = false; | 220 has_performed_uploads_since_last_flush_ = false; |
221 } | 221 } |
222 | 222 |
223 while (!tasks_with_pending_upload_.empty()) { | 223 while (!tasks_with_pending_upload_.empty()) { |
224 internal::RasterWorkerPoolTask* task = tasks_with_pending_upload_.front(); | 224 internal::RasterWorkerPoolTask* task = |
| 225 tasks_with_pending_upload_.front().get(); |
225 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); | 226 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); |
226 | 227 |
227 // Uploads complete in the order they are issued. | 228 // Uploads complete in the order they are issued. |
228 if (!resource_provider()->DidSetPixelsComplete(task->resource()->id())) | 229 if (!resource_provider()->DidSetPixelsComplete(task->resource()->id())) |
229 break; | 230 break; |
230 | 231 |
231 // It's now safe to release the pixel buffer and the shared memory. | 232 // It's now safe to release the pixel buffer and the shared memory. |
232 resource_provider()->ReleasePixelBuffer(task->resource()->id()); | 233 resource_provider()->ReleasePixelBuffer(task->resource()->id()); |
233 | 234 |
234 bytes_pending_upload_ -= task->resource()->bytes(); | 235 bytes_pending_upload_ -= task->resource()->bytes(); |
(...skipping 11 matching lines...) Expand all Loading... |
246 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); | 247 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); |
247 | 248 |
248 size_t tasks_with_pending_upload = tasks_with_pending_upload_.size(); | 249 size_t tasks_with_pending_upload = tasks_with_pending_upload_.size(); |
249 size_t bytes_pending_upload = bytes_pending_upload_; | 250 size_t bytes_pending_upload = bytes_pending_upload_; |
250 | 251 |
251 internal::WorkerPoolTask::TaskVector tasks; | 252 internal::WorkerPoolTask::TaskVector tasks; |
252 | 253 |
253 for (RasterTask::Queue::TaskVector::const_iterator it = | 254 for (RasterTask::Queue::TaskVector::const_iterator it = |
254 raster_tasks().begin(); | 255 raster_tasks().begin(); |
255 it != raster_tasks().end(); ++it) { | 256 it != raster_tasks().end(); ++it) { |
256 internal::RasterWorkerPoolTask* task = *it; | 257 internal::RasterWorkerPoolTask* task = it->get(); |
257 | 258 |
258 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); | 259 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); |
259 if (pixel_buffer_it == pixel_buffer_tasks_.end()) | 260 if (pixel_buffer_it == pixel_buffer_tasks_.end()) |
260 continue; | 261 continue; |
261 | 262 |
262 scoped_refptr<internal::WorkerPoolTask> pixel_buffer_task( | 263 scoped_refptr<internal::WorkerPoolTask> pixel_buffer_task( |
263 pixel_buffer_it->second); | 264 pixel_buffer_it->second); |
264 if (pixel_buffer_task) { | 265 if (pixel_buffer_task.get()) { |
265 if (!pixel_buffer_task->HasCompleted()) | 266 if (!pixel_buffer_task->HasCompleted()) |
266 tasks.push_back(pixel_buffer_task); | 267 tasks.push_back(pixel_buffer_task); |
267 continue; | 268 continue; |
268 } | 269 } |
269 | 270 |
270 // Throttle raster tasks based on number of pending uploads. | 271 // Throttle raster tasks based on number of pending uploads. |
271 size_t new_tasks_with_pending_upload = tasks_with_pending_upload; | 272 size_t new_tasks_with_pending_upload = tasks_with_pending_upload; |
272 new_tasks_with_pending_upload += 1; | 273 new_tasks_with_pending_upload += 1; |
273 if (new_tasks_with_pending_upload > kMaxPendingUploads) | 274 if (new_tasks_with_pending_upload > kMaxPendingUploads) |
274 break; | 275 break; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 } | 335 } |
335 | 336 |
336 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( | 337 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( |
337 scoped_refptr<internal::RasterWorkerPoolTask> task, | 338 scoped_refptr<internal::RasterWorkerPoolTask> task, |
338 bool was_canceled, | 339 bool was_canceled, |
339 bool needs_upload) { | 340 bool needs_upload) { |
340 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted", | 341 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted", |
341 "was_canceled", was_canceled, | 342 "was_canceled", was_canceled, |
342 "needs_upload", needs_upload); | 343 "needs_upload", needs_upload); |
343 | 344 |
344 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); | 345 DCHECK(pixel_buffer_tasks_.find(task.get()) != pixel_buffer_tasks_.end()); |
345 | 346 |
346 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks(). | 347 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks(). |
347 resource_provider()->UnmapPixelBuffer(task->resource()->id()); | 348 resource_provider()->UnmapPixelBuffer(task->resource()->id()); |
348 | 349 |
349 if (!needs_upload) { | 350 if (!needs_upload) { |
350 resource_provider()->ReleasePixelBuffer(task->resource()->id()); | 351 resource_provider()->ReleasePixelBuffer(task->resource()->id()); |
351 // No upload needed. Dispatch completion callback. | 352 // No upload needed. Dispatch completion callback. |
352 if (!was_canceled) | 353 if (!was_canceled) |
353 task->DidRun(); | 354 task->DidRun(); |
354 | 355 |
355 completed_tasks_.push_back(task); | 356 completed_tasks_.push_back(task); |
356 return; | 357 return; |
357 } | 358 } |
358 | 359 |
359 resource_provider()->BeginSetPixels(task->resource()->id()); | 360 resource_provider()->BeginSetPixels(task->resource()->id()); |
360 has_performed_uploads_since_last_flush_ = true; | 361 has_performed_uploads_since_last_flush_ = true; |
361 | 362 |
362 bytes_pending_upload_ += task->resource()->bytes(); | 363 bytes_pending_upload_ += task->resource()->bytes(); |
363 tasks_with_pending_upload_.push_back(task); | 364 tasks_with_pending_upload_.push_back(task); |
364 } | 365 } |
365 | 366 |
366 void PixelBufferRasterWorkerPool::AbortPendingUploads() { | 367 void PixelBufferRasterWorkerPool::AbortPendingUploads() { |
367 while (!tasks_with_pending_upload_.empty()) { | 368 while (!tasks_with_pending_upload_.empty()) { |
368 internal::RasterWorkerPoolTask* task = tasks_with_pending_upload_.front(); | 369 internal::RasterWorkerPoolTask* task = |
| 370 tasks_with_pending_upload_.front().get(); |
369 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); | 371 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); |
370 | 372 |
371 resource_provider()->AbortSetPixels(task->resource()->id()); | 373 resource_provider()->AbortSetPixels(task->resource()->id()); |
372 resource_provider()->ReleasePixelBuffer(task->resource()->id()); | 374 resource_provider()->ReleasePixelBuffer(task->resource()->id()); |
373 | 375 |
374 bytes_pending_upload_ -= task->resource()->bytes(); | 376 bytes_pending_upload_ -= task->resource()->bytes(); |
375 | 377 |
376 // Need to run the reply callback even though task was aborted. | 378 // Need to run the reply callback even though task was aborted. |
377 completed_tasks_.push_back(task); | 379 completed_tasks_.push_back(task); |
378 | 380 |
(...skipping 16 matching lines...) Expand all Loading... |
395 | 397 |
396 // static | 398 // static |
397 void PixelBufferRasterWorkerPool::RunRasterFinishedTask( | 399 void PixelBufferRasterWorkerPool::RunRasterFinishedTask( |
398 scoped_refptr<base::MessageLoopProxy> origin_loop, | 400 scoped_refptr<base::MessageLoopProxy> origin_loop, |
399 const base::Closure& on_raster_finished_callback) { | 401 const base::Closure& on_raster_finished_callback) { |
400 TRACE_EVENT0("cc", "RasterWorkerPool::RunRasterFinishedTask"); | 402 TRACE_EVENT0("cc", "RasterWorkerPool::RunRasterFinishedTask"); |
401 origin_loop->PostTask(FROM_HERE, on_raster_finished_callback); | 403 origin_loop->PostTask(FROM_HERE, on_raster_finished_callback); |
402 } | 404 } |
403 | 405 |
404 } // namespace cc | 406 } // namespace cc |
OLD | NEW |