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

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

Issue 807233002: cc: GPU rasterize tiles synchronously in PrepareToDraw. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Missed 2 lines when splitting this from patch 743023002. Created 6 years 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
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/tile_task_worker_pool_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/tile_manager.h" 5 #include "cc/resources/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 10
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 state->SetInteger("canceled_count", stats.canceled_count); 196 state->SetInteger("canceled_count", stats.canceled_count);
197 return state; 197 return state;
198 } 198 }
199 199
200 // static 200 // static
201 scoped_ptr<TileManager> TileManager::Create( 201 scoped_ptr<TileManager> TileManager::Create(
202 TileManagerClient* client, 202 TileManagerClient* client,
203 base::SequencedTaskRunner* task_runner, 203 base::SequencedTaskRunner* task_runner,
204 ResourcePool* resource_pool, 204 ResourcePool* resource_pool,
205 TileTaskRunner* tile_task_runner, 205 TileTaskRunner* tile_task_runner,
206 Rasterizer* rasterizer,
206 size_t scheduled_raster_task_limit) { 207 size_t scheduled_raster_task_limit) {
207 return make_scoped_ptr(new TileManager(client, task_runner, resource_pool, 208 return make_scoped_ptr(new TileManager(client, task_runner, resource_pool,
208 tile_task_runner, 209 tile_task_runner, rasterizer,
209 scheduled_raster_task_limit)); 210 scheduled_raster_task_limit));
210 } 211 }
211 212
212 TileManager::TileManager( 213 TileManager::TileManager(
213 TileManagerClient* client, 214 TileManagerClient* client,
214 const scoped_refptr<base::SequencedTaskRunner>& task_runner, 215 const scoped_refptr<base::SequencedTaskRunner>& task_runner,
215 ResourcePool* resource_pool, 216 ResourcePool* resource_pool,
216 TileTaskRunner* tile_task_runner, 217 TileTaskRunner* tile_task_runner,
218 Rasterizer* rasterizer,
217 size_t scheduled_raster_task_limit) 219 size_t scheduled_raster_task_limit)
218 : client_(client), 220 : client_(client),
219 task_runner_(task_runner), 221 task_runner_(task_runner),
220 resource_pool_(resource_pool), 222 resource_pool_(resource_pool),
221 tile_task_runner_(tile_task_runner), 223 tile_task_runner_(tile_task_runner),
224 rasterizer_(rasterizer),
222 scheduled_raster_task_limit_(scheduled_raster_task_limit), 225 scheduled_raster_task_limit_(scheduled_raster_task_limit),
223 all_tiles_that_need_to_be_rasterized_are_scheduled_(true), 226 all_tiles_that_need_to_be_rasterized_are_scheduled_(true),
224 did_check_for_completed_tasks_since_last_schedule_tasks_(true), 227 did_check_for_completed_tasks_since_last_schedule_tasks_(true),
225 did_oom_on_last_assign_(false), 228 did_oom_on_last_assign_(false),
229 ready_to_activate_notifier_(
230 task_runner_.get(),
231 base::Bind(&TileManager::NotifyReadyToActivate,
232 base::Unretained(this))),
233 ready_to_draw_notifier_(
234 task_runner_.get(),
235 base::Bind(&TileManager::NotifyReadyToDraw, base::Unretained(this))),
226 ready_to_activate_check_notifier_( 236 ready_to_activate_check_notifier_(
227 task_runner_.get(), 237 task_runner_.get(),
228 base::Bind(&TileManager::CheckIfReadyToActivate, 238 base::Bind(&TileManager::CheckIfReadyToActivate,
229 base::Unretained(this))), 239 base::Unretained(this))),
230 ready_to_draw_check_notifier_( 240 ready_to_draw_check_notifier_(
231 task_runner_.get(), 241 task_runner_.get(),
232 base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))), 242 base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))),
233 did_notify_ready_to_activate_(false), 243 did_notify_ready_to_activate_(false),
234 did_notify_ready_to_draw_(false) { 244 did_notify_ready_to_draw_(false) {
235 tile_task_runner_->SetClient(this); 245 tile_task_runner_->SetClient(this);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 322
313 // When OOM, keep re-assigning memory until we reach a steady state 323 // When OOM, keep re-assigning memory until we reach a steady state
314 // where top-priority tiles are initialized. 324 // where top-priority tiles are initialized.
315 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && 325 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ &&
316 !memory_usage_above_limit) 326 !memory_usage_above_limit)
317 return; 327 return;
318 328
319 tile_task_runner_->CheckForCompletedTasks(); 329 tile_task_runner_->CheckForCompletedTasks();
320 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 330 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
321 331
332 client_->BuildRasterQueue(&raster_priority_queue_,
333 global_state_.tree_priority);
322 TileVector tiles_that_need_to_be_rasterized; 334 TileVector tiles_that_need_to_be_rasterized;
323 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); 335 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
336 scheduled_raster_task_limit_, false);
337 raster_priority_queue_.Reset();
324 338
325 // |tiles_that_need_to_be_rasterized| will be empty when we reach a 339 // |tiles_that_need_to_be_rasterized| will be empty when we reach a
326 // steady memory state. Keep scheduling tasks until we reach this state. 340 // steady memory state. Keep scheduling tasks until we reach this state.
327 if (!tiles_that_need_to_be_rasterized.empty()) { 341 if (!tiles_that_need_to_be_rasterized.empty()) {
328 ScheduleTasks(tiles_that_need_to_be_rasterized); 342 ScheduleTasks(tiles_that_need_to_be_rasterized);
329 return; 343 return;
330 } 344 }
331 345
332 FreeResourcesForReleasedTiles(); 346 FreeResourcesForReleasedTiles();
333 347
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 401
388 NOTREACHED(); 402 NOTREACHED();
389 } 403 }
390 404
391 void TileManager::PrepareTiles( 405 void TileManager::PrepareTiles(
392 const GlobalStateThatImpactsTilePriority& state) { 406 const GlobalStateThatImpactsTilePriority& state) {
393 TRACE_EVENT0("cc", "TileManager::PrepareTiles"); 407 TRACE_EVENT0("cc", "TileManager::PrepareTiles");
394 408
395 global_state_ = state; 409 global_state_ = state;
396 410
397 // We need to call CheckForCompletedTasks() once in-between each call 411 enum Rasterizer::PrepareTilesMode prepare_tiles_mode =
398 // to ScheduleTasks() to prevent canceled tasks from being scheduled. 412 rasterizer_->PrepareTilesMode();
399 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { 413
400 tile_task_runner_->CheckForCompletedTasks(); 414 if (prepare_tiles_mode != GpuRasterizer::PREPARE_NONE) {
401 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 415 // We need to call CheckForCompletedTasks() once in-between each call
416 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
417 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
418 tile_task_runner_->CheckForCompletedTasks();
419 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
420 }
421
422 FreeResourcesForReleasedTiles();
423 CleanUpReleasedTiles();
424
425 client_->BuildRasterQueue(&raster_priority_queue_,
426 global_state_.tree_priority);
427 TileVector tiles_that_need_to_be_rasterized;
428
429 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
430 scheduled_raster_task_limit_, false);
431
432 raster_priority_queue_.Reset();
433
434 // Schedule tile tasks.
435 ScheduleTasks(tiles_that_need_to_be_rasterized);
436
437 did_notify_ready_to_activate_ = false;
438 did_notify_ready_to_draw_ = false;
439 } else {
440 did_notify_ready_to_activate_ = false;
441 did_notify_ready_to_draw_ = false;
442 ready_to_activate_notifier_.Schedule();
443 ready_to_draw_notifier_.Schedule();
402 } 444 }
403 445
446 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD,
447 "state", BasicStateAsValue());
448
449 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
450 resource_pool_->total_memory_usage_bytes() -
451 resource_pool_->acquired_memory_usage_bytes());
452 }
453
454 void TileManager::PrepareTilesBeforeDraw(
455 const GlobalStateThatImpactsTilePriority& state) {
456 DCHECK(rasterizer_);
457 TRACE_EVENT0("cc", "TileManager::PrepareTilesBeforeDraw");
458
459 enum Rasterizer::PrepareTilesMode prepare_tiles_mode =
460 rasterizer_->PrepareTilesMode();
461
462 if (prepare_tiles_mode == GpuRasterizer::RASTERIZE_PRIORITIZED_TILES)
463 return;
464
465 global_state_ = state;
466
404 FreeResourcesForReleasedTiles(); 467 FreeResourcesForReleasedTiles();
405 CleanUpReleasedTiles(); 468 CleanUpReleasedTiles();
406 469
470 client_->BuildRasterQueue(&raster_priority_queue_,
471 global_state_.tree_priority);
407 TileVector tiles_that_need_to_be_rasterized; 472 TileVector tiles_that_need_to_be_rasterized;
408 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); 473 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
474 std::numeric_limits<size_t>::max(), true);
409 475
410 // Schedule tile tasks. 476 // We must reduce the amount of unused resoruces before calling
411 ScheduleTasks(tiles_that_need_to_be_rasterized); 477 // RunTasks to prevent usage from rising above limits.
478 resource_pool_->ReduceResourceUsage();
412 479
413 did_notify_ready_to_activate_ = false; 480 // Run and complete all raster task synchronously.
414 did_notify_ready_to_draw_ = false; 481 rasterizer_->RasterizeTiles(tiles_that_need_to_be_rasterized, resource_pool_,
482 this);
415 483
416 TRACE_EVENT_INSTANT1("cc", "DidPrepare", TRACE_EVENT_SCOPE_THREAD, "state", 484 // Use on-demand raster for any tiles that have not been been assigned
485 // memory. This ensures that we draw even when OOM.
486 while (!raster_priority_queue_.IsEmpty()) {
487 Tile* tile = raster_priority_queue_.Top();
488 ManagedTileState& mts = tile->managed_state();
489
490 if (tile->required_for_draw() && !mts.draw_info.IsReadyToDraw()) {
491 mts.draw_info.set_rasterize_on_demand();
492 client_->NotifyTileStateChanged(tile);
493 }
494 raster_priority_queue_.Pop();
495 }
496 raster_priority_queue_.Reset();
497
498 if (IsReadyToDraw())
499 client_->NotifyReadyToDraw();
500
501 TRACE_EVENT_INSTANT1("cc", "DidRasterize", TRACE_EVENT_SCOPE_THREAD, "state",
417 BasicStateAsValue()); 502 BasicStateAsValue());
418 503
419 TRACE_COUNTER_ID1("cc", 504 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
420 "unused_memory_bytes",
421 this,
422 resource_pool_->total_memory_usage_bytes() - 505 resource_pool_->total_memory_usage_bytes() -
423 resource_pool_->acquired_memory_usage_bytes()); 506 resource_pool_->acquired_memory_usage_bytes());
424 } 507 }
425 508
426 void TileManager::UpdateVisibleTiles() { 509 void TileManager::UpdateVisibleTiles() {
427 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); 510 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles");
428 511
429 tile_task_runner_->CheckForCompletedTasks(); 512 tile_task_runner_->CheckForCompletedTasks();
430 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 513 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
431 514
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 return priority.priority_bin > TilePriority::SOON; 598 return priority.priority_bin > TilePriority::SOON;
516 case ALLOW_ANYTHING: 599 case ALLOW_ANYTHING:
517 return priority.distance_to_visible == 600 return priority.distance_to_visible ==
518 std::numeric_limits<float>::infinity(); 601 std::numeric_limits<float>::infinity();
519 } 602 }
520 NOTREACHED(); 603 NOTREACHED();
521 return true; 604 return true;
522 } 605 }
523 606
524 void TileManager::AssignGpuMemoryToTiles( 607 void TileManager::AssignGpuMemoryToTiles(
525 TileVector* tiles_that_need_to_be_rasterized) { 608 TileVector* tiles_that_need_to_be_rasterized,
609 size_t scheduled_raster_task_limit,
610 bool required_for_draw_only) {
526 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); 611 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles");
527 612
528 // Maintain the list of released resources that can potentially be re-used 613 // Maintain the list of released resources that can potentially be re-used
529 // or deleted. 614 // or deleted.
530 // If this operation becomes expensive too, only do this after some 615 // If this operation becomes expensive too, only do this after some
531 // resource(s) was returned. Note that in that case, one also need to 616 // resource(s) was returned. Note that in that case, one also need to
532 // invalidate when releasing some resource from the pool. 617 // invalidate when releasing some resource from the pool.
533 resource_pool_->CheckBusyResources(false); 618 resource_pool_->CheckBusyResources(false);
534 619
535 // Now give memory out to the tiles until we're out, and build 620 // Now give memory out to the tiles until we're out, and build
536 // the needs-to-be-rasterized queue. 621 // the needs-to-be-rasterized queue.
537 unsigned schedule_priority = 1u; 622 unsigned schedule_priority = 1u;
538 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; 623 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true;
539 bool had_enough_memory_to_schedule_tiles_needed_now = true; 624 bool had_enough_memory_to_schedule_tiles_needed_now = true;
540 625
541 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, 626 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes,
542 global_state_.num_resources_limit); 627 global_state_.num_resources_limit);
543 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, 628 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes,
544 global_state_.num_resources_limit); 629 global_state_.num_resources_limit);
545 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), 630 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(),
546 resource_pool_->acquired_resource_count()); 631 resource_pool_->acquired_resource_count());
547 632
548 eviction_priority_queue_is_up_to_date_ = false; 633 eviction_priority_queue_is_up_to_date_ = false;
549 client_->BuildRasterQueue(&raster_priority_queue_,
550 global_state_.tree_priority);
551 634
552 while (!raster_priority_queue_.IsEmpty()) { 635 while (!raster_priority_queue_.IsEmpty()) {
553 Tile* tile = raster_priority_queue_.Top(); 636 Tile* tile = raster_priority_queue_.Top();
637
638 if (required_for_draw_only) {
639 if (!tile->required_for_draw()) {
640 raster_priority_queue_.Pop();
641 continue;
642 }
643 }
644
554 TilePriority priority = tile->combined_priority(); 645 TilePriority priority = tile->combined_priority();
555 646
556 if (TilePriorityViolatesMemoryPolicy(priority)) { 647 if (TilePriorityViolatesMemoryPolicy(priority)) {
557 TRACE_EVENT_INSTANT0( 648 TRACE_EVENT_INSTANT0(
558 "cc", 649 "cc", "TileManager::AssignGpuMemory tile violates memory policy",
559 "TileManager::AssignGpuMemory tile violates memory policy",
560 TRACE_EVENT_SCOPE_THREAD); 650 TRACE_EVENT_SCOPE_THREAD);
561 break; 651 break;
562 } 652 }
563 653
564 // We won't be able to schedule this tile, so break out early. 654 // We won't be able to schedule this tile, so break out early.
565 if (tiles_that_need_to_be_rasterized->size() >= 655 if (tiles_that_need_to_be_rasterized->size() >=
566 scheduled_raster_task_limit_) { 656 scheduled_raster_task_limit) {
567 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; 657 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
568 break; 658 break;
569 } 659 }
570 660
571 ManagedTileState& mts = tile->managed_state(); 661 ManagedTileState& mts = tile->managed_state();
572 mts.scheduled_priority = schedule_priority++; 662 mts.scheduled_priority = schedule_priority++;
573 mts.resolution = priority.resolution; 663 mts.resolution = priority.resolution;
574 664
575 DCHECK(mts.draw_info.mode() == 665 DCHECK(mts.draw_info.mode() ==
576 ManagedTileState::DrawInfo::PICTURE_PILE_MODE || 666 ManagedTileState::DrawInfo::PICTURE_PILE_MODE ||
(...skipping 12 matching lines...) Expand all
589 679
590 // This is the memory limit that will be used by this tile. Depending on 680 // This is the memory limit that will be used by this tile. Depending on
591 // the tile priority, it will be one of hard_memory_limit or 681 // the tile priority, it will be one of hard_memory_limit or
592 // soft_memory_limit. 682 // soft_memory_limit.
593 MemoryUsage& tile_memory_limit = 683 MemoryUsage& tile_memory_limit =
594 tile_is_needed_now ? hard_memory_limit : soft_memory_limit; 684 tile_is_needed_now ? hard_memory_limit : soft_memory_limit;
595 685
596 bool memory_usage_is_within_limit = 686 bool memory_usage_is_within_limit =
597 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( 687 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit(
598 tile_memory_limit - memory_required_by_tile_to_be_scheduled, 688 tile_memory_limit - memory_required_by_tile_to_be_scheduled,
599 priority, 689 priority, &memory_usage);
600 &memory_usage);
601 690
602 // If we couldn't fit the tile into our current memory limit, then we're 691 // If we couldn't fit the tile into our current memory limit, then we're
603 // done. 692 // done.
604 if (!memory_usage_is_within_limit) { 693 if (!memory_usage_is_within_limit) {
605 if (tile_is_needed_now) 694 if (tile_is_needed_now)
606 had_enough_memory_to_schedule_tiles_needed_now = false; 695 had_enough_memory_to_schedule_tiles_needed_now = false;
607 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; 696 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
608 break; 697 break;
609 } 698 }
610 699
(...skipping 10 matching lines...) Expand all
621 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", 710 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget",
622 !had_enough_memory_to_schedule_tiles_needed_now); 711 !had_enough_memory_to_schedule_tiles_needed_now);
623 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; 712 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now;
624 713
625 memory_stats_from_last_assign_.total_budget_in_bytes = 714 memory_stats_from_last_assign_.total_budget_in_bytes =
626 global_state_.hard_memory_limit_in_bytes; 715 global_state_.hard_memory_limit_in_bytes;
627 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes(); 716 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes();
628 memory_stats_from_last_assign_.had_enough_memory = 717 memory_stats_from_last_assign_.had_enough_memory =
629 had_enough_memory_to_schedule_tiles_needed_now; 718 had_enough_memory_to_schedule_tiles_needed_now;
630 719
631 raster_priority_queue_.Reset(); 720 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles",
632
633 TRACE_EVENT_END2("cc",
634 "TileManager::AssignGpuMemoryToTiles",
635 "all_tiles_that_need_to_be_rasterized_are_scheduled", 721 "all_tiles_that_need_to_be_rasterized_are_scheduled",
636 all_tiles_that_need_to_be_rasterized_are_scheduled_, 722 all_tiles_that_need_to_be_rasterized_are_scheduled_,
637 "had_enough_memory_to_schedule_tiles_needed_now", 723 "had_enough_memory_to_schedule_tiles_needed_now",
638 had_enough_memory_to_schedule_tiles_needed_now); 724 had_enough_memory_to_schedule_tiles_needed_now);
639 } 725 }
640 726
641 void TileManager::FreeResourcesForTile(Tile* tile) { 727 void TileManager::FreeResourcesForTile(Tile* tile) {
642 ManagedTileState& mts = tile->managed_state(); 728 ManagedTileState& mts = tile->managed_state();
643 if (mts.draw_info.resource_) 729 if (mts.draw_info.resource_)
644 resource_pool_->ReleaseResource(mts.draw_info.resource_.Pass()); 730 resource_pool_->ReleaseResource(mts.draw_info.resource_.Pass());
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 return; 862 return;
777 863
778 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; 864 PixelRefTaskMap& pixel_ref_tasks = layer_it->second;
779 PixelRefTaskMap::iterator task_it = 865 PixelRefTaskMap::iterator task_it =
780 pixel_ref_tasks.find(pixel_ref->getGenerationID()); 866 pixel_ref_tasks.find(pixel_ref->getGenerationID());
781 867
782 if (task_it != pixel_ref_tasks.end()) 868 if (task_it != pixel_ref_tasks.end())
783 pixel_ref_tasks.erase(task_it); 869 pixel_ref_tasks.erase(task_it);
784 } 870 }
785 871
872 void TileManager::CompleteRasterTask(
873 Tile::Id tile_id,
874 scoped_ptr<ScopedResource> resource,
875 const RasterSource::SolidColorAnalysis& analysis) {
876 OnRasterTaskCompleted(tile_id, resource.Pass(), analysis, false);
877 }
878
786 void TileManager::OnRasterTaskCompleted( 879 void TileManager::OnRasterTaskCompleted(
787 Tile::Id tile_id, 880 Tile::Id tile_id,
788 scoped_ptr<ScopedResource> resource, 881 scoped_ptr<ScopedResource> resource,
789 const RasterSource::SolidColorAnalysis& analysis, 882 const RasterSource::SolidColorAnalysis& analysis,
790 bool was_canceled) { 883 bool was_canceled) {
791 DCHECK(tiles_.find(tile_id) != tiles_.end()); 884 DCHECK(tiles_.find(tile_id) != tiles_.end());
792 885
793 Tile* tile = tiles_[tile_id]; 886 Tile* tile = tiles_[tile_id];
794 ManagedTileState& mts = tile->managed_state(); 887 ManagedTileState& mts = tile->managed_state();
795 DCHECK(mts.raster_task.get()); 888 if (mts.raster_task.get()) {
796 orphan_raster_tasks_.push_back(mts.raster_task); 889 orphan_raster_tasks_.push_back(mts.raster_task);
797 mts.raster_task = NULL; 890 mts.raster_task = NULL;
891 }
798 892
799 if (was_canceled) { 893 if (was_canceled) {
800 ++update_visible_tiles_stats_.canceled_count; 894 ++update_visible_tiles_stats_.canceled_count;
801 resource_pool_->ReleaseResource(resource.Pass()); 895 resource_pool_->ReleaseResource(resource.Pass());
802 return; 896 return;
803 } 897 }
804 898
805 ++update_visible_tiles_stats_.completed_count; 899 ++update_visible_tiles_stats_.completed_count;
806 900
807 if (analysis.is_solid_color) { 901 if (analysis.is_solid_color) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); 953 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers();
860 954
861 for (const auto& layer : layers) { 955 for (const auto& layer : layers) {
862 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) 956 if (!layer->AllTilesRequiredForDrawAreReadyToDraw())
863 return false; 957 return false;
864 } 958 }
865 959
866 return true; 960 return true;
867 } 961 }
868 962
963 void TileManager::NotifyReadyToActivate() {
964 TRACE_EVENT0("cc", "TileManager::NotifyReadyToActivate");
965 if (did_notify_ready_to_activate_)
966 return;
967 client_->NotifyReadyToActivate();
968 did_notify_ready_to_activate_ = true;
969 }
970
971 void TileManager::NotifyReadyToDraw() {
972 TRACE_EVENT0("cc", "TileManager::NotifyReadyToDraw");
973 if (did_notify_ready_to_draw_)
974 return;
975 client_->NotifyReadyToDraw();
976 did_notify_ready_to_draw_ = true;
977 }
978
869 void TileManager::CheckIfReadyToActivate() { 979 void TileManager::CheckIfReadyToActivate() {
870 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); 980 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate");
871 981
872 tile_task_runner_->CheckForCompletedTasks(); 982 tile_task_runner_->CheckForCompletedTasks();
873 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 983 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
874 984
875 if (did_notify_ready_to_activate_) 985 if (did_notify_ready_to_activate_)
876 return; 986 return;
877 if (!IsReadyToActivate()) 987 if (!IsReadyToActivate())
878 return; 988 return;
879 989
880 client_->NotifyReadyToActivate(); 990 NotifyReadyToActivate();
881 did_notify_ready_to_activate_ = true;
882 } 991 }
883 992
884 void TileManager::CheckIfReadyToDraw() { 993 void TileManager::CheckIfReadyToDraw() {
885 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw"); 994 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw");
886 995
887 tile_task_runner_->CheckForCompletedTasks(); 996 tile_task_runner_->CheckForCompletedTasks();
888 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 997 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
889 998
890 if (did_notify_ready_to_draw_) 999 if (did_notify_ready_to_draw_)
891 return; 1000 return;
892 if (!IsReadyToDraw()) 1001 if (!IsReadyToDraw())
893 return; 1002 return;
894 1003
895 client_->NotifyReadyToDraw(); 1004 NotifyReadyToDraw();
896 did_notify_ready_to_draw_ = true;
897 } 1005 }
898 1006
899 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { 1007 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) {
900 } 1008 }
901 1009
902 TileManager::MemoryUsage::MemoryUsage(int64 memory_bytes, int resource_count) 1010 TileManager::MemoryUsage::MemoryUsage(int64 memory_bytes, int resource_count)
903 : memory_bytes_(memory_bytes), resource_count_(resource_count) { 1011 : memory_bytes_(memory_bytes), resource_count_(resource_count) {
904 } 1012 }
905 1013
906 // static 1014 // static
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 result -= other; 1048 result -= other;
941 return result; 1049 return result;
942 } 1050 }
943 1051
944 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { 1052 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const {
945 return memory_bytes_ > limit.memory_bytes_ || 1053 return memory_bytes_ > limit.memory_bytes_ ||
946 resource_count_ > limit.resource_count_; 1054 resource_count_ > limit.resource_count_;
947 } 1055 }
948 1056
949 } // namespace cc 1057 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/tile_task_worker_pool_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698