Index: content/browser/renderer_host/render_widget_host_view_android.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc |
index 44d060a63ead8d96cda20647e83152460a04d979..36c4e2a5251f916d6aad2d449cbbee43c2bce151 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_android.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
@@ -144,6 +144,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
widget_host->GetProcess()->GetID(), |
widget_host->GetRoutingID()) != NULL), |
frame_evictor_(new DelegatedFrameEvictor(this)), |
+ frame_locked_(false), |
using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableDelegatedRenderer) && |
!CommandLine::ForCurrentProcess()->HasSwitch( |
@@ -411,11 +412,15 @@ void RenderWidgetHostViewAndroid::LockResources() { |
DCHECK(HasValidFrame()); |
DCHECK(host_); |
DCHECK(!host_->is_hidden()); |
+ DCHECK(!frame_locked_); |
frame_evictor_->LockFrame(); |
+ frame_locked_ = true; |
} |
void RenderWidgetHostViewAndroid::UnlockResources() { |
DCHECK(HasValidFrame()); |
+ DCHECK(frame_locked_); |
+ frame_locked_ = false; |
frame_evictor_->UnlockFrame(); |
} |
@@ -849,6 +854,18 @@ void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( |
DCHECK(frame->delegated_frame_data); |
DCHECK(!frame->delegated_frame_data->render_pass_list.empty()); |
+ if (frame_locked_) { |
+ base::Closure ack_callback = |
+ base::Bind(&RenderWidgetHostViewAndroid::SendDelegatedFrameAck, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ output_surface_id); |
+ |
+ if (host_->is_hidden()) |
+ ack_callback.Run(); |
+ else |
+ ack_callbacks_.push(ack_callback); |
+ return; |
+ } |
cc::RenderPass* root_pass = |
frame->delegated_frame_data->render_pass_list.back(); |
@@ -1381,6 +1398,8 @@ void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
} |
void RenderWidgetHostViewAndroid::OnLostResources() { |
+ if (frame_locked_) |
+ UnlockResources(); |
if (texture_layer_.get()) |
texture_layer_->SetIsDrawable(false); |
if (delegated_renderer_layer_.get()) |