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 dba444dff70b19c755109494fa7471bcc80f3263..12da8878043ea8e31dc051a1fc4f5d6b20a6e664 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_android.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
@@ -147,7 +147,8 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
using_delegated_renderer_(CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableDelegatedRenderer) && |
!CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kDisableDelegatedRenderer)) { |
+ switches::kDisableDelegatedRenderer)), |
+ locks_on_frame_count_(0) { |
if (!using_delegated_renderer_) { |
texture_layer_ = cc::TextureLayer::Create(NULL); |
layer_ = texture_layer_; |
@@ -285,6 +286,9 @@ bool RenderWidgetHostViewAndroid::HasValidFrame() const { |
if (texture_size_in_layer_.IsEmpty()) |
return false; |
+ if (!frame_evictor_->HasFrame()) |
+ return false; |
+ |
if (using_delegated_renderer_) { |
if (!delegated_renderer_layer_.get()) |
return false; |
@@ -375,16 +379,31 @@ bool RenderWidgetHostViewAndroid::IsShowing() { |
return is_showing_ && content_view_core_; |
} |
-void RenderWidgetHostViewAndroid::LockResources() { |
+void RenderWidgetHostViewAndroid::LockSurfaceForCopy() { |
DCHECK(HasValidFrame()); |
DCHECK(host_); |
- DCHECK(!host_->is_hidden()); |
+ DCHECK(frame_evictor_->HasFrame()); |
frame_evictor_->LockFrame(); |
+ locks_on_frame_count_++; |
} |
-void RenderWidgetHostViewAndroid::UnlockResources() { |
+void RenderWidgetHostViewAndroid::UnlockSurfaceForCopy() { |
+ if (!frame_evictor_->HasFrame() || locks_on_frame_count_ == 0) |
+ return; |
+ |
DCHECK(HasValidFrame()); |
frame_evictor_->UnlockFrame(); |
+ locks_on_frame_count_--; |
+} |
+ |
+void RenderWidgetHostViewAndroid::ReleaseLocksOnSurface() { |
+ if (!frame_evictor_->HasFrame()) { |
+ DCHECK_EQ(locks_on_frame_count_, 0u); |
+ return; |
+ } |
+ while (locks_on_frame_count_ > 0) { |
+ UnlockSurfaceForCopy(); |
+ } |
} |
gfx::Rect RenderWidgetHostViewAndroid::GetViewBounds() const { |
@@ -808,6 +827,18 @@ void RenderWidgetHostViewAndroid::OnSwapCompositorFrame( |
DCHECK(frame->delegated_frame_data); |
DCHECK(!frame->delegated_frame_data->render_pass_list.empty()); |
+ if (locks_on_frame_count_ > 0) { |
+ DCHECK(HasValidFrame()); |
+ 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; |
piman
2014/03/05 20:14:36
So, if my understanding is correct, while there is
powei
2014/03/06 07:41:40
Yes
|
+ } |
cc::RenderPass* root_pass = |
frame->delegated_frame_data->render_pass_list.back(); |
texture_size_in_layer_ = root_pass->output_rect.size(); |
@@ -1260,6 +1291,9 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
if (content_view_core_ && !using_synchronous_compositor_) |
content_view_core_->GetWindowAndroid()->RemoveObserver(this); |
+ if (content_view_core != content_view_core_) |
+ ReleaseLocksOnSurface(); |
+ |
content_view_core_ = content_view_core; |
if (GetBrowserAccessibilityManager()) { |
@@ -1293,6 +1327,7 @@ void RenderWidgetHostViewAndroid::OnDetachCompositor() { |
} |
void RenderWidgetHostViewAndroid::OnLostResources() { |
+ ReleaseLocksOnSurface(); |
if (texture_layer_.get()) |
texture_layer_->SetIsDrawable(false); |
if (delegated_renderer_layer_.get()) |