Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(222)

Side by Side Diff: cc/tiles/tile_manager.cc

Issue 2017453004: cc: Send notification of tasks completion directly without scheduling. Base URL: https://chromium.googlesource.com/chromium/src.git@worker_origin_split_4
Patch Set: feedback Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 : client_(client), 320 : client_(client),
321 task_runner_(std::move(task_runner)), 321 task_runner_(std::move(task_runner)),
322 resource_pool_(nullptr), 322 resource_pool_(nullptr),
323 tile_task_manager_(nullptr), 323 tile_task_manager_(nullptr),
324 scheduled_raster_task_limit_(scheduled_raster_task_limit), 324 scheduled_raster_task_limit_(scheduled_raster_task_limit),
325 use_partial_raster_(use_partial_raster), 325 use_partial_raster_(use_partial_raster),
326 use_gpu_rasterization_(false), 326 use_gpu_rasterization_(false),
327 all_tiles_that_need_to_be_rasterized_are_scheduled_(true), 327 all_tiles_that_need_to_be_rasterized_are_scheduled_(true),
328 did_check_for_completed_tasks_since_last_schedule_tasks_(true), 328 did_check_for_completed_tasks_since_last_schedule_tasks_(true),
329 did_oom_on_last_assign_(false), 329 did_oom_on_last_assign_(false),
330 more_tiles_need_prepare_check_notifier_(
331 task_runner_.get(),
332 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared,
333 base::Unretained(this))),
334 signals_check_notifier_(task_runner_.get(),
335 base::Bind(&TileManager::CheckAndIssueSignals,
336 base::Unretained(this))),
337 has_scheduled_tile_tasks_(false), 330 has_scheduled_tile_tasks_(false),
338 prepare_tiles_count_(0u), 331 prepare_tiles_count_(0u),
339 next_tile_id_(0u), 332 next_tile_id_(0u),
340 task_set_finished_weak_ptr_factory_(this) {} 333 task_set_finished_weak_ptr_factory_(this) {}
341 334
342 TileManager::~TileManager() { 335 TileManager::~TileManager() {
343 FinishTasksAndCleanUp(); 336 FinishTasksAndCleanUp();
344 } 337 }
345 338
346 void TileManager::FinishTasksAndCleanUp() { 339 void TileManager::FinishTasksAndCleanUp() {
(...skipping 10 matching lines...) Expand all
357 // |orphan_tasks_|. 350 // |orphan_tasks_|.
358 orphan_tasks_.clear(); 351 orphan_tasks_.clear();
359 352
360 tile_task_manager_->CheckForCompletedTasks(); 353 tile_task_manager_->CheckForCompletedTasks();
361 354
362 FreeResourcesForReleasedTiles(); 355 FreeResourcesForReleasedTiles();
363 CleanUpReleasedTiles(); 356 CleanUpReleasedTiles();
364 357
365 tile_task_manager_ = nullptr; 358 tile_task_manager_ = nullptr;
366 resource_pool_ = nullptr; 359 resource_pool_ = nullptr;
367 more_tiles_need_prepare_check_notifier_.Cancel();
368 signals_check_notifier_.Cancel();
369 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 360 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
370 } 361 }
371 362
372 void TileManager::SetResources(ResourcePool* resource_pool, 363 void TileManager::SetResources(ResourcePool* resource_pool,
373 ImageDecodeController* image_decode_controller, 364 ImageDecodeController* image_decode_controller,
374 TileTaskManager* tile_task_manager, 365 TileTaskManager* tile_task_manager,
375 size_t scheduled_raster_task_limit, 366 size_t scheduled_raster_task_limit,
376 bool use_gpu_rasterization) { 367 bool use_gpu_rasterization) {
377 DCHECK(!tile_task_manager_); 368 DCHECK(!tile_task_manager_);
378 DCHECK(tile_task_manager); 369 DCHECK(tile_task_manager);
(...skipping 24 matching lines...) Expand all
403 394
404 DCHECK(!tile->draw_info().has_resource()); 395 DCHECK(!tile->draw_info().has_resource());
405 DCHECK(tiles_.find(tile->id()) != tiles_.end()); 396 DCHECK(tiles_.find(tile->id()) != tiles_.end());
406 tiles_.erase(tile->id()); 397 tiles_.erase(tile->id());
407 398
408 delete tile; 399 delete tile;
409 } 400 }
410 released_tiles_.swap(tiles_to_retain); 401 released_tiles_.swap(tiles_to_retain);
411 } 402 }
412 403
413 void TileManager::DidFinishRunningTileTasksRequiredForActivation() { 404 void TileManager::DidFinishRunningTileTasksRequiredForActivation(
405 uint64_t source_prepare_tiles_id) {
414 TRACE_EVENT0("cc", 406 TRACE_EVENT0("cc",
415 "TileManager::DidFinishRunningTileTasksRequiredForActivation"); 407 "TileManager::DidFinishRunningTileTasksRequiredForActivation");
416 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", 408
417 ScheduledTasksStateAsValue()); 409 // Check if there is another request to PrepareTiles().
418 signals_.ready_to_activate = true; 410 if (prepare_tiles_count_ != source_prepare_tiles_id)
419 signals_check_notifier_.Schedule(); 411 return;
412
413 CheckAndNotifyReadyToActivate();
420 } 414 }
421 415
422 void TileManager::DidFinishRunningTileTasksRequiredForDraw() { 416 void TileManager::DidFinishRunningTileTasksRequiredForDraw(
417 uint64_t source_prepare_tiles_id) {
423 TRACE_EVENT0("cc", "TileManager::DidFinishRunningTileTasksRequiredForDraw"); 418 TRACE_EVENT0("cc", "TileManager::DidFinishRunningTileTasksRequiredForDraw");
424 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", 419
425 ScheduledTasksStateAsValue()); 420 // Check if there is another request to PrepareTiles().
426 signals_.ready_to_draw = true; 421 if (prepare_tiles_count_ != source_prepare_tiles_id)
427 signals_check_notifier_.Schedule(); 422 return;
423
424 CheckAndNotifyReadyToDraw();
428 } 425 }
429 426
430 void TileManager::DidFinishRunningAllTileTasks() { 427 void TileManager::DidFinishRunningAllTileTasks(
428 uint64_t source_prepare_tiles_id) {
431 TRACE_EVENT0("cc", "TileManager::DidFinishRunningAllTileTasks"); 429 TRACE_EVENT0("cc", "TileManager::DidFinishRunningAllTileTasks");
432 TRACE_EVENT_ASYNC_END0("cc", "ScheduledTasks", this); 430
433 DCHECK(resource_pool_); 431 // Check if there is another request to PrepareTiles().
434 DCHECK(tile_task_manager_); 432 if (prepare_tiles_count_ != source_prepare_tiles_id)
433 return;
435 434
436 has_scheduled_tile_tasks_ = false; 435 has_scheduled_tile_tasks_ = false;
437 436
437 DCHECK(resource_pool_);
438
438 bool memory_usage_above_limit = resource_pool_->memory_usage_bytes() > 439 bool memory_usage_above_limit = resource_pool_->memory_usage_bytes() >
439 global_state_.soft_memory_limit_in_bytes; 440 global_state_.soft_memory_limit_in_bytes;
440 441
441 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && 442 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ &&
442 !memory_usage_above_limit) { 443 !memory_usage_above_limit) {
443 // TODO(ericrk): We should find a better way to safely handle re-entrant 444 CheckAndNotifyAllTileTasksCompleted();
444 // notifications than always having to schedule a new task.
445 // http://crbug.com/498439
446 signals_.all_tile_tasks_completed = true;
447 signals_check_notifier_.Schedule();
448 return; 445 return;
449 } 446 }
450 447
451 more_tiles_need_prepare_check_notifier_.Schedule(); 448 CheckIfMoreTilesNeedToBePrepared();
452 } 449 }
453 450
454 bool TileManager::PrepareTiles( 451 bool TileManager::PrepareTiles(
455 const GlobalStateThatImpactsTilePriority& state) { 452 const GlobalStateThatImpactsTilePriority& state) {
456 ++prepare_tiles_count_; 453 ++prepare_tiles_count_;
457 454
458 TRACE_EVENT1("cc", "TileManager::PrepareTiles", "prepare_tiles_id", 455 TRACE_EVENT1("cc", "TileManager::PrepareTiles", "prepare_tiles_id",
459 prepare_tiles_count_); 456 prepare_tiles_count_);
460 457
461 if (!tile_task_manager_) { 458 if (!tile_task_manager_) {
462 TRACE_EVENT_INSTANT0("cc", "PrepareTiles aborted", 459 TRACE_EVENT_INSTANT0("cc", "PrepareTiles aborted",
463 TRACE_EVENT_SCOPE_THREAD); 460 TRACE_EVENT_SCOPE_THREAD);
464 return false; 461 return false;
465 } 462 }
466 463
467 signals_.reset();
468 global_state_ = state; 464 global_state_ = state;
469 465
470 // We need to call CheckForCompletedTasks() once in-between each call 466 // We need to call CheckForCompletedTasks() once in-between each call
471 // to ScheduleTasks() to prevent canceled tasks from being scheduled. 467 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
472 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { 468 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
473 tile_task_manager_->CheckForCompletedTasks(); 469 tile_task_manager_->CheckForCompletedTasks();
474 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 470 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
475 } 471 }
476 472
477 FreeResourcesForReleasedTiles(); 473 FreeResourcesForReleasedTiles();
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 tile->draw_info().set_solid_color(color); 647 tile->draw_info().set_solid_color(color);
652 tile->draw_info().set_was_ever_ready_to_draw(); 648 tile->draw_info().set_was_ever_ready_to_draw();
653 if (!tile_is_needed_now) 649 if (!tile_is_needed_now)
654 tile->draw_info().set_was_a_prepaint_tile(); 650 tile->draw_info().set_was_a_prepaint_tile();
655 client_->NotifyTileStateChanged(tile); 651 client_->NotifyTileStateChanged(tile);
656 continue; 652 continue;
657 } 653 }
658 } 654 }
659 655
660 // We won't be able to schedule this tile, so break out early. 656 // We won't be able to schedule this tile, so break out early.
661 if (tiles_that_need_to_be_rasterized->size() >= 657 if (tiles_that_need_to_be_rasterized->size() >
prashant.n 2016/05/27 14:29:22 If size of tiles_that_need_to_be_rasterized = 1 an
662 scheduled_raster_task_limit) { 658 scheduled_raster_task_limit) {
663 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; 659 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
664 break; 660 break;
665 } 661 }
666 662
667 tile->scheduled_priority_ = schedule_priority++; 663 tile->scheduled_priority_ = schedule_priority++;
668 664
669 DCHECK(tile->draw_info().mode() == TileDrawInfo::OOM_MODE || 665 DCHECK(tile->draw_info().mode() == TileDrawInfo::OOM_MODE ||
670 !tile->draw_info().IsReadyToDraw()); 666 !tile->draw_info().IsReadyToDraw());
671 667
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 // been called. 870 // been called.
875 orphan_tasks_.clear(); 871 orphan_tasks_.clear();
876 872
877 // It's also now safe to replace our *_done_task_ tasks. 873 // It's also now safe to replace our *_done_task_ tasks.
878 required_for_activation_done_task_ = 874 required_for_activation_done_task_ =
879 std::move(required_for_activation_done_task); 875 std::move(required_for_activation_done_task);
880 required_for_draw_done_task_ = std::move(required_for_draw_done_task); 876 required_for_draw_done_task_ = std::move(required_for_draw_done_task);
881 all_done_task_ = std::move(all_done_task); 877 all_done_task_ = std::move(all_done_task);
882 878
883 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 879 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
884
885 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
886 ScheduledTasksStateAsValue());
887 } 880 }
888 881
889 scoped_refptr<TileTask> TileManager::CreateRasterTask( 882 scoped_refptr<TileTask> TileManager::CreateRasterTask(
890 const PrioritizedTile& prioritized_tile) { 883 const PrioritizedTile& prioritized_tile) {
891 Tile* tile = prioritized_tile.tile(); 884 Tile* tile = prioritized_tile.tile();
892 885
893 // Get the resource. 886 // Get the resource.
894 uint64_t resource_content_id = 0; 887 uint64_t resource_content_id = 0;
895 Resource* resource = nullptr; 888 Resource* resource = nullptr;
896 if (use_partial_raster_ && tile->invalidated_id()) { 889 if (use_partial_raster_ && tile->invalidated_id()) {
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 return AreRequiredTilesReadyToDraw( 1037 return AreRequiredTilesReadyToDraw(
1045 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); 1038 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION);
1046 } 1039 }
1047 1040
1048 bool TileManager::IsReadyToDraw() const { 1041 bool TileManager::IsReadyToDraw() const {
1049 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); 1042 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw");
1050 return AreRequiredTilesReadyToDraw( 1043 return AreRequiredTilesReadyToDraw(
1051 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); 1044 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW);
1052 } 1045 }
1053 1046
1054 void TileManager::CheckAndIssueSignals() { 1047 void TileManager::CheckAndNotifyReadyToActivate() {
1055 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); 1048 TRACE_EVENT0("cc", "TileManager::CheckAndNotifyReadyToActivate");
1049 DCHECK(tile_task_manager_);
1050
1056 tile_task_manager_->CheckForCompletedTasks(); 1051 tile_task_manager_->CheckForCompletedTasks();
1057 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 1052 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
1058 1053
1059 // Ready to activate. 1054 // Ready to activate.
1060 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { 1055 if (IsReadyToActivate()) {
1061 signals_.ready_to_activate = false; 1056 TRACE_EVENT0(
1062 if (IsReadyToActivate()) { 1057 "disabled-by-default-cc.debug",
1063 TRACE_EVENT0("disabled-by-default-cc.debug", 1058 "TileManager::CheckAndNotifyReadyToActivate - ready to activate");
1064 "TileManager::CheckAndIssueSignals - ready to activate"); 1059 client_->NotifyReadyToActivate();
1065 signals_.did_notify_ready_to_activate = true;
1066 client_->NotifyReadyToActivate();
1067 }
1068 } 1060 }
1061 }
1062 void TileManager::CheckAndNotifyReadyToDraw() {
1063 TRACE_EVENT0("cc", "TileManager::CheckAndNotifyReadyToDraw");
1064
1065 DCHECK(tile_task_manager_);
1066
1067 tile_task_manager_->CheckForCompletedTasks();
1068 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
1069 1069
1070 // Ready to draw. 1070 // Ready to draw.
1071 if (signals_.ready_to_draw && !signals_.did_notify_ready_to_draw) { 1071 if (IsReadyToDraw()) {
1072 signals_.ready_to_draw = false; 1072 TRACE_EVENT0("disabled-by-default-cc.debug",
1073 if (IsReadyToDraw()) { 1073 "TileManager::CheckAndNotifyReadyToDraw - ready to draw");
1074 TRACE_EVENT0("disabled-by-default-cc.debug", 1074 client_->NotifyReadyToDraw();
1075 "TileManager::CheckAndIssueSignals - ready to draw");
1076 signals_.did_notify_ready_to_draw = true;
1077 client_->NotifyReadyToDraw();
1078 }
1079 } 1075 }
1076 }
1077
1078 void TileManager::CheckAndNotifyAllTileTasksCompleted() {
1079 TRACE_EVENT0("cc", "TileManager::CheckAndNotifyAllTileTasksCompleted");
1080
1081 DCHECK(tile_task_manager_);
1082 tile_task_manager_->CheckForCompletedTasks();
1083 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
1080 1084
1081 // All tile tasks completed. 1085 // All tile tasks completed.
1082 if (signals_.all_tile_tasks_completed && 1086 if (!has_scheduled_tile_tasks_) {
1083 !signals_.did_notify_all_tile_tasks_completed) { 1087 TRACE_EVENT0("disabled-by-default-cc.debug",
1084 signals_.all_tile_tasks_completed = false; 1088 "TileManager::CheckAndNotifyAllTileTasksCompleted - all tile "
1085 if (!has_scheduled_tile_tasks_) { 1089 "tasks completed");
1086 TRACE_EVENT0( 1090 client_->NotifyAllTileTasksCompleted();
1087 "disabled-by-default-cc.debug",
1088 "TileManager::CheckAndIssueSignals - all tile tasks completed");
1089 signals_.did_notify_all_tile_tasks_completed = true;
1090 client_->NotifyAllTileTasksCompleted();
1091 }
1092 } 1091 }
1093 } 1092 }
1094 1093
1095 void TileManager::CheckIfMoreTilesNeedToBePrepared() { 1094 void TileManager::CheckIfMoreTilesNeedToBePrepared() {
1095 DCHECK(tile_task_manager_);
1096
1096 tile_task_manager_->CheckForCompletedTasks(); 1097 tile_task_manager_->CheckForCompletedTasks();
1097 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 1098 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
1098 1099
1099 // When OOM, keep re-assigning memory until we reach a steady state 1100 // When OOM, keep re-assigning memory until we reach a steady state
1100 // where top-priority tiles are initialized. 1101 // where top-priority tiles are initialized.
1101 PrioritizedTileVector tiles_that_need_to_be_rasterized; 1102 PrioritizedTileVector tiles_that_need_to_be_rasterized;
1102 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( 1103 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue(
1103 client_->BuildRasterQueue(global_state_.tree_priority, 1104 client_->BuildRasterQueue(global_state_.tree_priority,
1104 RasterTilePriorityQueue::Type::ALL)); 1105 RasterTilePriorityQueue::Type::ALL));
1105 AssignGpuMemoryToTiles(raster_priority_queue.get(), 1106 AssignGpuMemoryToTiles(raster_priority_queue.get(),
(...skipping 11 matching lines...) Expand all
1117 if (!tiles_that_need_to_be_rasterized.empty()) { 1118 if (!tiles_that_need_to_be_rasterized.empty()) {
1118 ScheduleTasks(tiles_that_need_to_be_rasterized); 1119 ScheduleTasks(tiles_that_need_to_be_rasterized);
1119 return; 1120 return;
1120 } 1121 }
1121 1122
1122 FreeResourcesForReleasedTiles(); 1123 FreeResourcesForReleasedTiles();
1123 1124
1124 resource_pool_->ReduceResourceUsage(); 1125 resource_pool_->ReduceResourceUsage();
1125 image_decode_controller_->ReduceCacheUsage(); 1126 image_decode_controller_->ReduceCacheUsage();
1126 1127
1127 signals_.all_tile_tasks_completed = true;
1128 signals_check_notifier_.Schedule();
1129
1130 // We don't reserve memory for required-for-activation tiles during 1128 // We don't reserve memory for required-for-activation tiles during
1131 // accelerated gestures, so we just postpone activation when we don't 1129 // accelerated gestures, so we just postpone activation when we don't
1132 // have these tiles, and activate after the accelerated gesture. 1130 // have these tiles, and activate after the accelerated gesture.
1133 // Likewise if we don't allow any tiles (as is the case when we're 1131 // Likewise if we don't allow any tiles (as is the case when we're
1134 // invisible), if we have tiles that aren't ready, then we shouldn't 1132 // invisible), if we have tiles that aren't ready, then we shouldn't
1135 // activate as activation can cause checkerboards. 1133 // activate as activation can cause checkerboards.
1136 bool wait_for_all_required_tiles = 1134 bool wait_for_all_required_tiles =
1137 global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY || 1135 global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY ||
1138 global_state_.memory_limit_policy == ALLOW_NOTHING; 1136 global_state_.memory_limit_policy == ALLOW_NOTHING;
1139 1137
1140 // If we have tiles left to raster for activation, and we don't allow 1138 // If we have tiles left to raster for activation, and we don't allow
1141 // activating without them, then skip activation and return early. 1139 // activating without them, then skip activation and return early.
1142 if (wait_for_all_required_tiles) 1140 if (wait_for_all_required_tiles)
1143 return; 1141 return;
1144 1142
1145 // Mark any required tiles that have not been been assigned memory after 1143 // Mark any required tiles that have not been been assigned memory after
1146 // reaching a steady memory state as OOM. This ensures that we activate/draw 1144 // reaching a steady memory state as OOM. This ensures that we activate/draw
1147 // even when OOM. Note that we can't reuse the queue we used for 1145 // even when OOM. Note that we can't reuse the queue we used for
1148 // AssignGpuMemoryToTiles, since the AssignGpuMemoryToTiles call could have 1146 // AssignGpuMemoryToTiles, since the AssignGpuMemoryToTiles call could have
1149 // evicted some tiles that would not be picked up by the old raster queue. 1147 // evicted some tiles that would not be picked up by the old raster queue.
1150 bool need_to_signal_activate = MarkTilesOutOfMemory(client_->BuildRasterQueue( 1148 bool need_to_signal_activate = MarkTilesOutOfMemory(client_->BuildRasterQueue(
1151 global_state_.tree_priority, 1149 global_state_.tree_priority,
1152 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION)); 1150 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION));
1153 bool need_to_signal_draw = MarkTilesOutOfMemory(client_->BuildRasterQueue( 1151 bool need_to_signal_draw = MarkTilesOutOfMemory(client_->BuildRasterQueue(
1154 global_state_.tree_priority, 1152 global_state_.tree_priority,
1155 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW)); 1153 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW));
1156 1154
1157 DCHECK(IsReadyToActivate()); 1155 if (need_to_signal_activate)
1158 DCHECK(IsReadyToDraw()); 1156 CheckAndNotifyReadyToActivate();
prashant.n 2016/05/27 14:29:22 I'll remove checking of completed tasks to common
1159 signals_.ready_to_activate = need_to_signal_activate; 1157
1160 signals_.ready_to_draw = need_to_signal_draw; 1158 if (need_to_signal_draw)
1161 // TODO(ericrk): Investigate why we need to schedule this (not just call it 1159 CheckAndNotifyReadyToDraw();
1162 // inline). http://crbug.com/498439 1160
1163 signals_check_notifier_.Schedule(); 1161 CheckAndNotifyAllTileTasksCompleted();
1164 } 1162 }
1165 1163
1166 bool TileManager::MarkTilesOutOfMemory( 1164 bool TileManager::MarkTilesOutOfMemory(
1167 std::unique_ptr<RasterTilePriorityQueue> queue) const { 1165 std::unique_ptr<RasterTilePriorityQueue> queue) const {
1168 // Mark required tiles as OOM so that we can activate/draw without them. 1166 // Mark required tiles as OOM so that we can activate/draw without them.
1169 if (queue->IsEmpty()) 1167 if (queue->IsEmpty())
1170 return false; 1168 return false;
1171 1169
1172 for (; !queue->IsEmpty(); queue->Pop()) { 1170 for (; !queue->IsEmpty(); queue->Pop()) {
1173 Tile* tile = queue->Top().tile(); 1171 Tile* tile = queue->Top().tile();
1174 if (tile->draw_info().IsReadyToDraw()) 1172 if (tile->draw_info().IsReadyToDraw())
1175 continue; 1173 continue;
1176 tile->draw_info().set_oom(); 1174 tile->draw_info().set_oom();
1177 client_->NotifyTileStateChanged(tile); 1175 client_->NotifyTileStateChanged(tile);
1178 } 1176 }
1179 return true; 1177 return true;
1180 } 1178 }
1181 1179
1182 ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const { 1180 ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const {
1183 return tile_task_manager_->GetRasterBufferProvider()->GetResourceFormat( 1181 return tile_task_manager_->GetRasterBufferProvider()->GetResourceFormat(
1184 !tile->is_opaque()); 1182 !tile->is_opaque());
1185 } 1183 }
1186 1184
1187 bool TileManager::DetermineResourceRequiresSwizzle(const Tile* tile) const { 1185 bool TileManager::DetermineResourceRequiresSwizzle(const Tile* tile) const {
1188 return tile_task_manager_->GetRasterBufferProvider() 1186 return tile_task_manager_->GetRasterBufferProvider()
1189 ->GetResourceRequiresSwizzle(!tile->is_opaque()); 1187 ->GetResourceRequiresSwizzle(!tile->is_opaque());
1190 } 1188 }
1191 1189
1192 std::unique_ptr<base::trace_event::ConvertableToTraceFormat>
1193 TileManager::ScheduledTasksStateAsValue() const {
1194 std::unique_ptr<base::trace_event::TracedValue> state(
1195 new base::trace_event::TracedValue());
1196 state->BeginDictionary("tasks_pending");
1197 state->SetBoolean("ready_to_activate", signals_.ready_to_activate);
1198 state->SetBoolean("ready_to_draw", signals_.ready_to_draw);
1199 state->SetBoolean("all_tile_tasks_completed",
1200 signals_.all_tile_tasks_completed);
1201 state->EndDictionary();
1202 return std::move(state);
1203 }
1204
1205 // Utility function that can be used to create a "Task set finished" task that 1190 // Utility function that can be used to create a "Task set finished" task that
1206 // posts |callback| to |task_runner| when run. 1191 // posts |callback| to |task_runner| when run.
1207 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( 1192 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask(
1208 void (TileManager::*callback)()) { 1193 void (TileManager::*callback)(uint64_t source_prepare_tiles_id)) {
1209 return make_scoped_refptr(new TaskSetFinishedTaskImpl( 1194 return make_scoped_refptr(new TaskSetFinishedTaskImpl(
1210 task_runner_.get(), 1195 task_runner_.get(),
1211 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); 1196 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr(),
1197 prepare_tiles_count_)));
1212 } 1198 }
1213 1199
1214 TileManager::MemoryUsage::MemoryUsage() 1200 TileManager::MemoryUsage::MemoryUsage()
1215 : memory_bytes_(0), resource_count_(0) {} 1201 : memory_bytes_(0), resource_count_(0) {}
1216 1202
1217 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, 1203 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes,
1218 size_t resource_count) 1204 size_t resource_count)
1219 : memory_bytes_(static_cast<int64_t>(memory_bytes)), 1205 : memory_bytes_(static_cast<int64_t>(memory_bytes)),
1220 resource_count_(static_cast<int>(resource_count)) { 1206 resource_count_(static_cast<int>(resource_count)) {
1221 // MemoryUsage is constructed using size_ts, since it deals with memory and 1207 // MemoryUsage is constructed using size_ts, since it deals with memory and
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1267 MemoryUsage result = *this; 1253 MemoryUsage result = *this;
1268 result -= other; 1254 result -= other;
1269 return result; 1255 return result;
1270 } 1256 }
1271 1257
1272 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { 1258 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const {
1273 return memory_bytes_ > limit.memory_bytes_ || 1259 return memory_bytes_ > limit.memory_bytes_ ||
1274 resource_count_ > limit.resource_count_; 1260 resource_count_ > limit.resource_count_;
1275 } 1261 }
1276 1262
1277 TileManager::Signals::Signals() {
1278 reset();
1279 }
1280
1281 void TileManager::Signals::reset() {
1282 ready_to_activate = false;
1283 did_notify_ready_to_activate = false;
1284 ready_to_draw = false;
1285 did_notify_ready_to_draw = false;
1286 all_tile_tasks_completed = false;
1287 did_notify_all_tile_tasks_completed = false;
1288 }
1289
1290 } // namespace cc 1263 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698