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

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

Issue 17351017: Re-land: cc: Add raster finished signals to RasterWorkerPool. (Closed) Base URL: http://git.chromium.org/chromium/src.git@new-graph-build
Patch Set: fix flaky unit tests Created 7 years, 5 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
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/tile_manager_unittest.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 #include "cc/resources/tile_manager.h" 5 #include "cc/resources/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 10
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 159
160 void TileManager::UnregisterTile(Tile* tile) { 160 void TileManager::UnregisterTile(Tile* tile) {
161 TileVector::iterator raster_iter = 161 TileVector::iterator raster_iter =
162 std::find(tiles_that_need_to_be_rasterized_.begin(), 162 std::find(tiles_that_need_to_be_rasterized_.begin(),
163 tiles_that_need_to_be_rasterized_.end(), 163 tiles_that_need_to_be_rasterized_.end(),
164 tile); 164 tile);
165 if (raster_iter != tiles_that_need_to_be_rasterized_.end()) 165 if (raster_iter != tiles_that_need_to_be_rasterized_.end())
166 tiles_that_need_to_be_rasterized_.erase(raster_iter); 166 tiles_that_need_to_be_rasterized_.erase(raster_iter);
167 167
168 tiles_that_need_to_be_initialized_for_activation_.erase(tile); 168 tiles_that_need_to_be_initialized_for_activation_.erase(tile);
169 oom_tiles_that_need_to_be_initialized_for_activation_.erase(tile);
169 170
170 DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) != tiles_.end()); 171 DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) != tiles_.end());
171 FreeResourcesForTile(tile); 172 FreeResourcesForTile(tile);
172 tiles_.erase(std::remove(tiles_.begin(), tiles_.end(), tile)); 173 tiles_.erase(std::remove(tiles_.begin(), tiles_.end(), tile));
173 } 174 }
174 175
175 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { 176 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const {
176 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; 177 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY;
177 } 178 }
178 179
180 void TileManager::DidFinishedRunningTasks() {
181 // When OOM, keep re-assigning memory until we reach a steady state
182 // where top-priority tiles are initialized.
183 if (!memory_stats_from_last_assign_.bytes_over)
184 return;
185
186 raster_worker_pool_->CheckForCompletedTasks();
187
188 AssignGpuMemoryToTiles();
189
190 if (!oom_tiles_that_need_to_be_initialized_for_activation_.empty())
191 ReassignGpuMemoryToOOMTilesRequiredForActivation();
192
193 // |tiles_that_need_to_be_rasterized_| will be empty when we reach a
194 // steady memory state. Keep scheduling tasks until we reach this state.
195 if (!tiles_that_need_to_be_rasterized_.empty()) {
196 ScheduleTasks();
197 return;
198 }
199
200 // Use on-demand raster for any tiles that have not been been assigned
201 // memory after reaching a steady memory state.
202 for (TileSet::iterator it =
203 oom_tiles_that_need_to_be_initialized_for_activation_.begin();
204 it != oom_tiles_that_need_to_be_initialized_for_activation_.end();
205 ++it) {
206 Tile* tile = *it;
207 ManagedTileState& mts = tile->managed_state();
208 mts.tile_versions[mts.raster_mode].set_rasterize_on_demand();
209 }
210 oom_tiles_that_need_to_be_initialized_for_activation_.clear();
211
212 DCHECK_EQ(0u, tiles_that_need_to_be_initialized_for_activation_.size());
213 client_->NotifyReadyToActivate();
214 }
215
216 void TileManager::DidFinishedRunningTasksRequiredForActivation() {
217 // This is only a true indication that all tiles required for
218 // activation are initialized when no tiles are OOM. We need to
219 // wait for DidFinishRunningTasks() to be called, try to re-assign
220 // memory and in worst case use on-demand raster when tiles
221 // required for activation are OOM.
222 if (!oom_tiles_that_need_to_be_initialized_for_activation_.empty())
223 return;
224
225 client_->NotifyReadyToActivate();
226 }
227
179 class BinComparator { 228 class BinComparator {
180 public: 229 public:
181 bool operator() (const Tile* a, const Tile* b) const { 230 bool operator() (const Tile* a, const Tile* b) const {
182 const ManagedTileState& ams = a->managed_state(); 231 const ManagedTileState& ams = a->managed_state();
183 const ManagedTileState& bms = b->managed_state(); 232 const ManagedTileState& bms = b->managed_state();
184 if (ams.bin[HIGH_PRIORITY_BIN] != bms.bin[HIGH_PRIORITY_BIN]) 233 if (ams.bin[HIGH_PRIORITY_BIN] != bms.bin[HIGH_PRIORITY_BIN])
185 return ams.bin[HIGH_PRIORITY_BIN] < bms.bin[HIGH_PRIORITY_BIN]; 234 return ams.bin[HIGH_PRIORITY_BIN] < bms.bin[HIGH_PRIORITY_BIN];
186 235
187 if (ams.bin[LOW_PRIORITY_BIN] != bms.bin[LOW_PRIORITY_BIN]) 236 if (ams.bin[LOW_PRIORITY_BIN] != bms.bin[LOW_PRIORITY_BIN])
188 return ams.bin[LOW_PRIORITY_BIN] < bms.bin[LOW_PRIORITY_BIN]; 237 return ams.bin[LOW_PRIORITY_BIN] < bms.bin[LOW_PRIORITY_BIN];
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 std::sort(tiles_.begin(), tiles_.end(), BinComparator()); 344 std::sort(tiles_.begin(), tiles_.end(), BinComparator());
296 } 345 }
297 346
298 void TileManager::ManageTiles() { 347 void TileManager::ManageTiles() {
299 TRACE_EVENT0("cc", "TileManager::ManageTiles"); 348 TRACE_EVENT0("cc", "TileManager::ManageTiles");
300 AssignBinsToTiles(); 349 AssignBinsToTiles();
301 SortTiles(); 350 SortTiles();
302 AssignGpuMemoryToTiles(); 351 AssignGpuMemoryToTiles();
303 CleanUpUnusedImageDecodeTasks(); 352 CleanUpUnusedImageDecodeTasks();
304 353
305 // This could have changed after AssignGpuMemoryToTiles.
306 if (AreTilesRequiredForActivationReady())
307 client_->NotifyReadyToActivate();
308
309 TRACE_EVENT_INSTANT1( 354 TRACE_EVENT_INSTANT1(
310 "cc", "DidManage", TRACE_EVENT_SCOPE_THREAD, 355 "cc", "DidManage", TRACE_EVENT_SCOPE_THREAD,
311 "state", TracedValue::FromValue(BasicStateAsValue().release())); 356 "state", TracedValue::FromValue(BasicStateAsValue().release()));
312 357
313 // Finally, schedule rasterizer tasks. 358 // Finally, schedule rasterizer tasks.
314 ScheduleTasks(); 359 ScheduleTasks();
315 } 360 }
316 361
317 void TileManager::CheckForCompletedTileUploads() { 362 void TileManager::CheckForCompletedTileUploads() {
318 raster_worker_pool_->CheckForCompletedTasks(); 363 raster_worker_pool_->CheckForCompletedTasks();
364
365 if (did_initialize_visible_tile_) {
366 client_->DidInitializeVisibleTile();
367 did_initialize_visible_tile_ = false;
368 }
319 } 369 }
320 370
321 void TileManager::GetMemoryStats( 371 void TileManager::GetMemoryStats(
322 size_t* memory_required_bytes, 372 size_t* memory_required_bytes,
323 size_t* memory_nice_to_have_bytes, 373 size_t* memory_nice_to_have_bytes,
324 size_t* memory_used_bytes) const { 374 size_t* memory_used_bytes) const {
325 *memory_required_bytes = 0; 375 *memory_required_bytes = 0;
326 *memory_nice_to_have_bytes = 0; 376 *memory_nice_to_have_bytes = 0;
327 *memory_used_bytes = resource_pool_->acquired_memory_usage_bytes(); 377 *memory_used_bytes = resource_pool_->acquired_memory_usage_bytes();
328 for (TileVector::const_iterator it = tiles_.begin(); 378 for (TileVector::const_iterator it = tiles_.begin();
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 return std::min(raster_mode, current_mode); 456 return std::min(raster_mode, current_mode);
407 } 457 }
408 458
409 void TileManager::AssignGpuMemoryToTiles() { 459 void TileManager::AssignGpuMemoryToTiles() {
410 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); 460 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles");
411 461
412 // Now give memory out to the tiles until we're out, and build 462 // Now give memory out to the tiles until we're out, and build
413 // the needs-to-be-rasterized queue. 463 // the needs-to-be-rasterized queue.
414 tiles_that_need_to_be_rasterized_.clear(); 464 tiles_that_need_to_be_rasterized_.clear();
415 tiles_that_need_to_be_initialized_for_activation_.clear(); 465 tiles_that_need_to_be_initialized_for_activation_.clear();
466 oom_tiles_that_need_to_be_initialized_for_activation_.clear();
416 467
417 size_t bytes_releasable = 0; 468 size_t bytes_releasable = 0;
418 for (TileVector::const_iterator it = tiles_.begin(); 469 for (TileVector::const_iterator it = tiles_.begin();
419 it != tiles_.end(); 470 it != tiles_.end();
420 ++it) { 471 ++it) {
421 const Tile* tile = *it; 472 const Tile* tile = *it;
422 const ManagedTileState& mts = tile->managed_state(); 473 const ManagedTileState& mts = tile->managed_state();
423 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { 474 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
424 if (mts.tile_versions[mode].resource_) 475 if (mts.tile_versions[mode].resource_)
425 bytes_releasable += tile->bytes_consumed_if_allocated(); 476 bytes_releasable += tile->bytes_consumed_if_allocated();
426 } 477 }
427 } 478 }
428 479
429 // Cast to prevent overflow. 480 // Cast to prevent overflow.
430 int64 bytes_available = 481 int64 bytes_available =
431 static_cast<int64>(bytes_releasable) + 482 static_cast<int64>(bytes_releasable) +
432 static_cast<int64>(global_state_.memory_limit_in_bytes) - 483 static_cast<int64>(global_state_.memory_limit_in_bytes) -
433 static_cast<int64>(resource_pool_->acquired_memory_usage_bytes()); 484 static_cast<int64>(resource_pool_->acquired_memory_usage_bytes());
434 485
435 size_t bytes_allocatable = 486 size_t bytes_allocatable =
436 std::max(static_cast<int64>(0), bytes_available); 487 std::max(static_cast<int64>(0), bytes_available);
437 488
438 size_t bytes_that_exceeded_memory_budget_in_now_bin = 0; 489 size_t bytes_that_exceeded_memory_budget = 0;
439 size_t bytes_left = bytes_allocatable; 490 size_t bytes_left = bytes_allocatable;
440 size_t bytes_oom_in_now_bin_on_pending_tree = 0; 491 size_t bytes_oom_tiles_that_need_to_be_initialized_for_activation = 0;
441 TileVector tiles_requiring_memory_but_oomed;
442 bool higher_priority_tile_oomed = false; 492 bool higher_priority_tile_oomed = false;
443 for (TileVector::iterator it = tiles_.begin(); 493 for (TileVector::iterator it = tiles_.begin();
444 it != tiles_.end(); 494 it != tiles_.end();
445 ++it) { 495 ++it) {
446 Tile* tile = *it; 496 Tile* tile = *it;
447 ManagedTileState& mts = tile->managed_state(); 497 ManagedTileState& mts = tile->managed_state();
448 498
449 mts.raster_mode = DetermineRasterMode(tile); 499 mts.raster_mode = DetermineRasterMode(tile);
450 500
451 ManagedTileState::TileVersion& tile_version = 501 ManagedTileState::TileVersion& tile_version =
(...skipping 17 matching lines...) Expand all
469 tile_bytes += tile->bytes_consumed_if_allocated(); 519 tile_bytes += tile->bytes_consumed_if_allocated();
470 } 520 }
471 521
472 // If we don't have the required version, and it's not in flight 522 // If we don't have the required version, and it's not in flight
473 // then we'll have to pay to create a new task. 523 // then we'll have to pay to create a new task.
474 if (!tile_version.resource_ && tile_version.raster_task_.is_null()) 524 if (!tile_version.resource_ && tile_version.raster_task_.is_null())
475 tile_bytes += tile->bytes_consumed_if_allocated(); 525 tile_bytes += tile->bytes_consumed_if_allocated();
476 526
477 // Tile is OOM. 527 // Tile is OOM.
478 if (tile_bytes > bytes_left) { 528 if (tile_bytes > bytes_left) {
479 mts.tile_versions[mts.raster_mode].set_rasterize_on_demand(); 529 if (tile->required_for_activation()) {
480 if (mts.tree_bin[PENDING_TREE] == NOW_BIN) { 530 // Immediately mark tiles for on-demand raster once the amount
481 tiles_requiring_memory_but_oomed.push_back(tile); 531 // of memory for oom tiles required for activation exceeds our
482 bytes_oom_in_now_bin_on_pending_tree += tile_bytes; 532 // memory limit.
533 if (bytes_oom_tiles_that_need_to_be_initialized_for_activation <
534 global_state_.memory_limit_in_bytes) {
535 oom_tiles_that_need_to_be_initialized_for_activation_.insert(tile);
536 bytes_oom_tiles_that_need_to_be_initialized_for_activation +=
537 tile_bytes;
538 } else {
539 tile_version.set_rasterize_on_demand();
540 }
483 } 541 }
484 FreeResourcesForTile(tile); 542 FreeResourcesForTile(tile);
485 higher_priority_tile_oomed = true; 543 higher_priority_tile_oomed = true;
544 bytes_that_exceeded_memory_budget += tile_bytes;
486 continue; 545 continue;
487 } 546 }
488 547
489 tile_version.set_use_resource(); 548 tile_version.set_use_resource();
490 bytes_left -= tile_bytes; 549 bytes_left -= tile_bytes;
491 550
492 // Tile shouldn't be rasterized if we've failed to assign 551 // Tile shouldn't be rasterized if we've failed to assign
493 // gpu memory to a higher priority tile. This is important for 552 // gpu memory to a higher priority tile. This is important for
494 // two reasons: 553 // two reasons:
495 // 1. Tile size should not impact raster priority. 554 // 1. Tile size should not impact raster priority.
496 // 2. Tile with unreleasable memory could otherwise incorrectly 555 // 2. Tile with unreleasable memory could otherwise incorrectly
497 // be added as it's not affected by |bytes_allocatable|. 556 // be added as it's not affected by |bytes_allocatable|.
498 if (higher_priority_tile_oomed) 557 if (higher_priority_tile_oomed)
499 continue; 558 continue;
500 559
501 if (!tile_version.resource_) 560 if (!tile_version.resource_)
502 tiles_that_need_to_be_rasterized_.push_back(tile); 561 tiles_that_need_to_be_rasterized_.push_back(tile);
503 562
504 if (!tile->IsReadyToDraw(NULL) && 563 if (!tile->IsReadyToDraw(NULL) &&
505 tile->required_for_activation()) { 564 tile->required_for_activation()) {
506 AddRequiredTileForActivation(tile); 565 AddRequiredTileForActivation(tile);
507 } 566 }
508 } 567 }
509 568
510 // In OOM situation, we iterate tiles_, remove the memory for active tree 569 ever_exceeded_memory_budget_ |= bytes_that_exceeded_memory_budget > 0;
511 // and not the now bin. And give them to bytes_oom_in_now_bin_on_pending_tree
512 if (!tiles_requiring_memory_but_oomed.empty()) {
513 size_t bytes_freed = 0;
514 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
515 Tile* tile = *it;
516 ManagedTileState& mts = tile->managed_state();
517 ManagedTileState::TileVersion& tile_version =
518 mts.tile_versions[mts.raster_mode];
519 if (mts.tree_bin[PENDING_TREE] == NEVER_BIN &&
520 mts.tree_bin[ACTIVE_TREE] != NOW_BIN) {
521 size_t bytes_that_can_be_freed = 0;
522
523 // If the tile is in the to-rasterize list, but it has no task,
524 // then it means that we have assigned memory for it.
525 TileVector::iterator raster_it =
526 std::find(tiles_that_need_to_be_rasterized_.begin(),
527 tiles_that_need_to_be_rasterized_.end(),
528 tile);
529 if (raster_it != tiles_that_need_to_be_rasterized_.end() &&
530 tile_version.raster_task_.is_null()) {
531 bytes_that_can_be_freed += tile->bytes_consumed_if_allocated();
532 }
533
534 // Also consider all of the completed resources for freeing.
535 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
536 ManagedTileState::TileVersion& tile_version =
537 mts.tile_versions[mode];
538 if (tile_version.resource_) {
539 DCHECK(!tile->required_for_activation());
540 bytes_that_can_be_freed += tile->bytes_consumed_if_allocated();
541 }
542 }
543
544 // If we can free anything, then do so.
545 if (bytes_that_can_be_freed > 0) {
546 FreeResourcesForTile(tile);
547 bytes_freed += bytes_that_can_be_freed;
548 mts.tile_versions[mts.raster_mode].set_rasterize_on_demand();
549 if (raster_it != tiles_that_need_to_be_rasterized_.end())
550 tiles_that_need_to_be_rasterized_.erase(raster_it);
551 }
552 }
553
554 if (bytes_oom_in_now_bin_on_pending_tree <= bytes_freed)
555 break;
556 }
557
558 for (TileVector::iterator it = tiles_requiring_memory_but_oomed.begin();
559 it != tiles_requiring_memory_but_oomed.end() && bytes_freed > 0;
560 ++it) {
561 Tile* tile = *it;
562 ManagedTileState& mts = tile->managed_state();
563 size_t bytes_needed = tile->bytes_consumed_if_allocated();
564 if (bytes_needed > bytes_freed)
565 continue;
566 mts.tile_versions[mts.raster_mode].set_use_resource();
567 bytes_freed -= bytes_needed;
568 tiles_that_need_to_be_rasterized_.push_back(tile);
569 if (tile->required_for_activation())
570 AddRequiredTileForActivation(tile);
571 }
572 }
573
574 ever_exceeded_memory_budget_ |=
575 bytes_that_exceeded_memory_budget_in_now_bin > 0;
576 if (ever_exceeded_memory_budget_) { 570 if (ever_exceeded_memory_budget_) {
577 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, 571 TRACE_COUNTER_ID2("cc", "over_memory_budget", this,
578 "budget", global_state_.memory_limit_in_bytes, 572 "budget", global_state_.memory_limit_in_bytes,
579 "over", bytes_that_exceeded_memory_budget_in_now_bin); 573 "over", bytes_that_exceeded_memory_budget);
580 } 574 }
581 memory_stats_from_last_assign_.total_budget_in_bytes = 575 memory_stats_from_last_assign_.total_budget_in_bytes =
582 global_state_.memory_limit_in_bytes; 576 global_state_.memory_limit_in_bytes;
583 memory_stats_from_last_assign_.bytes_allocated = 577 memory_stats_from_last_assign_.bytes_allocated =
584 bytes_allocatable - bytes_left; 578 bytes_allocatable - bytes_left;
585 memory_stats_from_last_assign_.bytes_unreleasable = 579 memory_stats_from_last_assign_.bytes_unreleasable =
586 bytes_allocatable - bytes_releasable; 580 bytes_allocatable - bytes_releasable;
587 memory_stats_from_last_assign_.bytes_over = 581 memory_stats_from_last_assign_.bytes_over =
588 bytes_that_exceeded_memory_budget_in_now_bin; 582 bytes_that_exceeded_memory_budget;
583 }
584
585 void TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation() {
586 TRACE_EVENT0(
587 "cc", "TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation");
588
589 size_t bytes_oom_for_required_tiles = 0;
590 TileVector tiles_requiring_memory_but_oomed;
591 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
592 Tile* tile = *it;
593 if (oom_tiles_that_need_to_be_initialized_for_activation_.find(tile) ==
594 oom_tiles_that_need_to_be_initialized_for_activation_.end())
595 continue;
596
597 tiles_requiring_memory_but_oomed.push_back(tile);
598 bytes_oom_for_required_tiles += tile->bytes_consumed_if_allocated();
599 }
600
601 if (tiles_requiring_memory_but_oomed.empty())
602 return;
603
604 // In OOM situation, we iterate tiles_, remove the memory for active tree
605 // and not the now bin. And give them to bytes_oom_for_required_tiles
606 size_t bytes_freed = 0;
607 for (TileVector::reverse_iterator it = tiles_.rbegin();
608 it != tiles_.rend(); ++it) {
609 Tile* tile = *it;
610 ManagedTileState& mts = tile->managed_state();
611 if (mts.tree_bin[PENDING_TREE] == NEVER_BIN &&
612 mts.tree_bin[ACTIVE_TREE] != NOW_BIN) {
613 ManagedTileState::TileVersion& tile_version =
614 mts.tile_versions[mts.raster_mode];
615
616 // If the tile is in the to-rasterize list, but it has no task,
617 // then it means that we have assigned memory for it.
618 TileVector::iterator raster_it =
619 std::find(tiles_that_need_to_be_rasterized_.begin(),
620 tiles_that_need_to_be_rasterized_.end(),
621 tile);
622 if (raster_it != tiles_that_need_to_be_rasterized_.end() &&
623 tile_version.raster_task_.is_null()) {
624 bytes_freed += tile->bytes_consumed_if_allocated();
625 tiles_that_need_to_be_rasterized_.erase(raster_it);
626 }
627
628 // Also consider all of the completed resources for freeing.
629 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
630 if (mts.tile_versions[mode].resource_) {
631 DCHECK(!tile->required_for_activation());
632 FreeResourceForTile(tile, static_cast<RasterMode>(mode));
633 bytes_freed += tile->bytes_consumed_if_allocated();
634 }
635 }
636 }
637
638 if (bytes_oom_for_required_tiles <= bytes_freed)
639 break;
640 }
641
642 for (TileVector::iterator it = tiles_requiring_memory_but_oomed.begin();
643 it != tiles_requiring_memory_but_oomed.end() && bytes_freed > 0;
644 ++it) {
645 Tile* tile = *it;
646 ManagedTileState& mts = tile->managed_state();
647 size_t bytes_needed = tile->bytes_consumed_if_allocated();
648 if (bytes_needed > bytes_freed)
649 continue;
650 mts.tile_versions[mts.raster_mode].set_use_resource();
651 bytes_freed -= bytes_needed;
652 tiles_that_need_to_be_rasterized_.push_back(tile);
653 DCHECK(tile->required_for_activation());
654 AddRequiredTileForActivation(tile);
655 oom_tiles_that_need_to_be_initialized_for_activation_.erase(tile);
656 }
589 } 657 }
590 658
591 void TileManager::CleanUpUnusedImageDecodeTasks() { 659 void TileManager::CleanUpUnusedImageDecodeTasks() {
592 // Calculate a set of layers that are used by at least one tile. 660 // Calculate a set of layers that are used by at least one tile.
593 base::hash_set<int> used_layers; 661 base::hash_set<int> used_layers;
594 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) 662 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it)
595 used_layers.insert((*it)->layer_id()); 663 used_layers.insert((*it)->layer_id());
596 664
597 // Now calculate the set of layers in |image_decode_tasks_| that are not used 665 // Now calculate the set of layers in |image_decode_tasks_| that are not used
598 // by any tile. 666 // by any tile.
(...skipping 30 matching lines...) Expand all
629 void TileManager::FreeUnusedResourcesForTile(Tile* tile) { 697 void TileManager::FreeUnusedResourcesForTile(Tile* tile) {
630 RasterMode used_mode = HIGH_QUALITY_RASTER_MODE; 698 RasterMode used_mode = HIGH_QUALITY_RASTER_MODE;
631 bool version_is_used = tile->IsReadyToDraw(&used_mode); 699 bool version_is_used = tile->IsReadyToDraw(&used_mode);
632 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { 700 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
633 if (!version_is_used || mode != used_mode) 701 if (!version_is_used || mode != used_mode)
634 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); 702 FreeResourceForTile(tile, static_cast<RasterMode>(mode));
635 } 703 }
636 } 704 }
637 705
638 void TileManager::ScheduleTasks() { 706 void TileManager::ScheduleTasks() {
639 TRACE_EVENT0("cc", "TileManager::ScheduleTasks"); 707 TRACE_EVENT1("cc", "TileManager::ScheduleTasks",
708 "count", tiles_that_need_to_be_rasterized_.size());
640 RasterWorkerPool::RasterTask::Queue tasks; 709 RasterWorkerPool::RasterTask::Queue tasks;
641 710
642 // Build a new task queue containing all task currently needed. Tasks 711 // Build a new task queue containing all task currently needed. Tasks
643 // are added in order of priority, highest priority task first. 712 // are added in order of priority, highest priority task first.
644 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); 713 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin();
645 it != tiles_that_need_to_be_rasterized_.end(); 714 it != tiles_that_need_to_be_rasterized_.end();
646 ++it) { 715 ++it) {
647 Tile* tile = *it; 716 Tile* tile = *it;
648 ManagedTileState& mts = tile->managed_state(); 717 ManagedTileState& mts = tile->managed_state();
649 ManagedTileState::TileVersion& tile_version = 718 ManagedTileState::TileVersion& tile_version =
650 mts.tile_versions[mts.raster_mode]; 719 mts.tile_versions[mts.raster_mode];
651 720
652 DCHECK(tile_version.requires_resource()); 721 DCHECK(tile_version.requires_resource());
653 DCHECK(!tile_version.resource_); 722 DCHECK(!tile_version.resource_);
654 723
655 if (tile_version.raster_task_.is_null()) 724 if (tile_version.raster_task_.is_null())
656 tile_version.raster_task_ = CreateRasterTask(tile); 725 tile_version.raster_task_ = CreateRasterTask(tile);
657 726
658 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); 727 tasks.Append(tile_version.raster_task_, tile->required_for_activation());
659 } 728 }
660 729
661 // Schedule running of |tasks|. This replaces any previously 730 // Schedule running of |tasks|. This replaces any previously
662 // scheduled tasks and effectively cancels all tasks not present 731 // scheduled tasks and effectively cancels all tasks not present
663 // in |tasks|. 732 // in |tasks|.
664 raster_worker_pool_->ScheduleTasks(&tasks); 733 raster_worker_pool_->ScheduleTasks(&tasks);
665 } 734 }
666 735
667 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( 736 RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
668 Tile* tile, skia::LazyPixelRef* pixel_ref) { 737 Tile* tile, skia::LazyPixelRef* pixel_ref) {
669 TRACE_EVENT0("cc", "TileManager::CreateImageDecodeTask");
670
671 return RasterWorkerPool::CreateImageDecodeTask( 738 return RasterWorkerPool::CreateImageDecodeTask(
672 pixel_ref, 739 pixel_ref,
673 tile->layer_id(), 740 tile->layer_id(),
674 rendering_stats_instrumentation_, 741 rendering_stats_instrumentation_,
675 base::Bind(&TileManager::OnImageDecodeTaskCompleted, 742 base::Bind(&TileManager::OnImageDecodeTaskCompleted,
676 base::Unretained(this), 743 base::Unretained(this),
677 tile->layer_id(), 744 tile->layer_id(),
678 base::Unretained(pixel_ref))); 745 base::Unretained(pixel_ref)));
679 } 746 }
680 747
681 RasterTaskMetadata TileManager::GetRasterTaskMetadata( 748 RasterTaskMetadata TileManager::GetRasterTaskMetadata(
682 const Tile& tile) const { 749 const Tile& tile) const {
683 RasterTaskMetadata metadata; 750 RasterTaskMetadata metadata;
684 const ManagedTileState& mts = tile.managed_state(); 751 const ManagedTileState& mts = tile.managed_state();
685 metadata.is_tile_in_pending_tree_now_bin = 752 metadata.is_tile_in_pending_tree_now_bin =
686 mts.tree_bin[PENDING_TREE] == NOW_BIN; 753 mts.tree_bin[PENDING_TREE] == NOW_BIN;
687 metadata.tile_resolution = mts.resolution; 754 metadata.tile_resolution = mts.resolution;
688 metadata.layer_id = tile.layer_id(); 755 metadata.layer_id = tile.layer_id();
689 metadata.tile_id = &tile; 756 metadata.tile_id = &tile;
690 metadata.source_frame_number = tile.source_frame_number(); 757 metadata.source_frame_number = tile.source_frame_number();
691 return metadata; 758 return metadata;
692 } 759 }
693 760
694 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { 761 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) {
695 TRACE_EVENT0("cc", "TileManager::CreateRasterTask");
696
697 ManagedTileState& mts = tile->managed_state(); 762 ManagedTileState& mts = tile->managed_state();
698 763
699 scoped_ptr<ResourcePool::Resource> resource = 764 scoped_ptr<ResourcePool::Resource> resource =
700 resource_pool_->AcquireResource(tile->tile_size_.size(), 765 resource_pool_->AcquireResource(tile->tile_size_.size(),
701 texture_format_); 766 texture_format_);
702 const Resource* const_resource = resource.get(); 767 const Resource* const_resource = resource.get();
703 768
704 // Create and queue all image decode tasks that this tile depends on. 769 // Create and queue all image decode tasks that this tile depends on.
705 RasterWorkerPool::Task::Set decode_tasks; 770 RasterWorkerPool::Task::Set decode_tasks;
706 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; 771 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()];
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
799 } 864 }
800 865
801 void TileManager::DidFinishTileInitialization(Tile* tile) { 866 void TileManager::DidFinishTileInitialization(Tile* tile) {
802 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 867 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
803 did_initialize_visible_tile_ = true; 868 did_initialize_visible_tile_ = true;
804 if (tile->required_for_activation()) { 869 if (tile->required_for_activation()) {
805 // It's possible that a tile required for activation is not in this list 870 // It's possible that a tile required for activation is not in this list
806 // if it was marked as being required after being dispatched for 871 // if it was marked as being required after being dispatched for
807 // rasterization but before AssignGPUMemory was called again. 872 // rasterization but before AssignGPUMemory was called again.
808 tiles_that_need_to_be_initialized_for_activation_.erase(tile); 873 tiles_that_need_to_be_initialized_for_activation_.erase(tile);
809
810 if (AreTilesRequiredForActivationReady())
811 client_->NotifyReadyToActivate();
812 } 874 }
813 } 875 }
814 876
815 void TileManager::DidTileTreeBinChange(Tile* tile, 877 void TileManager::DidTileTreeBinChange(Tile* tile,
816 TileManagerBin new_tree_bin, 878 TileManagerBin new_tree_bin,
817 WhichTree tree) { 879 WhichTree tree) {
818 ManagedTileState& mts = tile->managed_state(); 880 ManagedTileState& mts = tile->managed_state();
819 mts.tree_bin[tree] = new_tree_bin; 881 mts.tree_bin[tree] = new_tree_bin;
820 } 882 }
821 883
822 } // namespace cc 884 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/tile_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698