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

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

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

Powered by Google App Engine
This is Rietveld 408576698