OLD | NEW |
| (Empty) |
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_TILE_MANAGER_H_ | |
6 #define CC_TILE_MANAGER_H_ | |
7 | |
8 #include <list> | |
9 #include <queue> | |
10 #include <set> | |
11 #include <vector> | |
12 | |
13 #include "base/hash_tables.h" | |
14 #include "base/memory/scoped_ptr.h" | |
15 #include "base/values.h" | |
16 #include "cc/base/worker_pool.h" | |
17 #include "cc/debug/rendering_stats.h" | |
18 #include "cc/memory_history.h" | |
19 #include "cc/picture_pile_impl.h" | |
20 #include "cc/resource_pool.h" | |
21 #include "cc/tile_priority.h" | |
22 | |
23 namespace cc { | |
24 class RasterWorkerPool; | |
25 class ResourceProvider; | |
26 class Tile; | |
27 class TileVersion; | |
28 | |
29 class CC_EXPORT TileManagerClient { | |
30 public: | |
31 virtual void ScheduleManageTiles() = 0; | |
32 virtual void DidInitializeVisibleTile() = 0; | |
33 | |
34 protected: | |
35 virtual ~TileManagerClient() {} | |
36 }; | |
37 | |
38 // Tile manager classifying tiles into a few basic | |
39 // bins: | |
40 enum TileManagerBin { | |
41 NOW_BIN = 0, // Needed ASAP. | |
42 SOON_BIN = 1, // Impl-side version of prepainting. | |
43 EVENTUALLY_BIN = 2, // Nice to have, if we've got memory and time. | |
44 NEVER_BIN = 3, // Dont bother. | |
45 NUM_BINS = 4 | |
46 // Be sure to update TileManagerBinAsValue when adding new fields. | |
47 }; | |
48 scoped_ptr<base::Value> TileManagerBinAsValue( | |
49 TileManagerBin bin); | |
50 | |
51 enum TileManagerBinPriority { | |
52 HIGH_PRIORITY_BIN = 0, | |
53 LOW_PRIORITY_BIN = 1, | |
54 NUM_BIN_PRIORITIES = 2 | |
55 }; | |
56 scoped_ptr<base::Value> TileManagerBinPriorityAsValue( | |
57 TileManagerBinPriority bin); | |
58 | |
59 enum TileRasterState { | |
60 IDLE_STATE = 0, | |
61 WAITING_FOR_RASTER_STATE = 1, | |
62 RASTER_STATE = 2, | |
63 UPLOAD_STATE = 3, | |
64 FORCED_UPLOAD_COMPLETION_STATE = 4, | |
65 NUM_STATES = 5 | |
66 }; | |
67 scoped_ptr<base::Value> TileRasterStateAsValue( | |
68 TileRasterState bin); | |
69 | |
70 // This class manages tiles, deciding which should get rasterized and which | |
71 // should no longer have any memory assigned to them. Tile objects are "owned" | |
72 // by layers; they automatically register with the manager when they are | |
73 // created, and unregister from the manager when they are deleted. | |
74 class CC_EXPORT TileManager : public WorkerPoolClient { | |
75 public: | |
76 TileManager(TileManagerClient* client, | |
77 ResourceProvider *resource_provider, | |
78 size_t num_raster_threads, | |
79 bool use_cheapess_estimator, | |
80 bool use_color_estimator, | |
81 bool prediction_benchmarking); | |
82 virtual ~TileManager(); | |
83 | |
84 const GlobalStateThatImpactsTilePriority& GlobalState() const { | |
85 return global_state_; | |
86 } | |
87 void SetGlobalState(const GlobalStateThatImpactsTilePriority& state); | |
88 | |
89 void ManageTiles(); | |
90 void CheckForCompletedTileUploads(); | |
91 void AbortPendingTileUploads(); | |
92 void ForceTileUploadToComplete(Tile* tile); | |
93 void DidCompleteFrame(); | |
94 | |
95 scoped_ptr<base::Value> BasicStateAsValue() const; | |
96 scoped_ptr<base::Value> AllTilesAsValue() const; | |
97 void GetMemoryStats(size_t* memoryRequiredBytes, | |
98 size_t* memoryNiceToHaveBytes, | |
99 size_t* memoryUsedBytes) const; | |
100 void SetRecordRenderingStats(bool record_rendering_stats); | |
101 void GetRenderingStats(RenderingStats* stats); | |
102 bool HasPendingWorkScheduled(WhichTree tree) const; | |
103 | |
104 const MemoryHistory::Entry& memory_stats_from_last_assign() const { | |
105 return memory_stats_from_last_assign_; | |
106 } | |
107 | |
108 // Overridden from WorkerPoolClient: | |
109 virtual void DidFinishDispatchingWorkerPoolCompletionCallbacks() OVERRIDE; | |
110 | |
111 protected: | |
112 // Methods called by Tile | |
113 friend class Tile; | |
114 void RegisterTile(Tile* tile); | |
115 void UnregisterTile(Tile* tile); | |
116 void WillModifyTilePriority( | |
117 Tile* tile, WhichTree tree, const TilePriority& new_priority) { | |
118 // TODO(nduca): Do something smarter if reprioritization turns out to be | |
119 // costly. | |
120 ScheduleManageTiles(); | |
121 } | |
122 | |
123 private: | |
124 | |
125 // Data that is passed to raster tasks. | |
126 struct RasterTaskMetadata { | |
127 bool prediction_benchmarking; | |
128 bool is_tile_in_pending_tree_now_bin; | |
129 TileResolution tile_resolution; | |
130 int layer_id; | |
131 }; | |
132 | |
133 RasterTaskMetadata GetRasterTaskMetadata(const Tile& tile) const; | |
134 | |
135 void SortTiles(); | |
136 void AssignGpuMemoryToTiles(); | |
137 void FreeResourcesForTile(Tile* tile); | |
138 void ScheduleManageTiles() { | |
139 if (manage_tiles_pending_) | |
140 return; | |
141 client_->ScheduleManageTiles(); | |
142 manage_tiles_pending_ = true; | |
143 } | |
144 void DispatchMoreTasks(); | |
145 void AnalyzeTile(Tile* tile); | |
146 void GatherPixelRefsForTile(Tile* tile); | |
147 void DispatchImageDecodeTasksForTile(Tile* tile); | |
148 void DispatchOneImageDecodeTask( | |
149 scoped_refptr<Tile> tile, skia::LazyPixelRef* pixel_ref); | |
150 void OnImageDecodeTaskCompleted( | |
151 scoped_refptr<Tile> tile, | |
152 uint32_t pixel_ref_id); | |
153 bool CanDispatchRasterTask(Tile* tile) const; | |
154 scoped_ptr<ResourcePool::Resource> PrepareTileForRaster(Tile* tile); | |
155 void DispatchOneRasterTask(scoped_refptr<Tile> tile); | |
156 void OnRasterTaskCompleted( | |
157 scoped_refptr<Tile> tile, | |
158 scoped_ptr<ResourcePool::Resource> resource, | |
159 int manage_tiles_call_count_when_dispatched); | |
160 void DidFinishTileInitialization(Tile* tile); | |
161 void DidTileRasterStateChange(Tile* tile, TileRasterState state); | |
162 void DidTileTreeBinChange(Tile* tile, | |
163 TileManagerBin new_tree_bin, | |
164 WhichTree tree); | |
165 scoped_ptr<Value> GetMemoryRequirementsAsValue() const; | |
166 | |
167 static void RunRasterTask(uint8* buffer, | |
168 const gfx::Rect& rect, | |
169 float contents_scale, | |
170 const RasterTaskMetadata& metadata, | |
171 PicturePileImpl* picture_pile, | |
172 RenderingStats* stats); | |
173 static void RunImageDecodeTask(skia::LazyPixelRef* pixel_ref, | |
174 RenderingStats* stats); | |
175 | |
176 static void RecordCheapnessPredictorResults(bool is_predicted_cheap, | |
177 bool is_actually_cheap); | |
178 static void RecordSolidColorPredictorResults(const SkColor* actual_colors, | |
179 size_t color_count, | |
180 bool is_predicted_solid, | |
181 SkColor predicted_color, | |
182 bool is_predicted_transparent); | |
183 | |
184 TileManagerClient* client_; | |
185 scoped_ptr<ResourcePool> resource_pool_; | |
186 scoped_ptr<RasterWorkerPool> raster_worker_pool_; | |
187 bool manage_tiles_pending_; | |
188 int manage_tiles_call_count_; | |
189 | |
190 GlobalStateThatImpactsTilePriority global_state_; | |
191 | |
192 typedef std::vector<Tile*> TileVector; | |
193 typedef std::set<Tile*> TileSet; | |
194 TileSet all_tiles_; | |
195 TileVector live_or_allocated_tiles_; | |
196 TileVector tiles_that_need_to_be_rasterized_; | |
197 | |
198 typedef std::list<Tile*> TileList; | |
199 // Tiles with image decoding tasks. These tiles need to be rasterized | |
200 // when all the image decoding tasks finish. | |
201 TileList tiles_with_image_decoding_tasks_; | |
202 | |
203 typedef base::hash_map<uint32_t, skia::LazyPixelRef*> PixelRefMap; | |
204 PixelRefMap pending_decode_tasks_; | |
205 | |
206 typedef std::queue<scoped_refptr<Tile> > TileQueue; | |
207 TileQueue tiles_with_pending_upload_; | |
208 size_t bytes_pending_upload_; | |
209 bool has_performed_uploads_since_last_flush_; | |
210 bool ever_exceeded_memory_budget_; | |
211 MemoryHistory::Entry memory_stats_from_last_assign_; | |
212 | |
213 bool record_rendering_stats_; | |
214 RenderingStats rendering_stats_; | |
215 | |
216 bool use_cheapness_estimator_; | |
217 bool use_color_estimator_; | |
218 bool did_schedule_cheap_tasks_; | |
219 bool allow_cheap_tasks_; | |
220 int raster_state_count_[NUM_STATES][NUM_TREES][NUM_BINS]; | |
221 bool prediction_benchmarking_; | |
222 | |
223 size_t pending_tasks_; | |
224 size_t max_pending_tasks_; | |
225 | |
226 DISALLOW_COPY_AND_ASSIGN(TileManager); | |
227 }; | |
228 | |
229 } // namespace cc | |
230 | |
231 #endif // CC_TILE_MANAGER_H_ | |
OLD | NEW |