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

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

Issue 2555743004: Delay activation/draw on GPU tile work completion (Closed)
Patch Set: rebase compile fix Created 3 years, 10 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
« no previous file with comments | « cc/tiles/tile_manager.h ('k') | cc/tiles/tile_manager_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
1056 1062
1057 resource_pool_->OnContentReplaced(resource->id(), tile_id); 1063 resource_pool_->OnContentReplaced(resource->id(), tile_id);
1058 ++flush_stats_.completed_count; 1064 ++flush_stats_.completed_count;
1059 1065
1060 if (!tile) { 1066 if (!tile) {
1061 resource_pool_->ReleaseResource(resource); 1067 resource_pool_->ReleaseResource(resource);
1062 return; 1068 return;
1063 } 1069 }
1064 1070
1065 TileDrawInfo& draw_info = tile->draw_info(); 1071 TileDrawInfo& draw_info = tile->draw_info();
1066 draw_info.set_use_resource(); 1072 draw_info.set_resource(resource);
1067 draw_info.resource_ = resource;
1068 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); 1073 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile);
1069 1074
1070 DCHECK(draw_info.IsReadyToDraw()); 1075 // In SMOOTHNESS_TAKES_PRIORITY mode, we wait for GPU work to complete for a
1071 draw_info.set_was_ever_ready_to_draw(); 1076 // tile before setting it as ready to draw.
1077 if (global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY &&
1078 !raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) {
1079 pending_gpu_work_tiles_.insert(tile);
1080 return;
1081 }
1082
1083 draw_info.set_resource_ready_for_draw();
1072 client_->NotifyTileStateChanged(tile); 1084 client_->NotifyTileStateChanged(tile);
1073 } 1085 }
1074 1086
1075 void TileManager::SetDecodedImageTracker( 1087 void TileManager::SetDecodedImageTracker(
1076 DecodedImageTracker* decoded_image_tracker) { 1088 DecodedImageTracker* decoded_image_tracker) {
1077 // TODO(vmpstr): If the tile manager needs to request out-of-raster decodes, 1089 // TODO(vmpstr): If the tile manager needs to request out-of-raster decodes,
1078 // it should retain and use |decoded_image_tracker| here. 1090 // it should retain and use |decoded_image_tracker| here.
1079 decoded_image_tracker->set_image_controller(&image_controller_); 1091 decoded_image_tracker->set_image_controller(&image_controller_);
1080 } 1092 }
1081 1093
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 Tile* tile = all_queue->Top().tile(); 1130 Tile* tile = all_queue->Top().tile();
1119 DCHECK(!tile->required_for_activation() || 1131 DCHECK(!tile->required_for_activation() ||
1120 tile->draw_info().IsReadyToDraw()); 1132 tile->draw_info().IsReadyToDraw());
1121 } 1133 }
1122 #endif 1134 #endif
1123 return true; 1135 return true;
1124 } 1136 }
1125 1137
1126 bool TileManager::IsReadyToActivate() const { 1138 bool TileManager::IsReadyToActivate() const {
1127 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); 1139 TRACE_EVENT0("cc", "TileManager::IsReadyToActivate");
1128 return AreRequiredTilesReadyToDraw( 1140 return pending_required_for_activation_callback_id_ == 0 &&
1129 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); 1141 AreRequiredTilesReadyToDraw(
1142 RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION);
1130 } 1143 }
1131 1144
1132 bool TileManager::IsReadyToDraw() const { 1145 bool TileManager::IsReadyToDraw() const {
1133 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); 1146 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw");
1134 return AreRequiredTilesReadyToDraw( 1147 return pending_required_for_draw_callback_id_ == 0 &&
1135 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); 1148 AreRequiredTilesReadyToDraw(
1149 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW);
1136 } 1150 }
1137 1151
1138 void TileManager::CheckAndIssueSignals() { 1152 void TileManager::CheckAndIssueSignals() {
1139 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); 1153 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals");
1140 tile_task_manager_->CheckForCompletedTasks(); 1154 tile_task_manager_->CheckForCompletedTasks();
1141 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 1155 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
1142 1156
1157 CheckPendingGpuWorkTiles(false /* issue_signals */);
1158
1143 // Ready to activate. 1159 // Ready to activate.
1144 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { 1160 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) {
1145 signals_.ready_to_activate = false; 1161 signals_.ready_to_activate = false;
1146 if (IsReadyToActivate()) { 1162 if (IsReadyToActivate()) {
1147 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 1163 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1148 "TileManager::CheckAndIssueSignals - ready to activate"); 1164 "TileManager::CheckAndIssueSignals - ready to activate");
1149 signals_.did_notify_ready_to_activate = true; 1165 signals_.did_notify_ready_to_activate = true;
1150 client_->NotifyReadyToActivate(); 1166 client_->NotifyReadyToActivate();
1151 } 1167 }
1152 } 1168 }
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1282 signals_.all_tile_tasks_completed); 1298 signals_.all_tile_tasks_completed);
1283 state->EndDictionary(); 1299 state->EndDictionary();
1284 return std::move(state); 1300 return std::move(state);
1285 } 1301 }
1286 1302
1287 bool TileManager::UsePartialRaster() const { 1303 bool TileManager::UsePartialRaster() const {
1288 return use_partial_raster_ && 1304 return use_partial_raster_ &&
1289 raster_buffer_provider_->CanPartialRasterIntoProvidedResource(); 1305 raster_buffer_provider_->CanPartialRasterIntoProvidedResource();
1290 } 1306 }
1291 1307
1308 void TileManager::CheckPendingGpuWorkTiles(bool issue_signals) {
1309 ResourceProvider::ResourceIdArray required_for_activation_ids;
1310 ResourceProvider::ResourceIdArray required_for_draw_ids;
1311
1312 for (auto it = pending_gpu_work_tiles_.begin();
1313 it != pending_gpu_work_tiles_.end();) {
1314 Tile* tile = *it;
1315 const Resource* resource = tile->draw_info().resource();
1316
1317 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY ||
1318 raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) {
1319 tile->draw_info().set_resource_ready_for_draw();
1320 client_->NotifyTileStateChanged(tile);
1321 it = pending_gpu_work_tiles_.erase(it);
1322 continue;
1323 }
1324
1325 // TODO(ericrk): If a tile in our list no longer has valid tile priorities,
1326 // it may still report that it is required, and unnecessarily delay
1327 // activation. crbug.com/687265
1328 if (pending_tile_requirements_dirty_)
1329 tile->tiling()->UpdateRequiredStatesOnTile(tile);
1330 if (tile->required_for_activation())
1331 required_for_activation_ids.push_back(resource->id());
1332 if (tile->required_for_draw())
1333 required_for_draw_ids.push_back(resource->id());
1334
1335 ++it;
1336 }
1337
1338 if (required_for_activation_ids.empty()) {
1339 pending_required_for_activation_callback_id_ = 0;
1340 } else {
1341 pending_required_for_activation_callback_id_ =
1342 raster_buffer_provider_->SetReadyToDrawCallback(
1343 required_for_activation_ids,
1344 base::Bind(&TileManager::CheckPendingGpuWorkTiles,
1345 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(),
1346 true /* issue_signals */),
1347 pending_required_for_activation_callback_id_);
1348 }
1349
1350 pending_required_for_draw_callback_id_ = 0;
1351 if (!required_for_draw_ids.empty()) {
1352 pending_required_for_draw_callback_id_ =
1353 raster_buffer_provider_->SetReadyToDrawCallback(
1354 required_for_draw_ids,
1355 base::Bind(&TileManager::CheckPendingGpuWorkTiles,
1356 ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(),
1357 true /* issue_signals */),
1358 pending_required_for_draw_callback_id_);
1359 }
1360
1361 // Update our signals now that we know whether we have pending resources.
1362 signals_.ready_to_activate =
1363 (pending_required_for_activation_callback_id_ == 0);
1364 signals_.ready_to_draw = (pending_required_for_draw_callback_id_ == 0);
1365
1366 if (issue_signals && (signals_.ready_to_activate || signals_.ready_to_draw))
1367 signals_check_notifier_.Schedule();
1368
1369 // We've just updated all pending tile requirements if necessary.
1370 pending_tile_requirements_dirty_ = false;
1371 }
1372
1292 // Utility function that can be used to create a "Task set finished" task that 1373 // Utility function that can be used to create a "Task set finished" task that
1293 // posts |callback| to |task_runner| when run. 1374 // posts |callback| to |task_runner| when run.
1294 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask( 1375 scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask(
1295 void (TileManager::*callback)()) { 1376 void (TileManager::*callback)()) {
1296 return make_scoped_refptr(new TaskSetFinishedTaskImpl( 1377 return make_scoped_refptr(new TaskSetFinishedTaskImpl(
1297 task_runner_, 1378 task_runner_,
1298 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr()))); 1379 base::Bind(callback, task_set_finished_weak_ptr_factory_.GetWeakPtr())));
1299 } 1380 }
1300 1381
1301 TileManager::MemoryUsage::MemoryUsage() 1382 TileManager::MemoryUsage::MemoryUsage()
1302 : memory_bytes_(0), resource_count_(0) {} 1383 : memory_bytes_(0), resource_count_(0) {}
1303 1384
1304 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes, 1385 TileManager::MemoryUsage::MemoryUsage(size_t memory_bytes,
1305 size_t resource_count) 1386 size_t resource_count)
1306 : memory_bytes_(static_cast<int64_t>(memory_bytes)), 1387 : memory_bytes_(static_cast<int64_t>(memory_bytes)),
1307 resource_count_(static_cast<int>(resource_count)) { 1388 resource_count_(static_cast<int>(resource_count)) {
1308 // MemoryUsage is constructed using size_ts, since it deals with memory and 1389 // MemoryUsage is constructed using size_ts, since it deals with memory and
1309 // the inputs are typically size_t. However, during the course of usage (in 1390 // the inputs are typically size_t. However, during the course of usage (in
1310 // particular operator-=) can cause internal values to become negative. Thus, 1391 // particular operator-=) can cause internal values to become negative.
1311 // member variables are signed. 1392 // Thus, member variables are signed.
1312 DCHECK_LE(memory_bytes, 1393 DCHECK_LE(memory_bytes,
1313 static_cast<size_t>(std::numeric_limits<int64_t>::max())); 1394 static_cast<size_t>(std::numeric_limits<int64_t>::max()));
1314 DCHECK_LE(resource_count, 1395 DCHECK_LE(resource_count,
1315 static_cast<size_t>(std::numeric_limits<int>::max())); 1396 static_cast<size_t>(std::numeric_limits<int>::max()));
1316 } 1397 }
1317 1398
1318 // static 1399 // static
1319 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig( 1400 TileManager::MemoryUsage TileManager::MemoryUsage::FromConfig(
1320 const gfx::Size& size, 1401 const gfx::Size& size,
1321 ResourceFormat format) { 1402 ResourceFormat format) {
1322 // We can use UncheckedSizeInBytes here since this is used with a tile 1403 // We can use UncheckedSizeInBytes here since this is used with a tile
1323 // size which is determined by the compositor (it's at most max texture size). 1404 // size which is determined by the compositor (it's at most max texture
1405 // size).
1324 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format), 1406 return MemoryUsage(ResourceUtil::UncheckedSizeInBytes<size_t>(size, format),
1325 1); 1407 1);
1326 } 1408 }
1327 1409
1328 // static 1410 // static
1329 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) { 1411 TileManager::MemoryUsage TileManager::MemoryUsage::FromTile(const Tile* tile) {
1330 const TileDrawInfo& draw_info = tile->draw_info(); 1412 const TileDrawInfo& draw_info = tile->draw_info();
1331 if (draw_info.resource_) { 1413 if (draw_info.resource()) {
1332 return MemoryUsage::FromConfig(draw_info.resource_->size(), 1414 return MemoryUsage::FromConfig(draw_info.resource()->size(),
1333 draw_info.resource_->format()); 1415 draw_info.resource()->format());
1334 } 1416 }
1335 return MemoryUsage(); 1417 return MemoryUsage();
1336 } 1418 }
1337 1419
1338 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=( 1420 TileManager::MemoryUsage& TileManager::MemoryUsage::operator+=(
1339 const MemoryUsage& other) { 1421 const MemoryUsage& other) {
1340 memory_bytes_ += other.memory_bytes_; 1422 memory_bytes_ += other.memory_bytes_;
1341 resource_count_ += other.resource_count_; 1423 resource_count_ += other.resource_count_;
1342 return *this; 1424 return *this;
1343 } 1425 }
(...skipping 29 matching lines...) Expand all
1373 all_tile_tasks_completed = false; 1455 all_tile_tasks_completed = false;
1374 did_notify_all_tile_tasks_completed = false; 1456 did_notify_all_tile_tasks_completed = false;
1375 } 1457 }
1376 1458
1377 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; 1459 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default;
1378 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( 1460 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule(
1379 PrioritizedWorkToSchedule&& other) = default; 1461 PrioritizedWorkToSchedule&& other) = default;
1380 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; 1462 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default;
1381 1463
1382 } // namespace cc 1464 } // namespace cc
OLDNEW
« no previous file with comments | « cc/tiles/tile_manager.h ('k') | cc/tiles/tile_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698