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

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

Issue 2555743004: Delay activation/draw on GPU tile work completion (Closed)
Patch Set: rebase #2 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 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 task_runner_, 365 task_runner_,
366 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, 366 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared,
367 base::Unretained(this))), 367 base::Unretained(this))),
368 signals_check_notifier_(task_runner_, 368 signals_check_notifier_(task_runner_,
369 base::Bind(&TileManager::CheckAndIssueSignals, 369 base::Bind(&TileManager::CheckAndIssueSignals,
370 base::Unretained(this))), 370 base::Unretained(this))),
371 has_scheduled_tile_tasks_(false), 371 has_scheduled_tile_tasks_(false),
372 prepare_tiles_count_(0u), 372 prepare_tiles_count_(0u),
373 next_tile_id_(0u), 373 next_tile_id_(0u),
374 check_tile_priority_inversion_(check_tile_priority_inversion), 374 check_tile_priority_inversion_(check_tile_priority_inversion),
375 task_set_finished_weak_ptr_factory_(this) {} 375 task_set_finished_weak_ptr_factory_(this),
376 ready_to_draw_callback_weak_ptr_factory_(this) {}
376 377
377 TileManager::~TileManager() { 378 TileManager::~TileManager() {
378 FinishTasksAndCleanUp(); 379 FinishTasksAndCleanUp();
379 } 380 }
380 381
381 void TileManager::FinishTasksAndCleanUp() { 382 void TileManager::FinishTasksAndCleanUp() {
382 if (!tile_task_manager_) 383 if (!tile_task_manager_)
383 return; 384 return;
384 385
385 global_state_ = GlobalStateThatImpactsTilePriority(); 386 global_state_ = GlobalStateThatImpactsTilePriority();
386 387
387 // This cancels tasks if possible, finishes pending tasks, and release any 388 // This cancels tasks if possible, finishes pending tasks, and release any
388 // uninitialized resources. 389 // uninitialized resources.
389 tile_task_manager_->Shutdown(); 390 tile_task_manager_->Shutdown();
390 391
391 raster_buffer_provider_->Shutdown(); 392 raster_buffer_provider_->Shutdown();
392 393
393 tile_task_manager_->CheckForCompletedTasks(); 394 tile_task_manager_->CheckForCompletedTasks();
394 395
395 tile_task_manager_ = nullptr; 396 tile_task_manager_ = nullptr;
396 resource_pool_ = nullptr; 397 resource_pool_ = nullptr;
397 more_tiles_need_prepare_check_notifier_.Cancel(); 398 more_tiles_need_prepare_check_notifier_.Cancel();
398 signals_check_notifier_.Cancel(); 399 signals_check_notifier_.Cancel();
399 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 400 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
401 ready_to_draw_callback_weak_ptr_factory_.InvalidateWeakPtrs();
400 raster_buffer_provider_ = nullptr; 402 raster_buffer_provider_ = nullptr;
401 403
402 image_controller_.SetImageDecodeCache(nullptr); 404 image_controller_.SetImageDecodeCache(nullptr);
403 locked_image_tasks_.clear(); 405 locked_image_tasks_.clear();
404 } 406 }
405 407
406 void TileManager::SetResources(ResourcePool* resource_pool, 408 void TileManager::SetResources(ResourcePool* resource_pool,
407 ImageDecodeCache* image_decode_cache, 409 ImageDecodeCache* image_decode_cache,
408 TaskGraphRunner* task_graph_runner, 410 TaskGraphRunner* task_graph_runner,
409 RasterBufferProvider* raster_buffer_provider, 411 RasterBufferProvider* raster_buffer_provider,
410 size_t scheduled_raster_task_limit, 412 size_t scheduled_raster_task_limit,
411 bool use_gpu_rasterization) { 413 bool use_gpu_rasterization) {
412 DCHECK(!tile_task_manager_); 414 DCHECK(!tile_task_manager_);
413 DCHECK(task_graph_runner); 415 DCHECK(task_graph_runner);
414 416
415 use_gpu_rasterization_ = use_gpu_rasterization; 417 use_gpu_rasterization_ = use_gpu_rasterization;
416 scheduled_raster_task_limit_ = scheduled_raster_task_limit; 418 scheduled_raster_task_limit_ = scheduled_raster_task_limit;
417 resource_pool_ = resource_pool; 419 resource_pool_ = resource_pool;
418 image_controller_.SetImageDecodeCache(image_decode_cache); 420 image_controller_.SetImageDecodeCache(image_decode_cache);
419 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner); 421 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner);
420 raster_buffer_provider_ = raster_buffer_provider; 422 raster_buffer_provider_ = raster_buffer_provider;
421 } 423 }
422 424
423 void TileManager::Release(Tile* tile) { 425 void TileManager::Release(Tile* tile) {
424 FreeResourcesForTile(tile); 426 FreeResourcesForTile(tile);
425 tiles_.erase(tile->id()); 427 tiles_.erase(tile->id());
428 pending_gpu_work_tiles_.erase(tile);
426 } 429 }
427 430
428 void TileManager::DidFinishRunningTileTasksRequiredForActivation() { 431 void TileManager::DidFinishRunningTileTasksRequiredForActivation() {
429 TRACE_EVENT0("cc", 432 TRACE_EVENT0("cc",
430 "TileManager::DidFinishRunningTileTasksRequiredForActivation"); 433 "TileManager::DidFinishRunningTileTasksRequiredForActivation");
431 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", 434 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
432 ScheduledTasksStateAsValue()); 435 ScheduledTasksStateAsValue());
433 // TODO(vmpstr): Temporary check to debug crbug.com/642927. 436 // TODO(vmpstr): Temporary check to debug crbug.com/642927.
434 CHECK(tile_task_manager_); 437 CHECK(tile_task_manager_);
435 signals_.ready_to_activate = true; 438 signals_.ready_to_activate = true;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 void TileManager::Flush() { 514 void TileManager::Flush() {
512 TRACE_EVENT0("cc", "TileManager::Flush"); 515 TRACE_EVENT0("cc", "TileManager::Flush");
513 516
514 if (!tile_task_manager_) { 517 if (!tile_task_manager_) {
515 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); 518 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD);
516 return; 519 return;
517 } 520 }
518 521
519 tile_task_manager_->CheckForCompletedTasks(); 522 tile_task_manager_->CheckForCompletedTasks();
520 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 523 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
524 CheckPendingGpuWorkTiles(true /* issue_signals */);
521 525
522 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", 526 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats",
523 RasterTaskCompletionStatsAsValue(flush_stats_)); 527 RasterTaskCompletionStatsAsValue(flush_stats_));
524 flush_stats_ = RasterTaskCompletionStats(); 528 flush_stats_ = RasterTaskCompletionStats();
525 } 529 }
526 530
531 void TileManager::DidModifyTilePriorities() {
532 pending_tile_requirements_dirty_ = true;
533 }
534
527 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 535 std::unique_ptr<base::trace_event::ConvertableToTraceFormat>
528 TileManager::BasicStateAsValue() const { 536 TileManager::BasicStateAsValue() const {
529 std::unique_ptr<base::trace_event::TracedValue> value( 537 std::unique_ptr<base::trace_event::TracedValue> value(
530 new base::trace_event::TracedValue()); 538 new base::trace_event::TracedValue());
531 BasicStateAsValueInto(value.get()); 539 BasicStateAsValueInto(value.get());
532 return std::move(value); 540 return std::move(value);
533 } 541 }
534 542
535 void TileManager::BasicStateAsValueInto( 543 void TileManager::BasicStateAsValueInto(
536 base::trace_event::TracedValue* state) const { 544 base::trace_event::TracedValue* state) const {
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 // or drop the tile for scheduling and raster. 662 // or drop the tile for scheduling and raster.
655 // TODO(sohanjg): Check if we could use a shared analysis 663 // TODO(sohanjg): Check if we could use a shared analysis
656 // canvas which is reset between tiles. 664 // canvas which is reset between tiles.
657 tile->set_solid_color_analysis_performed(true); 665 tile->set_solid_color_analysis_performed(true);
658 SkColor color = SK_ColorTRANSPARENT; 666 SkColor color = SK_ColorTRANSPARENT;
659 bool is_solid_color = 667 bool is_solid_color =
660 prioritized_tile.raster_source()->PerformSolidColorAnalysis( 668 prioritized_tile.raster_source()->PerformSolidColorAnalysis(
661 tile->content_rect(), tile->contents_scale(), &color); 669 tile->content_rect(), tile->contents_scale(), &color);
662 if (is_solid_color) { 670 if (is_solid_color) {
663 tile->draw_info().set_solid_color(color); 671 tile->draw_info().set_solid_color(color);
664 tile->draw_info().set_was_ever_ready_to_draw();
665 if (!tile_is_needed_now) 672 if (!tile_is_needed_now)
666 tile->draw_info().set_was_a_prepaint_tile(); 673 tile->draw_info().set_was_a_prepaint_tile();
667 client_->NotifyTileStateChanged(tile); 674 client_->NotifyTileStateChanged(tile);
668 continue; 675 continue;
669 } 676 }
670 } 677 }
671 678
672 // Prepaint tiles that are far away are only processed for images. 679 // Prepaint tiles that are far away are only processed for images.
673 if (!tile->required_for_activation() && !tile->required_for_draw() && 680 if (!tile->required_for_activation() && !tile->required_for_draw() &&
674 prioritized_tile.is_process_for_images_only()) { 681 prioritized_tile.is_process_for_images_only()) {
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles", 794 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles",
788 "all_tiles_that_need_to_be_rasterized_are_scheduled", 795 "all_tiles_that_need_to_be_rasterized_are_scheduled",
789 all_tiles_that_need_to_be_rasterized_are_scheduled_, 796 all_tiles_that_need_to_be_rasterized_are_scheduled_,
790 "had_enough_memory_to_schedule_tiles_needed_now", 797 "had_enough_memory_to_schedule_tiles_needed_now",
791 had_enough_memory_to_schedule_tiles_needed_now); 798 had_enough_memory_to_schedule_tiles_needed_now);
792 return work_to_schedule; 799 return work_to_schedule;
793 } 800 }
794 801
795 void TileManager::FreeResourcesForTile(Tile* tile) { 802 void TileManager::FreeResourcesForTile(Tile* tile) {
796 TileDrawInfo& draw_info = tile->draw_info(); 803 TileDrawInfo& draw_info = tile->draw_info();
797 if (draw_info.resource_) { 804 Resource* resource = draw_info.TakeResource();
798 resource_pool_->ReleaseResource(draw_info.resource_); 805 if (resource)
799 draw_info.resource_ = nullptr; 806 resource_pool_->ReleaseResource(resource);
800 }
801 } 807 }
802 808
803 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( 809 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(
804 Tile* tile) { 810 Tile* tile) {
805 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); 811 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw();
806 FreeResourcesForTile(tile); 812 FreeResourcesForTile(tile);
807 if (was_ready_to_draw) 813 if (was_ready_to_draw)
808 client_->NotifyTileStateChanged(tile); 814 client_->NotifyTileStateChanged(tile);
809 } 815 }
810 816
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 &TileManager::DidFinishRunningTileTasksRequiredForDraw); 854 &TileManager::DidFinishRunningTileTasksRequiredForDraw);
849 scoped_refptr<TileTask> all_done_task = 855 scoped_refptr<TileTask> all_done_task =
850 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); 856 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks);
851 857
852 // Build a new task queue containing all task currently needed. Tasks 858 // Build a new task queue containing all task currently needed. Tasks
853 // are added in order of priority, highest priority task first. 859 // are added in order of priority, highest priority task first.
854 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { 860 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) {
855 Tile* tile = prioritized_tile.tile(); 861 Tile* tile = prioritized_tile.tile();
856 862
857 DCHECK(tile->draw_info().requires_resource()); 863 DCHECK(tile->draw_info().requires_resource());
858 DCHECK(!tile->draw_info().resource_); 864 DCHECK(!tile->draw_info().resource());
859 865
860 if (!tile->raster_task_) 866 if (!tile->raster_task_)
861 tile->raster_task_ = CreateRasterTask( 867 tile->raster_task_ = CreateRasterTask(
862 prioritized_tile, 868 prioritized_tile,
863 prioritized_tile.raster_source()->HasImpliedColorSpace() 869 prioritized_tile.raster_source()->HasImpliedColorSpace()
864 ? prioritized_tile.raster_source()->GetImpliedColorSpace() 870 ? prioritized_tile.raster_source()->GetImpliedColorSpace()
865 : target_color_space); 871 : target_color_space);
866 872
867 TileTask* task = tile->raster_task_.get(); 873 TileTask* task = tile->raster_task_.get();
868 874
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
1052 1058
1053 resource_pool_->OnContentReplaced(resource->id(), tile_id); 1059 resource_pool_->OnContentReplaced(resource->id(), tile_id);
1054 ++flush_stats_.completed_count; 1060 ++flush_stats_.completed_count;
1055 1061
1056 if (!tile) { 1062 if (!tile) {
1057 resource_pool_->ReleaseResource(resource); 1063 resource_pool_->ReleaseResource(resource);
1058 return; 1064 return;
1059 } 1065 }
1060 1066
1061 TileDrawInfo& draw_info = tile->draw_info(); 1067 TileDrawInfo& draw_info = tile->draw_info();
1062 draw_info.set_use_resource(); 1068 draw_info.set_resource(resource);
1063 draw_info.resource_ = resource;
1064 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); 1069 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile);
1065 1070
1066 DCHECK(draw_info.IsReadyToDraw()); 1071 // In SMOOTHNESS_TAKES_PRIORITY mode, we wait for GPU work to complete for a
1067 draw_info.set_was_ever_ready_to_draw(); 1072 // tile before setting it as ready to draw.
1073 if (global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY &&
1074 !raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) {
1075 pending_gpu_work_tiles_.insert(tile);
1076 return;
1077 }
1078
1079 draw_info.set_resource_ready_for_draw();
1068 client_->NotifyTileStateChanged(tile); 1080 client_->NotifyTileStateChanged(tile);
1069 } 1081 }
1070 1082
1071 void TileManager::SetDecodedImageTracker( 1083 void TileManager::SetDecodedImageTracker(
1072 DecodedImageTracker* decoded_image_tracker) { 1084 DecodedImageTracker* decoded_image_tracker) {
1073 // TODO(vmpstr): If the tile manager needs to request out-of-raster decodes, 1085 // TODO(vmpstr): If the tile manager needs to request out-of-raster decodes,
1074 // it should retain and use |decoded_image_tracker| here. 1086 // it should retain and use |decoded_image_tracker| here.
1075 decoded_image_tracker->set_image_controller(&image_controller_); 1087 decoded_image_tracker->set_image_controller(&image_controller_);
1076 } 1088 }
1077 1089
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1114 Tile* tile = all_queue->Top().tile(); 1126 Tile* tile = all_queue->Top().tile();
1115 DCHECK(!tile->required_for_activation() || 1127 DCHECK(!tile->required_for_activation() ||
1116 tile->draw_info().IsReadyToDraw()); 1128 tile->draw_info().IsReadyToDraw());
1117 } 1129 }
1118 #endif 1130 #endif
1119 return true; 1131 return true;
1120 } 1132 }
1121 1133
1122 bool TileManager::IsReadyToActivate() const { 1134 bool TileManager::IsReadyToActivate() const {
1123 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); 1135 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate");
1124 return AreRequiredTilesReadyToDraw( 1136 return pending_required_for_activation_callback_id_ == 0 &&
1125 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); 1137 AreRequiredTilesReadyToDraw(
1138 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION);
1126 } 1139 }
1127 1140
1128 bool TileManager::IsReadyToDraw() const { 1141 bool TileManager::IsReadyToDraw() const {
1129 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); 1142 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw");
1130 return AreRequiredTilesReadyToDraw( 1143 return pending_required_for_draw_callback_id_ == 0 &&
1131 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); 1144 AreRequiredTilesReadyToDraw(
1145 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW);
1132 } 1146 }
1133 1147
1134 void TileManager::CheckAndIssueSignals() { 1148 void TileManager::CheckAndIssueSignals() {
1135 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); 1149 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals");
1136 tile_task_manager_->CheckForCompletedTasks(); 1150 tile_task_manager_->CheckForCompletedTasks();
1137 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 1151 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
1138 1152
1153 CheckPendingGpuWorkTiles(false /* issue_signals */);
1154
1139 // Ready to activate. 1155 // Ready to activate.
1140 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { 1156 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) {
1141 signals_.ready_to_activate = false; 1157 signals_.ready_to_activate = false;
1142 if (IsReadyToActivate()) { 1158 if (IsReadyToActivate()) {
1143 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 1159 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1144 "TileManager::CheckAndIssueSignals - ready to activate"); 1160 "TileManager::CheckAndIssueSignals - ready to activate");
1145 signals_.did_notify_ready_to_activate = true; 1161 signals_.did_notify_ready_to_activate = true;
1146 client_->NotifyReadyToActivate(); 1162 client_->NotifyReadyToActivate();
1147 } 1163 }
1148 } 1164 }
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
1280 signals_.all_tile_tasks_completed); 1296 signals_.all_tile_tasks_completed);
1281 state->EndDictionary(); 1297 state->EndDictionary();
1282 return std::move(state); 1298 return std::move(state);
1283 } 1299 }
1284 1300
1285 bool TileManager::UsePartialRaster() const { 1301 bool TileManager::UsePartialRaster() const {
1286 return use_partial_raster_ && 1302 return use_partial_raster_ &&
1287 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); 1303 raster_buffer_provider_->CanPartialRasterIntoProvidedResource();
1288 } 1304 }
1289 1305
1306 void TileManager::CheckPendingGpuWorkTiles(bool issue_signals) {
1307 ResourceProvider::ResourceIdArray required_for_activation_ids;
1308 ResourceProvider::ResourceIdArray required_for_draw_ids;
1309
1310 for (auto it = pending_gpu_work_tiles_.begin();
1311 it != pending_gpu_work_tiles_.end();) {
1312 Tile* tile = *it;
1313 const Resource* resource = tile->draw_info().resource();
1314
1315 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY ||
1316 raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) {
1317 tile->draw_info().set_resource_ready_for_draw();
1318 client_->NotifyTileStateChanged(tile);
1319 it = pending_gpu_work_tiles_.erase(it);
1320 continue;
1321 }
1322
1323 if (pending_tile_requirements_dirty_)
1324 tile->tiling()->UpdateRequiredStatesOnTile(tile);
1325 if (tile->required_for_activation())
vmpstr 2017/01/30 19:51:19 While investigating an unrelated to this bug, I re
ericrk 2017/01/31 19:23:54 Added a TODO + crbug... will take care of this in
1326 required_for_activation_ids.push_back(resource->id());
1327 if (tile->required_for_draw())
1328 required_for_draw_ids.push_back(resource->id());
1329
1330 ++it;
1331 }
1332
1333 if (required_for_activation_ids.empty()) {
1334 pending_required_for_activation_callback_id_ = 0;
1335 } else {
1336 pending_required_for_activation_callback_id_ =
1337 raster_buffer_provider_->SetReadyToDrawCallback(
1338 required_for_activation_ids,
1339 base::Bind(&TileManager::CheckPendingGpuWorkTiles,
1340 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(),
1341 true /* issue_signals */),
1342 pending_required_for_activation_callback_id_);
1343 }
1344
1345 pending_required_for_draw_callback_id_ = 0;
1346 if (!required_for_draw_ids.empty()) {
1347 pending_required_for_draw_callback_id_ =
1348 raster_buffer_provider_->SetReadyToDrawCallback(
1349 required_for_draw_ids,
1350 base::Bind(&TileManager::CheckPendingGpuWorkTiles,
1351 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(),
1352 true /* issue_signals */),
1353 pending_required_for_draw_callback_id_);
1354 }
1355
1356 // Update our signals now that we know whether we have pending resources.
1357 signals_.ready_to_activate =
1358 (pending_required_for_activation_callback_id_ == 0);
1359 signals_.ready_to_draw = (pending_required_for_draw_callback_id_ == 0);
1360
1361 if (issue_signals && (signals_.ready_to_activate || signals_.ready_to_draw))
1362 signals_check_notifier_.Schedule();
1363
1364 // We've just updated all pending tile requirements if necessary.
1365 pending_tile_requirements_dirty_ = false;
1366 }
1367
1290 // Utility function that can be used to create a "Task set finished" task that 1368 // Utility function that can be used to create a "Task set finished" task that
1291 // posts |callback| to |task_runner| when run. 1369 // posts |callback| to |task_runner| when run.
1292 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( 1370 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask(
1293 void (TileManager::*callback)()) { 1371 void (TileManager::*callback)()) {
1294 return make_scoped_refptr(new TaskSetFinishedTaskImpl( 1372 return make_scoped_refptr(new TaskSetFinishedTaskImpl(
1295 task_runner_, 1373 task_runner_,
1296 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); 1374 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr())));
1297 } 1375 }
1298 1376
1299 TileManager::MemoryUsage::MemoryUsage() 1377 TileManager::MemoryUsage::MemoryUsage()
1300 : memory_bytes_(0), resource_count_(0) {} 1378 : memory_bytes_(0), resource_count_(0) {}
1301 1379
1302 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, 1380 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes,
1303 size_t resource_count) 1381 size_t resource_count)
1304 : memory_bytes_(static_cast<int64_t>(memory_bytes)), 1382 : memory_bytes_(static_cast<int64_t>(memory_bytes)),
1305 resource_count_(static_cast<int>(resource_count)) { 1383 resource_count_(static_cast<int>(resource_count)) {
1306 // MemoryUsage is constructed using size_ts, since it deals with memory and 1384 // MemoryUsage is constructed using size_ts, since it deals with memory and
1307 // the inputs are typically size_t. However, during the course of usage (in 1385 // the inputs are typically size_t. However, during the course of usage (in
1308 // particular operator-=) can cause internal values to become negative. Thus, 1386 // particular operator-=) can cause internal values to become negative.
1309 // member variables are signed. 1387 // Thus, member variables are signed.
1310 DCHECK_LE(memory_bytes, 1388 DCHECK_LE(memory_bytes,
1311 static_cast<size_t>(std::numeric_limits<int64_t>::max())); 1389 static_cast<size_t>(std::numeric_limits<int64_t>::max()));
1312 DCHECK_LE(resource_count, 1390 DCHECK_LE(resource_count,
1313 static_cast<size_t>(std::numeric_limits<int>::max())); 1391 static_cast<size_t>(std::numeric_limits<int>::max()));
1314 } 1392 }
1315 1393
1316 // static 1394 // static
1317 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( 1395 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig(
1318 const gfx::Size& size, 1396 const gfx::Size& size,
1319 ResourceFormat format) { 1397 ResourceFormat format) {
1320 // We can use UncheckedSizeInBytes here since this is used with a tile 1398 // We can use UncheckedSizeInBytes here since this is used with a tile
1321 // size which is determined by the compositor (it's at most max texture size). 1399 // size which is determined by the compositor (it's at most max texture
1400 // size).
1322 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), 1401 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format),
1323 1); 1402 1);
1324 } 1403 }
1325 1404
1326 // static 1405 // static
1327 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { 1406 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) {
1328 const TileDrawInfo& draw_info = tile->draw_info(); 1407 const TileDrawInfo& draw_info = tile->draw_info();
1329 if (draw_info.resource_) { 1408 if (draw_info.resource()) {
1330 return MemoryUsage::FromConfig(draw_info.resource_->size(), 1409 return MemoryUsage::FromConfig(draw_info.resource()->size(),
1331 draw_info.resource_->format()); 1410 draw_info.resource()->format());
1332 } 1411 }
1333 return MemoryUsage(); 1412 return MemoryUsage();
1334 } 1413 }
1335 1414
1336 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=( 1415 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=(
1337 const MemoryUsage& other) { 1416 const MemoryUsage& other) {
1338 memory_bytes_ += other.memory_bytes_; 1417 memory_bytes_ += other.memory_bytes_;
1339 resource_count_ += other.resource_count_; 1418 resource_count_ += other.resource_count_;
1340 return *this; 1419 return *this;
1341 } 1420 }
(...skipping 29 matching lines...) Expand all
1371 all_tile_tasks_completed = false; 1450 all_tile_tasks_completed = false;
1372 did_notify_all_tile_tasks_completed = false; 1451 did_notify_all_tile_tasks_completed = false;
1373 } 1452 }
1374 1453
1375 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; 1454 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default;
1376 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( 1455 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule(
1377 PrioritizedWorkToSchedule&& other) = default; 1456 PrioritizedWorkToSchedule&& other) = default;
1378 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; 1457 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default;
1379 1458
1380 } // namespace cc 1459 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698