Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(501)

Side by Side Diff: cc/resources/pixel_buffer_raster_worker_pool.cc

Issue 99873007: cc: Simplify raster task completion notification logic (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Split off the bugfix. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/resources/pixel_buffer_raster_worker_pool.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/containers/stack_container.h" 7 #include "base/containers/stack_container.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/values.h" 9 #include "base/values.h"
10 #include "cc/debug/traced_value.h" 10 #include "cc/debug/traced_value.h"
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 size_t max_transfer_buffer_usage_bytes) 95 size_t max_transfer_buffer_usage_bytes)
96 : RasterWorkerPool(resource_provider, num_threads), 96 : RasterWorkerPool(resource_provider, num_threads),
97 shutdown_(false), 97 shutdown_(false),
98 scheduled_raster_task_count_(0), 98 scheduled_raster_task_count_(0),
99 bytes_pending_upload_(0), 99 bytes_pending_upload_(0),
100 max_bytes_pending_upload_(max_transfer_buffer_usage_bytes), 100 max_bytes_pending_upload_(max_transfer_buffer_usage_bytes),
101 has_performed_uploads_since_last_flush_(false), 101 has_performed_uploads_since_last_flush_(false),
102 check_for_completed_raster_tasks_pending_(false), 102 check_for_completed_raster_tasks_pending_(false),
103 should_notify_client_if_no_tasks_are_pending_(false), 103 should_notify_client_if_no_tasks_are_pending_(false),
104 should_notify_client_if_no_tasks_required_for_activation_are_pending_( 104 should_notify_client_if_no_tasks_required_for_activation_are_pending_(
105 false) { 105 false),
106 raster_finished_task_pending_(false),
107 raster_required_for_activation_finished_task_pending_(false) {
106 } 108 }
107 109
108 PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() { 110 PixelBufferRasterWorkerPool::~PixelBufferRasterWorkerPool() {
109 DCHECK(shutdown_); 111 DCHECK(shutdown_);
110 DCHECK(!check_for_completed_raster_tasks_pending_); 112 DCHECK(!check_for_completed_raster_tasks_pending_);
111 DCHECK_EQ(0u, pixel_buffer_tasks_.size()); 113 DCHECK_EQ(0u, pixel_buffer_tasks_.size());
112 DCHECK_EQ(0u, tasks_with_pending_upload_.size()); 114 DCHECK_EQ(0u, tasks_with_pending_upload_.size());
113 DCHECK_EQ(0u, completed_tasks_.size()); 115 DCHECK_EQ(0u, completed_tasks_.size());
114 } 116 }
115 117
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 completed_tasks.pop_front(); 250 completed_tasks.pop_front();
249 } 251 }
250 } 252 }
251 253
252 void PixelBufferRasterWorkerPool::OnRasterTasksFinished() { 254 void PixelBufferRasterWorkerPool::OnRasterTasksFinished() {
253 // |should_notify_client_if_no_tasks_are_pending_| can be set to false as 255 // |should_notify_client_if_no_tasks_are_pending_| can be set to false as
254 // a result of a scheduled CheckForCompletedRasterTasks() call. No need to 256 // a result of a scheduled CheckForCompletedRasterTasks() call. No need to
255 // perform another check in that case as we've already notified the client. 257 // perform another check in that case as we've already notified the client.
256 if (!should_notify_client_if_no_tasks_are_pending_) 258 if (!should_notify_client_if_no_tasks_are_pending_)
257 return; 259 return;
260 raster_finished_task_pending_ = false;
258 261
259 // Call CheckForCompletedRasterTasks() when we've finished running all 262 // Call CheckForCompletedRasterTasks() when we've finished running all
260 // raster tasks needed since last time ScheduleTasks() was called. 263 // raster tasks needed since last time ScheduleTasks() was called.
261 // This reduces latency between the time when all tasks have finished 264 // This reduces latency between the time when all tasks have finished
262 // running and the time when the client is notified. 265 // running and the time when the client is notified.
263 CheckForCompletedRasterTasks(); 266 CheckForCompletedRasterTasks();
264 } 267 }
265 268
266 void PixelBufferRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() { 269 void PixelBufferRasterWorkerPool::OnRasterTasksRequiredForActivationFinished() {
267 // Analogous to OnRasterTasksFinished(), there's no need to call 270 // Analogous to OnRasterTasksFinished(), there's no need to call
268 // CheckForCompletedRasterTasks() if the client has already been notified. 271 // CheckForCompletedRasterTasks() if the client has already been notified.
269 if (!should_notify_client_if_no_tasks_required_for_activation_are_pending_) 272 if (!should_notify_client_if_no_tasks_required_for_activation_are_pending_)
270 return; 273 return;
274 raster_required_for_activation_finished_task_pending_ = false;
271 275
272 // This reduces latency between the time when all tasks required for 276 // This reduces latency between the time when all tasks required for
273 // activation have finished running and the time when the client is 277 // activation have finished running and the time when the client is
274 // notified. 278 // notified.
275 CheckForCompletedRasterTasks(); 279 CheckForCompletedRasterTasks();
276 } 280 }
277 281
278 void PixelBufferRasterWorkerPool::FlushUploads() { 282 void PixelBufferRasterWorkerPool::FlushUploads() {
279 if (!has_performed_uploads_since_last_flush_) 283 if (!has_performed_uploads_since_last_flush_)
280 return; 284 return;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 check_for_completed_raster_tasks_callback_.Cancel(); 383 check_for_completed_raster_tasks_callback_.Cancel();
380 check_for_completed_raster_tasks_pending_ = false; 384 check_for_completed_raster_tasks_pending_ = false;
381 385
382 RasterWorkerPool::CheckForCompletedTasks(); 386 RasterWorkerPool::CheckForCompletedTasks();
383 CheckForCompletedUploads(); 387 CheckForCompletedUploads();
384 FlushUploads(); 388 FlushUploads();
385 389
386 // Determine what client notifications to generate. 390 // Determine what client notifications to generate.
387 bool will_notify_client_that_no_tasks_required_for_activation_are_pending = 391 bool will_notify_client_that_no_tasks_required_for_activation_are_pending =
388 (should_notify_client_if_no_tasks_required_for_activation_are_pending_ && 392 (should_notify_client_if_no_tasks_required_for_activation_are_pending_ &&
393 !raster_required_for_activation_finished_task_pending_ &&
389 !HasPendingTasksRequiredForActivation()); 394 !HasPendingTasksRequiredForActivation());
390 bool will_notify_client_that_no_tasks_are_pending = 395 bool will_notify_client_that_no_tasks_are_pending =
391 (should_notify_client_if_no_tasks_are_pending_ && 396 (should_notify_client_if_no_tasks_are_pending_ &&
397 !raster_finished_task_pending_ &&
392 !HasPendingTasks()); 398 !HasPendingTasks());
393 399
394 // Adjust the need to generate notifications before scheduling more tasks. 400 // Adjust the need to generate notifications before scheduling more tasks.
395 should_notify_client_if_no_tasks_required_for_activation_are_pending_ &= 401 should_notify_client_if_no_tasks_required_for_activation_are_pending_ &=
396 !will_notify_client_that_no_tasks_required_for_activation_are_pending; 402 !will_notify_client_that_no_tasks_required_for_activation_are_pending;
397 should_notify_client_if_no_tasks_are_pending_ &= 403 should_notify_client_if_no_tasks_are_pending_ &=
398 !will_notify_client_that_no_tasks_are_pending; 404 !will_notify_client_that_no_tasks_are_pending;
399 405
400 scheduled_raster_task_count_ = 0; 406 scheduled_raster_task_count_ = 0;
401 if (PendingRasterTaskCount()) 407 if (PendingRasterTaskCount())
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 DCHECK_LE(scheduled_raster_task_required_for_activation_count, 538 DCHECK_LE(scheduled_raster_task_required_for_activation_count,
533 tasks_required_for_activation_.size()); 539 tasks_required_for_activation_.size());
534 // Schedule OnRasterTasksRequiredForActivationFinished call only when 540 // Schedule OnRasterTasksRequiredForActivationFinished call only when
535 // notification is pending and throttling is not preventing all pending 541 // notification is pending and throttling is not preventing all pending
536 // tasks required for activation from being scheduled. 542 // tasks required for activation from being scheduled.
537 if (scheduled_raster_task_required_for_activation_count == 543 if (scheduled_raster_task_required_for_activation_count ==
538 tasks_required_for_activation_.size() && 544 tasks_required_for_activation_.size() &&
539 should_notify_client_if_no_tasks_required_for_activation_are_pending_) { 545 should_notify_client_if_no_tasks_required_for_activation_are_pending_) {
540 new_raster_required_for_activation_finished_task = 546 new_raster_required_for_activation_finished_task =
541 CreateRasterRequiredForActivationFinishedTask(); 547 CreateRasterRequiredForActivationFinishedTask();
548 raster_required_for_activation_finished_task_pending_ = true;
542 internal::GraphNode* raster_required_for_activation_finished_node = 549 internal::GraphNode* raster_required_for_activation_finished_node =
543 CreateGraphNodeForTask( 550 CreateGraphNodeForTask(
544 new_raster_required_for_activation_finished_task.get(), 551 new_raster_required_for_activation_finished_task.get(),
545 0u, // Priority 0 552 0u, // Priority 0
546 &graph); 553 &graph);
547 AddDependenciesToGraphNode( 554 AddDependenciesToGraphNode(
548 raster_required_for_activation_finished_node, 555 raster_required_for_activation_finished_node,
549 tasks[REQUIRED_FOR_ACTIVATION_TYPE].container()); 556 tasks[REQUIRED_FOR_ACTIVATION_TYPE].container());
550 } 557 }
551 558
552 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task; 559 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task;
553 560
554 size_t scheduled_raster_task_count = 561 size_t scheduled_raster_task_count =
555 tasks[PREPAINT_TYPE].container().size() + 562 tasks[PREPAINT_TYPE].container().size() +
556 tasks[REQUIRED_FOR_ACTIVATION_TYPE].container().size(); 563 tasks[REQUIRED_FOR_ACTIVATION_TYPE].container().size();
557 DCHECK_LE(scheduled_raster_task_count, PendingRasterTaskCount()); 564 DCHECK_LE(scheduled_raster_task_count, PendingRasterTaskCount());
558 // Schedule OnRasterTasksFinished call only when notification is pending 565 // Schedule OnRasterTasksFinished call only when notification is pending
559 // and throttling is not preventing all pending tasks from being scheduled. 566 // and throttling is not preventing all pending tasks from being scheduled.
560 if (!did_throttle_raster_tasks && 567 if (!did_throttle_raster_tasks &&
561 should_notify_client_if_no_tasks_are_pending_) { 568 should_notify_client_if_no_tasks_are_pending_) {
562 new_raster_finished_task = CreateRasterFinishedTask(); 569 new_raster_finished_task = CreateRasterFinishedTask();
570 raster_finished_task_pending_ = true;
563 internal::GraphNode* raster_finished_node = 571 internal::GraphNode* raster_finished_node =
564 CreateGraphNodeForTask(new_raster_finished_task.get(), 572 CreateGraphNodeForTask(new_raster_finished_task.get(),
565 1u, // Priority 1 573 1u, // Priority 1
566 &graph); 574 &graph);
567 for (unsigned type = 0; type < NUM_TYPES; ++type) { 575 for (unsigned type = 0; type < NUM_TYPES; ++type) {
568 AddDependenciesToGraphNode( 576 AddDependenciesToGraphNode(
569 raster_finished_node, 577 raster_finished_node,
570 tasks[type].container()); 578 tasks[type].container());
571 } 579 }
572 } 580 }
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
673 681
674 throttle_state->SetInteger("bytes_available_for_upload", 682 throttle_state->SetInteger("bytes_available_for_upload",
675 max_bytes_pending_upload_ - bytes_pending_upload_); 683 max_bytes_pending_upload_ - bytes_pending_upload_);
676 throttle_state->SetInteger("bytes_pending_upload", bytes_pending_upload_); 684 throttle_state->SetInteger("bytes_pending_upload", bytes_pending_upload_);
677 throttle_state->SetInteger("scheduled_raster_task_count", 685 throttle_state->SetInteger("scheduled_raster_task_count",
678 scheduled_raster_task_count_); 686 scheduled_raster_task_count_);
679 return throttle_state.PassAs<base::Value>(); 687 return throttle_state.PassAs<base::Value>();
680 } 688 }
681 689
682 } // namespace cc 690 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/pixel_buffer_raster_worker_pool.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698