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

Unified Diff: cc/tiles/tile_manager.cc

Issue 1430313002: cc: Make sure to issue IsReadyToDraw when we're out of memory. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month 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/tiles/tile_manager.h ('k') | cc/tiles/tile_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/tiles/tile_manager.cc
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index eccf3f0bf17a551d53a9a5ccf37cb2478da23596..898b3e353df267b3eb4f5af6e22258dba02269e3 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -897,36 +897,46 @@ void TileManager::CheckIfMoreTilesNeedToBePrepared() {
global_state_.tree_priority == SMOOTHNESS_TAKES_PRIORITY ||
global_state_.memory_limit_policy == ALLOW_NOTHING;
- // Mark any required-for-activation tiles that have not been been assigned
- // memory after reaching a steady memory state as OOM. This ensures that we
- // activate even when OOM. Note that we can't reuse the queue we used for
- // AssignGpuMemoryToTiles, since the AssignGpuMemoryToTiles call 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));
-
// If we have tiles left to raster for activation, and we don't allow
// activating without them, then skip activation and return early.
- if (!required_for_activation_queue->IsEmpty() && wait_for_all_required_tiles)
+ if (wait_for_all_required_tiles)
return;
- // Mark required tiles as OOM so that we can activate without them.
- for (; !required_for_activation_queue->IsEmpty();
- required_for_activation_queue->Pop()) {
- Tile* tile = required_for_activation_queue->Top().tile();
- tile->draw_info().set_oom();
- client_->NotifyTileStateChanged(tile);
- }
+ // Mark any required tiles that have not been been assigned memory after
+ // reaching a steady memory state as OOM. This ensures that we activate/draw
+ // even when OOM. Note that we can't reuse the queue we used for
+ // AssignGpuMemoryToTiles, since the AssignGpuMemoryToTiles call could have
+ // evicted some tiles that would not be picked up by the old raster queue.
+ bool need_to_signal_activate = MarkTilesOutOfMemory(client_->BuildRasterQueue(
+ global_state_.tree_priority,
+ RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION));
+ bool need_to_signal_draw = MarkTilesOutOfMemory(client_->BuildRasterQueue(
+ global_state_.tree_priority,
+ RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW));
DCHECK(IsReadyToActivate());
+ DCHECK(IsReadyToDraw());
+ signals_.ready_to_activate = need_to_signal_activate;
+ signals_.ready_to_draw = need_to_signal_draw;
// TODO(ericrk): Investigate why we need to schedule this (not just call it
// inline). http://crbug.com/498439
- signals_.ready_to_activate = true;
signals_check_notifier_.Schedule();
}
+bool TileManager::MarkTilesOutOfMemory(
+ scoped_ptr<RasterTilePriorityQueue> queue) const {
+ // Mark required tiles as OOM so that we can activate/draw without them.
+ if (queue->IsEmpty())
+ return false;
+
+ for (; !queue->IsEmpty(); queue->Pop()) {
+ Tile* tile = queue->Top().tile();
+ tile->draw_info().set_oom();
+ client_->NotifyTileStateChanged(tile);
+ }
+ return true;
+}
+
ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const {
return tile_task_runner_->GetResourceFormat(!tile->is_opaque());
}
« no previous file with comments | « cc/tiles/tile_manager.h ('k') | cc/tiles/tile_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698