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

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

Issue 23757024: cc: Speed up CleanUpImageDecodeTasks a bit. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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 | Annotate | Revision Log
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/tile_manager_perftest.cc » ('j') | 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/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 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 global_state_.memory_limit_in_bytes, 183 global_state_.memory_limit_in_bytes,
184 global_state_.unused_memory_limit_in_bytes, 184 global_state_.unused_memory_limit_in_bytes,
185 global_state_.num_resources_limit); 185 global_state_.num_resources_limit);
186 } 186 }
187 187
188 void TileManager::RegisterTile(Tile* tile) { 188 void TileManager::RegisterTile(Tile* tile) {
189 DCHECK(!tile->required_for_activation()); 189 DCHECK(!tile->required_for_activation());
190 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 190 DCHECK(tiles_.find(tile->id()) == tiles_.end());
191 191
192 tiles_[tile->id()] = tile; 192 tiles_[tile->id()] = tile;
193 used_layer_counts_[tile->layer_id()]++;
193 prioritized_tiles_dirty_ = true; 194 prioritized_tiles_dirty_ = true;
194 } 195 }
195 196
196 void TileManager::UnregisterTile(Tile* tile) { 197 void TileManager::UnregisterTile(Tile* tile) {
197 FreeResourcesForTile(tile); 198 FreeResourcesForTile(tile);
198 199
199 DCHECK(tiles_.find(tile->id()) != tiles_.end()); 200 DCHECK(tiles_.find(tile->id()) != tiles_.end());
200 tiles_.erase(tile->id()); 201 tiles_.erase(tile->id());
202
203 DCHECK_GT(used_layer_counts_[tile->layer_id()], 0);
204 used_layer_counts_[tile->layer_id()]--;
205
201 prioritized_tiles_dirty_ = true; 206 prioritized_tiles_dirty_ = true;
202 } 207 }
203 208
204 void TileManager::DidChangeTilePriority(Tile* tile) { 209 void TileManager::DidChangeTilePriority(Tile* tile) {
205 prioritized_tiles_dirty_ = true; 210 prioritized_tiles_dirty_ = true;
206 } 211 }
207 212
208 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { 213 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const {
209 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; 214 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY;
210 } 215 }
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 memory_stats_from_last_assign_.bytes_unreleasable = 622 memory_stats_from_last_assign_.bytes_unreleasable =
618 bytes_allocatable - bytes_releasable_; 623 bytes_allocatable - bytes_releasable_;
619 memory_stats_from_last_assign_.bytes_over = 624 memory_stats_from_last_assign_.bytes_over =
620 bytes_that_exceeded_memory_budget; 625 bytes_that_exceeded_memory_budget;
621 } 626 }
622 627
623 void TileManager::CleanUpUnusedImageDecodeTasks() { 628 void TileManager::CleanUpUnusedImageDecodeTasks() {
624 if (image_decode_tasks_.empty()) 629 if (image_decode_tasks_.empty())
625 return; 630 return;
626 631
627 // Calculate a set of layers that are used by at least one tile. 632 // Unused layers are layers whose use count is zero.
628 base::hash_set<int> used_layers;
629 for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it)
630 used_layers.insert(it->second->layer_id());
631
632 // Now calculate the set of layers in |image_decode_tasks_| that are not used
633 // by any tile.
634 std::vector<int> unused_layers; 633 std::vector<int> unused_layers;
635 for (LayerPixelRefTaskMap::iterator it = image_decode_tasks_.begin(); 634 for (LayerCountMap::iterator it = used_layer_counts_.begin();
636 it != image_decode_tasks_.end(); 635 it != used_layer_counts_.end();
637 ++it) { 636 ++it) {
638 if (used_layers.find(it->first) == used_layers.end()) 637 if (it->second == 0)
639 unused_layers.push_back(it->first); 638 unused_layers.push_back(it->first);
640 } 639 }
641 640
642 // Erase unused layers from |image_decode_tasks_|. 641 // Erase unused layers from |image_decode_tasks_| and from
642 // |used_layer_counts_|.
643 for (std::vector<int>::iterator it = unused_layers.begin(); 643 for (std::vector<int>::iterator it = unused_layers.begin();
644 it != unused_layers.end(); 644 it != unused_layers.end();
645 ++it) { 645 ++it) {
646 image_decode_tasks_.erase(*it); 646 image_decode_tasks_.erase(*it);
647 used_layer_counts_.erase(*it);
reveman 2013/09/04 21:25:17 can we move these two lines to UnregisterTile and
vmpstr 2013/09/04 22:03:49 Good idea. Done.
647 } 648 }
648 } 649 }
649 650
650 void TileManager::FreeResourceForTile(Tile* tile, RasterMode mode) { 651 void TileManager::FreeResourceForTile(Tile* tile, RasterMode mode) {
651 ManagedTileState& mts = tile->managed_state(); 652 ManagedTileState& mts = tile->managed_state();
652 if (mts.tile_versions[mode].resource_) { 653 if (mts.tile_versions[mode].resource_) {
653 resource_pool_->ReleaseResource( 654 resource_pool_->ReleaseResource(
654 mts.tile_versions[mode].resource_.Pass()); 655 mts.tile_versions[mode].resource_.Pass());
655 656
656 DCHECK_GE(bytes_releasable_, tile->bytes_consumed_if_allocated()); 657 DCHECK_GE(bytes_releasable_, tile->bytes_consumed_if_allocated());
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 ManagedTileState& mts = tile->managed_state(); 736 ManagedTileState& mts = tile->managed_state();
736 737
737 scoped_ptr<ResourcePool::Resource> resource = 738 scoped_ptr<ResourcePool::Resource> resource =
738 resource_pool_->AcquireResource( 739 resource_pool_->AcquireResource(
739 tile->tile_size_.size(), 740 tile->tile_size_.size(),
740 raster_worker_pool_->GetResourceFormat()); 741 raster_worker_pool_->GetResourceFormat());
741 const Resource* const_resource = resource.get(); 742 const Resource* const_resource = resource.get();
742 743
743 // Create and queue all image decode tasks that this tile depends on. 744 // Create and queue all image decode tasks that this tile depends on.
744 RasterWorkerPool::Task::Set decode_tasks; 745 RasterWorkerPool::Task::Set decode_tasks;
745 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; 746 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()];
vmpstr 2013/09/04 19:36:40 This is the line that prevents the early out from
746 for (PicturePileImpl::PixelRefIterator iter(tile->content_rect(), 747 for (PicturePileImpl::PixelRefIterator iter(tile->content_rect(),
747 tile->contents_scale(), 748 tile->contents_scale(),
748 tile->picture_pile()); 749 tile->picture_pile());
749 iter; ++iter) { 750 iter; ++iter) {
750 skia::LazyPixelRef* pixel_ref = *iter; 751 skia::LazyPixelRef* pixel_ref = *iter;
751 uint32_t id = pixel_ref->getGenerationID(); 752 uint32_t id = pixel_ref->getGenerationID();
752 753
753 // Append existing image decode task if available. 754 // Append existing image decode task if available.
754 PixelRefTaskMap::iterator decode_task_it = existing_pixel_refs.find(id); 755 PixelRefTaskMap::iterator decode_task_it = existing_pixel_refs.find(id);
755 if (decode_task_it != existing_pixel_refs.end()) { 756 if (decode_task_it != existing_pixel_refs.end()) {
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 bytes_releasable_ += tile->bytes_consumed_if_allocated(); 847 bytes_releasable_ += tile->bytes_consumed_if_allocated();
847 ++resources_releasable_; 848 ++resources_releasable_;
848 } 849 }
849 850
850 FreeUnusedResourcesForTile(tile); 851 FreeUnusedResourcesForTile(tile);
851 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 852 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
852 did_initialize_visible_tile_ = true; 853 did_initialize_visible_tile_ = true;
853 } 854 }
854 855
855 } // namespace cc 856 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/tile_manager_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698