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

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

Issue 367833003: cc: Start using raster/eviction iterators. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 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.cc ('k') | cc/resources/tile_manager.cc » ('j') | 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 #ifndef CC_RESOURCES_TILE_MANAGER_H_ 5 #ifndef CC_RESOURCES_TILE_MANAGER_H_
6 #define CC_RESOURCES_TILE_MANAGER_H_ 6 #define CC_RESOURCES_TILE_MANAGER_H_
7 7
8 #include <deque> 8 #include <deque>
9 #include <queue> 9 #include <queue>
10 #include <set> 10 #include <set>
11 #include <utility> 11 #include <utility>
12 #include <vector> 12 #include <vector>
13 13
14 #include "base/containers/hash_tables.h" 14 #include "base/containers/hash_tables.h"
15 #include "base/memory/scoped_ptr.h" 15 #include "base/memory/scoped_ptr.h"
16 #include "base/values.h" 16 #include "base/values.h"
17 #include "cc/base/ref_counted_managed.h" 17 #include "cc/base/ref_counted_managed.h"
18 #include "cc/base/unique_notifier.h" 18 #include "cc/base/unique_notifier.h"
19 #include "cc/debug/rendering_stats_instrumentation.h" 19 #include "cc/debug/rendering_stats_instrumentation.h"
20 #include "cc/resources/eviction_tile_priority_queue.h" 20 #include "cc/resources/eviction_tile_priority_queue.h"
21 #include "cc/resources/managed_tile_state.h" 21 #include "cc/resources/managed_tile_state.h"
22 #include "cc/resources/memory_history.h" 22 #include "cc/resources/memory_history.h"
23 #include "cc/resources/picture_pile_impl.h" 23 #include "cc/resources/picture_pile_impl.h"
24 #include "cc/resources/prioritized_tile_set.h"
25 #include "cc/resources/raster_tile_priority_queue.h" 24 #include "cc/resources/raster_tile_priority_queue.h"
26 #include "cc/resources/rasterizer.h" 25 #include "cc/resources/rasterizer.h"
27 #include "cc/resources/resource_pool.h" 26 #include "cc/resources/resource_pool.h"
28 #include "cc/resources/tile.h" 27 #include "cc/resources/tile.h"
29 28
30 namespace base { 29 namespace base {
31 namespace debug { 30 namespace debug {
32 class ConvertableToTraceFormat; 31 class ConvertableToTraceFormat;
33 class TracedValue; 32 class TracedValue;
34 } 33 }
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 const MemoryHistory::Entry& memory_stats_from_last_assign() const { 120 const MemoryHistory::Entry& memory_stats_from_last_assign() const {
122 return memory_stats_from_last_assign_; 121 return memory_stats_from_last_assign_;
123 } 122 }
124 123
125 void InitializeTilesWithResourcesForTesting(const std::vector<Tile*>& tiles) { 124 void InitializeTilesWithResourcesForTesting(const std::vector<Tile*>& tiles) {
126 for (size_t i = 0; i < tiles.size(); ++i) { 125 for (size_t i = 0; i < tiles.size(); ++i) {
127 ManagedTileState& mts = tiles[i]->managed_state(); 126 ManagedTileState& mts = tiles[i]->managed_state();
128 127
129 mts.draw_info.resource_ = 128 mts.draw_info.resource_ =
130 resource_pool_->AcquireResource(tiles[i]->size()); 129 resource_pool_->AcquireResource(tiles[i]->size());
131
132 bytes_releasable_ += BytesConsumedIfAllocated(tiles[i]);
133 ++resources_releasable_;
134 } 130 }
135 } 131 }
136 132
137 void ReleaseTileResourcesForTesting(const std::vector<Tile*>& tiles) { 133 void ReleaseTileResourcesForTesting(const std::vector<Tile*>& tiles) {
138 for (size_t i = 0; i < tiles.size(); ++i) { 134 for (size_t i = 0; i < tiles.size(); ++i) {
139 Tile* tile = tiles[i]; 135 Tile* tile = tiles[i];
140 FreeResourcesForTile(tile); 136 FreeResourcesForTile(tile);
141 } 137 }
142 } 138 }
143 139
144 void SetGlobalStateForTesting( 140 void SetGlobalStateForTesting(
145 const GlobalStateThatImpactsTilePriority& state) { 141 const GlobalStateThatImpactsTilePriority& state) {
146 // Soft limit is used for resource pool such that 142 global_state_ = state;
147 // memory returns to soft limit after going over.
148 if (state != global_state_) {
149 global_state_ = state;
150 prioritized_tiles_dirty_ = true;
151 }
152 } 143 }
153 144
154 void SetRasterizerForTesting(Rasterizer* rasterizer); 145 void SetRasterizerForTesting(Rasterizer* rasterizer);
155 146
156 void FreeResourcesAndCleanUpReleasedTilesForTesting() { 147 void FreeResourcesAndCleanUpReleasedTilesForTesting() {
157 prioritized_tiles_.Clear();
158 FreeResourcesForReleasedTiles(); 148 FreeResourcesForReleasedTiles();
159 CleanUpReleasedTiles(); 149 CleanUpReleasedTiles();
160 } 150 }
161 151
162 std::vector<Tile*> AllTilesForTesting() const { 152 std::vector<Tile*> AllTilesForTesting() const {
163 std::vector<Tile*> tiles; 153 std::vector<Tile*> tiles;
164 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); 154 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end();
165 ++it) { 155 ++it) {
166 tiles.push_back(it->second); 156 tiles.push_back(it->second);
167 } 157 }
168 return tiles; 158 return tiles;
169 } 159 }
170 160
171 protected: 161 protected:
172 TileManager(TileManagerClient* client, 162 TileManager(TileManagerClient* client,
173 const scoped_refptr<base::SequencedTaskRunner>& task_runner, 163 const scoped_refptr<base::SequencedTaskRunner>& task_runner,
174 ResourcePool* resource_pool, 164 ResourcePool* resource_pool,
175 Rasterizer* rasterizer, 165 Rasterizer* rasterizer,
176 RenderingStatsInstrumentation* rendering_stats_instrumentation); 166 RenderingStatsInstrumentation* rendering_stats_instrumentation);
177 167
178 // Methods called by Tile
179 friend class Tile;
180 void DidChangeTilePriority(Tile* tile);
181
182 void FreeResourcesForReleasedTiles(); 168 void FreeResourcesForReleasedTiles();
183 void CleanUpReleasedTiles(); 169 void CleanUpReleasedTiles();
184 170
185 // Overriden from RefCountedManager<Tile>: 171 // Overriden from RefCountedManager<Tile>:
172 friend class Tile;
186 virtual void Release(Tile* tile) override; 173 virtual void Release(Tile* tile) override;
187 174
188 // Overriden from RasterizerClient: 175 // Overriden from RasterizerClient:
189 virtual void DidFinishRunningTasks(TaskSet task_set) override; 176 virtual void DidFinishRunningTasks(TaskSet task_set) override;
190 virtual TaskSetCollection TasksThatShouldBeForcedToComplete() const override; 177 virtual TaskSetCollection TasksThatShouldBeForcedToComplete() const override;
191 178
192 typedef std::vector<Tile*> TileVector; 179 typedef std::vector<Tile*> TileVector;
193 typedef std::set<Tile*> TileSet; 180 typedef std::set<Tile*> TileSet;
194 181
195 // Virtual for test 182 // Virtual for test
196 virtual void ScheduleTasks( 183 virtual void ScheduleTasks(
197 const TileVector& tiles_that_need_to_be_rasterized); 184 const TileVector& tiles_that_need_to_be_rasterized);
198 185
199 void AssignGpuMemoryToTiles(PrioritizedTileSet* tiles, 186 void AssignGpuMemoryToTiles(TileVector* tiles_that_need_to_be_rasterized);
200 TileVector* tiles_that_need_to_be_rasterized);
201 void GetTilesWithAssignedBins(PrioritizedTileSet* tiles);
202 187
203 private: 188 private:
189 class MemoryUsage {
190 public:
191 MemoryUsage();
192 MemoryUsage(int64 memory_bytes, int resource_count);
193
194 static MemoryUsage FromConfig(const gfx::Size& size, ResourceFormat format);
195 static MemoryUsage FromTile(const Tile* tile);
196
197 MemoryUsage& operator+=(const MemoryUsage& other);
198 MemoryUsage& operator-=(const MemoryUsage& other);
199 MemoryUsage operator-(const MemoryUsage& other);
200
201 bool Exceeds(const MemoryUsage& limit) const;
202 int64 memory_bytes() const { return memory_bytes_; }
203
204 private:
205 int64 memory_bytes_;
206 int resource_count_;
207 };
208
204 void OnImageDecodeTaskCompleted(int layer_id, 209 void OnImageDecodeTaskCompleted(int layer_id,
205 SkPixelRef* pixel_ref, 210 SkPixelRef* pixel_ref,
206 bool was_canceled); 211 bool was_canceled);
207 void OnRasterTaskCompleted(Tile::Id tile, 212 void OnRasterTaskCompleted(Tile::Id tile,
208 scoped_ptr<ScopedResource> resource, 213 scoped_ptr<ScopedResource> resource,
209 const PicturePileImpl::Analysis& analysis, 214 const PicturePileImpl::Analysis& analysis,
210 bool was_canceled); 215 bool was_canceled);
211 216
212 inline size_t BytesConsumedIfAllocated(const Tile* tile) const {
213 return Resource::MemorySizeBytes(tile->size(),
214 resource_pool_->resource_format());
215 }
216
217 void FreeResourcesForTile(Tile* tile); 217 void FreeResourcesForTile(Tile* tile);
218 void FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(Tile* tile); 218 void FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(Tile* tile);
219 scoped_refptr<ImageDecodeTask> CreateImageDecodeTask(Tile* tile, 219 scoped_refptr<ImageDecodeTask> CreateImageDecodeTask(Tile* tile,
220 SkPixelRef* pixel_ref); 220 SkPixelRef* pixel_ref);
221 scoped_refptr<RasterTask> CreateRasterTask(Tile* tile); 221 scoped_refptr<RasterTask> CreateRasterTask(Tile* tile);
222 void UpdatePrioritizedTileSetIfNeeded();
223 222
223 void RebuildEvictionQueueIfNeeded();
224 bool FreeTileResourcesUntilUsageIsWithinLimit(const MemoryUsage& limit,
225 MemoryUsage* usage);
226 bool FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit(
227 const MemoryUsage& limit,
228 const TilePriority& oother_priority,
229 MemoryUsage* usage);
230 bool TilePriorityViolatesMemoryPolicy(const TilePriority& priority);
224 bool IsReadyToActivate() const; 231 bool IsReadyToActivate() const;
225 void CheckIfReadyToActivate(); 232 void CheckIfReadyToActivate();
226 233
227 TileManagerClient* client_; 234 TileManagerClient* client_;
228 scoped_refptr<base::SequencedTaskRunner> task_runner_; 235 scoped_refptr<base::SequencedTaskRunner> task_runner_;
229 ResourcePool* resource_pool_; 236 ResourcePool* resource_pool_;
230 Rasterizer* rasterizer_; 237 Rasterizer* rasterizer_;
231 GlobalStateThatImpactsTilePriority global_state_; 238 GlobalStateThatImpactsTilePriority global_state_;
232 239
233 typedef base::hash_map<Tile::Id, Tile*> TileMap; 240 typedef base::hash_map<Tile::Id, Tile*> TileMap;
234 TileMap tiles_; 241 TileMap tiles_;
235 242
236 PrioritizedTileSet prioritized_tiles_; 243 bool all_tiles_that_need_to_be_rasterized_are_scheduled_;
237 bool prioritized_tiles_dirty_;
238
239 bool all_tiles_that_need_to_be_rasterized_have_memory_;
240 bool all_tiles_required_for_activation_have_memory_;
241
242 size_t bytes_releasable_;
243 size_t resources_releasable_;
244
245 bool ever_exceeded_memory_budget_;
246 MemoryHistory::Entry memory_stats_from_last_assign_; 244 MemoryHistory::Entry memory_stats_from_last_assign_;
247 245
248 RenderingStatsInstrumentation* rendering_stats_instrumentation_; 246 RenderingStatsInstrumentation* rendering_stats_instrumentation_;
249 247
250 bool did_initialize_visible_tile_; 248 bool did_initialize_visible_tile_;
251 bool did_check_for_completed_tasks_since_last_schedule_tasks_; 249 bool did_check_for_completed_tasks_since_last_schedule_tasks_;
252 bool did_oom_on_last_assign_; 250 bool did_oom_on_last_assign_;
253 251
254 typedef base::hash_map<uint32_t, scoped_refptr<ImageDecodeTask> > 252 typedef base::hash_map<uint32_t, scoped_refptr<ImageDecodeTask> >
255 PixelRefTaskMap; 253 PixelRefTaskMap;
256 typedef base::hash_map<int, PixelRefTaskMap> LayerPixelRefTaskMap; 254 typedef base::hash_map<int, PixelRefTaskMap> LayerPixelRefTaskMap;
257 LayerPixelRefTaskMap image_decode_tasks_; 255 LayerPixelRefTaskMap image_decode_tasks_;
258 256
259 typedef base::hash_map<int, int> LayerCountMap; 257 typedef base::hash_map<int, int> LayerCountMap;
260 LayerCountMap used_layer_counts_; 258 LayerCountMap used_layer_counts_;
261 259
262 RasterTaskCompletionStats update_visible_tiles_stats_; 260 RasterTaskCompletionStats update_visible_tiles_stats_;
263 261
264 std::vector<Tile*> released_tiles_; 262 std::vector<Tile*> released_tiles_;
265 263
266 ResourceFormat resource_format_; 264 ResourceFormat resource_format_;
267 265
268 // Queue used when scheduling raster tasks. 266 // Queue used when scheduling raster tasks.
269 RasterTaskQueue raster_queue_; 267 RasterTaskQueue raster_queue_;
270 268
271 std::vector<scoped_refptr<RasterTask> > orphan_raster_tasks_; 269 std::vector<scoped_refptr<RasterTask> > orphan_raster_tasks_;
272 270
273 UniqueNotifier ready_to_activate_check_notifier_; 271 UniqueNotifier ready_to_activate_check_notifier_;
274 272
273 RasterTilePriorityQueue raster_priority_queue_;
274 EvictionTilePriorityQueue eviction_priority_queue_;
275 bool eviction_priority_queue_is_up_to_date_;
276
275 DISALLOW_COPY_AND_ASSIGN(TileManager); 277 DISALLOW_COPY_AND_ASSIGN(TileManager);
276 }; 278 };
277 279
278 } // namespace cc 280 } // namespace cc
279 281
280 #endif // CC_RESOURCES_TILE_MANAGER_H_ 282 #endif // CC_RESOURCES_TILE_MANAGER_H_
OLDNEW
« no previous file with comments | « cc/resources/tile.cc ('k') | cc/resources/tile_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698