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 <vector> | |
8 | |
7 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
8 #include "cc/resources/resource.h" | 10 #include "cc/resources/resource.h" |
9 #include "third_party/skia/include/core/SkDevice.h" | 11 #include "third_party/skia/include/core/SkDevice.h" |
10 | 12 |
11 namespace cc { | 13 namespace cc { |
12 | 14 |
13 namespace { | 15 namespace { |
14 | 16 |
15 class PixelBufferWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 17 class PixelBufferWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
16 public: | 18 public: |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
77 | 79 |
78 const int kCheckForCompletedRasterTasksDelayMs = 6; | 80 const int kCheckForCompletedRasterTasksDelayMs = 6; |
79 | 81 |
80 const size_t kMaxPendingRasterBytes = | 82 const size_t kMaxPendingRasterBytes = |
81 kMaxBytesUploadedPerMs * kCheckForCompletedRasterTasksDelayMs; | 83 kMaxBytesUploadedPerMs * kCheckForCompletedRasterTasksDelayMs; |
82 | 84 |
83 } // namespace | 85 } // namespace |
84 | 86 |
85 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool( | 87 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool( |
86 ResourceProvider* resource_provider, | 88 ResourceProvider* resource_provider, |
87 size_t num_threads) : RasterWorkerPool(resource_provider, num_threads), | 89 size_t num_threads) |
88 shutdown_(false), | 90 : RasterWorkerPool(resource_provider, num_threads), |
89 bytes_pending_upload_(0), | 91 shutdown_(false), |
90 has_performed_uploads_since_last_flush_(false), | 92 bytes_pending_upload_(0), |
91 check_for_completed_raster_tasks_pending_(false) { | 93 has_performed_uploads_since_last_flush_(false), |
94 check_for_completed_raster_tasks_pending_(false), | |
95 finished_running_tasks_pending_(false), | |
96 finished_running_tasks_required_for_activation_pending_(false) { | |
92 } | 97 } |
93 | 98 |
94 PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() { | 99 PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() { |
95 DCHECK(shutdown_); | 100 DCHECK(shutdown_); |
96 DCHECK(!check_for_completed_raster_tasks_pending_); | 101 DCHECK(!check_for_completed_raster_tasks_pending_); |
97 DCHECK_EQ(0u, pixel_buffer_tasks_.size()); | 102 DCHECK_EQ(0u, pixel_buffer_tasks_.size()); |
98 DCHECK_EQ(0u, tasks_with_pending_upload_.size()); | 103 DCHECK_EQ(0u, tasks_with_pending_upload_.size()); |
99 DCHECK_EQ(0u, completed_tasks_.size()); | 104 DCHECK_EQ(0u, completed_tasks_.size()); |
100 } | 105 } |
101 | 106 |
102 void PixelBufferRasterWorkerPool::Shutdown() { | 107 void PixelBufferRasterWorkerPool::Shutdown() { |
103 shutdown_ = true; | 108 shutdown_ = true; |
104 RasterWorkerPool::Shutdown(); | 109 RasterWorkerPool::Shutdown(); |
105 CheckForCompletedRasterTasks(); | 110 RasterWorkerPool::CheckForCompletedTasks(); |
111 CheckForCompletedUploads(); | |
112 check_for_completed_raster_tasks_callback_.Cancel(); | |
113 check_for_completed_raster_tasks_pending_ = false; | |
106 for (TaskMap::iterator it = pixel_buffer_tasks_.begin(); | 114 for (TaskMap::iterator it = pixel_buffer_tasks_.begin(); |
107 it != pixel_buffer_tasks_.end(); ++it) { | 115 it != pixel_buffer_tasks_.end(); ++it) { |
108 internal::RasterWorkerPoolTask* task = it->first; | 116 internal::RasterWorkerPoolTask* task = it->first; |
109 internal::WorkerPoolTask* pixel_buffer_task = it->second.get(); | 117 internal::WorkerPoolTask* pixel_buffer_task = it->second.get(); |
110 | 118 |
111 // All inactive tasks needs to be canceled. | 119 // All inactive tasks needs to be canceled. |
112 if (!pixel_buffer_task && !task->HasFinishedRunning()) { | 120 if (!pixel_buffer_task && !task->HasFinishedRunning()) { |
113 task->DidRun(true); | 121 task->DidRun(true); |
114 completed_tasks_.push_back(task); | 122 completed_tasks_.push_back(task); |
115 } | 123 } |
116 } | 124 } |
125 DCHECK_EQ(completed_tasks_.size(), pixel_buffer_tasks_.size()); | |
117 } | 126 } |
118 | 127 |
119 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { | 128 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { |
120 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks"); | 129 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks"); |
121 | 130 |
122 RasterWorkerPool::SetRasterTasks(queue); | 131 RasterWorkerPool::SetRasterTasks(queue); |
123 | 132 |
133 finished_running_tasks_pending_ = true; | |
134 finished_running_tasks_required_for_activation_pending_ = true; | |
135 | |
124 // Build new pixel buffer task set. | 136 // Build new pixel buffer task set. |
125 TaskMap new_pixel_buffer_tasks; | 137 TaskMap new_pixel_buffer_tasks; |
126 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); | 138 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); |
127 it != raster_tasks().end(); ++it) { | 139 it != raster_tasks().end(); ++it) { |
128 internal::RasterWorkerPoolTask* task = it->get(); | 140 internal::RasterWorkerPoolTask* task = it->get(); |
129 DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end()); | 141 DCHECK(new_pixel_buffer_tasks.find(task) == new_pixel_buffer_tasks.end()); |
130 DCHECK(!task->HasCompleted()); | 142 DCHECK(!task->HasCompleted()); |
131 | 143 |
132 // Use existing pixel buffer task if available. | 144 // Use existing pixel buffer task if available. |
133 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); | 145 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); |
(...skipping 19 matching lines...) Expand all Loading... | |
153 // Inactive task can be canceled. | 165 // Inactive task can be canceled. |
154 if (!pixel_buffer_task && !task->HasFinishedRunning()) { | 166 if (!pixel_buffer_task && !task->HasFinishedRunning()) { |
155 task->DidRun(true); | 167 task->DidRun(true); |
156 DCHECK(std::find(completed_tasks_.begin(), | 168 DCHECK(std::find(completed_tasks_.begin(), |
157 completed_tasks_.end(), | 169 completed_tasks_.end(), |
158 task) == completed_tasks_.end()); | 170 task) == completed_tasks_.end()); |
159 completed_tasks_.push_back(task); | 171 completed_tasks_.push_back(task); |
160 } | 172 } |
161 } | 173 } |
162 | 174 |
175 tasks_required_for_activation_.clear(); | |
176 for (TaskMap::iterator it = new_pixel_buffer_tasks.begin(); | |
177 it != new_pixel_buffer_tasks.end(); ++it) { | |
178 internal::RasterWorkerPoolTask* task = it->first; | |
179 if (IsRasterTaskRequiredForActivation(task)) | |
180 tasks_required_for_activation_.insert(task); | |
181 } | |
182 | |
163 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks); | 183 pixel_buffer_tasks_.swap(new_pixel_buffer_tasks); |
164 | 184 |
165 // This will schedule more tasks after checking for completed raster | 185 // Check for completed tasks when ScheduleTasks() is called as |
166 // tasks. It's worth checking for completed tasks when ScheduleTasks() | 186 // priorities might have changed and this maximizes the number |
167 // is called as priorities might have changed and this allows us to | 187 // of top priority tasks that are scheduled. |
168 // schedule as many new top priority tasks as possible. | 188 RasterWorkerPool::CheckForCompletedTasks(); |
169 CheckForCompletedRasterTasks(); | 189 CheckForCompletedUploads(); |
190 FlushUploads(); | |
191 | |
192 // Schedule new tasks. | |
193 ScheduleMoreTasks(); | |
194 | |
195 // Cancel any pending check for completed raster tasks and schedule | |
196 // another check. | |
197 check_for_completed_raster_tasks_callback_.Cancel(); | |
198 check_for_completed_raster_tasks_pending_ = false; | |
199 ScheduleCheckForCompletedRasterTasks(); | |
170 } | 200 } |
171 | 201 |
172 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { | 202 void PixelBufferRasterWorkerPool::CheckForCompletedTasks() { |
173 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks"); | 203 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::CheckForCompletedTasks"); |
174 | 204 |
175 RasterWorkerPool::CheckForCompletedTasks(); | 205 RasterWorkerPool::CheckForCompletedTasks(); |
176 CheckForCompletedUploads(); | 206 CheckForCompletedUploads(); |
177 FlushUploads(); | 207 FlushUploads(); |
178 | 208 |
179 while (!completed_tasks_.empty()) { | 209 TaskDeque completed_tasks; |
180 internal::RasterWorkerPoolTask* task = completed_tasks_.front().get(); | 210 completed_tasks_.swap(completed_tasks); |
211 | |
212 while (!completed_tasks.empty()) { | |
213 internal::RasterWorkerPoolTask* task = completed_tasks.front().get(); | |
181 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); | 214 DCHECK(pixel_buffer_tasks_.find(task) != pixel_buffer_tasks_.end()); |
182 | 215 |
183 pixel_buffer_tasks_.erase(task); | 216 pixel_buffer_tasks_.erase(task); |
184 | 217 |
185 task->WillComplete(); | 218 task->WillComplete(); |
186 task->CompleteOnOriginThread(); | 219 task->CompleteOnOriginThread(); |
187 task->DidComplete(); | 220 task->DidComplete(); |
188 | 221 |
189 completed_tasks_.pop_front(); | 222 completed_tasks.pop_front(); |
190 } | 223 } |
191 } | 224 } |
192 | 225 |
193 void PixelBufferRasterWorkerPool::OnRasterTasksFinished() { | 226 void PixelBufferRasterWorkerPool::OnRasterTasksFinished() { |
194 // Call CheckForCompletedTasks() when we've finished running all raster | 227 // Call CheckForCompletedRasterTasks() when we've finished running all |
195 // tasks needed since last time ScheduleMoreTasks() was called. This | 228 // raster tasks needed since last time ScheduleTasks() was called. This |
196 // reduces latency when processing only a small number of raster tasks. | 229 // reduces latency when processing only a small number of raster tasks. |
197 CheckForCompletedRasterTasks(); | 230 CheckForCompletedRasterTasks(); |
198 } | 231 } |
199 | 232 |
233 void PixelBufferRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() { | |
234 // Handle this the same way as when finished running all raster tasks. | |
235 OnRasterTasksFinished(); | |
236 } | |
237 | |
200 void PixelBufferRasterWorkerPool::FlushUploads() { | 238 void PixelBufferRasterWorkerPool::FlushUploads() { |
201 if (!has_performed_uploads_since_last_flush_) | 239 if (!has_performed_uploads_since_last_flush_) |
202 return; | 240 return; |
203 | 241 |
204 resource_provider()->ShallowFlushIfSupported(); | 242 resource_provider()->ShallowFlushIfSupported(); |
205 has_performed_uploads_since_last_flush_ = false; | 243 has_performed_uploads_since_last_flush_ = false; |
206 } | 244 } |
207 | 245 |
208 void PixelBufferRasterWorkerPool::CheckForCompletedUploads() { | 246 void PixelBufferRasterWorkerPool::CheckForCompletedUploads() { |
209 TaskDeque tasks_with_completed_uploads; | 247 TaskDeque tasks_with_completed_uploads; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
265 | 303 |
266 bytes_pending_upload_ -= task->resource()->bytes(); | 304 bytes_pending_upload_ -= task->resource()->bytes(); |
267 | 305 |
268 task->DidRun(false); | 306 task->DidRun(false); |
269 | 307 |
270 DCHECK(std::find(completed_tasks_.begin(), | 308 DCHECK(std::find(completed_tasks_.begin(), |
271 completed_tasks_.end(), | 309 completed_tasks_.end(), |
272 task) == completed_tasks_.end()); | 310 task) == completed_tasks_.end()); |
273 completed_tasks_.push_back(task); | 311 completed_tasks_.push_back(task); |
274 | 312 |
313 tasks_required_for_activation_.erase(task); | |
314 | |
275 tasks_with_completed_uploads.pop_front(); | 315 tasks_with_completed_uploads.pop_front(); |
276 } | 316 } |
277 } | 317 } |
278 | 318 |
279 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() { | 319 void PixelBufferRasterWorkerPool::ScheduleCheckForCompletedRasterTasks() { |
280 if (check_for_completed_raster_tasks_pending_) | 320 if (check_for_completed_raster_tasks_pending_) |
281 return; | 321 return; |
282 | 322 |
283 check_for_completed_raster_tasks_callback_.Reset( | 323 check_for_completed_raster_tasks_callback_.Reset( |
284 base::Bind(&PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks, | 324 base::Bind(&PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks, |
285 base::Unretained(this))); | 325 base::Unretained(this))); |
286 base::MessageLoopProxy::current()->PostDelayedTask( | 326 base::MessageLoopProxy::current()->PostDelayedTask( |
287 FROM_HERE, | 327 FROM_HERE, |
288 check_for_completed_raster_tasks_callback_.callback(), | 328 check_for_completed_raster_tasks_callback_.callback(), |
289 base::TimeDelta::FromMilliseconds(kCheckForCompletedRasterTasksDelayMs)); | 329 base::TimeDelta::FromMilliseconds(kCheckForCompletedRasterTasksDelayMs)); |
290 check_for_completed_raster_tasks_pending_ = true; | 330 check_for_completed_raster_tasks_pending_ = true; |
291 } | 331 } |
292 | 332 |
293 void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() { | 333 void PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks() { |
294 TRACE_EVENT0( | 334 TRACE_EVENT0( |
295 "cc", "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks"); | 335 "cc", "PixelBufferRasterWorkerPool::CheckForCompletedRasterTasks"); |
296 | 336 |
297 check_for_completed_raster_tasks_callback_.Cancel(); | 337 check_for_completed_raster_tasks_callback_.Cancel(); |
298 check_for_completed_raster_tasks_pending_ = false; | 338 check_for_completed_raster_tasks_pending_ = false; |
299 | 339 |
300 RasterWorkerPool::CheckForCompletedTasks(); | 340 RasterWorkerPool::CheckForCompletedTasks(); |
301 CheckForCompletedUploads(); | 341 CheckForCompletedUploads(); |
302 FlushUploads(); | 342 FlushUploads(); |
303 | 343 |
304 ScheduleMoreTasks(); | 344 // Determine if client should be notified and update pending notification |
345 // status before scheduling more raster tasks. | |
346 bool notify_client_that_finished_running_tasks_required_for_activation = | |
347 NotifyClientThatFinishedRunningTasksRequiredForActivation(); | |
vmpstr
2013/06/28 18:12:35
Maybe something like AreTaskRequiredForActivationF
reveman
2013/06/28 20:18:41
Cleaned this up a bit in latest patch. Let me know
| |
348 bool notify_client_that_finished_running_tasks = | |
349 NotifyClientThatFinishedRunningTasks(); | |
305 | 350 |
306 // Make sure another check for completed uploads is scheduled | 351 if (PendingRasterTaskCount()) |
307 // while there is still pending uploads left. | 352 ScheduleMoreTasks(); |
308 if (!tasks_with_pending_upload_.empty()) | 353 |
354 // Schedule another check for completed raster tasks while there are | |
355 // pending raster tasks or pending uploads. | |
356 if (PendingRasterTaskCount() || !tasks_with_pending_upload_.empty()) | |
309 ScheduleCheckForCompletedRasterTasks(); | 357 ScheduleCheckForCompletedRasterTasks(); |
358 | |
359 if (notify_client_that_finished_running_tasks_required_for_activation) | |
360 client()->DidFinishedRunningTasksRequiredForActivation(); | |
361 if (notify_client_that_finished_running_tasks) | |
362 client()->DidFinishedRunningTasks(); | |
310 } | 363 } |
311 | 364 |
312 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { | 365 void PixelBufferRasterWorkerPool::ScheduleMoreTasks() { |
313 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); | 366 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleMoreTasks"); |
314 | 367 |
368 enum RasterTaskType { | |
369 PREPAINT_TYPE = 0, | |
370 REQUIRED_FOR_ACTIVATION_TYPE = 1, | |
371 NUM_TYPES = 2 | |
372 }; | |
373 // TODO(reveman): Use StackVector instead. | |
374 std::vector<GraphNode*> tasks[NUM_TYPES]; | |
375 unsigned priority = 2u; // 0-1 reserved for RasterFinished tasks. | |
376 TaskGraph graph; | |
377 | |
315 size_t bytes_pending_upload = bytes_pending_upload_; | 378 size_t bytes_pending_upload = bytes_pending_upload_; |
316 size_t bytes_pending_raster = 0; | 379 size_t bytes_pending_raster = 0; |
317 | 380 |
318 RasterTaskGraph graph; | |
319 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); | 381 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); |
320 it != raster_tasks().end(); ++it) { | 382 it != raster_tasks().end(); ++it) { |
321 internal::RasterWorkerPoolTask* task = it->get(); | 383 internal::RasterWorkerPoolTask* task = it->get(); |
322 | 384 |
323 // |pixel_buffer_tasks_| contains all tasks that have not yet completed. | 385 // |pixel_buffer_tasks_| contains all tasks that have not yet completed. |
324 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); | 386 TaskMap::iterator pixel_buffer_it = pixel_buffer_tasks_.find(task); |
325 if (pixel_buffer_it == pixel_buffer_tasks_.end()) | 387 if (pixel_buffer_it == pixel_buffer_tasks_.end()) |
326 continue; | 388 continue; |
327 | 389 |
328 // HasFinishedRunning() will return true when set pixels has completed. | 390 // HasFinishedRunning() will return true when set pixels has completed. |
(...skipping 23 matching lines...) Expand all Loading... | |
352 size_t new_bytes_pending_raster = bytes_pending_raster; | 414 size_t new_bytes_pending_raster = bytes_pending_raster; |
353 new_bytes_pending_raster += task->resource()->bytes(); | 415 new_bytes_pending_raster += task->resource()->bytes(); |
354 if (new_bytes_pending_raster > kMaxPendingRasterBytes) | 416 if (new_bytes_pending_raster > kMaxPendingRasterBytes) |
355 break; | 417 break; |
356 | 418 |
357 // Update both |bytes_pending_raster| and |bytes_pending_upload| | 419 // Update both |bytes_pending_raster| and |bytes_pending_upload| |
358 // now that task has cleared all throttling limits. | 420 // now that task has cleared all throttling limits. |
359 bytes_pending_raster = new_bytes_pending_raster; | 421 bytes_pending_raster = new_bytes_pending_raster; |
360 bytes_pending_upload = new_bytes_pending_upload; | 422 bytes_pending_upload = new_bytes_pending_upload; |
361 | 423 |
424 RasterTaskType type = IsRasterTaskRequiredForActivation(task) ? | |
425 REQUIRED_FOR_ACTIVATION_TYPE : | |
426 PREPAINT_TYPE; | |
427 | |
362 // Use existing pixel buffer task if available. | 428 // Use existing pixel buffer task if available. |
363 if (pixel_buffer_task) { | 429 if (pixel_buffer_task) { |
364 graph.InsertRasterTask(pixel_buffer_task, task->dependencies()); | 430 tasks[type].push_back( |
431 CreateGraphNodeForRasterTask(pixel_buffer_task, | |
432 task->dependencies(), | |
433 priority++, | |
434 &graph)); | |
365 continue; | 435 continue; |
366 } | 436 } |
367 | 437 |
368 // Request a pixel buffer. This will reserve shared memory. | 438 // Request a pixel buffer. This will reserve shared memory. |
369 resource_provider()->AcquirePixelBuffer(task->resource()->id()); | 439 resource_provider()->AcquirePixelBuffer(task->resource()->id()); |
370 | 440 |
371 // MapPixelBuffer() returns NULL if context was lost at the time | 441 // MapPixelBuffer() returns NULL if context was lost at the time |
372 // AcquirePixelBuffer() was called. For simplicity we still post | 442 // AcquirePixelBuffer() was called. For simplicity we still post |
373 // a raster task that is essentially a noop in these situations. | 443 // a raster task that is essentially a noop in these situations. |
374 uint8* buffer = resource_provider()->MapPixelBuffer( | 444 uint8* buffer = resource_provider()->MapPixelBuffer( |
375 task->resource()->id()); | 445 task->resource()->id()); |
376 | 446 |
377 scoped_refptr<internal::WorkerPoolTask> new_pixel_buffer_task( | 447 scoped_refptr<internal::WorkerPoolTask> new_pixel_buffer_task( |
378 new PixelBufferWorkerPoolTaskImpl( | 448 new PixelBufferWorkerPoolTaskImpl( |
379 task, | 449 task, |
380 buffer, | 450 buffer, |
381 base::Bind(&PixelBufferRasterWorkerPool::OnRasterTaskCompleted, | 451 base::Bind(&PixelBufferRasterWorkerPool::OnRasterTaskCompleted, |
382 base::Unretained(this), | 452 base::Unretained(this), |
383 make_scoped_refptr(task)))); | 453 make_scoped_refptr(task)))); |
384 pixel_buffer_tasks_[task] = new_pixel_buffer_task; | 454 pixel_buffer_tasks_[task] = new_pixel_buffer_task; |
385 graph.InsertRasterTask(new_pixel_buffer_task.get(), task->dependencies()); | 455 tasks[type].push_back( |
456 CreateGraphNodeForRasterTask(new_pixel_buffer_task.get(), | |
457 task->dependencies(), | |
458 priority++, | |
459 &graph)); | |
386 } | 460 } |
387 | 461 |
388 SetRasterTaskGraph(&graph); | 462 scoped_refptr<internal::WorkerPoolTask> |
463 new_raster_required_for_activation_finished_task; | |
389 | 464 |
390 // At least one task that could need an upload is now pending, schedule | 465 DCHECK_LE(tasks[REQUIRED_FOR_ACTIVATION_TYPE].size(), |
391 // a check for completed raster tasks to ensure this upload is dispatched | 466 tasks_required_for_activation_.size()); |
392 // without too much latency. | 467 // Schedule OnRasterTasksRequiredForActivationFinished call when |
vmpstr
2013/06/28 18:12:35
nit: Schedule OnRaster.. call only when
reveman
2013/06/28 20:18:41
Done.
| |
393 if (bytes_pending_raster) | 468 // notification is pending and throttling is not preventing |
394 ScheduleCheckForCompletedRasterTasks(); | 469 // all pending tasks required for activation from being scheduled. |
470 if (tasks[REQUIRED_FOR_ACTIVATION_TYPE].size() == | |
471 tasks_required_for_activation_.size() && | |
472 finished_running_tasks_required_for_activation_pending_) { | |
473 new_raster_required_for_activation_finished_task = | |
474 CreateRasterRequiredForActivationFinishedTask(); | |
475 GraphNode* raster_required_for_activation_finished_node = | |
476 CreateGraphNodeForTask( | |
477 new_raster_required_for_activation_finished_task.get(), | |
478 0u, // Priority 0 | |
479 &graph); | |
480 for (unsigned j = 0; | |
vmpstr
2013/06/28 18:12:35
I still think this loop, and the inner loop around
reveman
2013/06/28 20:18:41
Move inner loop to a separate function.
| |
481 j < tasks[REQUIRED_FOR_ACTIVATION_TYPE].size(); | |
482 ++j) { | |
483 raster_required_for_activation_finished_node->add_dependency(); | |
484 tasks[REQUIRED_FOR_ACTIVATION_TYPE][j]->add_dependent( | |
485 raster_required_for_activation_finished_node); | |
486 } | |
487 } | |
488 | |
489 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task; | |
490 | |
491 DCHECK_LE(tasks[PREPAINT_TYPE].size() + | |
492 tasks[REQUIRED_FOR_ACTIVATION_TYPE].size(), | |
493 PendingRasterTaskCount()); | |
494 // Schedule OnRasterTasksFinished call when notification is pending | |
vmpstr
2013/06/28 18:12:35
nit: ... only when ...
reveman
2013/06/28 20:18:41
Done.
| |
495 // and throttling is not preventing all pending tasks from being | |
496 // scheduled. | |
497 if ((tasks[PREPAINT_TYPE].size() + | |
498 tasks[REQUIRED_FOR_ACTIVATION_TYPE].size()) == | |
499 PendingRasterTaskCount() && | |
500 finished_running_tasks_pending_) { | |
501 new_raster_finished_task = CreateRasterFinishedTask(); | |
502 GraphNode* raster_finished_node = | |
503 CreateGraphNodeForTask(new_raster_finished_task.get(), | |
504 1u, // Priority 1 | |
505 &graph); | |
506 for (unsigned type = 0; type < NUM_TYPES; ++type) { | |
507 for (unsigned i = 0; i < tasks[type].size(); ++i) { | |
508 raster_finished_node->add_dependency(); | |
509 tasks[type][i]->add_dependent(raster_finished_node); | |
510 } | |
511 } | |
512 } | |
513 | |
514 SetTaskGraph(&graph); | |
515 | |
516 set_raster_finished_task(new_raster_finished_task); | |
517 set_raster_required_for_activation_finished_task( | |
518 new_raster_required_for_activation_finished_task); | |
395 } | 519 } |
396 | 520 |
397 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( | 521 void PixelBufferRasterWorkerPool::OnRasterTaskCompleted( |
398 scoped_refptr<internal::RasterWorkerPoolTask> task, | 522 scoped_refptr<internal::RasterWorkerPoolTask> task, |
399 bool was_canceled, | 523 bool was_canceled, |
400 bool needs_upload) { | 524 bool needs_upload) { |
401 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted", | 525 TRACE_EVENT2("cc", "PixelBufferRasterWorkerPool::OnRasterTaskCompleted", |
402 "was_canceled", was_canceled, | 526 "was_canceled", was_canceled, |
403 "needs_upload", needs_upload); | 527 "needs_upload", needs_upload); |
404 | 528 |
405 DCHECK(pixel_buffer_tasks_.find(task.get()) != pixel_buffer_tasks_.end()); | 529 DCHECK(pixel_buffer_tasks_.find(task.get()) != pixel_buffer_tasks_.end()); |
406 | 530 |
407 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks(). | 531 // Balanced with MapPixelBuffer() call in ScheduleMoreTasks(). |
408 resource_provider()->UnmapPixelBuffer(task->resource()->id()); | 532 resource_provider()->UnmapPixelBuffer(task->resource()->id()); |
409 | 533 |
410 if (!needs_upload) { | 534 if (!needs_upload) { |
411 resource_provider()->ReleasePixelBuffer(task->resource()->id()); | 535 resource_provider()->ReleasePixelBuffer(task->resource()->id()); |
412 task->DidRun(was_canceled); | 536 task->DidRun(was_canceled); |
413 DCHECK(std::find(completed_tasks_.begin(), | 537 DCHECK(std::find(completed_tasks_.begin(), |
414 completed_tasks_.end(), | 538 completed_tasks_.end(), |
415 task) == completed_tasks_.end()); | 539 task) == completed_tasks_.end()); |
416 completed_tasks_.push_back(task); | 540 completed_tasks_.push_back(task); |
541 tasks_required_for_activation_.erase(task); | |
417 return; | 542 return; |
418 } | 543 } |
419 | 544 |
420 resource_provider()->BeginSetPixels(task->resource()->id()); | 545 resource_provider()->BeginSetPixels(task->resource()->id()); |
421 has_performed_uploads_since_last_flush_ = true; | 546 has_performed_uploads_since_last_flush_ = true; |
422 | 547 |
423 bytes_pending_upload_ += task->resource()->bytes(); | 548 bytes_pending_upload_ += task->resource()->bytes(); |
424 tasks_with_pending_upload_.push_back(task); | 549 tasks_with_pending_upload_.push_back(task); |
425 } | 550 } |
426 | 551 |
552 unsigned PixelBufferRasterWorkerPool::PendingRasterTaskCount() const { | |
553 unsigned num_completed_raster_tasks = | |
554 tasks_with_pending_upload_.size() + completed_tasks_.size(); | |
555 DCHECK_GE(pixel_buffer_tasks_.size(), num_completed_raster_tasks); | |
556 return pixel_buffer_tasks_.size() - num_completed_raster_tasks; | |
557 } | |
558 | |
559 bool PixelBufferRasterWorkerPool:: | |
560 NotifyClientThatFinishedRunningTasksRequiredForActivation() { | |
561 if (!finished_running_tasks_required_for_activation_pending_) | |
562 return false; | |
563 | |
564 if (!tasks_required_for_activation_.empty()) | |
565 return false; | |
566 | |
567 finished_running_tasks_required_for_activation_pending_ = false; | |
568 return true; | |
569 } | |
570 | |
571 bool PixelBufferRasterWorkerPool::NotifyClientThatFinishedRunningTasks() { | |
572 if (!finished_running_tasks_pending_) | |
573 return false; | |
574 | |
575 if (PendingRasterTaskCount()) | |
576 return false; | |
577 | |
578 if (!tasks_with_pending_upload_.empty()) | |
579 return false; | |
580 | |
581 finished_running_tasks_pending_ = false; | |
582 return true; | |
583 } | |
584 | |
427 } // namespace cc | 585 } // namespace cc |
OLD | NEW |