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

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

Issue 322443002: cc: Refactor how picture layers are exposed to the tile manager. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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 | Annotate | Revision Log
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 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 rasterizer_->ScheduleTasks(&empty); 413 rasterizer_->ScheduleTasks(&empty);
414 orphan_raster_tasks_.clear(); 414 orphan_raster_tasks_.clear();
415 415
416 // This should finish all pending tasks and release any uninitialized 416 // This should finish all pending tasks and release any uninitialized
417 // resources. 417 // resources.
418 rasterizer_->Shutdown(); 418 rasterizer_->Shutdown();
419 rasterizer_->CheckForCompletedTasks(); 419 rasterizer_->CheckForCompletedTasks();
420 420
421 DCHECK_EQ(0u, bytes_releasable_); 421 DCHECK_EQ(0u, bytes_releasable_);
422 DCHECK_EQ(0u, resources_releasable_); 422 DCHECK_EQ(0u, resources_releasable_);
423
424 for (std::vector<PictureLayerImpl*>::iterator it = layers_.begin();
425 it != layers_.end();
426 ++it) {
427 (*it)->DidUnregisterLayer();
428 }
429 layers_.clear();
430 } 423 }
431 424
432 void TileManager::Release(Tile* tile) { 425 void TileManager::Release(Tile* tile) {
433 prioritized_tiles_dirty_ = true; 426 prioritized_tiles_dirty_ = true;
434 released_tiles_.push_back(tile); 427 released_tiles_.push_back(tile);
435 } 428 }
436 429
437 void TileManager::DidChangeTilePriority(Tile* tile) { 430 void TileManager::DidChangeTilePriority(Tile* tile) {
438 prioritized_tiles_dirty_ = true; 431 prioritized_tiles_dirty_ = true;
439 } 432 }
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 !mts.tile_versions[mts.raster_mode].raster_task_) { 662 !mts.tile_versions[mts.raster_mode].raster_task_) {
670 FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile); 663 FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile);
671 continue; 664 continue;
672 } 665 }
673 666
674 // Insert the tile into a priority set. 667 // Insert the tile into a priority set.
675 tiles->InsertTile(tile, mts.bin); 668 tiles->InsertTile(tile, mts.bin);
676 } 669 }
677 } 670 }
678 671
679 void TileManager::CleanUpLayers() {
680 for (size_t i = 0; i < layers_.size(); ++i) {
681 if (layers_[i]->IsDrawnRenderSurfaceLayerListMember())
682 continue;
683
684 layers_[i]->DidUnregisterLayer();
685 std::swap(layers_[i], layers_.back());
686 layers_.pop_back();
687 --i;
688 prioritized_tiles_dirty_ = true;
689 }
690 }
691
692 void TileManager::ManageTiles(const GlobalStateThatImpactsTilePriority& state) { 672 void TileManager::ManageTiles(const GlobalStateThatImpactsTilePriority& state) {
693 TRACE_EVENT0("cc", "TileManager::ManageTiles"); 673 TRACE_EVENT0("cc", "TileManager::ManageTiles");
694 674
695 // Update internal state. 675 // Update internal state.
696 if (state != global_state_) { 676 if (state != global_state_) {
697 global_state_ = state; 677 global_state_ = state;
698 prioritized_tiles_dirty_ = true; 678 prioritized_tiles_dirty_ = true;
699 } 679 }
700 680
701 CleanUpLayers();
702
703 // We need to call CheckForCompletedTasks() once in-between each call 681 // We need to call CheckForCompletedTasks() once in-between each call
704 // to ScheduleTasks() to prevent canceled tasks from being scheduled. 682 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
705 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { 683 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
706 rasterizer_->CheckForCompletedTasks(); 684 rasterizer_->CheckForCompletedTasks();
707 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 685 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
708 } 686 }
709 687
710 UpdatePrioritizedTileSetIfNeeded(); 688 UpdatePrioritizedTileSetIfNeeded();
711 689
712 TileVector tiles_that_need_to_be_rasterized; 690 TileVector tiles_that_need_to_be_rasterized;
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
1212 source_frame_number, 1190 source_frame_number,
1213 flags)); 1191 flags));
1214 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 1192 DCHECK(tiles_.find(tile->id()) == tiles_.end());
1215 1193
1216 tiles_[tile->id()] = tile; 1194 tiles_[tile->id()] = tile;
1217 used_layer_counts_[tile->layer_id()]++; 1195 used_layer_counts_[tile->layer_id()]++;
1218 prioritized_tiles_dirty_ = true; 1196 prioritized_tiles_dirty_ = true;
1219 return tile; 1197 return tile;
1220 } 1198 }
1221 1199
1222 void TileManager::RegisterPictureLayerImpl(PictureLayerImpl* layer) {
1223 DCHECK(std::find(layers_.begin(), layers_.end(), layer) == layers_.end());
1224 layers_.push_back(layer);
1225 }
1226
1227 void TileManager::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
1228 std::vector<PictureLayerImpl*>::iterator it =
1229 std::find(layers_.begin(), layers_.end(), layer);
1230 DCHECK(it != layers_.end());
1231 layers_.erase(it);
1232 }
1233
1234 void TileManager::GetPairedPictureLayers( 1200 void TileManager::GetPairedPictureLayers(
reveman 2014/06/05 22:15:18 Would it be easier and more efficient to maintain
vmpstr 2014/06/05 22:38:01 You would have to update it every time there's a s
1235 std::vector<PairedPictureLayer>* paired_layers) const { 1201 std::vector<PairedPictureLayer>* paired_layers) const {
1202 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers();
1203
1236 paired_layers->clear(); 1204 paired_layers->clear();
1237 // Reserve a maximum possible paired layers. 1205 // Reserve a maximum possible paired layers.
1238 paired_layers->reserve(layers_.size()); 1206 paired_layers->reserve(layers.size());
1239 1207
1240 for (std::vector<PictureLayerImpl*>::const_iterator it = layers_.begin(); 1208 for (std::vector<PictureLayerImpl*>::const_iterator it = layers.begin();
1241 it != layers_.end(); 1209 it != layers.end();
1242 ++it) { 1210 ++it) {
1243 PictureLayerImpl* layer = *it; 1211 PictureLayerImpl* layer = *it;
1244 1212
1245 // This is a recycle tree layer, we can safely skip since the tiles on this 1213 if (!layer->IsViableSourceOfRasterAndEvictionTiles())
1246 // layer have to be accessible via the active tree.
1247 if (!layer->IsOnActiveOrPendingTree())
1248 continue; 1214 continue;
1249 1215
1250 PictureLayerImpl* twin_layer = layer->GetTwinLayer(); 1216 PictureLayerImpl* twin_layer = layer->GetTwinLayer();
1251 1217
1252 // If the twin layer is recycled, it is not a valid twin. 1218 // Ignore the twin layer if not a viable source of tiles.
1253 if (twin_layer && !twin_layer->IsOnActiveOrPendingTree()) 1219 if (twin_layer && !twin_layer->IsViableSourceOfRasterAndEvictionTiles())
1254 twin_layer = NULL; 1220 twin_layer = NULL;
1255 1221
1256 PairedPictureLayer paired_layer; 1222 PairedPictureLayer paired_layer;
1257 WhichTree tree = layer->GetTree(); 1223 WhichTree tree = layer->GetTree();
1258 1224
1259 // If the current tree is ACTIVE_TREE, then always generate a paired_layer. 1225 // If the current tree is ACTIVE_TREE, then always generate a paired_layer.
1260 // If current tree is PENDING_TREE, then only generate a paired_layer if 1226 // If current tree is PENDING_TREE, then only generate a paired_layer if
1261 // there is no twin layer. 1227 // there is no twin layer.
1262 if (tree == ACTIVE_TREE) { 1228 if (tree == ACTIVE_TREE) {
1263 DCHECK(!twin_layer || twin_layer->GetTree() == PENDING_TREE); 1229 DCHECK(!twin_layer || twin_layer->GetTree() == PENDING_TREE);
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after
1632 } 1598 }
1633 return a_priority.IsHigherPriorityThan(b_priority); 1599 return a_priority.IsHigherPriorityThan(b_priority);
1634 } 1600 }
1635 1601
1636 void TileManager::SetRasterizerForTesting(Rasterizer* rasterizer) { 1602 void TileManager::SetRasterizerForTesting(Rasterizer* rasterizer) {
1637 rasterizer_ = rasterizer; 1603 rasterizer_ = rasterizer;
1638 rasterizer_->SetClient(this); 1604 rasterizer_->SetClient(this);
1639 } 1605 }
1640 1606
1641 bool TileManager::IsReadyToActivate() const { 1607 bool TileManager::IsReadyToActivate() const {
1642 for (std::vector<PictureLayerImpl*>::const_iterator it = layers_.begin(); 1608 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers();
1643 it != layers_.end(); 1609
1610 for (std::vector<PictureLayerImpl*>::const_iterator it = layers.begin();
1611 it != layers.end();
1644 ++it) { 1612 ++it) {
1645 if (!(*it)->AllTilesRequiredForActivationAreReadyToDraw()) 1613 if (!(*it)->AllTilesRequiredForActivationAreReadyToDraw())
vmpstr 2014/06/05 22:38:01 I'm not sure you want to check all of the layers h
reveman 2014/06/06 17:27:24 Updated AllTilesRequiredForActivationAreReadyToDra
1646 return false; 1614 return false;
1647 } 1615 }
1648 1616
1649 return true; 1617 return true;
1650 } 1618 }
1651 1619
1652 void TileManager::CheckIfReadyToActivate() { 1620 void TileManager::CheckIfReadyToActivate() {
1653 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); 1621 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate");
1654 1622
1655 rasterizer_->CheckForCompletedTasks(); 1623 rasterizer_->CheckForCompletedTasks();
1656 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 1624 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
1657 1625
1658 if (IsReadyToActivate()) 1626 if (IsReadyToActivate())
1659 client_->NotifyReadyToActivate(); 1627 client_->NotifyReadyToActivate();
1660 } 1628 }
1661 1629
1662 } // namespace cc 1630 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698