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

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: Use "ready to activate" signal for activation in LTHI and fix task scheduling problems in pixel buf… Created 7 years, 6 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 client_->ShouldForceTileUploadsRequiredForActivationToComplete(); 181 return client_->ShouldForceTileUploadsRequiredForActivationToComplete();
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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 return raster_mode; 457 return raster_mode;
408 } 458 }
409 459
410 void TileManager::AssignGpuMemoryToTiles() { 460 void TileManager::AssignGpuMemoryToTiles() {
411 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); 461 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles");
412 462
413 // Now give memory out to the tiles until we're out, and build 463 // Now give memory out to the tiles until we're out, and build
414 // the needs-to-be-rasterized queue. 464 // the needs-to-be-rasterized queue.
415 tiles_that_need_to_be_rasterized_.clear(); 465 tiles_that_need_to_be_rasterized_.clear();
416 tiles_that_need_to_be_initialized_for_activation_.clear(); 466 tiles_that_need_to_be_initialized_for_activation_.clear();
467 oom_tiles_that_need_to_be_initialized_for_activation_.clear();
417 468
418 size_t bytes_releasable = 0; 469 size_t bytes_releasable = 0;
419 for (TileVector::const_iterator it = tiles_.begin(); 470 for (TileVector::const_iterator it = tiles_.begin();
420 it != tiles_.end(); 471 it != tiles_.end();
421 ++it) { 472 ++it) {
422 const Tile* tile = *it; 473 const Tile* tile = *it;
423 const ManagedTileState& mts = tile->managed_state(); 474 const ManagedTileState& mts = tile->managed_state();
424 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { 475 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
425 if (mts.tile_versions[mode].resource_) 476 if (mts.tile_versions[mode].resource_)
426 bytes_releasable += tile->bytes_consumed_if_allocated(); 477 bytes_releasable += tile->bytes_consumed_if_allocated();
427 } 478 }
428 } 479 }
429 480
430 // Cast to prevent overflow. 481 // Cast to prevent overflow.
431 int64 bytes_available = 482 int64 bytes_available =
432 static_cast<int64>(bytes_releasable) + 483 static_cast<int64>(bytes_releasable) +
433 static_cast<int64>(global_state_.memory_limit_in_bytes) - 484 static_cast<int64>(global_state_.memory_limit_in_bytes) -
434 static_cast<int64>(resource_pool_->acquired_memory_usage_bytes()); 485 static_cast<int64>(resource_pool_->acquired_memory_usage_bytes());
435 486
436 size_t bytes_allocatable = 487 size_t bytes_allocatable =
437 std::max(static_cast<int64>(0), bytes_available); 488 std::max(static_cast<int64>(0), bytes_available);
438 489
439 size_t bytes_that_exceeded_memory_budget_in_now_bin = 0; 490 size_t bytes_that_exceeded_memory_budget = 0;
440 size_t bytes_left = bytes_allocatable; 491 size_t bytes_left = bytes_allocatable;
441 size_t bytes_oom_in_now_bin_on_pending_tree = 0;
442 TileVector tiles_requiring_memory_but_oomed;
443 bool higher_priority_tile_oomed = false; 492 bool higher_priority_tile_oomed = false;
444 for (TileVector::iterator it = tiles_.begin(); 493 for (TileVector::iterator it = tiles_.begin();
445 it != tiles_.end(); 494 it != tiles_.end();
446 ++it) { 495 ++it) {
447 Tile* tile = *it; 496 Tile* tile = *it;
448 ManagedTileState& mts = tile->managed_state(); 497 ManagedTileState& mts = tile->managed_state();
449 498
450 // Pick the better version out of the one we already set, 499 // Pick the better version out of the one we already set,
451 // and the one that is required. 500 // and the one that is required.
452 mts.raster_mode = std::min(mts.raster_mode, DetermineRasterMode(tile)); 501 mts.raster_mode = std::min(mts.raster_mode, DetermineRasterMode(tile));
(...skipping 19 matching lines...) Expand all
472 tile_bytes += tile->bytes_consumed_if_allocated(); 521 tile_bytes += tile->bytes_consumed_if_allocated();
473 } 522 }
474 523
475 // If we don't have the required version, and it's not in flight 524 // If we don't have the required version, and it's not in flight
476 // then we'll have to pay to create a new task. 525 // then we'll have to pay to create a new task.
477 if (!tile_version.resource_ && tile_version.raster_task_.is_null()) 526 if (!tile_version.resource_ && tile_version.raster_task_.is_null())
478 tile_bytes += tile->bytes_consumed_if_allocated(); 527 tile_bytes += tile->bytes_consumed_if_allocated();
479 528
480 // Tile is OOM. 529 // Tile is OOM.
481 if (tile_bytes > bytes_left) { 530 if (tile_bytes > bytes_left) {
482 mts.tile_versions[mts.raster_mode].set_rasterize_on_demand(); 531 if (tile->required_for_activation())
483 if (mts.tree_bin[PENDING_TREE] == NOW_BIN) { 532 oom_tiles_that_need_to_be_initialized_for_activation_.insert(tile);
484 tiles_requiring_memory_but_oomed.push_back(tile);
485 bytes_oom_in_now_bin_on_pending_tree += tile_bytes;
486 }
487 FreeResourcesForTile(tile); 533 FreeResourcesForTile(tile);
488 higher_priority_tile_oomed = true; 534 higher_priority_tile_oomed = true;
535 bytes_that_exceeded_memory_budget += tile_bytes;
489 continue; 536 continue;
490 } 537 }
491 538
492 tile_version.set_use_resource(); 539 tile_version.set_use_resource();
493 bytes_left -= tile_bytes; 540 bytes_left -= tile_bytes;
494 541
495 // Tile shouldn't be rasterized if we've failed to assign 542 // Tile shouldn't be rasterized if we've failed to assign
496 // gpu memory to a higher priority tile. This is important for 543 // gpu memory to a higher priority tile. This is important for
497 // two reasons: 544 // two reasons:
498 // 1. Tile size should not impact raster priority. 545 // 1. Tile size should not impact raster priority.
499 // 2. Tile with unreleasable memory could otherwise incorrectly 546 // 2. Tile with unreleasable memory could otherwise incorrectly
500 // be added as it's not affected by |bytes_allocatable|. 547 // be added as it's not affected by |bytes_allocatable|.
501 if (higher_priority_tile_oomed) 548 if (higher_priority_tile_oomed)
502 continue; 549 continue;
503 550
504 if (!tile_version.resource_) 551 if (!tile_version.resource_)
505 tiles_that_need_to_be_rasterized_.push_back(tile); 552 tiles_that_need_to_be_rasterized_.push_back(tile);
506 553
507 if (!tile->IsReadyToDraw(NULL) && 554 if (!tile->IsReadyToDraw(NULL) &&
508 tile->required_for_activation()) { 555 tile->required_for_activation()) {
509 AddRequiredTileForActivation(tile); 556 AddRequiredTileForActivation(tile);
510 } 557 }
511 } 558 }
512 559
513 // In OOM situation, we iterate tiles_, remove the memory for active tree 560 ever_exceeded_memory_budget_ |= bytes_that_exceeded_memory_budget > 0;
514 // and not the now bin. And give them to bytes_oom_in_now_bin_on_pending_tree
515 if (!tiles_requiring_memory_but_oomed.empty()) {
516 size_t bytes_freed = 0;
517 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
518 Tile* tile = *it;
519 ManagedTileState& mts = tile->managed_state();
520 ManagedTileState::TileVersion& tile_version =
521 mts.tile_versions[mts.raster_mode];
522 if (mts.tree_bin[PENDING_TREE] == NEVER_BIN &&
523 mts.tree_bin[ACTIVE_TREE] != NOW_BIN) {
524 size_t bytes_that_can_be_freed = 0;
525
526 // If the tile is in the to-rasterize list, but it has no task,
527 // then it means that we have assigned memory for it.
528 TileVector::iterator raster_it =
529 std::find(tiles_that_need_to_be_rasterized_.begin(),
530 tiles_that_need_to_be_rasterized_.end(),
531 tile);
532 if (raster_it != tiles_that_need_to_be_rasterized_.end() &&
533 tile_version.raster_task_.is_null()) {
534 bytes_that_can_be_freed += tile->bytes_consumed_if_allocated();
535 }
536
537 // Also consider all of the completed resources for freeing.
538 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
539 ManagedTileState::TileVersion& tile_version =
540 mts.tile_versions[mode];
541 if (tile_version.resource_) {
542 DCHECK(!tile->required_for_activation());
543 bytes_that_can_be_freed += tile->bytes_consumed_if_allocated();
544 }
545 }
546
547 // If we can free anything, then do so.
548 if (bytes_that_can_be_freed > 0) {
549 FreeResourcesForTile(tile);
550 bytes_freed += bytes_that_can_be_freed;
551 mts.tile_versions[mts.raster_mode].set_rasterize_on_demand();
552 if (raster_it != tiles_that_need_to_be_rasterized_.end())
553 tiles_that_need_to_be_rasterized_.erase(raster_it);
554 }
555 }
556
557 if (bytes_oom_in_now_bin_on_pending_tree <= bytes_freed)
558 break;
559 }
560
561 for (TileVector::iterator it = tiles_requiring_memory_but_oomed.begin();
562 it != tiles_requiring_memory_but_oomed.end() && bytes_freed > 0;
563 ++it) {
564 Tile* tile = *it;
565 ManagedTileState& mts = tile->managed_state();
566 size_t bytes_needed = tile->bytes_consumed_if_allocated();
567 if (bytes_needed > bytes_freed)
568 continue;
569 mts.tile_versions[mts.raster_mode].set_use_resource();
570 bytes_freed -= bytes_needed;
571 tiles_that_need_to_be_rasterized_.push_back(tile);
572 if (tile->required_for_activation())
573 AddRequiredTileForActivation(tile);
574 }
575 }
576
577 ever_exceeded_memory_budget_ |=
578 bytes_that_exceeded_memory_budget_in_now_bin > 0;
579 if (ever_exceeded_memory_budget_) { 561 if (ever_exceeded_memory_budget_) {
580 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, 562 TRACE_COUNTER_ID2("cc", "over_memory_budget", this,
581 "budget", global_state_.memory_limit_in_bytes, 563 "budget", global_state_.memory_limit_in_bytes,
582 "over", bytes_that_exceeded_memory_budget_in_now_bin); 564 "over", bytes_that_exceeded_memory_budget);
583 } 565 }
584 memory_stats_from_last_assign_.total_budget_in_bytes = 566 memory_stats_from_last_assign_.total_budget_in_bytes =
585 global_state_.memory_limit_in_bytes; 567 global_state_.memory_limit_in_bytes;
586 memory_stats_from_last_assign_.bytes_allocated = 568 memory_stats_from_last_assign_.bytes_allocated =
587 bytes_allocatable - bytes_left; 569 bytes_allocatable - bytes_left;
588 memory_stats_from_last_assign_.bytes_unreleasable = 570 memory_stats_from_last_assign_.bytes_unreleasable =
589 bytes_allocatable - bytes_releasable; 571 bytes_allocatable - bytes_releasable;
590 memory_stats_from_last_assign_.bytes_over = 572 memory_stats_from_last_assign_.bytes_over =
591 bytes_that_exceeded_memory_budget_in_now_bin; 573 bytes_that_exceeded_memory_budget;
574 }
575
576 void TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation() {
577 TRACE_EVENT0(
578 "cc", "TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation");
579
580 size_t bytes_oom_for_required_tiles = 0;
581 TileVector tiles_requiring_memory_but_oomed;
582 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
583 Tile* tile = *it;
584 if (oom_tiles_that_need_to_be_initialized_for_activation_.find(tile) ==
585 oom_tiles_that_need_to_be_initialized_for_activation_.end())
586 continue;
587
588 tiles_requiring_memory_but_oomed.push_back(tile);
589 bytes_oom_for_required_tiles += tile->bytes_consumed_if_allocated();
590 }
591
592 if (tiles_requiring_memory_but_oomed.empty())
593 return;
594
595 // In OOM situation, we iterate tiles_, remove the memory for active tree
596 // and not the now bin. And give them to bytes_oom_for_required_tiles
597 size_t bytes_freed = 0;
598 for (TileVector::reverse_iterator it = tiles_.rbegin();
599 it != tiles_.rend(); ++it) {
600 Tile* tile = *it;
601 ManagedTileState& mts = tile->managed_state();
602 if (mts.tree_bin[PENDING_TREE] == NEVER_BIN &&
603 mts.tree_bin[ACTIVE_TREE] != NOW_BIN) {
604 ManagedTileState::TileVersion& tile_version =
605 mts.tile_versions[mts.raster_mode];
606
607 // If the tile is in the to-rasterize list, but it has no task,
608 // then it means that we have assigned memory for it.
609 TileVector::iterator raster_it =
610 std::find(tiles_that_need_to_be_rasterized_.begin(),
611 tiles_that_need_to_be_rasterized_.end(),
612 tile);
613 if (raster_it != tiles_that_need_to_be_rasterized_.end() &&
614 tile_version.raster_task_.is_null()) {
615 bytes_freed += tile->bytes_consumed_if_allocated();
616 tiles_that_need_to_be_rasterized_.erase(raster_it);
617 }
618
619 // Also consider all of the completed resources for freeing.
620 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
621 if (mts.tile_versions[mode].resource_) {
622 DCHECK(!tile->required_for_activation());
623 FreeResourceForTile(tile, static_cast<RasterMode>(mode));
624 bytes_freed += tile->bytes_consumed_if_allocated();
625 }
626 }
627 }
628
629 if (bytes_oom_for_required_tiles <= bytes_freed)
630 break;
631 }
632
633 for (TileVector::iterator it = tiles_requiring_memory_but_oomed.begin();
634 it != tiles_requiring_memory_but_oomed.end() && bytes_freed > 0;
635 ++it) {
636 Tile* tile = *it;
637 ManagedTileState& mts = tile->managed_state();
638 size_t bytes_needed = tile->bytes_consumed_if_allocated();
639 if (bytes_needed > bytes_freed)
640 continue;
641 mts.tile_versions[mts.raster_mode].set_use_resource();
642 bytes_freed -= bytes_needed;
643 tiles_that_need_to_be_rasterized_.push_back(tile);
644 DCHECK(tile->required_for_activation());
645 AddRequiredTileForActivation(tile);
646 oom_tiles_that_need_to_be_initialized_for_activation_.erase(tile);
647 }
592 } 648 }
593 649
594 void TileManager::CleanUpUnusedImageDecodeTasks() { 650 void TileManager::CleanUpUnusedImageDecodeTasks() {
595 // Calculate a set of layers that are used by at least one tile. 651 // Calculate a set of layers that are used by at least one tile.
596 base::hash_set<int> used_layers; 652 base::hash_set<int> used_layers;
597 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) 653 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it)
598 used_layers.insert((*it)->layer_id()); 654 used_layers.insert((*it)->layer_id());
599 655
600 // Now calculate the set of layers in |image_decode_tasks_| that are not used 656 // Now calculate the set of layers in |image_decode_tasks_| that are not used
601 // by any tile. 657 // by any tile.
(...skipping 30 matching lines...) Expand all
632 void TileManager::FreeUnusedResourcesForTile(Tile* tile) { 688 void TileManager::FreeUnusedResourcesForTile(Tile* tile) {
633 RasterMode used_mode = HIGH_QUALITY_RASTER_MODE; 689 RasterMode used_mode = HIGH_QUALITY_RASTER_MODE;
634 bool version_is_used = tile->IsReadyToDraw(&used_mode); 690 bool version_is_used = tile->IsReadyToDraw(&used_mode);
635 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { 691 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) {
636 if (!version_is_used || mode != used_mode) 692 if (!version_is_used || mode != used_mode)
637 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); 693 FreeResourceForTile(tile, static_cast<RasterMode>(mode));
638 } 694 }
639 } 695 }
640 696
641 void TileManager::ScheduleTasks() { 697 void TileManager::ScheduleTasks() {
642 TRACE_EVENT0("cc", "TileManager::ScheduleTasks"); 698 TRACE_EVENT1("cc", "TileManager::ScheduleTasks",
699 "count", tiles_that_need_to_be_rasterized_.size());
643 RasterWorkerPool::RasterTask::Queue tasks; 700 RasterWorkerPool::RasterTask::Queue tasks;
644 701
645 // Build a new task queue containing all task currently needed. Tasks 702 // Build a new task queue containing all task currently needed. Tasks
646 // are added in order of priority, highest priority task first. 703 // are added in order of priority, highest priority task first.
647 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); 704 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin();
648 it != tiles_that_need_to_be_rasterized_.end(); 705 it != tiles_that_need_to_be_rasterized_.end();
649 ++it) { 706 ++it) {
650 Tile* tile = *it; 707 Tile* tile = *it;
651 ManagedTileState& mts = tile->managed_state(); 708 ManagedTileState& mts = tile->managed_state();
652 ManagedTileState::TileVersion& tile_version = 709 ManagedTileState::TileVersion& tile_version =
653 mts.tile_versions[mts.raster_mode]; 710 mts.tile_versions[mts.raster_mode];
654 711
655 DCHECK(tile_version.requires_resource()); 712 DCHECK(tile_version.requires_resource());
656 DCHECK(!tile_version.resource_); 713 DCHECK(!tile_version.resource_);
657 714
658 if (tile_version.raster_task_.is_null()) 715 if (tile_version.raster_task_.is_null())
659 tile_version.raster_task_ = CreateRasterTask(tile); 716 tile_version.raster_task_ = CreateRasterTask(tile);
660 717
661 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); 718 tasks.Append(tile_version.raster_task_, tile->required_for_activation());
662 } 719 }
663 720
664 // Schedule running of |tasks|. This replaces any previously 721 // Schedule running of |tasks|. This replaces any previously
665 // scheduled tasks and effectively cancels all tasks not present 722 // scheduled tasks and effectively cancels all tasks not present
666 // in |tasks|. 723 // in |tasks|.
667 raster_worker_pool_->ScheduleTasks(&tasks); 724 raster_worker_pool_->ScheduleTasks(&tasks);
668 } 725 }
669 726
670 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( 727 RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
671 Tile* tile, skia::LazyPixelRef* pixel_ref) { 728 Tile* tile, skia::LazyPixelRef* pixel_ref) {
672 TRACE_EVENT0("cc", "TileManager::CreateImageDecodeTask");
673
674 return RasterWorkerPool::CreateImageDecodeTask( 729 return RasterWorkerPool::CreateImageDecodeTask(
675 pixel_ref, 730 pixel_ref,
676 tile->layer_id(), 731 tile->layer_id(),
677 rendering_stats_instrumentation_, 732 rendering_stats_instrumentation_,
678 base::Bind(&TileManager::OnImageDecodeTaskCompleted, 733 base::Bind(&TileManager::OnImageDecodeTaskCompleted,
679 base::Unretained(this), 734 base::Unretained(this),
680 tile->layer_id(), 735 tile->layer_id(),
681 base::Unretained(pixel_ref))); 736 base::Unretained(pixel_ref)));
682 } 737 }
683 738
684 RasterTaskMetadata TileManager::GetRasterTaskMetadata( 739 RasterTaskMetadata TileManager::GetRasterTaskMetadata(
685 const Tile& tile) const { 740 const Tile& tile) const {
686 RasterTaskMetadata metadata; 741 RasterTaskMetadata metadata;
687 const ManagedTileState& mts = tile.managed_state(); 742 const ManagedTileState& mts = tile.managed_state();
688 metadata.is_tile_in_pending_tree_now_bin = 743 metadata.is_tile_in_pending_tree_now_bin =
689 mts.tree_bin[PENDING_TREE] == NOW_BIN; 744 mts.tree_bin[PENDING_TREE] == NOW_BIN;
690 metadata.tile_resolution = mts.resolution; 745 metadata.tile_resolution = mts.resolution;
691 metadata.layer_id = tile.layer_id(); 746 metadata.layer_id = tile.layer_id();
692 metadata.tile_id = &tile; 747 metadata.tile_id = &tile;
693 metadata.source_frame_number = tile.source_frame_number(); 748 metadata.source_frame_number = tile.source_frame_number();
694 return metadata; 749 return metadata;
695 } 750 }
696 751
697 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { 752 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) {
698 TRACE_EVENT0("cc", "TileManager::CreateRasterTask");
699
700 ManagedTileState& mts = tile->managed_state(); 753 ManagedTileState& mts = tile->managed_state();
701 754
702 scoped_ptr<ResourcePool::Resource> resource = 755 scoped_ptr<ResourcePool::Resource> resource =
703 resource_pool_->AcquireResource(tile->tile_size_.size(), 756 resource_pool_->AcquireResource(tile->tile_size_.size(),
704 texture_format_); 757 texture_format_);
705 const Resource* const_resource = resource.get(); 758 const Resource* const_resource = resource.get();
706 759
707 // Create and queue all image decode tasks that this tile depends on. 760 // Create and queue all image decode tasks that this tile depends on.
708 RasterWorkerPool::Task::Set decode_tasks; 761 RasterWorkerPool::Task::Set decode_tasks;
709 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()]; 762 PixelRefTaskMap& existing_pixel_refs = image_decode_tasks_[tile->layer_id()];
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 } 856 }
804 857
805 void TileManager::DidFinishTileInitialization(Tile* tile) { 858 void TileManager::DidFinishTileInitialization(Tile* tile) {
806 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 859 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
807 did_initialize_visible_tile_ = true; 860 did_initialize_visible_tile_ = true;
808 if (tile->required_for_activation()) { 861 if (tile->required_for_activation()) {
809 // It's possible that a tile required for activation is not in this list 862 // It's possible that a tile required for activation is not in this list
810 // if it was marked as being required after being dispatched for 863 // if it was marked as being required after being dispatched for
811 // rasterization but before AssignGPUMemory was called again. 864 // rasterization but before AssignGPUMemory was called again.
812 tiles_that_need_to_be_initialized_for_activation_.erase(tile); 865 tiles_that_need_to_be_initialized_for_activation_.erase(tile);
813
814 if (AreTilesRequiredForActivationReady())
815 client_->NotifyReadyToActivate();
816 } 866 }
817 } 867 }
818 868
819 void TileManager::DidTileTreeBinChange(Tile* tile, 869 void TileManager::DidTileTreeBinChange(Tile* tile,
820 TileManagerBin new_tree_bin, 870 TileManagerBin new_tree_bin,
821 WhichTree tree) { 871 WhichTree tree) {
822 ManagedTileState& mts = tile->managed_state(); 872 ManagedTileState& mts = tile->managed_state();
823 mts.tree_bin[tree] = new_tree_bin; 873 mts.tree_bin[tree] = new_tree_bin;
824 } 874 }
825 875
826 } // namespace cc 876 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698