Commit 70ef2370 authored by sievers@chromium.org's avatar sievers@chromium.org

Android: Throttle render compositor if browser (compositor) is behind.

This delays the Swap ACK to the renderer if the browser has not consumed
the current frontbuffer yet.

Note: This might break embedders that don't use the browser compositor. The texture needs to be taken from RenderWidgetHostVIew through the TextureLayerClient::PrepareTexture() method.

BUG=224602,220907

Review URL: https://codereview.chromium.org/14348029

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@195340 0039d316-1c4b-4281-b951-d872f2087c98
parent 6ac955b4
......@@ -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();
}
......@@ -154,6 +159,8 @@ void RenderWidgetHostViewAndroid::WasShown() {
}
void RenderWidgetHostViewAndroid::WasHidden() {
RunAckCallbacks();
if (host_->is_hidden())
return;
......@@ -605,7 +612,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(
......@@ -625,7 +632,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(
......@@ -642,6 +655,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;
......@@ -767,6 +781,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_);
......@@ -775,12 +791,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) {
......
......@@ -6,12 +6,14 @@
#define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_ANDROID_H_
#include <map>
#include <queue>
#include "base/callback.h"
#include "base/compiler_specific.h"
#include "base/i18n/rtl.h"
#include "base/memory/scoped_ptr.h"
#include "base/process.h"
#include "cc/layers/texture_layer_client.h"
#include "content/browser/renderer_host/ime_adapter_android.h"
#include "content/browser/renderer_host/render_widget_host_view_base.h"
#include "gpu/command_buffer/common/mailbox.h"
......@@ -46,7 +48,8 @@ struct NativeWebKeyboardEvent;
// -----------------------------------------------------------------------------
// See comments in render_widget_host_view.h about this class and its members.
// -----------------------------------------------------------------------------
class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase {
class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase,
public cc::TextureLayerClient {
public:
RenderWidgetHostViewAndroid(RenderWidgetHostImpl* widget,
ContentViewCoreImpl* content_view_core);
......@@ -147,6 +150,11 @@ class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase {
virtual void ShowDisambiguationPopup(const gfx::Rect& target_rect,
const SkBitmap& zoomed_bitmap) OVERRIDE;
// cc::TextureLayerClient implementation.
virtual unsigned PrepareTexture(cc::ResourceUpdateQueue* queue) OVERRIDE;
virtual WebKit::WebGraphicsContext3D* Context3d() OVERRIDE;
virtual bool PrepareTextureMailbox(cc::TextureMailbox* mailbox) OVERRIDE;
// Non-virtual methods
void SetContentViewCore(ContentViewCoreImpl* content_view_core);
SkColor GetCachedBackgroundColor() const;
......@@ -182,6 +190,8 @@ class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase {
const gfx::SizeF content_size,
const base::Closure& ack_callback);
void RunAckCallbacks();
// The model object.
RenderWidgetHostImpl* host_;
......@@ -222,6 +232,10 @@ class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase {
// The mailbox of the frame we last returned.
gpu::Mailbox last_mailbox_;
bool consumed_current_texture_;
std::queue<base::Closure> ack_callbacks_;
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAndroid);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment