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
3 // found in the LICENSE file.
5 #ifndef CC_RESOURCES_TILE_MANAGER_H_
6 #define CC_RESOURCES_TILE_MANAGER_H_
14 #include "base/containers/hash_tables.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "base/values.h"
17 #include "cc/base/ref_counted_managed.h"
18 #include "cc/debug/rendering_stats_instrumentation.h"
19 #include "cc/layers/picture_layer_impl.h"
20 #include "cc/resources/managed_tile_state.h"
21 #include "cc/resources/memory_history.h"
22 #include "cc/resources/picture_pile_impl.h"
23 #include "cc/resources/prioritized_tile_set.h"
24 #include "cc/resources/rasterizer.h"
25 #include "cc/resources/resource_pool.h"
26 #include "cc/resources/tile.h"
29 class RasterizerDelegate;
30 class ResourceProvider;
32 class CC_EXPORT TileManagerClient {
34 virtual void NotifyReadyToActivate() = 0;
35 virtual void NotifyTileInitialized(const Tile* tile) = 0;
38 virtual ~TileManagerClient() {}
41 struct RasterTaskCompletionStats {
42 RasterTaskCompletionStats();
44 size_t completed_count;
45 size_t canceled_count;
47 scoped_ptr<base::Value> RasterTaskCompletionStatsAsValue(
48 const RasterTaskCompletionStats& stats);
50 // This class manages tiles, deciding which should get rasterized and which
51 // should no longer have any memory assigned to them. Tile objects are "owned"
52 // by layers; they automatically register with the manager when they are
53 // created, and unregister from the manager when they are deleted.
54 class CC_EXPORT TileManager : public RasterizerClient,
55 public RefCountedManager<Tile> {
57 struct CC_EXPORT PairedPictureLayer {
59 ~PairedPictureLayer();
61 PictureLayerImpl* active_layer;
62 PictureLayerImpl* pending_layer;
65 class CC_EXPORT RasterTileIterator {
67 RasterTileIterator(TileManager* tile_manager, TreePriority tree_priority);
68 ~RasterTileIterator();
70 RasterTileIterator& operator++();
71 operator bool() const;
75 struct PairedPictureLayerIterator {
76 PairedPictureLayerIterator();
77 ~PairedPictureLayerIterator();
79 Tile* PeekTile(TreePriority tree_priority);
80 void PopTile(TreePriority tree_priority);
82 std::pair<PictureLayerImpl::LayerRasterTileIterator*, WhichTree>
83 NextTileIterator(TreePriority tree_priority);
85 PictureLayerImpl::LayerRasterTileIterator active_iterator;
86 PictureLayerImpl::LayerRasterTileIterator pending_iterator;
88 std::vector<Tile*> returned_shared_tiles;
91 class RasterOrderComparator {
93 explicit RasterOrderComparator(TreePriority tree_priority);
95 bool operator()(PairedPictureLayerIterator* a,
96 PairedPictureLayerIterator* b) const;
99 TreePriority tree_priority_;
102 std::vector<PairedPictureLayerIterator> paired_iterators_;
103 std::vector<PairedPictureLayerIterator*> iterator_heap_;
104 TreePriority tree_priority_;
105 RasterOrderComparator comparator_;
107 DISALLOW_COPY_AND_ASSIGN(RasterTileIterator);
110 struct CC_EXPORT EvictionTileIterator {
112 EvictionTileIterator();
113 EvictionTileIterator(TileManager* tile_manager, TreePriority tree_priority);
114 ~EvictionTileIterator();
116 EvictionTileIterator& operator++();
117 operator bool() const;
121 struct PairedPictureLayerIterator {
122 PairedPictureLayerIterator();
123 ~PairedPictureLayerIterator();
125 Tile* PeekTile(TreePriority tree_priority);
126 void PopTile(TreePriority tree_priority);
128 PictureLayerImpl::LayerEvictionTileIterator* NextTileIterator(
129 TreePriority tree_priority);
131 PictureLayerImpl::LayerEvictionTileIterator active_iterator;
132 PictureLayerImpl::LayerEvictionTileIterator pending_iterator;
134 std::vector<Tile*> returned_shared_tiles;
137 class EvictionOrderComparator {
139 explicit EvictionOrderComparator(TreePriority tree_priority);
141 bool operator()(PairedPictureLayerIterator* a,
142 PairedPictureLayerIterator* b) const;
145 TreePriority tree_priority_;
148 std::vector<PairedPictureLayerIterator> paired_iterators_;
149 std::vector<PairedPictureLayerIterator*> iterator_heap_;
150 TreePriority tree_priority_;
151 EvictionOrderComparator comparator_;
153 DISALLOW_COPY_AND_ASSIGN(EvictionTileIterator);
156 static scoped_ptr<TileManager> Create(
157 TileManagerClient* client,
158 ResourcePool* resource_pool,
159 Rasterizer* rasterizer,
160 Rasterizer* gpu_rasterizer,
161 bool use_rasterize_on_demand,
162 RenderingStatsInstrumentation* rendering_stats_instrumentation);
163 virtual ~TileManager();
165 void ManageTiles(const GlobalStateThatImpactsTilePriority& state);
167 // Returns true when visible tiles have been initialized.
168 bool UpdateVisibleTiles();
170 scoped_refptr<Tile> CreateTile(PicturePileImpl* picture_pile,
171 const gfx::Size& tile_size,
172 const gfx::Rect& content_rect,
173 const gfx::Rect& opaque_rect,
174 float contents_scale,
176 int source_frame_number,
179 void RegisterPictureLayerImpl(PictureLayerImpl* layer);
180 void UnregisterPictureLayerImpl(PictureLayerImpl* layer);
182 scoped_ptr<base::Value> BasicStateAsValue() const;
183 scoped_ptr<base::Value> AllTilesAsValue() const;
184 void GetMemoryStats(size_t* memory_required_bytes,
185 size_t* memory_nice_to_have_bytes,
186 size_t* memory_allocated_bytes,
187 size_t* memory_used_bytes) const;
189 const MemoryHistory::Entry& memory_stats_from_last_assign() const {
190 return memory_stats_from_last_assign_;
193 void GetPairedPictureLayers(std::vector<PairedPictureLayer>* layers) const;
195 void InitializeTilesWithResourcesForTesting(const std::vector<Tile*>& tiles) {
196 for (size_t i = 0; i < tiles.size(); ++i) {
197 ManagedTileState& mts = tiles[i]->managed_state();
198 ManagedTileState::TileVersion& tile_version =
199 mts.tile_versions[HIGH_QUALITY_NO_LCD_RASTER_MODE];
201 tile_version.resource_ = resource_pool_->AcquireResource(gfx::Size(1, 1));
203 bytes_releasable_ += BytesConsumedIfAllocated(tiles[i]);
204 ++resources_releasable_;
208 void ReleaseTileResourcesForTesting(const std::vector<Tile*>& tiles) {
209 for (size_t i = 0; i < tiles.size(); ++i) {
210 Tile* tile = tiles[i];
211 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
212 FreeResourceForTile(tile, static_cast<RasterMode>(mode));
217 void SetGlobalStateForTesting(
218 const GlobalStateThatImpactsTilePriority& state) {
219 // Soft limit is used for resource pool such that
220 // memory returns to soft limit after going over.
221 if (state != global_state_) {
222 global_state_ = state;
223 prioritized_tiles_dirty_ = true;
228 TileManager(TileManagerClient* client,
229 ResourcePool* resource_pool,
230 Rasterizer* rasterizer,
231 Rasterizer* gpu_rasterizer,
232 bool use_rasterize_on_demand,
233 RenderingStatsInstrumentation* rendering_stats_instrumentation);
235 // Methods called by Tile
237 void DidChangeTilePriority(Tile* tile);
239 void CleanUpReleasedTiles();
241 // Overriden from RefCountedManager<Tile>:
242 virtual void Release(Tile* tile) OVERRIDE;
244 // Overriden from RasterizerClient:
245 virtual bool ShouldForceTasksRequiredForActivationToComplete() const OVERRIDE;
246 virtual void DidFinishRunningTasks() OVERRIDE;
247 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE;
249 typedef std::vector<Tile*> TileVector;
250 typedef std::set<Tile*> TileSet;
253 virtual void ScheduleTasks(
254 const TileVector& tiles_that_need_to_be_rasterized);
256 void AssignGpuMemoryToTiles(PrioritizedTileSet* tiles,
257 TileVector* tiles_that_need_to_be_rasterized);
258 void GetTilesWithAssignedBins(PrioritizedTileSet* tiles);
261 enum RasterizerType {
262 RASTERIZER_TYPE_DEFAULT,
267 void OnImageDecodeTaskCompleted(int layer_id,
268 SkPixelRef* pixel_ref,
270 void OnRasterTaskCompleted(Tile::Id tile,
271 scoped_ptr<ScopedResource> resource,
272 RasterMode raster_mode,
273 const PicturePileImpl::Analysis& analysis,
276 inline size_t BytesConsumedIfAllocated(const Tile* tile) const {
277 return Resource::MemorySizeBytes(tile->size(),
278 resource_pool_->resource_format());
281 void FreeResourceForTile(Tile* tile, RasterMode mode);
282 void FreeResourcesForTile(Tile* tile);
283 void FreeUnusedResourcesForTile(Tile* tile);
284 scoped_refptr<ImageDecodeTask> CreateImageDecodeTask(Tile* tile,
285 SkPixelRef* pixel_ref);
286 scoped_refptr<RasterTask> CreateRasterTask(Tile* tile);
287 scoped_ptr<base::Value> GetMemoryRequirementsAsValue() const;
288 void UpdatePrioritizedTileSetIfNeeded();
290 TileManagerClient* client_;
291 ResourcePool* resource_pool_;
292 scoped_ptr<RasterizerDelegate> rasterizer_delegate_;
293 GlobalStateThatImpactsTilePriority global_state_;
295 typedef base::hash_map<Tile::Id, Tile*> TileMap;
298 PrioritizedTileSet prioritized_tiles_;
299 bool prioritized_tiles_dirty_;
301 bool all_tiles_that_need_to_be_rasterized_have_memory_;
302 bool all_tiles_required_for_activation_have_memory_;
304 size_t memory_required_bytes_;
305 size_t memory_nice_to_have_bytes_;
307 size_t bytes_releasable_;
308 size_t resources_releasable_;
310 bool ever_exceeded_memory_budget_;
311 MemoryHistory::Entry memory_stats_from_last_assign_;
313 RenderingStatsInstrumentation* rendering_stats_instrumentation_;
315 bool did_initialize_visible_tile_;
316 bool did_check_for_completed_tasks_since_last_schedule_tasks_;
318 typedef base::hash_map<uint32_t, scoped_refptr<ImageDecodeTask> >
320 typedef base::hash_map<int, PixelRefTaskMap> LayerPixelRefTaskMap;
321 LayerPixelRefTaskMap image_decode_tasks_;
323 typedef base::hash_map<int, int> LayerCountMap;
324 LayerCountMap used_layer_counts_;
326 RasterTaskCompletionStats update_visible_tiles_stats_;
328 std::vector<Tile*> released_tiles_;
330 bool use_rasterize_on_demand_;
332 ResourceFormat resource_format_;
334 // Queues used when scheduling raster tasks.
335 RasterTaskQueue raster_queue_[NUM_RASTERIZER_TYPES];
337 std::vector<scoped_refptr<RasterTask> > orphan_raster_tasks_;
339 std::vector<PictureLayerImpl*> layers_;
341 DISALLOW_COPY_AND_ASSIGN(TileManager);
346 #endif // CC_RESOURCES_TILE_MANAGER_H_