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( ...@@ -77,17 +77,18 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
content_view_core_(NULL), content_view_core_(NULL),
ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), ime_adapter_android_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
cached_background_color_(SK_ColorWHITE), cached_background_color_(SK_ColorWHITE),
texture_id_in_layer_(0) { texture_id_in_layer_(0),
consumed_current_texture_(true) {
if (CompositorImpl::UsesDirectGL()) { if (CompositorImpl::UsesDirectGL()) {
surface_texture_transport_.reset(new SurfaceTextureTransportClient()); surface_texture_transport_.reset(new SurfaceTextureTransportClient());
layer_ = surface_texture_transport_->Initialize(); layer_ = surface_texture_transport_->Initialize();
layer_->SetIsDrawable(true);
} else { } else {
texture_layer_ = cc::TextureLayer::Create(NULL); texture_layer_ = cc::TextureLayer::Create(this);
layer_ = texture_layer_; layer_ = texture_layer_;
} }
layer_->SetContentsOpaque(true); layer_->SetContentsOpaque(true);
layer_->SetIsDrawable(true);
host_->SetView(this); host_->SetView(this);
SetContentViewCore(content_view_core); SetContentViewCore(content_view_core);
...@@ -95,6 +96,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid( ...@@ -95,6 +96,7 @@ RenderWidgetHostViewAndroid::RenderWidgetHostViewAndroid(
RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() {
SetContentViewCore(NULL); SetContentViewCore(NULL);
DCHECK(ack_callbacks_.empty());
if (texture_id_in_layer_ || !last_mailbox_.IsZero()) { if (texture_id_in_layer_ || !last_mailbox_.IsZero()) {
ImageTransportFactoryAndroid* factory = ImageTransportFactoryAndroid* factory =
ImageTransportFactoryAndroid::GetInstance(); ImageTransportFactoryAndroid::GetInstance();
...@@ -108,6 +110,9 @@ RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { ...@@ -108,6 +110,9 @@ RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() {
} }
factory->DeleteTexture(texture_id_in_layer_); factory->DeleteTexture(texture_id_in_layer_);
} }
if (texture_layer_)
texture_layer_->ClearClient();
} }
...@@ -154,6 +159,8 @@ void RenderWidgetHostViewAndroid::WasShown() { ...@@ -154,6 +159,8 @@ void RenderWidgetHostViewAndroid::WasShown() {
} }
void RenderWidgetHostViewAndroid::WasHidden() { void RenderWidgetHostViewAndroid::WasHidden() {
RunAckCallbacks();
if (host_->is_hidden()) if (host_->is_hidden())
return; return;
...@@ -605,7 +612,7 @@ void RenderWidgetHostViewAndroid::BuffersSwapped( ...@@ -605,7 +612,7 @@ void RenderWidgetHostViewAndroid::BuffersSwapped(
texture_id_in_layer_, current_mailbox_.name); texture_id_in_layer_, current_mailbox_.name);
} else { } else {
texture_id_in_layer_ = factory->CreateTexture(); texture_id_in_layer_ = factory->CreateTexture();
texture_layer_->SetTextureId(texture_id_in_layer_); texture_layer_->SetIsDrawable(true);
} }
ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( ImageTransportFactoryAndroid::GetInstance()->AcquireTexture(
...@@ -625,7 +632,13 @@ void RenderWidgetHostViewAndroid::BuffersSwapped( ...@@ -625,7 +632,13 @@ void RenderWidgetHostViewAndroid::BuffersSwapped(
texture_layer_->SetUV(gfx::PointF(0, 0), uv_max); texture_layer_->SetUV(gfx::PointF(0, 0), uv_max);
texture_size_in_layer_ = texture_size; texture_size_in_layer_ = texture_size;
current_mailbox_ = mailbox; 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( void RenderWidgetHostViewAndroid::AcceleratedSurfacePostSubBuffer(
...@@ -642,6 +655,7 @@ void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease() { ...@@ -642,6 +655,7 @@ void RenderWidgetHostViewAndroid::AcceleratedSurfaceRelease() {
// This tells us we should free the frontbuffer. // This tells us we should free the frontbuffer.
if (texture_id_in_layer_) { if (texture_id_in_layer_) {
texture_layer_->SetTextureId(0); texture_layer_->SetTextureId(0);
texture_layer_->SetIsDrawable(false);
ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( ImageTransportFactoryAndroid::GetInstance()->DeleteTexture(
texture_id_in_layer_); texture_id_in_layer_);
texture_id_in_layer_ = 0; texture_id_in_layer_ = 0;
...@@ -767,6 +781,8 @@ SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const { ...@@ -767,6 +781,8 @@ SkColor RenderWidgetHostViewAndroid::GetCachedBackgroundColor() const {
void RenderWidgetHostViewAndroid::SetContentViewCore( void RenderWidgetHostViewAndroid::SetContentViewCore(
ContentViewCoreImpl* content_view_core) { ContentViewCoreImpl* content_view_core) {
RunAckCallbacks();
if (content_view_core_ && is_layer_attached_) if (content_view_core_ && is_layer_attached_)
content_view_core_->RemoveLayer(layer_); content_view_core_->RemoveLayer(layer_);
...@@ -775,12 +791,35 @@ void RenderWidgetHostViewAndroid::SetContentViewCore( ...@@ -775,12 +791,35 @@ void RenderWidgetHostViewAndroid::SetContentViewCore(
content_view_core_->AttachLayer(layer_); content_view_core_->AttachLayer(layer_);
} }
void RenderWidgetHostViewAndroid::RunAckCallbacks() {
while (!ack_callbacks_.empty()) {
ack_callbacks_.front().Run();
ack_callbacks_.pop();
}
}
void RenderWidgetHostViewAndroid::HasTouchEventHandlers( void RenderWidgetHostViewAndroid::HasTouchEventHandlers(
bool need_touch_events) { bool need_touch_events) {
if (content_view_core_) if (content_view_core_)
content_view_core_->HasTouchEventHandlers(need_touch_events); 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 // static
void RenderWidgetHostViewPort::GetDefaultScreenInfo( void RenderWidgetHostViewPort::GetDefaultScreenInfo(
WebKit::WebScreenInfo* results) { WebKit::WebScreenInfo* results) {
......
...@@ -6,12 +6,14 @@ ...@@ -6,12 +6,14 @@
#define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_ANDROID_H_ #define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_ANDROID_H_
#include <map> #include <map>
#include <queue>
#include "base/callback.h" #include "base/callback.h"
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/i18n/rtl.h" #include "base/i18n/rtl.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/process.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/ime_adapter_android.h"
#include "content/browser/renderer_host/render_widget_host_view_base.h" #include "content/browser/renderer_host/render_widget_host_view_base.h"
#include "gpu/command_buffer/common/mailbox.h" #include "gpu/command_buffer/common/mailbox.h"
...@@ -46,7 +48,8 @@ struct NativeWebKeyboardEvent; ...@@ -46,7 +48,8 @@ struct NativeWebKeyboardEvent;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// See comments in render_widget_host_view.h about this class and its members. // 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: public:
RenderWidgetHostViewAndroid(RenderWidgetHostImpl* widget, RenderWidgetHostViewAndroid(RenderWidgetHostImpl* widget,
ContentViewCoreImpl* content_view_core); ContentViewCoreImpl* content_view_core);
...@@ -147,6 +150,11 @@ class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase { ...@@ -147,6 +150,11 @@ class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase {
virtual void ShowDisambiguationPopup(const gfx::Rect& target_rect, virtual void ShowDisambiguationPopup(const gfx::Rect& target_rect,
const SkBitmap& zoomed_bitmap) OVERRIDE; 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 // Non-virtual methods
void SetContentViewCore(ContentViewCoreImpl* content_view_core); void SetContentViewCore(ContentViewCoreImpl* content_view_core);
SkColor GetCachedBackgroundColor() const; SkColor GetCachedBackgroundColor() const;
...@@ -182,6 +190,8 @@ class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase { ...@@ -182,6 +190,8 @@ class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase {
const gfx::SizeF content_size, const gfx::SizeF content_size,
const base::Closure& ack_callback); const base::Closure& ack_callback);
void RunAckCallbacks();
// The model object. // The model object.
RenderWidgetHostImpl* host_; RenderWidgetHostImpl* host_;
...@@ -222,6 +232,10 @@ class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase { ...@@ -222,6 +232,10 @@ class RenderWidgetHostViewAndroid : public RenderWidgetHostViewBase {
// The mailbox of the frame we last returned. // The mailbox of the frame we last returned.
gpu::Mailbox last_mailbox_; gpu::Mailbox last_mailbox_;
bool consumed_current_texture_;
std::queue<base::Closure> ack_callbacks_;
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAndroid); 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