Chromium Code Reviews| 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 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 361 task_runner_, | 361 task_runner_, |
| 362 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, | 362 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, |
| 363 base::Unretained(this))), | 363 base::Unretained(this))), |
| 364 signals_check_notifier_(task_runner_, | 364 signals_check_notifier_(task_runner_, |
| 365 base::Bind(&TileManager::CheckAndIssueSignals, | 365 base::Bind(&TileManager::CheckAndIssueSignals, |
| 366 base::Unretained(this))), | 366 base::Unretained(this))), |
| 367 has_scheduled_tile_tasks_(false), | 367 has_scheduled_tile_tasks_(false), |
| 368 prepare_tiles_count_(0u), | 368 prepare_tiles_count_(0u), |
| 369 next_tile_id_(0u), | 369 next_tile_id_(0u), |
| 370 check_tile_priority_inversion_(check_tile_priority_inversion), | 370 check_tile_priority_inversion_(check_tile_priority_inversion), |
| 371 task_set_finished_weak_ptr_factory_(this) {} | 371 task_set_finished_weak_ptr_factory_(this), |
| 372 ready_to_draw_callback_weak_ptr_factory_(this) {} | |
| 372 | 373 |
| 373 TileManager::~TileManager() { | 374 TileManager::~TileManager() { |
| 374 FinishTasksAndCleanUp(); | 375 FinishTasksAndCleanUp(); |
| 375 } | 376 } |
| 376 | 377 |
| 377 void TileManager::FinishTasksAndCleanUp() { | 378 void TileManager::FinishTasksAndCleanUp() { |
| 378 if (!tile_task_manager_) | 379 if (!tile_task_manager_) |
| 379 return; | 380 return; |
| 380 | 381 |
| 381 global_state_ = GlobalStateThatImpactsTilePriority(); | 382 global_state_ = GlobalStateThatImpactsTilePriority(); |
| 382 | 383 |
| 383 // This cancels tasks if possible, finishes pending tasks, and release any | 384 // This cancels tasks if possible, finishes pending tasks, and release any |
| 384 // uninitialized resources. | 385 // uninitialized resources. |
| 385 tile_task_manager_->Shutdown(); | 386 tile_task_manager_->Shutdown(); |
| 386 | 387 |
| 387 raster_buffer_provider_->Shutdown(); | 388 raster_buffer_provider_->Shutdown(); |
| 388 | 389 |
| 389 tile_task_manager_->CheckForCompletedTasks(); | 390 tile_task_manager_->CheckForCompletedTasks(); |
| 390 | 391 |
| 391 FreeResourcesForReleasedTiles(); | 392 FreeResourcesForReleasedTiles(); |
| 392 CleanUpReleasedTiles(); | 393 CleanUpReleasedTiles(); |
| 393 | 394 |
| 394 tile_task_manager_ = nullptr; | 395 tile_task_manager_ = nullptr; |
| 395 resource_pool_ = nullptr; | 396 resource_pool_ = nullptr; |
| 396 more_tiles_need_prepare_check_notifier_.Cancel(); | 397 more_tiles_need_prepare_check_notifier_.Cancel(); |
| 397 signals_check_notifier_.Cancel(); | 398 signals_check_notifier_.Cancel(); |
| 398 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 399 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 400 ready_to_draw_callback_weak_ptr_factory_.InvalidateWeakPtrs(); | |
| 399 raster_buffer_provider_ = nullptr; | 401 raster_buffer_provider_ = nullptr; |
| 400 | 402 |
| 401 image_controller_.SetImageDecodeCache(nullptr); | 403 image_controller_.SetImageDecodeCache(nullptr); |
| 402 locked_image_tasks_.clear(); | 404 locked_image_tasks_.clear(); |
| 403 } | 405 } |
| 404 | 406 |
| 405 void TileManager::SetResources(ResourcePool* resource_pool, | 407 void TileManager::SetResources(ResourcePool* resource_pool, |
| 406 ImageDecodeCache* image_decode_cache, | 408 ImageDecodeCache* image_decode_cache, |
| 407 TaskGraphRunner* task_graph_runner, | 409 TaskGraphRunner* task_graph_runner, |
| 408 RasterBufferProvider* raster_buffer_provider, | 410 RasterBufferProvider* raster_buffer_provider, |
| 409 size_t scheduled_raster_task_limit, | 411 size_t scheduled_raster_task_limit, |
| 410 bool use_gpu_rasterization) { | 412 bool use_gpu_rasterization) { |
| 411 DCHECK(!tile_task_manager_); | 413 DCHECK(!tile_task_manager_); |
| 412 DCHECK(task_graph_runner); | 414 DCHECK(task_graph_runner); |
| 413 | 415 |
| 414 use_gpu_rasterization_ = use_gpu_rasterization; | 416 use_gpu_rasterization_ = use_gpu_rasterization; |
| 415 scheduled_raster_task_limit_ = scheduled_raster_task_limit; | 417 scheduled_raster_task_limit_ = scheduled_raster_task_limit; |
| 416 resource_pool_ = resource_pool; | 418 resource_pool_ = resource_pool; |
| 417 image_controller_.SetImageDecodeCache(image_decode_cache); | 419 image_controller_.SetImageDecodeCache(image_decode_cache); |
| 418 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner); | 420 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner); |
| 419 raster_buffer_provider_ = raster_buffer_provider; | 421 raster_buffer_provider_ = raster_buffer_provider; |
| 420 } | 422 } |
| 421 | 423 |
| 422 void TileManager::Release(Tile* tile) { | 424 void TileManager::Release(Tile* tile) { |
| 423 released_tiles_.push_back(tile); | 425 released_tiles_.push_back(tile); |
| 426 // The |tile|'s owning PictureLayerTiling has released ownership and turned | |
| 427 // the | |
|
vmpstr
2017/01/05 22:00:46
Reformat plz
ericrk
2017/01/09 23:05:21
Done.
| |
| 428 // |tile| over to TileManager for deletion. | |
| 429 tile->set_tiling(nullptr); | |
| 424 } | 430 } |
| 425 | 431 |
| 426 void TileManager::FreeResourcesForReleasedTiles() { | 432 void TileManager::FreeResourcesForReleasedTiles() { |
| 427 for (auto* tile : released_tiles_) | 433 for (auto* tile : released_tiles_) |
| 428 FreeResourcesForTile(tile); | 434 FreeResourcesForTile(tile); |
| 429 } | 435 } |
| 430 | 436 |
| 431 void TileManager::CleanUpReleasedTiles() { | 437 void TileManager::CleanUpReleasedTiles() { |
| 432 std::vector<Tile*> tiles_to_retain; | 438 std::vector<Tile*> tiles_to_retain; |
| 433 for (auto* tile : released_tiles_) { | 439 for (auto* tile : released_tiles_) { |
| 434 if (tile->HasRasterTask()) { | 440 if (tile->HasRasterTask()) { |
|
vmpstr
2017/01/05 22:00:46
Can you file a bug to clean this up please? We cha
ericrk
2017/01/09 23:05:21
In RasterTaskCompleted, we use/dereference tile, s
| |
| 435 tiles_to_retain.push_back(tile); | 441 tiles_to_retain.push_back(tile); |
| 436 continue; | 442 continue; |
| 437 } | 443 } |
| 438 | 444 |
| 439 DCHECK(!tile->draw_info().has_resource()); | 445 DCHECK(!tile->draw_info().has_resource()); |
| 440 DCHECK(tiles_.find(tile->id()) != tiles_.end()); | 446 DCHECK(tiles_.find(tile->id()) != tiles_.end()); |
| 441 tiles_.erase(tile->id()); | 447 tiles_.erase(tile->id()); |
| 448 pending_ready_for_draw_tiles_.erase(tile); | |
| 442 | 449 |
| 443 delete tile; | 450 delete tile; |
| 444 } | 451 } |
| 445 released_tiles_.swap(tiles_to_retain); | 452 released_tiles_.swap(tiles_to_retain); |
| 446 } | 453 } |
| 447 | 454 |
| 448 void TileManager::DidFinishRunningTileTasksRequiredForActivation() { | 455 void TileManager::DidFinishRunningTileTasksRequiredForActivation() { |
| 449 TRACE_EVENT0("cc", | 456 TRACE_EVENT0("cc", |
| 450 "TileManager::DidFinishRunningTileTasksRequiredForActivation"); | 457 "TileManager::DidFinishRunningTileTasksRequiredForActivation"); |
| 451 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", | 458 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 508 // We need to call CheckForCompletedTasks() once in-between each call | 515 // We need to call CheckForCompletedTasks() once in-between each call |
| 509 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 516 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
| 510 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 517 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
| 511 tile_task_manager_->CheckForCompletedTasks(); | 518 tile_task_manager_->CheckForCompletedTasks(); |
| 512 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 519 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 513 } | 520 } |
| 514 | 521 |
| 515 FreeResourcesForReleasedTiles(); | 522 FreeResourcesForReleasedTiles(); |
| 516 CleanUpReleasedTiles(); | 523 CleanUpReleasedTiles(); |
| 517 | 524 |
| 525 // The required for activate/draw status of tiles may have changed any time | |
| 526 // PrepareTiles is called. | |
| 527 pending_tile_requirements_dirty_ = true; | |
| 528 | |
| 518 PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles(); | 529 PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles(); |
| 519 | 530 |
| 520 // Inform the client that will likely require a draw if the highest priority | 531 // Inform the client that will likely require a draw if the highest priority |
| 521 // tile that will be rasterized is required for draw. | 532 // tile that will be rasterized is required for draw. |
| 522 client_->SetIsLikelyToRequireADraw( | 533 client_->SetIsLikelyToRequireADraw( |
| 523 !prioritized_work.tiles_to_raster.empty() && | 534 !prioritized_work.tiles_to_raster.empty() && |
| 524 prioritized_work.tiles_to_raster.front().tile()->required_for_draw()); | 535 prioritized_work.tiles_to_raster.front().tile()->required_for_draw()); |
| 525 | 536 |
| 526 // Schedule tile tasks. | 537 // Schedule tile tasks. |
| 527 ScheduleTasks(prioritized_work); | 538 ScheduleTasks(prioritized_work); |
| 528 | 539 |
| 529 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, | 540 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, |
| 530 "state", BasicStateAsValue()); | 541 "state", BasicStateAsValue()); |
| 531 return true; | 542 return true; |
| 532 } | 543 } |
| 533 | 544 |
| 534 void TileManager::Flush() { | 545 void TileManager::Flush() { |
| 535 TRACE_EVENT0("cc", "TileManager::Flush"); | 546 TRACE_EVENT0("cc", "TileManager::Flush"); |
| 536 | 547 |
| 537 if (!tile_task_manager_) { | 548 if (!tile_task_manager_) { |
| 538 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); | 549 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); |
| 539 return; | 550 return; |
| 540 } | 551 } |
| 541 | 552 |
| 542 tile_task_manager_->CheckForCompletedTasks(); | 553 tile_task_manager_->CheckForCompletedTasks(); |
| 543 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 554 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 555 CheckPendingReadyToDrawTiles(true /* issue_signals */); | |
| 544 | 556 |
| 545 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", | 557 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", |
| 546 RasterTaskCompletionStatsAsValue(flush_stats_)); | 558 RasterTaskCompletionStatsAsValue(flush_stats_)); |
| 547 flush_stats_ = RasterTaskCompletionStats(); | 559 flush_stats_ = RasterTaskCompletionStats(); |
| 548 } | 560 } |
| 549 | 561 |
| 550 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> | 562 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> |
| 551 TileManager::BasicStateAsValue() const { | 563 TileManager::BasicStateAsValue() const { |
| 552 std::unique_ptr<base::trace_event::TracedValue> value( | 564 std::unique_ptr<base::trace_event::TracedValue> value( |
| 553 new base::trace_event::TracedValue()); | 565 new base::trace_event::TracedValue()); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 677 // or drop the tile for scheduling and raster. | 689 // or drop the tile for scheduling and raster. |
| 678 // TODO(sohanjg): Check if we could use a shared analysis | 690 // TODO(sohanjg): Check if we could use a shared analysis |
| 679 // canvas which is reset between tiles. | 691 // canvas which is reset between tiles. |
| 680 tile->set_solid_color_analysis_performed(true); | 692 tile->set_solid_color_analysis_performed(true); |
| 681 SkColor color = SK_ColorTRANSPARENT; | 693 SkColor color = SK_ColorTRANSPARENT; |
| 682 bool is_solid_color = | 694 bool is_solid_color = |
| 683 prioritized_tile.raster_source()->PerformSolidColorAnalysis( | 695 prioritized_tile.raster_source()->PerformSolidColorAnalysis( |
| 684 tile->content_rect(), tile->raster_scales(), &color); | 696 tile->content_rect(), tile->raster_scales(), &color); |
| 685 if (is_solid_color) { | 697 if (is_solid_color) { |
| 686 tile->draw_info().set_solid_color(color); | 698 tile->draw_info().set_solid_color(color); |
| 687 tile->draw_info().set_was_ever_ready_to_draw(); | |
| 688 if (!tile_is_needed_now) | 699 if (!tile_is_needed_now) |
| 689 tile->draw_info().set_was_a_prepaint_tile(); | 700 tile->draw_info().set_was_a_prepaint_tile(); |
| 690 client_->NotifyTileStateChanged(tile); | 701 client_->NotifyTileStateChanged(tile); |
| 691 continue; | 702 continue; |
| 692 } | 703 } |
| 693 } | 704 } |
| 694 | 705 |
| 695 // Prepaint tiles that are far away are only processed for images. | 706 // Prepaint tiles that are far away are only processed for images. |
| 696 if (!tile->required_for_activation() && !tile->required_for_draw() && | 707 if (!tile->required_for_activation() && !tile->required_for_draw() && |
| 697 prioritized_tile.is_process_for_images_only()) { | 708 prioritized_tile.is_process_for_images_only()) { |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 810 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles", | 821 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles", |
| 811 "all_tiles_that_need_to_be_rasterized_are_scheduled", | 822 "all_tiles_that_need_to_be_rasterized_are_scheduled", |
| 812 all_tiles_that_need_to_be_rasterized_are_scheduled_, | 823 all_tiles_that_need_to_be_rasterized_are_scheduled_, |
| 813 "had_enough_memory_to_schedule_tiles_needed_now", | 824 "had_enough_memory_to_schedule_tiles_needed_now", |
| 814 had_enough_memory_to_schedule_tiles_needed_now); | 825 had_enough_memory_to_schedule_tiles_needed_now); |
| 815 return work_to_schedule; | 826 return work_to_schedule; |
| 816 } | 827 } |
| 817 | 828 |
| 818 void TileManager::FreeResourcesForTile(Tile* tile) { | 829 void TileManager::FreeResourcesForTile(Tile* tile) { |
| 819 TileDrawInfo& draw_info = tile->draw_info(); | 830 TileDrawInfo& draw_info = tile->draw_info(); |
| 820 if (draw_info.resource_) { | 831 Resource* resource = draw_info.TakeResource(); |
| 821 resource_pool_->ReleaseResource(draw_info.resource_); | 832 if (resource) |
| 822 draw_info.resource_ = nullptr; | 833 resource_pool_->ReleaseResource(resource); |
| 823 } | |
| 824 } | 834 } |
| 825 | 835 |
| 826 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( | 836 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( |
| 827 Tile* tile) { | 837 Tile* tile) { |
| 828 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); | 838 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); |
| 829 FreeResourcesForTile(tile); | 839 FreeResourcesForTile(tile); |
| 830 if (was_ready_to_draw) | 840 if (was_ready_to_draw) |
| 831 client_->NotifyTileStateChanged(tile); | 841 client_->NotifyTileStateChanged(tile); |
| 832 } | 842 } |
| 833 | 843 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 871 &TileManager::DidFinishRunningTileTasksRequiredForDraw); | 881 &TileManager::DidFinishRunningTileTasksRequiredForDraw); |
| 872 scoped_refptr<TileTask> all_done_task = | 882 scoped_refptr<TileTask> all_done_task = |
| 873 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); | 883 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); |
| 874 | 884 |
| 875 // Build a new task queue containing all task currently needed. Tasks | 885 // Build a new task queue containing all task currently needed. Tasks |
| 876 // are added in order of priority, highest priority task first. | 886 // are added in order of priority, highest priority task first. |
| 877 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { | 887 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { |
| 878 Tile* tile = prioritized_tile.tile(); | 888 Tile* tile = prioritized_tile.tile(); |
| 879 | 889 |
| 880 DCHECK(tile->draw_info().requires_resource()); | 890 DCHECK(tile->draw_info().requires_resource()); |
| 881 DCHECK(!tile->draw_info().resource_); | 891 DCHECK(!tile->draw_info().resource()); |
| 882 | 892 |
| 883 if (!tile->raster_task_) | 893 if (!tile->raster_task_) |
| 884 tile->raster_task_ = CreateRasterTask( | 894 tile->raster_task_ = CreateRasterTask( |
| 885 prioritized_tile, | 895 prioritized_tile, |
| 886 prioritized_tile.raster_source()->HasImpliedColorSpace() | 896 prioritized_tile.raster_source()->HasImpliedColorSpace() |
| 887 ? prioritized_tile.raster_source()->GetImpliedColorSpace() | 897 ? prioritized_tile.raster_source()->GetImpliedColorSpace() |
| 888 : target_color_space); | 898 : target_color_space); |
| 889 | 899 |
| 890 TileTask* task = tile->raster_task_.get(); | 900 TileTask* task = tile->raster_task_.get(); |
| 891 | 901 |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1067 | 1077 |
| 1068 if (was_canceled) { | 1078 if (was_canceled) { |
| 1069 ++flush_stats_.canceled_count; | 1079 ++flush_stats_.canceled_count; |
| 1070 resource_pool_->ReleaseResource(resource); | 1080 resource_pool_->ReleaseResource(resource); |
| 1071 return; | 1081 return; |
| 1072 } | 1082 } |
| 1073 | 1083 |
| 1074 resource_pool_->OnContentReplaced(resource->id(), tile->id()); | 1084 resource_pool_->OnContentReplaced(resource->id(), tile->id()); |
| 1075 ++flush_stats_.completed_count; | 1085 ++flush_stats_.completed_count; |
| 1076 | 1086 |
| 1077 draw_info.set_use_resource(); | 1087 draw_info.set_resource(resource); |
| 1078 draw_info.resource_ = resource; | |
| 1079 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); | 1088 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); |
| 1080 | 1089 if (global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY && |
| 1081 DCHECK(draw_info.IsReadyToDraw()); | 1090 !raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) { |
| 1082 draw_info.set_was_ever_ready_to_draw(); | 1091 // In SMOOTHNESS_TAKES_PRIORITY mode, we wait for GPU work to complete |
|
vmpstr
2017/01/05 22:00:46
Move this comment outside of the if plz
Also cons
ericrk
2017/01/09 23:05:21
good suggestion.
| |
| 1083 | 1092 // for a tile before setting it as ready to draw. |
| 1084 client_->NotifyTileStateChanged(tile); | 1093 pending_ready_for_draw_tiles_.insert(tile); |
| 1094 } else { | |
| 1095 draw_info.set_resource_ready_for_draw(); | |
| 1096 client_->NotifyTileStateChanged(tile); | |
| 1097 } | |
| 1085 } | 1098 } |
| 1086 | 1099 |
| 1087 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info, | 1100 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info, |
| 1088 int layer_id, | 1101 int layer_id, |
| 1089 int source_frame_number, | 1102 int source_frame_number, |
| 1090 int flags) { | 1103 int flags) { |
| 1091 // We need to have a tile task worker pool to do anything meaningful with | 1104 // We need to have a tile task worker pool to do anything meaningful with |
| 1092 // tiles. | 1105 // tiles. |
| 1093 DCHECK(tile_task_manager_); | 1106 DCHECK(tile_task_manager_); |
| 1094 ScopedTilePtr tile( | 1107 ScopedTilePtr tile( |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 1123 Tile* tile = all_queue->Top().tile(); | 1136 Tile* tile = all_queue->Top().tile(); |
| 1124 DCHECK(!tile->required_for_activation() || | 1137 DCHECK(!tile->required_for_activation() || |
| 1125 tile->draw_info().IsReadyToDraw()); | 1138 tile->draw_info().IsReadyToDraw()); |
| 1126 } | 1139 } |
| 1127 #endif | 1140 #endif |
| 1128 return true; | 1141 return true; |
| 1129 } | 1142 } |
| 1130 | 1143 |
| 1131 bool TileManager::IsReadyToActivate() const { | 1144 bool TileManager::IsReadyToActivate() const { |
| 1132 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); | 1145 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); |
| 1133 return AreRequiredTilesReadyToDraw( | 1146 return pending_required_for_activation_callback_id_ == 0 && |
| 1134 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | 1147 AreRequiredTilesReadyToDraw( |
| 1148 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | |
| 1135 } | 1149 } |
| 1136 | 1150 |
| 1137 bool TileManager::IsReadyToDraw() const { | 1151 bool TileManager::IsReadyToDraw() const { |
| 1138 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); | 1152 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); |
| 1139 return AreRequiredTilesReadyToDraw( | 1153 return pending_required_for_draw_callback_id_ == 0 && |
| 1140 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | 1154 AreRequiredTilesReadyToDraw( |
| 1155 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | |
| 1141 } | 1156 } |
| 1142 | 1157 |
| 1143 void TileManager::CheckAndIssueSignals() { | 1158 void TileManager::CheckAndIssueSignals() { |
| 1144 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); | 1159 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); |
| 1145 tile_task_manager_->CheckForCompletedTasks(); | 1160 tile_task_manager_->CheckForCompletedTasks(); |
| 1146 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 1161 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 1147 | 1162 |
| 1163 CheckPendingReadyToDrawTiles(false /* issue_signals */); | |
| 1164 | |
| 1148 // Ready to activate. | 1165 // Ready to activate. |
| 1149 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { | 1166 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { |
| 1150 signals_.ready_to_activate = false; | 1167 signals_.ready_to_activate = false; |
| 1151 if (IsReadyToActivate()) { | 1168 if (IsReadyToActivate()) { |
| 1152 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1169 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1153 "TileManager::CheckAndIssueSignals - ready to activate"); | 1170 "TileManager::CheckAndIssueSignals - ready to activate"); |
| 1154 signals_.did_notify_ready_to_activate = true; | 1171 signals_.did_notify_ready_to_activate = true; |
| 1155 client_->NotifyReadyToActivate(); | 1172 client_->NotifyReadyToActivate(); |
| 1156 } | 1173 } |
| 1157 } | 1174 } |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1291 signals_.all_tile_tasks_completed); | 1308 signals_.all_tile_tasks_completed); |
| 1292 state->EndDictionary(); | 1309 state->EndDictionary(); |
| 1293 return std::move(state); | 1310 return std::move(state); |
| 1294 } | 1311 } |
| 1295 | 1312 |
| 1296 bool TileManager::UsePartialRaster() const { | 1313 bool TileManager::UsePartialRaster() const { |
| 1297 return use_partial_raster_ && | 1314 return use_partial_raster_ && |
| 1298 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); | 1315 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); |
| 1299 } | 1316 } |
| 1300 | 1317 |
| 1318 void TileManager::CheckPendingReadyToDrawTiles(bool issue_signals) { | |
| 1319 bool in_smoothness_mode = | |
| 1320 global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY; | |
| 1321 ResourceProvider::ResourceIdArray required_for_activation_ids; | |
| 1322 ResourceProvider::ResourceIdArray required_for_draw_ids; | |
| 1323 | |
| 1324 for (auto it = pending_ready_for_draw_tiles_.begin(); | |
| 1325 it != pending_ready_for_draw_tiles_.end();) { | |
| 1326 Tile* tile = *it; | |
| 1327 const Resource* resource = tile->draw_info().resource(); | |
| 1328 if (!tile->tiling()) { | |
| 1329 // The tile has been evicted or deleted. Remove it from our list. | |
|
vmpstr
2017/01/05 22:00:46
nit: or is pending deletion. (you remove it when i
ericrk
2017/01/09 23:05:22
now that tile deletion has been cleaned up, this i
| |
| 1330 it = pending_ready_for_draw_tiles_.erase(it); | |
| 1331 continue; | |
| 1332 } | |
| 1333 | |
| 1334 if (!in_smoothness_mode || | |
|
vmpstr
2017/01/05 22:00:46
You can just do the gobal_state_ == ... check here
ericrk
2017/01/09 23:05:21
Done.
| |
| 1335 raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) { | |
| 1336 // Tile is ready to draw. | |
| 1337 tile->draw_info().set_resource_ready_for_draw(); | |
| 1338 client_->NotifyTileStateChanged(tile); | |
| 1339 it = pending_ready_for_draw_tiles_.erase(it); | |
| 1340 continue; | |
| 1341 } | |
| 1342 | |
| 1343 if (pending_tile_requirements_dirty_) | |
|
vmpstr
2017/01/05 22:00:46
I know we talked about this a bit, but is there a
ericrk
2017/01/09 23:05:21
Ok, I think there was a race here (mainly because
| |
| 1344 tile->tiling()->UpdateRequiredStatesOnTile(tile); | |
| 1345 if (tile->required_for_activation()) | |
| 1346 required_for_activation_ids.push_back(resource->id()); | |
| 1347 if (tile->required_for_draw()) | |
| 1348 required_for_draw_ids.push_back(resource->id()); | |
| 1349 | |
| 1350 ++it; | |
| 1351 } | |
| 1352 | |
| 1353 if (required_for_activation_ids.empty()) { | |
| 1354 pending_required_for_activation_callback_id_ = 0; | |
|
vmpstr
2017/01/05 22:00:46
Maybe
pending_required_for_activation_callback_id
ericrk
2017/01/09 23:05:21
Done.
| |
| 1355 } else { | |
| 1356 pending_required_for_activation_callback_id_ = | |
| 1357 raster_buffer_provider_->SetReadyToDrawCallback( | |
| 1358 required_for_activation_ids, | |
| 1359 base::Bind(&TileManager::CheckPendingReadyToDrawTiles, | |
| 1360 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(), | |
| 1361 true /* issue_signals */), | |
| 1362 pending_required_for_activation_callback_id_); | |
| 1363 } | |
| 1364 | |
| 1365 if (required_for_draw_ids.empty()) { | |
| 1366 pending_required_for_draw_callback_id_ = 0; | |
| 1367 } else { | |
| 1368 pending_required_for_draw_callback_id_ = | |
| 1369 raster_buffer_provider_->SetReadyToDrawCallback( | |
| 1370 required_for_draw_ids, | |
| 1371 base::Bind(&TileManager::CheckPendingReadyToDrawTiles, | |
| 1372 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(), | |
| 1373 true /* issue_signals */), | |
| 1374 pending_required_for_draw_callback_id_); | |
| 1375 } | |
| 1376 | |
| 1377 // Update our signals now that we know whether we have pending resources. | |
| 1378 signals_.ready_to_activate = | |
| 1379 (pending_required_for_activation_callback_id_ == 0); | |
| 1380 signals_.ready_to_draw = (pending_required_for_draw_callback_id_ == 0); | |
| 1381 | |
| 1382 if (issue_signals && (signals_.ready_to_activate || signals_.ready_to_draw)) | |
| 1383 signals_check_notifier_.Schedule(); | |
| 1384 | |
| 1385 // We've just updated all pending tile requirements if necessary. | |
| 1386 pending_tile_requirements_dirty_ = false; | |
| 1387 } | |
| 1388 | |
| 1301 // Utility function that can be used to create a "Task set finished" task that | 1389 // Utility function that can be used to create a "Task set finished" task that |
| 1302 // posts |callback| to |task_runner| when run. | 1390 // posts |callback| to |task_runner| when run. |
| 1303 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( | 1391 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( |
| 1304 void (TileManager::*callback)()) { | 1392 void (TileManager::*callback)()) { |
| 1305 return make_scoped_refptr(new TaskSetFinishedTaskImpl( | 1393 return make_scoped_refptr(new TaskSetFinishedTaskImpl( |
| 1306 task_runner_, | 1394 task_runner_, |
| 1307 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); | 1395 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); |
| 1308 } | 1396 } |
| 1309 | 1397 |
| 1310 TileManager::MemoryUsage::MemoryUsage() | 1398 TileManager::MemoryUsage::MemoryUsage() |
| 1311 : memory_bytes_(0), resource_count_(0) {} | 1399 : memory_bytes_(0), resource_count_(0) {} |
| 1312 | 1400 |
| 1313 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, | 1401 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, |
| 1314 size_t resource_count) | 1402 size_t resource_count) |
| 1315 : memory_bytes_(static_cast<int64_t>(memory_bytes)), | 1403 : memory_bytes_(static_cast<int64_t>(memory_bytes)), |
| 1316 resource_count_(static_cast<int>(resource_count)) { | 1404 resource_count_(static_cast<int>(resource_count)) { |
| 1317 // MemoryUsage is constructed using size_ts, since it deals with memory and | 1405 // MemoryUsage is constructed using size_ts, since it deals with memory and |
| 1318 // the inputs are typically size_t. However, during the course of usage (in | 1406 // the inputs are typically size_t. However, during the course of usage (in |
| 1319 // particular operator-=) can cause internal values to become negative. Thus, | 1407 // particular operator-=) can cause internal values to become negative. |
| 1320 // member variables are signed. | 1408 // Thus, member variables are signed. |
| 1321 DCHECK_LE(memory_bytes, | 1409 DCHECK_LE(memory_bytes, |
| 1322 static_cast<size_t>(std::numeric_limits<int64_t>::max())); | 1410 static_cast<size_t>(std::numeric_limits<int64_t>::max())); |
| 1323 DCHECK_LE(resource_count, | 1411 DCHECK_LE(resource_count, |
| 1324 static_cast<size_t>(std::numeric_limits<int>::max())); | 1412 static_cast<size_t>(std::numeric_limits<int>::max())); |
| 1325 } | 1413 } |
| 1326 | 1414 |
| 1327 // static | 1415 // static |
| 1328 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( | 1416 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( |
| 1329 const gfx::Size& size, | 1417 const gfx::Size& size, |
| 1330 ResourceFormat format) { | 1418 ResourceFormat format) { |
| 1331 // We can use UncheckedSizeInBytes here since this is used with a tile | 1419 // We can use UncheckedSizeInBytes here since this is used with a tile |
| 1332 // size which is determined by the compositor (it's at most max texture size). | 1420 // size which is determined by the compositor (it's at most max texture |
| 1421 // size). | |
| 1333 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), | 1422 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), |
| 1334 1); | 1423 1); |
| 1335 } | 1424 } |
| 1336 | 1425 |
| 1337 // static | 1426 // static |
| 1338 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { | 1427 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { |
| 1339 const TileDrawInfo& draw_info = tile->draw_info(); | 1428 const TileDrawInfo& draw_info = tile->draw_info(); |
| 1340 if (draw_info.resource_) { | 1429 if (draw_info.resource()) { |
| 1341 return MemoryUsage::FromConfig(draw_info.resource_->size(), | 1430 return MemoryUsage::FromConfig(draw_info.resource()->size(), |
| 1342 draw_info.resource_->format()); | 1431 draw_info.resource()->format()); |
| 1343 } | 1432 } |
| 1344 return MemoryUsage(); | 1433 return MemoryUsage(); |
| 1345 } | 1434 } |
| 1346 | 1435 |
| 1347 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=( | 1436 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=( |
| 1348 const MemoryUsage& other) { | 1437 const MemoryUsage& other) { |
| 1349 memory_bytes_ += other.memory_bytes_; | 1438 memory_bytes_ += other.memory_bytes_; |
| 1350 resource_count_ += other.resource_count_; | 1439 resource_count_ += other.resource_count_; |
| 1351 return *this; | 1440 return *this; |
| 1352 } | 1441 } |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 1382 all_tile_tasks_completed = false; | 1471 all_tile_tasks_completed = false; |
| 1383 did_notify_all_tile_tasks_completed = false; | 1472 did_notify_all_tile_tasks_completed = false; |
| 1384 } | 1473 } |
| 1385 | 1474 |
| 1386 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; | 1475 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; |
| 1387 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( | 1476 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( |
| 1388 PrioritizedWorkToSchedule&& other) = default; | 1477 PrioritizedWorkToSchedule&& other) = default; |
| 1389 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; | 1478 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; |
| 1390 | 1479 |
| 1391 } // namespace cc | 1480 } // namespace cc |
| OLD | NEW |