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

Side by Side Diff: content/browser/renderer_host/render_widget_host_view_android.cc

Issue 26753005: Adding compositor callbacks to RenderWidgetHostViewAndroid (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addressed comments and rebased Created 7 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/render_widget_host_view_android.h" 5 #include "content/browser/renderer_host/render_widget_host_view_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 28 matching lines...) Expand all
39 #include "content/browser/renderer_host/render_widget_host_impl.h" 39 #include "content/browser/renderer_host/render_widget_host_impl.h"
40 #include "content/common/gpu/client/gl_helper.h" 40 #include "content/common/gpu/client/gl_helper.h"
41 #include "content/common/gpu/gpu_messages.h" 41 #include "content/common/gpu/gpu_messages.h"
42 #include "content/common/input_messages.h" 42 #include "content/common/input_messages.h"
43 #include "content/common/view_messages.h" 43 #include "content/common/view_messages.h"
44 #include "content/public/common/content_switches.h" 44 #include "content/public/common/content_switches.h"
45 #include "gpu/config/gpu_driver_bug_workaround_type.h" 45 #include "gpu/config/gpu_driver_bug_workaround_type.h"
46 #include "skia/ext/image_operations.h" 46 #include "skia/ext/image_operations.h"
47 #include "third_party/khronos/GLES2/gl2.h" 47 #include "third_party/khronos/GLES2/gl2.h"
48 #include "third_party/khronos/GLES2/gl2ext.h" 48 #include "third_party/khronos/GLES2/gl2ext.h"
49 #include "ui/base/android/window_android.h"
49 #include "ui/gfx/android/device_display_info.h" 50 #include "ui/gfx/android/device_display_info.h"
50 #include "ui/gfx/android/java_bitmap.h" 51 #include "ui/gfx/android/java_bitmap.h"
51 #include "ui/gfx/display.h" 52 #include "ui/gfx/display.h"
52 #include "ui/gfx/screen.h" 53 #include "ui/gfx/screen.h"
53 #include "ui/gfx/size_conversions.h" 54 #include "ui/gfx/size_conversions.h"
54 55
55 namespace content { 56 namespace content {
56 57
57 namespace { 58 namespace {
58 59
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 needs_begin_frame_(false), 108 needs_begin_frame_(false),
108 are_layers_attached_(true), 109 are_layers_attached_(true),
109 content_view_core_(NULL), 110 content_view_core_(NULL),
110 ime_adapter_android_(this), 111 ime_adapter_android_(this),
111 cached_background_color_(SK_ColorWHITE), 112 cached_background_color_(SK_ColorWHITE),
112 texture_id_in_layer_(0), 113 texture_id_in_layer_(0),
113 last_output_surface_id_(kUndefinedOutputSurfaceId), 114 last_output_surface_id_(kUndefinedOutputSurfaceId),
114 weak_ptr_factory_(this), 115 weak_ptr_factory_(this),
115 overscroll_effect_enabled_(true), 116 overscroll_effect_enabled_(true),
116 flush_input_requested_(false), 117 flush_input_requested_(false),
117 accelerated_surface_route_id_(0) { 118 accelerated_surface_route_id_(0),
119 using_synchronous_compositor_(SynchronousCompositorImpl::FromID(
120 widget_host->GetProcess()->GetID(),
121 widget_host->GetRoutingID()) != NULL) {
118 if (!UsingDelegatedRenderer()) { 122 if (!UsingDelegatedRenderer()) {
119 texture_layer_ = cc::TextureLayer::Create(this); 123 texture_layer_ = cc::TextureLayer::Create(NULL);
120 layer_ = texture_layer_; 124 layer_ = texture_layer_;
121 } 125 }
122 126
123 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> 127 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()->
124 HasSwitch(switches::kDisableOverscrollEdgeEffect); 128 HasSwitch(switches::kDisableOverscrollEdgeEffect);
125 // Don't block the main thread with effect resource loading. 129 // Don't block the main thread with effect resource loading.
126 // Actual effect creation is deferred until an overscroll event is received. 130 // Actual effect creation is deferred until an overscroll event is received.
127 if (overscroll_effect_enabled_) { 131 if (overscroll_effect_enabled_) {
128 base::WorkerPool::PostTask(FROM_HERE, 132 base::WorkerPool::PostTask(FROM_HERE,
129 base::Bind(&OverscrollGlow::EnsureResources), 133 base::Bind(&OverscrollGlow::EnsureResources),
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 RenderWidgetHost* 189 RenderWidgetHost*
186 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { 190 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const {
187 return host_; 191 return host_;
188 } 192 }
189 193
190 void RenderWidgetHostViewAndroid::WasShown() { 194 void RenderWidgetHostViewAndroid::WasShown() {
191 if (!host_ || !host_->is_hidden()) 195 if (!host_ || !host_->is_hidden())
192 return; 196 return;
193 197
194 host_->WasShown(); 198 host_->WasShown();
199
200 if (content_view_core_ && !using_synchronous_compositor_)
201 content_view_core_->GetWindowAndroid()->AddObserver(this);
195 } 202 }
196 203
197 void RenderWidgetHostViewAndroid::WasHidden() { 204 void RenderWidgetHostViewAndroid::WasHidden() {
198 RunAckCallbacks(); 205 RunAckCallbacks();
199 206
200 if (!host_ || host_->is_hidden()) 207 if (!host_ || host_->is_hidden())
201 return; 208 return;
202 209
203 // Inform the renderer that we are being hidden so it can reduce its resource 210 // Inform the renderer that we are being hidden so it can reduce its resource
204 // utilization. 211 // utilization.
205 host_->WasHidden(); 212 host_->WasHidden();
213
214 if (content_view_core_ && !using_synchronous_compositor_)
215 content_view_core_->GetWindowAndroid()->RemoveObserver(this);
206 } 216 }
207 217
208 void RenderWidgetHostViewAndroid::WasResized() { 218 void RenderWidgetHostViewAndroid::WasResized() {
209 host_->WasResized(); 219 host_->WasResized();
210 } 220 }
211 221
212 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { 222 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) {
213 // Ignore the given size as only the Java code has the power to 223 // Ignore the given size as only the Java code has the power to
214 // resize the view on Android. 224 // resize the view on Android.
215 default_size_ = size; 225 default_size_ = size;
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 NOTIMPLEMENTED(); 509 NOTIMPLEMENTED();
500 } 510 }
501 511
502 void RenderWidgetHostViewAndroid::RenderProcessGone( 512 void RenderWidgetHostViewAndroid::RenderProcessGone(
503 base::TerminationStatus status, int error_code) { 513 base::TerminationStatus status, int error_code) {
504 Destroy(); 514 Destroy();
505 } 515 }
506 516
507 void RenderWidgetHostViewAndroid::Destroy() { 517 void RenderWidgetHostViewAndroid::Destroy() {
508 RemoveLayers(); 518 RemoveLayers();
509 content_view_core_ = NULL; 519 SetContentViewCore(NULL);
510 520
511 // The RenderWidgetHost's destruction led here, so don't call it. 521 // The RenderWidgetHost's destruction led here, so don't call it.
512 host_ = NULL; 522 host_ = NULL;
513 523
514 delete this; 524 delete this;
515 } 525 }
516 526
517 void RenderWidgetHostViewAndroid::SetTooltipText( 527 void RenderWidgetHostViewAndroid::SetTooltipText(
518 const string16& tooltip_text) { 528 const string16& tooltip_text) {
519 // Tooltips don't makes sense on Android. 529 // Tooltips don't makes sense on Android.
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
701 resource_collection_ = new cc::DelegatedFrameResourceCollection; 711 resource_collection_ = new cc::DelegatedFrameResourceCollection;
702 resource_collection_->SetClient(this); 712 resource_collection_->SetClient(this);
703 } 713 }
704 if (!frame_provider_ || 714 if (!frame_provider_ ||
705 texture_size_in_layer_ != frame_provider_->frame_size()) { 715 texture_size_in_layer_ != frame_provider_->frame_size()) {
706 if (are_layers_attached_) 716 if (are_layers_attached_)
707 RemoveLayers(); 717 RemoveLayers();
708 frame_provider_ = new cc::DelegatedFrameProvider( 718 frame_provider_ = new cc::DelegatedFrameProvider(
709 resource_collection_.get(), frame_data.Pass()); 719 resource_collection_.get(), frame_data.Pass());
710 delegated_renderer_layer_ = 720 delegated_renderer_layer_ =
711 cc::DelegatedRendererLayer::Create(this, frame_provider_); 721 cc::DelegatedRendererLayer::Create(NULL, frame_provider_);
712 layer_ = delegated_renderer_layer_; 722 layer_ = delegated_renderer_layer_;
713 if (are_layers_attached_) 723 if (are_layers_attached_)
714 AttachLayers(); 724 AttachLayers();
715 } else { 725 } else {
716 frame_provider_->SetFrameData(frame_data.Pass()); 726 frame_provider_->SetFrameData(frame_data.Pass());
717 } 727 }
718 } 728 }
719 729
720 if (delegated_renderer_layer_.get()) { 730 if (delegated_renderer_layer_.get()) {
721 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); 731 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_);
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 849
840 void RenderWidgetHostViewAndroid::BuffersSwapped( 850 void RenderWidgetHostViewAndroid::BuffersSwapped(
841 const gpu::Mailbox& mailbox, 851 const gpu::Mailbox& mailbox,
842 uint32_t output_surface_id, 852 uint32_t output_surface_id,
843 const base::Closure& ack_callback) { 853 const base::Closure& ack_callback) {
844 ImageTransportFactoryAndroid* factory = 854 ImageTransportFactoryAndroid* factory =
845 ImageTransportFactoryAndroid::GetInstance(); 855 ImageTransportFactoryAndroid::GetInstance();
846 856
847 if (!texture_id_in_layer_) { 857 if (!texture_id_in_layer_) {
848 texture_id_in_layer_ = factory->CreateTexture(); 858 texture_id_in_layer_ = factory->CreateTexture();
859 texture_layer_->SetTextureId(texture_id_in_layer_);
849 texture_layer_->SetIsDrawable(true); 860 texture_layer_->SetIsDrawable(true);
850 texture_layer_->SetContentsOpaque(true); 861 texture_layer_->SetContentsOpaque(true);
851 } 862 }
852 863
853 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( 864 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture(
854 texture_id_in_layer_, mailbox.name); 865 texture_id_in_layer_, mailbox.name);
855 866
856 ResetClipping(); 867 ResetClipping();
857 868
858 current_mailbox_ = mailbox; 869 current_mailbox_ = mailbox;
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 ScheduleAnimationIfNecessary(); 1248 ScheduleAnimationIfNecessary();
1238 } 1249 }
1239 1250
1240 void RenderWidgetHostViewAndroid::SetContentViewCore( 1251 void RenderWidgetHostViewAndroid::SetContentViewCore(
1241 ContentViewCoreImpl* content_view_core) { 1252 ContentViewCoreImpl* content_view_core) {
1242 RunAckCallbacks(); 1253 RunAckCallbacks();
1243 1254
1244 if (are_layers_attached_) 1255 if (are_layers_attached_)
1245 RemoveLayers(); 1256 RemoveLayers();
1246 1257
1258 if (content_view_core != content_view_core_ && content_view_core_ &&
boliu 2013/11/18 19:39:25 This still doesn't seem to make sense. If content_
powei 2013/11/18 19:44:02 I'm not sure about the other calls so I'm hesitant
powei 2013/11/18 19:47:14 Maybe you'd be ok with just: if (content_view_cor
powei 2013/11/18 21:40:05 Done.
1259 !using_synchronous_compositor_)
1260 content_view_core_->GetWindowAndroid()->RemoveObserver(this);
1261
1247 content_view_core_ = content_view_core; 1262 content_view_core_ = content_view_core;
1248 1263
1249 if (GetBrowserAccessibilityManager()) { 1264 if (GetBrowserAccessibilityManager()) {
1250 base::android::ScopedJavaLocalRef<jobject> obj; 1265 base::android::ScopedJavaLocalRef<jobject> obj;
1251 if (content_view_core_) 1266 if (content_view_core_)
1252 obj = content_view_core_->GetJavaObject(); 1267 obj = content_view_core_->GetJavaObject();
1253 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> 1268 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()->
1254 SetContentViewCore(obj); 1269 SetContentViewCore(obj);
1255 } 1270 }
1256 1271
1257 if (are_layers_attached_) 1272 if (are_layers_attached_) {
1258 AttachLayers(); 1273 AttachLayers();
1274 if (content_view_core_ && !using_synchronous_compositor_)
1275 content_view_core_->GetWindowAndroid()->AddObserver(this);
1276 }
1259 } 1277 }
1260 1278
1261 void RenderWidgetHostViewAndroid::RunAckCallbacks() { 1279 void RenderWidgetHostViewAndroid::RunAckCallbacks() {
1262 while (!ack_callbacks_.empty()) { 1280 while (!ack_callbacks_.empty()) {
1263 ack_callbacks_.front().Run(); 1281 ack_callbacks_.front().Run();
1264 ack_callbacks_.pop(); 1282 ack_callbacks_.pop();
1265 } 1283 }
1266 } 1284 }
1267 1285
1268 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( 1286 void RenderWidgetHostViewAndroid::HasTouchEventHandlers(
1269 bool need_touch_events) { 1287 bool need_touch_events) {
1270 if (content_view_core_) 1288 if (content_view_core_)
1271 content_view_core_->HasTouchEventHandlers(need_touch_events); 1289 content_view_core_->HasTouchEventHandlers(need_touch_events);
1272 } 1290 }
1273 1291
1274 unsigned RenderWidgetHostViewAndroid::PrepareTexture() { 1292 void RenderWidgetHostViewAndroid::OnCompositingDidCommit() {
1275 RunAckCallbacks();
1276 return texture_id_in_layer_;
1277 }
1278
1279 void RenderWidgetHostViewAndroid::DidCommitFrameData() {
1280 RunAckCallbacks(); 1293 RunAckCallbacks();
1281 } 1294 }
1282 1295
1283 bool RenderWidgetHostViewAndroid::PrepareTextureMailbox( 1296 void RenderWidgetHostViewAndroid::OnDetachCompositor() {
1284 cc::TextureMailbox* mailbox, 1297 DCHECK(content_view_core_);
1285 scoped_ptr<cc::SingleReleaseCallback>* release_callback, 1298 DCHECK(!using_synchronous_compositor_);
1286 bool use_shared_memory) { 1299 RunAckCallbacks();
1287 return false;
1288 } 1300 }
1289 1301
1290 void RenderWidgetHostViewAndroid::OnLostResources() { 1302 void RenderWidgetHostViewAndroid::OnLostResources() {
1291 if (texture_layer_.get()) 1303 if (texture_layer_.get())
1292 texture_layer_->SetIsDrawable(false); 1304 texture_layer_->SetIsDrawable(false);
1293 if (delegated_renderer_layer_.get()) 1305 if (delegated_renderer_layer_.get())
1294 DestroyDelegatedContent(); 1306 DestroyDelegatedContent();
1295 texture_id_in_layer_ = 0; 1307 texture_id_in_layer_ = 0;
1296 RunAckCallbacks(); 1308 RunAckCallbacks();
1297 } 1309 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1391 // RenderWidgetHostView, public: 1403 // RenderWidgetHostView, public:
1392 1404
1393 // static 1405 // static
1394 RenderWidgetHostView* 1406 RenderWidgetHostView*
1395 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 1407 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
1396 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 1408 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
1397 return new RenderWidgetHostViewAndroid(rwhi, NULL); 1409 return new RenderWidgetHostViewAndroid(rwhi, NULL);
1398 } 1410 }
1399 1411
1400 } // namespace content 1412 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698