| 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 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 task_runner_, | 365 task_runner_, |
| 366 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, | 366 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, |
| 367 base::Unretained(this))), | 367 base::Unretained(this))), |
| 368 signals_check_notifier_(task_runner_, | 368 signals_check_notifier_(task_runner_, |
| 369 base::Bind(&TileManager::CheckAndIssueSignals, | 369 base::Bind(&TileManager::CheckAndIssueSignals, |
| 370 base::Unretained(this))), | 370 base::Unretained(this))), |
| 371 has_scheduled_tile_tasks_(false), | 371 has_scheduled_tile_tasks_(false), |
| 372 prepare_tiles_count_(0u), | 372 prepare_tiles_count_(0u), |
| 373 next_tile_id_(0u), | 373 next_tile_id_(0u), |
| 374 check_tile_priority_inversion_(check_tile_priority_inversion), | 374 check_tile_priority_inversion_(check_tile_priority_inversion), |
| 375 task_set_finished_weak_ptr_factory_(this) {} | 375 task_set_finished_weak_ptr_factory_(this), |
| 376 ready_to_draw_callback_weak_ptr_factory_(this) {} |
| 376 | 377 |
| 377 TileManager::~TileManager() { | 378 TileManager::~TileManager() { |
| 378 FinishTasksAndCleanUp(); | 379 FinishTasksAndCleanUp(); |
| 379 } | 380 } |
| 380 | 381 |
| 381 void TileManager::FinishTasksAndCleanUp() { | 382 void TileManager::FinishTasksAndCleanUp() { |
| 382 if (!tile_task_manager_) | 383 if (!tile_task_manager_) |
| 383 return; | 384 return; |
| 384 | 385 |
| 385 global_state_ = GlobalStateThatImpactsTilePriority(); | 386 global_state_ = GlobalStateThatImpactsTilePriority(); |
| 386 | 387 |
| 387 // This cancels tasks if possible, finishes pending tasks, and release any | 388 // This cancels tasks if possible, finishes pending tasks, and release any |
| 388 // uninitialized resources. | 389 // uninitialized resources. |
| 389 tile_task_manager_->Shutdown(); | 390 tile_task_manager_->Shutdown(); |
| 390 | 391 |
| 391 raster_buffer_provider_->Shutdown(); | 392 raster_buffer_provider_->Shutdown(); |
| 392 | 393 |
| 393 tile_task_manager_->CheckForCompletedTasks(); | 394 tile_task_manager_->CheckForCompletedTasks(); |
| 394 | 395 |
| 395 tile_task_manager_ = nullptr; | 396 tile_task_manager_ = nullptr; |
| 396 resource_pool_ = nullptr; | 397 resource_pool_ = nullptr; |
| 397 more_tiles_need_prepare_check_notifier_.Cancel(); | 398 more_tiles_need_prepare_check_notifier_.Cancel(); |
| 398 signals_check_notifier_.Cancel(); | 399 signals_check_notifier_.Cancel(); |
| 399 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); | 400 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 401 ready_to_draw_callback_weak_ptr_factory_.InvalidateWeakPtrs(); |
| 400 raster_buffer_provider_ = nullptr; | 402 raster_buffer_provider_ = nullptr; |
| 401 | 403 |
| 402 image_controller_.SetImageDecodeCache(nullptr); | 404 image_controller_.SetImageDecodeCache(nullptr); |
| 403 locked_image_tasks_.clear(); | 405 locked_image_tasks_.clear(); |
| 404 } | 406 } |
| 405 | 407 |
| 406 void TileManager::SetResources(ResourcePool* resource_pool, | 408 void TileManager::SetResources(ResourcePool* resource_pool, |
| 407 ImageDecodeCache* image_decode_cache, | 409 ImageDecodeCache* image_decode_cache, |
| 408 TaskGraphRunner* task_graph_runner, | 410 TaskGraphRunner* task_graph_runner, |
| 409 RasterBufferProvider* raster_buffer_provider, | 411 RasterBufferProvider* raster_buffer_provider, |
| 410 size_t scheduled_raster_task_limit, | 412 size_t scheduled_raster_task_limit, |
| 411 bool use_gpu_rasterization) { | 413 bool use_gpu_rasterization) { |
| 412 DCHECK(!tile_task_manager_); | 414 DCHECK(!tile_task_manager_); |
| 413 DCHECK(task_graph_runner); | 415 DCHECK(task_graph_runner); |
| 414 | 416 |
| 415 use_gpu_rasterization_ = use_gpu_rasterization; | 417 use_gpu_rasterization_ = use_gpu_rasterization; |
| 416 scheduled_raster_task_limit_ = scheduled_raster_task_limit; | 418 scheduled_raster_task_limit_ = scheduled_raster_task_limit; |
| 417 resource_pool_ = resource_pool; | 419 resource_pool_ = resource_pool; |
| 418 image_controller_.SetImageDecodeCache(image_decode_cache); | 420 image_controller_.SetImageDecodeCache(image_decode_cache); |
| 419 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner); | 421 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner); |
| 420 raster_buffer_provider_ = raster_buffer_provider; | 422 raster_buffer_provider_ = raster_buffer_provider; |
| 421 } | 423 } |
| 422 | 424 |
| 423 void TileManager::Release(Tile* tile) { | 425 void TileManager::Release(Tile* tile) { |
| 424 FreeResourcesForTile(tile); | 426 FreeResourcesForTile(tile); |
| 425 tiles_.erase(tile->id()); | 427 tiles_.erase(tile->id()); |
| 428 pending_gpu_work_tiles_.erase(tile); |
| 426 } | 429 } |
| 427 | 430 |
| 428 void TileManager::DidFinishRunningTileTasksRequiredForActivation() { | 431 void TileManager::DidFinishRunningTileTasksRequiredForActivation() { |
| 429 TRACE_EVENT0("cc", | 432 TRACE_EVENT0("cc", |
| 430 "TileManager::DidFinishRunningTileTasksRequiredForActivation"); | 433 "TileManager::DidFinishRunningTileTasksRequiredForActivation"); |
| 431 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", | 434 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", |
| 432 ScheduledTasksStateAsValue()); | 435 ScheduledTasksStateAsValue()); |
| 433 // TODO(vmpstr): Temporary check to debug crbug.com/642927. | 436 // TODO(vmpstr): Temporary check to debug crbug.com/642927. |
| 434 CHECK(tile_task_manager_); | 437 CHECK(tile_task_manager_); |
| 435 signals_.ready_to_activate = true; | 438 signals_.ready_to_activate = true; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 void TileManager::Flush() { | 514 void TileManager::Flush() { |
| 512 TRACE_EVENT0("cc", "TileManager::Flush"); | 515 TRACE_EVENT0("cc", "TileManager::Flush"); |
| 513 | 516 |
| 514 if (!tile_task_manager_) { | 517 if (!tile_task_manager_) { |
| 515 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); | 518 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); |
| 516 return; | 519 return; |
| 517 } | 520 } |
| 518 | 521 |
| 519 tile_task_manager_->CheckForCompletedTasks(); | 522 tile_task_manager_->CheckForCompletedTasks(); |
| 520 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 523 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 524 CheckPendingGpuWorkTiles(true /* issue_signals */); |
| 521 | 525 |
| 522 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", | 526 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", |
| 523 RasterTaskCompletionStatsAsValue(flush_stats_)); | 527 RasterTaskCompletionStatsAsValue(flush_stats_)); |
| 524 flush_stats_ = RasterTaskCompletionStats(); | 528 flush_stats_ = RasterTaskCompletionStats(); |
| 525 } | 529 } |
| 526 | 530 |
| 531 void TileManager::DidModifyTilePriorities() { |
| 532 pending_tile_requirements_dirty_ = true; |
| 533 } |
| 534 |
| 527 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> | 535 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> |
| 528 TileManager::BasicStateAsValue() const { | 536 TileManager::BasicStateAsValue() const { |
| 529 std::unique_ptr<base::trace_event::TracedValue> value( | 537 std::unique_ptr<base::trace_event::TracedValue> value( |
| 530 new base::trace_event::TracedValue()); | 538 new base::trace_event::TracedValue()); |
| 531 BasicStateAsValueInto(value.get()); | 539 BasicStateAsValueInto(value.get()); |
| 532 return std::move(value); | 540 return std::move(value); |
| 533 } | 541 } |
| 534 | 542 |
| 535 void TileManager::BasicStateAsValueInto( | 543 void TileManager::BasicStateAsValueInto( |
| 536 base::trace_event::TracedValue* state) const { | 544 base::trace_event::TracedValue* state) const { |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 654 // or drop the tile for scheduling and raster. | 662 // or drop the tile for scheduling and raster. |
| 655 // TODO(sohanjg): Check if we could use a shared analysis | 663 // TODO(sohanjg): Check if we could use a shared analysis |
| 656 // canvas which is reset between tiles. | 664 // canvas which is reset between tiles. |
| 657 tile->set_solid_color_analysis_performed(true); | 665 tile->set_solid_color_analysis_performed(true); |
| 658 SkColor color = SK_ColorTRANSPARENT; | 666 SkColor color = SK_ColorTRANSPARENT; |
| 659 bool is_solid_color = | 667 bool is_solid_color = |
| 660 prioritized_tile.raster_source()->PerformSolidColorAnalysis( | 668 prioritized_tile.raster_source()->PerformSolidColorAnalysis( |
| 661 tile->content_rect(), tile->contents_scale(), &color); | 669 tile->content_rect(), tile->contents_scale(), &color); |
| 662 if (is_solid_color) { | 670 if (is_solid_color) { |
| 663 tile->draw_info().set_solid_color(color); | 671 tile->draw_info().set_solid_color(color); |
| 664 tile->draw_info().set_was_ever_ready_to_draw(); | |
| 665 if (!tile_is_needed_now) | 672 if (!tile_is_needed_now) |
| 666 tile->draw_info().set_was_a_prepaint_tile(); | 673 tile->draw_info().set_was_a_prepaint_tile(); |
| 667 client_->NotifyTileStateChanged(tile); | 674 client_->NotifyTileStateChanged(tile); |
| 668 continue; | 675 continue; |
| 669 } | 676 } |
| 670 } | 677 } |
| 671 | 678 |
| 672 // Prepaint tiles that are far away are only processed for images. | 679 // Prepaint tiles that are far away are only processed for images. |
| 673 if (!tile->required_for_activation() && !tile->required_for_draw() && | 680 if (!tile->required_for_activation() && !tile->required_for_draw() && |
| 674 prioritized_tile.is_process_for_images_only()) { | 681 prioritized_tile.is_process_for_images_only()) { |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 787 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles", | 794 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles", |
| 788 "all_tiles_that_need_to_be_rasterized_are_scheduled", | 795 "all_tiles_that_need_to_be_rasterized_are_scheduled", |
| 789 all_tiles_that_need_to_be_rasterized_are_scheduled_, | 796 all_tiles_that_need_to_be_rasterized_are_scheduled_, |
| 790 "had_enough_memory_to_schedule_tiles_needed_now", | 797 "had_enough_memory_to_schedule_tiles_needed_now", |
| 791 had_enough_memory_to_schedule_tiles_needed_now); | 798 had_enough_memory_to_schedule_tiles_needed_now); |
| 792 return work_to_schedule; | 799 return work_to_schedule; |
| 793 } | 800 } |
| 794 | 801 |
| 795 void TileManager::FreeResourcesForTile(Tile* tile) { | 802 void TileManager::FreeResourcesForTile(Tile* tile) { |
| 796 TileDrawInfo& draw_info = tile->draw_info(); | 803 TileDrawInfo& draw_info = tile->draw_info(); |
| 797 if (draw_info.resource_) { | 804 Resource* resource = draw_info.TakeResource(); |
| 798 resource_pool_->ReleaseResource(draw_info.resource_); | 805 if (resource) |
| 799 draw_info.resource_ = nullptr; | 806 resource_pool_->ReleaseResource(resource); |
| 800 } | |
| 801 } | 807 } |
| 802 | 808 |
| 803 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( | 809 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( |
| 804 Tile* tile) { | 810 Tile* tile) { |
| 805 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); | 811 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); |
| 806 FreeResourcesForTile(tile); | 812 FreeResourcesForTile(tile); |
| 807 if (was_ready_to_draw) | 813 if (was_ready_to_draw) |
| 808 client_->NotifyTileStateChanged(tile); | 814 client_->NotifyTileStateChanged(tile); |
| 809 } | 815 } |
| 810 | 816 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 848 &TileManager::DidFinishRunningTileTasksRequiredForDraw); | 854 &TileManager::DidFinishRunningTileTasksRequiredForDraw); |
| 849 scoped_refptr<TileTask> all_done_task = | 855 scoped_refptr<TileTask> all_done_task = |
| 850 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); | 856 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); |
| 851 | 857 |
| 852 // Build a new task queue containing all task currently needed. Tasks | 858 // Build a new task queue containing all task currently needed. Tasks |
| 853 // are added in order of priority, highest priority task first. | 859 // are added in order of priority, highest priority task first. |
| 854 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { | 860 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { |
| 855 Tile* tile = prioritized_tile.tile(); | 861 Tile* tile = prioritized_tile.tile(); |
| 856 | 862 |
| 857 DCHECK(tile->draw_info().requires_resource()); | 863 DCHECK(tile->draw_info().requires_resource()); |
| 858 DCHECK(!tile->draw_info().resource_); | 864 DCHECK(!tile->draw_info().resource()); |
| 859 | 865 |
| 860 if (!tile->raster_task_) | 866 if (!tile->raster_task_) |
| 861 tile->raster_task_ = CreateRasterTask( | 867 tile->raster_task_ = CreateRasterTask( |
| 862 prioritized_tile, | 868 prioritized_tile, |
| 863 prioritized_tile.raster_source()->HasImpliedColorSpace() | 869 prioritized_tile.raster_source()->HasImpliedColorSpace() |
| 864 ? prioritized_tile.raster_source()->GetImpliedColorSpace() | 870 ? prioritized_tile.raster_source()->GetImpliedColorSpace() |
| 865 : target_color_space); | 871 : target_color_space); |
| 866 | 872 |
| 867 TileTask* task = tile->raster_task_.get(); | 873 TileTask* task = tile->raster_task_.get(); |
| 868 | 874 |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1056 | 1062 |
| 1057 resource_pool_->OnContentReplaced(resource->id(), tile_id); | 1063 resource_pool_->OnContentReplaced(resource->id(), tile_id); |
| 1058 ++flush_stats_.completed_count; | 1064 ++flush_stats_.completed_count; |
| 1059 | 1065 |
| 1060 if (!tile) { | 1066 if (!tile) { |
| 1061 resource_pool_->ReleaseResource(resource); | 1067 resource_pool_->ReleaseResource(resource); |
| 1062 return; | 1068 return; |
| 1063 } | 1069 } |
| 1064 | 1070 |
| 1065 TileDrawInfo& draw_info = tile->draw_info(); | 1071 TileDrawInfo& draw_info = tile->draw_info(); |
| 1066 draw_info.set_use_resource(); | 1072 draw_info.set_resource(resource); |
| 1067 draw_info.resource_ = resource; | |
| 1068 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); | 1073 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); |
| 1069 | 1074 |
| 1070 DCHECK(draw_info.IsReadyToDraw()); | 1075 // In SMOOTHNESS_TAKES_PRIORITY mode, we wait for GPU work to complete for a |
| 1071 draw_info.set_was_ever_ready_to_draw(); | 1076 // tile before setting it as ready to draw. |
| 1077 if (global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY && |
| 1078 !raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) { |
| 1079 pending_gpu_work_tiles_.insert(tile); |
| 1080 return; |
| 1081 } |
| 1082 |
| 1083 draw_info.set_resource_ready_for_draw(); |
| 1072 client_->NotifyTileStateChanged(tile); | 1084 client_->NotifyTileStateChanged(tile); |
| 1073 } | 1085 } |
| 1074 | 1086 |
| 1075 void TileManager::SetDecodedImageTracker( | 1087 void TileManager::SetDecodedImageTracker( |
| 1076 DecodedImageTracker* decoded_image_tracker) { | 1088 DecodedImageTracker* decoded_image_tracker) { |
| 1077 // TODO(vmpstr): If the tile manager needs to request out-of-raster decodes, | 1089 // TODO(vmpstr): If the tile manager needs to request out-of-raster decodes, |
| 1078 // it should retain and use |decoded_image_tracker| here. | 1090 // it should retain and use |decoded_image_tracker| here. |
| 1079 decoded_image_tracker->set_image_controller(&image_controller_); | 1091 decoded_image_tracker->set_image_controller(&image_controller_); |
| 1080 } | 1092 } |
| 1081 | 1093 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1118 Tile* tile = all_queue->Top().tile(); | 1130 Tile* tile = all_queue->Top().tile(); |
| 1119 DCHECK(!tile->required_for_activation() || | 1131 DCHECK(!tile->required_for_activation() || |
| 1120 tile->draw_info().IsReadyToDraw()); | 1132 tile->draw_info().IsReadyToDraw()); |
| 1121 } | 1133 } |
| 1122 #endif | 1134 #endif |
| 1123 return true; | 1135 return true; |
| 1124 } | 1136 } |
| 1125 | 1137 |
| 1126 bool TileManager::IsReadyToActivate() const { | 1138 bool TileManager::IsReadyToActivate() const { |
| 1127 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); | 1139 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); |
| 1128 return AreRequiredTilesReadyToDraw( | 1140 return pending_required_for_activation_callback_id_ == 0 && |
| 1129 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | 1141 AreRequiredTilesReadyToDraw( |
| 1142 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); |
| 1130 } | 1143 } |
| 1131 | 1144 |
| 1132 bool TileManager::IsReadyToDraw() const { | 1145 bool TileManager::IsReadyToDraw() const { |
| 1133 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); | 1146 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); |
| 1134 return AreRequiredTilesReadyToDraw( | 1147 return pending_required_for_draw_callback_id_ == 0 && |
| 1135 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | 1148 AreRequiredTilesReadyToDraw( |
| 1149 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); |
| 1136 } | 1150 } |
| 1137 | 1151 |
| 1138 void TileManager::CheckAndIssueSignals() { | 1152 void TileManager::CheckAndIssueSignals() { |
| 1139 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); | 1153 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); |
| 1140 tile_task_manager_->CheckForCompletedTasks(); | 1154 tile_task_manager_->CheckForCompletedTasks(); |
| 1141 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 1155 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 1142 | 1156 |
| 1157 CheckPendingGpuWorkTiles(false /* issue_signals */); |
| 1158 |
| 1143 // Ready to activate. | 1159 // Ready to activate. |
| 1144 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { | 1160 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { |
| 1145 signals_.ready_to_activate = false; | 1161 signals_.ready_to_activate = false; |
| 1146 if (IsReadyToActivate()) { | 1162 if (IsReadyToActivate()) { |
| 1147 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1163 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1148 "TileManager::CheckAndIssueSignals - ready to activate"); | 1164 "TileManager::CheckAndIssueSignals - ready to activate"); |
| 1149 signals_.did_notify_ready_to_activate = true; | 1165 signals_.did_notify_ready_to_activate = true; |
| 1150 client_->NotifyReadyToActivate(); | 1166 client_->NotifyReadyToActivate(); |
| 1151 } | 1167 } |
| 1152 } | 1168 } |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1282 signals_.all_tile_tasks_completed); | 1298 signals_.all_tile_tasks_completed); |
| 1283 state->EndDictionary(); | 1299 state->EndDictionary(); |
| 1284 return std::move(state); | 1300 return std::move(state); |
| 1285 } | 1301 } |
| 1286 | 1302 |
| 1287 bool TileManager::UsePartialRaster() const { | 1303 bool TileManager::UsePartialRaster() const { |
| 1288 return use_partial_raster_ && | 1304 return use_partial_raster_ && |
| 1289 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); | 1305 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); |
| 1290 } | 1306 } |
| 1291 | 1307 |
| 1308 void TileManager::CheckPendingGpuWorkTiles(bool issue_signals) { |
| 1309 ResourceProvider::ResourceIdArray required_for_activation_ids; |
| 1310 ResourceProvider::ResourceIdArray required_for_draw_ids; |
| 1311 |
| 1312 for (auto it = pending_gpu_work_tiles_.begin(); |
| 1313 it != pending_gpu_work_tiles_.end();) { |
| 1314 Tile* tile = *it; |
| 1315 const Resource* resource = tile->draw_info().resource(); |
| 1316 |
| 1317 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY || |
| 1318 raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) { |
| 1319 tile->draw_info().set_resource_ready_for_draw(); |
| 1320 client_->NotifyTileStateChanged(tile); |
| 1321 it = pending_gpu_work_tiles_.erase(it); |
| 1322 continue; |
| 1323 } |
| 1324 |
| 1325 // TODO(ericrk): If a tile in our list no longer has valid tile priorities, |
| 1326 // it may still report that it is required, and unnecessarily delay |
| 1327 // activation. crbug.com/687265 |
| 1328 if (pending_tile_requirements_dirty_) |
| 1329 tile->tiling()->UpdateRequiredStatesOnTile(tile); |
| 1330 if (tile->required_for_activation()) |
| 1331 required_for_activation_ids.push_back(resource->id()); |
| 1332 if (tile->required_for_draw()) |
| 1333 required_for_draw_ids.push_back(resource->id()); |
| 1334 |
| 1335 ++it; |
| 1336 } |
| 1337 |
| 1338 if (required_for_activation_ids.empty()) { |
| 1339 pending_required_for_activation_callback_id_ = 0; |
| 1340 } else { |
| 1341 pending_required_for_activation_callback_id_ = |
| 1342 raster_buffer_provider_->SetReadyToDrawCallback( |
| 1343 required_for_activation_ids, |
| 1344 base::Bind(&TileManager::CheckPendingGpuWorkTiles, |
| 1345 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(), |
| 1346 true /* issue_signals */), |
| 1347 pending_required_for_activation_callback_id_); |
| 1348 } |
| 1349 |
| 1350 pending_required_for_draw_callback_id_ = 0; |
| 1351 if (!required_for_draw_ids.empty()) { |
| 1352 pending_required_for_draw_callback_id_ = |
| 1353 raster_buffer_provider_->SetReadyToDrawCallback( |
| 1354 required_for_draw_ids, |
| 1355 base::Bind(&TileManager::CheckPendingGpuWorkTiles, |
| 1356 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(), |
| 1357 true /* issue_signals */), |
| 1358 pending_required_for_draw_callback_id_); |
| 1359 } |
| 1360 |
| 1361 // Update our signals now that we know whether we have pending resources. |
| 1362 signals_.ready_to_activate = |
| 1363 (pending_required_for_activation_callback_id_ == 0); |
| 1364 signals_.ready_to_draw = (pending_required_for_draw_callback_id_ == 0); |
| 1365 |
| 1366 if (issue_signals && (signals_.ready_to_activate || signals_.ready_to_draw)) |
| 1367 signals_check_notifier_.Schedule(); |
| 1368 |
| 1369 // We've just updated all pending tile requirements if necessary. |
| 1370 pending_tile_requirements_dirty_ = false; |
| 1371 } |
| 1372 |
| 1292 // Utility function that can be used to create a "Task set finished" task that | 1373 // Utility function that can be used to create a "Task set finished" task that |
| 1293 // posts |callback| to |task_runner| when run. | 1374 // posts |callback| to |task_runner| when run. |
| 1294 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( | 1375 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( |
| 1295 void (TileManager::*callback)()) { | 1376 void (TileManager::*callback)()) { |
| 1296 return make_scoped_refptr(new TaskSetFinishedTaskImpl( | 1377 return make_scoped_refptr(new TaskSetFinishedTaskImpl( |
| 1297 task_runner_, | 1378 task_runner_, |
| 1298 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); | 1379 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); |
| 1299 } | 1380 } |
| 1300 | 1381 |
| 1301 TileManager::MemoryUsage::MemoryUsage() | 1382 TileManager::MemoryUsage::MemoryUsage() |
| 1302 : memory_bytes_(0), resource_count_(0) {} | 1383 : memory_bytes_(0), resource_count_(0) {} |
| 1303 | 1384 |
| 1304 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, | 1385 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, |
| 1305 size_t resource_count) | 1386 size_t resource_count) |
| 1306 : memory_bytes_(static_cast<int64_t>(memory_bytes)), | 1387 : memory_bytes_(static_cast<int64_t>(memory_bytes)), |
| 1307 resource_count_(static_cast<int>(resource_count)) { | 1388 resource_count_(static_cast<int>(resource_count)) { |
| 1308 // MemoryUsage is constructed using size_ts, since it deals with memory and | 1389 // MemoryUsage is constructed using size_ts, since it deals with memory and |
| 1309 // the inputs are typically size_t. However, during the course of usage (in | 1390 // the inputs are typically size_t. However, during the course of usage (in |
| 1310 // particular operator-=) can cause internal values to become negative. Thus, | 1391 // particular operator-=) can cause internal values to become negative. |
| 1311 // member variables are signed. | 1392 // Thus, member variables are signed. |
| 1312 DCHECK_LE(memory_bytes, | 1393 DCHECK_LE(memory_bytes, |
| 1313 static_cast<size_t>(std::numeric_limits<int64_t>::max())); | 1394 static_cast<size_t>(std::numeric_limits<int64_t>::max())); |
| 1314 DCHECK_LE(resource_count, | 1395 DCHECK_LE(resource_count, |
| 1315 static_cast<size_t>(std::numeric_limits<int>::max())); | 1396 static_cast<size_t>(std::numeric_limits<int>::max())); |
| 1316 } | 1397 } |
| 1317 | 1398 |
| 1318 // static | 1399 // static |
| 1319 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( | 1400 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( |
| 1320 const gfx::Size& size, | 1401 const gfx::Size& size, |
| 1321 ResourceFormat format) { | 1402 ResourceFormat format) { |
| 1322 // We can use UncheckedSizeInBytes here since this is used with a tile | 1403 // We can use UncheckedSizeInBytes here since this is used with a tile |
| 1323 // size which is determined by the compositor (it's at most max texture size). | 1404 // size which is determined by the compositor (it's at most max texture |
| 1405 // size). |
| 1324 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), | 1406 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), |
| 1325 1); | 1407 1); |
| 1326 } | 1408 } |
| 1327 | 1409 |
| 1328 // static | 1410 // static |
| 1329 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { | 1411 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { |
| 1330 const TileDrawInfo& draw_info = tile->draw_info(); | 1412 const TileDrawInfo& draw_info = tile->draw_info(); |
| 1331 if (draw_info.resource_) { | 1413 if (draw_info.resource()) { |
| 1332 return MemoryUsage::FromConfig(draw_info.resource_->size(), | 1414 return MemoryUsage::FromConfig(draw_info.resource()->size(), |
| 1333 draw_info.resource_->format()); | 1415 draw_info.resource()->format()); |
| 1334 } | 1416 } |
| 1335 return MemoryUsage(); | 1417 return MemoryUsage(); |
| 1336 } | 1418 } |
| 1337 | 1419 |
| 1338 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=( | 1420 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=( |
| 1339 const MemoryUsage& other) { | 1421 const MemoryUsage& other) { |
| 1340 memory_bytes_ += other.memory_bytes_; | 1422 memory_bytes_ += other.memory_bytes_; |
| 1341 resource_count_ += other.resource_count_; | 1423 resource_count_ += other.resource_count_; |
| 1342 return *this; | 1424 return *this; |
| 1343 } | 1425 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1373 all_tile_tasks_completed = false; | 1455 all_tile_tasks_completed = false; |
| 1374 did_notify_all_tile_tasks_completed = false; | 1456 did_notify_all_tile_tasks_completed = false; |
| 1375 } | 1457 } |
| 1376 | 1458 |
| 1377 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; | 1459 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; |
| 1378 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( | 1460 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( |
| 1379 PrioritizedWorkToSchedule&& other) = default; | 1461 PrioritizedWorkToSchedule&& other) = default; |
| 1380 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; | 1462 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; |
| 1381 | 1463 |
| 1382 } // namespace cc | 1464 } // namespace cc |
| OLD | NEW |