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

Side by Side Diff: cc/tile_manager.cc

Issue 12226046: Added a vector to TileManager to explicitly track live or allocated tiles. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: slight change to live test Created 7 years, 10 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/tile_manager.h ('k') | no next file » | 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 #include "cc/tile_manager.h" 5 #include "cc/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 189
190 TileManager::~TileManager() { 190 TileManager::~TileManager() {
191 // Reset global state and manage. This should cause 191 // Reset global state and manage. This should cause
192 // our memory usage to drop to zero. 192 // our memory usage to drop to zero.
193 global_state_ = GlobalStateThatImpactsTilePriority(); 193 global_state_ = GlobalStateThatImpactsTilePriority();
194 AssignGpuMemoryToTiles(); 194 AssignGpuMemoryToTiles();
195 // This should finish all pending tasks and release any uninitialized 195 // This should finish all pending tasks and release any uninitialized
196 // resources. 196 // resources.
197 raster_worker_pool_.reset(); 197 raster_worker_pool_.reset();
198 AbortPendingTileUploads(); 198 AbortPendingTileUploads();
199 DCHECK(tiles_with_pending_set_pixels_.size() == 0); 199 DCHECK_EQ(tiles_with_pending_set_pixels_.size(), 0);
200 DCHECK(tiles_.size() == 0); 200 DCHECK_EQ(all_tiles_.size(), 0);
201 DCHECK_EQ(live_or_allocated_tiles_.size(), 0);
201 } 202 }
202 203
203 void TileManager::SetGlobalState( 204 void TileManager::SetGlobalState(
204 const GlobalStateThatImpactsTilePriority& global_state) { 205 const GlobalStateThatImpactsTilePriority& global_state) {
205 global_state_ = global_state; 206 global_state_ = global_state;
206 resource_pool_->SetMaxMemoryUsageBytes(global_state_.memory_limit_in_bytes); 207 resource_pool_->SetMaxMemoryUsageBytes(global_state_.memory_limit_in_bytes);
207 ScheduleManageTiles(); 208 ScheduleManageTiles();
208 } 209 }
209 210
210 void TileManager::RegisterTile(Tile* tile) { 211 void TileManager::RegisterTile(Tile* tile) {
211 tiles_.push_back(tile); 212 all_tiles_.push_back(tile);
212 213
213 const ManagedTileState& mts = tile->managed_state(); 214 const ManagedTileState& mts = tile->managed_state();
214 for (int i = 0; i < NUM_TREES; ++i) 215 for (int i = 0; i < NUM_TREES; ++i)
215 ++raster_state_count_[mts.raster_state][i][mts.tree_bin[i]]; 216 ++raster_state_count_[mts.raster_state][i][mts.tree_bin[i]];
216 217
217 ScheduleManageTiles(); 218 ScheduleManageTiles();
218 } 219 }
219 220
220 void TileManager::UnregisterTile(Tile* tile) { 221 void TileManager::UnregisterTile(Tile* tile) {
221 for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); 222 for (TileList::iterator it = tiles_with_image_decoding_tasks_.begin();
222 it != tiles_with_image_decoding_tasks_.end(); it++) { 223 it != tiles_with_image_decoding_tasks_.end(); it++) {
223 if (*it == tile) { 224 if (*it == tile) {
224 tiles_with_image_decoding_tasks_.erase(it); 225 tiles_with_image_decoding_tasks_.erase(it);
225 break; 226 break;
226 } 227 }
227 } 228 }
228 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); 229 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin();
229 it != tiles_that_need_to_be_rasterized_.end(); it++) { 230 it != tiles_that_need_to_be_rasterized_.end(); it++) {
230 if (*it == tile) { 231 if (*it == tile) {
231 tiles_that_need_to_be_rasterized_.erase(it); 232 tiles_that_need_to_be_rasterized_.erase(it);
232 break; 233 break;
233 } 234 }
234 } 235 }
235 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); it++) { 236 for (TileVector::iterator it = live_or_allocated_tiles_.begin();
237 it != live_or_allocated_tiles_.end(); it++) {
238 if (*it == tile) {
239 live_or_allocated_tiles_.erase(it);
240 break;
241 }
242 }
243 for (TileVector::iterator it = all_tiles_.begin();
244 it != all_tiles_.end(); it++) {
236 if (*it == tile) { 245 if (*it == tile) {
237 const ManagedTileState& mts = tile->managed_state(); 246 const ManagedTileState& mts = tile->managed_state();
238 for (int i = 0; i < NUM_TREES; ++i) 247 for (int i = 0; i < NUM_TREES; ++i)
239 --raster_state_count_[mts.raster_state][i][mts.tree_bin[i]]; 248 --raster_state_count_[mts.raster_state][i][mts.tree_bin[i]];
240 FreeResourcesForTile(tile); 249 FreeResourcesForTile(tile);
241 tiles_.erase(it); 250 all_tiles_.erase(it);
242 return; 251 return;
243 } 252 }
244 } 253 }
245 DCHECK(false) << "Could not find tile version."; 254 DCHECK(false) << "Could not find tile version.";
246 } 255 }
247 256
248 class BinComparator { 257 class BinComparator {
249 public: 258 public:
250 bool operator() (const Tile* a, const Tile* b) const { 259 bool operator() (const Tile* a, const Tile* b) const {
251 const ManagedTileState& ams = a->managed_state(); 260 const ManagedTileState& ams = a->managed_state();
(...skipping 13 matching lines...) Expand all
265 gfx::Rect a_rect = a->content_rect(); 274 gfx::Rect a_rect = a->content_rect();
266 gfx::Rect b_rect = b->content_rect(); 275 gfx::Rect b_rect = b->content_rect();
267 if (a_rect.y() != b_rect.y()) 276 if (a_rect.y() != b_rect.y())
268 return a_rect.y() < b_rect.y(); 277 return a_rect.y() < b_rect.y();
269 return a_rect.x() < b_rect.x(); 278 return a_rect.x() < b_rect.x();
270 } 279 }
271 }; 280 };
272 281
273 void TileManager::SortTiles() { 282 void TileManager::SortTiles() {
274 TRACE_EVENT0("cc", "TileManager::SortTiles"); 283 TRACE_EVENT0("cc", "TileManager::SortTiles");
275 284 TRACE_COUNTER_ID1("cc", "LiveTileCount", this, live_or_allocated_tiles_.size() );
276 if (tiles_.size() == 0) {
277 TRACE_COUNTER_ID1("cc", "LiveTileCount", this, 0);
278 return;
279 }
280
281 TileVector::iterator i = tiles_.begin();
282 TileVector::iterator j = tiles_.end() - 1;
283
284 // Sift the live tiles to the front of the list.
285 while (i != j) {
286 while (i != j && (
287 !(*j)->priority( ACTIVE_TREE).is_live &&
288 !(*j)->priority(PENDING_TREE).is_live))
289 j--;
290
291 // j now points to i or a live tile.
292 while (i != j && (
293 (*i)->priority( ACTIVE_TREE).is_live ||
294 (*i)->priority(PENDING_TREE).is_live))
295 i++;
296 // i now points to j or a non-live tile.
297 if (i == j)
298 break;
299
300 // If i does not equal j then we'll swap them.
301 Tile* temp = *i;
302 *i = *j;
303 *j = temp;
304 }
305
306 TRACE_COUNTER_ID1("cc", "LiveTileCount", this, i + 1 - tiles_.begin());
307 285
308 // Sort by bin, resolution and time until needed. 286 // Sort by bin, resolution and time until needed.
309 std::sort(tiles_.begin(), i + 1, BinComparator()); 287 std::sort(live_or_allocated_tiles_.begin(),
288 live_or_allocated_tiles_.end(), BinComparator());
310 } 289 }
311 290
312 void TileManager::ManageTiles() { 291 void TileManager::ManageTiles() {
313 TRACE_EVENT0("cc", "TileManager::ManageTiles"); 292 TRACE_EVENT0("cc", "TileManager::ManageTiles");
314 manage_tiles_pending_ = false; 293 manage_tiles_pending_ = false;
315 ++manage_tiles_call_count_; 294 ++manage_tiles_call_count_;
316 295
317 const TreePriority tree_priority = global_state_.tree_priority; 296 const TreePriority tree_priority = global_state_.tree_priority;
318 TRACE_COUNTER_ID1("cc", "TileCount", this, tiles_.size()); 297 TRACE_COUNTER_ID1("cc", "TileCount", this, all_tiles_.size());
319 298
299 // Memory limit policy works by mapping some bin states to the NEVER bin.
300 TileManagerBin bin_map[NUM_BINS];
301 if (global_state_.memory_limit_policy == ALLOW_NOTHING) {
302 bin_map[NOW_BIN] = NEVER_BIN;
303 bin_map[SOON_BIN] = NEVER_BIN;
304 bin_map[EVENTUALLY_BIN] = NEVER_BIN;
305 bin_map[NEVER_BIN] = NEVER_BIN;
306 } else if (global_state_.memory_limit_policy == ALLOW_ABSOLUTE_MINIMUM) {
307 bin_map[NOW_BIN] = NOW_BIN;
308 bin_map[SOON_BIN] = NEVER_BIN;
309 bin_map[EVENTUALLY_BIN] = NEVER_BIN;
310 bin_map[NEVER_BIN] = NEVER_BIN;
311 } else if (global_state_.memory_limit_policy == ALLOW_PREPAINT_ONLY) {
312 bin_map[NOW_BIN] = NOW_BIN;
313 bin_map[SOON_BIN] = SOON_BIN;
314 bin_map[EVENTUALLY_BIN] = NEVER_BIN;
315 bin_map[NEVER_BIN] = NEVER_BIN;
316 } else {
317 bin_map[NOW_BIN] = NOW_BIN;
318 bin_map[SOON_BIN] = SOON_BIN;
319 bin_map[EVENTUALLY_BIN] = EVENTUALLY_BIN;
320 bin_map[NEVER_BIN] = NEVER_BIN;
321 }
322
323 live_or_allocated_tiles_.clear();
320 // For each tree, bin into different categories of tiles. 324 // For each tree, bin into different categories of tiles.
321 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { 325 for (TileVector::iterator it = all_tiles_.begin();
326 it != all_tiles_.end(); ++it) {
322 Tile* tile = *it; 327 Tile* tile = *it;
323 ManagedTileState& mts = tile->managed_state(); 328 ManagedTileState& mts = tile->managed_state();
324 329
325 TilePriority prio[NUM_BIN_PRIORITIES]; 330 TilePriority prio[NUM_BIN_PRIORITIES];
326 switch (tree_priority) { 331 switch (tree_priority) {
327 case SAME_PRIORITY_FOR_BOTH_TREES: 332 case SAME_PRIORITY_FOR_BOTH_TREES:
328 prio[HIGH_PRIORITY_BIN] = prio[LOW_PRIORITY_BIN] = 333 prio[HIGH_PRIORITY_BIN] = prio[LOW_PRIORITY_BIN] =
329 tile->combined_priority(); 334 tile->combined_priority();
330 break; 335 break;
331 case SMOOTHNESS_TAKES_PRIORITY: 336 case SMOOTHNESS_TAKES_PRIORITY:
332 prio[HIGH_PRIORITY_BIN] = tile->priority(ACTIVE_TREE); 337 prio[HIGH_PRIORITY_BIN] = tile->priority(ACTIVE_TREE);
333 prio[LOW_PRIORITY_BIN] = tile->priority(PENDING_TREE); 338 prio[LOW_PRIORITY_BIN] = tile->priority(PENDING_TREE);
334 break; 339 break;
335 case NEW_CONTENT_TAKES_PRIORITY: 340 case NEW_CONTENT_TAKES_PRIORITY:
336 prio[HIGH_PRIORITY_BIN] = tile->priority(PENDING_TREE); 341 prio[HIGH_PRIORITY_BIN] = tile->priority(PENDING_TREE);
337 prio[LOW_PRIORITY_BIN] = tile->priority(ACTIVE_TREE); 342 prio[LOW_PRIORITY_BIN] = tile->priority(ACTIVE_TREE);
338 break; 343 break;
339 } 344 }
340 345
341 mts.resolution = prio[HIGH_PRIORITY_BIN].resolution; 346 mts.resolution = prio[HIGH_PRIORITY_BIN].resolution;
342 mts.time_to_needed_in_seconds = 347 mts.time_to_needed_in_seconds =
343 prio[HIGH_PRIORITY_BIN].time_to_visible_in_seconds; 348 prio[HIGH_PRIORITY_BIN].time_to_visible_in_seconds;
344 mts.bin[HIGH_PRIORITY_BIN] = BinFromTilePriority(prio[HIGH_PRIORITY_BIN]); 349 mts.bin[HIGH_PRIORITY_BIN] = BinFromTilePriority(prio[HIGH_PRIORITY_BIN]);
345 mts.bin[LOW_PRIORITY_BIN] = BinFromTilePriority(prio[LOW_PRIORITY_BIN]); 350 mts.bin[LOW_PRIORITY_BIN] = BinFromTilePriority(prio[LOW_PRIORITY_BIN]);
346 mts.gpu_memmgr_stats_bin = BinFromTilePriority(tile->combined_priority()); 351 mts.gpu_memmgr_stats_bin = BinFromTilePriority(tile->combined_priority());
347 352
348 DidTileBinChange(tile, 353 DidTileTreeBinChange(tile,
349 BinFromTilePriority(tile->priority(ACTIVE_TREE)), 354 BinFromTilePriority(tile->priority(ACTIVE_TREE)),
350 ACTIVE_TREE); 355 ACTIVE_TREE);
351 DidTileBinChange(tile, 356 DidTileTreeBinChange(tile,
352 BinFromTilePriority(tile->priority(PENDING_TREE)), 357 BinFromTilePriority(tile->priority(PENDING_TREE)),
353 PENDING_TREE); 358 PENDING_TREE);
354 }
355 359
356 // Memory limit policy works by mapping some bin states to the NEVER bin.
357 TileManagerBin bin_map[NUM_BINS];
358 if (global_state_.memory_limit_policy == ALLOW_NOTHING) {
359 bin_map[NOW_BIN] = NEVER_BIN;
360 bin_map[SOON_BIN] = NEVER_BIN;
361 bin_map[EVENTUALLY_BIN] = NEVER_BIN;
362 bin_map[NEVER_BIN] = NEVER_BIN;
363 } else if (global_state_.memory_limit_policy == ALLOW_ABSOLUTE_MINIMUM) {
364 bin_map[NOW_BIN] = NOW_BIN;
365 bin_map[SOON_BIN] = NEVER_BIN;
366 bin_map[EVENTUALLY_BIN] = NEVER_BIN;
367 bin_map[NEVER_BIN] = NEVER_BIN;
368 } else if (global_state_.memory_limit_policy == ALLOW_PREPAINT_ONLY) {
369 bin_map[NOW_BIN] = NOW_BIN;
370 bin_map[SOON_BIN] = SOON_BIN;
371 bin_map[EVENTUALLY_BIN] = NEVER_BIN;
372 bin_map[NEVER_BIN] = NEVER_BIN;
373 } else {
374 bin_map[NOW_BIN] = NOW_BIN;
375 bin_map[SOON_BIN] = SOON_BIN;
376 bin_map[EVENTUALLY_BIN] = EVENTUALLY_BIN;
377 bin_map[NEVER_BIN] = NEVER_BIN;
378 }
379 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
380 Tile* tile = *it;
381 ManagedTileState& mts = tile->managed_state();
382 for (int i = 0; i < NUM_BIN_PRIORITIES; ++i) 360 for (int i = 0; i < NUM_BIN_PRIORITIES; ++i)
383 mts.bin[i] = bin_map[mts.bin[i]]; 361 mts.bin[i] = bin_map[mts.bin[i]];
384 362
385 DidTileBinChange(tile, bin_map[mts.tree_bin[ACTIVE_TREE]], ACTIVE_TREE); 363 DidTileTreeBinChange(tile, bin_map[mts.tree_bin[ACTIVE_TREE]],
386 DidTileBinChange(tile, bin_map[mts.tree_bin[PENDING_TREE]], PENDING_TREE); 364 ACTIVE_TREE);
365 DidTileTreeBinChange(tile, bin_map[mts.tree_bin[PENDING_TREE]],
366 PENDING_TREE);
367
368 if (tile->priority(ACTIVE_TREE).is_live ||
369 tile->priority(PENDING_TREE).is_live ||
370 tile->managed_state().resource ||
371 tile->managed_state().resource_is_being_initialized) {
372 live_or_allocated_tiles_.push_back(tile);
373 }
387 } 374 }
375 TRACE_COUNTER_ID1("cc", "LiveOrAllocatedTileCount", this,
376 live_or_allocated_tiles_.size());
388 377
389 SortTiles(); 378 SortTiles();
390 379
391 // Assign gpu memory and determine what tiles need to be rasterized. 380 // Assign gpu memory and determine what tiles need to be rasterized.
392 AssignGpuMemoryToTiles(); 381 AssignGpuMemoryToTiles();
393 382
394 TRACE_EVENT_INSTANT1("cc", "DidManage", "state", 383 TRACE_EVENT_INSTANT1("cc", "DidManage", "state",
395 ValueToString(BasicStateAsValue())); 384 ValueToString(BasicStateAsValue()));
396 385
397 // Finally, kick the rasterizer. 386 // Finally, kick the rasterizer.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 } 438 }
450 } 439 }
451 440
452 void TileManager::GetMemoryStats( 441 void TileManager::GetMemoryStats(
453 size_t* memoryRequiredBytes, 442 size_t* memoryRequiredBytes,
454 size_t* memoryNiceToHaveBytes, 443 size_t* memoryNiceToHaveBytes,
455 size_t* memoryUsedBytes) const { 444 size_t* memoryUsedBytes) const {
456 *memoryRequiredBytes = 0; 445 *memoryRequiredBytes = 0;
457 *memoryNiceToHaveBytes = 0; 446 *memoryNiceToHaveBytes = 0;
458 *memoryUsedBytes = 0; 447 *memoryUsedBytes = 0;
459 for(size_t i = 0; i < tiles_.size(); i++) { 448 for (size_t i = 0; i < live_or_allocated_tiles_.size(); i++) {
460 const Tile* tile = tiles_[i]; 449 const Tile* tile = live_or_allocated_tiles_[i];
461 const ManagedTileState& mts = tile->managed_state(); 450 const ManagedTileState& mts = tile->managed_state();
462 size_t tile_bytes = tile->bytes_consumed_if_allocated(); 451 size_t tile_bytes = tile->bytes_consumed_if_allocated();
463 if (mts.gpu_memmgr_stats_bin == NOW_BIN) 452 if (mts.gpu_memmgr_stats_bin == NOW_BIN)
464 *memoryRequiredBytes += tile_bytes; 453 *memoryRequiredBytes += tile_bytes;
465 if (mts.gpu_memmgr_stats_bin != NEVER_BIN) 454 if (mts.gpu_memmgr_stats_bin != NEVER_BIN)
466 *memoryNiceToHaveBytes += tile_bytes; 455 *memoryNiceToHaveBytes += tile_bytes;
467 if (mts.can_use_gpu_memory) 456 if (mts.can_use_gpu_memory)
468 *memoryUsedBytes += tile_bytes; 457 *memoryUsedBytes += tile_bytes;
469 } 458 }
470 } 459 }
471 460
472 scoped_ptr<base::Value> TileManager::BasicStateAsValue() const { 461 scoped_ptr<base::Value> TileManager::BasicStateAsValue() const {
473 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 462 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
474 state->SetInteger("tile_count", tiles_.size()); 463 state->SetInteger("tile_count", all_tiles_.size());
475 464
476 state->Set("global_state", global_state_.AsValue().release()); 465 state->Set("global_state", global_state_.AsValue().release());
477 466
478 state->Set("memory_requirements", GetMemoryRequirementsAsValue().release()); 467 state->Set("memory_requirements", GetMemoryRequirementsAsValue().release());
479 return state.PassAs<base::Value>(); 468 return state.PassAs<base::Value>();
480 } 469 }
481 scoped_ptr<base::Value> TileManager::AllTilesAsValue() const { 470 scoped_ptr<base::Value> TileManager::AllTilesAsValue() const {
482 scoped_ptr<base::ListValue> state(new base::ListValue()); 471 scoped_ptr<base::ListValue> state(new base::ListValue());
483 for (size_t i = 0; i < tiles_.size(); i++) 472 for (size_t i = 0; i < all_tiles_.size(); i++)
484 state->Append(tiles_[i]->AsValue().release()); 473 state->Append(all_tiles_[i]->AsValue().release());
485 return state.PassAs<base::Value>(); 474 return state.PassAs<base::Value>();
486 } 475 }
487 476
488 scoped_ptr<base::Value> TileManager::GetMemoryRequirementsAsValue() const { 477 scoped_ptr<base::Value> TileManager::GetMemoryRequirementsAsValue() const {
489 scoped_ptr<base::DictionaryValue> requirements( 478 scoped_ptr<base::DictionaryValue> requirements(
490 new base::DictionaryValue()); 479 new base::DictionaryValue());
491 480
492 size_t memoryRequiredBytes; 481 size_t memoryRequiredBytes;
493 size_t memoryNiceToHaveBytes; 482 size_t memoryNiceToHaveBytes;
494 size_t memoryUsedBytes; 483 size_t memoryUsedBytes;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 default: 528 default:
540 NOTREACHED(); 529 NOTREACHED();
541 } 530 }
542 } 531 }
543 532
544 return false; 533 return false;
545 } 534 }
546 535
547 void TileManager::AssignGpuMemoryToTiles() { 536 void TileManager::AssignGpuMemoryToTiles() {
548 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); 537 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles");
549 // Some memory cannot be released. Figure out which.
550 size_t unreleasable_bytes = 0; 538 size_t unreleasable_bytes = 0;
551 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
552 Tile* tile = *it;
553 if (!tile->managed_state().can_be_freed)
554 unreleasable_bytes += tile->bytes_consumed_if_allocated();
555 }
556 539
557 // Now give memory out to the tiles until we're out, and build 540 // Now give memory out to the tiles until we're out, and build
558 // the needs-to-be-rasterized queue. 541 // the needs-to-be-rasterized queue.
559 tiles_that_need_to_be_rasterized_.erase( 542 tiles_that_need_to_be_rasterized_.clear();
560 tiles_that_need_to_be_rasterized_.begin(),
561 tiles_that_need_to_be_rasterized_.end());
562 543
563 // Reset the image decoding list so that we don't mess up with tile 544 // Reset the image decoding list so that we don't mess up with tile
564 // priorities. Tiles will be added to the image decoding list again 545 // priorities. Tiles will be added to the image decoding list again
565 // when DispatchMoreTasks() is called. 546 // when DispatchMoreTasks() is called.
566 tiles_with_image_decoding_tasks_.clear(); 547 tiles_with_image_decoding_tasks_.clear();
567 548
568 // By clearing the tiles_that_need_to_be_rasterized_ vector and 549 // By clearing the tiles_that_need_to_be_rasterized_ vector and
569 // tiles_with_image_decoding_tasks_ list above we move all tiles 550 // tiles_with_image_decoding_tasks_ list above we move all tiles
570 // currently waiting for raster to idle state. 551 // currently waiting for raster to idle state.
571 // Call DidTileRasterStateChange() for each of these tiles to 552 // Call DidTileRasterStateChange() for each of these tiles to
572 // have this state change take effect. 553 // have this state change take effect.
573 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { 554 // Some memory cannot be released. We figure out how much in this
555 // loop as well.
556 for (TileVector::iterator it = live_or_allocated_tiles_.begin();
557 it != live_or_allocated_tiles_.end(); ++it) {
574 Tile* tile = *it; 558 Tile* tile = *it;
559 if (!tile->managed_state().can_be_freed)
560 unreleasable_bytes += tile->bytes_consumed_if_allocated();
575 if (tile->managed_state().raster_state == WAITING_FOR_RASTER_STATE) 561 if (tile->managed_state().raster_state == WAITING_FOR_RASTER_STATE)
576 DidTileRasterStateChange(tile, IDLE_STATE); 562 DidTileRasterStateChange(tile, IDLE_STATE);
577 } 563 }
578 564
579 size_t bytes_allocatable = global_state_.memory_limit_in_bytes - unreleasable_ bytes; 565 size_t bytes_allocatable = global_state_.memory_limit_in_bytes - unreleasable_ bytes;
580 size_t bytes_that_exceeded_memory_budget = 0; 566 size_t bytes_that_exceeded_memory_budget = 0;
581 size_t bytes_left = bytes_allocatable; 567 size_t bytes_left = bytes_allocatable;
582 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { 568 for (TileVector::iterator it = live_or_allocated_tiles_.begin();
569 it != live_or_allocated_tiles_.end(); ++it) {
583 Tile* tile = *it; 570 Tile* tile = *it;
584 size_t tile_bytes = tile->bytes_consumed_if_allocated(); 571 size_t tile_bytes = tile->bytes_consumed_if_allocated();
585 ManagedTileState& managed_tile_state = tile->managed_state(); 572 ManagedTileState& managed_tile_state = tile->managed_state();
586 if (!managed_tile_state.can_be_freed) 573 if (!managed_tile_state.can_be_freed)
587 continue; 574 continue;
588 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NEVER_BIN && 575 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NEVER_BIN &&
589 managed_tile_state.bin[LOW_PRIORITY_BIN] == NEVER_BIN) { 576 managed_tile_state.bin[LOW_PRIORITY_BIN] == NEVER_BIN) {
590 managed_tile_state.can_use_gpu_memory = false; 577 managed_tile_state.can_use_gpu_memory = false;
591 FreeResourcesForTile(tile); 578 FreeResourcesForTile(tile);
592 continue; 579 continue;
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
880 --raster_state_count_[mts.raster_state][i][mts.tree_bin[i]]; 867 --raster_state_count_[mts.raster_state][i][mts.tree_bin[i]];
881 DCHECK_GE(raster_state_count_[mts.raster_state][i][mts.tree_bin[i]], 0); 868 DCHECK_GE(raster_state_count_[mts.raster_state][i][mts.tree_bin[i]], 0);
882 869
883 // Increment count for new state. 870 // Increment count for new state.
884 ++raster_state_count_[state][i][mts.tree_bin[i]]; 871 ++raster_state_count_[state][i][mts.tree_bin[i]];
885 } 872 }
886 873
887 mts.raster_state = state; 874 mts.raster_state = state;
888 } 875 }
889 876
890 void TileManager::DidTileBinChange(Tile* tile, 877 void TileManager::DidTileTreeBinChange(Tile* tile,
891 TileManagerBin bin, 878 TileManagerBin new_tree_bin,
892 WhichTree tree) { 879 WhichTree tree) {
893 ManagedTileState& mts = tile->managed_state(); 880 ManagedTileState& mts = tile->managed_state();
894 881
895 // Decrement count for current bin. 882 // Decrement count for current bin.
896 --raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]]; 883 --raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]];
897 DCHECK_GE(raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]], 0); 884 DCHECK_GE(raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]], 0);
898 885
899 // Increment count for new bin. 886 // Increment count for new bin.
900 ++raster_state_count_[mts.raster_state][tree][bin]; 887 ++raster_state_count_[mts.raster_state][tree][new_tree_bin];
901 888
902 mts.tree_bin[tree] = bin; 889 mts.tree_bin[tree] = new_tree_bin;
903 } 890 }
904 891
905 // static 892 // static
906 void TileManager::PerformRaster(uint8* buffer, 893 void TileManager::PerformRaster(uint8* buffer,
907 const gfx::Rect& rect, 894 const gfx::Rect& rect,
908 float contents_scale, 895 float contents_scale,
909 bool use_cheapness_estimator, 896 bool use_cheapness_estimator,
910 PicturePileImpl* picture_pile, 897 PicturePileImpl* picture_pile,
911 RenderingStats* stats) { 898 RenderingStats* stats) {
912 TRACE_EVENT0("cc", "TileManager::PerformRaster"); 899 TRACE_EVENT0("cc", "TileManager::PerformRaster");
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 decode_begin_time = base::TimeTicks::Now(); 954 decode_begin_time = base::TimeTicks::Now();
968 pixel_ref->Decode(); 955 pixel_ref->Decode();
969 if (stats) { 956 if (stats) {
970 stats->totalDeferredImageDecodeCount++; 957 stats->totalDeferredImageDecodeCount++;
971 stats->totalDeferredImageDecodeTime += 958 stats->totalDeferredImageDecodeTime +=
972 base::TimeTicks::Now() - decode_begin_time; 959 base::TimeTicks::Now() - decode_begin_time;
973 } 960 }
974 } 961 }
975 962
976 } // namespace cc 963 } // namespace cc
OLDNEW
« no previous file with comments | « cc/tile_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698