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

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: host observers through WindowAndroid 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"
50 #include "ui/base/android/window_android_observer.h"
49 #include "ui/gfx/android/device_display_info.h" 51 #include "ui/gfx/android/device_display_info.h"
50 #include "ui/gfx/android/java_bitmap.h" 52 #include "ui/gfx/android/java_bitmap.h"
51 #include "ui/gfx/display.h" 53 #include "ui/gfx/display.h"
52 #include "ui/gfx/screen.h" 54 #include "ui/gfx/screen.h"
53 #include "ui/gfx/size_conversions.h" 55 #include "ui/gfx/size_conversions.h"
54 56
55 namespace content { 57 namespace content {
56 58
57 namespace { 59 namespace {
58 60
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 content_view_core_(NULL), 111 content_view_core_(NULL),
110 ime_adapter_android_(this), 112 ime_adapter_android_(this),
111 cached_background_color_(SK_ColorWHITE), 113 cached_background_color_(SK_ColorWHITE),
112 texture_id_in_layer_(0), 114 texture_id_in_layer_(0),
113 last_output_surface_id_(kUndefinedOutputSurfaceId), 115 last_output_surface_id_(kUndefinedOutputSurfaceId),
114 weak_ptr_factory_(this), 116 weak_ptr_factory_(this),
115 overscroll_effect_enabled_(true), 117 overscroll_effect_enabled_(true),
116 flush_input_requested_(false), 118 flush_input_requested_(false),
117 accelerated_surface_route_id_(0) { 119 accelerated_surface_route_id_(0) {
118 if (!UsingDelegatedRenderer()) { 120 if (!UsingDelegatedRenderer()) {
119 texture_layer_ = cc::TextureLayer::Create(this); 121 texture_layer_ = cc::TextureLayer::Create(NULL);
120 layer_ = texture_layer_; 122 layer_ = texture_layer_;
121 } 123 }
122 124
123 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()-> 125 overscroll_effect_enabled_ = !CommandLine::ForCurrentProcess()->
124 HasSwitch(switches::kDisableOverscrollEdgeEffect); 126 HasSwitch(switches::kDisableOverscrollEdgeEffect);
125 // Don't block the main thread with effect resource loading. 127 // Don't block the main thread with effect resource loading.
126 // Actual effect creation is deferred until an overscroll event is received. 128 // Actual effect creation is deferred until an overscroll event is received.
127 if (overscroll_effect_enabled_) { 129 if (overscroll_effect_enabled_) {
128 base::WorkerPool::PostTask(FROM_HERE, 130 base::WorkerPool::PostTask(FROM_HERE,
129 base::Bind(&OverscrollGlow::EnsureResources), 131 base::Bind(&OverscrollGlow::EnsureResources),
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 RenderWidgetHost* 187 RenderWidgetHost*
186 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { 188 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const {
187 return host_; 189 return host_;
188 } 190 }
189 191
190 void RenderWidgetHostViewAndroid::WasShown() { 192 void RenderWidgetHostViewAndroid::WasShown() {
191 if (!host_ || !host_->is_hidden()) 193 if (!host_ || !host_->is_hidden())
192 return; 194 return;
193 195
194 host_->WasShown(); 196 host_->WasShown();
197
198 if (content_view_core_ && !UsingSynchronousCompositor())
199 content_view_core_->GetWindowAndroid()->AddObserver(this);
195 } 200 }
196 201
197 void RenderWidgetHostViewAndroid::WasHidden() { 202 void RenderWidgetHostViewAndroid::WasHidden() {
198 RunAckCallbacks(); 203 RunAckCallbacks();
199 204
200 if (!host_ || host_->is_hidden()) 205 if (!host_ || host_->is_hidden())
201 return; 206 return;
202 207
203 // Inform the renderer that we are being hidden so it can reduce its resource 208 // Inform the renderer that we are being hidden so it can reduce its resource
204 // utilization. 209 // utilization.
205 host_->WasHidden(); 210 host_->WasHidden();
211
212 if (content_view_core_ && !UsingSynchronousCompositor())
213 content_view_core_->GetWindowAndroid()->RemoveObserver(this);
206 } 214 }
207 215
208 void RenderWidgetHostViewAndroid::WasResized() { 216 void RenderWidgetHostViewAndroid::WasResized() {
209 host_->WasResized(); 217 host_->WasResized();
210 } 218 }
211 219
212 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { 220 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) {
213 // Ignore the given size as only the Java code has the power to 221 // Ignore the given size as only the Java code has the power to
214 // resize the view on Android. 222 // resize the view on Android.
215 default_size_ = size; 223 default_size_ = size;
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 NOTIMPLEMENTED(); 507 NOTIMPLEMENTED();
500 } 508 }
501 509
502 void RenderWidgetHostViewAndroid::RenderProcessGone( 510 void RenderWidgetHostViewAndroid::RenderProcessGone(
503 base::TerminationStatus status, int error_code) { 511 base::TerminationStatus status, int error_code) {
504 Destroy(); 512 Destroy();
505 } 513 }
506 514
507 void RenderWidgetHostViewAndroid::Destroy() { 515 void RenderWidgetHostViewAndroid::Destroy() {
508 RemoveLayers(); 516 RemoveLayers();
509 content_view_core_ = NULL; 517 // This must happen before setting host_ NULL.
518 SetContentViewCore(NULL);
510 519
511 // The RenderWidgetHost's destruction led here, so don't call it. 520 // The RenderWidgetHost's destruction led here, so don't call it.
512 host_ = NULL; 521 host_ = NULL;
513 522
514 delete this; 523 delete this;
515 } 524 }
516 525
517 void RenderWidgetHostViewAndroid::SetTooltipText( 526 void RenderWidgetHostViewAndroid::SetTooltipText(
518 const string16& tooltip_text) { 527 const string16& tooltip_text) {
519 // Tooltips don't makes sense on Android. 528 // 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; 710 resource_collection_ = new cc::DelegatedFrameResourceCollection;
702 resource_collection_->SetClient(this); 711 resource_collection_->SetClient(this);
703 } 712 }
704 if (!frame_provider_ || 713 if (!frame_provider_ ||
705 texture_size_in_layer_ != frame_provider_->frame_size()) { 714 texture_size_in_layer_ != frame_provider_->frame_size()) {
706 if (are_layers_attached_) 715 if (are_layers_attached_)
707 RemoveLayers(); 716 RemoveLayers();
708 frame_provider_ = new cc::DelegatedFrameProvider( 717 frame_provider_ = new cc::DelegatedFrameProvider(
709 resource_collection_.get(), frame_data.Pass()); 718 resource_collection_.get(), frame_data.Pass());
710 delegated_renderer_layer_ = 719 delegated_renderer_layer_ =
711 cc::DelegatedRendererLayer::Create(this, frame_provider_); 720 cc::DelegatedRendererLayer::Create(NULL, frame_provider_);
712 layer_ = delegated_renderer_layer_; 721 layer_ = delegated_renderer_layer_;
713 if (are_layers_attached_) 722 if (are_layers_attached_)
714 AttachLayers(); 723 AttachLayers();
715 } else { 724 } else {
716 frame_provider_->SetFrameData(frame_data.Pass()); 725 frame_provider_->SetFrameData(frame_data.Pass());
717 } 726 }
718 } 727 }
719 728
720 if (delegated_renderer_layer_.get()) { 729 if (delegated_renderer_layer_.get()) {
721 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); 730 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_);
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 848
840 void RenderWidgetHostViewAndroid::BuffersSwapped( 849 void RenderWidgetHostViewAndroid::BuffersSwapped(
841 const gpu::Mailbox& mailbox, 850 const gpu::Mailbox& mailbox,
842 uint32_t output_surface_id, 851 uint32_t output_surface_id,
843 const base::Closure& ack_callback) { 852 const base::Closure& ack_callback) {
844 ImageTransportFactoryAndroid* factory = 853 ImageTransportFactoryAndroid* factory =
845 ImageTransportFactoryAndroid::GetInstance(); 854 ImageTransportFactoryAndroid::GetInstance();
846 855
847 if (!texture_id_in_layer_) { 856 if (!texture_id_in_layer_) {
848 texture_id_in_layer_ = factory->CreateTexture(); 857 texture_id_in_layer_ = factory->CreateTexture();
858 texture_layer_->SetTextureId(texture_id_in_layer_);
849 texture_layer_->SetIsDrawable(true); 859 texture_layer_->SetIsDrawable(true);
850 texture_layer_->SetContentsOpaque(true); 860 texture_layer_->SetContentsOpaque(true);
851 } 861 }
852 862
853 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( 863 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture(
854 texture_id_in_layer_, mailbox.name); 864 texture_id_in_layer_, mailbox.name);
855 865
856 ResetClipping(); 866 ResetClipping();
857 867
858 current_mailbox_ = mailbox; 868 current_mailbox_ = mailbox;
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 ScheduleAnimationIfNecessary(); 1247 ScheduleAnimationIfNecessary();
1238 } 1248 }
1239 1249
1240 void RenderWidgetHostViewAndroid::SetContentViewCore( 1250 void RenderWidgetHostViewAndroid::SetContentViewCore(
1241 ContentViewCoreImpl* content_view_core) { 1251 ContentViewCoreImpl* content_view_core) {
1242 RunAckCallbacks(); 1252 RunAckCallbacks();
1243 1253
1244 if (are_layers_attached_) 1254 if (are_layers_attached_)
1245 RemoveLayers(); 1255 RemoveLayers();
1246 1256
1257 if (content_view_core == NULL) {
1258 if (content_view_core_ && !UsingSynchronousCompositor())
1259 content_view_core_->GetWindowAndroid()->RemoveObserver(this);
1260 }
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_ && !UsingSynchronousCompositor())
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 bool RenderWidgetHostViewAndroid::UsingSynchronousCompositor() const {
1275 RunAckCallbacks(); 1293 DCHECK(host_);
no sievers 2013/11/14 22:01:01 nit: Can this just become a member variable |using
powei 2013/11/15 02:18:26 Done.
1276 return texture_id_in_layer_; 1294 return SynchronousCompositorImpl::FromID(host_->GetProcess()->GetID(),
1295 host_->GetRoutingID()) != NULL;
1277 } 1296 }
1278 1297
1279 void RenderWidgetHostViewAndroid::DidCommitFrameData() { 1298 void RenderWidgetHostViewAndroid::OnCompositingDidCommit(
1299 Compositor* compositor) {
1280 RunAckCallbacks(); 1300 RunAckCallbacks();
1281 } 1301 }
1282 1302
1283 bool RenderWidgetHostViewAndroid::PrepareTextureMailbox( 1303 void RenderWidgetHostViewAndroid::OnDetachCompositor(
1284 cc::TextureMailbox* mailbox, 1304 Compositor* compositor) {
1285 scoped_ptr<cc::SingleReleaseCallback>* release_callback, 1305 DCHECK(content_view_core_);
1286 bool use_shared_memory) { 1306 DCHECK(!UsingSynchronousCompositor());
1287 return false; 1307 content_view_core_->GetWindowAndroid()->RemoveObserver(this);
no sievers 2013/11/14 22:01:01 RunAckCallbacks() here. And being removed as an ob
powei 2013/11/15 02:18:26 Done.
1288 } 1308 }
1289 1309
1290 void RenderWidgetHostViewAndroid::OnLostResources() { 1310 void RenderWidgetHostViewAndroid::OnLostResources() {
1291 if (texture_layer_.get()) 1311 if (texture_layer_.get())
1292 texture_layer_->SetIsDrawable(false); 1312 texture_layer_->SetIsDrawable(false);
1293 if (delegated_renderer_layer_.get()) 1313 if (delegated_renderer_layer_.get())
1294 DestroyDelegatedContent(); 1314 DestroyDelegatedContent();
1295 texture_id_in_layer_ = 0; 1315 texture_id_in_layer_ = 0;
1296 RunAckCallbacks(); 1316 RunAckCallbacks();
1297 } 1317 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1391 // RenderWidgetHostView, public: 1411 // RenderWidgetHostView, public:
1392 1412
1393 // static 1413 // static
1394 RenderWidgetHostView* 1414 RenderWidgetHostView*
1395 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 1415 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
1396 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 1416 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
1397 return new RenderWidgetHostViewAndroid(rwhi, NULL); 1417 return new RenderWidgetHostViewAndroid(rwhi, NULL);
1398 } 1418 }
1399 1419
1400 } // namespace content 1420 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698