Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1924)

Unified Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 14348029: Android: Throttle render compositor if browser (compositor) is behind. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_android.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698