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

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: review 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
205 int& count = used_layer_counts_[tile->layer_id()];
reveman 2013/09/05 00:29:27 I think it would be more efficient and a bit clean
tomhudson 2013/09/05 07:32:23 At first I didn't understand why, but your point i
206 if (--count == 0) {
207 used_layer_counts_.erase(tile->layer_id());
208 image_decode_tasks_.erase(tile->layer_id());
209 }
210
201 prioritized_tiles_dirty_ = true; 211 prioritized_tiles_dirty_ = true;
202 } 212 }
203 213
204 void TileManager::DidChangeTilePriority(Tile* tile) { 214 void TileManager::DidChangeTilePriority(Tile* tile) {
205 prioritized_tiles_dirty_ = true; 215 prioritized_tiles_dirty_ = true;
206 } 216 }
207 217
208 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { 218 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const {
209 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; 219 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY;
210 } 220 }
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 tiles->InsertTile(tile, priority_bin); 372 tiles->InsertTile(tile, priority_bin);
363 } 373 }
364 } 374 }
365 375
366 void TileManager::ManageTiles() { 376 void TileManager::ManageTiles() {
367 TRACE_EVENT0("cc", "TileManager::ManageTiles"); 377 TRACE_EVENT0("cc", "TileManager::ManageTiles");
368 378
369 TileVector tiles_that_need_to_be_rasterized; 379 TileVector tiles_that_need_to_be_rasterized;
370 AssignGpuMemoryToTiles(GetPrioritizedTileSet(), 380 AssignGpuMemoryToTiles(GetPrioritizedTileSet(),
371 &tiles_that_need_to_be_rasterized); 381 &tiles_that_need_to_be_rasterized);
372 CleanUpUnusedImageDecodeTasks();
373 382
374 // Finally, schedule rasterizer tasks. 383 // Finally, schedule rasterizer tasks.
375 ScheduleTasks(tiles_that_need_to_be_rasterized); 384 ScheduleTasks(tiles_that_need_to_be_rasterized);
376 385
377 TRACE_EVENT_INSTANT1( 386 TRACE_EVENT_INSTANT1(
378 "cc", "DidManage", TRACE_EVENT_SCOPE_THREAD, 387 "cc", "DidManage", TRACE_EVENT_SCOPE_THREAD,
379 "state", TracedValue::FromValue(BasicStateAsValue().release())); 388 "state", TracedValue::FromValue(BasicStateAsValue().release()));
380 389
381 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, 390 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
382 resource_pool_->total_memory_usage_bytes() - 391 resource_pool_->total_memory_usage_bytes() -
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 memory_stats_from_last_assign_.total_budget_in_bytes = 622 memory_stats_from_last_assign_.total_budget_in_bytes =
614 global_state_.memory_limit_in_bytes; 623 global_state_.memory_limit_in_bytes;
615 memory_stats_from_last_assign_.bytes_allocated = 624 memory_stats_from_last_assign_.bytes_allocated =
616 bytes_allocatable - bytes_left; 625 bytes_allocatable - bytes_left;
617 memory_stats_from_last_assign_.bytes_unreleasable = 626 memory_stats_from_last_assign_.bytes_unreleasable =
618 bytes_allocatable - bytes_releasable_; 627 bytes_allocatable - bytes_releasable_;
619 memory_stats_from_last_assign_.bytes_over = 628 memory_stats_from_last_assign_.bytes_over =
620 bytes_that_exceeded_memory_budget; 629 bytes_that_exceeded_memory_budget;
621 } 630 }
622 631
623 void TileManager::CleanUpUnusedImageDecodeTasks() {
624 if (image_decode_tasks_.empty())
625 return;
626
627 // Calculate a set of layers that are used by at least one tile.
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;
635 for (LayerPixelRefTaskMap::iterator it = image_decode_tasks_.begin();
636 it != image_decode_tasks_.end();
637 ++it) {
638 if (used_layers.find(it->first) == used_layers.end())
639 unused_layers.push_back(it->first);
640 }
641
642 // Erase unused layers from |image_decode_tasks_|.
643 for (std::vector<int>::iterator it = unused_layers.begin();
644 it != unused_layers.end();
645 ++it) {
646 image_decode_tasks_.erase(*it);
647 }
648 }
649
650 void TileManager::FreeResourceForTile(Tile* tile, RasterMode mode) { 632 void TileManager::FreeResourceForTile(Tile* tile, RasterMode mode) {
651 ManagedTileState& mts = tile->managed_state(); 633 ManagedTileState& mts = tile->managed_state();
652 if (mts.tile_versions[mode].resource_) { 634 if (mts.tile_versions[mode].resource_) {
653 resource_pool_->ReleaseResource( 635 resource_pool_->ReleaseResource(
654 mts.tile_versions[mode].resource_.Pass()); 636 mts.tile_versions[mode].resource_.Pass());
655 637
656 DCHECK_GE(bytes_releasable_, tile->bytes_consumed_if_allocated()); 638 DCHECK_GE(bytes_releasable_, tile->bytes_consumed_if_allocated());
657 DCHECK_GE(resources_releasable_, 1u); 639 DCHECK_GE(resources_releasable_, 1u);
658 640
659 bytes_releasable_ -= tile->bytes_consumed_if_allocated(); 641 bytes_releasable_ -= tile->bytes_consumed_if_allocated();
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 bytes_releasable_ += tile->bytes_consumed_if_allocated(); 828 bytes_releasable_ += tile->bytes_consumed_if_allocated();
847 ++resources_releasable_; 829 ++resources_releasable_;
848 } 830 }
849 831
850 FreeUnusedResourcesForTile(tile); 832 FreeUnusedResourcesForTile(tile);
851 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 833 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
852 did_initialize_visible_tile_ = true; 834 did_initialize_visible_tile_ = true;
853 } 835 }
854 836
855 } // namespace cc 837 } // 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