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 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 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1052 | 1058 |
| 1053 resource_pool_->OnContentReplaced(resource->id(), tile_id); | 1059 resource_pool_->OnContentReplaced(resource->id(), tile_id); |
| 1054 ++flush_stats_.completed_count; | 1060 ++flush_stats_.completed_count; |
| 1055 | 1061 |
| 1056 if (!tile) { | 1062 if (!tile) { |
| 1057 resource_pool_->ReleaseResource(resource); | 1063 resource_pool_->ReleaseResource(resource); |
| 1058 return; | 1064 return; |
| 1059 } | 1065 } |
| 1060 | 1066 |
| 1061 TileDrawInfo& draw_info = tile->draw_info(); | 1067 TileDrawInfo& draw_info = tile->draw_info(); |
| 1062 draw_info.set_use_resource(); | 1068 draw_info.set_resource(resource); |
| 1063 draw_info.resource_ = resource; | |
| 1064 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); | 1069 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); |
| 1065 | 1070 |
| 1066 DCHECK(draw_info.IsReadyToDraw()); | 1071 // In SMOOTHNESS_TAKES_PRIORITY mode, we wait for GPU work to complete for a |
| 1067 draw_info.set_was_ever_ready_to_draw(); | 1072 // tile before setting it as ready to draw. |
| 1073 if (global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY && | |
| 1074 !raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) { | |
| 1075 pending_gpu_work_tiles_.insert(tile); | |
| 1076 return; | |
| 1077 } | |
| 1078 | |
| 1079 draw_info.set_resource_ready_for_draw(); | |
| 1068 client_->NotifyTileStateChanged(tile); | 1080 client_->NotifyTileStateChanged(tile); |
| 1069 } | 1081 } |
| 1070 | 1082 |
| 1071 void TileManager::SetDecodedImageTracker( | 1083 void TileManager::SetDecodedImageTracker( |
| 1072 DecodedImageTracker* decoded_image_tracker) { | 1084 DecodedImageTracker* decoded_image_tracker) { |
| 1073 // TODO(vmpstr): If the tile manager needs to request out-of-raster decodes, | 1085 // TODO(vmpstr): If the tile manager needs to request out-of-raster decodes, |
| 1074 // it should retain and use |decoded_image_tracker| here. | 1086 // it should retain and use |decoded_image_tracker| here. |
| 1075 decoded_image_tracker->set_image_controller(&image_controller_); | 1087 decoded_image_tracker->set_image_controller(&image_controller_); |
| 1076 } | 1088 } |
| 1077 | 1089 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1114 Tile* tile = all_queue->Top().tile(); | 1126 Tile* tile = all_queue->Top().tile(); |
| 1115 DCHECK(!tile->required_for_activation() || | 1127 DCHECK(!tile->required_for_activation() || |
| 1116 tile->draw_info().IsReadyToDraw()); | 1128 tile->draw_info().IsReadyToDraw()); |
| 1117 } | 1129 } |
| 1118 #endif | 1130 #endif |
| 1119 return true; | 1131 return true; |
| 1120 } | 1132 } |
| 1121 | 1133 |
| 1122 bool TileManager::IsReadyToActivate() const { | 1134 bool TileManager::IsReadyToActivate() const { |
| 1123 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); | 1135 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); |
| 1124 return AreRequiredTilesReadyToDraw( | 1136 return pending_required_for_activation_callback_id_ == 0 && |
| 1125 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | 1137 AreRequiredTilesReadyToDraw( |
| 1138 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | |
| 1126 } | 1139 } |
| 1127 | 1140 |
| 1128 bool TileManager::IsReadyToDraw() const { | 1141 bool TileManager::IsReadyToDraw() const { |
| 1129 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); | 1142 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); |
| 1130 return AreRequiredTilesReadyToDraw( | 1143 return pending_required_for_draw_callback_id_ == 0 && |
| 1131 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | 1144 AreRequiredTilesReadyToDraw( |
| 1145 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | |
| 1132 } | 1146 } |
| 1133 | 1147 |
| 1134 void TileManager::CheckAndIssueSignals() { | 1148 void TileManager::CheckAndIssueSignals() { |
| 1135 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); | 1149 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); |
| 1136 tile_task_manager_->CheckForCompletedTasks(); | 1150 tile_task_manager_->CheckForCompletedTasks(); |
| 1137 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 1151 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 1138 | 1152 |
| 1153 CheckPendingGpuWorkTiles(false /* issue_signals */); | |
| 1154 | |
| 1139 // Ready to activate. | 1155 // Ready to activate. |
| 1140 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { | 1156 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { |
| 1141 signals_.ready_to_activate = false; | 1157 signals_.ready_to_activate = false; |
| 1142 if (IsReadyToActivate()) { | 1158 if (IsReadyToActivate()) { |
| 1143 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1159 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1144 "TileManager::CheckAndIssueSignals - ready to activate"); | 1160 "TileManager::CheckAndIssueSignals - ready to activate"); |
| 1145 signals_.did_notify_ready_to_activate = true; | 1161 signals_.did_notify_ready_to_activate = true; |
| 1146 client_->NotifyReadyToActivate(); | 1162 client_->NotifyReadyToActivate(); |
| 1147 } | 1163 } |
| 1148 } | 1164 } |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1280 signals_.all_tile_tasks_completed); | 1296 signals_.all_tile_tasks_completed); |
| 1281 state->EndDictionary(); | 1297 state->EndDictionary(); |
| 1282 return std::move(state); | 1298 return std::move(state); |
| 1283 } | 1299 } |
| 1284 | 1300 |
| 1285 bool TileManager::UsePartialRaster() const { | 1301 bool TileManager::UsePartialRaster() const { |
| 1286 return use_partial_raster_ && | 1302 return use_partial_raster_ && |
| 1287 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); | 1303 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); |
| 1288 } | 1304 } |
| 1289 | 1305 |
| 1306 void TileManager::CheckPendingGpuWorkTiles(bool issue_signals) { | |
| 1307 ResourceProvider::ResourceIdArray required_for_activation_ids; | |
| 1308 ResourceProvider::ResourceIdArray required_for_draw_ids; | |
| 1309 | |
| 1310 for (auto it = pending_gpu_work_tiles_.begin(); | |
| 1311 it != pending_gpu_work_tiles_.end();) { | |
| 1312 Tile* tile = *it; | |
| 1313 const Resource* resource = tile->draw_info().resource(); | |
| 1314 | |
| 1315 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY || | |
| 1316 raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) { | |
| 1317 tile->draw_info().set_resource_ready_for_draw(); | |
| 1318 client_->NotifyTileStateChanged(tile); | |
| 1319 it = pending_gpu_work_tiles_.erase(it); | |
| 1320 continue; | |
| 1321 } | |
| 1322 | |
| 1323 if (pending_tile_requirements_dirty_) | |
| 1324 tile->tiling()->UpdateRequiredStatesOnTile(tile); | |
| 1325 if (tile->required_for_activation()) | |
|
vmpstr
2017/01/30 19:51:19
While investigating an unrelated to this bug, I re
ericrk
2017/01/31 19:23:54
Added a TODO + crbug... will take care of this in
| |
| 1326 required_for_activation_ids.push_back(resource->id()); | |
| 1327 if (tile->required_for_draw()) | |
| 1328 required_for_draw_ids.push_back(resource->id()); | |
| 1329 | |
| 1330 ++it; | |
| 1331 } | |
| 1332 | |
| 1333 if (required_for_activation_ids.empty()) { | |
| 1334 pending_required_for_activation_callback_id_ = 0; | |
| 1335 } else { | |
| 1336 pending_required_for_activation_callback_id_ = | |
| 1337 raster_buffer_provider_->SetReadyToDrawCallback( | |
| 1338 required_for_activation_ids, | |
| 1339 base::Bind(&TileManager::CheckPendingGpuWorkTiles, | |
| 1340 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(), | |
| 1341 true /* issue_signals */), | |
| 1342 pending_required_for_activation_callback_id_); | |
| 1343 } | |
| 1344 | |
| 1345 pending_required_for_draw_callback_id_ = 0; | |
| 1346 if (!required_for_draw_ids.empty()) { | |
| 1347 pending_required_for_draw_callback_id_ = | |
| 1348 raster_buffer_provider_->SetReadyToDrawCallback( | |
| 1349 required_for_draw_ids, | |
| 1350 base::Bind(&TileManager::CheckPendingGpuWorkTiles, | |
| 1351 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(), | |
| 1352 true /* issue_signals */), | |
| 1353 pending_required_for_draw_callback_id_); | |
| 1354 } | |
| 1355 | |
| 1356 // Update our signals now that we know whether we have pending resources. | |
| 1357 signals_.ready_to_activate = | |
| 1358 (pending_required_for_activation_callback_id_ == 0); | |
| 1359 signals_.ready_to_draw = (pending_required_for_draw_callback_id_ == 0); | |
| 1360 | |
| 1361 if (issue_signals && (signals_.ready_to_activate || signals_.ready_to_draw)) | |
| 1362 signals_check_notifier_.Schedule(); | |
| 1363 | |
| 1364 // We've just updated all pending tile requirements if necessary. | |
| 1365 pending_tile_requirements_dirty_ = false; | |
| 1366 } | |
| 1367 | |
| 1290 // Utility function that can be used to create a "Task set finished" task that | 1368 // Utility function that can be used to create a "Task set finished" task that |
| 1291 // posts |callback| to |task_runner| when run. | 1369 // posts |callback| to |task_runner| when run. |
| 1292 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( | 1370 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( |
| 1293 void (TileManager::*callback)()) { | 1371 void (TileManager::*callback)()) { |
| 1294 return make_scoped_refptr(new TaskSetFinishedTaskImpl( | 1372 return make_scoped_refptr(new TaskSetFinishedTaskImpl( |
| 1295 task_runner_, | 1373 task_runner_, |
| 1296 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); | 1374 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); |
| 1297 } | 1375 } |
| 1298 | 1376 |
| 1299 TileManager::MemoryUsage::MemoryUsage() | 1377 TileManager::MemoryUsage::MemoryUsage() |
| 1300 : memory_bytes_(0), resource_count_(0) {} | 1378 : memory_bytes_(0), resource_count_(0) {} |
| 1301 | 1379 |
| 1302 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, | 1380 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, |
| 1303 size_t resource_count) | 1381 size_t resource_count) |
| 1304 : memory_bytes_(static_cast<int64_t>(memory_bytes)), | 1382 : memory_bytes_(static_cast<int64_t>(memory_bytes)), |
| 1305 resource_count_(static_cast<int>(resource_count)) { | 1383 resource_count_(static_cast<int>(resource_count)) { |
| 1306 // MemoryUsage is constructed using size_ts, since it deals with memory and | 1384 // MemoryUsage is constructed using size_ts, since it deals with memory and |
| 1307 // the inputs are typically size_t. However, during the course of usage (in | 1385 // the inputs are typically size_t. However, during the course of usage (in |
| 1308 // particular operator-=) can cause internal values to become negative. Thus, | 1386 // particular operator-=) can cause internal values to become negative. |
| 1309 // member variables are signed. | 1387 // Thus, member variables are signed. |
| 1310 DCHECK_LE(memory_bytes, | 1388 DCHECK_LE(memory_bytes, |
| 1311 static_cast<size_t>(std::numeric_limits<int64_t>::max())); | 1389 static_cast<size_t>(std::numeric_limits<int64_t>::max())); |
| 1312 DCHECK_LE(resource_count, | 1390 DCHECK_LE(resource_count, |
| 1313 static_cast<size_t>(std::numeric_limits<int>::max())); | 1391 static_cast<size_t>(std::numeric_limits<int>::max())); |
| 1314 } | 1392 } |
| 1315 | 1393 |
| 1316 // static | 1394 // static |
| 1317 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( | 1395 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( |
| 1318 const gfx::Size& size, | 1396 const gfx::Size& size, |
| 1319 ResourceFormat format) { | 1397 ResourceFormat format) { |
| 1320 // We can use UncheckedSizeInBytes here since this is used with a tile | 1398 // We can use UncheckedSizeInBytes here since this is used with a tile |
| 1321 // size which is determined by the compositor (it's at most max texture size). | 1399 // size which is determined by the compositor (it's at most max texture |
| 1400 // size). | |
| 1322 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), | 1401 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), |
| 1323 1); | 1402 1); |
| 1324 } | 1403 } |
| 1325 | 1404 |
| 1326 // static | 1405 // static |
| 1327 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { | 1406 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { |
| 1328 const TileDrawInfo& draw_info = tile->draw_info(); | 1407 const TileDrawInfo& draw_info = tile->draw_info(); |
| 1329 if (draw_info.resource_) { | 1408 if (draw_info.resource()) { |
| 1330 return MemoryUsage::FromConfig(draw_info.resource_->size(), | 1409 return MemoryUsage::FromConfig(draw_info.resource()->size(), |
| 1331 draw_info.resource_->format()); | 1410 draw_info.resource()->format()); |
| 1332 } | 1411 } |
| 1333 return MemoryUsage(); | 1412 return MemoryUsage(); |
| 1334 } | 1413 } |
| 1335 | 1414 |
| 1336 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=( | 1415 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=( |
| 1337 const MemoryUsage& other) { | 1416 const MemoryUsage& other) { |
| 1338 memory_bytes_ += other.memory_bytes_; | 1417 memory_bytes_ += other.memory_bytes_; |
| 1339 resource_count_ += other.resource_count_; | 1418 resource_count_ += other.resource_count_; |
| 1340 return *this; | 1419 return *this; |
| 1341 } | 1420 } |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 1371 all_tile_tasks_completed = false; | 1450 all_tile_tasks_completed = false; |
| 1372 did_notify_all_tile_tasks_completed = false; | 1451 did_notify_all_tile_tasks_completed = false; |
| 1373 } | 1452 } |
| 1374 | 1453 |
| 1375 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; | 1454 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; |
| 1376 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( | 1455 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( |
| 1377 PrioritizedWorkToSchedule&& other) = default; | 1456 PrioritizedWorkToSchedule&& other) = default; |
| 1378 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; | 1457 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; |
| 1379 | 1458 |
| 1380 } // namespace cc | 1459 } // namespace cc |
| OLD | NEW |