| OLD | NEW |
| 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 #ifndef CC_TILE_MANAGER_H_ | 5 #ifndef CC_TILE_MANAGER_H_ |
| 6 #define CC_TILE_MANAGER_H_ | 6 #define CC_TILE_MANAGER_H_ |
| 7 | 7 |
| 8 #include <list> | 8 #include <list> |
| 9 #include <queue> | 9 #include <queue> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/hash_tables.h" | 12 #include "base/hash_tables.h" |
| 13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 14 #include "base/values.h" | 14 #include "base/values.h" |
| 15 #include "cc/memory_history.h" | 15 #include "cc/memory_history.h" |
| 16 #include "cc/rendering_stats.h" | 16 #include "cc/rendering_stats.h" |
| 17 #include "cc/resource_pool.h" | 17 #include "cc/resource_pool.h" |
| 18 #include "cc/tile_priority.h" | 18 #include "cc/tile_priority.h" |
| 19 | 19 |
| 20 namespace cc { | 20 namespace cc { |
| 21 class Tile; |
| 22 } // namespace cc |
| 23 |
| 24 #if defined(COMPILER_GCC) |
| 25 namespace BASE_HASH_NAMESPACE { |
| 26 template<> |
| 27 struct hash<cc::Tile*> { |
| 28 size_t operator()(cc::Tile* ptr) const { |
| 29 return hash<size_t>()(reinterpret_cast<size_t>(ptr)); |
| 30 } |
| 31 }; |
| 32 } // namespace BASE_HASH_NAMESPACE |
| 33 #endif // COMPILER |
| 34 |
| 35 namespace cc { |
| 21 class RasterWorkerPool; | 36 class RasterWorkerPool; |
| 22 class ResourceProvider; | 37 class ResourceProvider; |
| 23 class Tile; | 38 class TileManager; |
| 24 class TileVersion; | 39 class TileVersion; |
| 25 | 40 |
| 26 class CC_EXPORT TileManagerClient { | 41 class CC_EXPORT TileManagerClient { |
| 27 public: | 42 public: |
| 28 virtual void ScheduleManageTiles() = 0; | 43 virtual void ScheduleManageTiles() = 0; |
| 29 virtual void DidUploadVisibleHighResolutionTile() = 0; | 44 virtual void DidUploadVisibleHighResolutionTile() = 0; |
| 30 | 45 |
| 31 protected: | 46 protected: |
| 32 virtual ~TileManagerClient() {} | 47 virtual ~TileManagerClient() {} |
| 33 }; | 48 }; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 54 enum TileRasterState { | 69 enum TileRasterState { |
| 55 IDLE_STATE = 0, | 70 IDLE_STATE = 0, |
| 56 WAITING_FOR_RASTER_STATE = 1, | 71 WAITING_FOR_RASTER_STATE = 1, |
| 57 RASTER_STATE = 2, | 72 RASTER_STATE = 2, |
| 58 SET_PIXELS_STATE = 3, | 73 SET_PIXELS_STATE = 3, |
| 59 NUM_STATES = 4 | 74 NUM_STATES = 4 |
| 60 }; | 75 }; |
| 61 | 76 |
| 62 // This is state that is specific to a tile that is | 77 // This is state that is specific to a tile that is |
| 63 // managed by the TileManager. | 78 // managed by the TileManager. |
| 64 class CC_EXPORT ManagedTileState { | 79 class CC_EXPORT ManagedTileState : public base::RefCounted<ManagedTileState> { |
| 65 public: | 80 public: |
| 66 ManagedTileState(); | 81 explicit ManagedTileState(TileManager* tile_manager); |
| 67 ~ManagedTileState(); | |
| 68 | 82 |
| 69 // Persisted state: valid all the time. | 83 // Persisted state: valid all the time. |
| 84 TileManager* tile_manager; |
| 70 bool can_use_gpu_memory; | 85 bool can_use_gpu_memory; |
| 71 bool can_be_freed; | 86 bool can_be_freed; |
| 72 scoped_ptr<ResourcePool::Resource> resource; | 87 scoped_ptr<ResourcePool::Resource> resource; |
| 73 bool resource_is_being_initialized; | 88 bool resource_is_being_initialized; |
| 74 bool contents_swizzled; | 89 bool contents_swizzled; |
| 75 bool need_to_gather_pixel_refs; | 90 bool need_to_gather_pixel_refs; |
| 76 std::list<skia::LazyPixelRef*> pending_pixel_refs; | 91 std::list<skia::LazyPixelRef*> pending_pixel_refs; |
| 77 TileRasterState raster_state; | 92 TileRasterState raster_state; |
| 93 size_t bytes_consumed_if_allocated; |
| 94 bool visible_high_resolution; |
| 95 scoped_refptr<PicturePileImpl> picture_pile; |
| 96 gfx::Rect content_rect; |
| 97 float contents_scale; |
| 98 gfx::Size tile_size; |
| 99 GLenum format; |
| 78 | 100 |
| 79 // Ephemeral state, valid only during Manage. | 101 // Ephemeral state, valid only during Manage. |
| 80 TileManagerBin bin[NUM_BIN_PRIORITIES]; | 102 TileManagerBin bin[NUM_BIN_PRIORITIES]; |
| 81 TileManagerBin tree_bin[NUM_TREES]; | 103 TileManagerBin tree_bin[NUM_TREES]; |
| 82 // The bin that the tile would have if the GPU memory manager had a maximally
permissive policy, | 104 // The bin that the tile would have if the GPU memory manager had a |
| 83 // send to the GPU memory manager to determine policy. | 105 // maximally permissive policy, send to the GPU memory manager to |
| 106 // determine policy. |
| 84 TileManagerBin gpu_memmgr_stats_bin; | 107 TileManagerBin gpu_memmgr_stats_bin; |
| 85 TileResolution resolution; | 108 TileResolution resolution; |
| 86 float time_to_needed_in_seconds; | 109 float time_to_needed_in_seconds; |
| 110 |
| 111 private: |
| 112 friend class base::RefCounted<ManagedTileState>; |
| 113 |
| 114 ~ManagedTileState(); |
| 87 }; | 115 }; |
| 88 | 116 |
| 89 // This class manages tiles, deciding which should get rasterized and which | 117 // This class manages tiles, deciding which should get rasterized and which |
| 90 // should no longer have any memory assigned to them. Tile objects are "owned" | 118 // should no longer have any memory assigned to them. Tile objects are "owned" |
| 91 // by layers; they automatically register with the manager when they are | 119 // by layers; they automatically register with the manager when they are |
| 92 // created, and unregister from the manager when they are deleted. | 120 // created, and unregister from the manager when they are deleted. |
| 93 class CC_EXPORT TileManager { | 121 class CC_EXPORT TileManager { |
| 94 public: | 122 public: |
| 95 TileManager(TileManagerClient* client, | 123 TileManager(TileManagerClient* client, |
| 96 ResourceProvider *resource_provider, | 124 ResourceProvider *resource_provider, |
| 97 size_t num_raster_threads, | 125 size_t num_raster_threads, |
| 98 bool record_rendering_stats); | 126 bool record_rendering_stats); |
| 99 virtual ~TileManager(); | 127 virtual ~TileManager(); |
| 100 | 128 |
| 101 const GlobalStateThatImpactsTilePriority& GlobalState() const { | 129 const GlobalStateThatImpactsTilePriority& GlobalState() const { |
| 102 return global_state_; | 130 return global_state_; |
| 103 } | 131 } |
| 104 void SetGlobalState(const GlobalStateThatImpactsTilePriority& state); | 132 void SetGlobalState(const GlobalStateThatImpactsTilePriority& state); |
| 105 | 133 |
| 106 void ManageTiles(); | 134 void ManageTiles(); |
| 107 void CheckForCompletedTileUploads(); | 135 void CheckForCompletedTileUploads(); |
| 108 | 136 |
| 109 scoped_ptr<base::Value> AsValue() const; | 137 scoped_ptr<base::Value> AsValue() const; |
| 110 void GetMemoryStats(size_t* memoryRequiredBytes, | 138 void GetMemoryStats(size_t* memory_required_bytes, |
| 111 size_t* memoryNiceToHaveBytes, | 139 size_t* memory_nice_to_have_bytes, |
| 112 size_t* memoryUsedBytes) const; | 140 size_t* memory_used_bytes) const; |
| 113 void GetRenderingStats(RenderingStats* stats); | 141 void GetRenderingStats(RenderingStats* stats); |
| 114 bool HasPendingWorkScheduled(WhichTree tree) const; | 142 bool HasPendingWorkScheduled(WhichTree tree) const; |
| 115 | 143 |
| 116 const MemoryHistory::Entry& memory_stats_from_last_assign() const { return mem
ory_stats_from_last_assign_; } | 144 const MemoryHistory::Entry& memory_stats_from_last_assign() const { |
| 145 return memory_stats_from_last_assign_; |
| 146 } |
| 117 | 147 |
| 118 protected: | 148 protected: |
| 119 // Methods called by Tile | 149 // Methods called by Tile |
| 120 friend class Tile; | 150 friend class Tile; |
| 121 void RegisterTile(Tile* tile); | 151 void RegisterTile(Tile* tile); |
| 122 void UnregisterTile(Tile* tile); | 152 void UnregisterTile(Tile* tile); |
| 123 void WillModifyTilePriority( | 153 void WillModifyTilePriority( |
| 124 Tile* tile, WhichTree tree, const TilePriority& new_priority) { | 154 Tile* tile, WhichTree tree, const TilePriority& new_priority) { |
| 125 // TODO(nduca): Do something smarter if reprioritization turns out to be | 155 // TODO(nduca): Do something smarter if reprioritization turns out to be |
| 126 // costly. | 156 // costly. |
| 127 ScheduleManageTiles(); | 157 ScheduleManageTiles(); |
| 128 } | 158 } |
| 129 | 159 |
| 130 private: | 160 private: |
| 161 friend class ManagedTileState; |
| 162 |
| 163 // Methods called by ManagedTileState |
| 164 void RegisterManagedTile(ManagedTileState* mts); |
| 165 void UnregisterManagedTile(ManagedTileState* mts); |
| 166 |
| 131 void SortTiles(); | 167 void SortTiles(); |
| 132 void AssignGpuMemoryToTiles(); | 168 void AssignGpuMemoryToTiles(); |
| 133 void FreeResourcesForTile(Tile* tile); | 169 void FreeResourcesForTile(ManagedTileState* mts); |
| 134 void ScheduleManageTiles() { | 170 void ScheduleManageTiles() { |
| 135 if (manage_tiles_pending_) | 171 if (manage_tiles_pending_) |
| 136 return; | 172 return; |
| 137 client_->ScheduleManageTiles(); | 173 client_->ScheduleManageTiles(); |
| 138 manage_tiles_pending_ = true; | 174 manage_tiles_pending_ = true; |
| 139 } | 175 } |
| 140 void DispatchMoreTasks(); | 176 void DispatchMoreTasks(); |
| 141 void GatherPixelRefsForTile(Tile* tile); | 177 void GatherPixelRefsForTile(ManagedTileState* mts); |
| 142 void DispatchImageDecodeTasksForTile(Tile* tile); | 178 void DispatchImageDecodeTasksForTile(ManagedTileState* mts); |
| 143 void DispatchOneImageDecodeTask( | 179 void DispatchOneImageDecodeTask( |
| 144 scoped_refptr<Tile> tile, skia::LazyPixelRef* pixel_ref); | 180 scoped_refptr<ManagedTileState> mts, skia::LazyPixelRef* pixel_ref); |
| 145 void OnImageDecodeTaskCompleted( | 181 void OnImageDecodeTaskCompleted( |
| 146 scoped_refptr<Tile> tile, uint32_t pixel_ref_id); | 182 scoped_refptr<ManagedTileState> mts, uint32_t pixel_ref_id); |
| 147 bool CanDispatchRasterTask(Tile* tile); | 183 bool CanDispatchRasterTask(ManagedTileState* mts); |
| 148 void DispatchOneRasterTask(scoped_refptr<Tile> tile); | 184 void DispatchOneRasterTask(scoped_refptr<ManagedTileState> mts); |
| 149 void OnRasterTaskCompleted( | 185 void OnRasterTaskCompleted( |
| 150 scoped_refptr<Tile> tile, | 186 scoped_refptr<ManagedTileState> mts, |
| 151 scoped_ptr<ResourcePool::Resource> resource, | 187 scoped_ptr<ResourcePool::Resource> resource, |
| 152 int manage_tiles_call_count_when_dispatched); | 188 int manage_tiles_call_count_when_dispatched); |
| 153 void DidFinishTileInitialization(Tile* tile); | 189 void DidFinishTileInitialization(ManagedTileState* mts); |
| 154 void DidTileRasterStateChange(Tile* tile, TileRasterState state); | 190 void DidTileRasterStateChange(ManagedTileState* mts, TileRasterState state); |
| 155 void DidTileBinChange(Tile* tile, | 191 void DidTileBinChange(ManagedTileState* mts, |
| 156 TileManagerBin bin, | 192 TileManagerBin bin, |
| 157 WhichTree tree); | 193 WhichTree tree); |
| 158 scoped_ptr<Value> GetMemoryRequirementsAsValue() const; | 194 scoped_ptr<Value> GetMemoryRequirementsAsValue() const; |
| 159 | 195 |
| 160 static void RunRasterTask(uint8* buffer, | 196 static void RunRasterTask(uint8* buffer, |
| 161 const gfx::Rect& rect, | 197 const gfx::Rect& rect, |
| 162 float contents_scale, | 198 float contents_scale, |
| 163 PicturePileImpl* picture_pile, | 199 PicturePileImpl* picture_pile, |
| 164 RenderingStats* stats); | 200 RenderingStats* stats); |
| 165 static void RunImageDecodeTask(skia::LazyPixelRef* pixel_ref, | 201 static void RunImageDecodeTask(skia::LazyPixelRef* pixel_ref, |
| 166 RenderingStats* stats); | 202 RenderingStats* stats); |
| 167 | 203 |
| 168 TileManagerClient* client_; | 204 TileManagerClient* client_; |
| 169 scoped_ptr<ResourcePool> resource_pool_; | 205 scoped_ptr<ResourcePool> resource_pool_; |
| 170 scoped_ptr<RasterWorkerPool> raster_worker_pool_; | 206 scoped_ptr<RasterWorkerPool> raster_worker_pool_; |
| 171 bool manage_tiles_pending_; | 207 bool manage_tiles_pending_; |
| 172 int manage_tiles_call_count_; | 208 int manage_tiles_call_count_; |
| 173 | 209 |
| 174 GlobalStateThatImpactsTilePriority global_state_; | 210 GlobalStateThatImpactsTilePriority global_state_; |
| 175 | 211 |
| 176 typedef std::vector<Tile*> TileVector; | 212 typedef base::hash_set<Tile*> TileSet; |
| 177 TileVector tiles_; | 213 TileSet tiles_; |
| 214 |
| 215 typedef std::vector<scoped_refptr<ManagedTileState> > ManagedTileVector; |
| 216 ManagedTileVector managed_tiles_; |
| 217 |
| 218 typedef std::vector<ManagedTileState*> TileVector; |
| 178 TileVector tiles_that_need_to_be_rasterized_; | 219 TileVector tiles_that_need_to_be_rasterized_; |
| 179 | 220 |
| 180 typedef std::list<Tile*> TileList; | 221 typedef std::list<ManagedTileState*> TileList; |
| 181 // Tiles with image decoding tasks. These tiles need to be rasterized | 222 // Tiles with image decoding tasks. These tiles need to be rasterized |
| 182 // when all the image decoding tasks finish. | 223 // when all the image decoding tasks finish. |
| 183 TileList tiles_with_image_decoding_tasks_; | 224 TileList tiles_with_image_decoding_tasks_; |
| 184 | 225 |
| 185 typedef base::hash_map<uint32_t, skia::LazyPixelRef*> PixelRefMap; | 226 typedef base::hash_map<uint32_t, skia::LazyPixelRef*> PixelRefMap; |
| 186 PixelRefMap pending_decode_tasks_; | 227 PixelRefMap pending_decode_tasks_; |
| 187 | 228 |
| 188 typedef std::queue<scoped_refptr<Tile> > TileQueue; | 229 typedef std::queue<scoped_refptr<ManagedTileState> > TileQueue; |
| 189 TileQueue tiles_with_pending_set_pixels_; | 230 TileQueue tiles_with_pending_set_pixels_; |
| 190 size_t bytes_pending_set_pixels_; | 231 size_t bytes_pending_set_pixels_; |
| 191 bool ever_exceeded_memory_budget_; | 232 bool ever_exceeded_memory_budget_; |
| 192 MemoryHistory::Entry memory_stats_from_last_assign_; | 233 MemoryHistory::Entry memory_stats_from_last_assign_; |
| 193 | 234 |
| 194 bool record_rendering_stats_; | 235 bool record_rendering_stats_; |
| 195 RenderingStats rendering_stats_; | 236 RenderingStats rendering_stats_; |
| 196 | 237 |
| 197 int raster_state_count_[NUM_STATES][NUM_TREES][NUM_BINS]; | 238 int raster_state_count_[NUM_STATES][NUM_TREES][NUM_BINS]; |
| 198 | 239 |
| 199 DISALLOW_COPY_AND_ASSIGN(TileManager); | 240 DISALLOW_COPY_AND_ASSIGN(TileManager); |
| 200 }; | 241 }; |
| 201 | 242 |
| 202 } // namespace cc | 243 } // namespace cc |
| 203 | 244 |
| 204 #endif // CC_TILE_MANAGER_H_ | 245 #endif // CC_TILE_MANAGER_H_ |
| OLD | NEW |