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

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

Issue 2726343004: cc: Optimize decode scheduling for checker-images. (Closed)
Patch Set: .. Created 3 years, 9 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 625 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, 636 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes,
637 global_state_.num_resources_limit); 637 global_state_.num_resources_limit);
638 MemoryUsage memory_usage(resource_pool_->memory_usage_bytes(), 638 MemoryUsage memory_usage(resource_pool_->memory_usage_bytes(),
639 resource_pool_->resource_count()); 639 resource_pool_->resource_count());
640 640
641 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( 641 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue(
642 client_->BuildRasterQueue(global_state_.tree_priority, 642 client_->BuildRasterQueue(global_state_.tree_priority,
643 RasterTilePriorityQueue::Type::ALL)); 643 RasterTilePriorityQueue::Type::ALL));
644 std::unique_ptr<EvictionTilePriorityQueue> eviction_priority_queue; 644 std::unique_ptr<EvictionTilePriorityQueue> eviction_priority_queue;
645 PrioritizedWorkToSchedule work_to_schedule; 645 PrioritizedWorkToSchedule work_to_schedule;
646 CheckerImageTracker::ImageDecodeQueue checker_image_decode_queue;
646 for (; !raster_priority_queue->IsEmpty(); raster_priority_queue->Pop()) { 647 for (; !raster_priority_queue->IsEmpty(); raster_priority_queue->Pop()) {
647 const PrioritizedTile& prioritized_tile = raster_priority_queue->Top(); 648 const PrioritizedTile& prioritized_tile = raster_priority_queue->Top();
648 Tile* tile = prioritized_tile.tile(); 649 Tile* tile = prioritized_tile.tile();
649 TilePriority priority = prioritized_tile.priority(); 650 TilePriority priority = prioritized_tile.priority();
650 651
651 if (TilePriorityViolatesMemoryPolicy(priority)) { 652 if (TilePriorityViolatesMemoryPolicy(priority)) {
652 TRACE_EVENT_INSTANT0( 653 TRACE_EVENT_INSTANT0(
653 "cc", "TileManager::AssignGpuMemory tile violates memory policy", 654 "cc", "TileManager::AssignGpuMemory tile violates memory policy",
654 TRACE_EVENT_SCOPE_THREAD); 655 TRACE_EVENT_SCOPE_THREAD);
655 break; 656 break;
(...skipping 18 matching lines...) Expand all
674 } 675 }
675 } 676 }
676 677
677 // Prepaint tiles that are far away are only processed for images. 678 // Prepaint tiles that are far away are only processed for images.
678 if (!tile->required_for_activation() && !tile->required_for_draw() && 679 if (!tile->required_for_activation() && !tile->required_for_draw() &&
679 prioritized_tile.is_process_for_images_only()) { 680 prioritized_tile.is_process_for_images_only()) {
680 work_to_schedule.tiles_to_process_for_images.push_back(prioritized_tile); 681 work_to_schedule.tiles_to_process_for_images.push_back(prioritized_tile);
681 continue; 682 continue;
682 } 683 }
683 684
685 // Tiles in the raster queue should either require raster or decode for
686 // checker-images. If this tile does not need raster, process it only to
687 // build the decode queue for checkered images.
vmpstr 2017/03/29 19:11:45 Add a comment saying that this block must come aft
Khushal 2017/03/31 04:31:00 Done.
688 if (!tile->draw_info().NeedsRaster()) {
689 DCHECK(tile->draw_info().is_checker_imaged());
690 std::vector<DrawImage> images_in_tile;
691 prioritized_tile.raster_source()->GetDiscardableImagesInRect(
692 tile->enclosing_layer_rect(), tile->contents_scale(),
693 &images_in_tile);
694 FilterImagesForCheckering(tile->tiling()->tree(), images_in_tile, nullptr,
695 nullptr, &checker_image_decode_queue);
696 continue;
697 }
698
684 // We won't be able to schedule this tile, so break out early. 699 // We won't be able to schedule this tile, so break out early.
685 if (work_to_schedule.tiles_to_raster.size() >= 700 if (work_to_schedule.tiles_to_raster.size() >=
686 scheduled_raster_task_limit_) { 701 scheduled_raster_task_limit_) {
687 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; 702 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
688 break; 703 break;
689 } 704 }
690 705
691 tile->scheduled_priority_ = schedule_priority++; 706 tile->scheduled_priority_ = schedule_priority++;
692 707
693 DCHECK(tile->draw_info().mode() == TileDrawInfo::OOM_MODE || 708 DCHECK(tile->draw_info().mode() == TileDrawInfo::OOM_MODE ||
(...skipping 26 matching lines...) Expand all
720 // If we couldn't fit the tile into our current memory limit, then we're 735 // If we couldn't fit the tile into our current memory limit, then we're
721 // done. 736 // done.
722 if (!memory_usage_is_within_limit) { 737 if (!memory_usage_is_within_limit) {
723 if (tile_is_needed_now) 738 if (tile_is_needed_now)
724 had_enough_memory_to_schedule_tiles_needed_now = false; 739 had_enough_memory_to_schedule_tiles_needed_now = false;
725 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; 740 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
726 break; 741 break;
727 } 742 }
728 743
729 memory_usage += memory_required_by_tile_to_be_scheduled; 744 memory_usage += memory_required_by_tile_to_be_scheduled;
745
746 // If the tile has a scheduled task that will rasterize a resource with
747 // checker-imaged content, add those images to the decode queue. Note that
748 // we add all images as we process the raster priority queue to ensure that
749 // images are added to the decode queue in raster priority order.
750 if (tile->raster_task_scheduled_with_checker_images()) {
vmpstr 2017/03/29 19:11:45 Maybe flip the if and the dcheck? If, if tile has
Khushal 2017/03/29 22:10:20 Not sure I followed, at this point the tile should
751 DCHECK(tile->HasRasterTask());
752 std::vector<DrawImage> images_in_tile;
753 prioritized_tile.raster_source()->GetDiscardableImagesInRect(
vmpstr 2017/03/29 19:11:46 This isn't really a trivial operation, is there an
Khushal 2017/03/29 22:10:20 I was thinking about it. Is there a reason for not
Khushal 2017/03/31 04:31:00 Cached this on Tile. I didn't realize that |schedu
754 tile->enclosing_layer_rect(), tile->contents_scale(),
755 &images_in_tile);
756 FilterImagesForCheckering(tile->tiling()->tree(), images_in_tile, nullptr,
757 nullptr, &checker_image_decode_queue);
758 } else if (!tile->HasRasterTask()) {
759 // Creating the raster task here will acquire resources, but
760 // this resource usage has already been accounted for above.
761 tile->raster_task_ =
762 CreateRasterTask(prioritized_tile, client_->GetRasterColorSpace(),
vmpstr 2017/03/29 19:11:46 It's a bit unfortunate that we're doing this here
Khushal 2017/03/31 04:31:01 Done.
763 &checker_image_decode_queue);
764 }
730 work_to_schedule.tiles_to_raster.push_back(prioritized_tile); 765 work_to_schedule.tiles_to_raster.push_back(prioritized_tile);
731 } 766 }
732 767
733 // Note that we should try and further reduce memory in case the above loop 768 // Note that we should try and further reduce memory in case the above loop
734 // didn't reduce memory. This ensures that we always release as many resources 769 // didn't reduce memory. This ensures that we always release as many resources
735 // as possible to stay within the memory limit. 770 // as possible to stay within the memory limit.
736 eviction_priority_queue = FreeTileResourcesUntilUsageIsWithinLimit( 771 eviction_priority_queue = FreeTileResourcesUntilUsageIsWithinLimit(
vmpstr 2017/03/29 19:11:46 What happens if eviction evicts tiles that are bei
Khushal 2017/03/29 22:10:20 The eviction here shouldn't remove resources from
737 std::move(eviction_priority_queue), hard_memory_limit, &memory_usage); 772 std::move(eviction_priority_queue), hard_memory_limit, &memory_usage);
738 773
774 // At this point if we still have a tile that is holding onto a resource with
775 // checker-imaged content, add it to the decode queue to ensure that the
776 // resource is eventually invalidated.
777 while (!raster_priority_queue->IsEmpty()) {
vmpstr 2017/03/29 19:11:46 You can't do this here. This part defeats the poin
Khushal 2017/03/29 22:10:20 Sorry, I had missed looking at the implementation
778 const PrioritizedTile& prioritized_tile = raster_priority_queue->Top();
779 Tile* tile = prioritized_tile.tile();
780 if (tile->draw_info().is_checker_imaged() ||
781 tile->raster_task_scheduled_with_checker_images()) {
782 std::vector<DrawImage> images_in_tile;
783 prioritized_tile.raster_source()->GetDiscardableImagesInRect(
784 tile->enclosing_layer_rect(), tile->contents_scale(),
785 &images_in_tile);
786 FilterImagesForCheckering(tile->tiling()->tree(), images_in_tile, nullptr,
787 nullptr, &checker_image_decode_queue);
788 }
789 raster_priority_queue->Pop();
790 }
791
792 // Schedule running of the checker-image decode queue. This replaces the
793 // previously scheduled queue and effectively cancels image decodes from the
794 // previously scheduled queue, if not already started.
795 checker_image_tracker_.ScheduleImageDecodeQueue(
vmpstr 2017/03/29 19:11:46 Can you move this call out of this function and do
Khushal 2017/03/31 04:31:00 Moved it to ScheduleTasks.
796 std::move(checker_image_decode_queue));
797
739 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", 798 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget",
740 !had_enough_memory_to_schedule_tiles_needed_now); 799 !had_enough_memory_to_schedule_tiles_needed_now);
741 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; 800 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now;
742 801
743 memory_stats_from_last_assign_.total_budget_in_bytes = 802 memory_stats_from_last_assign_.total_budget_in_bytes =
744 global_state_.hard_memory_limit_in_bytes; 803 global_state_.hard_memory_limit_in_bytes;
745 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes(); 804 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes();
746 DCHECK_GE(memory_stats_from_last_assign_.total_bytes_used, 0); 805 DCHECK_GE(memory_stats_from_last_assign_.total_bytes_used, 0);
747 memory_stats_from_last_assign_.had_enough_memory = 806 memory_stats_from_last_assign_.had_enough_memory =
748 had_enough_memory_to_schedule_tiles_needed_now; 807 had_enough_memory_to_schedule_tiles_needed_now;
(...skipping 16 matching lines...) Expand all
765 } 824 }
766 825
767 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw( 826 void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(
768 Tile* tile) { 827 Tile* tile) {
769 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw(); 828 bool was_ready_to_draw = tile->draw_info().IsReadyToDraw();
770 FreeResourcesForTile(tile); 829 FreeResourcesForTile(tile);
771 if (was_ready_to_draw) 830 if (was_ready_to_draw)
772 client_->NotifyTileStateChanged(tile); 831 client_->NotifyTileStateChanged(tile);
773 } 832 }
774 833
834 void TileManager::FilterImagesForCheckering(
835 WhichTree tree,
836 const std::vector<DrawImage>& images_in_tile,
837 std::vector<DrawImage>* images_to_decode_for_raster,
838 ImageIdFlatSet* checkered_images,
839 CheckerImageTracker::ImageDecodeQueue* image_decode_queue) {
840 DCHECK(!images_to_decode_for_raster || images_to_decode_for_raster->empty());
vmpstr 2017/03/29 19:11:46 It's not clear to me why some of the output parame
Khushal 2017/03/29 22:10:20 I think computing it once and storing it on tile s
Khushal 2017/03/31 04:31:00 Done.
841 DCHECK(!checkered_images || checkered_images->empty());
842
843 for (const auto& draw_image : images_in_tile) {
844 const sk_sp<const SkImage>& image = draw_image.image();
845 DCHECK(image->isLazyGenerated());
846 if (checker_image_tracker_.ShouldCheckerImage(image, tree)) {
847 if (checkered_images)
848 checkered_images->insert(image->uniqueID());
vmpstr 2017/03/29 19:11:46 Here you're adding the image to both the vector an
Khushal 2017/03/31 04:31:00 Function died.
849 image_decode_queue->push_back(std::move(image));
850 } else if (images_to_decode_for_raster) {
851 images_to_decode_for_raster->push_back(draw_image);
vmpstr 2017/03/29 19:11:45 image to decode for raster is not a clear name. I
Khushal 2017/03/31 04:31:00 Function died.
852 }
853 }
854 }
855
775 void TileManager::ScheduleTasks( 856 void TileManager::ScheduleTasks(
776 const PrioritizedWorkToSchedule& work_to_schedule) { 857 const PrioritizedWorkToSchedule& work_to_schedule) {
777 const std::vector<PrioritizedTile>& tiles_that_need_to_be_rasterized = 858 const std::vector<PrioritizedTile>& tiles_that_need_to_be_rasterized =
778 work_to_schedule.tiles_to_raster; 859 work_to_schedule.tiles_to_raster;
779 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", "count", 860 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", "count",
780 tiles_that_need_to_be_rasterized.size()); 861 tiles_that_need_to_be_rasterized.size());
781 862
782 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); 863 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
783 864
784 if (!has_scheduled_tile_tasks_) { 865 if (!has_scheduled_tile_tasks_) {
(...skipping 28 matching lines...) Expand all
813 scoped_refptr<TileTask> all_done_task = 894 scoped_refptr<TileTask> all_done_task =
814 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks); 895 CreateTaskSetFinishedTask(&TileManager::DidFinishRunningAllTileTasks);
815 896
816 // Build a new task queue containing all task currently needed. Tasks 897 // Build a new task queue containing all task currently needed. Tasks
817 // are added in order of priority, highest priority task first. 898 // are added in order of priority, highest priority task first.
818 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { 899 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) {
819 Tile* tile = prioritized_tile.tile(); 900 Tile* tile = prioritized_tile.tile();
820 901
821 DCHECK(tile->draw_info().requires_resource()); 902 DCHECK(tile->draw_info().requires_resource());
822 DCHECK(!tile->draw_info().resource()); 903 DCHECK(!tile->draw_info().resource());
823 904 DCHECK(tile->HasRasterTask());
vmpstr 2017/03/29 19:11:46 comment why this is true now.
Khushal 2017/03/31 04:31:00 Done.
824 if (!tile->raster_task_) {
825 tile->raster_task_ =
826 CreateRasterTask(prioritized_tile, raster_color_space);
827 }
828 905
829 TileTask* task = tile->raster_task_.get(); 906 TileTask* task = tile->raster_task_.get();
830 907
831 DCHECK(!task->HasCompleted()); 908 DCHECK(!task->HasCompleted());
832 909
833 if (tile->required_for_activation()) { 910 if (tile->required_for_activation()) {
834 required_for_activate_count++; 911 required_for_activate_count++;
835 graph_.edges.push_back( 912 graph_.edges.push_back(
836 TaskGraph::Edge(task, required_for_activation_done_task.get())); 913 TaskGraph::Edge(task, required_for_activation_done_task.get()));
837 } 914 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
926 tile_task_manager_->ScheduleTasks(&graph_); 1003 tile_task_manager_->ScheduleTasks(&graph_);
927 1004
928 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 1005 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
929 1006
930 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", 1007 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
931 ScheduledTasksStateAsValue()); 1008 ScheduledTasksStateAsValue());
932 } 1009 }
933 1010
934 scoped_refptr<TileTask> TileManager::CreateRasterTask( 1011 scoped_refptr<TileTask> TileManager::CreateRasterTask(
935 const PrioritizedTile& prioritized_tile, 1012 const PrioritizedTile& prioritized_tile,
936 const gfx::ColorSpace& color_space) { 1013 const gfx::ColorSpace& color_space,
1014 CheckerImageTracker::ImageDecodeQueue* checker_image_decode_queue) {
937 Tile* tile = prioritized_tile.tile(); 1015 Tile* tile = prioritized_tile.tile();
938 1016
939 // Get the resource. 1017 // Get the resource.
940 uint64_t resource_content_id = 0; 1018 uint64_t resource_content_id = 0;
941 Resource* resource = nullptr; 1019 Resource* resource = nullptr;
942 gfx::Rect invalidated_rect = tile->invalidated_content_rect(); 1020 gfx::Rect invalidated_rect = tile->invalidated_content_rect();
943 if (UsePartialRaster() && tile->invalidated_id()) { 1021 if (UsePartialRaster() && tile->invalidated_id()) {
944 resource = resource_pool_->TryAcquireResourceForPartialRaster( 1022 resource = resource_pool_->TryAcquireResourceForPartialRaster(
945 tile->id(), tile->invalidated_content_rect(), tile->invalidated_id(), 1023 tile->id(), tile->invalidated_content_rect(), tile->invalidated_id(),
946 &invalidated_rect); 1024 &invalidated_rect);
947 } 1025 }
948 1026
949 if (resource) { 1027 if (resource) {
950 resource_content_id = tile->invalidated_id(); 1028 resource_content_id = tile->invalidated_id();
951 DCHECK_EQ(DetermineResourceFormat(tile), resource->format()); 1029 DCHECK_EQ(DetermineResourceFormat(tile), resource->format());
952 } else { 1030 } else {
953 resource = resource_pool_->AcquireResource(tile->desired_texture_size(), 1031 resource = resource_pool_->AcquireResource(tile->desired_texture_size(),
954 DetermineResourceFormat(tile), 1032 DetermineResourceFormat(tile),
955 color_space); 1033 color_space);
956 } 1034 }
957 1035
958 // For LOW_RESOLUTION tiles, we don't draw or predecode images. 1036 // For LOW_RESOLUTION tiles, we don't draw or predecode images.
959 RasterSource::PlaybackSettings playback_settings; 1037 RasterSource::PlaybackSettings playback_settings;
960 playback_settings.skip_images = 1038 playback_settings.skip_images =
961 prioritized_tile.priority().resolution == LOW_RESOLUTION; 1039 prioritized_tile.priority().resolution == LOW_RESOLUTION;
962 1040
963 // Create and queue all image decode tasks that this tile depends on. 1041 // Create and queue all image decode tasks that this tile depends on.
964 TileTask::Vector decode_tasks; 1042 TileTask::Vector decode_tasks;
965 std::vector<DrawImage>& images = scheduled_draw_images_[tile->id()]; 1043 std::vector<DrawImage>& images_to_decode_for_raster =
966 ImageIdFlatSet images_to_skip; 1044 scheduled_draw_images_[tile->id()];
967 images.clear(); 1045 images_to_decode_for_raster.clear();
968 if (!playback_settings.skip_images) { 1046 if (!playback_settings.skip_images) {
1047 std::vector<DrawImage> images_in_tile;
969 prioritized_tile.raster_source()->GetDiscardableImagesInRect( 1048 prioritized_tile.raster_source()->GetDiscardableImagesInRect(
vmpstr 2017/03/29 19:11:46 The pattern of these two calls appears throughout.
Khushal 2017/03/31 04:31:00 Happens only once now. Moved to EnsureImageAnalysi
970 tile->enclosing_layer_rect(), tile->contents_scale(), &images); 1049 tile->enclosing_layer_rect(), tile->contents_scale(), &images_in_tile);
971 checker_image_tracker_.FilterImagesForCheckeringForTile( 1050 FilterImagesForCheckering(
972 &images, &images_to_skip, prioritized_tile.tile()->tiling()->tree()); 1051 tile->tiling()->tree(), images_in_tile, &images_to_decode_for_raster,
1052 &playback_settings.images_to_skip, checker_image_decode_queue);
973 } 1053 }
974 1054
975 // We can skip the image hijack canvas if we have no images, or no images to 1055 // We can skip the image hijack canvas if we have no images, or no images to
976 // skip during raster. 1056 // skip during raster.
977 playback_settings.use_image_hijack_canvas = 1057 playback_settings.use_image_hijack_canvas =
978 !images.empty() || !images_to_skip.empty(); 1058 !images_to_decode_for_raster.empty() ||
979 playback_settings.images_to_skip = std::move(images_to_skip); 1059 !playback_settings.images_to_skip.empty();
1060 tile->raster_task_scheduled_with_checker_images_ =
1061 !playback_settings.images_to_skip.empty();
980 1062
981 // Get the tasks for the required images. 1063 // Get the tasks for the required images.
982 ImageDecodeCache::TracingInfo tracing_info( 1064 ImageDecodeCache::TracingInfo tracing_info(
983 prepare_tiles_count_, prioritized_tile.priority().priority_bin); 1065 prepare_tiles_count_, prioritized_tile.priority().priority_bin);
984 image_controller_.GetTasksForImagesAndRef(&images, &decode_tasks, 1066 image_controller_.GetTasksForImagesAndRef(&images_to_decode_for_raster,
985 tracing_info); 1067 &decode_tasks, tracing_info);
986 1068
987 std::unique_ptr<RasterBuffer> raster_buffer = 1069 std::unique_ptr<RasterBuffer> raster_buffer =
988 raster_buffer_provider_->AcquireBufferForRaster( 1070 raster_buffer_provider_->AcquireBufferForRaster(
989 resource, resource_content_id, tile->invalidated_id()); 1071 resource, resource_content_id, tile->invalidated_id());
990 return make_scoped_refptr(new RasterTaskImpl( 1072 return make_scoped_refptr(new RasterTaskImpl(
991 this, tile, resource, prioritized_tile.raster_source(), playback_settings, 1073 this, tile, resource, prioritized_tile.raster_source(), playback_settings,
992 prioritized_tile.priority().resolution, invalidated_rect, 1074 prioritized_tile.priority().resolution, invalidated_rect,
993 prepare_tiles_count_, std::move(raster_buffer), &decode_tasks, 1075 prepare_tiles_count_, std::move(raster_buffer), &decode_tasks,
994 use_gpu_rasterization_)); 1076 use_gpu_rasterization_));
995 } 1077 }
996 1078
997 void TileManager::ResetSignalsForTesting() { 1079 void TileManager::ResetSignalsForTesting() {
998 signals_.reset(); 1080 signals_.reset();
999 } 1081 }
1000 1082
1001 void TileManager::OnRasterTaskCompleted( 1083 void TileManager::OnRasterTaskCompleted(
1002 std::unique_ptr<RasterBuffer> raster_buffer, 1084 std::unique_ptr<RasterBuffer> raster_buffer,
1003 Tile::Id tile_id, 1085 Tile::Id tile_id,
1004 Resource* resource, 1086 Resource* resource,
1005 bool was_canceled) { 1087 bool was_canceled) {
1006 raster_buffer_provider_->ReleaseBufferForRaster(std::move(raster_buffer)); 1088 raster_buffer_provider_->ReleaseBufferForRaster(std::move(raster_buffer));
1007 1089
1008 auto found = tiles_.find(tile_id); 1090 auto found = tiles_.find(tile_id);
1009 Tile* tile = nullptr; 1091 Tile* tile = nullptr;
1092 bool raster_task_scheduled_with_checker_images = false;
1010 if (found != tiles_.end()) { 1093 if (found != tiles_.end()) {
1011 tile = found->second; 1094 tile = found->second;
1012 DCHECK(tile->raster_task_.get()); 1095 DCHECK(tile->raster_task_.get());
1096 raster_task_scheduled_with_checker_images =
vmpstr 2017/03/29 19:11:46 just make the setter return the old value
Khushal 2017/03/31 04:31:00 Done.
1097 tile->raster_task_scheduled_with_checker_images_;
1013 tile->raster_task_ = nullptr; 1098 tile->raster_task_ = nullptr;
1099 tile->raster_task_scheduled_with_checker_images_ = false;
1014 } 1100 }
1015 1101
1016 // Unref all the images. 1102 // Unref all the images.
1017 auto images_it = scheduled_draw_images_.find(tile_id); 1103 auto images_it = scheduled_draw_images_.find(tile_id);
1018 image_controller_.UnrefImages(images_it->second); 1104 image_controller_.UnrefImages(images_it->second);
1019 scheduled_draw_images_.erase(images_it); 1105 scheduled_draw_images_.erase(images_it);
1020 1106
1021 if (was_canceled) { 1107 if (was_canceled) {
1022 ++flush_stats_.canceled_count; 1108 ++flush_stats_.canceled_count;
1023 resource_pool_->ReleaseResource(resource); 1109 resource_pool_->ReleaseResource(resource);
1024 return; 1110 return;
1025 } 1111 }
1026 1112
1027 resource_pool_->OnContentReplaced(resource->id(), tile_id); 1113 resource_pool_->OnContentReplaced(resource->id(), tile_id);
1028 ++flush_stats_.completed_count; 1114 ++flush_stats_.completed_count;
1029 1115
1030 if (!tile) { 1116 if (!tile) {
1031 resource_pool_->ReleaseResource(resource); 1117 resource_pool_->ReleaseResource(resource);
1032 return; 1118 return;
1033 } 1119 }
1034 1120
1035 TileDrawInfo& draw_info = tile->draw_info(); 1121 TileDrawInfo& draw_info = tile->draw_info();
1036 draw_info.set_resource(resource); 1122 draw_info.set_resource(resource);
1123 draw_info.resource_is_checker_imaged_ =
1124 raster_task_scheduled_with_checker_images;
1037 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); 1125 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile);
1038 1126
1039 // In SMOOTHNESS_TAKES_PRIORITY mode, we wait for GPU work to complete for a 1127 // In SMOOTHNESS_TAKES_PRIORITY mode, we wait for GPU work to complete for a
1040 // tile before setting it as ready to draw. 1128 // tile before setting it as ready to draw.
1041 if (global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY && 1129 if (global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY &&
1042 !raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) { 1130 !raster_buffer_provider_->IsResourceReadyToDraw(resource->id())) {
1043 pending_gpu_work_tiles_.insert(tile); 1131 pending_gpu_work_tiles_.insert(tile);
1044 return; 1132 return;
1045 } 1133 }
1046 1134
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
1432 all_tile_tasks_completed = false; 1520 all_tile_tasks_completed = false;
1433 did_notify_all_tile_tasks_completed = false; 1521 did_notify_all_tile_tasks_completed = false;
1434 } 1522 }
1435 1523
1436 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; 1524 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default;
1437 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( 1525 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule(
1438 PrioritizedWorkToSchedule&& other) = default; 1526 PrioritizedWorkToSchedule&& other) = default;
1439 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; 1527 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default;
1440 1528
1441 } // namespace cc 1529 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698