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

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

Issue 2555743004: Delay activation/draw on GPU tile work completion (Closed)
Patch Set: Fix tile release logic. 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 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 raster_buffer_provider_ = nullptr; 399 raster_buffer_provider_ = nullptr;
398 400
399 image_controller_.SetImageDecodeCache(nullptr); 401 image_controller_.SetImageDecodeCache(nullptr);
400 locked_image_tasks_.clear(); 402 locked_image_tasks_.clear();
401 } 403 }
402 404
403 void TileManager::SetResources(ResourcePool* resource_pool, 405 void TileManager::SetResources(ResourcePool* resource_pool,
404 ImageDecodeCache* image_decode_cache, 406 ImageDecodeCache* image_decode_cache,
405 TaskGraphRunner* task_graph_runner, 407 TaskGraphRunner* task_graph_runner,
406 RasterBufferProvider* raster_buffer_provider, 408 RasterBufferProvider* raster_buffer_provider,
407 size_t scheduled_raster_task_limit, 409 size_t scheduled_raster_task_limit,
408 bool use_gpu_rasterization) { 410 bool use_gpu_rasterization) {
409 DCHECK(!tile_task_manager_); 411 DCHECK(!tile_task_manager_);
410 DCHECK(task_graph_runner); 412 DCHECK(task_graph_runner);
411 413
412 use_gpu_rasterization_ = use_gpu_rasterization; 414 use_gpu_rasterization_ = use_gpu_rasterization;
413 scheduled_raster_task_limit_ = scheduled_raster_task_limit; 415 scheduled_raster_task_limit_ = scheduled_raster_task_limit;
414 resource_pool_ = resource_pool; 416 resource_pool_ = resource_pool;
415 image_controller_.SetImageDecodeCache(image_decode_cache); 417 image_controller_.SetImageDecodeCache(image_decode_cache);
416 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner); 418 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner);
417 raster_buffer_provider_ = raster_buffer_provider; 419 raster_buffer_provider_ = raster_buffer_provider;
418 } 420 }
419 421
420 void TileManager::Release(Tile* tile) { 422 void TileManager::Release(Tile* tile) {
421 released_tiles_.push_back(tile); 423 released_tiles_.push_back(tile);
424 // The |tile|'s owning PictureLayerTiling has released ownership and turned
425 // the
426 // |tile| over to TileManager for deletion.
427 tile->set_tiling(nullptr);
422 } 428 }
423 429
424 void TileManager::FreeResourcesForReleasedTiles() { 430 void TileManager::FreeResourcesForReleasedTiles() {
425 for (auto* tile : released_tiles_) 431 for (auto* tile : released_tiles_)
426 FreeResourcesForTile(tile); 432 FreeResourcesForTile(tile);
427 } 433 }
428 434
429 void TileManager::CleanUpReleasedTiles() { 435 void TileManager::CleanUpReleasedTiles() {
430 std::vector<Tile*> tiles_to_retain; 436 std::vector<Tile*> tiles_to_retain;
431 for (auto* tile : released_tiles_) { 437 for (auto* tile : released_tiles_) {
432 if (tile->HasRasterTask()) { 438 if (tile->HasRasterTask()) {
433 tiles_to_retain.push_back(tile); 439 tiles_to_retain.push_back(tile);
434 continue; 440 continue;
435 } 441 }
436 442
437 DCHECK(!tile->draw_info().has_resource()); 443 DCHECK(!tile->draw_info().has_resource());
438 DCHECK(tiles_.find(tile->id()) != tiles_.end()); 444 DCHECK(tiles_.find(tile->id()) != tiles_.end());
439 tiles_.erase(tile->id()); 445 tiles_.erase(tile->id());
446 pending_ready_for_draw_tiles_.erase(tile);
440 447
441 delete tile; 448 delete tile;
442 } 449 }
443 released_tiles_.swap(tiles_to_retain); 450 released_tiles_.swap(tiles_to_retain);
444 } 451 }
445 452
446 void TileManager::DidFinishRunningTileTasksRequiredForActivation() { 453 void TileManager::DidFinishRunningTileTasksRequiredForActivation() {
447 TRACE_EVENT0("cc", 454 TRACE_EVENT0("cc",
448 "TileManager::DidFinishRunningTileTasksRequiredForActivation"); 455 "TileManager::DidFinishRunningTileTasksRequiredForActivation");
449 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", 456 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 // We need to call CheckForCompletedTasks() once in-between each call 513 // We need to call CheckForCompletedTasks() once in-between each call
507 // to ScheduleTasks() to prevent canceled tasks from being scheduled. 514 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
508 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { 515 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
509 tile_task_manager_->CheckForCompletedTasks(); 516 tile_task_manager_->CheckForCompletedTasks();
510 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 517 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
511 } 518 }
512 519
513 FreeResourcesForReleasedTiles(); 520 FreeResourcesForReleasedTiles();
514 CleanUpReleasedTiles(); 521 CleanUpReleasedTiles();
515 522
523 // The required for activate/draw status of tiles may have changed any time
524 // PrepareTiles is called.
525 pending_tile_requirements_dirty_ = true;
526
516 PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles(); 527 PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles();
517 528
518 // Inform the client that will likely require a draw if the highest priority 529 // Inform the client that will likely require a draw if the highest priority
519 // tile that will be rasterized is required for draw. 530 // tile that will be rasterized is required for draw.
520 client_->SetIsLikelyToRequireADraw( 531 client_->SetIsLikelyToRequireADraw(
521 !prioritized_work.tiles_to_raster.empty() && 532 !prioritized_work.tiles_to_raster.empty() &&
522 prioritized_work.tiles_to_raster.front().tile()->required_for_draw()); 533 prioritized_work.tiles_to_raster.front().tile()->required_for_draw());
523 534
524 // Schedule tile tasks. 535 // Schedule tile tasks.
525 ScheduleTasks(prioritized_work); 536 ScheduleTasks(prioritized_work);
526 537
527 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, 538 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD,
528 "state", BasicStateAsValue()); 539 "state", BasicStateAsValue());
529 return true; 540 return true;
530 } 541 }
531 542
532 void TileManager::Flush() { 543 void TileManager::Flush() {
533 TRACE_EVENT0("cc", "TileManager::Flush"); 544 TRACE_EVENT0("cc", "TileManager::Flush");
534 545
535 if (!tile_task_manager_) { 546 if (!tile_task_manager_) {
536 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); 547 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD);
537 return; 548 return;
538 } 549 }
539 550
540 tile_task_manager_->CheckForCompletedTasks(); 551 tile_task_manager_->CheckForCompletedTasks();
541 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 552 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
553 CheckPendingReadyToDrawTiles(true /* issue_signals */);
542 554
543 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", 555 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats",
544 RasterTaskCompletionStatsAsValue(flush_stats_)); 556 RasterTaskCompletionStatsAsValue(flush_stats_));
545 flush_stats_ = RasterTaskCompletionStats(); 557 flush_stats_ = RasterTaskCompletionStats();
546 } 558 }
547 559
548 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 560 std::unique_ptr<base::trace_event::ConvertableToTraceFormat>
549 TileManager::BasicStateAsValue() const { 561 TileManager::BasicStateAsValue() const {
550 std::unique_ptr<base::trace_event::TracedValue> value( 562 std::unique_ptr<base::trace_event::TracedValue> value(
551 new base::trace_event::TracedValue()); 563 new base::trace_event::TracedValue());
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 // or drop the tile for scheduling and raster. 687 // or drop the tile for scheduling and raster.
676 // TODO(sohanjg): Check if we could use a shared analysis 688 // TODO(sohanjg): Check if we could use a shared analysis
677 // canvas which is reset between tiles. 689 // canvas which is reset between tiles.
678 tile->set_solid_color_analysis_performed(true); 690 tile->set_solid_color_analysis_performed(true);
679 SkColor color = SK_ColorTRANSPARENT; 691 SkColor color = SK_ColorTRANSPARENT;
680 bool is_solid_color = 692 bool is_solid_color =
681 prioritized_tile.raster_source()->PerformSolidColorAnalysis( 693 prioritized_tile.raster_source()->PerformSolidColorAnalysis(
682 tile->content_rect(), tile->raster_scales(), &color); 694 tile->content_rect(), tile->raster_scales(), &color);
683 if (is_solid_color) { 695 if (is_solid_color) {
684 tile->draw_info().set_solid_color(color); 696 tile->draw_info().set_solid_color(color);
685 tile->draw_info().set_was_ever_ready_to_draw();
686 if (!tile_is_needed_now) 697 if (!tile_is_needed_now)
687 tile->draw_info().set_was_a_prepaint_tile(); 698 tile->draw_info().set_was_a_prepaint_tile();
688 client_->NotifyTileStateChanged(tile); 699 client_->NotifyTileStateChanged(tile);
689 continue; 700 continue;
690 } 701 }
691 } 702 }
692 703
693 // Prepaint tiles that are far away are only processed for images. 704 // Prepaint tiles that are far away are only processed for images.
694 if (!tile->required_for_activation() && !tile->required_for_draw() && 705 if (!tile->required_for_activation() && !tile->required_for_draw() &&
695 prioritized_tile.is_process_for_images_only()) { 706 prioritized_tile.is_process_for_images_only()) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles", 784 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles",
774 "all_tiles_that_need_to_be_rasterized_are_scheduled", 785 "all_tiles_that_need_to_be_rasterized_are_scheduled",
775 all_tiles_that_need_to_be_rasterized_are_scheduled_, 786 all_tiles_that_need_to_be_rasterized_are_scheduled_,
776 "had_enough_memory_to_schedule_tiles_needed_now", 787 "had_enough_memory_to_schedule_tiles_needed_now",
777 had_enough_memory_to_schedule_tiles_needed_now); 788 had_enough_memory_to_schedule_tiles_needed_now);
778 return work_to_schedule; 789 return work_to_schedule;
779 } 790 }
780 791
781 void TileManager::FreeResourcesForTile(Tile* tile) { 792 void TileManager::FreeResourcesForTile(Tile* tile) {
782 TileDrawInfo& draw_info = tile->draw_info(); 793 TileDrawInfo& draw_info = tile->draw_info();
783 if (draw_info.resource_) { 794 Resource* resource = draw_info.TakeResource();
784 resource_pool_->ReleaseResource(draw_info.resource_); 795 if (resource)
785 draw_info.resource_ = nullptr; 796 resource_pool_->ReleaseResource(resource);
786 }
787 } 797 }
788 798
789 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( 799 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(
790 Tile* tile) { 800 Tile* tile) {
791 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); 801 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw();
792 FreeResourcesForTile(tile); 802 FreeResourcesForTile(tile);
793 if (was_ready_to_draw) 803 if (was_ready_to_draw)
794 client_->NotifyTileStateChanged(tile); 804 client_->NotifyTileStateChanged(tile);
795 } 805 }
796 806
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 &TileManager::DidFinishRunningTileTasksRequiredForDraw); 844 &TileManager::DidFinishRunningTileTasksRequiredForDraw);
835 scoped_refptr<TileTask> all_done_task = 845 scoped_refptr<TileTask> all_done_task =
836 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); 846 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks);
837 847
838 // Build a new task queue containing all task currently needed. Tasks 848 // Build a new task queue containing all task currently needed. Tasks
839 // are added in order of priority, highest priority task first. 849 // are added in order of priority, highest priority task first.
840 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { 850 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) {
841 Tile* tile = prioritized_tile.tile(); 851 Tile* tile = prioritized_tile.tile();
842 852
843 DCHECK(tile->draw_info().requires_resource()); 853 DCHECK(tile->draw_info().requires_resource());
844 DCHECK(!tile->draw_info().resource_); 854 DCHECK(!tile->draw_info().resource());
845 855
846 if (!tile->raster_task_) 856 if (!tile->raster_task_)
847 tile->raster_task_ = CreateRasterTask( 857 tile->raster_task_ = CreateRasterTask(
848 prioritized_tile, 858 prioritized_tile,
849 prioritized_tile.raster_source()->HasImpliedColorSpace() 859 prioritized_tile.raster_source()->HasImpliedColorSpace()
850 ? prioritized_tile.raster_source()->GetImpliedColorSpace() 860 ? prioritized_tile.raster_source()->GetImpliedColorSpace()
851 : target_color_space); 861 : target_color_space);
852 862
853 TileTask* task = tile->raster_task_.get(); 863 TileTask* task = tile->raster_task_.get();
854 864
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1030 1040
1031 if (was_canceled) { 1041 if (was_canceled) {
1032 ++flush_stats_.canceled_count; 1042 ++flush_stats_.canceled_count;
1033 resource_pool_->ReleaseResource(resource); 1043 resource_pool_->ReleaseResource(resource);
1034 return; 1044 return;
1035 } 1045 }
1036 1046
1037 resource_pool_->OnContentReplaced(resource->id(), tile->id()); 1047 resource_pool_->OnContentReplaced(resource->id(), tile->id());
1038 ++flush_stats_.completed_count; 1048 ++flush_stats_.completed_count;
1039 1049
1040 draw_info.set_use_resource(); 1050 draw_info.set_resource(resource);
1041 draw_info.resource_ = resource;
1042 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); 1051 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile);
1043 1052 if (global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY &&
1044 DCHECK(draw_info.IsReadyToDraw()); 1053 !raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) {
1045 draw_info.set_was_ever_ready_to_draw(); 1054 // In SMOOTHNESS_TAKES_PRIORITY mode, we wait for GPU work to complete
1046 1055 // for a tile before setting it as ready to draw.
1047 client_->NotifyTileStateChanged(tile); 1056 pending_ready_for_draw_tiles_.insert(tile);
1057 } else {
1058 draw_info.set_resource_ready_for_draw();
1059 client_->NotifyTileStateChanged(tile);
1060 }
1048 } 1061 }
1049 1062
1050 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info, 1063 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info,
1051 int layer_id, 1064 int layer_id,
1052 int source_frame_number, 1065 int source_frame_number,
1053 int flags) { 1066 int flags) {
1054 // We need to have a tile task worker pool to do anything meaningful with 1067 // We need to have a tile task worker pool to do anything meaningful with
1055 // tiles. 1068 // tiles.
1056 DCHECK(tile_task_manager_); 1069 DCHECK(tile_task_manager_);
1057 ScopedTilePtr tile( 1070 ScopedTilePtr tile(
(...skipping 28 matching lines...) Expand all
1086 Tile* tile = all_queue->Top().tile(); 1099 Tile* tile = all_queue->Top().tile();
1087 DCHECK(!tile->required_for_activation() || 1100 DCHECK(!tile->required_for_activation() ||
1088 tile->draw_info().IsReadyToDraw()); 1101 tile->draw_info().IsReadyToDraw());
1089 } 1102 }
1090 #endif 1103 #endif
1091 return true; 1104 return true;
1092 } 1105 }
1093 1106
1094 bool TileManager::IsReadyToActivate() const { 1107 bool TileManager::IsReadyToActivate() const {
1095 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); 1108 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate");
1096 return AreRequiredTilesReadyToDraw( 1109 return pending_required_for_activation_callback_id_ == 0 &&
1097 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); 1110 AreRequiredTilesReadyToDraw(
1111 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION);
1098 } 1112 }
1099 1113
1100 bool TileManager::IsReadyToDraw() const { 1114 bool TileManager::IsReadyToDraw() const {
1101 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); 1115 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw");
1102 return AreRequiredTilesReadyToDraw( 1116 return pending_required_for_draw_callback_id_ == 0 &&
1103 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); 1117 AreRequiredTilesReadyToDraw(
1118 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW);
1104 } 1119 }
1105 1120
1106 void TileManager::CheckAndIssueSignals() { 1121 void TileManager::CheckAndIssueSignals() {
1107 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); 1122 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals");
1108 tile_task_manager_->CheckForCompletedTasks(); 1123 tile_task_manager_->CheckForCompletedTasks();
1109 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 1124 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
1110 1125
1126 CheckPendingReadyToDrawTiles(false /* issue_signals */);
1127
1111 // Ready to activate. 1128 // Ready to activate.
1112 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { 1129 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) {
1113 signals_.ready_to_activate = false; 1130 signals_.ready_to_activate = false;
1114 if (IsReadyToActivate()) { 1131 if (IsReadyToActivate()) {
1115 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 1132 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1116 "TileManager::CheckAndIssueSignals - ready to activate"); 1133 "TileManager::CheckAndIssueSignals - ready to activate");
1117 signals_.did_notify_ready_to_activate = true; 1134 signals_.did_notify_ready_to_activate = true;
1118 client_->NotifyReadyToActivate(); 1135 client_->NotifyReadyToActivate();
1119 } 1136 }
1120 } 1137 }
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
1254 signals_.all_tile_tasks_completed); 1271 signals_.all_tile_tasks_completed);
1255 state->EndDictionary(); 1272 state->EndDictionary();
1256 return std::move(state); 1273 return std::move(state);
1257 } 1274 }
1258 1275
1259 bool TileManager::UsePartialRaster() const { 1276 bool TileManager::UsePartialRaster() const {
1260 return use_partial_raster_ && 1277 return use_partial_raster_ &&
1261 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); 1278 raster_buffer_provider_->CanPartialRasterIntoProvidedResource();
1262 } 1279 }
1263 1280
1281 void TileManager::CheckPendingReadyToDrawTiles(bool issue_signals) {
1282 bool in_smoothness_mode =
1283 global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY;
1284 ResourceProvider::ResourceIdArray required_for_activation_ids;
1285 ResourceProvider::ResourceIdArray required_for_draw_ids;
1286
1287 for (auto it = pending_ready_for_draw_tiles_.begin();
1288 it != pending_ready_for_draw_tiles_.end();) {
1289 Tile* tile = *it;
1290 const Resource* resource = tile->draw_info().resource();
1291 if (!tile->tiling()) {
1292 // The tile has been evicted or deleted. Remove it from our list.
1293 it = pending_ready_for_draw_tiles_.erase(it);
1294 continue;
1295 }
1296
1297 if (!in_smoothness_mode ||
1298 raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) {
1299 // Tile is ready to draw.
1300 tile->draw_info().set_resource_ready_for_draw();
1301 client_->NotifyTileStateChanged(tile);
1302 it = pending_ready_for_draw_tiles_.erase(it);
1303 continue;
1304 }
1305
1306 if (pending_tile_requirements_dirty_)
1307 tile->tiling()->UpdateRequiredStatesOnTile(tile);
1308 if (tile->required_for_activation())
1309 required_for_activation_ids.push_back(resource->id());
1310 if (tile->required_for_draw())
1311 required_for_draw_ids.push_back(resource->id());
1312
1313 ++it;
1314 }
1315
1316 if (required_for_activation_ids.empty()) {
1317 pending_required_for_activation_callback_id_ = 0;
1318 } else {
1319 pending_required_for_activation_callback_id_ =
1320 raster_buffer_provider_->SetReadyToDrawCallback(
1321 required_for_activation_ids,
1322 base::Bind(&TileManager::CheckPendingReadyToDrawTiles,
1323 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(),
1324 true /* issue_signals */),
1325 pending_required_for_activation_callback_id_);
1326 }
1327
1328 if (required_for_draw_ids.empty()) {
1329 pending_required_for_draw_callback_id_ = 0;
1330 } else {
1331 pending_required_for_draw_callback_id_ =
1332 raster_buffer_provider_->SetReadyToDrawCallback(
1333 required_for_draw_ids,
1334 base::Bind(&TileManager::CheckPendingReadyToDrawTiles,
1335 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(),
1336 true /* issue_signals */),
1337 pending_required_for_draw_callback_id_);
1338 }
1339
1340 // Update our signals now that we know whether we have pending resources.
1341 signals_.ready_to_activate =
1342 (pending_required_for_activation_callback_id_ == 0);
1343 signals_.ready_to_draw = (pending_required_for_draw_callback_id_ == 0);
1344
1345 if (issue_signals && (signals_.ready_to_activate || signals_.ready_to_draw))
1346 signals_check_notifier_.Schedule();
1347
1348 // We've just updated all pending tile requirements if necessary.
1349 pending_tile_requirements_dirty_ = false;
1350 }
1351
1264 // Utility function that can be used to create a "Task set finished" task that 1352 // Utility function that can be used to create a "Task set finished" task that
1265 // posts |callback| to |task_runner| when run. 1353 // posts |callback| to |task_runner| when run.
1266 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( 1354 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask(
1267 void (TileManager::*callback)()) { 1355 void (TileManager::*callback)()) {
1268 return make_scoped_refptr(new TaskSetFinishedTaskImpl( 1356 return make_scoped_refptr(new TaskSetFinishedTaskImpl(
1269 task_runner_, 1357 task_runner_,
1270 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); 1358 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr())));
1271 } 1359 }
1272 1360
1273 TileManager::MemoryUsage::MemoryUsage() 1361 TileManager::MemoryUsage::MemoryUsage()
1274 : memory_bytes_(0), resource_count_(0) {} 1362 : memory_bytes_(0), resource_count_(0) {}
1275 1363
1276 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, 1364 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes,
1277 size_t resource_count) 1365 size_t resource_count)
1278 : memory_bytes_(static_cast<int64_t>(memory_bytes)), 1366 : memory_bytes_(static_cast<int64_t>(memory_bytes)),
1279 resource_count_(static_cast<int>(resource_count)) { 1367 resource_count_(static_cast<int>(resource_count)) {
1280 // MemoryUsage is constructed using size_ts, since it deals with memory and 1368 // MemoryUsage is constructed using size_ts, since it deals with memory and
1281 // the inputs are typically size_t. However, during the course of usage (in 1369 // the inputs are typically size_t. However, during the course of usage (in
1282 // particular operator-=) can cause internal values to become negative. Thus, 1370 // particular operator-=) can cause internal values to become negative.
1283 // member variables are signed. 1371 // Thus, member variables are signed.
1284 DCHECK_LE(memory_bytes, 1372 DCHECK_LE(memory_bytes,
1285 static_cast<size_t>(std::numeric_limits<int64_t>::max())); 1373 static_cast<size_t>(std::numeric_limits<int64_t>::max()));
1286 DCHECK_LE(resource_count, 1374 DCHECK_LE(resource_count,
1287 static_cast<size_t>(std::numeric_limits<int>::max())); 1375 static_cast<size_t>(std::numeric_limits<int>::max()));
1288 } 1376 }
1289 1377
1290 // static 1378 // static
1291 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( 1379 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig(
1292 const gfx::Size& size, 1380 const gfx::Size& size,
1293 ResourceFormat format) { 1381 ResourceFormat format) {
1294 // We can use UncheckedSizeInBytes here since this is used with a tile 1382 // We can use UncheckedSizeInBytes here since this is used with a tile
1295 // size which is determined by the compositor (it's at most max texture size). 1383 // size which is determined by the compositor (it's at most max texture
1384 // size).
1296 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), 1385 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format),
1297 1); 1386 1);
1298 } 1387 }
1299 1388
1300 // static 1389 // static
1301 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { 1390 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) {
1302 const TileDrawInfo& draw_info = tile->draw_info(); 1391 const TileDrawInfo& draw_info = tile->draw_info();
1303 if (draw_info.resource_) { 1392 if (draw_info.resource()) {
1304 return MemoryUsage::FromConfig(draw_info.resource_->size(), 1393 return MemoryUsage::FromConfig(draw_info.resource()->size(),
1305 draw_info.resource_->format()); 1394 draw_info.resource()->format());
1306 } 1395 }
1307 return MemoryUsage(); 1396 return MemoryUsage();
1308 } 1397 }
1309 1398
1310 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=( 1399 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=(
1311 const MemoryUsage& other) { 1400 const MemoryUsage& other) {
1312 memory_bytes_ += other.memory_bytes_; 1401 memory_bytes_ += other.memory_bytes_;
1313 resource_count_ += other.resource_count_; 1402 resource_count_ += other.resource_count_;
1314 return *this; 1403 return *this;
1315 } 1404 }
(...skipping 29 matching lines...) Expand all
1345 all_tile_tasks_completed = false; 1434 all_tile_tasks_completed = false;
1346 did_notify_all_tile_tasks_completed = false; 1435 did_notify_all_tile_tasks_completed = false;
1347 } 1436 }
1348 1437
1349 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; 1438 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default;
1350 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( 1439 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule(
1351 PrioritizedWorkToSchedule&& other) = default; 1440 PrioritizedWorkToSchedule&& other) = default;
1352 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; 1441 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default;
1353 1442
1354 } // namespace cc 1443 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698