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

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

Issue 38553002: cc: Add tile pool to tile manager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 2 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') | no next file » | 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 return SOON_BIN; 147 return SOON_BIN;
148 148
149 return EVENTUALLY_BIN; 149 return EVENTUALLY_BIN;
150 } 150 }
151 151
152 // Limit to the number of raster tasks that can be scheduled. 152 // Limit to the number of raster tasks that can be scheduled.
153 // This is high enough to not cause unnecessary scheduling but 153 // This is high enough to not cause unnecessary scheduling but
154 // gives us an insurance that we're not spending a huge amount 154 // gives us an insurance that we're not spending a huge amount
155 // of time scheduling one enormous set of tasks. 155 // of time scheduling one enormous set of tasks.
156 const size_t kMaxRasterTasks = 256u; 156 const size_t kMaxRasterTasks = 256u;
157 const size_t kTilePoolSize = 256u;
157 158
158 } // namespace 159 } // namespace
159 160
160 RasterTaskCompletionStats::RasterTaskCompletionStats() 161 RasterTaskCompletionStats::RasterTaskCompletionStats()
161 : completed_count(0u), 162 : completed_count(0u),
162 canceled_count(0u) { 163 canceled_count(0u) {
163 } 164 }
164 165
165 scoped_ptr<base::Value> RasterTaskCompletionStatsAsValue( 166 scoped_ptr<base::Value> RasterTaskCompletionStatsAsValue(
166 const RasterTaskCompletionStats& stats) { 167 const RasterTaskCompletionStats& stats) {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 all_tiles_required_for_activation_have_memory_(true), 207 all_tiles_required_for_activation_have_memory_(true),
207 memory_required_bytes_(0), 208 memory_required_bytes_(0),
208 memory_nice_to_have_bytes_(0), 209 memory_nice_to_have_bytes_(0),
209 bytes_releasable_(0), 210 bytes_releasable_(0),
210 resources_releasable_(0), 211 resources_releasable_(0),
211 ever_exceeded_memory_budget_(false), 212 ever_exceeded_memory_budget_(false),
212 rendering_stats_instrumentation_(rendering_stats_instrumentation), 213 rendering_stats_instrumentation_(rendering_stats_instrumentation),
213 did_initialize_visible_tile_(false), 214 did_initialize_visible_tile_(false),
214 did_check_for_completed_tasks_since_last_schedule_tasks_(true) { 215 did_check_for_completed_tasks_since_last_schedule_tasks_(true) {
215 raster_worker_pool_->SetClient(this); 216 raster_worker_pool_->SetClient(this);
217 tile_pool_.reserve(kTilePoolSize);
216 } 218 }
217 219
218 TileManager::~TileManager() { 220 TileManager::~TileManager() {
219 // Reset global state and manage. This should cause 221 // Reset global state and manage. This should cause
220 // our memory usage to drop to zero. 222 // our memory usage to drop to zero.
221 global_state_ = GlobalStateThatImpactsTilePriority(); 223 global_state_ = GlobalStateThatImpactsTilePriority();
222 224
223 CleanUpReleasedTiles(); 225 CleanUpReleasedTiles();
224 DCHECK_EQ(0u, tiles_.size()); 226 DCHECK_EQ(0u, tiles_.size());
225 227
228 for (size_t i = 0; i < tile_pool_.size(); ++i)
229 delete tile_pool_[i];
230 tile_pool_.clear();
231
226 RasterWorkerPool::RasterTask::Queue empty; 232 RasterWorkerPool::RasterTask::Queue empty;
227 raster_worker_pool_->ScheduleTasks(&empty); 233 raster_worker_pool_->ScheduleTasks(&empty);
228 234
229 // This should finish all pending tasks and release any uninitialized 235 // This should finish all pending tasks and release any uninitialized
230 // resources. 236 // resources.
231 raster_worker_pool_->Shutdown(); 237 raster_worker_pool_->Shutdown();
232 raster_worker_pool_->CheckForCompletedTasks(); 238 raster_worker_pool_->CheckForCompletedTasks();
233 239
234 DCHECK_EQ(0u, bytes_releasable_); 240 DCHECK_EQ(0u, bytes_releasable_);
235 DCHECK_EQ(0u, resources_releasable_); 241 DCHECK_EQ(0u, resources_releasable_);
(...skipping 10 matching lines...) Expand all
246 252
247 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { 253 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const {
248 return global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY; 254 return global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY;
249 } 255 }
250 256
251 void TileManager::CleanUpReleasedTiles() { 257 void TileManager::CleanUpReleasedTiles() {
252 for (std::vector<Tile*>::iterator it = released_tiles_.begin(); 258 for (std::vector<Tile*>::iterator it = released_tiles_.begin();
253 it != released_tiles_.end(); 259 it != released_tiles_.end();
254 ++it) { 260 ++it) {
255 Tile* tile = *it; 261 Tile* tile = *it;
262 ManagedTileState& mts = tile->managed_state();
256 263
257 FreeResourcesForTile(tile); 264 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
265 FreeResourceForTile(tile, static_cast<RasterMode>(mode));
266 mts.tile_versions[mode].set_use_resource();
267 mts.tile_versions[mode].raster_task_.Reset();
268 }
269 tile->reset_picture_pile();
258 270
259 DCHECK(tiles_.find(tile->id()) != tiles_.end()); 271 DCHECK(tiles_.find(tile->id()) != tiles_.end());
260 tiles_.erase(tile->id()); 272 tiles_.erase(tile->id());
261 273
262 LayerCountMap::iterator layer_it = 274 LayerCountMap::iterator layer_it =
263 used_layer_counts_.find(tile->layer_id()); 275 used_layer_counts_.find(tile->layer_id());
264 DCHECK_GT(layer_it->second, 0); 276 DCHECK_GT(layer_it->second, 0);
265 if (--layer_it->second == 0) { 277 if (--layer_it->second == 0) {
266 used_layer_counts_.erase(layer_it); 278 used_layer_counts_.erase(layer_it);
267 image_decode_tasks_.erase(tile->layer_id()); 279 image_decode_tasks_.erase(tile->layer_id());
268 } 280 }
269 281
270 delete tile; 282 if (tile_pool_.size() < kTilePoolSize)
283 tile_pool_.push_back(tile);
284 else
285 delete tile;
271 } 286 }
272 287
273 released_tiles_.clear(); 288 released_tiles_.clear();
274 } 289 }
275 290
276 void TileManager::UpdatePrioritizedTileSetIfNeeded() { 291 void TileManager::UpdatePrioritizedTileSetIfNeeded() {
277 if (!prioritized_tiles_dirty_) 292 if (!prioritized_tiles_dirty_)
278 return; 293 return;
279 294
280 CleanUpReleasedTiles(); 295 CleanUpReleasedTiles();
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 base::Unretained(this), 824 base::Unretained(this),
810 tile->layer_id(), 825 tile->layer_id(),
811 base::Unretained(pixel_ref))); 826 base::Unretained(pixel_ref)));
812 } 827 }
813 828
814 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { 829 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) {
815 ManagedTileState& mts = tile->managed_state(); 830 ManagedTileState& mts = tile->managed_state();
816 831
817 scoped_ptr<ResourcePool::Resource> resource = 832 scoped_ptr<ResourcePool::Resource> resource =
818 resource_pool_->AcquireResource( 833 resource_pool_->AcquireResource(
819 tile->tile_size_.size(), 834 tile->tile_size_,
820 raster_worker_pool_->GetResourceFormat()); 835 raster_worker_pool_->GetResourceFormat());
821 const Resource* const_resource = resource.get(); 836 const Resource* const_resource = resource.get();
822 837
823 // Create and queue all image decode tasks that this tile depends on. 838 // Create and queue all image decode tasks that this tile depends on.
824 RasterWorkerPool::Task::Set decode_tasks; 839 RasterWorkerPool::Task::Set decode_tasks;
825 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; 840 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()];
826 for (PicturePileImpl::PixelRefIterator iter(tile->content_rect(), 841 for (PicturePileImpl::PixelRefIterator iter(tile->content_rect(),
827 tile->contents_scale(), 842 tile->contents_scale(),
828 tile->picture_pile()); 843 tile->picture_pile());
829 iter; ++iter) { 844 iter; ++iter) {
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 } 947 }
933 948
934 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, 949 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile,
935 gfx::Size tile_size, 950 gfx::Size tile_size,
936 gfx::Rect content_rect, 951 gfx::Rect content_rect,
937 gfx::Rect opaque_rect, 952 gfx::Rect opaque_rect,
938 float contents_scale, 953 float contents_scale,
939 int layer_id, 954 int layer_id,
940 int source_frame_number, 955 int source_frame_number,
941 bool can_use_lcd_text) { 956 bool can_use_lcd_text) {
942 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, 957 scoped_refptr<Tile> tile;
943 picture_pile, 958 if (!tile_pool_.empty()) {
944 tile_size, 959 tile = make_scoped_refptr(tile_pool_.back());
945 content_rect, 960 tile_pool_.pop_back();
946 opaque_rect, 961 } else {
947 contents_scale, 962 tile = make_scoped_refptr(new Tile(this));
948 layer_id, 963 }
949 source_frame_number, 964
950 can_use_lcd_text)); 965 tile->Reset(picture_pile,
966 tile_size,
967 content_rect,
968 opaque_rect,
969 contents_scale,
970 layer_id,
971 source_frame_number,
972 can_use_lcd_text);
973
951 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 974 DCHECK(tiles_.find(tile->id()) == tiles_.end());
952 975
953 tiles_[tile->id()] = tile; 976 tiles_[tile->id()] = tile;
954 used_layer_counts_[tile->layer_id()]++; 977 used_layer_counts_[tile->layer_id()]++;
955 prioritized_tiles_dirty_ = true; 978 prioritized_tiles_dirty_ = true;
956 return tile; 979 return tile;
957 } 980 }
958 981
959 } // namespace cc 982 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/tile_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698