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

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

Issue 2345833002: cc: Move (partially) the predecode image tracking to ImageManager. (Closed)
Patch Set: Created 4 years, 3 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
« cc/tiles/image_manager.cc ('K') | « cc/tiles/tile_manager.h ('k') | no next file » | 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 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 354
355 FreeResourcesForReleasedTiles(); 355 FreeResourcesForReleasedTiles();
356 CleanUpReleasedTiles(); 356 CleanUpReleasedTiles();
357 357
358 tile_task_manager_ = nullptr; 358 tile_task_manager_ = nullptr;
359 resource_pool_ = nullptr; 359 resource_pool_ = nullptr;
360 more_tiles_need_prepare_check_notifier_.Cancel(); 360 more_tiles_need_prepare_check_notifier_.Cancel();
361 signals_check_notifier_.Cancel(); 361 signals_check_notifier_.Cancel();
362 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 362 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
363 363
364 image_manager_.UnrefImages(locked_images_); 364 image_manager_.SetImageDecodeController(nullptr);
365 locked_images_.clear();
366 locked_image_tasks_.clear(); 365 locked_image_tasks_.clear();
367 } 366 }
368 367
369 void TileManager::SetResources(ResourcePool* resource_pool, 368 void TileManager::SetResources(ResourcePool* resource_pool,
370 ImageDecodeController* image_decode_controller, 369 ImageDecodeController* image_decode_controller,
371 TileTaskManager* tile_task_manager, 370 TileTaskManager* tile_task_manager,
372 RasterBufferProvider* raster_buffer_provider, 371 RasterBufferProvider* raster_buffer_provider,
373 size_t scheduled_raster_task_limit, 372 size_t scheduled_raster_task_limit,
374 bool use_gpu_rasterization) { 373 bool use_gpu_rasterization) {
375 DCHECK(!tile_task_manager_); 374 DCHECK(!tile_task_manager_);
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 bool use_foreground_category = 829 bool use_foreground_category =
831 tile->required_for_draw() || tile->required_for_activation() || 830 tile->required_for_draw() || tile->required_for_activation() ||
832 prioritized_tile.priority().priority_bin == TilePriority::NOW; 831 prioritized_tile.priority().priority_bin == TilePriority::NOW;
833 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++, 832 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++,
834 use_foreground_category); 833 use_foreground_category);
835 } 834 }
836 835
837 const std::vector<PrioritizedTile>& tiles_to_process_for_images = 836 const std::vector<PrioritizedTile>& tiles_to_process_for_images =
838 work_to_schedule.tiles_to_process_for_images; 837 work_to_schedule.tiles_to_process_for_images;
839 std::vector<DrawImage> new_locked_images; 838 std::vector<DrawImage> new_locked_images;
840 std::vector<scoped_refptr<TileTask>> new_locked_image_tasks;
841 for (const PrioritizedTile& prioritized_tile : tiles_to_process_for_images) { 839 for (const PrioritizedTile& prioritized_tile : tiles_to_process_for_images) {
842 Tile* tile = prioritized_tile.tile(); 840 Tile* tile = prioritized_tile.tile();
843 841
844 std::vector<DrawImage> images; 842 std::vector<DrawImage> images;
845 prioritized_tile.raster_source()->GetDiscardableImagesInRect( 843 prioritized_tile.raster_source()->GetDiscardableImagesInRect(
846 tile->enclosing_layer_rect(), tile->contents_scale(), &images); 844 tile->enclosing_layer_rect(), tile->contents_scale(), &images);
847 ImageDecodeController::TracingInfo tracing_info(
848 prepare_tiles_count_, prioritized_tile.priority().priority_bin);
849 image_manager_.GetTasksForImagesAndRef(&images, &new_locked_image_tasks,
850 tracing_info);
851 new_locked_images.insert(new_locked_images.end(), images.begin(), 845 new_locked_images.insert(new_locked_images.end(), images.begin(),
852 images.end()); 846 images.end());
853 } 847 }
854 848
849 // TODO(vmpstr): SOON is misleading here, but these images can come from
850 // several diffent tiles. Rethink what we actually want to trace here. Note
851 // that I'm using SOON, since it can't be NOW (these are prepaint).
852 ImageDecodeController::TracingInfo tracing_info(prepare_tiles_count_,
853 TilePriority::SOON);
854 std::vector<scoped_refptr<TileTask>> new_locked_image_tasks =
855 image_manager_.SetPredecodeImages(std::move(new_locked_images),
856 tracing_info);
857
855 for (auto& task : new_locked_image_tasks) { 858 for (auto& task : new_locked_image_tasks) {
856 auto decode_it = std::find_if(graph_.nodes.begin(), graph_.nodes.end(), 859 auto decode_it = std::find_if(graph_.nodes.begin(), graph_.nodes.end(),
857 [&task](const TaskGraph::Node& node) { 860 [&task](const TaskGraph::Node& node) {
858 return node.task == task.get(); 861 return node.task == task.get();
859 }); 862 });
860 // If this task is already in the graph, then we don't have to insert it. 863 // If this task is already in the graph, then we don't have to insert it.
861 if (decode_it != graph_.nodes.end()) 864 if (decode_it != graph_.nodes.end())
862 continue; 865 continue;
863 866
864 InsertNodeForDecodeTask(&graph_, task.get(), false, priority++); 867 InsertNodeForDecodeTask(&graph_, task.get(), false, priority++);
865 all_count++; 868 all_count++;
866 graph_.edges.push_back(TaskGraph::Edge(task.get(), all_done_task.get())); 869 graph_.edges.push_back(TaskGraph::Edge(task.get(), all_done_task.get()));
867 } 870 }
868 871
869 image_manager_.UnrefImages(locked_images_); 872 // The old locked images tasks have to stay around until past the
870 // The old locked images have to stay around until past the ScheduleTasks call 873 // ScheduleTasks call below, so we do a swap instead of a move.
871 // below, so we do a swap instead of a move. 874 // TODO(crbug.com/647402): Have the tile_task_manager keep a ref on the tasks,
872 locked_images_.swap(new_locked_images); 875 // since it makes it awkward for the callers to keep refs on tasks that only
876 // exist within the task graph runner.
873 locked_image_tasks_.swap(new_locked_image_tasks); 877 locked_image_tasks_.swap(new_locked_image_tasks);
874 878
875 // We must reduce the amount of unused resources before calling 879 // We must reduce the amount of unused resources before calling
876 // ScheduleTasks to prevent usage from rising above limits. 880 // ScheduleTasks to prevent usage from rising above limits.
877 resource_pool_->ReduceResourceUsage(); 881 resource_pool_->ReduceResourceUsage();
878 image_manager_.ReduceMemoryUsage(); 882 image_manager_.ReduceMemoryUsage();
879 883
880 // Insert nodes for our task completion tasks. We enqueue these using 884 // Insert nodes for our task completion tasks. We enqueue these using
881 // NONCONCURRENT_FOREGROUND category this is the highest prioirty category and 885 // NONCONCURRENT_FOREGROUND category this is the highest prioirty category and
882 // we'd like to run these tasks as soon as possible. 886 // we'd like to run these tasks as soon as possible.
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
981 DCHECK(tiles_.find(tile->id()) != tiles_.end()); 985 DCHECK(tiles_.find(tile->id()) != tiles_.end());
982 raster_buffer_provider_->ReleaseBufferForRaster(std::move(raster_buffer)); 986 raster_buffer_provider_->ReleaseBufferForRaster(std::move(raster_buffer));
983 987
984 TileDrawInfo& draw_info = tile->draw_info(); 988 TileDrawInfo& draw_info = tile->draw_info();
985 DCHECK(tile->raster_task_.get()); 989 DCHECK(tile->raster_task_.get());
986 orphan_tasks_.push_back(tile->raster_task_); 990 orphan_tasks_.push_back(tile->raster_task_);
987 tile->raster_task_ = nullptr; 991 tile->raster_task_ = nullptr;
988 992
989 // Unref all the images. 993 // Unref all the images.
990 auto images_it = scheduled_draw_images_.find(tile->id()); 994 auto images_it = scheduled_draw_images_.find(tile->id());
991 const std::vector<DrawImage>& images = images_it->second; 995 image_manager_.UnrefImages(images_it->second);
992 image_manager_.UnrefImages(images);
993 scheduled_draw_images_.erase(images_it); 996 scheduled_draw_images_.erase(images_it);
994 997
995 if (was_canceled) { 998 if (was_canceled) {
996 ++flush_stats_.canceled_count; 999 ++flush_stats_.canceled_count;
997 resource_pool_->ReleaseResource(resource); 1000 resource_pool_->ReleaseResource(resource);
998 return; 1001 return;
999 } 1002 }
1000 1003
1001 resource_pool_->OnContentReplaced(resource->id(), tile->id()); 1004 resource_pool_->OnContentReplaced(resource->id(), tile->id());
1002 ++flush_stats_.completed_count; 1005 ++flush_stats_.completed_count;
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1132 // |tiles_that_need_to_be_rasterized| will be empty when we reach a 1135 // |tiles_that_need_to_be_rasterized| will be empty when we reach a
1133 // steady memory state. Keep scheduling tasks until we reach this state. 1136 // steady memory state. Keep scheduling tasks until we reach this state.
1134 if (!work_to_schedule.tiles_to_raster.empty()) { 1137 if (!work_to_schedule.tiles_to_raster.empty()) {
1135 ScheduleTasks(work_to_schedule); 1138 ScheduleTasks(work_to_schedule);
1136 return; 1139 return;
1137 } 1140 }
1138 1141
1139 // If we're not in SMOOTHNESS_TAKES_PRIORITY mode, we should unlock all 1142 // If we're not in SMOOTHNESS_TAKES_PRIORITY mode, we should unlock all
1140 // images since we're technically going idle here at least for this frame. 1143 // images since we're technically going idle here at least for this frame.
1141 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) { 1144 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) {
1142 image_manager_.UnrefImages(locked_images_); 1145 image_manager_.SetPredecodeImages(std::vector<DrawImage>(),
1143 locked_images_.clear(); 1146 ImageDecodeController::TracingInfo());
1144 locked_image_tasks_.clear(); 1147 locked_image_tasks_.clear();
1145 } 1148 }
1146 1149
1147 FreeResourcesForReleasedTiles(); 1150 FreeResourcesForReleasedTiles();
1148 1151
1149 resource_pool_->ReduceResourceUsage(); 1152 resource_pool_->ReduceResourceUsage();
1150 image_manager_.ReduceMemoryUsage(); 1153 image_manager_.ReduceMemoryUsage();
1151 1154
1152 signals_.all_tile_tasks_completed = true; 1155 signals_.all_tile_tasks_completed = true;
1153 signals_check_notifier_.Schedule(); 1156 signals_check_notifier_.Schedule();
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1314 all_tile_tasks_completed = false; 1317 all_tile_tasks_completed = false;
1315 did_notify_all_tile_tasks_completed = false; 1318 did_notify_all_tile_tasks_completed = false;
1316 } 1319 }
1317 1320
1318 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; 1321 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default;
1319 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( 1322 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule(
1320 PrioritizedWorkToSchedule&& other) = default; 1323 PrioritizedWorkToSchedule&& other) = default;
1321 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; 1324 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default;
1322 1325
1323 } // namespace cc 1326 } // namespace cc
OLDNEW
« cc/tiles/image_manager.cc ('K') | « cc/tiles/tile_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698