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

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

Powered by Google App Engine
This is Rietveld 408576698