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

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

Issue 1418573002: cc: Add image decode control in the compositor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years 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 <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 10
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 315
316 tile_task_runner_ = nullptr; 316 tile_task_runner_ = nullptr;
317 resource_pool_ = nullptr; 317 resource_pool_ = nullptr;
318 more_tiles_need_prepare_check_notifier_.Cancel(); 318 more_tiles_need_prepare_check_notifier_.Cancel();
319 signals_check_notifier_.Cancel(); 319 signals_check_notifier_.Cancel();
320 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 320 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
321 } 321 }
322 322
323 void TileManager::SetResources(ResourcePool* resource_pool, 323 void TileManager::SetResources(ResourcePool* resource_pool,
324 TileTaskRunner* tile_task_runner, 324 TileTaskRunner* tile_task_runner,
325 size_t scheduled_raster_task_limit) { 325 size_t scheduled_raster_task_limit,
326 bool is_using_gpu_rasterization) {
326 DCHECK(!tile_task_runner_); 327 DCHECK(!tile_task_runner_);
327 DCHECK(tile_task_runner); 328 DCHECK(tile_task_runner);
328 329
329 scheduled_raster_task_limit_ = scheduled_raster_task_limit; 330 scheduled_raster_task_limit_ = scheduled_raster_task_limit;
330 resource_pool_ = resource_pool; 331 resource_pool_ = resource_pool;
331 tile_task_runner_ = tile_task_runner; 332 tile_task_runner_ = tile_task_runner;
333 image_decode_controller_.SetIsUsingGpuRasterization(
334 is_using_gpu_rasterization);
332 } 335 }
333 336
334 void TileManager::Release(Tile* tile) { 337 void TileManager::Release(Tile* tile) {
335 released_tiles_.push_back(tile); 338 released_tiles_.push_back(tile);
336 } 339 }
337 340
338 void TileManager::FreeResourcesForReleasedTiles() { 341 void TileManager::FreeResourcesForReleasedTiles() {
339 for (auto* tile : released_tiles_) 342 for (auto* tile : released_tiles_)
340 FreeResourcesForTile(tile); 343 FreeResourcesForTile(tile);
341 } 344 }
342 345
343 void TileManager::CleanUpReleasedTiles() { 346 void TileManager::CleanUpReleasedTiles() {
344 std::vector<Tile*> tiles_to_retain; 347 std::vector<Tile*> tiles_to_retain;
345 for (auto* tile : released_tiles_) { 348 for (auto* tile : released_tiles_) {
346 if (tile->HasRasterTask()) { 349 if (tile->HasRasterTask()) {
347 tiles_to_retain.push_back(tile); 350 tiles_to_retain.push_back(tile);
348 continue; 351 continue;
349 } 352 }
350 353
351 DCHECK(!tile->draw_info().has_resource()); 354 DCHECK(!tile->draw_info().has_resource());
352 DCHECK(tiles_.find(tile->id()) != tiles_.end()); 355 DCHECK(tiles_.find(tile->id()) != tiles_.end());
353 tiles_.erase(tile->id()); 356 tiles_.erase(tile->id());
354 357
355 image_decode_controller_.SubtractLayerUsedCount(tile->layer_id());
356 delete tile; 358 delete tile;
357 } 359 }
358 released_tiles_.swap(tiles_to_retain); 360 released_tiles_.swap(tiles_to_retain);
359 } 361 }
360 362
361 void TileManager::DidFinishRunningTileTasksRequiredForActivation() { 363 void TileManager::DidFinishRunningTileTasksRequiredForActivation() {
362 TRACE_EVENT0("cc", 364 TRACE_EVENT0("cc",
363 "TileManager::DidFinishRunningTileTasksRequiredForActivation"); 365 "TileManager::DidFinishRunningTileTasksRequiredForActivation");
364 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", 366 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
365 ScheduledTasksStateAsValue()); 367 ScheduledTasksStateAsValue());
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
715 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); 717 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks);
716 718
717 // Build a new task queue containing all task currently needed. Tasks 719 // Build a new task queue containing all task currently needed. Tasks
718 // are added in order of priority, highest priority task first. 720 // are added in order of priority, highest priority task first.
719 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { 721 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) {
720 Tile* tile = prioritized_tile.tile(); 722 Tile* tile = prioritized_tile.tile();
721 723
722 DCHECK(tile->draw_info().requires_resource()); 724 DCHECK(tile->draw_info().requires_resource());
723 DCHECK(!tile->draw_info().resource_); 725 DCHECK(!tile->draw_info().resource_);
724 726
725 if (!tile->raster_task_) { 727 if (!tile->raster_task_)
726 tile->raster_task_ = CreateRasterTask(prioritized_tile); 728 tile->raster_task_ = CreateRasterTask(prioritized_tile);
727 }
728 729
729 RasterTask* task = tile->raster_task_.get(); 730 RasterTask* task = tile->raster_task_.get();
730 DCHECK(!task->HasCompleted()); 731 DCHECK(!task->HasCompleted());
731 732
732 if (!tile->raster_task_.get())
733 tile->raster_task_ = CreateRasterTask(prioritized_tile);
734
735 if (tile->required_for_activation()) { 733 if (tile->required_for_activation()) {
736 required_for_activate_count++; 734 required_for_activate_count++;
737 graph_.edges.push_back( 735 graph_.edges.push_back(
738 TaskGraph::Edge(task, required_for_activation_done_task.get())); 736 TaskGraph::Edge(task, required_for_activation_done_task.get()));
739 } 737 }
740 if (tile->required_for_draw()) { 738 if (tile->required_for_draw()) {
741 required_for_draw_count++; 739 required_for_draw_count++;
742 graph_.edges.push_back( 740 graph_.edges.push_back(
743 TaskGraph::Edge(task, required_for_draw_done_task.get())); 741 TaskGraph::Edge(task, required_for_draw_done_task.get()));
744 } 742 }
745 all_count++; 743 all_count++;
746 graph_.edges.push_back(TaskGraph::Edge(task, all_done_task.get())); 744 graph_.edges.push_back(TaskGraph::Edge(task, all_done_task.get()));
747 745
748 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++); 746 InsertNodesForRasterTask(&graph_, task, task->dependencies(), priority++);
749 } 747 }
750 748
751 InsertNodeForTask(&graph_, required_for_activation_done_task.get(), 749 InsertNodeForTask(&graph_, required_for_activation_done_task.get(),
752 kRequiredForActivationDoneTaskPriority, 750 kRequiredForActivationDoneTaskPriority,
753 required_for_activate_count); 751 required_for_activate_count);
754 InsertNodeForTask(&graph_, required_for_draw_done_task.get(), 752 InsertNodeForTask(&graph_, required_for_draw_done_task.get(),
755 kRequiredForDrawDoneTaskPriority, required_for_draw_count); 753 kRequiredForDrawDoneTaskPriority, required_for_draw_count);
756 InsertNodeForTask(&graph_, all_done_task.get(), kAllDoneTaskPriority, 754 InsertNodeForTask(&graph_, all_done_task.get(), kAllDoneTaskPriority,
757 all_count); 755 all_count);
758 756
759 // We must reduce the amount of unused resoruces before calling 757 // We must reduce the amount of unused resoruces before calling
760 // ScheduleTasks to prevent usage from rising above limits. 758 // ScheduleTasks to prevent usage from rising above limits.
761 resource_pool_->ReduceResourceUsage(); 759 resource_pool_->ReduceResourceUsage();
760 image_decode_controller_.ReduceCacheUsage();
762 761
763 // Schedule running of |raster_queue_|. This replaces any previously 762 // Schedule running of |raster_queue_|. This replaces any previously
764 // scheduled tasks and effectively cancels all tasks not present 763 // scheduled tasks and effectively cancels all tasks not present
765 // in |raster_queue_|. 764 // in |raster_queue_|.
766 tile_task_runner_->ScheduleTasks(&graph_); 765 tile_task_runner_->ScheduleTasks(&graph_);
767 766
768 // It's now safe to clean up orphan tasks as raster worker pool is not 767 // It's now safe to clean up orphan tasks as raster worker pool is not
769 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has 768 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has
770 // been called. 769 // been called.
771 orphan_tasks_.clear(); 770 orphan_tasks_.clear();
772 771
773 // It's also now safe to replace our *_done_task_ tasks. 772 // It's also now safe to replace our *_done_task_ tasks.
774 required_for_activation_done_task_ = 773 required_for_activation_done_task_ =
775 std::move(required_for_activation_done_task); 774 std::move(required_for_activation_done_task);
776 required_for_draw_done_task_ = std::move(required_for_draw_done_task); 775 required_for_draw_done_task_ = std::move(required_for_draw_done_task);
777 all_done_task_ = std::move(all_done_task); 776 all_done_task_ = std::move(all_done_task);
778 777
779 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 778 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
780 779
781 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", 780 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
782 ScheduledTasksStateAsValue()); 781 ScheduledTasksStateAsValue());
783 } 782 }
784 783
785 scoped_refptr<RasterTask> TileManager::CreateRasterTask( 784 scoped_refptr<RasterTask> TileManager::CreateRasterTask(
786 const PrioritizedTile& prioritized_tile) { 785 const PrioritizedTile& prioritized_tile) {
787 Tile* tile = prioritized_tile.tile(); 786 Tile* tile = prioritized_tile.tile();
787
788 // Get the resource.
788 uint64_t resource_content_id = 0; 789 uint64_t resource_content_id = 0;
789 Resource* resource = nullptr; 790 Resource* resource = nullptr;
790 if (use_partial_raster_ && tile->invalidated_id()) { 791 if (use_partial_raster_ && tile->invalidated_id()) {
791 // TODO(danakj): For resources that are in use, we should still grab them 792 // TODO(danakj): For resources that are in use, we should still grab them
792 // and copy from them instead of rastering everything. crbug.com/492754 793 // and copy from them instead of rastering everything. crbug.com/492754
793 resource = 794 resource =
794 resource_pool_->TryAcquireResourceWithContentId(tile->invalidated_id()); 795 resource_pool_->TryAcquireResourceWithContentId(tile->invalidated_id());
795 } 796 }
796 if (resource) { 797 if (resource) {
797 resource_content_id = tile->invalidated_id(); 798 resource_content_id = tile->invalidated_id();
798 DCHECK_EQ(DetermineResourceFormat(tile), resource->format()); 799 DCHECK_EQ(DetermineResourceFormat(tile), resource->format());
799 DCHECK_EQ(tile->desired_texture_size().ToString(), 800 DCHECK_EQ(tile->desired_texture_size().ToString(),
800 resource->size().ToString()); 801 resource->size().ToString());
801 } else { 802 } else {
802 resource = resource_pool_->AcquireResource(tile->desired_texture_size(), 803 resource = resource_pool_->AcquireResource(tile->desired_texture_size(),
803 DetermineResourceFormat(tile)); 804 DetermineResourceFormat(tile));
804 } 805 }
805 806
806 // Create and queue all image decode tasks that this tile depends on. 807 // Create and queue all image decode tasks that this tile depends on.
807 ImageDecodeTask::Vector decode_tasks; 808 ImageDecodeTask::Vector decode_tasks;
808 std::vector<DrawImage> images; 809 std::vector<DrawImage>& images = scheduled_draw_images_[tile->id()];
810 images.clear();
809 prioritized_tile.raster_source()->GetDiscardableImagesInRect( 811 prioritized_tile.raster_source()->GetDiscardableImagesInRect(
810 tile->enclosing_layer_rect(), tile->contents_scale(), &images); 812 tile->enclosing_layer_rect(), tile->contents_scale(), &images);
811 for (const auto& image : images) { 813 for (auto it = images.begin(); it != images.end();) {
812 decode_tasks.push_back(image_decode_controller_.GetTaskForImage( 814 scoped_refptr<ImageDecodeTask> task;
813 image, tile->layer_id(), prepare_tiles_count_)); 815 bool need_to_unref_when_finished =
816 image_decode_controller_.GetTaskForImageAndRef(
817 *it, prepare_tiles_count_, &task);
818 if (task)
819 decode_tasks.push_back(task);
820
821 if (need_to_unref_when_finished)
822 ++it;
823 else
824 it = images.erase(it);
814 } 825 }
815 826
816 return make_scoped_refptr(new RasterTaskImpl( 827 return make_scoped_refptr(new RasterTaskImpl(
817 resource, prioritized_tile.raster_source(), tile->content_rect(), 828 resource, prioritized_tile.raster_source(), tile->content_rect(),
818 tile->invalidated_content_rect(), tile->contents_scale(), 829 tile->invalidated_content_rect(), tile->contents_scale(),
819 prioritized_tile.priority().resolution, tile->layer_id(), 830 prioritized_tile.priority().resolution, tile->layer_id(),
820 prepare_tiles_count_, static_cast<const void*>(tile), tile->id(), 831 prepare_tiles_count_, static_cast<const void*>(tile), tile->id(),
821 tile->invalidated_id(), resource_content_id, tile->source_frame_number(), 832 tile->invalidated_id(), resource_content_id, tile->source_frame_number(),
822 tile->use_picture_analysis(), 833 tile->use_picture_analysis(),
823 base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this), 834 base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this),
824 tile->id(), resource), 835 tile->id(), resource),
825 &decode_tasks)); 836 &decode_tasks));
826 } 837 }
827 838
828 void TileManager::OnRasterTaskCompleted( 839 void TileManager::OnRasterTaskCompleted(
829 Tile::Id tile_id, 840 Tile::Id tile_id,
830 Resource* resource, 841 Resource* resource,
831 const DisplayListRasterSource::SolidColorAnalysis& analysis, 842 const DisplayListRasterSource::SolidColorAnalysis& analysis,
832 bool was_canceled) { 843 bool was_canceled) {
833 DCHECK(tiles_.find(tile_id) != tiles_.end()); 844 DCHECK(tiles_.find(tile_id) != tiles_.end());
834 845
835 Tile* tile = tiles_[tile_id]; 846 Tile* tile = tiles_[tile_id];
836 DCHECK(tile->raster_task_.get()); 847 DCHECK(tile->raster_task_.get());
837 orphan_tasks_.push_back(tile->raster_task_); 848 orphan_tasks_.push_back(tile->raster_task_);
838 tile->raster_task_ = nullptr; 849 tile->raster_task_ = nullptr;
839 850
851 // Unref all the images.
852 auto images_it = scheduled_draw_images_.find(tile->id());
853 const std::vector<DrawImage>& images = images_it->second;
854 for (const auto& image : images)
855 image_decode_controller_.UnrefImage(image);
856 scheduled_draw_images_.erase(images_it);
857
840 if (was_canceled) { 858 if (was_canceled) {
841 ++flush_stats_.canceled_count; 859 ++flush_stats_.canceled_count;
842 // TODO(ericrk): If more partial raster work is done in the future, it may 860 // TODO(ericrk): If more partial raster work is done in the future, it may
843 // be worth returning the resource to the pool with its previous ID (not 861 // be worth returning the resource to the pool with its previous ID (not
844 // currently tracked). crrev.com/1370333002/#ps40001 has a possible method 862 // currently tracked). crrev.com/1370333002/#ps40001 has a possible method
845 // of achieving this. 863 // of achieving this.
846 resource_pool_->ReleaseResource(resource, 0 /* content_id */); 864 resource_pool_->ReleaseResource(resource, 0 /* content_id */);
847 return; 865 return;
848 } 866 }
849 867
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 int source_frame_number, 902 int source_frame_number,
885 int flags) { 903 int flags) {
886 // We need to have a tile task worker pool to do anything meaningful with 904 // We need to have a tile task worker pool to do anything meaningful with
887 // tiles. 905 // tiles.
888 DCHECK(tile_task_runner_); 906 DCHECK(tile_task_runner_);
889 ScopedTilePtr tile( 907 ScopedTilePtr tile(
890 new Tile(this, info, layer_id, source_frame_number, flags)); 908 new Tile(this, info, layer_id, source_frame_number, flags));
891 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 909 DCHECK(tiles_.find(tile->id()) == tiles_.end());
892 910
893 tiles_[tile->id()] = tile.get(); 911 tiles_[tile->id()] = tile.get();
894 image_decode_controller_.AddLayerUsedCount(tile->layer_id());
895 return tile; 912 return tile;
896 } 913 }
897 914
898 void TileManager::SetTileTaskRunnerForTesting( 915 void TileManager::SetTileTaskRunnerForTesting(
899 TileTaskRunner* tile_task_runner) { 916 TileTaskRunner* tile_task_runner) {
900 tile_task_runner_ = tile_task_runner; 917 tile_task_runner_ = tile_task_runner;
901 } 918 }
902 919
903 bool TileManager::AreRequiredTilesReadyToDraw( 920 bool TileManager::AreRequiredTilesReadyToDraw(
904 RasterTilePriorityQueue::Type type) const { 921 RasterTilePriorityQueue::Type type) const {
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1000 // |tiles_that_need_to_be_rasterized| will be empty when we reach a 1017 // |tiles_that_need_to_be_rasterized| will be empty when we reach a
1001 // steady memory state. Keep scheduling tasks until we reach this state. 1018 // steady memory state. Keep scheduling tasks until we reach this state.
1002 if (!tiles_that_need_to_be_rasterized.empty()) { 1019 if (!tiles_that_need_to_be_rasterized.empty()) {
1003 ScheduleTasks(tiles_that_need_to_be_rasterized); 1020 ScheduleTasks(tiles_that_need_to_be_rasterized);
1004 return; 1021 return;
1005 } 1022 }
1006 1023
1007 FreeResourcesForReleasedTiles(); 1024 FreeResourcesForReleasedTiles();
1008 1025
1009 resource_pool_->ReduceResourceUsage(); 1026 resource_pool_->ReduceResourceUsage();
1027 image_decode_controller_.ReduceCacheUsage();
1010 1028
1011 signals_.all_tile_tasks_completed = true; 1029 signals_.all_tile_tasks_completed = true;
1012 signals_check_notifier_.Schedule(); 1030 signals_check_notifier_.Schedule();
1013 1031
1014 // We don't reserve memory for required-for-activation tiles during 1032 // We don't reserve memory for required-for-activation tiles during
1015 // accelerated gestures, so we just postpone activation when we don't 1033 // accelerated gestures, so we just postpone activation when we don't
1016 // have these tiles, and activate after the accelerated gesture. 1034 // have these tiles, and activate after the accelerated gesture.
1017 // Likewise if we don't allow any tiles (as is the case when we're 1035 // Likewise if we don't allow any tiles (as is the case when we're
1018 // invisible), if we have tiles that aren't ready, then we shouldn't 1036 // invisible), if we have tiles that aren't ready, then we shouldn't
1019 // activate as activation can cause checkerboards. 1037 // activate as activation can cause checkerboards.
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1164 void TileManager::Signals::reset() { 1182 void TileManager::Signals::reset() {
1165 ready_to_activate = false; 1183 ready_to_activate = false;
1166 did_notify_ready_to_activate = false; 1184 did_notify_ready_to_activate = false;
1167 ready_to_draw = false; 1185 ready_to_draw = false;
1168 did_notify_ready_to_draw = false; 1186 did_notify_ready_to_draw = false;
1169 all_tile_tasks_completed = false; 1187 all_tile_tasks_completed = false;
1170 did_notify_all_tile_tasks_completed = false; 1188 did_notify_all_tile_tasks_completed = false;
1171 } 1189 }
1172 1190
1173 } // namespace cc 1191 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698