Index: cc/resources/tile_manager.cc |
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
index a6693529fc1dda2fedf6e4e4fe38bd0f09af97bd..dff3a52f871ac6a80cd05b77e92fc25ab6b14fed 100644 |
--- a/cc/resources/tile_manager.cc |
+++ b/cc/resources/tile_manager.cc |
@@ -418,6 +418,28 @@ |
tiles_that_need_to_be_rasterized, resource_pool_, |
base::Bind(&TileManager::UpdateTileDrawInfo, base::Unretained(this))); |
+ // Use on-demand raster for any required-for-activation tiles that have not |
+ // been been assigned memory after reaching a steady memory state. This |
+ // ensures that we activate even when OOM. Note that we have to rebuilt the |
+ // queue in case the last AssignGpuMemoryToTiles evicted some tiles that would |
+ // otherwise not be picked up by the old raster queue. |
+ client_->BuildRasterQueue(&raster_priority_queue_, |
+ global_state_.tree_priority); |
+ |
+ // Use on-demand raster for any tiles that have not been been assigned |
+ // memory. This ensures that we draw even when OOM. |
+ while (!raster_priority_queue_.IsEmpty()) { |
+ Tile* tile = raster_priority_queue_.Top(); |
+ TileDrawInfo& draw_info = tile->draw_info(); |
+ |
+ if (tile->required_for_draw() && !draw_info.IsReadyToDraw()) { |
+ draw_info.set_rasterize_on_demand(); |
+ client_->NotifyTileStateChanged(tile); |
+ } |
+ raster_priority_queue_.Pop(); |
+ } |
+ raster_priority_queue_.Reset(); |
+ |
TRACE_EVENT_INSTANT1("cc", "DidRasterize", TRACE_EVENT_SCOPE_THREAD, "state", |
BasicStateAsValue()); |