Chromium Code Reviews| 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..4227a6894d5264a792ca9cf987fa8b80ddd49000 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(); |
|
piman
2013/04/19 18:09:12
Note: this can add a frame of latency when GPU-bou
brianderson
2013/04/19 18:49:19
I'm not sure if this is still true, but I tried to
|
| + 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,30 @@ 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( |
|
no sievers
2013/04/19 17:57:17
Well, it's update resources, not really post commi
|
| + cc::ResourceUpdateQueue* queue) { |
| + RunAckCallbacks(); |
| + consumed_current_texture_ = true; |
| + return texture_id_in_layer_; |
| +} |
| + |
| +WebKit::WebGraphicsContext3D* RenderWidgetHostViewAndroid::Context3d() { |
| + return ImageTransportFactoryAndroid::GetInstance()->GetContext3D(); |
| +} |
| + |
| // static |
| void RenderWidgetHostViewPort::GetDefaultScreenInfo( |
| WebKit::WebScreenInfo* results) { |