OLD | NEW |
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/resources/tile_manager.h" | 5 #include "cc/resources/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 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 } | 207 } |
208 | 208 |
209 TileManager::~TileManager() { | 209 TileManager::~TileManager() { |
210 // Reset global state and manage. This should cause | 210 // Reset global state and manage. This should cause |
211 // our memory usage to drop to zero. | 211 // our memory usage to drop to zero. |
212 global_state_ = GlobalStateThatImpactsTilePriority(); | 212 global_state_ = GlobalStateThatImpactsTilePriority(); |
213 | 213 |
214 CleanUpReleasedTiles(); | 214 CleanUpReleasedTiles(); |
215 DCHECK_EQ(0u, tiles_.size()); | 215 DCHECK_EQ(0u, tiles_.size()); |
216 | 216 |
217 RasterWorkerPool::RasterTask::Queue empty[NUM_RASTER_WORKER_POOL_TYPES]; | 217 RasterTaskQueue empty[NUM_RASTER_WORKER_POOL_TYPES]; |
218 raster_worker_pool_delegate_->ScheduleTasks(empty); | 218 raster_worker_pool_delegate_->ScheduleTasks(empty); |
219 | 219 |
220 // This should finish all pending tasks and release any uninitialized | 220 // This should finish all pending tasks and release any uninitialized |
221 // resources. | 221 // resources. |
222 raster_worker_pool_delegate_->Shutdown(); | 222 raster_worker_pool_delegate_->Shutdown(); |
223 raster_worker_pool_delegate_->CheckForCompletedTasks(); | 223 raster_worker_pool_delegate_->CheckForCompletedTasks(); |
224 | 224 |
225 DCHECK_EQ(0u, bytes_releasable_); | 225 DCHECK_EQ(0u, bytes_releasable_); |
226 DCHECK_EQ(0u, resources_releasable_); | 226 DCHECK_EQ(0u, resources_releasable_); |
227 } | 227 } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 const TreePriority tree_priority = global_state_.tree_priority; | 347 const TreePriority tree_priority = global_state_.tree_priority; |
348 | 348 |
349 // For each tree, bin into different categories of tiles. | 349 // For each tree, bin into different categories of tiles. |
350 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 350 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
351 Tile* tile = it->second; | 351 Tile* tile = it->second; |
352 ManagedTileState& mts = tile->managed_state(); | 352 ManagedTileState& mts = tile->managed_state(); |
353 | 353 |
354 const ManagedTileState::TileVersion& tile_version = | 354 const ManagedTileState::TileVersion& tile_version = |
355 tile->GetTileVersionForDrawing(); | 355 tile->GetTileVersionForDrawing(); |
356 bool tile_is_ready_to_draw = tile_version.IsReadyToDraw(); | 356 bool tile_is_ready_to_draw = tile_version.IsReadyToDraw(); |
357 bool tile_is_active = | 357 bool tile_is_active = tile_is_ready_to_draw || |
358 tile_is_ready_to_draw || | 358 mts.tile_versions[mts.raster_mode].raster_task_; |
359 !mts.tile_versions[mts.raster_mode].raster_task_.is_null(); | |
360 | 359 |
361 // Get the active priority and bin. | 360 // Get the active priority and bin. |
362 TilePriority active_priority = tile->priority(ACTIVE_TREE); | 361 TilePriority active_priority = tile->priority(ACTIVE_TREE); |
363 ManagedTileBin active_bin = BinFromTilePriority(active_priority); | 362 ManagedTileBin active_bin = BinFromTilePriority(active_priority); |
364 | 363 |
365 // Get the pending priority and bin. | 364 // Get the pending priority and bin. |
366 TilePriority pending_priority = tile->priority(PENDING_TREE); | 365 TilePriority pending_priority = tile->priority(PENDING_TREE); |
367 ManagedTileBin pending_bin = BinFromTilePriority(pending_priority); | 366 ManagedTileBin pending_bin = BinFromTilePriority(pending_priority); |
368 | 367 |
369 bool pending_is_low_res = pending_priority.resolution == LOW_RESOLUTION; | 368 bool pending_is_low_res = pending_priority.resolution == LOW_RESOLUTION; |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 tile_resources++; | 678 tile_resources++; |
680 } | 679 } |
681 } | 680 } |
682 | 681 |
683 // Allow lower priority tiles with initialized resources to keep | 682 // Allow lower priority tiles with initialized resources to keep |
684 // their memory by only assigning memory to new raster tasks if | 683 // their memory by only assigning memory to new raster tasks if |
685 // they can be scheduled. | 684 // they can be scheduled. |
686 if (raster_bytes_if_rastered <= max_raster_bytes) { | 685 if (raster_bytes_if_rastered <= max_raster_bytes) { |
687 // If we don't have the required version, and it's not in flight | 686 // If we don't have the required version, and it's not in flight |
688 // then we'll have to pay to create a new task. | 687 // then we'll have to pay to create a new task. |
689 if (!tile_version.resource_ && tile_version.raster_task_.is_null()) { | 688 if (!tile_version.resource_ && !tile_version.raster_task_) { |
690 tile_bytes += bytes_if_allocated; | 689 tile_bytes += bytes_if_allocated; |
691 tile_resources++; | 690 tile_resources++; |
692 } | 691 } |
693 } | 692 } |
694 | 693 |
695 // Tile is OOM. | 694 // Tile is OOM. |
696 if (tile_bytes > tile_bytes_left || tile_resources > resources_left) { | 695 if (tile_bytes > tile_bytes_left || tile_resources > resources_left) { |
697 FreeResourcesForTile(tile); | 696 FreeResourcesForTile(tile); |
698 | 697 |
699 // This tile was already on screen and now its resources have been | 698 // This tile was already on screen and now its resources have been |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
812 it != tiles_that_need_to_be_rasterized.end(); | 811 it != tiles_that_need_to_be_rasterized.end(); |
813 ++it) { | 812 ++it) { |
814 Tile* tile = *it; | 813 Tile* tile = *it; |
815 ManagedTileState& mts = tile->managed_state(); | 814 ManagedTileState& mts = tile->managed_state(); |
816 ManagedTileState::TileVersion& tile_version = | 815 ManagedTileState::TileVersion& tile_version = |
817 mts.tile_versions[mts.raster_mode]; | 816 mts.tile_versions[mts.raster_mode]; |
818 | 817 |
819 DCHECK(tile_version.requires_resource()); | 818 DCHECK(tile_version.requires_resource()); |
820 DCHECK(!tile_version.resource_); | 819 DCHECK(!tile_version.resource_); |
821 | 820 |
822 if (tile_version.raster_task_.is_null()) | 821 if (!tile_version.raster_task_) |
823 tile_version.raster_task_ = CreateRasterTask(tile); | 822 tile_version.raster_task_ = CreateRasterTask(tile); |
824 | 823 |
825 size_t pool_type = tile->use_gpu_rasterization() | 824 size_t pool_type = tile->use_gpu_rasterization() |
826 ? RASTER_WORKER_POOL_TYPE_DIRECT | 825 ? RASTER_WORKER_POOL_TYPE_DIRECT |
827 : RASTER_WORKER_POOL_TYPE_DEFAULT; | 826 : RASTER_WORKER_POOL_TYPE_DEFAULT; |
828 | 827 |
829 raster_queue_[pool_type] | 828 raster_queue_[pool_type].items.push_back(RasterTaskQueue::Item( |
830 .Append(tile_version.raster_task_, tile->required_for_activation()); | 829 tile_version.raster_task_.get(), tile->required_for_activation())); |
| 830 raster_queue_[pool_type].required_for_activation_count += |
| 831 tile->required_for_activation(); |
831 } | 832 } |
832 | 833 |
833 // We must reduce the amount of unused resoruces before calling | 834 // We must reduce the amount of unused resoruces before calling |
834 // ScheduleTasks to prevent usage from rising above limits. | 835 // ScheduleTasks to prevent usage from rising above limits. |
835 resource_pool_->ReduceResourceUsage(); | 836 resource_pool_->ReduceResourceUsage(); |
836 | 837 |
837 // Schedule running of |raster_tasks_|. This replaces any previously | 838 // Schedule running of |raster_tasks_|. This replaces any previously |
838 // scheduled tasks and effectively cancels all tasks not present | 839 // scheduled tasks and effectively cancels all tasks not present |
839 // in |raster_tasks_|. | 840 // in |raster_tasks_|. |
840 raster_worker_pool_delegate_->ScheduleTasks(raster_queue_); | 841 raster_worker_pool_delegate_->ScheduleTasks(raster_queue_); |
841 | 842 |
842 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; | 843 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
843 } | 844 } |
844 | 845 |
845 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( | 846 scoped_refptr<internal::WorkerPoolTask> TileManager::CreateImageDecodeTask( |
846 Tile* tile, | 847 Tile* tile, |
847 SkPixelRef* pixel_ref) { | 848 SkPixelRef* pixel_ref) { |
848 return RasterWorkerPool::CreateImageDecodeTask( | 849 return RasterWorkerPool::CreateImageDecodeTask( |
849 pixel_ref, | 850 pixel_ref, |
850 tile->layer_id(), | 851 tile->layer_id(), |
851 rendering_stats_instrumentation_, | 852 rendering_stats_instrumentation_, |
852 base::Bind(&TileManager::OnImageDecodeTaskCompleted, | 853 base::Bind(&TileManager::OnImageDecodeTaskCompleted, |
853 base::Unretained(this), | 854 base::Unretained(this), |
854 tile->layer_id(), | 855 tile->layer_id(), |
855 base::Unretained(pixel_ref))); | 856 base::Unretained(pixel_ref))); |
856 } | 857 } |
857 | 858 |
858 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { | 859 scoped_refptr<internal::RasterWorkerPoolTask> TileManager::CreateRasterTask( |
| 860 Tile* tile) { |
859 ManagedTileState& mts = tile->managed_state(); | 861 ManagedTileState& mts = tile->managed_state(); |
860 | 862 |
861 scoped_ptr<ScopedResource> resource = | 863 scoped_ptr<ScopedResource> resource = |
862 resource_pool_->AcquireResource(tile->tile_size_.size()); | 864 resource_pool_->AcquireResource(tile->tile_size_.size()); |
863 const ScopedResource* const_resource = resource.get(); | 865 const ScopedResource* const_resource = resource.get(); |
864 | 866 |
865 // Create and queue all image decode tasks that this tile depends on. | 867 // Create and queue all image decode tasks that this tile depends on. |
866 RasterWorkerPool::Task::Set decode_tasks; | 868 internal::WorkerPoolTask::Vector decode_tasks; |
867 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; | 869 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; |
868 for (PicturePileImpl::PixelRefIterator iter( | 870 for (PicturePileImpl::PixelRefIterator iter( |
869 tile->content_rect(), tile->contents_scale(), tile->picture_pile()); | 871 tile->content_rect(), tile->contents_scale(), tile->picture_pile()); |
870 iter; | 872 iter; |
871 ++iter) { | 873 ++iter) { |
872 SkPixelRef* pixel_ref = *iter; | 874 SkPixelRef* pixel_ref = *iter; |
873 uint32_t id = pixel_ref->getGenerationID(); | 875 uint32_t id = pixel_ref->getGenerationID(); |
874 | 876 |
875 // Append existing image decode task if available. | 877 // Append existing image decode task if available. |
876 PixelRefTaskMap::iterator decode_task_it = existing_pixel_refs.find(id); | 878 PixelRefTaskMap::iterator decode_task_it = existing_pixel_refs.find(id); |
877 if (decode_task_it != existing_pixel_refs.end()) { | 879 if (decode_task_it != existing_pixel_refs.end()) { |
878 decode_tasks.Insert(decode_task_it->second); | 880 decode_tasks.push_back(decode_task_it->second); |
879 continue; | 881 continue; |
880 } | 882 } |
881 | 883 |
882 // Create and append new image decode task for this pixel ref. | 884 // Create and append new image decode task for this pixel ref. |
883 RasterWorkerPool::Task decode_task = CreateImageDecodeTask(tile, pixel_ref); | 885 scoped_refptr<internal::WorkerPoolTask> decode_task = |
884 decode_tasks.Insert(decode_task); | 886 CreateImageDecodeTask(tile, pixel_ref); |
| 887 decode_tasks.push_back(decode_task); |
885 existing_pixel_refs[id] = decode_task; | 888 existing_pixel_refs[id] = decode_task; |
886 } | 889 } |
887 | 890 |
888 return RasterWorkerPool::CreateRasterTask( | 891 return RasterWorkerPool::CreateRasterTask( |
889 const_resource, | 892 const_resource, |
890 tile->picture_pile(), | 893 tile->picture_pile(), |
891 tile->content_rect(), | 894 tile->content_rect(), |
892 tile->contents_scale(), | 895 tile->contents_scale(), |
893 mts.raster_mode, | 896 mts.raster_mode, |
894 mts.resolution, | 897 mts.resolution, |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
935 TileMap::iterator it = tiles_.find(tile_id); | 938 TileMap::iterator it = tiles_.find(tile_id); |
936 if (it == tiles_.end()) { | 939 if (it == tiles_.end()) { |
937 ++update_visible_tiles_stats_.canceled_count; | 940 ++update_visible_tiles_stats_.canceled_count; |
938 resource_pool_->ReleaseResource(resource.Pass()); | 941 resource_pool_->ReleaseResource(resource.Pass()); |
939 return; | 942 return; |
940 } | 943 } |
941 | 944 |
942 Tile* tile = it->second; | 945 Tile* tile = it->second; |
943 ManagedTileState& mts = tile->managed_state(); | 946 ManagedTileState& mts = tile->managed_state(); |
944 ManagedTileState::TileVersion& tile_version = mts.tile_versions[raster_mode]; | 947 ManagedTileState::TileVersion& tile_version = mts.tile_versions[raster_mode]; |
945 DCHECK(!tile_version.raster_task_.is_null()); | 948 DCHECK(tile_version.raster_task_); |
946 tile_version.raster_task_.Reset(); | 949 tile_version.raster_task_ = NULL; |
947 | 950 |
948 if (was_canceled) { | 951 if (was_canceled) { |
949 ++update_visible_tiles_stats_.canceled_count; | 952 ++update_visible_tiles_stats_.canceled_count; |
950 resource_pool_->ReleaseResource(resource.Pass()); | 953 resource_pool_->ReleaseResource(resource.Pass()); |
951 return; | 954 return; |
952 } | 955 } |
953 | 956 |
954 ++update_visible_tiles_stats_.completed_count; | 957 ++update_visible_tiles_stats_.completed_count; |
955 | 958 |
956 tile_version.set_has_text(analysis.has_text); | 959 tile_version.set_has_text(analysis.has_text); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
989 flags)); | 992 flags)); |
990 DCHECK(tiles_.find(tile->id()) == tiles_.end()); | 993 DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
991 | 994 |
992 tiles_[tile->id()] = tile; | 995 tiles_[tile->id()] = tile; |
993 used_layer_counts_[tile->layer_id()]++; | 996 used_layer_counts_[tile->layer_id()]++; |
994 prioritized_tiles_dirty_ = true; | 997 prioritized_tiles_dirty_ = true; |
995 return tile; | 998 return tile; |
996 } | 999 } |
997 | 1000 |
998 } // namespace cc | 1001 } // namespace cc |
OLD | NEW |