Upstream version 7.35.139.0
[platform/framework/web/crosswalk.git] / src / cc / trees / layer_tree_host_impl.cc
index 072e8e7..13ed955 100644 (file)
@@ -1291,6 +1291,21 @@ void LayerTreeHostImpl::ReclaimResources(const CompositorFrameAck* ack) {
   // processing it.
   if (renderer_)
     renderer_->ReceiveSwapBuffersAck(*ack);
+
+  // In OOM, we now might be able to release more resources that were held
+  // because they were exported.
+  if (tile_manager_) {
+    DCHECK(tile_manager_->resource_pool());
+
+    // TODO(vmpstr): Move resource pool to be LTHI member.
+    tile_manager_->resource_pool()->CheckBusyResources();
+    tile_manager_->resource_pool()->ReduceResourceUsage();
+  }
+  // If we're not visible, we likely released resources, so we want to
+  // aggressively flush here to make sure those DeleteTextures make it to the
+  // GPU process to free up the memory.
+  if (resource_provider_ && !visible_)
+    resource_provider_->ShallowFlushIfSupported();
 }
 
 void LayerTreeHostImpl::OnCanDrawStateChangedForTree() {
@@ -2252,6 +2267,15 @@ bool LayerTreeHostImpl::ScrollBy(const gfx::Point& viewport_point,
       applied_delta = ScrollLayerWithLocalDelta(layer_impl, pending_delta);
     }
 
+    if (layer_impl == InnerViewportScrollLayer()) {
+      unused_root_delta.Subtract(applied_delta);
+      const float kOverscrollEpsilon = 0.01f;
+      if (std::abs(unused_root_delta.x()) < kOverscrollEpsilon)
+        unused_root_delta.set_x(0.0f);
+      if (std::abs(unused_root_delta.y()) < kOverscrollEpsilon)
+        unused_root_delta.set_y(0.0f);
+    }
+
     // If the layer wasn't able to move, try the next one in the hierarchy.
     float move_threshold = 0.1f;
     bool did_move_layer_x = std::abs(applied_delta.x()) > move_threshold;
@@ -2267,15 +2291,6 @@ bool LayerTreeHostImpl::ScrollBy(const gfx::Point& viewport_point,
         break;
     }
 
-    if (layer_impl == InnerViewportScrollLayer()) {
-      unused_root_delta.Subtract(applied_delta);
-      const float kOverscrollEpsilon = 0.01f;
-      if (std::abs(unused_root_delta.x()) < kOverscrollEpsilon)
-        unused_root_delta.set_x(0.0f);
-      if (std::abs(unused_root_delta.y()) < kOverscrollEpsilon)
-        unused_root_delta.set_y(0.0f);
-    }
-
     did_lock_scrolling_layer_ = true;
     if (!should_bubble_scrolls_) {
       active_tree_->SetCurrentlyScrollingLayer(layer_impl);