tile_manager.h revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
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. 4 5#ifndef CC_RESOURCES_TILE_MANAGER_H_ 6#define CC_RESOURCES_TILE_MANAGER_H_ 7 8#include <queue> 9#include <set> 10#include <vector> 11 12#include "base/containers/hash_tables.h" 13#include "base/memory/scoped_ptr.h" 14#include "base/values.h" 15#include "cc/debug/rendering_stats_instrumentation.h" 16#include "cc/resources/managed_tile_state.h" 17#include "cc/resources/memory_history.h" 18#include "cc/resources/picture_pile_impl.h" 19#include "cc/resources/raster_worker_pool.h" 20#include "cc/resources/resource_pool.h" 21#include "cc/resources/tile.h" 22 23namespace cc { 24class ResourceProvider; 25 26class CC_EXPORT TileManagerClient { 27 public: 28 virtual void NotifyReadyToActivate() = 0; 29 30 protected: 31 virtual ~TileManagerClient() {} 32}; 33 34struct RasterTaskCompletionStats { 35 RasterTaskCompletionStats(); 36 37 size_t completed_count; 38 size_t canceled_count; 39}; 40scoped_ptr<base::Value> RasterTaskCompletionStatsAsValue( 41 const RasterTaskCompletionStats& stats); 42 43// This class manages tiles, deciding which should get rasterized and which 44// should no longer have any memory assigned to them. Tile objects are "owned" 45// by layers; they automatically register with the manager when they are 46// created, and unregister from the manager when they are deleted. 47class CC_EXPORT TileManager : public RasterWorkerPoolClient { 48 public: 49 static scoped_ptr<TileManager> Create( 50 TileManagerClient* client, 51 ResourceProvider* resource_provider, 52 size_t num_raster_threads, 53 RenderingStatsInstrumentation* rendering_stats_instrumentation, 54 bool use_map_image); 55 virtual ~TileManager(); 56 57 const GlobalStateThatImpactsTilePriority& GlobalState() const { 58 return global_state_; 59 } 60 void SetGlobalState(const GlobalStateThatImpactsTilePriority& state); 61 62 void ManageTiles(); 63 64 // Returns true when visible tiles have been initialized. 65 bool UpdateVisibleTiles(); 66 67 scoped_ptr<base::Value> BasicStateAsValue() const; 68 scoped_ptr<base::Value> AllTilesAsValue() const; 69 void GetMemoryStats(size_t* memory_required_bytes, 70 size_t* memory_nice_to_have_bytes, 71 size_t* memory_used_bytes) const; 72 73 const MemoryHistory::Entry& memory_stats_from_last_assign() const { 74 return memory_stats_from_last_assign_; 75 } 76 77 bool AreTilesRequiredForActivationReady() const { 78 return all_tiles_required_for_activation_have_been_initialized_; 79 } 80 81 protected: 82 TileManager(TileManagerClient* client, 83 ResourceProvider* resource_provider, 84 scoped_ptr<RasterWorkerPool> raster_worker_pool, 85 size_t num_raster_threads, 86 RenderingStatsInstrumentation* rendering_stats_instrumentation, 87 GLenum texture_format); 88 89 // Methods called by Tile 90 friend class Tile; 91 void RegisterTile(Tile* tile); 92 void UnregisterTile(Tile* tile); 93 94 // Overriden from RasterWorkerPoolClient: 95 virtual bool ShouldForceTasksRequiredForActivationToComplete() const 96 OVERRIDE; 97 virtual void DidFinishRunningTasks() OVERRIDE; 98 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE; 99 100 typedef std::vector<Tile*> TileVector; 101 typedef std::vector<scoped_refptr<Tile> > TileRefVector; 102 typedef std::set<Tile*> TileSet; 103 104 // Virtual for test 105 virtual void ScheduleTasks( 106 const TileVector& tiles_that_need_to_be_rasterized); 107 108 void AssignGpuMemoryToTiles( 109 const TileRefVector& sorted_tiles, 110 TileVector* tiles_that_need_to_be_rasterized); 111 void AssignBinsToTiles(TileRefVector* tiles); 112 void SortTiles(TileRefVector* tiles); 113 void GetSortedTiles(TileRefVector* tiles); 114 115 private: 116 void OnImageDecodeTaskCompleted( 117 int layer_id, 118 skia::LazyPixelRef* pixel_ref, 119 bool was_canceled); 120 void OnRasterTaskCompleted( 121 Tile::Id tile, 122 scoped_ptr<ResourcePool::Resource> resource, 123 RasterMode raster_mode, 124 const PicturePileImpl::Analysis& analysis, 125 bool was_canceled); 126 127 RasterMode DetermineRasterMode(const Tile* tile) const; 128 void CleanUpUnusedImageDecodeTasks(); 129 void FreeResourceForTile(Tile* tile, RasterMode mode); 130 void FreeResourcesForTile(Tile* tile); 131 void FreeUnusedResourcesForTile(Tile* tile); 132 RasterWorkerPool::Task CreateImageDecodeTask( 133 Tile* tile, skia::LazyPixelRef* pixel_ref); 134 RasterWorkerPool::RasterTask CreateRasterTask(Tile* tile); 135 scoped_ptr<base::Value> GetMemoryRequirementsAsValue() const; 136 137 TileManagerClient* client_; 138 scoped_ptr<ResourcePool> resource_pool_; 139 scoped_ptr<RasterWorkerPool> raster_worker_pool_; 140 GlobalStateThatImpactsTilePriority global_state_; 141 142 typedef base::hash_map<Tile::Id, Tile*> TileMap; 143 TileMap tiles_; 144 145 TileRefVector sorted_tiles_; 146 147 bool all_tiles_that_need_to_be_rasterized_have_memory_; 148 bool all_tiles_required_for_activation_have_memory_; 149 bool all_tiles_required_for_activation_have_been_initialized_; 150 151 bool ever_exceeded_memory_budget_; 152 MemoryHistory::Entry memory_stats_from_last_assign_; 153 154 RenderingStatsInstrumentation* rendering_stats_instrumentation_; 155 156 bool did_initialize_visible_tile_; 157 158 GLenum texture_format_; 159 160 typedef base::hash_map<uint32_t, RasterWorkerPool::Task> PixelRefTaskMap; 161 typedef base::hash_map<int, PixelRefTaskMap> LayerPixelRefTaskMap; 162 LayerPixelRefTaskMap image_decode_tasks_; 163 164 RasterTaskCompletionStats update_visible_tiles_stats_; 165 166 DISALLOW_COPY_AND_ASSIGN(TileManager); 167}; 168 169} // namespace cc 170 171#endif // CC_RESOURCES_TILE_MANAGER_H_ 172