| 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 | 399 |
| 398 image_controller_.SetImageDecodeCache(nullptr); | 400 image_controller_.SetImageDecodeCache(nullptr); |
| 399 locked_image_tasks_.clear(); | 401 locked_image_tasks_.clear(); |
| 400 } | 402 } |
| 401 | 403 |
| 402 void TileManager::SetResources(ResourcePool* resource_pool, | 404 void TileManager::SetResources(ResourcePool* resource_pool, |
| 403 ImageDecodeCache* image_decode_cache, | 405 ImageDecodeCache* image_decode_cache, |
| 404 TaskGraphRunner* task_graph_runner, | 406 TaskGraphRunner* task_graph_runner, |
| 405 RasterBufferProvider* raster_buffer_provider, | 407 RasterBufferProvider* raster_buffer_provider, |
| 406 size_t scheduled_raster_task_limit, | 408 size_t scheduled_raster_task_limit, |
| 407 bool use_gpu_rasterization) { | 409 bool use_gpu_rasterization) { |
| 408 DCHECK(!tile_task_manager_); | 410 DCHECK(!tile_task_manager_); |
| 409 DCHECK(task_graph_runner); | 411 DCHECK(task_graph_runner); |
| 410 | 412 |
| 411 use_gpu_rasterization_ = use_gpu_rasterization; | 413 use_gpu_rasterization_ = use_gpu_rasterization; |
| 412 scheduled_raster_task_limit_ = scheduled_raster_task_limit; | 414 scheduled_raster_task_limit_ = scheduled_raster_task_limit; |
| 413 resource_pool_ = resource_pool; | 415 resource_pool_ = resource_pool; |
| 414 image_controller_.SetImageDecodeCache(image_decode_cache); | 416 image_controller_.SetImageDecodeCache(image_decode_cache); |
| 415 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner); | 417 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner); |
| 416 raster_buffer_provider_ = raster_buffer_provider; | 418 raster_buffer_provider_ = raster_buffer_provider; |
| 417 } | 419 } |
| 418 | 420 |
| 419 void TileManager::Release(Tile* tile) { | 421 void TileManager::Release(Tile* tile) { |
| 420 released_tiles_.push_back(tile); | 422 released_tiles_.push_back(tile); |
| 423 auto found = std::find(pending_ready_for_draw_tiles_.begin(), |
| 424 pending_ready_for_draw_tiles_.end(), tile); |
| 425 if (found != pending_ready_for_draw_tiles_.end()) |
| 426 pending_ready_for_draw_tiles_.erase(found); |
| 421 } | 427 } |
| 422 | 428 |
| 423 void TileManager::FreeResourcesForReleasedTiles() { | 429 void TileManager::FreeResourcesForReleasedTiles() { |
| 424 for (auto* tile : released_tiles_) | 430 for (auto* tile : released_tiles_) |
| 425 FreeResourcesForTile(tile); | 431 FreeResourcesForTile(tile); |
| 426 } | 432 } |
| 427 | 433 |
| 428 void TileManager::CleanUpReleasedTiles() { | 434 void TileManager::CleanUpReleasedTiles() { |
| 429 std::vector<Tile*> tiles_to_retain; | 435 std::vector<Tile*> tiles_to_retain; |
| 430 for (auto* tile : released_tiles_) { | 436 for (auto* tile : released_tiles_) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 // We need to call CheckForCompletedTasks() once in-between each call | 511 // We need to call CheckForCompletedTasks() once in-between each call |
| 506 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 512 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
| 507 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 513 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
| 508 tile_task_manager_->CheckForCompletedTasks(); | 514 tile_task_manager_->CheckForCompletedTasks(); |
| 509 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 515 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 510 } | 516 } |
| 511 | 517 |
| 512 FreeResourcesForReleasedTiles(); | 518 FreeResourcesForReleasedTiles(); |
| 513 CleanUpReleasedTiles(); | 519 CleanUpReleasedTiles(); |
| 514 | 520 |
| 521 if (!pending_ready_for_draw_tiles_.empty()) |
| 522 pending_tile_requirements_dirty_ = true; |
| 523 |
| 515 PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles(); | 524 PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles(); |
| 516 | 525 |
| 517 // Inform the client that will likely require a draw if the highest priority | 526 // Inform the client that will likely require a draw if the highest priority |
| 518 // tile that will be rasterized is required for draw. | 527 // tile that will be rasterized is required for draw. |
| 519 client_->SetIsLikelyToRequireADraw( | 528 client_->SetIsLikelyToRequireADraw( |
| 520 !prioritized_work.tiles_to_raster.empty() && | 529 !prioritized_work.tiles_to_raster.empty() && |
| 521 prioritized_work.tiles_to_raster.front().tile()->required_for_draw()); | 530 prioritized_work.tiles_to_raster.front().tile()->required_for_draw()); |
| 522 | 531 |
| 523 // Schedule tile tasks. | 532 // Schedule tile tasks. |
| 524 ScheduleTasks(prioritized_work); | 533 ScheduleTasks(prioritized_work); |
| 525 | 534 |
| 526 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, | 535 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, |
| 527 "state", BasicStateAsValue()); | 536 "state", BasicStateAsValue()); |
| 528 return true; | 537 return true; |
| 529 } | 538 } |
| 530 | 539 |
| 531 void TileManager::Flush() { | 540 void TileManager::Flush() { |
| 532 TRACE_EVENT0("cc", "TileManager::Flush"); | 541 TRACE_EVENT0("cc", "TileManager::Flush"); |
| 533 | 542 |
| 534 if (!tile_task_manager_) { | 543 if (!tile_task_manager_) { |
| 535 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); | 544 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); |
| 536 return; | 545 return; |
| 537 } | 546 } |
| 538 | 547 |
| 539 tile_task_manager_->CheckForCompletedTasks(); | 548 tile_task_manager_->CheckForCompletedTasks(); |
| 540 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 549 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 550 CheckPendingReadyToDrawTiles(true /* issue_signals */); |
| 541 | 551 |
| 542 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", | 552 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", |
| 543 RasterTaskCompletionStatsAsValue(flush_stats_)); | 553 RasterTaskCompletionStatsAsValue(flush_stats_)); |
| 544 flush_stats_ = RasterTaskCompletionStats(); | 554 flush_stats_ = RasterTaskCompletionStats(); |
| 545 } | 555 } |
| 546 | 556 |
| 547 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> | 557 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> |
| 548 TileManager::BasicStateAsValue() const { | 558 TileManager::BasicStateAsValue() const { |
| 549 std::unique_ptr<base::trace_event::TracedValue> value( | 559 std::unique_ptr<base::trace_event::TracedValue> value( |
| 550 new base::trace_event::TracedValue()); | 560 new base::trace_event::TracedValue()); |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 all_tiles_that_need_to_be_rasterized_are_scheduled_, | 784 all_tiles_that_need_to_be_rasterized_are_scheduled_, |
| 775 "had_enough_memory_to_schedule_tiles_needed_now", | 785 "had_enough_memory_to_schedule_tiles_needed_now", |
| 776 had_enough_memory_to_schedule_tiles_needed_now); | 786 had_enough_memory_to_schedule_tiles_needed_now); |
| 777 return work_to_schedule; | 787 return work_to_schedule; |
| 778 } | 788 } |
| 779 | 789 |
| 780 void TileManager::FreeResourcesForTile(Tile* tile) { | 790 void TileManager::FreeResourcesForTile(Tile* tile) { |
| 781 TileDrawInfo& draw_info = tile->draw_info(); | 791 TileDrawInfo& draw_info = tile->draw_info(); |
| 782 if (draw_info.resource_) { | 792 if (draw_info.resource_) { |
| 783 resource_pool_->ReleaseResource(draw_info.resource_); | 793 resource_pool_->ReleaseResource(draw_info.resource_); |
| 784 draw_info.resource_ = nullptr; | 794 draw_info.set_resource(nullptr); |
| 785 } | 795 } |
| 786 } | 796 } |
| 787 | 797 |
| 788 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( | 798 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( |
| 789 Tile* tile) { | 799 Tile* tile) { |
| 790 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); | 800 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); |
| 791 FreeResourcesForTile(tile); | 801 FreeResourcesForTile(tile); |
| 792 if (was_ready_to_draw) | 802 if (was_ready_to_draw) |
| 793 client_->NotifyTileStateChanged(tile); | 803 client_->NotifyTileStateChanged(tile); |
| 794 } | 804 } |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1029 | 1039 |
| 1030 if (was_canceled) { | 1040 if (was_canceled) { |
| 1031 ++flush_stats_.canceled_count; | 1041 ++flush_stats_.canceled_count; |
| 1032 resource_pool_->ReleaseResource(resource); | 1042 resource_pool_->ReleaseResource(resource); |
| 1033 return; | 1043 return; |
| 1034 } | 1044 } |
| 1035 | 1045 |
| 1036 resource_pool_->OnContentReplaced(resource->id(), tile->id()); | 1046 resource_pool_->OnContentReplaced(resource->id(), tile->id()); |
| 1037 ++flush_stats_.completed_count; | 1047 ++flush_stats_.completed_count; |
| 1038 | 1048 |
| 1039 draw_info.set_use_resource(); | 1049 draw_info.set_resource(resource); |
| 1040 draw_info.resource_ = resource; | |
| 1041 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); | 1050 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); |
| 1042 | 1051 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) { |
| 1043 DCHECK(draw_info.IsReadyToDraw()); | 1052 draw_info.set_is_resource_ready_for_draw(); |
| 1044 draw_info.set_was_ever_ready_to_draw(); | 1053 draw_info.set_was_ever_ready_to_draw(); |
| 1045 | 1054 client_->NotifyTileStateChanged(tile); |
| 1046 client_->NotifyTileStateChanged(tile); | 1055 } else { |
| 1056 pending_ready_for_draw_tiles_.push_back(tile); |
| 1057 } |
| 1047 } | 1058 } |
| 1048 | 1059 |
| 1049 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info, | 1060 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info, |
| 1050 int layer_id, | 1061 int layer_id, |
| 1051 int source_frame_number, | 1062 int source_frame_number, |
| 1052 int flags) { | 1063 int flags) { |
| 1053 // We need to have a tile task worker pool to do anything meaningful with | 1064 // We need to have a tile task worker pool to do anything meaningful with |
| 1054 // tiles. | 1065 // tiles. |
| 1055 DCHECK(tile_task_manager_); | 1066 DCHECK(tile_task_manager_); |
| 1056 ScopedTilePtr tile( | 1067 ScopedTilePtr tile( |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1082 Tile* tile = all_queue->Top().tile(); | 1093 Tile* tile = all_queue->Top().tile(); |
| 1083 DCHECK(!tile->required_for_activation() || | 1094 DCHECK(!tile->required_for_activation() || |
| 1084 tile->draw_info().IsReadyToDraw()); | 1095 tile->draw_info().IsReadyToDraw()); |
| 1085 } | 1096 } |
| 1086 #endif | 1097 #endif |
| 1087 return true; | 1098 return true; |
| 1088 } | 1099 } |
| 1089 | 1100 |
| 1090 bool TileManager::IsReadyToActivate() const { | 1101 bool TileManager::IsReadyToActivate() const { |
| 1091 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); | 1102 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); |
| 1092 return AreRequiredTilesReadyToDraw( | 1103 return !has_pending_ready_to_activate_resource_ && |
| 1093 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); | 1104 AreRequiredTilesReadyToDraw( |
| 1105 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); |
| 1094 } | 1106 } |
| 1095 | 1107 |
| 1096 bool TileManager::IsReadyToDraw() const { | 1108 bool TileManager::IsReadyToDraw() const { |
| 1097 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); | 1109 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); |
| 1098 return AreRequiredTilesReadyToDraw( | 1110 return !has_pending_ready_to_draw_resources_ && |
| 1099 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); | 1111 AreRequiredTilesReadyToDraw( |
| 1112 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); |
| 1100 } | 1113 } |
| 1101 | 1114 |
| 1102 void TileManager::CheckAndIssueSignals() { | 1115 void TileManager::CheckAndIssueSignals() { |
| 1103 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); | 1116 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); |
| 1104 tile_task_manager_->CheckForCompletedTasks(); | 1117 tile_task_manager_->CheckForCompletedTasks(); |
| 1105 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 1118 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 1106 | 1119 |
| 1120 CheckPendingReadyToDrawTiles(false /* issue_signals */); |
| 1121 |
| 1107 // Ready to activate. | 1122 // Ready to activate. |
| 1108 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { | 1123 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { |
| 1109 signals_.ready_to_activate = false; | 1124 signals_.ready_to_activate = false; |
| 1110 if (IsReadyToActivate()) { | 1125 if (IsReadyToActivate()) { |
| 1111 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), | 1126 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), |
| 1112 "TileManager::CheckAndIssueSignals - ready to activate"); | 1127 "TileManager::CheckAndIssueSignals - ready to activate"); |
| 1113 signals_.did_notify_ready_to_activate = true; | 1128 signals_.did_notify_ready_to_activate = true; |
| 1114 client_->NotifyReadyToActivate(); | 1129 client_->NotifyReadyToActivate(); |
| 1115 } | 1130 } |
| 1116 } | 1131 } |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1250 signals_.all_tile_tasks_completed); | 1265 signals_.all_tile_tasks_completed); |
| 1251 state->EndDictionary(); | 1266 state->EndDictionary(); |
| 1252 return std::move(state); | 1267 return std::move(state); |
| 1253 } | 1268 } |
| 1254 | 1269 |
| 1255 bool TileManager::UsePartialRaster() const { | 1270 bool TileManager::UsePartialRaster() const { |
| 1256 return use_partial_raster_ && | 1271 return use_partial_raster_ && |
| 1257 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); | 1272 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); |
| 1258 } | 1273 } |
| 1259 | 1274 |
| 1260 // Utility function that can be used to create a "Task set finished" task that | 1275 void TileManager::CheckPendingReadyToDrawTiles(bool issue_signals) { |
| 1276 // We are about to check all pending resources. We will re-set these to true |
| 1277 // if we encounter them. |
| 1278 has_pending_ready_to_draw_resources_ = false; |
| 1279 has_pending_ready_to_activate_resource_ = false; |
| 1280 |
| 1281 bool in_smoothness_mode = |
| 1282 global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY; |
| 1283 |
| 1284 ResourceProvider::ResourceIdArray required_for_activation_ids; |
| 1285 ResourceProvider::ResourceIdArray required_for_draw_ids; |
| 1286 for (auto it = pending_ready_for_draw_tiles_.begin(); |
| 1287 it != pending_ready_for_draw_tiles_.end();) { |
| 1288 Tile* tile = *it; |
| 1289 Resource* resource = tile->draw_info().resource_; |
| 1290 DCHECK(resource); |
| 1291 |
| 1292 if (!in_smoothness_mode || |
| 1293 raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) { |
| 1294 tile->draw_info().set_is_resource_ready_for_draw(); |
| 1295 tile->draw_info().set_was_ever_ready_to_draw(); |
| 1296 client_->NotifyTileStateChanged(tile); |
| 1297 it = pending_ready_for_draw_tiles_.erase(it); |
| 1298 continue; |
| 1299 } |
| 1300 |
| 1301 if (pending_tile_requirements_dirty_) { |
| 1302 tile->set_required_for_activation( |
| 1303 tile->tiling()->IsTileRequiredForActivation(tile)); |
| 1304 tile->set_required_for_draw(tile->tiling()->IsTileRequiredForDraw(tile)); |
| 1305 } |
| 1306 |
| 1307 if (tile->required_for_activation()) { |
| 1308 has_pending_ready_to_activate_resource_ = true; |
| 1309 required_for_activation_ids.push_back(resource->id()); |
| 1310 } |
| 1311 if (tile->required_for_draw()) { |
| 1312 has_pending_ready_to_draw_resources_ = true; |
| 1313 required_for_draw_ids.push_back(resource->id()); |
| 1314 } |
| 1315 |
| 1316 ++it; |
| 1317 } |
| 1318 |
| 1319 if (!required_for_activation_ids.empty()) { |
| 1320 pending_required_for_activation_callback_id_ = |
| 1321 raster_buffer_provider_->SetReadyToDrawCallback( |
| 1322 required_for_activation_ids, |
| 1323 base::Bind(&TileManager::ReadyToDrawCallback, |
| 1324 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr()), |
| 1325 pending_required_for_activation_callback_id_); |
| 1326 } |
| 1327 |
| 1328 if (!required_for_draw_ids.empty()) { |
| 1329 pending_required_for_activation_callback_id_ = |
| 1330 raster_buffer_provider_->SetReadyToDrawCallback( |
| 1331 required_for_draw_ids, |
| 1332 base::Bind(&TileManager::ReadyToDrawCallback, |
| 1333 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr()), |
| 1334 pending_required_for_activation_callback_id_); |
| 1335 } |
| 1336 |
| 1337 // Update our signals now that we know whether we have pending resources. |
| 1338 signals_.ready_to_activate = !has_pending_ready_to_activate_resource_; |
| 1339 signals_.ready_to_draw = !has_pending_ready_to_draw_resources_; |
| 1340 |
| 1341 if (issue_signals && (signals_.ready_to_activate || signals_.ready_to_draw)) |
| 1342 signals_check_notifier_.Schedule(); |
| 1343 |
| 1344 // We've just updated all pending tile requirements if necessary. |
| 1345 pending_tile_requirements_dirty_ = false; |
| 1346 } |
| 1347 |
| 1348 void TileManager::ReadyToDrawCallback(uint64_t callback_id) { |
| 1349 signals_check_notifier_.Schedule(); |
| 1350 } |
| 1351 |
| 1352 // Utility function that can be used to create a "Task set finished" task |
| 1353 // that |
| 1261 // posts |callback| to |task_runner| when run. | 1354 // posts |callback| to |task_runner| when run. |
| 1262 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( | 1355 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( |
| 1263 void (TileManager::*callback)()) { | 1356 void (TileManager::*callback)()) { |
| 1264 return make_scoped_refptr(new TaskSetFinishedTaskImpl( | 1357 return make_scoped_refptr(new TaskSetFinishedTaskImpl( |
| 1265 task_runner_, | 1358 task_runner_, |
| 1266 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); | 1359 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); |
| 1267 } | 1360 } |
| 1268 | 1361 |
| 1269 TileManager::MemoryUsage::MemoryUsage() | 1362 TileManager::MemoryUsage::MemoryUsage() |
| 1270 : memory_bytes_(0), resource_count_(0) {} | 1363 : memory_bytes_(0), resource_count_(0) {} |
| 1271 | 1364 |
| 1272 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, | 1365 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, |
| 1273 size_t resource_count) | 1366 size_t resource_count) |
| 1274 : memory_bytes_(static_cast<int64_t>(memory_bytes)), | 1367 : memory_bytes_(static_cast<int64_t>(memory_bytes)), |
| 1275 resource_count_(static_cast<int>(resource_count)) { | 1368 resource_count_(static_cast<int>(resource_count)) { |
| 1276 // MemoryUsage is constructed using size_ts, since it deals with memory and | 1369 // MemoryUsage is constructed using size_ts, since it deals with memory |
| 1277 // the inputs are typically size_t. However, during the course of usage (in | 1370 // and |
| 1278 // particular operator-=) can cause internal values to become negative. Thus, | 1371 // the inputs are typically size_t. However, during the course of usage |
| 1372 // (in |
| 1373 // particular operator-=) can cause internal values to become negative. |
| 1374 // Thus, |
| 1279 // member variables are signed. | 1375 // member variables are signed. |
| 1280 DCHECK_LE(memory_bytes, | 1376 DCHECK_LE(memory_bytes, |
| 1281 static_cast<size_t>(std::numeric_limits<int64_t>::max())); | 1377 static_cast<size_t>(std::numeric_limits<int64_t>::max())); |
| 1282 DCHECK_LE(resource_count, | 1378 DCHECK_LE(resource_count, |
| 1283 static_cast<size_t>(std::numeric_limits<int>::max())); | 1379 static_cast<size_t>(std::numeric_limits<int>::max())); |
| 1284 } | 1380 } |
| 1285 | 1381 |
| 1286 // static | 1382 // static |
| 1287 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( | 1383 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( |
| 1288 const gfx::Size& size, | 1384 const gfx::Size& size, |
| 1289 ResourceFormat format) { | 1385 ResourceFormat format) { |
| 1290 // We can use UncheckedSizeInBytes here since this is used with a tile | 1386 // We can use UncheckedSizeInBytes here since this is used with a tile |
| 1291 // size which is determined by the compositor (it's at most max texture size). | 1387 // size which is determined by the compositor (it's at most max texture |
| 1388 // size). |
| 1292 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), | 1389 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), |
| 1293 1); | 1390 1); |
| 1294 } | 1391 } |
| 1295 | 1392 |
| 1296 // static | 1393 // static |
| 1297 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { | 1394 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { |
| 1298 const TileDrawInfo& draw_info = tile->draw_info(); | 1395 const TileDrawInfo& draw_info = tile->draw_info(); |
| 1299 if (draw_info.resource_) { | 1396 if (draw_info.resource_) { |
| 1300 return MemoryUsage::FromConfig(draw_info.resource_->size(), | 1397 return MemoryUsage::FromConfig(draw_info.resource_->size(), |
| 1301 draw_info.resource_->format()); | 1398 draw_info.resource_->format()); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1341 all_tile_tasks_completed = false; | 1438 all_tile_tasks_completed = false; |
| 1342 did_notify_all_tile_tasks_completed = false; | 1439 did_notify_all_tile_tasks_completed = false; |
| 1343 } | 1440 } |
| 1344 | 1441 |
| 1345 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; | 1442 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; |
| 1346 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( | 1443 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( |
| 1347 PrioritizedWorkToSchedule&& other) = default; | 1444 PrioritizedWorkToSchedule&& other) = default; |
| 1348 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; | 1445 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; |
| 1349 | 1446 |
| 1350 } // namespace cc | 1447 } // namespace cc |
| OLD | NEW |