| OLD | NEW |
| 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/tiles/tile_manager.h" | 5 #include "cc/tiles/tile_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 more_tiles_need_prepare_check_notifier_( | 359 more_tiles_need_prepare_check_notifier_( |
| 360 task_runner_, | 360 task_runner_, |
| 361 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, | 361 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, |
| 362 base::Unretained(this))), | 362 base::Unretained(this))), |
| 363 signals_check_notifier_(task_runner_, | 363 signals_check_notifier_(task_runner_, |
| 364 base::Bind(&TileManager::CheckAndIssueSignals, | 364 base::Bind(&TileManager::CheckAndIssueSignals, |
| 365 base::Unretained(this))), | 365 base::Unretained(this))), |
| 366 has_scheduled_tile_tasks_(false), | 366 has_scheduled_tile_tasks_(false), |
| 367 prepare_tiles_count_(0u), | 367 prepare_tiles_count_(0u), |
| 368 next_tile_id_(0u), | 368 next_tile_id_(0u), |
| 369 task_set_finished_weak_ptr_factory_(this) {} | 369 task_set_finished_weak_ptr_factory_(this), |
| 370 ready_to_draw_callback_weak_ptr_factory_(this) {} |
| 370 | 371 |
| 371 TileManager::~TileManager() { | 372 TileManager::~TileManager() { |
| 372 FinishTasksAndCleanUp(); | 373 FinishTasksAndCleanUp(); |
| 373 } | 374 } |
| 374 | 375 |
| 375 void TileManager::FinishTasksAndCleanUp() { | 376 void TileManager::FinishTasksAndCleanUp() { |
| 376 if (!tile_task_manager_) | 377 if (!tile_task_manager_) |
| 377 return; | 378 return; |
| 378 | 379 |
| 379 global_state_ = GlobalStateThatImpactsTilePriority(); | 380 global_state_ = GlobalStateThatImpactsTilePriority(); |
| 380 | 381 |
| 381 // This cancels tasks if possible, finishes pending tasks, and release any | 382 // This cancels tasks if possible, finishes pending tasks, and release any |
| 382 // uninitialized resources. | 383 // uninitialized resources. |
| 383 tile_task_manager_->Shutdown(); | 384 tile_task_manager_->Shutdown(); |
| 384 | 385 |
| 385 raster_buffer_provider_->Shutdown(); | 386 raster_buffer_provider_->Shutdown(); |
| 386 | 387 |
| 387 tile_task_manager_->CheckForCompletedTasks(); | 388 tile_task_manager_->CheckForCompletedTasks(); |
| 388 | 389 |
| 389 FreeResourcesForReleasedTiles(); | 390 FreeResourcesForReleasedTiles(); |
| 390 CleanUpReleasedTiles(); | 391 CleanUpReleasedTiles(); |
| 391 | 392 |
| 392 tile_task_manager_ = nullptr; | 393 tile_task_manager_ = nullptr; |
| 393 resource_pool_ = nullptr; | 394 resource_pool_ = nullptr; |
| 394 more_tiles_need_prepare_check_notifier_.Cancel(); | 395 more_tiles_need_prepare_check_notifier_.Cancel(); |
| 395 signals_check_notifier_.Cancel(); | 396 signals_check_notifier_.Cancel(); |
| 396 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 397 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 398 ready_to_draw_callback_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 397 raster_buffer_provider_ = nullptr; | 399 raster_buffer_provider_ = nullptr; |
| 398 | 400 |
| 399 image_controller_.SetImageDecodeCache(nullptr); | 401 image_controller_.SetImageDecodeCache(nullptr); |
| 400 locked_image_tasks_.clear(); | 402 locked_image_tasks_.clear(); |
| 401 } | 403 } |
| 402 | 404 |
| 403 void TileManager::SetResources(ResourcePool* resource_pool, | 405 void TileManager::SetResources(ResourcePool* resource_pool, |
| 404 ImageDecodeCache* image_decode_cache, | 406 ImageDecodeCache* image_decode_cache, |
| 405 TaskGraphRunner* task_graph_runner, | 407 TaskGraphRunner* task_graph_runner, |
| 406 RasterBufferProvider* raster_buffer_provider, | 408 RasterBufferProvider* raster_buffer_provider, |
| 407 size_t scheduled_raster_task_limit, | 409 size_t scheduled_raster_task_limit, |
| 408 bool use_gpu_rasterization) { | 410 bool use_gpu_rasterization) { |
| 409 DCHECK(!tile_task_manager_); | 411 DCHECK(!tile_task_manager_); |
| 410 DCHECK(task_graph_runner); | 412 DCHECK(task_graph_runner); |
| 411 | 413 |
| 412 use_gpu_rasterization_ = use_gpu_rasterization; | 414 use_gpu_rasterization_ = use_gpu_rasterization; |
| 413 scheduled_raster_task_limit_ = scheduled_raster_task_limit; | 415 scheduled_raster_task_limit_ = scheduled_raster_task_limit; |
| 414 resource_pool_ = resource_pool; | 416 resource_pool_ = resource_pool; |
| 415 image_controller_.SetImageDecodeCache(image_decode_cache); | 417 image_controller_.SetImageDecodeCache(image_decode_cache); |
| 416 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner); | 418 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner); |
| 417 raster_buffer_provider_ = raster_buffer_provider; | 419 raster_buffer_provider_ = raster_buffer_provider; |
| 418 } | 420 } |
| 419 | 421 |
| 420 void TileManager::Release(Tile* tile) { | 422 void TileManager::Release(Tile* tile) { |
| 421 released_tiles_.push_back(tile); | 423 released_tiles_.push_back(tile); |
| 424 // The |tile|'s owning PictureLayerTiling has released ownership and turned |
| 425 // the |
| 426 // |tile| over to TileManager for deletion. |
| 427 tile->set_tiling(nullptr); |
| 422 } | 428 } |
| 423 | 429 |
| 424 void TileManager::FreeResourcesForReleasedTiles() { | 430 void TileManager::FreeResourcesForReleasedTiles() { |
| 425 for (auto* tile : released_tiles_) | 431 for (auto* tile : released_tiles_) |
| 426 FreeResourcesForTile(tile); | 432 FreeResourcesForTile(tile); |
| 427 } | 433 } |
| 428 | 434 |
| 429 void TileManager::CleanUpReleasedTiles() { | 435 void TileManager::CleanUpReleasedTiles() { |
| 430 std::vector<Tile*> tiles_to_retain; | 436 std::vector<Tile*> tiles_to_retain; |
| 431 for (auto* tile : released_tiles_) { | 437 for (auto* tile : released_tiles_) { |
| 432 if (tile->HasRasterTask()) { | 438 if (tile->HasRasterTask()) { |
| 433 tiles_to_retain.push_back(tile); | 439 tiles_to_retain.push_back(tile); |
| 434 continue; | 440 continue; |
| 435 } | 441 } |
| 436 | 442 |
| 437 DCHECK(!tile->draw_info().has_resource()); | 443 DCHECK(!tile->draw_info().has_resource()); |
| 438 DCHECK(tiles_.find(tile->id()) != tiles_.end()); | 444 DCHECK(tiles_.find(tile->id()) != tiles_.end()); |
| 439 tiles_.erase(tile->id()); | 445 tiles_.erase(tile->id()); |
| 446 pending_ready_for_draw_tiles_.erase(tile); |
| 440 | 447 |
| 441 delete tile; | 448 delete tile; |
| 442 } | 449 } |
| 443 released_tiles_.swap(tiles_to_retain); | 450 released_tiles_.swap(tiles_to_retain); |
| 444 } | 451 } |
| 445 | 452 |
| 446 void TileManager::DidFinishRunningTileTasksRequiredForActivation() { | 453 void TileManager::DidFinishRunningTileTasksRequiredForActivation() { |
| 447 TRACE_EVENT0("cc", | 454 TRACE_EVENT0("cc", |
| 448 "TileManager::DidFinishRunningTileTasksRequiredForActivation"); | 455 "TileManager::DidFinishRunningTileTasksRequiredForActivation"); |
| 449 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", | 456 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 // We need to call CheckForCompletedTasks() once in-between each call | 513 // We need to call CheckForCompletedTasks() once in-between each call |
| 507 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 514 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
| 508 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 515 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
| 509 tile_task_manager_->CheckForCompletedTasks(); | 516 tile_task_manager_->CheckForCompletedTasks(); |
| 510 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 517 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 511 } | 518 } |
| 512 | 519 |
| 513 FreeResourcesForReleasedTiles(); | 520 FreeResourcesForReleasedTiles(); |
| 514 CleanUpReleasedTiles(); | 521 CleanUpReleasedTiles(); |
| 515 | 522 |
| 523 // The required for activate/draw status of tiles may have changed any time |
| 524 // PrepareTiles is called. |
| 525 pending_tile_requirements_dirty_ = true; |
| 526 |
| 516 PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles(); | 527 PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles(); |
| 517 | 528 |
| 518 // Inform the client that will likely require a draw if the highest priority | 529 // Inform the client that will likely require a draw if the highest priority |
| 519 // tile that will be rasterized is required for draw. | 530 // tile that will be rasterized is required for draw. |
| 520 client_->SetIsLikelyToRequireADraw( | 531 client_->SetIsLikelyToRequireADraw( |
| 521 !prioritized_work.tiles_to_raster.empty() && | 532 !prioritized_work.tiles_to_raster.empty() && |
| 522 prioritized_work.tiles_to_raster.front().tile()->required_for_draw()); | 533 prioritized_work.tiles_to_raster.front().tile()->required_for_draw()); |
| 523 | 534 |
| 524 // Schedule tile tasks. | 535 // Schedule tile tasks. |
| 525 ScheduleTasks(prioritized_work); | 536 ScheduleTasks(prioritized_work); |
| 526 | 537 |
| 527 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, | 538 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, |
| 528 "state", BasicStateAsValue()); | 539 "state", BasicStateAsValue()); |
| 529 return true; | 540 return true; |
| 530 } | 541 } |
| 531 | 542 |
| 532 void TileManager::Flush() { | 543 void TileManager::Flush() { |
| 533 TRACE_EVENT0("cc", "TileManager::Flush"); | 544 TRACE_EVENT0("cc", "TileManager::Flush"); |
| 534 | 545 |
| 535 if (!tile_task_manager_) { | 546 if (!tile_task_manager_) { |
| 536 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); | 547 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); |
| 537 return; | 548 return; |
| 538 } | 549 } |
| 539 | 550 |
| 540 tile_task_manager_->CheckForCompletedTasks(); | 551 tile_task_manager_->CheckForCompletedTasks(); |
| 541 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 552 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 553 CheckPendingReadyToDrawTiles(true /* issue_signals */); |
| 542 | 554 |
| 543 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", | 555 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", |
| 544 RasterTaskCompletionStatsAsValue(flush_stats_)); | 556 RasterTaskCompletionStatsAsValue(flush_stats_)); |
| 545 flush_stats_ = RasterTaskCompletionStats(); | 557 flush_stats_ = RasterTaskCompletionStats(); |
| 546 } | 558 } |
| 547 | 559 |
| 548 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> | 560 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> |
| 549 TileManager::BasicStateAsValue() const { | 561 TileManager::BasicStateAsValue() const { |
| 550 std::unique_ptr<base::trace_event::TracedValue> value( | 562 std::unique_ptr<base::trace_event::TracedValue> value( |
| 551 new base::trace_event::TracedValue()); | 563 new base::trace_event::TracedValue()); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 // or drop the tile for scheduling and raster. | 687 // or drop the tile for scheduling and raster. |
| 676 // TODO(sohanjg): Check if we could use a shared analysis | 688 // TODO(sohanjg): Check if we could use a shared analysis |
| 677 // canvas which is reset between tiles. | 689 // canvas which is reset between tiles. |
| 678 tile->set_solid_color_analysis_performed(true); | 690 tile->set_solid_color_analysis_performed(true); |
| 679 SkColor color = SK_ColorTRANSPARENT; | 691 SkColor color = SK_ColorTRANSPARENT; |
| 680 bool is_solid_color = | 692 bool is_solid_color = |
| 681 prioritized_tile.raster_source()->PerformSolidColorAnalysis( | 693 prioritized_tile.raster_source()->PerformSolidColorAnalysis( |
| 682 tile->content_rect(), tile->raster_scales(), &color); | 694 tile->content_rect(), tile->raster_scales(), &color); |
| 683 if (is_solid_color) { | 695 if (is_solid_color) { |
| 684 tile->draw_info().set_solid_color(color); | 696 tile->draw_info().set_solid_color(color); |
| 685 tile->draw_info().set_was_ever_ready_to_draw(); | |
| 686 if (!tile_is_needed_now) | 697 if (!tile_is_needed_now) |
| 687 tile->draw_info().set_was_a_prepaint_tile(); | 698 tile->draw_info().set_was_a_prepaint_tile(); |
| 688 client_->NotifyTileStateChanged(tile); | 699 client_->NotifyTileStateChanged(tile); |
| 689 continue; | 700 continue; |
| 690 } | 701 } |
| 691 } | 702 } |
| 692 | 703 |
| 693 // Prepaint tiles that are far away are only processed for images. | 704 // Prepaint tiles that are far away are only processed for images. |
| 694 if (!tile->required_for_activation() && !tile->required_for_draw() && | 705 if (!tile->required_for_activation() && !tile->required_for_draw() && |
| 695 prioritized_tile.is_process_for_images_only()) { | 706 prioritized_tile.is_process_for_images_only()) { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles", | 784 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles", |
| 774 "all_tiles_that_need_to_be_rasterized_are_scheduled", | 785 "all_tiles_that_need_to_be_rasterized_are_scheduled", |
| 775 all_tiles_that_need_to_be_rasterized_are_scheduled_, | 786 all_tiles_that_need_to_be_rasterized_are_scheduled_, |
| 776 "had_enough_memory_to_schedule_tiles_needed_now", | 787 "had_enough_memory_to_schedule_tiles_needed_now", |
| 777 had_enough_memory_to_schedule_tiles_needed_now); | 788 had_enough_memory_to_schedule_tiles_needed_now); |
| 778 return work_to_schedule; | 789 return work_to_schedule; |
| 779 } | 790 } |
| 780 | 791 |
| 781 void TileManager::FreeResourcesForTile(Tile* tile) { | 792 void TileManager::FreeResourcesForTile(Tile* tile) { |
| 782 TileDrawInfo& draw_info = tile->draw_info(); | 793 TileDrawInfo& draw_info = tile->draw_info(); |
| 783 if (draw_info.resource_) { | 794 Resource* resource = draw_info.TakeResource(); |
| 784 resource_pool_->ReleaseResource(draw_info.resource_); | 795 if (resource) |
| 785 draw_info.resource_ = nullptr; | 796 resource_pool_->ReleaseResource(resource); |
| 786 } | |
| 787 } | 797 } |
| 788 | 798 |
| 789 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( | 799 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( |
| 790 Tile* tile) { | 800 Tile* tile) { |
| 791 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); | 801 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); |
| 792 FreeResourcesForTile(tile); | 802 FreeResourcesForTile(tile); |
| 793 if (was_ready_to_draw) | 803 if (was_ready_to_draw) |
| 794 client_->NotifyTileStateChanged(tile); | 804 client_->NotifyTileStateChanged(tile); |
| 795 } | 805 } |
| 796 | 806 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 &TileManager::DidFinishRunningTileTasksRequiredForDraw); | 844 &TileManager::DidFinishRunningTileTasksRequiredForDraw); |
| 835 scoped_refptr<TileTask> all_done_task = | 845 scoped_refptr<TileTask> all_done_task = |
| 836 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); | 846 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); |
| 837 | 847 |
| 838 // Build a new task queue containing all task currently needed. Tasks | 848 // Build a new task queue containing all task currently needed. Tasks |
| 839 // are added in order of priority, highest priority task first. | 849 // are added in order of priority, highest priority task first. |
| 840 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { | 850 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { |
| 841 Tile* tile = prioritized_tile.tile(); | 851 Tile* tile = prioritized_tile.tile(); |
| 842 | 852 |
| 843 DCHECK(tile->draw_info().requires_resource()); | 853 DCHECK(tile->draw_info().requires_resource()); |
| 844 DCHECK(!tile->draw_info().resource_); | 854 DCHECK(!tile->draw_info().resource()); |
| 845 | 855 |
| 846 if (!tile->raster_task_) | 856 if (!tile->raster_task_) |
| 847 tile->raster_task_ = CreateRasterTask( | 857 tile->raster_task_ = CreateRasterTask( |
| 848 prioritized_tile, | 858 prioritized_tile, |
| 849 prioritized_tile.raster_source()->HasImpliedColorSpace() | 859 prioritized_tile.raster_source()->HasImpliedColorSpace() |
| 850 ? prioritized_tile.raster_source()->GetImpliedColorSpace() | 860 ? prioritized_tile.raster_source()->GetImpliedColorSpace() |
| 851 : target_color_space); | 861 : target_color_space); |
| 852 | 862 |
| 853 TileTask* task = tile->raster_task_.get(); | 863 TileTask* task = tile->raster_task_.get(); |
| 854 | 864 |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1030 | 1040 |
| 1031 if (was_canceled) { | 1041 if (was_canceled) { |
| 1032 ++flush_stats_.canceled_count; | 1042 ++flush_stats_.canceled_count; |
| 1033 resource_pool_->ReleaseResource(resource); | 1043 resource_pool_->ReleaseResource(resource); |
| 1034 return; | 1044 return; |
| 1035 } | 1045 } |
| 1036 | 1046 |
| 1037 resource_pool_->OnContentReplaced(resource->id(), tile->id()); | 1047 resource_pool_->OnContentReplaced(resource->id(), tile->id()); |
| 1038 ++flush_stats_.completed_count; | 1048 ++flush_stats_.completed_count; |
| 1039 | 1049 |
| 1040 draw_info.set_use_resource(); | 1050 draw_info.set_resource(resource); |
| 1041 draw_info.resource_ = resource; | |
| 1042 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); | 1051 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); |
| 1043 | 1052 if (global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY && |
| 1044 DCHECK(draw_info.IsReadyToDraw()); | 1053 !raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) { |
| 1045 draw_info.set_was_ever_ready_to_draw(); | 1054 // In SMOOTHNESS_TAKES_PRIORITY mode, we wait for GPU work to complete |
| 1046 | 1055 // for a tile before setting it as ready to draw. |
| 1047 client_->NotifyTileStateChanged(tile); | 1056 pending_ready_for_draw_tiles_.insert(tile); |
| 1057 } else { |
| 1058 draw_info.set_resource_ready_for_draw(); |
| 1059 client_->NotifyTileStateChanged(tile); |
| 1060 } |
| 1048 } | 1061 } |
| 1049 | 1062 |
| 1050 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info, | 1063 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info, |
| 1051 int layer_id, | 1064 int layer_id, |
| 1052 int source_frame_number, | 1065 int source_frame_number, |
| 1053 int flags) { | 1066 int flags) { |
| 1054 // We need to have a tile task worker pool to do anything meaningful with | 1067 // We need to have a tile task worker pool to do anything meaningful with |
| 1055 // tiles. | 1068 // tiles. |
| 1056 DCHECK(tile_task_manager_); | 1069 DCHECK(tile_task_manager_); |
| 1057 ScopedTilePtr tile( | 1070 ScopedTilePtr tile( |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1086 Tile* tile = all_queue->Top().tile(); | 1099 Tile* tile = all_queue->Top().tile(); |
| 1087 DCHECK(!tile->required_for_activation() || | 1100 DCHECK(!tile->required_for_activation() || |
| 1088 tile->draw_info().IsReadyToDraw()); | 1101 tile->draw_info().IsReadyToDraw()); |
| 1089 } | 1102 } |
| 1090 #endif | 1103 #endif |
| 1091 return true; | 1104 return true; |
| 1092 } | 1105 } |
| 1093 | 1106 |
| 1094 bool TileManager::IsReadyToActivate() const { | 1107 bool TileManager::IsReadyToActivate() const { |
| 1095 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); | 1108 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); |
| 1096 return AreRequiredTilesReadyToDraw( | 1109 return pending_required_for_activation_callback_id_ == 0 && |
| 1097 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | 1110 AreRequiredTilesReadyToDraw( |
| 1111 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); |
| 1098 } | 1112 } |
| 1099 | 1113 |
| 1100 bool TileManager::IsReadyToDraw() const { | 1114 bool TileManager::IsReadyToDraw() const { |
| 1101 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); | 1115 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); |
| 1102 return AreRequiredTilesReadyToDraw( | 1116 return pending_required_for_draw_callback_id_ == 0 && |
| 1103 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | 1117 AreRequiredTilesReadyToDraw( |
| 1118 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); |
| 1104 } | 1119 } |
| 1105 | 1120 |
| 1106 void TileManager::CheckAndIssueSignals() { | 1121 void TileManager::CheckAndIssueSignals() { |
| 1107 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); | 1122 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); |
| 1108 tile_task_manager_->CheckForCompletedTasks(); | 1123 tile_task_manager_->CheckForCompletedTasks(); |
| 1109 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 1124 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 1110 | 1125 |
| 1126 CheckPendingReadyToDrawTiles(false /* issue_signals */); |
| 1127 |
| 1111 // Ready to activate. | 1128 // Ready to activate. |
| 1112 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { | 1129 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { |
| 1113 signals_.ready_to_activate = false; | 1130 signals_.ready_to_activate = false; |
| 1114 if (IsReadyToActivate()) { | 1131 if (IsReadyToActivate()) { |
| 1115 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1132 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1116 "TileManager::CheckAndIssueSignals - ready to activate"); | 1133 "TileManager::CheckAndIssueSignals - ready to activate"); |
| 1117 signals_.did_notify_ready_to_activate = true; | 1134 signals_.did_notify_ready_to_activate = true; |
| 1118 client_->NotifyReadyToActivate(); | 1135 client_->NotifyReadyToActivate(); |
| 1119 } | 1136 } |
| 1120 } | 1137 } |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1254 signals_.all_tile_tasks_completed); | 1271 signals_.all_tile_tasks_completed); |
| 1255 state->EndDictionary(); | 1272 state->EndDictionary(); |
| 1256 return std::move(state); | 1273 return std::move(state); |
| 1257 } | 1274 } |
| 1258 | 1275 |
| 1259 bool TileManager::UsePartialRaster() const { | 1276 bool TileManager::UsePartialRaster() const { |
| 1260 return use_partial_raster_ && | 1277 return use_partial_raster_ && |
| 1261 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); | 1278 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); |
| 1262 } | 1279 } |
| 1263 | 1280 |
| 1281 void TileManager::CheckPendingReadyToDrawTiles(bool issue_signals) { |
| 1282 bool in_smoothness_mode = |
| 1283 global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY; |
| 1284 ResourceProvider::ResourceIdArray required_for_activation_ids; |
| 1285 ResourceProvider::ResourceIdArray required_for_draw_ids; |
| 1286 |
| 1287 for (auto it = pending_ready_for_draw_tiles_.begin(); |
| 1288 it != pending_ready_for_draw_tiles_.end();) { |
| 1289 Tile* tile = *it; |
| 1290 const Resource* resource = tile->draw_info().resource(); |
| 1291 if (!tile->tiling()) { |
| 1292 // The tile has been evicted or deleted. Remove it from our list. |
| 1293 it = pending_ready_for_draw_tiles_.erase(it); |
| 1294 continue; |
| 1295 } |
| 1296 |
| 1297 if (!in_smoothness_mode || |
| 1298 raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) { |
| 1299 // Tile is ready to draw. |
| 1300 tile->draw_info().set_resource_ready_for_draw(); |
| 1301 client_->NotifyTileStateChanged(tile); |
| 1302 it = pending_ready_for_draw_tiles_.erase(it); |
| 1303 continue; |
| 1304 } |
| 1305 |
| 1306 if (pending_tile_requirements_dirty_) |
| 1307 tile->tiling()->UpdateRequiredStatesOnTile(tile); |
| 1308 if (tile->required_for_activation()) |
| 1309 required_for_activation_ids.push_back(resource->id()); |
| 1310 if (tile->required_for_draw()) |
| 1311 required_for_draw_ids.push_back(resource->id()); |
| 1312 |
| 1313 ++it; |
| 1314 } |
| 1315 |
| 1316 if (required_for_activation_ids.empty()) { |
| 1317 pending_required_for_activation_callback_id_ = 0; |
| 1318 } else { |
| 1319 pending_required_for_activation_callback_id_ = |
| 1320 raster_buffer_provider_->SetReadyToDrawCallback( |
| 1321 required_for_activation_ids, |
| 1322 base::Bind(&TileManager::CheckPendingReadyToDrawTiles, |
| 1323 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(), |
| 1324 true /* issue_signals */), |
| 1325 pending_required_for_activation_callback_id_); |
| 1326 } |
| 1327 |
| 1328 if (required_for_draw_ids.empty()) { |
| 1329 pending_required_for_draw_callback_id_ = 0; |
| 1330 } else { |
| 1331 pending_required_for_draw_callback_id_ = |
| 1332 raster_buffer_provider_->SetReadyToDrawCallback( |
| 1333 required_for_draw_ids, |
| 1334 base::Bind(&TileManager::CheckPendingReadyToDrawTiles, |
| 1335 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(), |
| 1336 true /* issue_signals */), |
| 1337 pending_required_for_draw_callback_id_); |
| 1338 } |
| 1339 |
| 1340 // Update our signals now that we know whether we have pending resources. |
| 1341 signals_.ready_to_activate = |
| 1342 (pending_required_for_activation_callback_id_ == 0); |
| 1343 signals_.ready_to_draw = (pending_required_for_draw_callback_id_ == 0); |
| 1344 |
| 1345 if (issue_signals && (signals_.ready_to_activate || signals_.ready_to_draw)) |
| 1346 signals_check_notifier_.Schedule(); |
| 1347 |
| 1348 // We've just updated all pending tile requirements if necessary. |
| 1349 pending_tile_requirements_dirty_ = false; |
| 1350 } |
| 1351 |
| 1264 // Utility function that can be used to create a "Task set finished" task that | 1352 // Utility function that can be used to create a "Task set finished" task that |
| 1265 // posts |callback| to |task_runner| when run. | 1353 // posts |callback| to |task_runner| when run. |
| 1266 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( | 1354 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( |
| 1267 void (TileManager::*callback)()) { | 1355 void (TileManager::*callback)()) { |
| 1268 return make_scoped_refptr(new TaskSetFinishedTaskImpl( | 1356 return make_scoped_refptr(new TaskSetFinishedTaskImpl( |
| 1269 task_runner_, | 1357 task_runner_, |
| 1270 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); | 1358 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); |
| 1271 } | 1359 } |
| 1272 | 1360 |
| 1273 TileManager::MemoryUsage::MemoryUsage() | 1361 TileManager::MemoryUsage::MemoryUsage() |
| 1274 : memory_bytes_(0), resource_count_(0) {} | 1362 : memory_bytes_(0), resource_count_(0) {} |
| 1275 | 1363 |
| 1276 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, | 1364 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, |
| 1277 size_t resource_count) | 1365 size_t resource_count) |
| 1278 : memory_bytes_(static_cast<int64_t>(memory_bytes)), | 1366 : memory_bytes_(static_cast<int64_t>(memory_bytes)), |
| 1279 resource_count_(static_cast<int>(resource_count)) { | 1367 resource_count_(static_cast<int>(resource_count)) { |
| 1280 // MemoryUsage is constructed using size_ts, since it deals with memory and | 1368 // MemoryUsage is constructed using size_ts, since it deals with memory and |
| 1281 // the inputs are typically size_t. However, during the course of usage (in | 1369 // the inputs are typically size_t. However, during the course of usage (in |
| 1282 // particular operator-=) can cause internal values to become negative. Thus, | 1370 // particular operator-=) can cause internal values to become negative. |
| 1283 // member variables are signed. | 1371 // Thus, member variables are signed. |
| 1284 DCHECK_LE(memory_bytes, | 1372 DCHECK_LE(memory_bytes, |
| 1285 static_cast<size_t>(std::numeric_limits<int64_t>::max())); | 1373 static_cast<size_t>(std::numeric_limits<int64_t>::max())); |
| 1286 DCHECK_LE(resource_count, | 1374 DCHECK_LE(resource_count, |
| 1287 static_cast<size_t>(std::numeric_limits<int>::max())); | 1375 static_cast<size_t>(std::numeric_limits<int>::max())); |
| 1288 } | 1376 } |
| 1289 | 1377 |
| 1290 // static | 1378 // static |
| 1291 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( | 1379 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( |
| 1292 const gfx::Size& size, | 1380 const gfx::Size& size, |
| 1293 ResourceFormat format) { | 1381 ResourceFormat format) { |
| 1294 // We can use UncheckedSizeInBytes here since this is used with a tile | 1382 // We can use UncheckedSizeInBytes here since this is used with a tile |
| 1295 // size which is determined by the compositor (it's at most max texture size). | 1383 // size which is determined by the compositor (it's at most max texture |
| 1384 // size). |
| 1296 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), | 1385 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), |
| 1297 1); | 1386 1); |
| 1298 } | 1387 } |
| 1299 | 1388 |
| 1300 // static | 1389 // static |
| 1301 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { | 1390 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { |
| 1302 const TileDrawInfo& draw_info = tile->draw_info(); | 1391 const TileDrawInfo& draw_info = tile->draw_info(); |
| 1303 if (draw_info.resource_) { | 1392 if (draw_info.resource()) { |
| 1304 return MemoryUsage::FromConfig(draw_info.resource_->size(), | 1393 return MemoryUsage::FromConfig(draw_info.resource()->size(), |
| 1305 draw_info.resource_->format()); | 1394 draw_info.resource()->format()); |
| 1306 } | 1395 } |
| 1307 return MemoryUsage(); | 1396 return MemoryUsage(); |
| 1308 } | 1397 } |
| 1309 | 1398 |
| 1310 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=( | 1399 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=( |
| 1311 const MemoryUsage& other) { | 1400 const MemoryUsage& other) { |
| 1312 memory_bytes_ += other.memory_bytes_; | 1401 memory_bytes_ += other.memory_bytes_; |
| 1313 resource_count_ += other.resource_count_; | 1402 resource_count_ += other.resource_count_; |
| 1314 return *this; | 1403 return *this; |
| 1315 } | 1404 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1345 all_tile_tasks_completed = false; | 1434 all_tile_tasks_completed = false; |
| 1346 did_notify_all_tile_tasks_completed = false; | 1435 did_notify_all_tile_tasks_completed = false; |
| 1347 } | 1436 } |
| 1348 | 1437 |
| 1349 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; | 1438 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; |
| 1350 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( | 1439 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( |
| 1351 PrioritizedWorkToSchedule&& other) = default; | 1440 PrioritizedWorkToSchedule&& other) = default; |
| 1352 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; | 1441 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; |
| 1353 | 1442 |
| 1354 } // namespace cc | 1443 } // namespace cc |
| OLD | NEW |