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

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 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"
no sievers 2013/11/15 20:15:20 nit: already included in the header, since RWHV im
powei 2013/11/15 22:41:28 Done.
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),
130 true); 132 true);
131 } 133 }
132 134
133 host_->SetView(this); 135 host_->SetView(this);
134 SetContentViewCore(content_view_core); 136 SetContentViewCore(content_view_core);
135 ImageTransportFactoryAndroid::AddObserver(this); 137 ImageTransportFactoryAndroid::AddObserver(this);
138
139 using_synchronous_compositor_ =
140 SynchronousCompositorImpl::FromID(host_->GetProcess()->GetID(),
141 host_->GetRoutingID()) != NULL;
136 } 142 }
137 143
138 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() { 144 RenderWidgetHostViewAndroid::~RenderWidgetHostViewAndroid() {
139 ImageTransportFactoryAndroid::RemoveObserver(this); 145 ImageTransportFactoryAndroid::RemoveObserver(this);
140 SetContentViewCore(NULL); 146 SetContentViewCore(NULL);
141 DCHECK(ack_callbacks_.empty()); 147 DCHECK(ack_callbacks_.empty());
142 if (texture_id_in_layer_) { 148 if (texture_id_in_layer_) {
143 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture( 149 ImageTransportFactoryAndroid::GetInstance()->DeleteTexture(
144 texture_id_in_layer_); 150 texture_id_in_layer_);
145 } 151 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 RenderWidgetHost* 191 RenderWidgetHost*
186 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const { 192 RenderWidgetHostViewAndroid::GetRenderWidgetHost() const {
187 return host_; 193 return host_;
188 } 194 }
189 195
190 void RenderWidgetHostViewAndroid::WasShown() { 196 void RenderWidgetHostViewAndroid::WasShown() {
191 if (!host_ || !host_->is_hidden()) 197 if (!host_ || !host_->is_hidden())
192 return; 198 return;
193 199
194 host_->WasShown(); 200 host_->WasShown();
201
202 if (content_view_core_ && !using_synchronous_compositor_)
203 content_view_core_->GetWindowAndroid()->AddObserver(this);
195 } 204 }
196 205
197 void RenderWidgetHostViewAndroid::WasHidden() { 206 void RenderWidgetHostViewAndroid::WasHidden() {
198 RunAckCallbacks(); 207 RunAckCallbacks();
199 208
200 if (!host_ || host_->is_hidden()) 209 if (!host_ || host_->is_hidden())
201 return; 210 return;
202 211
203 // Inform the renderer that we are being hidden so it can reduce its resource 212 // Inform the renderer that we are being hidden so it can reduce its resource
204 // utilization. 213 // utilization.
205 host_->WasHidden(); 214 host_->WasHidden();
215
216 if (content_view_core_ && !using_synchronous_compositor_)
217 content_view_core_->GetWindowAndroid()->RemoveObserver(this);
206 } 218 }
207 219
208 void RenderWidgetHostViewAndroid::WasResized() { 220 void RenderWidgetHostViewAndroid::WasResized() {
209 host_->WasResized(); 221 host_->WasResized();
210 } 222 }
211 223
212 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) { 224 void RenderWidgetHostViewAndroid::SetSize(const gfx::Size& size) {
213 // Ignore the given size as only the Java code has the power to 225 // Ignore the given size as only the Java code has the power to
214 // resize the view on Android. 226 // resize the view on Android.
215 default_size_ = size; 227 default_size_ = size;
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 NOTIMPLEMENTED(); 511 NOTIMPLEMENTED();
500 } 512 }
501 513
502 void RenderWidgetHostViewAndroid::RenderProcessGone( 514 void RenderWidgetHostViewAndroid::RenderProcessGone(
503 base::TerminationStatus status, int error_code) { 515 base::TerminationStatus status, int error_code) {
504 Destroy(); 516 Destroy();
505 } 517 }
506 518
507 void RenderWidgetHostViewAndroid::Destroy() { 519 void RenderWidgetHostViewAndroid::Destroy() {
508 RemoveLayers(); 520 RemoveLayers();
509 content_view_core_ = NULL; 521 // This must happen before setting host_ NULL.
522 SetContentViewCore(NULL);
510 523
511 // The RenderWidgetHost's destruction led here, so don't call it. 524 // The RenderWidgetHost's destruction led here, so don't call it.
512 host_ = NULL; 525 host_ = NULL;
513 526
514 delete this; 527 delete this;
515 } 528 }
516 529
517 void RenderWidgetHostViewAndroid::SetTooltipText( 530 void RenderWidgetHostViewAndroid::SetTooltipText(
518 const string16& tooltip_text) { 531 const string16& tooltip_text) {
519 // Tooltips don't makes sense on Android. 532 // 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; 714 resource_collection_ = new cc::DelegatedFrameResourceCollection;
702 resource_collection_->SetClient(this); 715 resource_collection_->SetClient(this);
703 } 716 }
704 if (!frame_provider_ || 717 if (!frame_provider_ ||
705 texture_size_in_layer_ != frame_provider_->frame_size()) { 718 texture_size_in_layer_ != frame_provider_->frame_size()) {
706 if (are_layers_attached_) 719 if (are_layers_attached_)
707 RemoveLayers(); 720 RemoveLayers();
708 frame_provider_ = new cc::DelegatedFrameProvider( 721 frame_provider_ = new cc::DelegatedFrameProvider(
709 resource_collection_.get(), frame_data.Pass()); 722 resource_collection_.get(), frame_data.Pass());
710 delegated_renderer_layer_ = 723 delegated_renderer_layer_ =
711 cc::DelegatedRendererLayer::Create(this, frame_provider_); 724 cc::DelegatedRendererLayer::Create(NULL, frame_provider_);
712 layer_ = delegated_renderer_layer_; 725 layer_ = delegated_renderer_layer_;
713 if (are_layers_attached_) 726 if (are_layers_attached_)
714 AttachLayers(); 727 AttachLayers();
715 } else { 728 } else {
716 frame_provider_->SetFrameData(frame_data.Pass()); 729 frame_provider_->SetFrameData(frame_data.Pass());
717 } 730 }
718 } 731 }
719 732
720 if (delegated_renderer_layer_.get()) { 733 if (delegated_renderer_layer_.get()) {
721 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_); 734 delegated_renderer_layer_->SetDisplaySize(texture_size_in_layer_);
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 852
840 void RenderWidgetHostViewAndroid::BuffersSwapped( 853 void RenderWidgetHostViewAndroid::BuffersSwapped(
841 const gpu::Mailbox& mailbox, 854 const gpu::Mailbox& mailbox,
842 uint32_t output_surface_id, 855 uint32_t output_surface_id,
843 const base::Closure& ack_callback) { 856 const base::Closure& ack_callback) {
844 ImageTransportFactoryAndroid* factory = 857 ImageTransportFactoryAndroid* factory =
845 ImageTransportFactoryAndroid::GetInstance(); 858 ImageTransportFactoryAndroid::GetInstance();
846 859
847 if (!texture_id_in_layer_) { 860 if (!texture_id_in_layer_) {
848 texture_id_in_layer_ = factory->CreateTexture(); 861 texture_id_in_layer_ = factory->CreateTexture();
862 texture_layer_->SetTextureId(texture_id_in_layer_);
849 texture_layer_->SetIsDrawable(true); 863 texture_layer_->SetIsDrawable(true);
850 texture_layer_->SetContentsOpaque(true); 864 texture_layer_->SetContentsOpaque(true);
851 } 865 }
852 866
853 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture( 867 ImageTransportFactoryAndroid::GetInstance()->AcquireTexture(
854 texture_id_in_layer_, mailbox.name); 868 texture_id_in_layer_, mailbox.name);
855 869
856 ResetClipping(); 870 ResetClipping();
857 871
858 current_mailbox_ = mailbox; 872 current_mailbox_ = mailbox;
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 ScheduleAnimationIfNecessary(); 1251 ScheduleAnimationIfNecessary();
1238 } 1252 }
1239 1253
1240 void RenderWidgetHostViewAndroid::SetContentViewCore( 1254 void RenderWidgetHostViewAndroid::SetContentViewCore(
1241 ContentViewCoreImpl* content_view_core) { 1255 ContentViewCoreImpl* content_view_core) {
1242 RunAckCallbacks(); 1256 RunAckCallbacks();
1243 1257
1244 if (are_layers_attached_) 1258 if (are_layers_attached_)
1245 RemoveLayers(); 1259 RemoveLayers();
1246 1260
1261 if (content_view_core == NULL) {
1262 if (content_view_core_ && !using_synchronous_compositor_)
1263 content_view_core_->GetWindowAndroid()->RemoveObserver(this);
1264 }
1265
1247 content_view_core_ = content_view_core; 1266 content_view_core_ = content_view_core;
1248 1267
1249 if (GetBrowserAccessibilityManager()) { 1268 if (GetBrowserAccessibilityManager()) {
1250 base::android::ScopedJavaLocalRef<jobject> obj; 1269 base::android::ScopedJavaLocalRef<jobject> obj;
1251 if (content_view_core_) 1270 if (content_view_core_)
1252 obj = content_view_core_->GetJavaObject(); 1271 obj = content_view_core_->GetJavaObject();
1253 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()-> 1272 GetBrowserAccessibilityManager()->ToBrowserAccessibilityManagerAndroid()->
1254 SetContentViewCore(obj); 1273 SetContentViewCore(obj);
1255 } 1274 }
1256 1275
1257 if (are_layers_attached_) 1276 if (are_layers_attached_) {
1258 AttachLayers(); 1277 AttachLayers();
1278 if (content_view_core_ && !using_synchronous_compositor_)
1279 content_view_core_->GetWindowAndroid()->AddObserver(this);
1280 }
1259 } 1281 }
1260 1282
1261 void RenderWidgetHostViewAndroid::RunAckCallbacks() { 1283 void RenderWidgetHostViewAndroid::RunAckCallbacks() {
1262 while (!ack_callbacks_.empty()) { 1284 while (!ack_callbacks_.empty()) {
1263 ack_callbacks_.front().Run(); 1285 ack_callbacks_.front().Run();
1264 ack_callbacks_.pop(); 1286 ack_callbacks_.pop();
1265 } 1287 }
1266 } 1288 }
1267 1289
1268 void RenderWidgetHostViewAndroid::HasTouchEventHandlers( 1290 void RenderWidgetHostViewAndroid::HasTouchEventHandlers(
1269 bool need_touch_events) { 1291 bool need_touch_events) {
1270 if (content_view_core_) 1292 if (content_view_core_)
1271 content_view_core_->HasTouchEventHandlers(need_touch_events); 1293 content_view_core_->HasTouchEventHandlers(need_touch_events);
1272 } 1294 }
1273 1295
1274 unsigned RenderWidgetHostViewAndroid::PrepareTexture() { 1296 void RenderWidgetHostViewAndroid::OnCompositingDidCommit() {
1275 RunAckCallbacks();
1276 return texture_id_in_layer_;
1277 }
1278
1279 void RenderWidgetHostViewAndroid::DidCommitFrameData() {
1280 RunAckCallbacks(); 1297 RunAckCallbacks();
1281 } 1298 }
1282 1299
1283 bool RenderWidgetHostViewAndroid::PrepareTextureMailbox( 1300 void RenderWidgetHostViewAndroid::OnDetachCompositor() {
1284 cc::TextureMailbox* mailbox, 1301 DCHECK(content_view_core_);
1285 scoped_ptr<cc::SingleReleaseCallback>* release_callback, 1302 DCHECK(!using_synchronous_compositor_);
1286 bool use_shared_memory) { 1303 RunAckCallbacks();
1287 return false;
1288 } 1304 }
1289 1305
1290 void RenderWidgetHostViewAndroid::OnLostResources() { 1306 void RenderWidgetHostViewAndroid::OnLostResources() {
1291 if (texture_layer_.get()) 1307 if (texture_layer_.get())
1292 texture_layer_->SetIsDrawable(false); 1308 texture_layer_->SetIsDrawable(false);
1293 if (delegated_renderer_layer_.get()) 1309 if (delegated_renderer_layer_.get())
1294 DestroyDelegatedContent(); 1310 DestroyDelegatedContent();
1295 texture_id_in_layer_ = 0; 1311 texture_id_in_layer_ = 0;
1296 RunAckCallbacks(); 1312 RunAckCallbacks();
1297 } 1313 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1391 // RenderWidgetHostView, public: 1407 // RenderWidgetHostView, public:
1392 1408
1393 // static 1409 // static
1394 RenderWidgetHostView* 1410 RenderWidgetHostView*
1395 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) { 1411 RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost* widget) {
1396 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget); 1412 RenderWidgetHostImpl* rwhi = RenderWidgetHostImpl::From(widget);
1397 return new RenderWidgetHostViewAndroid(rwhi, NULL); 1413 return new RenderWidgetHostViewAndroid(rwhi, NULL);
1398 } 1414 }
1399 1415
1400 } // namespace content 1416 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698