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 e247e3b7b9dcda1813adbbe7c0c1a4f9d9cc33a5..c6a247d081f9c8c30e4e67dfe7bb134ca9288142 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_android.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc |
@@ -77,17 +77,18 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
content_view_core_(NULL), |
ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
cached_background_color_(SK_ColorWHITE), |
- texture_id_in_layer_(0) { |
+ texture_id_in_layer_(0), |
+ consumed_current_texture_(true) { |
if (CompositorImpl::UsesDirectGL()) { |
surface_texture_transport_.reset(new SurfaceTextureTransportClient()); |
layer_ = surface_texture_transport_->Initialize(); |
+ layer_->SetIsDrawable(true); |
} else { |
- texture_layer_ = cc::TextureLayer::Create(NULL); |
+ texture_layer_ = cc::TextureLayer::Create(this); |
layer_ = texture_layer_; |
} |
layer_->SetContentsOpaque(true); |
- layer_->SetIsDrawable(true); |
host_->SetView(this); |
SetContentViewCore(content_view_core); |
@@ -95,6 +96,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( |
RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
SetContentViewCore(NULL); |
+ DCHECK(ack_callbacks_.empty()); |
if (texture_id_in_layer_ || !last_mailbox_.IsZero()) { |
ImageTransportFactoryAndroid* factory = |
ImageTransportFactoryAndroid::GetInstance(); |
@@ -108,6 +110,9 @@ RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { |
} |
factory->DeleteTexture(texture_id_in_layer_); |
} |
+ |
+ if (texture_layer_) |
+ texture_layer_->ClearClient(); |
} |
@@ -152,6 +157,8 @@ void RenderWidgetHostViewAndroid::WasShown() { |
} |
void RenderWidgetHostViewAndroid::WasHidden() { |
+ RunAckCallbacks(); |
+ |
if (host_->is_hidden()) |
return; |
@@ -595,7 +602,7 @@ void RenderWidgetHostViewAndroid::BuffersSwapped( |
texture_id_in_layer_, current_mailbox_.name); |
} else { |
texture_id_in_layer_ = factory->CreateTexture(); |
- texture_layer_->SetTextureId(texture_id_in_layer_); |
+ texture_layer_->SetIsDrawable(true); |
} |
ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( |
@@ -615,7 +622,13 @@ void RenderWidgetHostViewAndroid::BuffersSwapped( |
texture_layer_->SetUV(gfx::PointF(0, 0), uv_max); |
texture_size_in_layer_ = texture_size; |
current_mailbox_ = mailbox; |
- ack_callback.Run(); |
+ |
+ if (consumed_current_texture_ || host_->is_hidden()) |
+ ack_callback.Run(); |
+ else |
+ ack_callbacks_.push(ack_callback); |
+ |
+ consumed_current_texture_ = false; |
} |
void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer( |
@@ -632,6 +645,7 @@ void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease() { |
// This tells us we should free the frontbuffer. |
if (texture_id_in_layer_) { |
texture_layer_->SetTextureId(0); |
+ texture_layer_->SetIsDrawable(false); |
ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( |
texture_id_in_layer_); |
texture_id_in_layer_ = 0; |
@@ -757,6 +771,8 @@ SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { |
void RenderWidgetHostViewAndroid::SetContentViewCore( |
ContentViewCoreImpl* content_view_core) { |
+ RunAckCallbacks(); |
+ |
if (content_view_core_ && is_layer_attached_) |
content_view_core_->RemoveLayer(layer_); |
@@ -765,12 +781,35 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( |
content_view_core_->AttachLayer(layer_); |
} |
+void RenderWidgetHostViewAndroid::RunAckCallbacks() { |
+ while (!ack_callbacks_.empty()) { |
+ ack_callbacks_.front().Run(); |
+ ack_callbacks_.pop(); |
+ } |
+} |
+ |
void RenderWidgetHostViewAndroid::HasTouchEventHandlers( |
bool need_touch_events) { |
if (content_view_core_) |
content_view_core_->HasTouchEventHandlers(need_touch_events); |
} |
+unsigned RenderWidgetHostViewAndroid::PrepareTexture( |
+ cc::ResourceUpdateQueue* queue) { |
+ RunAckCallbacks(); |
+ consumed_current_texture_ = true; |
+ return texture_id_in_layer_; |
+} |
+ |
+WebKit::WebGraphicsContext3D* RenderWidgetHostViewAndroid::Context3d() { |
+ return ImageTransportFactoryAndroid::GetInstance()->GetContext3D(); |
+} |
+ |
+bool RenderWidgetHostViewAndroid::PrepareTextureMailbox( |
+ cc::TextureMailbox* mailbox) { |
+ return false; |
+} |
+ |
// static |
void RenderWidgetHostViewPort::GetDefaultScreenInfo( |
WebKit::WebScreenInfo* results) { |