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

Unified Diff: cc/resources/tile_manager.cc

Issue 900073003: cc: Rework how picture layer tiling set gets into raster queues. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/tile_manager_perftest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/resources/tile_manager.cc
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
index 94b6332a9aa4229bcfaa1b90831beba679a39416..e56af15b1d5a55668e1b2c7da3031b64ee17736f 100644
--- a/cc/resources/tile_manager.cc
+++ b/cc/resources/tile_manager.cc
@@ -263,6 +263,38 @@ TileManager::~TileManager() {
CleanUpReleasedTiles();
}
+void TileManager::RegisterPictureLayerTilingSet(
+ int layer_id,
+ WhichTree tree,
+ PictureLayerTilingSet* tiling_set) {
+ auto& paired_tiling_set = paired_picture_layer_tiling_sets_[layer_id];
+ if (tree == ACTIVE_TREE) {
+ DCHECK(!paired_tiling_set.active);
+ paired_tiling_set.active = tiling_set;
+ } else {
+ DCHECK(!paired_tiling_set.pending);
+ paired_tiling_set.pending = tiling_set;
+ }
+}
+
+void TileManager::UnregisterPictureLayerTilingSet(int layer_id,
+ WhichTree tree) {
+ auto paired_tiling_set_it = paired_picture_layer_tiling_sets_.find(layer_id);
+ DCHECK(paired_tiling_set_it != paired_picture_layer_tiling_sets_.end());
+
+ auto& paired_tiling_set = paired_tiling_set_it->second;
+ if (tree == ACTIVE_TREE) {
+ DCHECK(paired_tiling_set.active);
+ paired_tiling_set.active = nullptr;
+ } else {
+ DCHECK(paired_tiling_set.pending);
+ paired_tiling_set.pending = nullptr;
+ }
+
+ if (!paired_tiling_set.active && !paired_tiling_set.pending)
+ paired_picture_layer_tiling_sets_.erase(paired_tiling_set_it);
+}
+
void TileManager::Release(Tile* tile) {
released_tiles_.push_back(tile);
}
@@ -360,8 +392,7 @@ void TileManager::PrepareTiles(
TileVector tiles_that_need_to_be_rasterized;
scoped_ptr<RasterTilePriorityQueue> raster_priority_queue(
- client_->BuildRasterQueue(global_state_.tree_priority,
- RasterTilePriorityQueue::Type::ALL));
+ BuildRasterQueue(RasterTilePriorityQueue::Type::ALL));
// Inform the client that will likely require a draw if the top tile is
// required for draw.
client_->SetIsLikelyToRequireADraw(
@@ -413,9 +444,7 @@ void TileManager::SynchronouslyRasterizeTiles(
CleanUpReleasedTiles();
scoped_ptr<RasterTilePriorityQueue> required_for_draw_queue(
- client_->BuildRasterQueue(
- global_state_.tree_priority,
- RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW));
+ BuildRasterQueue(RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW));
TileVector tiles_that_need_to_be_rasterized;
AssignGpuMemoryToTiles(required_for_draw_queue.get(),
std::numeric_limits<size_t>::max(),
@@ -435,9 +464,8 @@ void TileManager::SynchronouslyRasterizeTiles(
// assigned memory after reaching a steady memory state.
// TODO(hendrikw): Figure out why this would improve jank on some tests - See
// crbug.com/449288
- required_for_draw_queue = client_->BuildRasterQueue(
- global_state_.tree_priority,
- RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW);
+ required_for_draw_queue =
+ BuildRasterQueue(RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW);
// Use on-demand raster for any tiles that have not been been assigned
// memory. This ensures that we draw even when OOM.
@@ -500,10 +528,8 @@ TileManager::FreeTileResourcesUntilUsageIsWithinLimit(
const MemoryUsage& limit,
MemoryUsage* usage) {
while (usage->Exceeds(limit)) {
- if (!eviction_priority_queue) {
- eviction_priority_queue =
- client_->BuildEvictionQueue(global_state_.tree_priority);
- }
+ if (!eviction_priority_queue)
+ eviction_priority_queue = BuildEvictionQueue();
if (eviction_priority_queue->IsEmpty())
break;
@@ -522,10 +548,8 @@ TileManager::FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit(
const TilePriority& other_priority,
MemoryUsage* usage) {
while (usage->Exceeds(limit)) {
- if (!eviction_priority_queue) {
- eviction_priority_queue =
- client_->BuildEvictionQueue(global_state_.tree_priority);
- }
+ if (!eviction_priority_queue)
+ eviction_priority_queue = BuildEvictionQueue();
if (eviction_priority_queue->IsEmpty())
break;
@@ -874,7 +898,7 @@ void TileManager::SetTileTaskRunnerForTesting(
bool TileManager::AreRequiredTilesReadyToDraw(
RasterTilePriorityQueue::Type type) const {
scoped_ptr<RasterTilePriorityQueue> raster_priority_queue(
- client_->BuildRasterQueue(global_state_.tree_priority, type));
+ BuildRasterQueue(type));
// It is insufficient to check whether the raster queue we constructed is
// empty. The reason for this is that there are situations (rasterize on
// demand) when the tile both needs raster and it's ready to draw. Hence, we
@@ -898,6 +922,21 @@ bool TileManager::IsReadyToDraw() const {
RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW);
}
+scoped_ptr<RasterTilePriorityQueue> TileManager::BuildRasterQueue(
+ RasterTilePriorityQueue::Type type) const {
+ TRACE_EVENT0("cc", "TileManager::BuildRasterQueue");
+ return RasterTilePriorityQueue::Create(paired_picture_layer_tiling_sets_,
+ client_->PendingTreeExists(),
+ global_state_.tree_priority, type);
+}
+
+scoped_ptr<EvictionTilePriorityQueue> TileManager::BuildEvictionQueue() const {
+ TRACE_EVENT0("cc", "TileManager::BuildEvictionQueue");
+ return EvictionTilePriorityQueue::Create(paired_picture_layer_tiling_sets_,
+ client_->PendingTreeExists(),
+ global_state_.tree_priority);
+}
+
void TileManager::NotifyReadyToActivate() {
TRACE_EVENT0("cc", "TileManager::NotifyReadyToActivate");
if (did_notify_ready_to_activate_)
@@ -950,8 +989,7 @@ void TileManager::CheckIfMoreTilesNeedToBePrepared() {
// where top-priority tiles are initialized.
TileVector tiles_that_need_to_be_rasterized;
scoped_ptr<RasterTilePriorityQueue> raster_priority_queue(
- client_->BuildRasterQueue(global_state_.tree_priority,
- RasterTilePriorityQueue::Type::ALL));
+ BuildRasterQueue(RasterTilePriorityQueue::Type::ALL));
AssignGpuMemoryToTiles(raster_priority_queue.get(),
scheduled_raster_task_limit_,
&tiles_that_need_to_be_rasterized);
@@ -984,9 +1022,7 @@ void TileManager::CheckIfMoreTilesNeedToBePrepared() {
// could have evicted some tiles that would not be picked up by the old raster
// queue.
scoped_ptr<RasterTilePriorityQueue> required_for_activation_queue(
- client_->BuildRasterQueue(
- global_state_.tree_priority,
- RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION));
+ BuildRasterQueue(RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION));
// If we have tiles to mark as rasterize on demand, but we don't allow
// rasterize on demand, then skip activation and return early.
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/tile_manager_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698