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

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

Issue 2924233002: cc: Move pre-decodes to background worker. (Closed)
Patch Set: addressed comments Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/tiles/tile_manager.h" 5 #include "cc/tiles/tile_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 502
503 PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles(); 503 PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles();
504 504
505 // Inform the client that will likely require a draw if the highest priority 505 // Inform the client that will likely require a draw if the highest priority
506 // tile that will be rasterized is required for draw. 506 // tile that will be rasterized is required for draw.
507 client_->SetIsLikelyToRequireADraw( 507 client_->SetIsLikelyToRequireADraw(
508 !prioritized_work.tiles_to_raster.empty() && 508 !prioritized_work.tiles_to_raster.empty() &&
509 prioritized_work.tiles_to_raster.front().tile()->required_for_draw()); 509 prioritized_work.tiles_to_raster.front().tile()->required_for_draw());
510 510
511 // Schedule tile tasks. 511 // Schedule tile tasks.
512 ScheduleTasks(prioritized_work); 512 ScheduleTasks(std::move(prioritized_work));
513 513
514 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, 514 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD,
515 "state", BasicStateAsValue()); 515 "state", BasicStateAsValue());
516 return true; 516 return true;
517 } 517 }
518 518
519 void TileManager::Flush() { 519 void TileManager::Flush() {
520 TRACE_EVENT0("cc", "TileManager::Flush"); 520 TRACE_EVENT0("cc", "TileManager::Flush");
521 521
522 if (!tile_task_manager_) { 522 if (!tile_task_manager_) {
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 // checker-images. If this tile does not need raster, process it only to 698 // checker-images. If this tile does not need raster, process it only to
699 // build the decode queue for checkered images. 699 // build the decode queue for checkered images.
700 // Note that performing this check after the solid color analysis is not 700 // Note that performing this check after the solid color analysis is not
701 // necessary for correctness. 701 // necessary for correctness.
702 if (!tile->draw_info().NeedsRaster()) { 702 if (!tile->draw_info().NeedsRaster()) {
703 DCHECK(tile->draw_info().is_checker_imaged()); 703 DCHECK(tile->draw_info().is_checker_imaged());
704 DCHECK(prioritized_tile.should_decode_checkered_images_for_tile()); 704 DCHECK(prioritized_tile.should_decode_checkered_images_for_tile());
705 705
706 AddCheckeredImagesToDecodeQueue( 706 AddCheckeredImagesToDecodeQueue(
707 prioritized_tile, raster_color_space, 707 prioritized_tile, raster_color_space,
708 CheckerImageTracker::DecodeType::kRaster,
708 &work_to_schedule.checker_image_decode_queue); 709 &work_to_schedule.checker_image_decode_queue);
709 continue; 710 continue;
710 } 711 }
711 712
712 // We won't be able to schedule this tile, so break out early. 713 // We won't be able to schedule this tile, so break out early.
713 if (work_to_schedule.tiles_to_raster.size() >= 714 if (work_to_schedule.tiles_to_raster.size() >=
714 scheduled_raster_task_limit_) { 715 scheduled_raster_task_limit_) {
715 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; 716 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
716 break; 717 break;
717 } 718 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 757
757 // If the tile has a scheduled task that will rasterize a resource with 758 // If the tile has a scheduled task that will rasterize a resource with
758 // checker-imaged content, add those images to the decode queue. Note that 759 // checker-imaged content, add those images to the decode queue. Note that
759 // we add all images as we process the raster priority queue to ensure that 760 // we add all images as we process the raster priority queue to ensure that
760 // images are added to the decode queue in raster priority order. 761 // images are added to the decode queue in raster priority order.
761 if (tile->HasRasterTask()) { 762 if (tile->HasRasterTask()) {
762 if (tile->raster_task_scheduled_with_checker_images() && 763 if (tile->raster_task_scheduled_with_checker_images() &&
763 prioritized_tile.should_decode_checkered_images_for_tile()) { 764 prioritized_tile.should_decode_checkered_images_for_tile()) {
764 AddCheckeredImagesToDecodeQueue( 765 AddCheckeredImagesToDecodeQueue(
765 prioritized_tile, raster_color_space, 766 prioritized_tile, raster_color_space,
767 CheckerImageTracker::DecodeType::kRaster,
766 &work_to_schedule.checker_image_decode_queue); 768 &work_to_schedule.checker_image_decode_queue);
767 } 769 }
768 } else { 770 } else {
769 // Creating the raster task here will acquire resources, but 771 // Creating the raster task here will acquire resources, but
770 // this resource usage has already been accounted for above. 772 // this resource usage has already been accounted for above.
771 tile->raster_task_ = 773 tile->raster_task_ =
772 CreateRasterTask(prioritized_tile, client_->GetRasterColorSpace(), 774 CreateRasterTask(prioritized_tile, client_->GetRasterColorSpace(),
773 &work_to_schedule.checker_image_decode_queue); 775 &work_to_schedule.checker_image_decode_queue);
774 } 776 }
775 777
(...skipping 22 matching lines...) Expand all
798 break; 800 break;
799 801
800 if (!prioritized_tile.should_decode_checkered_images_for_tile()) 802 if (!prioritized_tile.should_decode_checkered_images_for_tile())
801 continue; 803 continue;
802 804
803 Tile* tile = prioritized_tile.tile(); 805 Tile* tile = prioritized_tile.tile();
804 if (tile->draw_info().is_checker_imaged() || 806 if (tile->draw_info().is_checker_imaged() ||
805 tile->raster_task_scheduled_with_checker_images()) { 807 tile->raster_task_scheduled_with_checker_images()) {
806 AddCheckeredImagesToDecodeQueue( 808 AddCheckeredImagesToDecodeQueue(
807 prioritized_tile, raster_color_space, 809 prioritized_tile, raster_color_space,
810 CheckerImageTracker::DecodeType::kRaster,
808 &work_to_schedule.checker_image_decode_queue); 811 &work_to_schedule.checker_image_decode_queue);
809 } 812 }
810 } 813 }
811 } 814 }
812 815
813 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", 816 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget",
814 !had_enough_memory_to_schedule_tiles_needed_now); 817 !had_enough_memory_to_schedule_tiles_needed_now);
815 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; 818 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now;
816 819
817 memory_stats_from_last_assign_.total_budget_in_bytes = 820 memory_stats_from_last_assign_.total_budget_in_bytes =
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 if (checker_image_tracker_.ShouldCheckerImage(draw_image, tree)) 870 if (checker_image_tracker_.ShouldCheckerImage(draw_image, tree))
868 checkered_images->push_back(draw_image.paint_image()); 871 checkered_images->push_back(draw_image.paint_image());
869 else 872 else
870 sync_decoded_images->push_back(draw_image); 873 sync_decoded_images->push_back(draw_image);
871 } 874 }
872 } 875 }
873 876
874 void TileManager::AddCheckeredImagesToDecodeQueue( 877 void TileManager::AddCheckeredImagesToDecodeQueue(
875 const PrioritizedTile& prioritized_tile, 878 const PrioritizedTile& prioritized_tile,
876 const gfx::ColorSpace& raster_color_space, 879 const gfx::ColorSpace& raster_color_space,
880 CheckerImageTracker::DecodeType decode_type,
877 CheckerImageTracker::ImageDecodeQueue* image_decode_queue) { 881 CheckerImageTracker::ImageDecodeQueue* image_decode_queue) {
878 Tile* tile = prioritized_tile.tile(); 882 Tile* tile = prioritized_tile.tile();
879 std::vector<DrawImage> images_in_tile; 883 std::vector<DrawImage> images_in_tile;
880 prioritized_tile.raster_source()->GetDiscardableImagesInRect( 884 prioritized_tile.raster_source()->GetDiscardableImagesInRect(
881 tile->enclosing_layer_rect(), tile->raster_transform().scale(), 885 tile->enclosing_layer_rect(), tile->raster_transform().scale(),
882 raster_color_space, &images_in_tile); 886 raster_color_space, &images_in_tile);
883 WhichTree tree = tile->tiling()->tree(); 887 WhichTree tree = tile->tiling()->tree();
884 888
885 for (auto& draw_image : images_in_tile) { 889 for (auto& draw_image : images_in_tile) {
886 if (checker_image_tracker_.ShouldCheckerImage(draw_image, tree)) 890 if (checker_image_tracker_.ShouldCheckerImage(draw_image, tree)) {
887 image_decode_queue->push_back(draw_image.paint_image()); 891 image_decode_queue->push_back(CheckerImageTracker::ImageDecodeRequest(
892 draw_image.paint_image(), decode_type));
893 }
888 } 894 }
889 } 895 }
890 896
891 void TileManager::ScheduleTasks( 897 void TileManager::ScheduleTasks(PrioritizedWorkToSchedule work_to_schedule) {
892 const PrioritizedWorkToSchedule& work_to_schedule) {
893 const std::vector<PrioritizedTile>& tiles_that_need_to_be_rasterized = 898 const std::vector<PrioritizedTile>& tiles_that_need_to_be_rasterized =
894 work_to_schedule.tiles_to_raster; 899 work_to_schedule.tiles_to_raster;
895 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", "count", 900 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", "count",
896 tiles_that_need_to_be_rasterized.size()); 901 tiles_that_need_to_be_rasterized.size());
897 902
898 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); 903 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
899 904
900 if (!has_scheduled_tile_tasks_) { 905 if (!has_scheduled_tile_tasks_) {
901 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); 906 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
902 } 907 }
903 908
909 // Ensure that we don't schedule any decode work for checkered images until
910 // the raster work for visible tiles is done.
911 checker_image_tracker_.SetCanScheduleDecodeType(
912 CheckerImageTracker::DecodeType::kNone);
vmpstr 2017/06/20 18:41:01 Maybe just renaming this to AllowedDecodeType or s
Khushal 2017/06/21 03:35:57 This is also used when specifying the DecodeType i
913
904 // Cancel existing OnTaskSetFinished callbacks. 914 // Cancel existing OnTaskSetFinished callbacks.
905 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 915 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
906 916
907 // Even when scheduling an empty set of tiles, the TTWP does some work, and 917 // Even when scheduling an empty set of tiles, the TTWP does some work, and
908 // will always trigger a DidFinishRunningTileTasks notification. Because of 918 // will always trigger a DidFinishRunningTileTasks notification. Because of
909 // this we unconditionally set |has_scheduled_tile_tasks_| to true. 919 // this we unconditionally set |has_scheduled_tile_tasks_| to true.
910 has_scheduled_tile_tasks_ = true; 920 has_scheduled_tile_tasks_ = true;
911 921
912 // Track the number of dependents for each *_done task. 922 // Track the number of dependents for each *_done task.
913 size_t required_for_activate_count = 0; 923 size_t required_for_activate_count = 0;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
962 tile->required_for_draw() || tile->required_for_activation() || 972 tile->required_for_draw() || tile->required_for_activation() ||
963 prioritized_tile.priority().priority_bin == TilePriority::NOW; 973 prioritized_tile.priority().priority_bin == TilePriority::NOW;
964 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++, 974 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++,
965 use_foreground_category); 975 use_foreground_category);
966 } 976 }
967 977
968 const std::vector<PrioritizedTile>& tiles_to_process_for_images = 978 const std::vector<PrioritizedTile>& tiles_to_process_for_images =
969 work_to_schedule.tiles_to_process_for_images; 979 work_to_schedule.tiles_to_process_for_images;
970 std::vector<DrawImage> new_locked_images; 980 std::vector<DrawImage> new_locked_images;
971 for (const PrioritizedTile& prioritized_tile : tiles_to_process_for_images) { 981 for (const PrioritizedTile& prioritized_tile : tiles_to_process_for_images) {
972 Tile* tile = prioritized_tile.tile(); 982 std::vector<DrawImage> sync_decoded_images;
983 std::vector<PaintImage> checkered_images;
984 PartitionImagesForCheckering(prioritized_tile, raster_color_space,
985 &sync_decoded_images, &checkered_images);
973 986
974 // TODO(khushalsagar): Send these images to the ImageDecodeService, through 987 // Add the sync decoded images to |new_locked_images| so they can be added
975 // the CheckerImageTracker as well. See crbug.com/691087. 988 // to the task graph.
976 std::vector<DrawImage> images; 989 new_locked_images.insert(new_locked_images.end(),
977 prioritized_tile.raster_source()->GetDiscardableImagesInRect( 990 sync_decoded_images.begin(),
978 tile->enclosing_layer_rect(), tile->raster_transform().scale(), 991 sync_decoded_images.end());
979 raster_color_space, &images); 992
980 new_locked_images.insert(new_locked_images.end(), images.begin(), 993 // For checkered-images, send them to the decode service.
981 images.end()); 994 for (auto& image : checkered_images) {
995 work_to_schedule.checker_image_decode_queue.push_back(
996 CheckerImageTracker::ImageDecodeRequest(
997 std::move(image), CheckerImageTracker::DecodeType::kPreDecode));
998 }
982 } 999 }
983 1000
984 // TODO(vmpstr): SOON is misleading here, but these images can come from 1001 // TODO(vmpstr): SOON is misleading here, but these images can come from
985 // several diffent tiles. Rethink what we actually want to trace here. Note 1002 // several diffent tiles. Rethink what we actually want to trace here. Note
986 // that I'm using SOON, since it can't be NOW (these are prepaint). 1003 // that I'm using SOON, since it can't be NOW (these are prepaint).
987 ImageDecodeCache::TracingInfo tracing_info( 1004 ImageDecodeCache::TracingInfo tracing_info(
988 prepare_tiles_count_, TilePriority::SOON, 1005 prepare_tiles_count_, TilePriority::SOON,
989 ImageDecodeCache::TaskType::kInRaster); 1006 ImageDecodeCache::TaskType::kInRaster);
990 std::vector<scoped_refptr<TileTask>> new_locked_image_tasks = 1007 std::vector<scoped_refptr<TileTask>> new_locked_image_tasks =
991 image_controller_.SetPredecodeImages(std::move(new_locked_images), 1008 image_controller_.SetPredecodeImages(std::move(new_locked_images),
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1096 std::vector<PaintImage> checkered_images; 1113 std::vector<PaintImage> checkered_images;
1097 PartitionImagesForCheckering(prioritized_tile, color_space, 1114 PartitionImagesForCheckering(prioritized_tile, color_space,
1098 &sync_decoded_images, &checkered_images); 1115 &sync_decoded_images, &checkered_images);
1099 for (const auto& image : checkered_images) { 1116 for (const auto& image : checkered_images) {
1100 playback_settings.images_to_skip.insert(image.sk_image()->uniqueID()); 1117 playback_settings.images_to_skip.insert(image.sk_image()->uniqueID());
1101 1118
1102 // This can be the case for tiles on the active tree that will be replaced 1119 // This can be the case for tiles on the active tree that will be replaced
1103 // or are occluded on the pending tree. While we still need to continue 1120 // or are occluded on the pending tree. While we still need to continue
1104 // skipping images for these tiles, we don't need to decode them since 1121 // skipping images for these tiles, we don't need to decode them since
1105 // they will not be required on the next active tree. 1122 // they will not be required on the next active tree.
1106 if (prioritized_tile.should_decode_checkered_images_for_tile()) 1123 if (prioritized_tile.should_decode_checkered_images_for_tile())
vmpstr 2017/06/20 18:41:01 nit: braces
Khushal 2017/06/21 03:35:57 Done.
1107 checker_image_decode_queue->push_back(image); 1124 checker_image_decode_queue->push_back(
1125 CheckerImageTracker::ImageDecodeRequest(
1126 image, CheckerImageTracker::DecodeType::kRaster));
1108 } 1127 }
1109 } 1128 }
1110 1129
1111 // We can skip the image hijack canvas if we have no images, or no images to 1130 // We can skip the image hijack canvas if we have no images, or no images to
1112 // skip during raster. 1131 // skip during raster.
1113 playback_settings.use_image_hijack_canvas = 1132 playback_settings.use_image_hijack_canvas =
1114 !sync_decoded_images.empty() || !playback_settings.images_to_skip.empty(); 1133 !sync_decoded_images.empty() || !playback_settings.images_to_skip.empty();
1115 1134
1116 bool has_checker_images = !playback_settings.images_to_skip.empty(); 1135 bool has_checker_images = !playback_settings.images_to_skip.empty();
1117 tile->set_raster_task_scheduled_with_checker_images(has_checker_images); 1136 tile->set_raster_task_scheduled_with_checker_images(has_checker_images);
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1296 !signals_.did_notify_all_tile_tasks_completed) { 1315 !signals_.did_notify_all_tile_tasks_completed) {
1297 signals_.all_tile_tasks_completed = false; 1316 signals_.all_tile_tasks_completed = false;
1298 if (!has_scheduled_tile_tasks_) { 1317 if (!has_scheduled_tile_tasks_) {
1299 TRACE_EVENT0( 1318 TRACE_EVENT0(
1300 TRACE_DISABLED_BY_DEFAULT("cc.debug"), 1319 TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1301 "TileManager::CheckAndIssueSignals - all tile tasks completed"); 1320 "TileManager::CheckAndIssueSignals - all tile tasks completed");
1302 signals_.did_notify_all_tile_tasks_completed = true; 1321 signals_.did_notify_all_tile_tasks_completed = true;
1303 client_->NotifyAllTileTasksCompleted(); 1322 client_->NotifyAllTileTasksCompleted();
1304 } 1323 }
1305 } 1324 }
1325
1326 // Allow decodes for rasterized tiles if all required for draw/activate tiles
1327 // are done. And pre-decode tiles once all tile tasks are done.
1328 CheckerImageTracker::DecodeType decode_type =
vmpstr 2017/06/20 18:41:01 Do we need this to be strictly in CheckAndIssueSig
Khushal 2017/06/21 03:35:57 There can be a race between the DidFinish* task ru
1329 CheckerImageTracker::DecodeType::kNone;
1330 if (signals_.did_notify_all_tile_tasks_completed) {
1331 decode_type = CheckerImageTracker::DecodeType::kPreDecode;
1332 } else if (signals_.did_notify_ready_to_activate &&
1333 signals_.did_notify_ready_to_draw) {
1334 decode_type = CheckerImageTracker::DecodeType::kRaster;
1335 }
1336 checker_image_tracker_.SetCanScheduleDecodeType(decode_type);
1306 } 1337 }
1307 1338
1308 void TileManager::CheckIfMoreTilesNeedToBePrepared() { 1339 void TileManager::CheckIfMoreTilesNeedToBePrepared() {
1309 tile_task_manager_->CheckForCompletedTasks(); 1340 tile_task_manager_->CheckForCompletedTasks();
1310 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 1341 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
1311 1342
1312 // When OOM, keep re-assigning memory until we reach a steady state 1343 // When OOM, keep re-assigning memory until we reach a steady state
1313 // where top-priority tiles are initialized. 1344 // where top-priority tiles are initialized.
1314 PrioritizedWorkToSchedule work_to_schedule = AssignGpuMemoryToTiles(); 1345 PrioritizedWorkToSchedule work_to_schedule = AssignGpuMemoryToTiles();
1315 1346
1316 // Inform the client that will likely require a draw if the highest priority 1347 // Inform the client that will likely require a draw if the highest priority
1317 // tile that will be rasterized is required for draw. 1348 // tile that will be rasterized is required for draw.
1318 client_->SetIsLikelyToRequireADraw( 1349 client_->SetIsLikelyToRequireADraw(
1319 !work_to_schedule.tiles_to_raster.empty() && 1350 !work_to_schedule.tiles_to_raster.empty() &&
1320 work_to_schedule.tiles_to_raster.front().tile()->required_for_draw()); 1351 work_to_schedule.tiles_to_raster.front().tile()->required_for_draw());
1321 1352
1322 // |tiles_that_need_to_be_rasterized| will be empty when we reach a 1353 // |tiles_that_need_to_be_rasterized| will be empty when we reach a
1323 // steady memory state. Keep scheduling tasks until we reach this state. 1354 // steady memory state. Keep scheduling tasks until we reach this state.
1324 if (!work_to_schedule.tiles_to_raster.empty()) { 1355 if (!work_to_schedule.tiles_to_raster.empty()) {
1325 ScheduleTasks(work_to_schedule); 1356 ScheduleTasks(std::move(work_to_schedule));
1326 return; 1357 return;
1327 } 1358 }
1328 1359
1329 // If we're not in SMOOTHNESS_TAKES_PRIORITY mode, we should unlock all 1360 // If we're not in SMOOTHNESS_TAKES_PRIORITY mode, we should unlock all
1330 // images since we're technically going idle here at least for this frame. 1361 // images since we're technically going idle here at least for this frame.
1331 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) { 1362 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) {
1332 image_controller_.SetPredecodeImages(std::vector<DrawImage>(), 1363 image_controller_.SetPredecodeImages(std::vector<DrawImage>(),
1333 ImageDecodeCache::TracingInfo()); 1364 ImageDecodeCache::TracingInfo());
1334 locked_image_tasks_.clear(); 1365 locked_image_tasks_.clear();
1335 } 1366 }
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
1656 all_tile_tasks_completed = false; 1687 all_tile_tasks_completed = false;
1657 did_notify_all_tile_tasks_completed = false; 1688 did_notify_all_tile_tasks_completed = false;
1658 } 1689 }
1659 1690
1660 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; 1691 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default;
1661 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( 1692 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule(
1662 PrioritizedWorkToSchedule&& other) = default; 1693 PrioritizedWorkToSchedule&& other) = default;
1663 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; 1694 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default;
1664 1695
1665 } // namespace cc 1696 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698